- ① 后端删除 app/ai_provider/(38 文件,含 anthropic/openai 格式、billing、audio、embedding)、services/ai_provider_admin.py、core/config/model_config.py、tests/ai_provider/(21 文件) - ② 连带退役 application/agent/(旧 Agent 循环/steer/follow-up/确认注册表)、application/skill_executor.py、app/skills/(python skills 孤儿)、endpoints/audio.py、application/imports.py(ProviderManager 消费方);settings 端点收敛为生成偏好 - ③ runs.py 修剪:AgentRunRegistry/steer/follow-up/confirmations 端点退役,保留 list/get/events/cancel/stream;safety 确认改为直接落库裁决(pending→approved/denied) - ④ 前端删除:models 页、ModelGatewayView、gateway.ts、GatewayPanel(玄关)、ModelGatewayPanel/ModelStrategyForm、audio.ts/useVoiceInput、网关类型与 mock;设置页收敛为外观/语言/通知 - ⑤ 配置收敛:config/models|providers|pricing.example.yaml 归档 shenshi/config/;.env.example 删 provider keys/MODEL_ENDPOINT_POOL/MODEL_CONFIG_PATH,收敛 SHENSHI_* - ⑥ 验收:rg 审计灵台 Provider SDK import 与 ai_provider 引用归零;后端 528 passed(2 个预存失败经 HEAD 复跑验证与本手术无关)、前端 type-check+201 passed、神识 go vet+test、BFF 4 passed
69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
"""设置服务:生成偏好。
|
|
|
|
生成偏好为本地单用户单行,无则返回默认值;模型网关状态由神识承接(用户面见神识阁)。
|
|
"""
|
|
|
|
from app.core.config import settings
|
|
from app.core.time import utc_now
|
|
from app.db.session import AsyncSessionLocal
|
|
from app.models.governance import GenerationPreferences
|
|
from app.repositories import preferences as preferences_repo
|
|
from app.schemas.preferences import (
|
|
GenerationPreferencesResponse,
|
|
UpdateGenerationPreferencesRequest,
|
|
)
|
|
from app.services.serializers import generation_preferences_to_response
|
|
|
|
|
|
def _default_preferences() -> GenerationPreferences:
|
|
return GenerationPreferences(
|
|
owner_scope=settings.default_owner_scope,
|
|
default_model_hint=settings.default_model_hint,
|
|
temperature=0.7,
|
|
top_p=1.0,
|
|
max_output_tokens=4096,
|
|
streaming=True,
|
|
)
|
|
|
|
|
|
async def get_generation_preferences(
|
|
owner_scope: str = settings.default_owner_scope,
|
|
) -> GenerationPreferencesResponse:
|
|
async with AsyncSessionLocal() as session:
|
|
prefs = await preferences_repo.get_preferences(session, owner_scope)
|
|
if prefs is None:
|
|
prefs = _default_preferences()
|
|
return generation_preferences_to_response(prefs)
|
|
|
|
|
|
async def update_generation_preferences(
|
|
payload: UpdateGenerationPreferencesRequest,
|
|
owner_scope: str = settings.default_owner_scope,
|
|
) -> GenerationPreferencesResponse:
|
|
async with AsyncSessionLocal() as session:
|
|
prefs = await preferences_repo.get_preferences(session, owner_scope)
|
|
if prefs is None:
|
|
prefs = _default_preferences()
|
|
for key, value in payload.model_dump(exclude_unset=True).items():
|
|
setattr(prefs, key, value)
|
|
prefs.updated_at = utc_now()
|
|
session.add(prefs)
|
|
try:
|
|
await session.commit()
|
|
except Exception:
|
|
await session.rollback()
|
|
prefs = await preferences_repo.get_preferences(session, owner_scope)
|
|
if prefs is None:
|
|
raise
|
|
for key, value in payload.model_dump(exclude_unset=True).items():
|
|
setattr(prefs, key, value)
|
|
prefs.updated_at = utc_now()
|
|
await session.commit()
|
|
else:
|
|
for key, value in payload.model_dump(exclude_unset=True).items():
|
|
setattr(prefs, key, value)
|
|
prefs.updated_at = utc_now()
|
|
await session.commit()
|
|
await session.refresh(prefs)
|
|
return generation_preferences_to_response(prefs)
|