mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
b7db059544
* feat(chat,seahorse): persist and display model_name across history * test(seahorse): fix lint regressions in repair coverage * fix(pico): preserve model_name in live updates * fix(pico): preserve model_name through live stream wrappers
166 lines
4.5 KiB
Go
166 lines
4.5 KiB
Go
package agent
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/sipeed/picoclaw/pkg/config"
|
|
"github.com/sipeed/picoclaw/pkg/providers"
|
|
)
|
|
|
|
func TestModelNameFromIdentityKey_LegacyProviderModel(t *testing.T) {
|
|
if got := modelNameFromIdentityKey("openai/gpt-5.4"); got != "gpt-5.4" {
|
|
t.Fatalf("modelNameFromIdentityKey() = %q, want %q", got, "gpt-5.4")
|
|
}
|
|
}
|
|
|
|
func TestModelNameFromIdentityKey_PreservesNonLegacyIdentity(t *testing.T) {
|
|
if got := modelNameFromIdentityKey("model_name:primary"); got != "model_name:primary" {
|
|
t.Fatalf("modelNameFromIdentityKey() = %q, want %q", got, "model_name:primary")
|
|
}
|
|
}
|
|
|
|
func TestModelAliasFromCandidateIdentityKey(t *testing.T) {
|
|
if got := modelAliasFromCandidateIdentityKey("model_name:primary"); got != "primary" {
|
|
t.Fatalf("modelAliasFromCandidateIdentityKey() = %q, want %q", got, "primary")
|
|
}
|
|
if got := modelAliasFromCandidateIdentityKey("openai/gpt-5.4"); got != "" {
|
|
t.Fatalf("modelAliasFromCandidateIdentityKey() = %q, want empty", got)
|
|
}
|
|
}
|
|
|
|
func TestResolvedCandidateModelName_PrefersIdentityAlias(t *testing.T) {
|
|
got := resolvedCandidateModelName([]providers.FallbackCandidate{
|
|
{Provider: "openai", Model: "gpt-5.4", IdentityKey: "model_name:primary"},
|
|
}, "fallback-model")
|
|
if got != "primary" {
|
|
t.Fatalf("resolvedCandidateModelName() = %q, want %q", got, "primary")
|
|
}
|
|
}
|
|
|
|
func TestResolvedCandidateModelName_DoesNotScanFallbackAliases(t *testing.T) {
|
|
got := resolvedCandidateModelName([]providers.FallbackCandidate{
|
|
{Provider: "openai", Model: "gpt-5.4"},
|
|
{Provider: "openai", Model: "gpt-5.4-mini", IdentityKey: "model_name:fallback"},
|
|
}, "primary-model")
|
|
if got != "primary-model" {
|
|
t.Fatalf("resolvedCandidateModelName() = %q, want %q", got, "primary-model")
|
|
}
|
|
}
|
|
|
|
func TestResolvedCandidateModelName_UsesCandidateDisplayName(t *testing.T) {
|
|
got := resolvedCandidateModelName([]providers.FallbackCandidate{
|
|
{Provider: "openai", Model: "gpt-5.4", DisplayName: "gpt-5.4-display"},
|
|
}, "fallback-model")
|
|
if got != "gpt-5.4-display" {
|
|
t.Fatalf("resolvedCandidateModelName() = %q, want %q", got, "gpt-5.4-display")
|
|
}
|
|
}
|
|
|
|
func TestResolveActiveModelConfig_PrefersCandidateIdentityKey(t *testing.T) {
|
|
cfg := &config.Config{
|
|
ModelList: []*config.ModelConfig{
|
|
{
|
|
ModelName: "glm-4.7",
|
|
Provider: "zhipu",
|
|
Model: "glm-4.7",
|
|
Streaming: config.ModelStreamingConfig{Enabled: false},
|
|
},
|
|
{
|
|
ModelName: "suanneng-glm-4.7",
|
|
Provider: "zhipu",
|
|
Model: "glm-4.7",
|
|
Streaming: config.ModelStreamingConfig{Enabled: true},
|
|
},
|
|
},
|
|
}
|
|
|
|
got := resolveActiveModelConfig(
|
|
cfg,
|
|
"/workspace",
|
|
[]providers.FallbackCandidate{{
|
|
Provider: "zhipu",
|
|
Model: "glm-4.7",
|
|
IdentityKey: "model_name:suanneng-glm-4.7",
|
|
}},
|
|
"glm-4.7",
|
|
"openai",
|
|
)
|
|
|
|
if got == nil {
|
|
t.Fatal("resolveActiveModelConfig() = nil, want model config")
|
|
}
|
|
if got.ModelName != "suanneng-glm-4.7" {
|
|
t.Fatalf("model_name = %q, want %q", got.ModelName, "suanneng-glm-4.7")
|
|
}
|
|
if !got.Streaming.Enabled {
|
|
t.Fatal("streaming.enabled = false, want true from identity-matched model config")
|
|
}
|
|
}
|
|
|
|
func TestResolveActiveModelConfig_LoadBalancedAliasUsesSelectedCandidate(t *testing.T) {
|
|
cfg := &config.Config{
|
|
ModelList: []*config.ModelConfig{
|
|
{
|
|
ModelName: "lb-model",
|
|
Model: "openai/primary",
|
|
Streaming: config.ModelStreamingConfig{Enabled: false},
|
|
},
|
|
{
|
|
ModelName: "lb-model",
|
|
Model: "openai/secondary",
|
|
Streaming: config.ModelStreamingConfig{Enabled: true},
|
|
},
|
|
},
|
|
}
|
|
|
|
got := resolveActiveModelConfig(
|
|
cfg,
|
|
"/workspace",
|
|
[]providers.FallbackCandidate{{
|
|
Provider: "openai",
|
|
Model: "secondary",
|
|
IdentityKey: "model_name:lb-model",
|
|
}},
|
|
"lb-model",
|
|
"openai",
|
|
)
|
|
|
|
if got == nil {
|
|
t.Fatal("resolveActiveModelConfig() = nil, want model config")
|
|
}
|
|
if got.Model != "openai/secondary" {
|
|
t.Fatalf("model = %q, want openai/secondary", got.Model)
|
|
}
|
|
if !got.Streaming.Enabled {
|
|
t.Fatal("streaming.enabled = false, want true from selected load-balanced entry")
|
|
}
|
|
}
|
|
|
|
func TestResolveActiveModelConfig_DoesNotFallbackToOpenAIForDefaultProviderCandidate(t *testing.T) {
|
|
cfg := &config.Config{
|
|
ModelList: []*config.ModelConfig{
|
|
{
|
|
ModelName: "openai-gpt",
|
|
Provider: "openai",
|
|
Model: "gpt-4o",
|
|
Streaming: config.ModelStreamingConfig{Enabled: true},
|
|
},
|
|
},
|
|
}
|
|
|
|
got := resolveActiveModelConfig(
|
|
cfg,
|
|
"/workspace",
|
|
[]providers.FallbackCandidate{{
|
|
Provider: "nvidia",
|
|
Model: "gpt-4o",
|
|
}},
|
|
"gpt-4o",
|
|
"nvidia",
|
|
)
|
|
|
|
if got != nil {
|
|
t.Fatalf("resolveActiveModelConfig() = %#v, want nil for non-active provider config", got)
|
|
}
|
|
}
|