Files
picoclaw/pkg/providers/model_ref_test.go
T

179 lines
4.7 KiB
Go

package providers
import "testing"
func TestParseModelRef_WithSlash(t *testing.T) {
ref := ParseModelRef("anthropic/claude-opus", "openai")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "anthropic" {
t.Errorf("provider = %q, want anthropic", ref.Provider)
}
if ref.Model != "claude-opus" {
t.Errorf("model = %q, want claude-opus", ref.Model)
}
}
func TestParseModelRef_WithoutSlash(t *testing.T) {
ref := ParseModelRef("gpt-4", "openai")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "openai" {
t.Errorf("provider = %q, want openai", ref.Provider)
}
if ref.Model != "gpt-4" {
t.Errorf("model = %q, want gpt-4", ref.Model)
}
}
func TestParseModelRef_Empty(t *testing.T) {
ref := ParseModelRef("", "openai")
if ref != nil {
t.Errorf("expected nil for empty string, got %+v", ref)
}
}
func TestParseModelRef_EmptyModelAfterSlash(t *testing.T) {
ref := ParseModelRef("openai/", "default")
if ref != nil {
t.Errorf("expected nil for empty model, got %+v", ref)
}
}
func TestParseModelRef_WhitespaceHandling(t *testing.T) {
ref := ParseModelRef(" anthropic / claude-opus ", "openai")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "anthropic" {
t.Errorf("provider = %q, want anthropic", ref.Provider)
}
if ref.Model != "claude-opus" {
t.Errorf("model = %q, want claude-opus", ref.Model)
}
}
func TestNormalizeProvider(t *testing.T) {
tests := []struct {
input string
want string
}{
{"OpenAI", "openai"},
{"ANTHROPIC", "anthropic"},
{"z.ai", "zai"},
{"z-ai", "zai"},
{"Z.AI", "zai"},
{"qwen", "qwen-portal"},
{"gpt", "openai"},
{"claude", "anthropic"},
{"glm", "zhipu"},
{"google", "gemini"},
{"google-antigravity", "antigravity"},
{"groq", "groq"},
{"azure-openai", "azure"},
{"claudecli", "claude-cli"},
{"codexcli", "codex-cli"},
{"copilot", "github-copilot"},
{"g4f", "gpt4free"},
// Alibaba Coding Plan aliases
{"alibaba-coding", "alibaba-coding"},
{"coding-plan", "alibaba-coding"},
{"qwen-coding", "alibaba-coding"},
{"alibaba-coding-anthropic", "alibaba-coding-anthropic"},
{"coding-plan-anthropic", "alibaba-coding-anthropic"},
// Qwen international aliases
{"qwen-international", "qwen-intl"},
{"dashscope-intl", "qwen-intl"},
{"dashscope-us", "qwen-us"},
{"", ""},
}
for _, tt := range tests {
got := NormalizeProvider(tt.input)
if got != tt.want {
t.Errorf("NormalizeProvider(%q) = %q, want %q", tt.input, got, tt.want)
}
}
}
func TestModelKey(t *testing.T) {
tests := []struct {
provider string
model string
want string
}{
{"openai", "gpt-4", "openai/gpt-4"},
{"Anthropic", "Claude-Opus", "anthropic/claude-opus"},
{"claude", "sonnet", "anthropic/sonnet"},
{"z.ai", "Model-X", "zai/model-x"},
}
for _, tt := range tests {
got := ModelKey(tt.provider, tt.model)
if got != tt.want {
t.Errorf("ModelKey(%q, %q) = %q, want %q", tt.provider, tt.model, got, tt.want)
}
}
}
func TestParseModelRef_ProviderNormalization(t *testing.T) {
ref := ParseModelRef("Z.AI/model-x", "default")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "zai" {
t.Errorf("provider = %q, want zai", ref.Provider)
}
}
func TestParseModelRef_DefaultProviderNormalization(t *testing.T) {
ref := ParseModelRef("gpt-4o", "GPT")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "openai" {
t.Errorf("provider = %q, want openai (normalized from GPT)", ref.Provider)
}
}
func TestParseModelRef_UnknownPrefixFallsBackToDefaultProvider(t *testing.T) {
ref := ParseModelRef("meta-llama/Llama-3.1-8B-Instruct", "openai")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "openai" {
t.Fatalf("provider = %q, want openai", ref.Provider)
}
if ref.Model != "meta-llama/Llama-3.1-8B-Instruct" {
t.Fatalf("model = %q, want full original model ID", ref.Model)
}
}
func TestParseModelRef_UnknownPrefixPreservesEmptyDefaultProvider(t *testing.T) {
ref := ParseModelRef("meta-llama/Llama-3.1-8B-Instruct", "")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "" {
t.Fatalf("provider = %q, want empty", ref.Provider)
}
if ref.Model != "meta-llama/Llama-3.1-8B-Instruct" {
t.Fatalf("model = %q, want full original model ID", ref.Model)
}
}
func TestParseModelRef_KnownNonSelectableProvider(t *testing.T) {
ref := ParseModelRef("bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0", "openai")
if ref == nil {
t.Fatal("expected non-nil ref")
}
if ref.Provider != "bedrock" {
t.Fatalf("provider = %q, want bedrock", ref.Provider)
}
if ref.Model != "us.anthropic.claude-sonnet-4-20250514-v1:0" {
t.Fatalf("model = %q, want preserved bedrock model ID", ref.Model)
}
}