@@ -394,9 +394,34 @@ async def apply_entrypoint(
394394 await nginx .register (config , acme )
395395
396396
397+ async def _migrate_cors_enabled (repo : GatewayProxyRepo ) -> None :
398+ """Migrate services registered before the cors_enabled field was added.
399+
400+ Old gateway versions didn't persist cors_enabled on services. This derives it
401+ from the associated model's format so that CORS is enabled for openai-format
402+ models on gateway restart without requiring service re-registration.
403+ """
404+ services = await repo .list_services ()
405+ openai_run_names : set [tuple [str , str ]] = set ()
406+ for service in services :
407+ for model in await repo .list_models (service .project_name ):
408+ if model .run_name == service .run_name and isinstance (
409+ model .format_spec , models .OpenAIChatModelFormat
410+ ):
411+ openai_run_names .add ((service .project_name , service .run_name ))
412+ for service in services :
413+ if (
414+ not service .cors_enabled
415+ and (service .project_name , service .run_name ) in openai_run_names
416+ ):
417+ updated = models .Service (** {** service .dict (), "cors_enabled" : True })
418+ await repo .set_service (updated )
419+
420+
397421async def apply_all (
398422 repo : GatewayProxyRepo , nginx : Nginx , service_conn_pool : ServiceConnectionPool
399423) -> None :
424+ await _migrate_cors_enabled (repo )
400425 service_tasks = [
401426 apply_service (
402427 service = service ,
0 commit comments