mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-19 16:17:56 +00:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user