任务规划代理

一个结合Cloudflare Worker和Next.js 16的任务规划代理,通过Workers AI和Todoist MCP实现任务规划与同步。

  • by BillDuke13
  • TypeScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 BillDuke13/cf-todoist-daily-agent

使用说明

Todoist每日代理

Cloudflare Worker+Next.js 16参考实现,计划重点 使用Workers AI的一天,将中间事件流式传输到浏览器,以及 通过官方的模型上下文将生成的任务同步到Todoist中 协议(MCP)流式HTTP端点。在Apache 2.0下分发 许可证(见 许可证).

您在寻找产品概述吗? 打开 docs/index.html 在浏览器中进行人性化的漫游。技术参考 住在 docs/PLAN_PIPELINE.md 和 openapi/plan.yaml.

架构概述

  • 前端:React 19应用路由器页面(src/app/page.tsx)捕捉 一个自然语言提示,从中流式传输NDJSON事件 /plan,以及 可选择录制流过的简短语音提示 /api/transcribe.
  • 规划管道: /plan 验证请求,运行intent 分类(@cf/openai/gpt-oss-120b,推理努力 high) 随后是针对特定场景的规划(@cf/openai/gpt-oss-20b, 推理努力 medium),动态发现Todoist项目/标签, 并将每个阶段作为换行符分隔的JSON进行流式传输。详细信息在 docs/PLAN_PIPELINE.md.
  • Todoist MCP集成:用途 StreamableHTTPClientTransport 到 连接到 https://ai.todoist.net/mcp,列出所有元数据/工具 服务器公开(传统或官方别名),并调用 add-task(s) 随着 两者 projectId 和 project_id 字段加上标准化优先级 (数字 1-4 或 p1…p4 取决于所使用的变体的标志)。
  • 语音转录: /api/transcribe base64 WebM/Opus音频代理 到 @cf/openai/whisper-large-v3-turbo,强制执行8MB的解码上限,因此 前端可以覆盖提示并立即提交 /plan.
  • 认证:HTTP基本身份验证 src/proxy.ts (Next.js 16的继承者 middleware.ts)使用Web加密SHA-256常数时间比较 src/lib/auth.ts.

特性

  • 意识到意图的规划: single_reminder, multi_step_plan, recipe_plan,以及 general_plan 模板强制执行任务计数, 依赖关系和语气。
  • 元数据驱动的提示:通过MCP获取的Todoist项目/标签 注入AI提示并通过 debug.metadata 事件 因此,任务很少退回到“收件箱”。
  • 优先级标准化:自然语言提示,如 P0, P1, 优先级 2,或“高优先级”映射到Todoist REST优先级编号 (4 = P1, 1 = P4).接收批量MCP工具 p1…p4 取而代之的是字符串。
  • 流媒体用户体验: /plan 回复与 application/x-ndjson 事件 (status, ai.plan, todoist.task, final, error)因此UI可以 逐步显示进度和失败。
  • 语音优先流:浏览器媒体记录器→ /api/transcribe → 提示 一键提交,在权限或大小时有优雅的回退 限制失败。

先决条件

  • Node.js 20+
  • pnpm 9+
  • 牧马人CLI 4.45+
  • 启用Workers AI的Cloudflare帐户
  • Todoist账户+API代币获准用于MCP测试版 (https://ai.todoist.net/mcp)

配置

名称 描述
FRONTEND_ORIGIN 允许CORS和Basic Auth提示的浏览器来源。支持逗号分隔列表(例如。 https://staging.example.com,https://app.example.com).
TODOIST_MCP_URL MCP流式HTTP端点(默认 https://ai.todoist.net/mcp).
TODOIST_TOKEN Todoist MCP识别的承载令牌。
BASIC_AUTH_USER / BASIC_AUTH_PASS 由以下人员执行的凭据 src/proxy.ts 对于每个经过身份验证的路由(/plan, /api/transcribe,页面路由)。
DEBUG_EVENTS 何时 "true" 工人排放 debug.* NDJSON事件,并将截断的错误详细信息返回给客户端。默认为 "false" 在 wrangler.jsonc#vars.
AI 绑定 已配置 wrangler.jsonc 访问Workers AI

填充 .dev.vars 对于本地运行,然后在中镜像相同的名称 Cloudflare通过 wrangler secret put这些秘密的环境打字 住在 src/types/cloudflare-secrets.d.ts.

本地开发

pnpm install
pnpm dev          # Next.js dev server (no Worker bindings, no Workers AI)
pnpm lint         # ESLint flat config (Next 16 + TS strict)
pnpm test         # Vitest run (pure helpers in src/lib)
pnpm test:watch   # Vitest watch mode
pnpm preview      # OpenNext build + Wrangler preview (full integration)
wrangler dev      # Run the Worker locally at http://127.0.0.1:8787

流媒体请求示例:

curl -u "$BASIC_AUTH_USER:$BASIC_AUTH_PASS" \
     -N -H "Content-Type: application/json" \
     -H "Origin: $FRONTEND_ORIGIN" \
     -d '{"prompt":"Plan a mindful evening"}' \
     http://127.0.0.1:8787/plan

生成的类型

cloudflare-env.d.ts 由以下人员生产 wrangler types 从 wrangler.jsonc 并且是故意的 未承诺.打包脚本连线 pnpm cf-typegen 进入每个共同的入口点,所以很正常 pnpm install 后面跟着任何 pnpm dev, pnpm lint, pnpm test, pnpm build, pnpm preview,或 pnpm run deploy 为您实现文件:

触发器 挂钩
pnpm install postinstall
pnpm dev predev
pnpm lint prelint
pnpm test pretest
pnpm build prebuild
pnpm preview prepreview
pnpm run deploy predeploy

如果你绕过脚本——例如 pnpm install --ignore-scripts 在CI中 镜像,或跳过的Docker构建 devDependencies (所以 wrangler 是 缺席)-- cloudflare-env.d.ts 将丢失和 pnpm exec tsc --noEmit (没有包装)将表面精确 Property '<NAME>' does not exist on type 'CloudflareEnv' 错误。跑 pnpm cf-typegen 一次修复。不透明 TS2688: Cannot find type definition file 已经退休了,所以缺少类型 失败现在是可操作的。

对于Docker --prod 图像,要么保留 wrangler 期间可用 构建(so postinstall 成功)或通过 pnpm install --ignore-scripts 然后跑 pnpm cf-typegen 明确地处于一个阶段 wrangler.

部署

pnpm run deploy   # opennextjs-cloudflare build && opennextjs-cloudflare deploy

脚本生成 .open-next/worker.js,上传静态资产,以及 发布到Worker名称 wrangler.jsonc.

可观察性和调试

  1. 禁用净化功能以捕获Todoist有效载荷的尾日志:
    LOG_FILE=$(mktemp -t wrangler-tail).log
    WRANGLER_LOG_SANITIZE=false npx wrangler tail cf-todoist-daily-agent \
      --format json > "$LOG_FILE" 2>&1 &
    
  2. 集 DEBUG_EVENTS=true (当地 .dev.vars 或通过 wrangler secret put)因此NDJSON流浮出水面 debug.tools, debug.metadata, debug.inference,以及 debug.error 线。
  3. 触发 /plan 当尾巴在奔跑时。交叉引用:
    • [todoist.tools] --工人可以看到的每个MCP工具。
    • [todoist.debug.metadata] --第一个项目/标签(确认元数据 范围)。
    • [todoist.debug.call-args] --准确 add-task(s) 有效载荷(检查 project_id, priority, due*).
  4. 与Todoist活动日志进行比较,以确认已登录的任务 预期项目和优先级。

API摘要

  • OPTIONS /plan --CORS飞行前(204).
  • POST /plan --主计划器端点返回 application/x-ndjson (参见 openapi/plan.yaml).
  • OPTIONS /api/transcribe --CORS飞行前(204).
  • POST /api/transcribe --语音助手,返回 { text, language? } 或a 错误载荷。

OpenAPI文档定义了自动化和 客户生成。 debug.* 事件是故意的 不 部分 稳定的合同。

测试与验证

  • pnpm lint
  • pnpm test
  • pnpm exec tsc --noEmit
  • pnpm preview
  • wrangler dev --local 然后是上面的样本卷曲以进行验证 NDJSON流媒体和Todoist MCP连接。

许可证

根据 Apache许可证,版本2.0.