No description
|
|
||
|---|---|---|
| config | ||
| handler | ||
| instance | ||
| store | ||
| web | ||
| .gitignore | ||
| docker-compose.yaml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| README.md | ||
CloudFlare Worker AI Converter
将多个 CloudFlare Worker AI 账号组成号池,通过负载均衡对外提供标准 OpenAI Chat Completion 兼容 API。
支持任何 OpenAI 兼容客户端(CherryStudio、NextChat、Open WebUI、Chatbox 等)直接接入。
功能特性
- 多账号号池:添加多个 CloudFlare 账号,自动负载均衡分发请求
- OpenAI 兼容 API:标准
/v1/chat/completions和/v1/models接口 - 流式 & 非流式:完整支持 SSE 流式传输和非流式响应
- Reasoning 模型支持:自动处理 DeepSeek-R1 的
<think>标签、Gemma-4 / Nemotron 的reasoning字段,正确分离思考过程和最终回复 - 4 种负载均衡策略:
round-robin:轮询priority:按优先级选择least-used:最少请求优先smart:加权评分(请求数 + 429 惩罚,5 分钟线性衰减)
- 自动重试:号池模式下 429/5xx 错误自动换账号重试(最多 3 次)
- 限流保护:全局 + 单账号令牌桶限流
- 模型白名单:控制允许使用的模型,首次运行自动种子常用模型
- 模型映射:自定义模型名称映射(如
deepseek-r1→@cf/deepseek-ai/deepseek-r1-distill-qwen-32b) - Web 管理控制台:React 前端,可视化管理账号、配置、监控
- 出站代理:支持配置 HTTP 代理访问 CloudFlare API
快速开始
Docker 部署(推荐)
git clone https://git.viloze.com/Derrity/CFWorkerAI_converter.git
cd CFWorkerAI_converter
docker compose up -d
- Web 控制台:
http://localhost:3000 - 代理 API:
http://localhost:4141
手动编译
前置要求:Go 1.22+、Node.js 18+
# 编译前端
cd web
npm install
npm run build
cd ..
# 编译运行
go build -o cf-ai-proxy .
./cf-ai-proxy
命令行参数
--web-port Web 控制台端口(默认 3000)
--proxy-port 代理 API 端口(默认 4141)
--verbose 开启详细日志
--auto-start 自动启动已启用的账号(默认 true)
--reset-password 重置管理员密码并退出
使用方式
1. 初始设置
首次启动后访问 http://localhost:3000,设置管理员用户名和密码。
2. 添加 CloudFlare 账号
在 Web 控制台添加账号,需要:
- CloudFlare Account ID:在 CloudFlare Dashboard → Workers & Pages 页面右侧可找到
- API Token:在 API Tokens 页面创建,需要
Workers AI读取权限
3. 接入客户端
在 CherryStudio / NextChat / Open WebUI 等客户端中配置:
API Base URL: http://localhost:4141/v1
API Key: (控制台中对应账号的 Proxy API Key)
号池模式
启用号池后,所有请求通过统一的 Pool API Key 访问,自动在多个账号间负载均衡:
API Key: (号池配置中的 Pool API Key)
单账号模式
使用各账号独立的 API Key,请求固定发到该账号:
API Key: (各账号的 Proxy API Key)
4. 发起请求
# 非流式
curl http://localhost:4141/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b",
"messages": [{"role": "user", "content": "Hello!"}]
}'
# 流式
curl http://localhost:4141/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "@cf/google/gemma-4-26b-a4b-it",
"messages": [{"role": "user", "content": "Hello!"}],
"stream": true
}'
# 模型列表
curl http://localhost:4141/v1/models \
-H "Authorization: Bearer sk-your-api-key"
支持的模型
首次运行时自动添加以下默认模型白名单(可在控制台管理):
| 模型 | 类型 |
|---|---|
@cf/meta/llama-3.1-8b-instruct |
Chat |
@cf/meta/llama-3.3-70b-instruct-fp8-fast |
Chat |
@cf/meta/llama-4-scout-17b-16e-instruct |
Chat |
@cf/qwen/qwen2.5-coder-32b-instruct |
Chat |
@cf/deepseek-ai/deepseek-r1-distill-qwen-32b |
Chat (Reasoning) |
@cf/mistral/mistral-7b-instruct-v0.1 |
Chat |
@cf/google/gemma-7b-it-lora |
Chat |
@cf/baai/bge-base-en-v1.5 |
Embedding |
@cf/baai/bge-large-en-v1.5 |
Embedding |
可通过控制台添加任何 CloudFlare Worker AI 支持的模型,包括新一代 reasoning 模型:
@cf/google/gemma-4-26b-a4b-it@cf/nvidia/nemotron-3-120b-a12b
模型映射
在控制台的「模型映射」中配置简称映射,方便客户端使用:
deepseek-r1 → @cf/deepseek-ai/deepseek-r1-distill-qwen-32b
llama-3.1 → @cf/meta/llama-3.1-8b-instruct
gemma-4 → @cf/google/gemma-4-26b-a4b-it
配置后客户端可直接使用简称:
{"model": "deepseek-r1", "messages": [...]}
Reasoning 模型处理
本项目自动处理两种 reasoning 格式:
DeepSeek-R1 系列(老格式 <think> 标签):
<think>...</think>内的内容 →reasoning字段</think>之后的内容 →content字段
Gemma-4 / Nemotron 系列(新格式 reasoning 字段):
- CF 返回的
delta.reasoning→ 直接映射到reasoning字段 - CF 返回的
delta.content→ 直接映射到content字段
支持 reasoning 的客户端(CherryStudio 等)会自动折叠显示思考过程。
项目结构
├── main.go # 入口,双端口启动
├── config/
│ └── config.go # CF API 常量、HTTP Client 工厂
├── store/
│ ├── paths.go # 数据目录管理
│ ├── account.go # 账号 CRUD + 号池配置
│ ├── admin.go # 管理员认证(bcrypt)
│ ├── model_map.go # 模型名称映射
│ ├── model_whitelist.go # 模型白名单
│ └── proxy_config.go # 出站 HTTP 代理配置
├── instance/
│ ├── manager.go # 账号实例管理(启停、Token 验证)
│ ├── load_balancer.go # 4 种负载均衡策略
│ ├── rate_limiter.go # 令牌桶限流
│ ├── usage.go # 滑动窗口请求统计
│ └── handler.go # CF ↔ OpenAI 格式转换(核心)
├── handler/
│ ├── proxy.go # 代理路由 + 认证 + 重试
│ └── console_api.go # Web 管理 API
├── web/ # React + Vite + TypeScript 前端
│ ├── embed.go # go:embed 打包前端
│ └── src/
│ ├── App.tsx # 主界面
│ ├── api.ts # API 客户端
│ └── components/ # UI 组件
├── Dockerfile
└── docker-compose.yaml
数据存储
数据保存在 ~/.local/share/cf-worker-ai-pool/(Docker 中为 volume):
accounts.json # 账号信息
pool-config.json # 号池配置
model_whitelist.json # 模型白名单
model_map.json # 模型映射
admin.json # 管理员凭据
proxy-config.json # 出站代理配置
环境变量
| 变量 | 说明 | 默认值 |
|---|---|---|
RATE_LIMIT_RPM |
全局请求限制(次/分钟) | 不限制 |
常见问题
忘记管理员密码?
./cf-ai-proxy --reset-password
重启后重新设置。
模型请求超时?
- 部分 CF 模型首次请求需要冷启动,可能需要 30-60 秒
- 非流式请求默认超时 120 秒,流式请求无超时
- 可配置出站 HTTP 代理加速访问
Reasoning 模型只显示思考过程没有回复?
- 确保客户端未设置过小的
max_tokens - 代理默认
max_tokens为 8192,足够 reasoning 模型使用 - 如果客户端传了较小的
max_tokens,以客户端设置为准
License
MIT