48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""模型网关 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
|