4.5 KiB
4.5 KiB
任务: blog-app AI Agent 升级迭代日报 v2 — B2 (LLM 集成) + B3 (Flask /watchdog + cron)
你在 /home/yi/opencode-blog-showcase/blog-app 工作。B1 已完成: scripts/daily_watchdog.py (抓取 6 个 AI agent 项目的 GitHub Releases/commits/npm/releases.atom/Exa web search, 渲染 markdown 报告, 存 SQLite ~/opencode-blog-showcase/data/watchdog.db + 写 ~/opencode-blog-showcase/logs/daily-agent-watchdog-YYYY-MM-DD.md)。现在做 B2 和 B3。
B2: LLM 集成 — 只改 scripts/daily_watchdog.py 里的 summarize_with_llm 函数体
不要重写整个文件! 只替换 summarize_with_llm 的函数体 (文件顶部有 LLM-INTEGRATION-POINT 注释)。
要求:
- POST http://127.0.0.1:4000/v1/chat/completions, model="analysis", 无 auth, timeout=300
- 用 requests (已有 import), 不加任何新 pip 依赖
- prompt 中文, 输入是 collected_data dict (github_release/github_commits/npm/atom/exa_results), 先截断: release body ≤500 字符, 其余字段各 ≤300 字符, 总 prompt 数据部分 <12KB
- 让 LLM 返回 JSON: {"summary_zh": "不少于50字的中文摘要,2-3句", "breaking": true/false, "breaking_reason": "...", "relevance_note": "对本地已装用户的意义,1-2句"}
- 健壮解析: 从响应 content 中提取 JSON (容忍 ```json 围栏 / 前后杂文本, 用 regex 找第一个 { 到最后一个 })
- LLM 调用失败或解析失败时不崩管道: log.error 并返回 {"summary_zh": "(LLM 分析失败: <原因>)", "breaking": None, "breaking_reason": "LLM 分析失败", "relevance_note": ""}
- 保持函数签名 summarize_with_llm(project_key: str, collected_data: dict) -> dict 不变
B3: Flask /watchdog 路由 + 模板 + cron
- app.py 加路由 (风格跟现有路由一致, 看 app.py 里现有 page_* 函数):
- GET /watchdog: 从 ~/opencode-blog-showcase/data/watchdog.db 的 reports 表 (date/markdown/meta_json/created_at) 查最近 7 天, 渲染 templates/watchdog.html。若 db 不存在或无记录, 显示空态提示 + 手动触发按钮, 不要 500
- POST /watchdog/run: subprocess 后台触发 /usr/bin/python3 /home/yi/opencode-blog-showcase/blog-app/scripts/daily_watchdog.py (env 里 HOME=/home/yi, stdout 追加到 ~/opencode-blog-showcase/logs/daily-watchdog-run.log), 然后 redirect 回 /watchdog 并带 "已触发" 提示。防止重复触发: 若已有 daily_watchdog.py 进程在跑则直接提示
- templates/watchdog.html: 继承 base.html (看现有模板怎么继承), 列出最近 7 天报告。markdown 渲染: 无新 pip 依赖, 用
保留原格式或写个极简的标题/加粗/链接转换都行, 优先简单可靠。含 "立即运行" 按钮 (POST /watchdog/run)
- base.html 导航加 "Watchdog" 链接 (看现有导航项风格)
- cron: 用 crontab 加一行 (本机时区 Asia/Shanghai): 每天 9:00 跑 0 9 * * * /usr/bin/python3 /home/yi/opencode-blog-showcase/blog-app/scripts/daily_watchdog.py >> /home/yi/opencode-blog-showcase/logs/daily-watchdog-cron.log 2>&1 注意: 追加到现有 crontab, 绝不可覆盖已有条目 (先 crontab -l 备份到 workspace ./.review-tmp/crontab.bak)
验证 (必须真跑, 输出贴进总结)
- export HOME=/home/yi && /usr/bin/python3 scripts/daily_watchdog.py — 完整跑一遍 (Exa + 6 项目 + LLM 分析, 可能要几分钟, 耐心等), 退出码 0
- 检查生成的 ~/opencode-blog-showcase/logs/daily-agent-watchdog-2026-08-16.md: 每个 ★ 项目有真实中文摘要 (不是 "(待 LLM 集成)"), Breaking Changes 有实质内容
- bash scripts/deploy.sh 重启 Flask, 然后:
- curl -sS http://127.0.0.1:8090/watchdog | head -50 (含报告内容)
- curl -sS -X POST http://127.0.0.1:8090/watchdog/run (触发逻辑正常, 重复触发被拒)
- curl -sS http://192.168.2.25:8090/watchdog (LAN 可访问)
- crontab -l 确认新条目存在且旧条目完好
- 回归: curl 旧页面 / /projects /analyze 确认没破
硬约束 (越界 = 失败)
- 禁改 litellm 配置 / 禁 restart litellm-proxy / llama-server
- 禁改 projects.db schema, 禁改 scripts/fetch_data.py
- 禁重写 daily_watchdog.py 的抓取/渲染部分 — 只动 summarize_with_llm 函数体
- 无新 pip 依赖 (Flask + requests + sqlite3 + 标准库)
- 禁改 ~/.omo/omo.jsonc, 禁碰 ~/.local/lib/node_modules/oh-my-openagent/
- 临时文件一律放 workspace 内 ./.review-tmp/ (你没有 /tmp 写权限)
- 不要 mock 数据, 不要预生成报告内容
输出
最后总结: B2 改了什么 / B3 加了什么 / 每条验证命令的真实输出 (截关键行) / 遇到的问题。