Merge pull request #6379 from baryon/contrib/codex-priority-service-tier

fix(codex): advertise Fast service tier in generated catalogs
This commit is contained in:
Wesley Liddick
2026-09-01 09:02:24 +08:00
committed by GitHub
2 changed files with 81 additions and 4 deletions
@@ -324,6 +324,12 @@ type configuredCodexTruncationPolicy struct {
Limit int64 `json:"limit"`
}
type configuredCodexServiceTier struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
}
type configuredCodexModelMessages struct {
InstructionsTemplate string `json:"instructions_template"`
InstructionsVariables any `json:"instructions_variables"`
@@ -351,7 +357,7 @@ type configuredCodexModelDescriptor struct {
SupportedInAPI bool `json:"supported_in_api"`
Priority int `json:"priority"`
AdditionalSpeedTiers []string `json:"additional_speed_tiers"`
ServiceTiers []any `json:"service_tiers"`
ServiceTiers []configuredCodexServiceTier `json:"service_tiers"`
DefaultServiceTier any `json:"default_service_tier"`
AvailabilityNUX any `json:"availability_nux"`
Upgrade any `json:"upgrade"`
@@ -407,7 +413,7 @@ func newConfiguredCodexModelDescriptor(modelID string) configuredCodexModelDescr
SupportedInAPI: true,
Priority: configuredCodexModelPriority,
AdditionalSpeedTiers: []string{},
ServiceTiers: []any{},
ServiceTiers: []configuredCodexServiceTier{},
ModelMessages: configuredCodexModelMessages{InstructionsTemplate: openai.CodexBaseInstructionsForModel(modelID)},
SupportsReasoningSummaryParameter: true,
DefaultReasoningSummary: "auto",
@@ -463,6 +469,15 @@ func newConfiguredCodexModelDescriptor(modelID string) configuredCodexModelDescr
descriptor.DisplayName = openaiCodexDisplayName(modelID)
descriptor.Description = "OpenAI GPT coding model routed through Sub2API."
descriptor.SupportsParallelToolCalls = true
if configuredCodexSupportsPriorityServiceTier(modelID) {
descriptor.ServiceTiers = []configuredCodexServiceTier{
{
ID: "priority",
Name: "Fast",
Description: "Priority processing for lower latency.",
},
}
}
if isOpenAICodexReasoningGPTModel(modelID) {
defaultReasoningLevel := "medium"
if getNormalizedCodexModel(modelID) == "gpt-5.6-sol" {
@@ -486,6 +501,16 @@ func newConfiguredCodexModelDescriptor(modelID string) configuredCodexModelDescr
return descriptor
}
func configuredCodexSupportsPriorityServiceTier(modelID string) bool {
normalized := canonicalizeOpenAIModelAliasSpelling(modelID)
for _, family := range []string{"gpt-5.4", "gpt-5.5", "gpt-5.6"} {
if normalized == family || strings.HasPrefix(normalized, family+"-") {
return true
}
}
return false
}
func configuredCodexGrokReasoningLevels(modelID string) []configuredCodexReasoningLevel {
levels := []configuredCodexReasoningLevel{
{Effort: "low", Description: "Fast responses with lighter reasoning"},
@@ -205,7 +205,7 @@ func requireCompleteConfiguredCodexModel(t *testing.T, model map[string]any, slu
require.Equal(t, true, model["supported_in_api"])
require.NotNil(t, model["priority"])
require.Equal(t, []any{}, model["additional_speed_tiers"])
require.Equal(t, []any{}, model["service_tiers"])
require.IsType(t, []any{}, model["service_tiers"])
require.Contains(t, model, "default_service_tier")
require.Contains(t, model, "availability_nux")
require.Contains(t, model, "upgrade")
@@ -427,6 +427,51 @@ func TestBuildCodexModelsManifestKeepsKnownReasoningChoices(t *testing.T) {
require.NotEqual(t, "none", firstLevel["effort"])
}
// Scenario: 支持 Fast 的 GPT 型号在目录中声明 priority service tier。
func TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels(t *testing.T) {
t.Parallel()
body, err := BuildCodexModelsManifest([]string{
"gpt-5.4-mini",
"gpt-5.5",
"gpt-5.6-sol",
})
require.NoError(t, err)
models := decodeCodexManifestModels(t, body)
require.Len(t, models, 3)
for _, model := range models {
require.Equal(t, []any{
map[string]any{
"id": "priority",
"name": "Fast",
"description": "Priority processing for lower latency.",
},
}, model["service_tiers"])
require.Nil(t, model["default_service_tier"])
}
}
// Scenario: 未明确支持 Fast 的型号不推测 service tier。
func TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels(t *testing.T) {
t.Parallel()
body, err := BuildCodexModelsManifest([]string{
"gpt-4o",
"claude-opus-4-6",
"deepseek-v4-pro",
"company-coding-model",
})
require.NoError(t, err)
models := decodeCodexManifestModels(t, body)
require.Len(t, models, 4)
for _, model := range models {
require.Equal(t, []any{}, model["service_tiers"])
require.Nil(t, model["default_service_tier"])
}
}
// Scenario: 专用图片生成模型不进入 Codex 主模型目录。
func TestBuildCodexModelsManifestOmitsDedicatedImageModels(t *testing.T) {
t.Parallel()
@@ -1895,7 +1940,7 @@ func TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata(t *
svc := &OpenAIGatewayService{}
manifest := &CodexModelsManifest{
Body: []byte(`{"models":[{"slug":"grok-4.6","description":"Provider supplied","model_messages":{"auto_review":{"enabled":true}},"truncation_policy":{"mode":"tokens"},"unknown":{"kept":true}}],"metadata":{"source":"upstream"}}`),
Body: []byte(`{"models":[{"slug":"grok-4.6","description":"Provider supplied","service_tiers":[{"id":"provider-priority","name":"Provider Fast","description":"Provider supplied tier."}],"model_messages":{"auto_review":{"enabled":true}},"truncation_policy":{"mode":"tokens"},"unknown":{"kept":true}}],"metadata":{"source":"upstream"}}`),
}
account := newCodexModelsAPIKeyTestAccount("https://upstream.example/v1")
@@ -1905,6 +1950,13 @@ func TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata(t *
requireCompleteConfiguredCodexModel(t, models[0], "grok-4.6")
require.Equal(t, "Provider supplied", models[0]["description"])
require.Equal(t, map[string]any{"kept": true}, models[0]["unknown"])
require.Equal(t, []any{
map[string]any{
"id": "provider-priority",
"name": "Provider Fast",
"description": "Provider supplied tier.",
},
}, models[0]["service_tiers"])
require.Equal(t, []any{"text"}, models[0]["input_modalities"])
require.Equal(t, []string{"low", "medium", "high", "xhigh"}, effortsFromManifestModel(t, models[0]))
modelMessages, ok := models[0]["model_messages"].(map[string]any)