"""模型网关 endpoint 覆盖数据访问(api-spec §4.4)。 按 (logical_model_name, endpoint_name) 唯一;upsert 手动 find+update,兼容 SQLite。 字段 None 表示不覆盖该字段(回退 yaml/env)。 """ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.governance import ModelEndpointOverride async def list_overrides(session: AsyncSession) -> list[ModelEndpointOverride]: result = await session.execute(select(ModelEndpointOverride)) return list(result.scalars().all()) async def get_override( session: AsyncSession, logical_model_name: str, endpoint_name: str, ) -> ModelEndpointOverride | None: result = await session.execute( select(ModelEndpointOverride).where( ModelEndpointOverride.logical_model_name == logical_model_name, ModelEndpointOverride.endpoint_name == endpoint_name, ) ) return result.scalars().first() async def upsert_override( session: AsyncSession, override: ModelEndpointOverride, ) -> ModelEndpointOverride: """存在则更新非 None 字段,否则新建。返回最终实体(未 commit)。""" existing = await get_override(session, override.logical_model_name, override.endpoint_name) if existing is not None: existing.base_url = override.base_url existing.api_key = override.api_key existing.status = override.status existing.weight = override.weight existing.priority = override.priority return existing session.add(override) await session.flush() return override