fix gateway explicit provider routing

This commit is contained in:
Haitao Pan 2026-04-14 21:14:19 +08:00
parent f93a8dda0a
commit 235af032b4
3 changed files with 75 additions and 8 deletions

View File

@ -342,6 +342,44 @@ func TestExecuteSessionTaskExplicitProviderRequiresAdvertisedBridgeProvider(t *t
}
}
func TestExecuteSessionTaskExplicitGatewayIgnoresExplicitProvider(t *testing.T) {
server := NewServer()
response, rpcErr := server.executeSessionTask(task{
req: shared.RPCRequest{
Method: "session.start",
Params: map[string]any{
"sessionId": "session-explicit-gateway",
"threadId": "thread-explicit-gateway",
"taskPrompt": "search latest news",
"routing": map[string]any{
"routingMode": "explicit",
"explicitExecutionTarget": "gateway",
"explicitProviderId": "claude",
"preferredGatewayProviderId": "openclaw",
},
},
},
})
if rpcErr != nil {
t.Fatalf("expected structured response, got rpc error: %v", rpcErr)
}
if unavailable, _ := response["unavailable"].(bool); unavailable {
t.Fatalf("expected gateway route without provider unavailable error, got %#v", response)
}
if got := response["resolvedExecutionTarget"]; got != "gateway" {
t.Fatalf("expected resolved gateway target, got %#v", response)
}
if got := response["resolvedGatewayProviderId"]; got != "openclaw" {
t.Fatalf("expected resolved openclaw gateway provider, got %#v", response)
}
if got := response["resolvedProviderId"]; got != "" {
t.Fatalf("expected no resolved single-agent provider, got %#v", response)
}
if got := response["error"]; got != "gateway not connected" {
t.Fatalf("expected test environment to reach gateway execution path, got %#v", response)
}
}
func TestExecuteSessionTaskAutoRoutingUsesBridgeProductionProviderOrder(t *testing.T) {
workspaceDir := filepath.Join(t.TempDir(), "workspace")
if err := os.MkdirAll(workspaceDir, 0o755); err != nil {

View File

@ -242,14 +242,6 @@ func resolveProvider(
availableProviders []string,
executionTarget string,
) (string, bool, string, string) {
explicitProviderID := normalize(strings.TrimSpace(req.ExplicitProviderID))
if explicitProviderID != "" {
if containsProvider(availableProviders, explicitProviderID) {
return explicitProviderID, false, "", ""
}
return "", true, "PROVIDER_UNAVAILABLE", "explicit provider is unavailable"
}
if executionTarget != ExecutionTargetSingleAgent {
preferredProvider := normalize(strings.TrimSpace(prefs.Provider))
if containsProvider(availableProviders, preferredProvider) {
@ -258,6 +250,14 @@ func resolveProvider(
return "", false, "", ""
}
explicitProviderID := normalize(strings.TrimSpace(req.ExplicitProviderID))
if explicitProviderID != "" {
if containsProvider(availableProviders, explicitProviderID) {
return explicitProviderID, false, "", ""
}
return "", true, "PROVIDER_UNAVAILABLE", "explicit provider is unavailable"
}
preferredProvider := normalize(strings.TrimSpace(prefs.Provider))
if containsProvider(availableProviders, preferredProvider) {
return preferredProvider, false, "", ""

View File

@ -59,6 +59,35 @@ func TestResolveExplicitProviderRequiresAvailability(t *testing.T) {
}
}
func TestResolveExplicitGatewayIgnoresExplicitProvider(t *testing.T) {
resolver := Resolver{
SkillFinder: skills.StaticFinder{},
SkillInstaller: nil,
MemoryService: memory.Service{},
}
result := resolver.Resolve(Request{
Prompt: "search the web and summarize results",
RoutingMode: RoutingModeExplicit,
ExplicitExecutionTarget: ExecutionTargetGateway,
ExplicitProviderID: "codex",
PreferredGatewayProviderID: GatewayProviderOpenClaw,
})
if result.Unavailable {
t.Fatalf("expected explicit gateway route to ignore explicit provider, got %#v", result)
}
if result.ResolvedExecutionTarget != ExecutionTargetGateway {
t.Fatalf("expected gateway route, got %#v", result)
}
if result.ResolvedGatewayProviderID != GatewayProviderOpenClaw {
t.Fatalf("expected openclaw gateway provider, got %#v", result)
}
if result.ResolvedProviderID != "" {
t.Fatalf("expected no single-agent provider on gateway route, got %#v", result)
}
}
func TestResolveAutoLocalTaskToSingleAgent(t *testing.T) {
resolver := Resolver{
SkillFinder: skills.StaticFinder{},