ARS 第一版草稿设计(II)ChatSession
💬 Chat Session - 会话管理
Chat Session 的本意是一次完整的对话上下文,由于这个系统需要维持多套的上下文存在所以必须有实体ID。
同时 session 中不可能仅包含一次对话,我们需要进一步拆分成同一个 session 中的多个 message。 Message 是事实(source of truth),Session 是投影(projection / cache)。 这样遇到“双写不一致”时才有可依赖的裁决标准。 结构上,差不多是这么个样子
classDiagram
direction LR
class ChatSession {
🔑 +Uuid session_id
📝 +String session_name
📊 +SessionStatus status
⏰ +DateTime created_at
🔄 +DateTime updated_at
🔢 +Long last_seq "最后消息序号 SSE续传"
}
class Message {
💬 +Uuid message_id
🔗 +Uuid session_id
👤 +MessageRole role "发言者"
📋 +MessageType type "消息类型"
📄 +String content "文本内容"
⏰ +DateTime created_at
🔢 +Long seq "会话内序号,由last_seq+1得到"
📦 +Json payload "结构化数据"
↩️ +Uuid reply_to "回复关联"
🔐 +String dedupe_key "幂等键"
}
class SessionStatus {
💤 IDLE "空闲: 等待用户输入"
⏳ AWAITING_USER "等待用户回复"
🏃 RUNNING "执行中: Agent运行中"
🗄️ CLOSED "关闭: 归档状态"
}
class MessageRole {
👤 USER "用户"
🤖 AGENT "Agent"
🛠️ TOOL "工具"
⚙️ SYSTEM "系统"
}
class MessageType {
💭 user.prompt "用户输入指令"
💬 agent.message "Agent回复消息"
🤔 agent.thinking "Agent思考过程"
❓ agent.question "Agent向用户提问"
🔧 tool.request "工具调用请求"
✅ tool.result "工具执行结果"
📊 run.status "运行状态变更"
🏃♀️ run.id
⚠️ error "错误事件"
}
ChatSession "1" o-- "*" Message
MessageRole -- Message
MessageType -- Message
SessionStatus -- ChatSession
值得注意以下几点:
- 这里存在Session和Message里的两个状态,一定要竭尽可能的避免双写不一致的问题
- 有些消息里可能根本没有content或者payload 需要nullable
- payload在遇到tool调用的时候,可能要保留一个tool_call_id一类的字段,用于留存事件源
- thinging 可能不存在,很多模型压根不会输出thinging内容出来。
classDiagram
class ChatService {
+ CreateSession(session)
+ AppendMessages(batch)
+ ListSessions(filter)
+ GetSession(session_id)
+ DeleteSession(session_id)
+ UpsertSessionName(name)
+ CreateMessage(message)
+ ListMessages(filter,offset,limit)
+ ListMessagesBySeq(session_id, after_seq, limit)
+ GetMessage(message_id)
}
Tags: