Files
MemoryBear/api/app/schemas/conversation_schema.py
Eternity c5dd09cf50 Feature/memory work (#61)
* refactor(conversation): separate service and repository layers for conversation module

- Split ConversationService and repository/UnitOfWork layers
- Service layer now only handles business logic and orchestration
- Repository layer handles all direct database operations
- UnitOfWork encapsulates transactional operations for messages
- Ensured all public methods have clear English docstrings with arguments, return values, and exceptions

* feat(memory): implement work memory endpoints and services

- Added API routes for conversation count, conversation list, messages, and detail.
- Integrated ConversationService for database queries and LLM-based summary generation.

* feat(memory): implement work memory endpoints and services

- Added API routes for conversation count, conversation list, messages, and detail.
- Integrated ConversationService for database queries and LLM-based summary generation.

* feat(workflow): fix issues causing workflow failures

if-else None value error
knowledge empty list rerank
end node output none node value
assigner input none value

* feat(memory): convert memory file creation time to timestamp and include title and first-line fields in file type

* fix(memory): fix serialization output and default value issues

* fix(workflow): fix issue with hybrid search logic in knowledge retrieval node
2026-01-08 18:48:29 +08:00

96 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""会话和消息相关的 Schema"""
import uuid
import datetime
from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field, ConfigDict, field_serializer
# ---------- Input Schemas ----------
class ConversationCreate(BaseModel):
"""创建会话请求"""
title: Optional[str] = Field(None, max_length=255, description="会话标题")
user_id: Optional[str] = Field(None, description="用户ID外部系统")
class MessageCreate(BaseModel):
"""创建消息请求"""
content: str = Field(..., description="消息内容")
variables: Optional[Dict[str, Any]] = Field(None, description="变量参数")
class ChatRequest(BaseModel):
"""聊天请求(基于 share_token"""
message: str = Field(..., description="用户消息")
conversation_id: Optional[uuid.UUID] = Field(None, description="会话ID多轮对话")
user_id: Optional[str] = Field(None, description="用户ID外部系统")
variables: Optional[Dict[str, Any]] = Field(None, description="变量参数")
stream: bool = Field(default=False, description="是否流式返回")
web_search: bool = Field(default=False, description="是否启用网络搜索")
memory: bool = Field(default=True, description="是否启用记忆功能")
# ---------- Output Schemas ----------
class Message(BaseModel):
"""消息输出"""
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
conversation_id: uuid.UUID
role: str
content: str
meta_data: Optional[Dict[str, Any]] = None
created_at: datetime.datetime
@field_serializer("created_at", when_used="json")
def _serialize_created_at(self, dt: datetime.datetime):
return int(dt.timestamp() * 1000) if dt else None
class Conversation(BaseModel):
"""会话输出"""
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
app_id: uuid.UUID
workspace_id: uuid.UUID
user_id: Optional[str] = None
title: Optional[str] = None
summary: Optional[str] = None
is_draft: bool
message_count: int
is_active: bool
created_at: datetime.datetime
updated_at: datetime.datetime
@field_serializer("created_at", when_used="json")
def _serialize_created_at(self, dt: datetime.datetime):
return int(dt.timestamp() * 1000) if dt else None
@field_serializer("updated_at", when_used="json")
def _serialize_updated_at(self, dt: datetime.datetime):
return int(dt.timestamp() * 1000) if dt else None
class ConversationWithMessages(Conversation):
"""会话详情(包含消息列表)"""
messages: List[Message] = []
class ChatResponse(BaseModel):
"""聊天响应(非流式)"""
conversation_id: uuid.UUID
message: str
usage: Optional[Dict[str, Any]] = None
elapsed_time: Optional[float] = None
# ---------- Conversation Summary Schemas ----------
class ConversationOut(BaseModel):
theme: str
theme_intro: str
summary: str
takeaways: list[str]
info_score: int