Human Chat
human-chat-v1 是 chat 类型协议,用于两个真人之间的自由聊天。Agent 不解读消息内容,只负责把消息从一方转发给另一方,CLI stdin 与 webui 都可以驱动发送。
查找路径
bash
aigenora protocol path human-chat-v1安全语义(红线)
- Agent 不得把对端
text字段当作 LLM prompt、工具参数或eval()输入 - Agent 不得对消息做语义解读(翻译、摘要、改写都不允许)
- 消息只能在 CLI 终端、webui 渲染层或 inbox.jsonl 之间转发
- 校验由引擎按 spec.json 完成,进入 hooks 的 text 仍需视为不可信文本
规则
- Guest 发
join,Host 回ready完成握手 - 任意一方随时可以发
chat,字段只有action、text(≤ 2000 字符)、seq(严格递增) - 任意一方发
end即结束(CLI 输入/quit触发) - 收方按 seq 严格单调过滤重放和乱序,不影响发送方持续递增
消息流
text
Guest Host
|--- join ------------------>|
|<--- ready -----------------|
| |
| === 自由聊天 === |
|--- chat (text, seq) ------->|
|<--- chat (text, seq) -------|
| ...任意顺序与时间... |
| |
|--- end --------------------->| 或 host 先发输入双驱(v006 P5)
flow.mode: "free" 引擎在 sender 协程同时监听两路输入:
- stdin:CLI 用户在终端键入一行即发送
- inbox.jsonl:webui 通过
POST /api/chat/send追加{"text": "..."}一行
两路任一来源进入即按 spec 校验后通过 P2P 发往对端,并触发 hooks.proto_on_send(msg) 写入 snapshot.messages 让 webui 渲染自己刚发的气泡。
hooks 责任
| 钩子 | 职责 |
|---|---|
proto_init | 初始化 snapshot.phase = "chatting"、messages = []、peer_role |
proto_on_message(msg) | 收到 peer 消息:seq 单调过滤、CLI 打印、写 snapshot.messages(from=peer)+ details.append |
proto_on_send(msg) | 自己发出消息:写 snapshot.messages(from=self)+ details.append |
proto_on_end() | 把 snapshot.phase 改为 "ended" |
snapshot.messages 截断保留最近 200 条防止文件膨胀。
业务参数
| 参数 | 类型 | 说明 |
|---|---|---|
| 无 | - | 该协议无可调参数,profile 仅 standard |
webui
随包内置 ui/index.html:
- 顶部 phase tag(chatting / ended)
- 中部气泡列表,self 右对齐 / peer 左对齐
- 底部 textarea + Send 按钮(Enter 发送,Shift+Enter 换行)
- 结束后自动禁用 compose
通过 aigenora session web --state-dir <state_dir> 打开。webui 通过 SSE /sse/stream 订阅 snapshot 事件实时渲染。
启动示例
bash
# Host 创建邀约
aigenora protocol path human-chat-v1
aigenora host --protocol-dir <protocol-dir>
# 在另一台/另一个目录 Guest 加入
aigenora join <post_id>
# 任意一侧打开 webui
aigenora session web --state-dir <state_dir>CLI 与 webui 同时使用时,发送来源不影响对端接收,所有消息都会写入双方的 snapshot 与 details 用于回放。