零成本将 ChatJimmy 转为 OpenAI API:cj2api 项目实战
痛点场景
你在开发一个需要接入 AI 能力的应用,但不想在前端暴露真实的 ChatJimmy API Key。团队成员需要通过统一接口调用,内部系统已经对接了 OpenAI 格式的 SDK,换一个 AI 来源意味着要改一堆代码。
更麻烦的是,你只是想做个快速原型验证,租一台服务器来跑代理服务成本太高。
这时候,一个能将 ChatJimmy 转换为 OpenAI 兼容接口的轻量方案就显得尤为重要。
cj2api 是什么
cj2api 是一个开源项目,通过 Cloudflare Worker 实现 ChatJimmy 到 OpenAI API 格式的转换。项目只有 23 个 GitHub Stars,但功能完整:
- 将 ChatJimmy 的请求/响应转换为 OpenAI 兼容格式
- 支持流式输出(Server-Sent Events)
- 自带 Web 测试页面
- 零成本部署在 Cloudflare 全球边缘网络
- 无需维护自己的服务器
核心原理
cj2api 本质上是一个协议转换层,它做了以下工作:
// 请求转换:OpenAI 格式 → ChatJimmy 格式
const chatJimmyRequest = {
prompt: openaiRequest.messages,
model: openaiRequest.model || 'jimmy-v3'
};
// 响应转换:ChatJimmy 格式 → OpenAI 格式
const openAIResponse = {
id: `chatcmpl-${Date.now()}`,
object: 'chat.completion',
model: chatJimmyResponse.model,
choices: [{
index: 0,
message: { role: 'assistant', content: chatJimmyResponse.response },
finish_reason: 'stop'
}]
};
关键点在于两种格式的映射关系处理,以及流式输出时对数据帧的正确解析和重组。
部署步骤
部署仅需几分钟,无需安装复杂工具:
方式一:使用 Wrangler CLI
# 安装 Wrangler
npm install -g wrangler
# 登录 Cloudflare
wrangler login
# 直接部署
wrangler deploy
方式二:使用 Cloudflare Dashboard
- 创建新的 Worker
- 将
wrangler.toml和src/index.js的内容复制到编辑器 - 点击 Deploy
部署完成后,通过环境变量配置 ChatJimmy 的 API 地址和 Key:
# 在 Cloudflare Worker 设置中添加
CHAT_JIMMY_API_URL=https://api.chatjimmy.com/v1
CHAT_JIMMY_API_KEY=your_api_key_here
使用方式
部署成功后,可以像调用 OpenAI API 一样使用:
curl -X POST https://your-worker.xxx.workers.dev/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer any-string" \
-d '{
"model": "jimmy-v3",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}'
项目自带的测试页面位于 /test 路由,可以直接在浏览器中验证接口是否正常工作。
与同类工具的差异
对比传统的 API 代理方案,cj2api 的优势在于:
| 特性 | 传统代理服务 | cj2api |
|---|---|---|
| 部署成本 | 需要 VPS 月费 | 免费额度内零成本 |
| 全球延迟 | 取决于服务器位置 | Cloudflare 边缘就近响应 |
| 维护工作 | 需要监控服务器 | 无服务器,无需运维 |
| 冷启动 | 可能存在延迟 | 边缘计算无冷启动 |
唯一的限制是 Cloudflare Worker 的免费配额(每天 10 万次请求),对大多数个人项目和小团队使用场景来说足够。
适用场景
- 快速原型开发,需要临时接入 AI 能力
- 团队内部统一 API 调用入口
- 不想在前端暴露真实 API Key
- 已有 OpenAI SDK 的项目需要切换到 ChatJimmy
项目代码结构简单,如果你需要自定义功能(比如添加日志记录、请求限流),可以直接修改 src/index.js 中的逻辑。