Files
MemoryBear/api/app/schemas/user_memory_schema.py
lanceyq 9a5ce7f7c6 refactor(memory): replace raw dict responses with Pydantic schema models in user memory controllers
- Add user_memory_schema.py with typed Pydantic models for all user memory
  API responses: MemoryInsightReportData, UserSummaryData, GraphData,
  MemoryTypeStatItem, cache result models, and RelationshipEvolutionData
- Refactor user_memory_controllers.py to construct schema instances and
  return model_dump() instead of raw dicts
- Remove unused imports (datetime, timestamp_to_datetime, EndUserInfoResponse,
  EndUserInfoCreate, EndUser)
2026-04-27 17:57:06 +08:00

119 lines
5.0 KiB
Python

"""
用户记忆相关的请求和响应模型
包含用户摘要、记忆洞察、节点统计、图数据和用户档案等接口的 Schema
"""
from typing import Optional, List, Dict, Any
from pydantic import BaseModel, Field
# ==================== 记忆洞察报告 ====================
class MemoryInsightReportData(BaseModel):
"""记忆洞察报告数据"""
memory_insight: Optional[str] = Field(None, description="总体概述")
behavior_pattern: Optional[str] = Field(None, description="行为模式")
key_findings: Optional[List[str]] = Field(None, description="关键发现")
growth_trajectory: Optional[str] = Field(None, description="成长轨迹")
updated_at: Optional[int] = Field(None, description="更新时间戳(毫秒)")
is_cached: bool = Field(..., description="是否有缓存数据")
message: Optional[str] = Field(None, description="附加消息")
# ==================== 用户摘要 ====================
class UserSummaryData(BaseModel):
"""用户摘要数据"""
user_summary: Optional[str] = Field(None, description="用户摘要")
personality: Optional[str] = Field(None, description="性格特征")
core_values: Optional[str] = Field(None, description="核心价值观")
one_sentence: Optional[str] = Field(None, description="一句话总结")
updated_at: Optional[int] = Field(None, description="更新时间戳(毫秒)")
is_cached: bool = Field(..., description="是否有缓存数据")
message: Optional[str] = Field(None, description="附加消息")
# ==================== 缓存生成 ====================
class GenerateCacheErrorItem(BaseModel):
"""缓存生成错误项"""
type: Optional[str] = Field(None, description="错误类型 (insight/summary)")
error: Optional[str] = Field(None, description="错误信息")
class SingleUserCacheResultData(BaseModel):
"""单用户缓存生成结果"""
end_user_id: str = Field(..., description="终端用户ID")
insight_success: bool = Field(..., description="洞察生成是否成功")
summary_success: bool = Field(..., description="摘要生成是否成功")
errors: List[GenerateCacheErrorItem] = Field(default_factory=list, description="错误列表")
class WorkspaceCacheErrorItem(BaseModel):
"""工作空间缓存生成错误项"""
end_user_id: Optional[str] = Field(None, description="终端用户ID")
insight_error: Optional[str] = Field(None, description="洞察生成错误")
summary_error: Optional[str] = Field(None, description="摘要生成错误")
error: Optional[str] = Field(None, description="通用错误信息")
class WorkspaceCacheResultData(BaseModel):
"""工作空间批量缓存生成结果"""
total_users: int = Field(..., description="总用户数")
successful: int = Field(..., description="成功数")
failed: int = Field(..., description="失败数")
errors: List[WorkspaceCacheErrorItem] = Field(default_factory=list, description="错误列表")
# ==================== 节点统计 ====================
class MemoryTypeStatItem(BaseModel):
"""记忆类型统计项"""
type: str = Field(..., description="记忆类型枚举值")
count: int = Field(..., description="该类型的数量")
percentage: float = Field(..., description="该类型在所有记忆中的占比")
# ==================== 图数据 ====================
class GraphNodeData(BaseModel):
"""图节点数据"""
id: str = Field(..., description="节点ID")
label: str = Field(..., description="节点类型标签")
properties: Dict[str, Any] = Field(default_factory=dict, description="节点属性")
caption: Optional[str] = Field(None, description="节点显示名称")
class GraphEdgeData(BaseModel):
"""图边数据"""
id: str = Field(..., description="边ID")
source: str = Field(..., description="源节点ID")
target: str = Field(..., description="目标节点ID")
type: Optional[str] = Field(None, description="关系类型")
properties: Dict[str, Any] = Field(default_factory=dict, description="边属性")
caption: Optional[str] = Field(None, description="边显示名称")
class GraphStatistics(BaseModel):
"""图统计信息"""
total_nodes: int = Field(0, description="节点总数")
total_edges: int = Field(0, description="边总数")
node_types: Dict[str, int] = Field(default_factory=dict, description="各节点类型数量")
edge_types: Optional[Dict[str, int]] = Field(default_factory=dict, description="各边类型数量")
class GraphData(BaseModel):
"""图数据响应"""
nodes: List[GraphNodeData] = Field(..., description="节点列表")
edges: List[GraphEdgeData] = Field(..., description="边列表")
statistics: GraphStatistics = Field(..., description="统计信息")
message: Optional[str] = Field(None, description="附加消息")
# ==================== 关系演变 ====================
class RelationshipEvolutionData(BaseModel):
"""关系演变数据"""
emotion: Any = Field(None, description="情绪数据")
interaction: Any = Field(None, description="交互频率数据")