feat(model): LLM 多供应商适配(Adapter/OpenAI 非流式+SSE 流式/per-role 路由/主备降级/多模态检测/调用记录)
This commit is contained in:
1 parent
51b2bdfba2
commit
d09ccc7570
9 files changed
+1285
No files matched your search
@@ -0,0 +1,88 @@
|
||||
package model
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestRouter_Route_PerRole(t *testing.T) {
|
||||
t.Parallel()
|
||||
r := NewRouter("default",
|
||||
WithRoleModel(RoleUser, "user-model"),
|
||||
WithRoleModel(RoleAssistant, "assistant-model"),
|
||||
WithVisionModel("vision-model"),
|
||||
)
|
||||
cases := []struct {
|
||||
role Role
|
||||
want string
|
||||
}{
|
||||
{RoleUser, "user-model"},
|
||||
{RoleAssistant, "assistant-model"},
|
||||
{RoleSystem, "default"},
|
||||
{Role("unknown"), "default"},
|
||||
}
|
||||
for _, c := range cases {
|
||||
c := c
|
||||
t.Run(string(c.role), func(t *testing.T) {
|
||||
t.Parallel()
|
||||
if got := r.Route(c.role); got != c.want {
|
||||
t.Fatalf("Route(%q) = %q, want %q", c.role, got, c.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRouter_RouteRequest_Text(t *testing.T) {
|
||||
t.Parallel()
|
||||
r := NewRouter("default",
|
||||
WithRoleModel(RoleUser, "user-model"),
|
||||
WithRoleModel(RoleAssistant, "assistant-model"),
|
||||
WithVisionModel("vision-model"),
|
||||
)
|
||||
req := Request{Messages: []Message{TextMessage(RoleAssistant, "hi")}}
|
||||
model, needsVision := r.RouteRequest(req)
|
||||
if needsVision {
|
||||
t.Errorf("needsVision = true, want false for text-only")
|
||||
}
|
||||
if model != "assistant-model" {
|
||||
t.Errorf("model = %q, want assistant-model (last-message role)", model)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRouter_RouteRequest_Vision(t *testing.T) {
|
||||
t.Parallel()
|
||||
r := NewRouter("default",
|
||||
WithRoleModel(RoleUser, "user-model"),
|
||||
WithVisionModel("vision-model"),
|
||||
)
|
||||
req := Request{Messages: []Message{ImageMessage(RoleUser, "", "data:image/png;base64,abc")}}
|
||||
model, needsVision := r.RouteRequest(req)
|
||||
if !needsVision {
|
||||
t.Errorf("needsVision = false, want true for image content")
|
||||
}
|
||||
if model != "vision-model" {
|
||||
t.Errorf("model = %q, want vision-model", model)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRouter_RouteRequest_VisionUnconfigured(t *testing.T) {
|
||||
t.Parallel()
|
||||
r := NewRouter("default", WithRoleModel(RoleUser, "user-model"))
|
||||
req := Request{Messages: []Message{ImageMessage(RoleUser, "", "data:image/png;base64,abc")}}
|
||||
model, needsVision := r.RouteRequest(req)
|
||||
if !needsVision {
|
||||
t.Errorf("needsVision = false, want true when image present even without a vision model")
|
||||
}
|
||||
if model != "user-model" {
|
||||
t.Errorf("model = %q, want user-model (role fallback)", model)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRouter_RouteRequest_EmptyMessages(t *testing.T) {
|
||||
t.Parallel()
|
||||
r := NewRouter("default", WithRoleModel(RoleUser, "user-model"))
|
||||
model, needsVision := r.RouteRequest(Request{})
|
||||
if needsVision {
|
||||
t.Errorf("needsVision = true, want false")
|
||||
}
|
||||
if model != "user-model" {
|
||||
t.Errorf("model = %q, want user-model (default role for empty messages)", model)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user