Roog's BLOG & TOOLS

[系统已在线] :: 2026-01-30 16:10:21 :: 终端 v1.0

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: