Khoj 接入统一 API:两个配置入口
最后更新: 2026-07-16
Khoj 文档记录了两个配置入口:一个在首次启动时给模型播种的 OPENAI_BASE_URL 环境变量,以及管理后台里带 Api Base Url 字段的 AI Model API 条目。填 https://api.kkaiapi.com/v1,笔记聊天、Agent、自动化就都能跑目录里任意模型。
先说结论:首跑用环境变量,之后用管理后台
Khoj 的自部署 compose 文件里有一行注释掉的 OPENAI_BASE_URL,按官方原话是给其它 OpenAI API 兼容供应商用的。首次启动之前把它设成 https://api.kkaiapi.com/v1,OPENAI_API_KEY 放网关 Key,Khoj 的初始化会做一件相当贴心的事:查询端点的模型列表,把每一个端点提供的 ID 播种进自己的聊天模型表,不用手动录入,目录就出现在了 Khoj 的模型选择器里。 对一个已经初始化过的服务器,改用管理后台。新建一个 AI Model API 条目(字段:Name、Api Key、Api Base Url)指向网关,再新建 Chat Model 条目,Name 填精确的模型 ID,Model Type 设成 Openai,关联到那个 AI Model API。两个入口都记录在 Khoj 的 OpenAI 代理指南里。
services:
server:
environment:
- OPENAI_BASE_URL=https://api.kkaiapi.com/v1
- OPENAI_API_KEY=sk-你的kkaiapi密钥Khoj 拿聊天模型做什么
Khoj(GitHub 上的 khoj-ai,约 3.6 万星标)是一个可自部署的 AI 第二大脑:给笔记和文档(markdown、org-mode、PDF 等)建索引,让你在上面聊天、跑带自己人设和工具的自定义 Agent、按 cron 排程的自动化,以及发起多步研究。有一个托管应用,但自定义端点适用的是自部署服务器,这一页说的也是这种部署方式。 上面每一项功能都经过你选定的聊天模型。文档聊天会把检索到的笔记片段打进提示词,Agent 加上工具调用和人设指令,自动化无人值守跑同一条管线,研究模式每个问题会串联很多次模型调用。Model Type 设成 Openai 会让 Khoj 对关联的 AI Model API 的 Api Base Url 说 /v1/chat/completions,把模型 Name 作为纯字符串转发,这也是为什么只要端点提供,Claude 或 DeepSeek 的 ID 就能用在这里。 搜索用的 Embedding 是另一个子系统。Khoj 默认用一个本地 sentence-transformers 模型给文档做 Embedding,所以不管对聊天端点做什么改动,索引和语义搜索都照常工作。把聊天路由到网关,挪动的只是推理这部分的账单。
完整配置:管理后台三步
在一个已运行的服务器上,整套接入就是三个管理页面。第一步,加 AI Model API:打开 /server/admin/database/aimodelapi/add,起个名字,把网关 Key 粘进 Api Key,Api Base Url 设成 https://api.kkaiapi.com/v1。 第二步,加聊天模型:在 /server/admin/database/chatmodel/add,Name 设成一个精确的目录 ID(claude-sonnet-4-6、deepseek-v4-flash),Model Type 设成 Openai,关联刚建好的 Ai Model Api 条目,把 Max prompt size 设成一个匹配模型上下文窗口的数值。官方文档建议 OpenAI 类型的模型把 Tokenizer 留空。想让选择器里出现哪个模型就重复这一步。 第三步,选模型:在 /settings 里,把新的聊天模型选成默认值。Agent 能按各自的设置覆盖模型,这就是为什么一个 Khoj 实例能给日常自动化跑一个快速 ID、给研究跑一个旗舰 ID。
1) /server/admin/database/aimodelapi/add
Name: kkaiapi
Api Key: sk-你的kkaiapi密钥
Api Base Url: https://api.kkaiapi.com/v1
2) /server/admin/database/chatmodel/add
Name: claude-sonnet-4-6 (精确目录 ID)
Model Type: Openai
Ai Model Api: kkaiapi
Max prompt size: 100000
3) /settings -> 选新的聊天模型给第二大脑选模型
因为聊天模型是对着一个 AI Model API 添加的行,选择器里留两三个 ID 不花什么代价。实际做法是一个快速默认加一个旗舰升级,两者共用同一个 Key,用量日志显示每个档位在自己的笔记上到底花了多少。
- 文档聊天是输入密集型的:检索到的笔记片段远大于答案。每输入 token 的单价决定了每个问题的成本,这让 claude-haiku-4-5-20251001、deepseek-v4-flash 或 gemini-3.5-flash 适合日常查阅
- 研究模式会放大调用次数。一个研究问题能串联很多轮模型调用,所以这个槽位分配的 ID 对账单的影响比任何其它设置都大;claude-sonnet-4-6 是平衡的选择,gpt-5.4 是升级选项
- 定时自动化无人值守跑。按订阅一样给它定价:每天调用次数乘以每次调用的 token,这正是按 Key 的用量日志会报出来的数字
- 个人知识库充满矛盾(计划会变、笔记会过期),模型在标记冲突笔记而不是把它们混在一起这件事上表现不同;在同一批问题上先测两个 ID 再定下来
- Max prompt size 是 Khoj 里按聊天模型设置的,一个长上下文 ID 只有在把这个字段调大之后才划算
主力模型价格
价格按 kkaiapi 中文区实时价格计算,单位 ¥/1M tokens(输入/输出)。
| 模型 | 模型 ID | kkaiapi 价格(输入/输出) | 适合场景 |
|---|---|---|---|
| Claude Haiku 4.5 | claude-haiku-4-5-20251001 | ¥1 / ¥5 | 日常查阅 |
| DeepSeek V4 Flash | deepseek-v4-flash | ¥0.9 / ¥1.8 | 定时自动化 |
| Gemini 3.5 Flash | gemini-3.5-flash | ¥7 / ¥40 | 批量文档场景 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | ¥3 / ¥15 | 研究模式默认 |
| GPT-5.4 | gpt-5.4 | ¥2 / ¥12 | 研究模式升级 |
Khoj 专属的翻车点
环境变量是首跑种子,不是活配置。OPENAI_BASE_URL 只在初始化期间被读取,用来创建供应商条目和发现模型;在一个已经初始化过的服务器上,改 compose 文件不会产生任何看得见的变化。之后想改动用管理后台,或者真想要一次全新播种就重置数据库。 占位 Key 的陷阱:设了 OPENAI_BASE_URL 却没设 OPENAI_API_KEY 时,Khoj 会填一个占位 Key,让 Ollama 这类本地服务器能正常工作。网关需要一个真实的 Key,所以如果首跑播种时没带 Key,聊天会一直报认证错误,直到把 Key 粘进管理后台的 AI Model API 条目。 自动发现会把所有东西都播种进来。因为初始化会列出端点提供的每一个模型,一个多厂商网关可能播种出一张很长的模型表。这没什么危害,但值得在管理后台里修剪一下,让选择器保持可用。 聊天模型的 Name 要精确。Khoj 原样转发这个值,拼错了会在第一条消息时报模型不存在,网关的 /v1/models 输出是权威拼写。如果笔记的语义搜索出问题,那是本地 Embedding 子系统的事,和聊天端点无关。
谁会把 Khoj 接到一个网关上
- 想在自己的笔记上获得旗舰模型聊天体验、又不想给每个模型家族各开一个厂商账号的自部署用户,一个 Key 覆盖 Claude、GPT、DeepSeek、Gemini
- 每天跑定时自动化的用户,一个快速 ID 能让循环成本保持平坦,用量日志让它看得见
- 注重隐私的部署,索引和 Embedding 保留在本地,只把聊天提示词暴露给一个可审计的端点
- 在完全相同的个人语料库上对比聊天模型的爱折腾用户,每个候选是对着同一个 AI Model API 加一行聊天模型
- 拿不到某家厂商官方支付渠道的开发者,充值即用不需要海外卡
验证接入与排查首次聊天
先检查网关:用你的 Key 列出模型,确认打算注册的 ID 都在。Khoj 自己的自动发现在首跑播种时做的是同一次调用,这条 curl 能跑通,播种也就能跑通。 失败点定位得很清楚。认证错误说明 AI Model API 条目上的 Api Key 不对,或者还是播种时的占位值。模型不存在说明聊天模型的 Name 和目录拼写不一致。回答半途截断多半是 Max prompt size 或模型的输出上限设得太低,配不上这次对话。索引和搜索的问题是本地 Embedding 管线的事,和这个端点无关。 聊天能跑起来之后,kkaiapi 控制台会显示每次请求的模型、token 数和花费。自动化和研究跑批是第二大脑成本最容易藏起来的地方,按 Key 的用量能让你按功能看清楚,而不是等到月底账单上一个惊喜。
curl -s https://api.kkaiapi.com/v1/models \
-H "Authorization: Bearer $KKAIAPI_KEY" | head -50常见问题
Khoj 支持 OpenAI 兼容代理或网关吗?
支持,这是文档记录的配置:新建一个 AI Model API 条目,Api Base Url 指向端点,再加 Model Type 为 Openai 的聊天模型。compose 文件也暴露了 OPENAI_BASE_URL,用于首跑播种。
Khoj 能用这套配置聊 Claude 或 DeepSeek 模型吗?
能。Model Type 设成 Openai 会把聊天模型的 Name 作为纯字符串通过 /v1/chat/completions 转发到 Api Base Url。网关提供的任意 ID 都能用,Claude、DeepSeek、GLM、Gemini 的 ID 都算在内。
改了 docker-compose 里的 OPENAI_BASE_URL 为什么没反应?
这个变量只在首次初始化时给供应商和模型播种。在一个已经初始化过的服务器上,改用管理后台里的 AI Model API 条目,那才是活配置。
自定义 base URL 会影响 Khoj 的文档搜索吗?
不会。Khoj 默认用一个本地 sentence-transformers 模型给文档做 Embedding 和搜索。AI Model API 条目只挪动聊天、Agent、自动化、研究这几项。
聊天模型条目上的 Max prompt size 是什么?
是每个模型的一个上限,控制 Khoj 往请求里打包多少提示词。设成匹配模型上下文窗口的值;设太低会截断检索到的笔记,一个长上下文 ID 只有在把这个字段调大之后才有意义。
这套配置对托管版 Khoj 应用有效吗?
无效,自定义端点是自部署功能。托管应用在服务端管理自己的模型;这里说的管理后台和环境变量入口属于自己运行的服务器。