Files
hunjing/backend/app/services/preferences.py
T
chenxin 462d570751 M4b:ai_provider 删除手术①-⑥——神识全面接管模型出口
- ① 后端删除 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
2026-08-27 10:02:44 +08:00

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)