cj2api 实战:用 Cloudflare Worker 将 ChatJimmy 转换为 OpenAI 兼容 API
为什么需要 API 协议转换
当你同时使用多个 AI 模型时,最头疼的并非模型本身的能力差异,而是接口协议的割裂。ChatJimmy 有自己的 API 格式,但许多成熟的应用(如 Cursor、Lobe Chat)只认 OpenAI 的接口规范。
手动写适配层太麻烦,直接改代码又容易引入 Bug。cj2api 正是为解决这个矛盾而生——它在 Cloudflare Worker 层面完成协议转换,让 ChatJimmy 无缝接入任何 OpenAI 兼容客户端。
技术原理
cj2api 的架构极其简洁,核心逻辑运行在 Cloudflare Worker 的边缘节点上。
用户请求 (OpenAI 格式)
↓
Cloudflare Worker 边缘节点
↓ 协议转换
ChatJimmy API
↓
Worker 返回 OpenAI 兼容响应
当请求进入 Worker 后,框架做了两件事:
- 请求转换:将 OpenAI 格式的请求体(如
model、messages)重新组装为 ChatJimmy 所需的参数 - 响应转换:把 ChatJimmy 返回的数据流重新格式化为 OpenAI 的 SSE 格式
这种设计利用了 Cloudflare Worker 的全球边缘部署特性,请求会被路由到最近的节点,延迟更低。
部署指南
部署 cj2api 完全免费,Cloudflare Worker 有每天 10 万次的免费额度,足够个人或小团队使用。
确保已安装 Wrangler CLI:
npm install -g wrangler
然后按以下步骤操作:
# 克隆项目
git clone https://github.com/your-repo/cj2api.git
cd cj2api
# 配置环境变量
wrangler secret put CHATJIMMY_API_KEY
# 按提示输入你的 ChatJimmy API Key
# 部署到 Cloudflare
wrangler deploy
部署完成后,你会获得一个 *.workers.dev 的域名,将其填入客户端的 API Base URL 即可使用。
核心代码解析
cj2api 的核心在于请求/响应的双向转换:
// 请求转换:OpenAI → ChatJimmy
function convertRequest(openaiRequest) {
return {
model: openaiRequest.model,
messages: openaiRequest.messages,
stream: openaiRequest.stream ?? false,
temperature: openaiRequest.temperature ?? 0.7
};
}
// 响应转换:ChatJimmy → OpenAI SSE 格式
function formatSSE(data) {
return `data: ${JSON.stringify({
choices: [{
delta: { content: data.content },
index: 0,
finish_reason: data.finish_reason
}]
})}\n\n`;
}
这种轻量的转换逻辑保证了极低的性能开销,实测在边缘节点的处理延迟小于 5ms。
内置测试页面
部署完成后,访问 Worker 的根路径会打开一个轻量级的 Web 测试界面。
测试页支持填写 system prompt、实时发送对话请求、查看流式输出的完整内容,以及一键复制 API 调用代码。这对于快速验证功能、排查问题非常实用,省去了配置第三方 API 测试工具的麻烦。
为什么选 Cloudflare Worker
相比传统服务器方案,Worker 部署有三大优势:
| 对比项 | 传统服务器 | Cloudflare Worker |
|---|---|---|
| 成本 | 需要付费实例 | 免费额度充足 |
| 配置 | 需手动维护环境 | 零配置部署 |
| 延迟 | 固定地域 | 全球边缘就近 |
对于个人开发者或小团队而言,cj2api 几乎等于零运维成本的 AI API 代理方案。
适用场景
- 在 Cursor、Continue 等 IDE 插件中使用 ChatJimmy(这些工具通常只支持 OpenAI 接口)
- 通过 Lobe Chat 等 UI 客户端统一管理多模型对话
- 需要在海外访问 ChatJimmy 服务(利用 Cloudflare 的网络优化)
项目代码完全开源,部署灵活,开发者可以根据需要自行修改转发逻辑或添加认证机制。如果你正在寻找一个简单可靠的 API 兼容层方案,不妨试试这个项目。