feat: provider presets (openai, openrouter, ollama, dahl, gonkarouter, custom), /api/info, provider display in Android settings
This commit is contained in:
parent
d2ec0848c8
commit
7b92e259ad
14 changed files with 233 additions and 18 deletions
76
internal/config/presets_test.go
Normal file
76
internal/config/presets_test.go
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func load(t *testing.T, yaml string) (Config, error) {
|
||||
t.Helper()
|
||||
p := filepath.Join(t.TempDir(), "c.yaml")
|
||||
os.WriteFile(p, []byte("auth_token: aaaaaaaaaaaaaaaaaaaa\n"+yaml), 0o600)
|
||||
return Load(p)
|
||||
}
|
||||
|
||||
func TestPresetDahl(t *testing.T) {
|
||||
t.Setenv("DAHL_API_KEY", "dahl_test")
|
||||
c, err := load(t, "llm:\n provider: dahl\n")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if c.LLM.BaseURL != "https://inference.dahl.global/v1" || c.LLM.Model != "MiniMaxAI/MiniMax-M2.7" || c.LLM.APIKey != "dahl_test" {
|
||||
t.Fatalf("%+v", c.LLM)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPresetGonkaRouterViaEnv(t *testing.T) {
|
||||
t.Setenv("BYTECLAW_LLM_PROVIDER", "GonkaRouter")
|
||||
t.Setenv("GONKAROUTER_API_KEY", "sk-g")
|
||||
c, err := load(t, "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if c.LLM.Provider != "gonkarouter" || c.LLM.BaseURL != "https://api.gonkarouter.io/v1" || c.LLM.Model != "MiniMaxAI/MiniMax-M2.7" || c.LLM.APIKey != "sk-g" {
|
||||
t.Fatalf("%+v", c.LLM)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPresetExplicitValuesWin(t *testing.T) {
|
||||
t.Setenv("GONKAROUTER_API_KEY", "from-env")
|
||||
c, err := load(t, "llm:\n provider: gonkarouter\n model: zai-org/GLM-5.3-Flash\n api_key: explicit\n")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if c.LLM.Model != "zai-org/GLM-5.3-Flash" || c.LLM.APIKey != "explicit" || c.LLM.BaseURL != "https://api.gonkarouter.io/v1" {
|
||||
t.Fatalf("%+v", c.LLM)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPresetDefaultIsOpenAI(t *testing.T) {
|
||||
c, err := load(t, "")
|
||||
if err != nil || c.LLM.Provider != "openai" || c.LLM.BaseURL != "https://api.openai.com/v1" {
|
||||
t.Fatalf("%+v %v", c.LLM, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPresetUnknownAndCustom(t *testing.T) {
|
||||
if _, err := load(t, "llm:\n provider: nope\n"); err == nil {
|
||||
t.Fatal("unknown provider must fail")
|
||||
}
|
||||
if _, err := load(t, "llm:\n provider: custom\n"); err == nil {
|
||||
t.Fatal("custom without base_url/model must fail validation")
|
||||
}
|
||||
c, err := load(t, "llm:\n provider: custom\n base_url: http://x/v1\n model: m\n")
|
||||
if err != nil || c.LLM.BaseURL != "http://x/v1" {
|
||||
t.Fatalf("%+v %v", c.LLM, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAllPresetsComplete(t *testing.T) {
|
||||
for n, p := range Presets {
|
||||
if p.Name != n || p.BaseURL == "" || p.DefaultModel == "" || p.Source == "" {
|
||||
t.Errorf("incomplete preset %q: %+v", n, p)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue