本文引用的文件
本指南围绕使用 grammY conversations 插件构建复杂多步骤对话流程展开,结合项目现有实现,系统讲解:
该项目采用按功能模块组织的目录结构,对话扩展集中在 command 子系统中,配合 Cloudflare Workers 的 KV 命名空间实现状态持久化与会话管理。
graph TB
A["入口: src/index.ts"] --> B["命令注册: src/command/index.ts"]
B --> C["对话: login.ts"]
B --> D["命令处理器: events.ts / history.ts / cancel.ts / bookEvent.ts / start.ts"]
D --> E["客户端: src/client/cosmoe.ts"]
B --> F["KV 持久化: COSMOE_STORAGE / COSMOE_CREDENTIALS"]
图表来源
章节来源
章节来源
grammY conversations 在本项目中的工作流如下:
对话状态持久化到 KV,会话生命周期由插件管理
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant P as "conversations 插件"
participant S as "KV 存储(COSMOE_STORAGE)"
participant H as "对话处理器(login.ts)"
U->>B : "/login"
B->>P : 进入命名对话 "login"
P->>S : 读取对话状态(若存在)
P->>H : 执行对话处理器
H->>U : 发送提示(用户名/密码)
U->>H : 回复用户名/密码
H->>H : 校验/调用 API
H->>S : 写入对话状态/凭证
H-->>U : 返回结果
P-->>B : 结束对话
图表来源
章节来源
命名对话:bot.use(createConversation(handler, "login"))
flowchart TD
Start(["初始化"]) --> KV["创建 KvAdapter(COSMOE_STORAGE)"]
KV --> Storage["封装 KV 存储(read/write/delete)"]
Storage --> Plugin["安装 conversations 插件"]
Plugin --> Conv["注册命名对话: login"]
Conv --> End(["完成"])
图表来源
章节来源
数据持久化:KV 存储自动保存对话状态,重启/并发仍可恢复
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant C as "Conversation"
participant H as "handleInteractiveLogin"
U->>B : "/login"
B->>C : enter("login")
C->>H : 开始对话
H->>U : 提示输入用户名
U->>H : 回复用户名
H->>U : 提示输入密码
U->>H : 回复密码
H->>H : 认证/存储凭证
H-->>U : 返回结果
C-->>B : 结束对话
图表来源
章节来源
章节来源
章节来源
目标:在现有登录基础上,扩展一个“预约事件”的多步骤对话,包含以下步骤:
实现要点:
通过回调查询获取最终确认,再调用 CosmoeClient.bookEvent 完成下单
flowchart TD
A["进入对话: book-event"] --> B["展示活动列表"]
B --> C["等待用户选择活动"]
C --> D["获取活动详情并排序时间槽"]
D --> E["等待用户选择时间段"]
E --> F{"是否有多张可用优惠券?"}
F -- 是 --> G["展示优惠券选择键盘"]
G --> H["等待用户选择优惠券"]
H --> I["确认订单并调用 bookEvent"]
F -- 否 --> I
I --> J["返回下单结果"]
J --> K["结束对话"]
图表来源
章节来源
章节来源
章节来源
业务模块:CosmoeClient 封装 API 调用,命令处理器负责业务逻辑
graph LR
Pkg["package.json 依赖"] --> G["grammy"]
Pkg --> GC["@grammyjs/conversations"]
Pkg --> GS["@grammyjs/storage-cloudflare"]
Cmd["命令注册: command/index.ts"] --> GC
Cmd --> GS
Login["对话: login.ts"] --> GC
Client["客户端: cosmoe.ts"] --> Api["外部 API"]
图表来源
章节来源
章节来源
本项目基于 grammY conversations 与 Cloudflare KV,实现了可靠的多步骤对话流程与状态持久化。通过规范的对话状态设计、输入校验与错误处理,可以平滑扩展更多复杂交互场景。建议在新增对话时遵循“状态最小化、可恢复、可扩展”的原则,并结合 KV 的特性优化性能与可靠性。
章节来源