收到一封活动邀请,报名经常还要绕好几步:看看适不适合自己,找资料,打开表单,再把填过很多次的内容填一遍。Coworkmaster 仓库里的 Opportunity Autopilot,就从这段小流程做了一个 Agent 原型。
它面向 Agents, Everywhere 黑客松,以 API 后端为主,Slack 是预定的对话入口,同时留了本机控制台。没有外部账号时,也能用种子邮件把“机会判断、表单准备、检查提交”演示完整。两个名字对应同一个项目,README 使用 Opportunity Autopilot。
1. 邮件分类与表单准备
后端提供个人资料、邮箱、机会分类、表单准备、审批和反馈接口。控制台能编辑资料、看邮件、扫描机会、准备表单和检查结果。每一步先留下结果,再进入下一步,方便看出问题发生在哪。

例如,邮件分类正确但表单缺少资料时,可以单独检查字段映射和个人资料。邮箱与表单使用各自的适配器,便于替换。
2. Slack 和本机控制台共用一套后端
2.1 无凭据演示与规则分类
未配置邮箱时使用种子邮件。配置 DeepSeek Key 后调用模型;未配置 Key 或请求失败时,使用确定性规则分类。
同样,没有 Slack 凭据时适配器在 mock 模式,有配置后可以使用 Socket Mode。它调用同一套 HTTP API,提供资料、扫描、收件箱和审批入口,业务状态仍放在后端。具体见Slack 接口说明。
| 入口或服务 | 原型中的作用 |
|---|---|
| 本机控制台 | 直接操作资料、邮箱、机会和表单,便于联调 |
| Slack 适配器 | 把聊天命令和审批交互接到同一 API |
| 规则分类 | 无模型凭据时维持可重复演示 |
| 真实邮箱 | 单独配置 IMAP/SMTP,保存前测试连接 |
2.2 真实邮箱连接与配置
IMAP/SMTP 在保存前检查连接,状态接口不返回密码,账号配置保存在被 Git 忽略的本地数据目录。当前版本使用单账号本地配置。
3. 报名沙盒的状态流转
沙盒分登录、资料、完成等页面。先创建演示会话,打开返回的 displayUrl;Agent 调用登录和资料填充接口,浏览器轮询同一会话,再切换页面并显示字段。
资料填充由后端接口完成,下面是DemoStore.fillProfile()的源码摘录:
fillProfile(id: string, input: Partial<DemoProfile>) {
const session = this.require(id);
const profile = { ...(session.profile ?? {}), ...input } as DemoProfile;
const missing = requiredFields.filter((field) => !String(profile[field] ?? "").trim());
if (missing.length) return { session: this.touch(session), missing };
session.profile = profile;
session.stage = "PROFILE_FILLED";
return { session: this.touch(session), missing: [] as string[] };
}
它把新字段合进已有资料,检查必填项。缺项时返回缺失字段;齐了才把状态推进到 PROFILE_FILLED。因此展示页能知道现在是在等资料,还是已经可以让人检查。
- 创建演示会话,得到会话身份与展示页地址。
- 调用登录、填资料接口,浏览器显示当前状态。
- 用户核对表单,点击提交按钮。
- 沙盒进入完成页,展示确定性的演示登记编号。
提交由用户点击触发,完成页显示的是沙盒演示编号。完整演示命令在固定版本 README中。
4. 真实网站适配与生产限制
目前的表单适配器负责准备字段,浏览器演示运行在项目沙盒中。接入外部活动网站还需要适配各站字段、登录流程和反自动化处理。
生产环境还需要补账号隔离、凭据保存、真实站点适配和失败恢复。

Comments NOTHING