Restrict priority demotion to same-model peers

This commit is contained in:
2026-05-13 08:37:39 +08:00
parent e778fad6ed
commit 2685450f3e
5 changed files with 82 additions and 14 deletions
@@ -944,6 +944,26 @@ WHERE reference_type = 'gateway_task'
"credentials": map[string]any{"mode": "simulation"},
"priority": 20,
}, http.StatusCreated, &successPlatform)
var unrelatedPriorityPlatform struct {
ID string `json:"id"`
}
doJSON(t, server.URL, http.MethodPost, "/api/admin/platforms", loginResponse.AccessToken, map[string]any{
"provider": "openai",
"platformKey": "openai-unrelated-priority-" + suffixText,
"name": "OpenAI Unrelated Priority",
"baseUrl": "https://api.openai.com/v1",
"authType": "bearer",
"credentials": map[string]any{"mode": "simulation"},
"priority": 900,
}, http.StatusCreated, &unrelatedPriorityPlatform)
var unrelatedPriorityPlatformModel map[string]any
doJSON(t, server.URL, http.MethodPost, "/api/admin/platforms/"+unrelatedPriorityPlatform.ID+"/models", loginResponse.AccessToken, map[string]any{
"canonicalModelKey": "openai:gpt-4o-mini",
"modelName": "priority-demote-unrelated-" + suffixText,
"modelAlias": "priority-demote-unrelated-" + suffixText,
"modelType": []string{"text_generate"},
"displayName": "Unrelated Priority",
}, http.StatusCreated, &unrelatedPriorityPlatformModel)
for _, platformID := range []string{failedPlatform.ID, successPlatform.ID} {
var platformModel map[string]any
doJSON(t, server.URL, http.MethodPost, "/api/admin/platforms/"+platformID+"/models", loginResponse.AccessToken, map[string]any{
@@ -1000,6 +1020,26 @@ WHERE reference_type = 'gateway_task'
if summary, ok := failoverDetail.Metrics["attempts"].([]any); !ok || len(summary) != 3 {
t.Fatalf("task metrics should keep attempt-chain summary, got %+v", failoverDetail.Metrics)
}
var demotedDynamicPriority int
var successEffectivePriority int
var unrelatedEffectivePriority int
if err := testPool.QueryRow(ctx, `
SELECT COALESCE(failed.dynamic_priority, -1),
COALESCE(success.dynamic_priority, success.priority),
COALESCE(unrelated.dynamic_priority, unrelated.priority)
FROM integration_platforms failed
JOIN integration_platforms success ON success.id = $2::uuid
JOIN integration_platforms unrelated ON unrelated.id = $3::uuid
WHERE failed.id = $1::uuid`, failedPlatform.ID, successPlatform.ID, unrelatedPriorityPlatform.ID).Scan(&demotedDynamicPriority, &successEffectivePriority, &unrelatedEffectivePriority); err != nil {
t.Fatalf("read priority demotion state: %v", err)
}
expectedDemotedPriority := successEffectivePriority + 1
if unrelatedEffectivePriority <= expectedDemotedPriority {
t.Fatalf("unrelated priority fixture should sit beyond same-model peers: unrelated=%d expected=%d", unrelatedEffectivePriority, expectedDemotedPriority)
}
if demotedDynamicPriority != expectedDemotedPriority {
t.Fatalf("priority demotion should use only same-model peer clients, got dynamic_priority=%d want %d", demotedDynamicPriority, expectedDemotedPriority)
}
var degradePolicySet struct {
ID string `json:"id"`