Skip to content

Commit c1e3265

Browse files
committed
feat(llm): add built-in Ollama Cloud provider preset
Add an ollama-cloud entry to the provider registry: OpenAI protocol, base URL https://ollama.com/v1, env OLLAMA_API_KEY, models gpt-oss:120b and gpt-oss:20b. Values match Ollama Cloud's OpenAI-compatible endpoint. Tests cover provider order/count and per-field lookup details. Closes alibaba#305
1 parent 10f5875 commit c1e3265

2 files changed

Lines changed: 40 additions & 1 deletion

File tree

internal/llm/providers.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,17 @@ var registry = []Provider{
225225
"kimi-k2.6",
226226
},
227227
},
228+
{
229+
Name: "ollama-cloud",
230+
DisplayName: "Ollama Cloud API",
231+
Protocol: "openai",
232+
BaseURL: "https://ollama.com/v1",
233+
EnvVar: "OLLAMA_API_KEY",
234+
Models: []string{
235+
"gpt-oss:120b",
236+
"gpt-oss:20b",
237+
},
238+
},
228239
}
229240

230241
var registryMap map[string]Provider

internal/llm/providers_test.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func TestListProviders_Order(t *testing.T) {
4040
if len(providers) < 3 {
4141
t.Fatalf("expected at least 3 providers, got %d", len(providers))
4242
}
43-
expected := []string{"anthropic", "baidu-qianfan", "dashscope", "dashscope-tokenplan", "deepseek", "hy-tokenplan", "kimi", "mimo", "minimax", "openai", "tencent-tokenhub", "volcengine", "z-ai", "z-ai-coding"}
43+
expected := []string{"anthropic", "baidu-qianfan", "dashscope", "dashscope-tokenplan", "deepseek", "hy-tokenplan", "kimi", "mimo", "minimax", "ollama-cloud", "openai", "tencent-tokenhub", "volcengine", "z-ai", "z-ai-coding"}
4444
if len(providers) != len(expected) {
4545
t.Fatalf("expected %d providers, got %d", len(expected), len(providers))
4646
}
@@ -126,3 +126,31 @@ func TestLookupProvider_OpenAIDetails(t *testing.T) {
126126
t.Errorf("AuthHeader = %q, want empty", p.AuthHeader)
127127
}
128128
}
129+
130+
func TestLookupProvider_OllamaCloudDetails(t *testing.T) {
131+
p, ok := LookupProvider("ollama-cloud")
132+
if !ok {
133+
t.Fatal("ollama-cloud not found")
134+
}
135+
if p.Protocol != "openai" {
136+
t.Errorf("Protocol = %q, want %q", p.Protocol, "openai")
137+
}
138+
if p.BaseURL != "https://ollama.com/v1" {
139+
t.Errorf("BaseURL = %q, want %q", p.BaseURL, "https://ollama.com/v1")
140+
}
141+
if p.EnvVar != "OLLAMA_API_KEY" {
142+
t.Errorf("EnvVar = %q, want %q", p.EnvVar, "OLLAMA_API_KEY")
143+
}
144+
if p.AuthHeader != "" {
145+
t.Errorf("AuthHeader = %q, want empty", p.AuthHeader)
146+
}
147+
expectedModels := []string{"gpt-oss:120b", "gpt-oss:20b"}
148+
if len(p.Models) != len(expectedModels) {
149+
t.Fatalf("expected %d models, got %d", len(expectedModels), len(p.Models))
150+
}
151+
for i, model := range expectedModels {
152+
if p.Models[i] != model {
153+
t.Errorf("Models[%d] = %q, want %q", i, p.Models[i], model)
154+
}
155+
}
156+
}

0 commit comments

Comments
 (0)