"""司命台 · 人物模板管理 API schema。 对应 admin 端系统模板 CRUD(api-spec §19 扩展)。 """ from __future__ import annotations from typing import Any from pydantic import BaseModel, ConfigDict, Field class AdminTemplateSummaryResponse(BaseModel): """系统模板列表项(管理端完整视图)。""" key: str = Field(description="模板唯一标识(template_key)。") name: str = Field(description="模板人物内部名称。") display_name: str | None = Field(description="模板人物显示昵称。") language: str = Field(description="默认语言。") privacy_level: str = Field(description="隐私等级。") is_default: bool = Field( default=False, description="是否默认模板(新用户以此创建初始角色)。" ) profile: dict[str, Any] = Field(description="完整人物档案。") model_policy: dict[str, Any] = Field(description="完整模型策略。") created_at: str = Field(description="创建时间,UTC ISO 8601。") updated_at: str = Field(description="更新时间,UTC ISO 8601。") class AdminCreateTemplateRequest(BaseModel): """创建系统模板。""" model_config = ConfigDict(extra="forbid") key: str = Field( min_length=1, pattern=r"^[a-z][a-z0-9_\-]*$", description="模板唯一标识,仅允许小写字母、数字、下划线、连字符。" "如与 YAML 中已有的 key 相同,下次重启时会被 YAML 配置覆盖。", ) name: str = Field(min_length=1, description="模板人物内部名称。") display_name: str | None = Field(default=None, description="可选显示昵称。") language: str = Field(default="zh-CN", description="默认语言。") privacy_level: str = Field(default="normal", description="隐私等级。") is_default: bool = Field( default=False, description="是否默认模板。至多一个为 true,多个则取第一个。", ) profile: dict[str, Any] = Field( default_factory=dict, description="人物档案。生日 (birthday) 无需提供,系统自动兜底。", ) model_policy: dict[str, Any] = Field( default_factory=dict, description="模型策略。default_chat_model_hint 无需提供,从 settings 自动补充。", ) class AdminUpdateTemplateRequest(BaseModel): """更新系统模板(所有字段可选,仅更新提供值的字段)。""" model_config = ConfigDict(extra="forbid") name: str | None = Field(default=None, description="内部名称。") display_name: str | None = Field(default=None, description="显示昵称。") language: str | None = Field(default=None, description="默认语言。") privacy_level: str | None = Field(default=None, description="隐私等级。") is_default: bool | None = Field(default=None, description="是否默认模板。") profile: dict[str, Any] | None = Field(default=None, description="人物档案。") model_policy: dict[str, Any] | None = Field(default=None, description="模型策略。")