mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-20 00:18:55 +00:00
Merge pull request #6718 from lyy0709/codex/astra-ultra-catalog
fix(codex): preserve Astra Ultra workflow metadata
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
|
||||
var codexToolCapabilityFields = []string{
|
||||
"supports_search_tool", "apply_patch_tool_type", "comp_hash", "tool_mode", "use_responses_lite",
|
||||
"multi_agent_reasoning_effort", "multi_agent_version",
|
||||
}
|
||||
|
||||
func applyCodexToolCapabilities(dst, src map[string]json.RawMessage, overwrite bool) bool {
|
||||
@@ -18,7 +19,7 @@ func applyCodexToolCapabilities(dst, src map[string]json.RawMessage, overwrite b
|
||||
if len(value) == 0 {
|
||||
continue
|
||||
}
|
||||
// These five Codex fields are nullable booleans or strings, never arbitrary objects.
|
||||
// These Codex fields are nullable booleans or strings, never arbitrary objects.
|
||||
if !bytes.Equal(value, []byte("null")) {
|
||||
if field == "supports_search_tool" || field == "use_responses_lite" {
|
||||
if !bytes.Equal(value, []byte("true")) && !bytes.Equal(value, []byte("false")) {
|
||||
@@ -422,6 +423,8 @@ func configuredCodexReasoningLevelDescription(level string) string {
|
||||
return "Extra-high reasoning depth for difficult tasks"
|
||||
case "max":
|
||||
return "Maximum reasoning depth for complex tasks"
|
||||
case "ultra":
|
||||
return "Maximum reasoning with automatic task delegation"
|
||||
default:
|
||||
return "Reasoning effort supported by the upstream model"
|
||||
}
|
||||
|
||||
@@ -9,6 +9,58 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAstraUltraCatalogPreservesWorkflowMetadata(t *testing.T) {
|
||||
// Ultra is a Codex workflow. Its inference effort must survive catalog sync,
|
||||
// aliases and group generation instead of silently falling back to max.
|
||||
_, metadata, err := extractUpstreamModelCatalog([]byte(`{"models":[{
|
||||
"slug":"gpt-6-astra","supported_reasoning_levels":[{"effort":"high"},{"effort":"ultra"}],
|
||||
"multi_agent_reasoning_effort":"high","multi_agent_version":"v2"
|
||||
}]}`), false)
|
||||
require.NoError(t, err)
|
||||
account := Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey, Credentials: map[string]any{
|
||||
"base_url": "https://relay.example/v1", "model_mapping": map[string]any{"public-astra": "gpt-6-astra"},
|
||||
}}
|
||||
account.SetUpstreamModelMetadataSnapshot(UpstreamModelMetadataSnapshot{Models: metadata})
|
||||
body, err := buildCodexModelsManifestForAccounts(PlatformOpenAI, []string{"public-astra"}, []Account{account}, nil, true)
|
||||
require.NoError(t, err)
|
||||
model := decodeCodexManifestModels(t, body)[0]
|
||||
require.Equal(t, "high", model["multi_agent_reasoning_effort"])
|
||||
require.Equal(t, "v2", model["multi_agent_version"])
|
||||
require.Equal(t, []string{"high", "ultra"}, effortsFromManifestModel(t, model))
|
||||
|
||||
peer := Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey, Credentials: account.Credentials}
|
||||
body, err = buildCodexModelsManifestForAccounts(PlatformOpenAI, []string{"public-astra"}, []Account{account, peer}, nil, true)
|
||||
require.NoError(t, err)
|
||||
model = decodeCodexManifestModels(t, body)[0]
|
||||
require.Nil(t, model["multi_agent_reasoning_effort"], "do not advertise one account's override for all peers")
|
||||
require.Nil(t, model["multi_agent_version"])
|
||||
}
|
||||
|
||||
func TestAstraUltraCatalogPreservesExplicitWorkflowOverrides(t *testing.T) {
|
||||
account := &Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey,
|
||||
Credentials: map[string]any{"base_url": "https://relay.example/v1"}}
|
||||
for _, fields := range []string{
|
||||
`"multi_agent_reasoning_effort":"high","multi_agent_version":"v1"`,
|
||||
`"multi_agent_reasoning_effort":null,"multi_agent_version":null`,
|
||||
} {
|
||||
for _, source := range []string{
|
||||
`{"models":[{"slug":"gpt-6-astra",` + fields + `}]}`,
|
||||
`{"data":[{"id":"gpt-6-astra",` + fields + `}]}`,
|
||||
} {
|
||||
converted := convertOpenAIModelListToCodexManifestForAccount([]byte(source), account)
|
||||
body, err := completeAPIKeyCodexModelsManifestMetadata(converted, true, account)
|
||||
require.NoError(t, err)
|
||||
model := decodeCodexManifestModels(t, body)[0]
|
||||
var expected map[string]any
|
||||
require.NoError(t, json.Unmarshal([]byte(`{`+fields+`}`), &expected))
|
||||
for key, value := range expected {
|
||||
require.Contains(t, model, key)
|
||||
require.Equal(t, value, model[key])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations(t *testing.T) {
|
||||
newAccount := func(baseURL string) Account {
|
||||
return Account{Platform: PlatformOpenAI, Type: AccountTypeAPIKey, Credentials: map[string]any{
|
||||
|
||||
@@ -374,6 +374,7 @@ type configuredCodexModelDescriptor struct {
|
||||
Description string `json:"description"`
|
||||
DefaultReasoningLevel *string `json:"default_reasoning_level,omitempty"`
|
||||
SupportedReasoningLevels []configuredCodexReasoningLevel `json:"supported_reasoning_levels"`
|
||||
MultiAgentReasoningEffort *string `json:"multi_agent_reasoning_effort,omitempty"`
|
||||
ShellType string `json:"shell_type"`
|
||||
Visibility string `json:"visibility"`
|
||||
SupportedInAPI bool `json:"supported_in_api"`
|
||||
@@ -505,6 +506,11 @@ func newConfiguredCodexModelDescriptor(modelID string) configuredCodexModelDescr
|
||||
descriptor.MaxContextWindow = configuredCodexGPT56MaxContext
|
||||
}
|
||||
if isOpenAIGPT6AstraModel(modelID) {
|
||||
// Codex resolves the Ultra workflow to this effort before inference.
|
||||
// openai/codex a9896da3: codex-rs/models-manager/models.json.
|
||||
multiAgentEffort := "xhigh"
|
||||
descriptor.MultiAgentReasoningEffort = &multiAgentEffort
|
||||
descriptor.MultiAgentVersion = "v2"
|
||||
descriptor.ContextWindow = configuredCodexGPT6AstraContext
|
||||
descriptor.MaxContextWindow = configuredCodexGPT6AstraContext
|
||||
}
|
||||
@@ -615,7 +621,7 @@ func configuredCodexGPTReasoningLevels(modelID string) []configuredCodexReasonin
|
||||
Description: "Maximum reasoning depth for complex tasks",
|
||||
})
|
||||
}
|
||||
if normalized == "gpt-5.6-sol" || normalized == "gpt-5.6-terra" {
|
||||
if isOpenAIGPT6AstraModel(modelID) || normalized == "gpt-5.6-sol" || normalized == "gpt-5.6-terra" {
|
||||
levels = append(levels, configuredCodexReasoningLevel{
|
||||
Effort: "ultra",
|
||||
Description: "Maximum reasoning with automatic task delegation",
|
||||
|
||||
@@ -353,8 +353,10 @@ func TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback(t
|
||||
require.Equal(t, "GPT-6 Astra", gpt6Astra.DisplayName)
|
||||
require.NotNil(t, gpt6Astra.DefaultReasoningLevel)
|
||||
require.Equal(t, "medium", *gpt6Astra.DefaultReasoningLevel)
|
||||
require.Equal(t, []string{"low", "medium", "high", "xhigh", "max"}, effortsFromConfiguredCodexLevels(gpt6Astra.SupportedReasoningLevels))
|
||||
require.NotContains(t, gpt6Astra.SupportedReasoningLevels, configuredCodexReasoningLevel{Effort: "ultra"})
|
||||
require.Equal(t, []string{"low", "medium", "high", "xhigh", "max", "ultra"}, effortsFromConfiguredCodexLevels(gpt6Astra.SupportedReasoningLevels))
|
||||
require.NotNil(t, gpt6Astra.MultiAgentReasoningEffort)
|
||||
require.Equal(t, "xhigh", *gpt6Astra.MultiAgentReasoningEffort)
|
||||
require.Equal(t, "v2", gpt6Astra.MultiAgentVersion)
|
||||
require.NotContains(t, gpt6Astra.SupportedReasoningLevels, configuredCodexReasoningLevel{Effort: "none"})
|
||||
require.True(t, configuredCodexSupportsPriorityServiceTier("gpt-6-astra"))
|
||||
require.Equal(t, []configuredCodexServiceTier{{
|
||||
@@ -370,7 +372,9 @@ func TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback(t
|
||||
require.Equal(t, int64(1_050_000), gpt6Astra.MaxContextWindow)
|
||||
gpt6 := newConfiguredCodexModelDescriptor("gpt-6")
|
||||
require.Equal(t, "GPT-6 (Astra)", gpt6.DisplayName)
|
||||
require.Equal(t, []string{"low", "medium", "high", "xhigh", "max"}, effortsFromConfiguredCodexLevels(gpt6.SupportedReasoningLevels))
|
||||
require.Equal(t, []string{"low", "medium", "high", "xhigh", "max", "ultra"}, effortsFromConfiguredCodexLevels(gpt6.SupportedReasoningLevels))
|
||||
require.NotNil(t, gpt6.MultiAgentReasoningEffort)
|
||||
require.Equal(t, "xhigh", *gpt6.MultiAgentReasoningEffort)
|
||||
require.Equal(t, int64(1_050_000), gpt6.ContextWindow)
|
||||
|
||||
gpt55 := newConfiguredCodexModelDescriptor("gpt-5.5")
|
||||
|
||||
Reference in New Issue
Block a user