总览
1. 一句话定位
Khoj = “对话即可创建的定时 AI 研究助理”。 不是流程编排(AP/n8n),不是 chatbot 平台(Dify/Coze),也不是个人 IM 助手(OpenClaw);它专做”按时跑 + AI 自主决定怎么跑 + 把结果推给你”。
2. 顶层架构
flowchart TD User[用户] -->|"对话:每天9点做X"| Chat[Khoj Chat 接口] Chat -->|crontime_prompt| LLM[LLM 解析] LLM -->|cron + query + subject| Sched[APScheduler] Sched -->|到点触发| Exec[scheduled_chat 执行器] Exec -->|内部 HTTP 自调用| Chat2[Khoj Chat 接口] Chat2 -->|11 个工具自由调度| Tools[工具层] Tools --> Out[AI 输出] Out -->|should_notify 判断| Notify{值得通知?} Notify -->|是| Email[邮件/WhatsApp/Phone] Notify -->|否| Skip[静默跳过]
要点:
- “创建任务”和”执行任务”都走同一条 Chat 链路,区别是
/automated_task前缀触发自动化分支 - 调度器是 APScheduler(生产级 Python 调度框架,非系统 cron)
- “结果是否值得发”由 LLM 二次判断,避免每次都骚扰你
3. 内置 11 个工具(AI 自主调度)
| 工具枚举 | 中文职责 |
|---|---|
Online / SearchWeb | 互联网搜索 |
Webpage / ReadWebpage | 抓取指定 URL 正文 |
Research | 多轮迭代深度研究 |
Notes | 读个人知识库(Notion / 上传文档 / Obsidian) |
Code / PythonCoder | 跑 Python 处理数据、做计算、出图 |
Operator / OperateComputer | 操作浏览器(截图、填表、点按钮) |
Image | 文生图 |
Diagram | 出流程图/示意图 |
ViewFile / ListFiles / RegexSearchFiles / SemanticSearchFiles | 文件查/搜 |
源码出处:src/khoj/utils/helpers.py:415 class ConversationCommand(str, Enum)。
任务到点执行时,AI 会根据任务内容自主决定调用哪些工具——这正是”按需自动采集”的本意。
4. 与同类工具差异
| 维度 | Khoj | ActivePieces | OpenClaw | Dify |
|---|---|---|---|---|
| 对话创建采集任务 | 🌟🌟🌟 主场 | ❌ 手工配 trigger | ⚠️ chat 而非任务 | ⚠️ App Generator 偏 chatbot |
| AI 自主决策怎么查 | 🌟🌟🌟 11 工具自由调 | ❌ 死板执行步骤 | 🌟🌟 agent 形态 | 🌟 LLM Chain |
| 触发:定时 | ✅ APScheduler,最细到小时 | ✅ Schedule trigger,分钟级 | ✅ croner 模块 | ✅ 1.x 有 schedule trigger |
| 触发:外部 webhook | ❌ | 🌟🌟🌟 主场 | ⚠️ Gateway HTTP | ✅ |
| 数据来源:网络 | ✅✅ Online + Webpage + Operator | ⚠️ piece-fetch | ✅ extension/browser | ✅ web search 节点 |
| 数据来源:邮箱(IMAP) | ❌ 不在能力图里 | ✅✅ piece-imap | ❌ | ⚠️ |
| 数据来源:Notion | ✅ 原生 | ✅ piece-notion | ✅ | ✅ |
| 推送:邮件 | ✅✅ 原生 send_task_email | ✅ piece-smtp | ❌ | ⚠️ |
| 推送:国内 IM | ❌ | ⚠️ webhook + HTTP piece | ✅✅ feishu/wechat/qq | ⚠️ |
| 推送:WhatsApp | ✅ Twilio | ✅ piece-twilio | ✅ | — |
5. 关键限制(避免选错场景)
5.1 触发粒度限制
# api_automation.py:91
if not minute_value.isdigit():
return Response("Minute level recurrence is unsupported", status_code=400)意思是 cron 分钟字段必须是固定数字(如 0 9 * * * 可以,*/5 * * * * 不可以)。最细粒度是小时,不能做”每 5 分钟轮询”。
5.2 同任务 6 小时去重
# helpers.scheduled_chat
if (now - last_run_time) < 6 hours: skip同一任务两次执行间隔必须 ≥ 6 小时,防多线程重复跑。这对”每天/每周”完全够;想做”每小时”在 Khoj 行不通。
5.3 不能消费”事件”
Khoj 是主动拉取型——定时去查、去搜、去读。不是事件驱动型——没法监听外部 webhook、没法收一封新邮件就触发。事件触发场景请用 AP。
5.4 推送渠道相对单薄
原生只有邮件 + WhatsApp + Phone。要推飞书/钉钉/企业微信群,要么走 webhook 自己接,要么让 Khoj 推到一个”中转邮箱”由 AP 中继。
6. 适合 Khoj 的典型场景
- 每天定时搜某主题、AI 总结成中文简报、邮件给我
- 每天读 Notion 里某 tag 的笔记、AI 整理待办、邮件提醒
- 每周抓 GitHub Trending / Hugging Face 新模型 / arXiv 新论文,按主题筛后简报
- 每天用 Operator 打开网页填表查数据并截图记录
7. 不适合 Khoj 的场景
- 读 Gmail/QQ 邮箱新邮件后总结推送 → 用 ActivePieces piece-imap
- 接外部 SaaS webhook 触发链路 → 用 ActivePieces
- 实时事件流(IoT 上行、监控告警)→ 用 ActivePieces 或自写脚本
- 推送到飞书/微信/企业微信群(无中继)→ 用 OpenClaw 或 AP webhook