初始化提交

This commit is contained in:
chenxin committed 2026-08-21 16:00:13 +08:00
commit 887c1f449e
963 files changed
+166869

No files matched your search

+137
View File
@@ -0,0 +1,137 @@
"""人物 API schema。"""
from typing import Any
from pydantic import BaseModel, ConfigDict, Field
class CharacterResponse(BaseModel):
model_config = ConfigDict(
json_schema_extra={
"examples": [
{
"id": "character_ec83d55746c54e47ab6f98d683032626",
"name": "default",
"display_name": "魂镜默认人物",
"status": "active",
"language": "zh-CN",
"profile": {"bio": "本地 MVP 默认人物。"},
"model_policy": {"default_model_hint": "deepseek-v4-flash"},
"current_personality_version_id": "personality_9b5f5b7e413442d0a2f9e61a2f4d7df5",
"privacy_level": "normal",
"owner_scope": "local-user",
"is_system_template": False,
"source_template_id": "character_template_default",
"created_at": "2026-06-19T09:00:00.000000Z",
"updated_at": "2026-06-19T09:00:00.000000Z",
}
]
}
)
id: str = Field(description="人物 ID,前缀为 character_。")
name: str = Field(description="人物内部名称。")
display_name: str | None = Field(description="人物显示名称。")
status: str = Field(description="人物状态,取值见契约字典 character.status。")
language: str = Field(description="人物默认语言。")
profile: dict[str, Any] = Field(description="人物档案 JSON。")
model_policy: dict[str, Any] = Field(description="人物模型策略。")
current_personality_version_id: str | None = Field(description="当前人格版本 ID。")
privacy_level: str = Field(description="隐私等级:normal / sensitive / local_only。")
owner_scope: str = Field(description="归属范围;当前本地 MVP 为 local-user。")
is_system_template: bool = Field(description="是否系统人物模板;active API 通常返回 false。")
source_template_id: str | None = Field(
description="来源系统模板人物 ID;非模板复制人物通常有值。"
)
avatar_url: str | None = Field(
default=None, description="角色头像 URL。无头像时为 null。"
)
created_at: str = Field(description="创建时间,UTC ISO 8601 字符串。")
updated_at: str = Field(description="更新时间,UTC ISO 8601 字符串。")
class CharacterSummaryResponse(BaseModel):
"""人物列表项(api-spec §6 列出人物)。"""
id: str = Field(description="人物 ID,前缀为 character_。")
name: str = Field(description="人物内部名称。")
display_name: str | None = Field(description="人物显示名称。")
status: str = Field(description="人物状态,取值见契约字典 character.status。")
memory_count: int = Field(default=0, description="人物关联的未删除记忆数量。")
personality_version: int = Field(default=0, description="当前人格版本号;尚未形成人格时为 0。")
activated_at: str | None = Field(
default=None, description="最近激活时间,UTC ISO 8601 字符串。"
)
class CreateCharacterRequest(BaseModel):
name: str = Field(min_length=1, description="人物内部名称,必填。")
display_name: str | None = Field(default=None, description="可选显示昵称。")
template_key: str | None = Field(
default=None,
description="系统模板 key;传此值则从模板创建(继承档案/模型策略,status=active)。",
)
profile: dict[str, Any] | None = Field(
default=None,
description="人物档案,可含 birthday/height/weight/background/speaking_style。",
)
model_policy: dict[str, Any] | None = Field(
default=None,
description="模型策略,可含 default_chat_model_hint / memory_extraction_model_hint 等。",
)
class UpdateProfileRequest(BaseModel):
"""更新人物档案(api-spec §6 PATCH /characters/{id}/profile)。手动编辑视为用户确认。"""
display_name: str | None = Field(default=None, description="可选显示昵称。")
birthday: str | None = Field(default=None)
height: str | None = Field(default=None)
weight: str | None = Field(default=None)
description: str | None = Field(default=None, description="一句话简介。")
background: str | None = Field(default=None)
speaking_style: str | None = Field(default=None, description="表达风格。")
temperament: str | None = Field(default=None, description="性情气质。")
hobbies: list[str] | None = Field(default=None, description="兴趣爱好列表。")
values: list[str] | None = Field(default=None, description="价值观列表。")
class UpdateModelPolicyRequest(BaseModel):
"""更新人物模型策略(api-spec §6 PATCH /characters/{id}/model-policy)。"""
default_chat_model_hint: str | None = Field(default=None)
memory_extraction_model_hint: str | None = Field(default=None)
personality_analysis_model_hint: str | None = Field(default=None)
embedding_model_hint: str | None = Field(default=None)
privacy_level: str | None = Field(default=None)
class ActivateCharacterResponse(BaseModel):
"""激活人物响应(api-spec §6 POST /characters/{id}/activate)。"""
active_character_id: str = Field(description="当前激活人物 ID。")
status: str = Field(description="激活后状态,恒为 active。")
class CharacterTemplateSummaryResponse(BaseModel):
"""系统模板列表项(GET /character-templates)。"""
key: str = Field(description="模板唯一标识(template_key)。")
name: str = Field(description="模板人物内部名称。")
display_name: str | None = Field(description="模板人物显示昵称。")
description: str | None = Field(description="档案中的一句话描述(profile.description)。")
temperament: str | None = Field(description="档案中的性情气质(profile.temperament)。")
speaking_style: str | None = Field(description="档案中的说话风格(profile.speaking_style)。")
language: str = Field(description="默认语言。")
class ImportCardResponse(BaseModel):
"""角色卡导入结果。"""
character_id: str = Field(description="新建人物 ID。")
name: str = Field(description="人物名称。")
display_name: str | None = Field(default=None, description="显示名(V3 nickname 优先)。")
lorebook_id: str | None = Field(
default=None, description="导入的世谱 ID(character_book);无则为 null。"
)
entry_count: int = Field(default=0, description="世谱条目数。")