fix(agent): normalize subagent openrouter model ids

This commit is contained in:
Alix-007 2026-03-30 15:58:12 +08:00
parent fd9914dd92
commit d456e5a5f0
2 changed files with 51 additions and 1 deletions

View file

@ -285,7 +285,11 @@ func registerSharedTools(
spawnEnabled := cfg.Tools.IsToolEnabled("spawn") spawnEnabled := cfg.Tools.IsToolEnabled("spawn")
spawnStatusEnabled := cfg.Tools.IsToolEnabled("spawn_status") spawnStatusEnabled := cfg.Tools.IsToolEnabled("spawn_status")
if (spawnEnabled || spawnStatusEnabled) && cfg.Tools.IsToolEnabled("subagent") { if (spawnEnabled || spawnStatusEnabled) && cfg.Tools.IsToolEnabled("subagent") {
subagentManager := tools.NewSubagentManager(provider, agent.Model, agent.Workspace) subagentManager := tools.NewSubagentManager(
provider,
resolveSubagentDefaultModel(agent),
agent.Workspace,
)
subagentManager.SetLLMOptions(agent.MaxTokens, agent.Temperature) subagentManager.SetLLMOptions(agent.MaxTokens, agent.Temperature)
// Set the spawner that links into AgentLoop's turnState // Set the spawner that links into AgentLoop's turnState
@ -377,6 +381,16 @@ func registerSharedTools(
} }
} }
func resolveSubagentDefaultModel(agent *AgentInstance) string {
if agent == nil {
return ""
}
if len(agent.Candidates) > 0 && strings.TrimSpace(agent.Candidates[0].Model) != "" {
return strings.TrimSpace(agent.Candidates[0].Model)
}
return agent.Model
}
func (al *AgentLoop) Run(ctx context.Context) error { func (al *AgentLoop) Run(ctx context.Context) error {
al.running.Store(true) al.running.Store(true)

View file

@ -0,0 +1,36 @@
package agent
import (
"testing"
"github.com/sipeed/picoclaw/pkg/providers"
)
func TestResolveSubagentDefaultModel(t *testing.T) {
t.Run("prefers resolved candidate model", func(t *testing.T) {
agent := &AgentInstance{
Model: "openrouter/minimax/minimax-m2.5",
Candidates: []providers.FallbackCandidate{
{Provider: "openrouter", Model: "minimax/minimax-m2.5"},
},
}
if got := resolveSubagentDefaultModel(agent); got != "minimax/minimax-m2.5" {
t.Fatalf("resolveSubagentDefaultModel() = %q, want %q", got, "minimax/minimax-m2.5")
}
})
t.Run("falls back to raw agent model when no candidates exist", func(t *testing.T) {
agent := &AgentInstance{Model: "claude-sonnet-4.6"}
if got := resolveSubagentDefaultModel(agent); got != "claude-sonnet-4.6" {
t.Fatalf("resolveSubagentDefaultModel() = %q, want %q", got, "claude-sonnet-4.6")
}
})
t.Run("returns empty string for nil agent", func(t *testing.T) {
if got := resolveSubagentDefaultModel(nil); got != "" {
t.Fatalf("resolveSubagentDefaultModel(nil) = %q, want empty string", got)
}
})
}