接入 OpenAI 官方 API 并为 Codex 订阅配置同型号回退

This commit is contained in:
Codex
2026-10-28 18:19:04 -07:00
parent ed5f6514bb
commit 205bd3bbbc
5 changed files with 133 additions and 3 deletions
+40
View File
@@ -57,6 +57,46 @@ class ConfigTests(unittest.TestCase):
settings = build_config(self.catalog, {}, lambda _: False)['general_settings']
self.assertTrue(settings['disable_env_credential_login'])
def test_official_openai_missing_key_does_not_change_existing_config(self):
catalog = {**self.catalog, 'openai': {'transcribe': 'gpt-transcribe'}}
config = build_config(catalog, {}, lambda _: True)
self.assertFalse(any(r['model_name'].startswith('openai/') for r in config['model_list']))
self.assertEqual(config['router_settings']['fallbacks'], [])
def test_official_openai_is_not_misclassified_as_zenmux(self):
catalog = {**self.catalog, 'openai': {'transcribe': 'gpt-transcribe'}}
config = build_config(catalog, {'OPENAI_API_KEY': 'synthetic-secret'}, lambda _: False)
routes = {r['model_name']: r for r in config['model_list']}
self.assertIn('openai/transcribe', routes)
self.assertNotIn('zenmux/transcribe', routes)
self.assertEqual(routes['openai/transcribe']['litellm_params']['api_base'], 'https://api.openai.com/v1')
self.assertEqual(routes['openai/transcribe']['litellm_params']['api_key'], 'os.environ/OPENAI_API_KEY')
self.assertNotIn('synthetic-secret', str(config))
self.assertEqual(config['router_settings']['fallbacks'], [])
def test_oauth_fallbacks_cover_legacy_and_namespaced_routes(self):
config = build_config(self.catalog, {'OPENAI_API_KEY': 'synthetic'}, lambda _: True)
groups = {k: v for row in config['router_settings']['fallbacks'] for k, v in row.items()}
self.assertEqual(groups['codex-latest'], ['openai/codex-latest'])
self.assertEqual(groups['codex/codex-latest'], ['openai/codex-latest'])
self.assertNotIn('grok-latest', groups)
self.assertNotIn('openai/codex-latest', groups)
def test_actual_catalog_has_same_model_api_fallbacks_and_latest_tracks(self):
catalog = yaml.safe_load(Path(__file__).with_name('models.yaml').read_text())
catalog['chatgpt']['gpt-luna-latest'] = 'gpt-99-luna'
config = build_config(catalog, {'OPENAI_API_KEY': 'synthetic'}, lambda _: True)
routes = {r['model_name']: r for r in config['model_list']}
self.assertEqual(routes['openai/gpt-luna-latest']['litellm_params']['model'], 'openai/gpt-99-luna')
groups = {k: v for row in config['router_settings']['fallbacks'] for k, v in row.items()}
for name, route in routes.items():
if route['litellm_params']['model'].startswith('chatgpt/'):
backup = routes[groups[name][0]]
self.assertEqual(route['litellm_params']['model'].split('/', 1)[1],
backup['litellm_params']['model'].split('/', 1)[1])
self.assertEqual(groups['codex/gpt-6-sol'], ['openai/gpt-6-sol'])
self.assertEqual(groups['codex/gpt-5.5'], ['openai/gpt-5.5'])
def test_subscription_preserves_vendor_prefix(self):
routes = build_config(self.catalog, {'ZENMUX_SUBSCRIPTION_API_KEY': 'secret'}, lambda _: False)['model_list']
self.assertEqual(routes[0]['litellm_params']['model'], 'anthropic/anthropic/claude-sonnet-5.5')