前两天通过 new-api 自建了中转站,同时看到 cloudfare workers ai 每天有一万的免费用量,
目前本地主要使用 pi 进行 ai coding,于是尝试如何进行接入。
在 Cloudflare上创建 workers
代码如下
export default {
async fetch(request, env, ctx) {
if (request.method === 'OPTIONS') {
return new Response(null, { status: 204 });
}
const url = new URL(request.url);
const targetUrl = 'https://api.cloudflare.com' + url.pathname + url.search;
let body = await request.json();
console.log(body)
// 把 developer role 转换成 system
if (body.messages) {
body.messages = body.messages.map(msg => {
// 转换 role
const role = msg.role === 'developer' ? 'system' : msg.role;
// 转换 content 数组为字符串
let content = msg.content;
if (Array.isArray(content)) {
content = content
.filter(c => c.type === 'text')
.map(c => c.text)
.join('\n');
}
return { role, content };
});
}
const response = await fetch(targetUrl, {
method: request.method,
headers: request.headers,
body: JSON.stringify(body),
});
return response;
}
};为什么需要创建 workers 呢?直接使用过程中发现,
-
pi 发的系统提示词是:
{"role": "developer", "content": "You are a helpful assistant."}
CF AI 期望的是:{"role": "system", "content": "You are a helpful assistant."}
CF AI 不认识 developer role,返回了错误。 -
pi 发的是:
{"role": "user", "content": [{"type": "text", "text": "hi"}]}
但 CF AI 期望的是:{"role": "user", "content": "你好"}
messages content 是数组格式,CF AI 不支持,只支持字符串格式。
因此需要 cloudfare workers 进行请求参数转换。
可以直接通过请求进行测试
curl https://aiproxy.example.com/v1/chat/completions \
-H "Authorization: Bearer sk-xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "@cf/meta/llama-3.1-8b-instruct",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "你好"}
]
}'
也就是流程需要变成
pi → new-api → Cloudflare Workers → Cloudflare Workers AI
在 new-api 上配置 Cloudflare 渠道
注意 API地址 要填 Cloudflare Worker 地址,如下图所示,
在 pi 中加入 providers 配置
编辑 .pi/agent/models.json
路径上记得带 v1
{
"providers": {
"myproxy": {
"baseUrl": "https://aiproxy.example.com/v1",
"apiKey": "sk-xxx",
"api": "openai-completions",
"models": [
{
"id": "@hf/nousresearch/hermes-2-pro-mistral-7b",
"name": "@hf/nousresearch/hermes-2-pro-mistral-7b"
}
]
}
}
}注意不要使用 @cf/meta/llama-3.1-8b-instruct 之类的模型,这个只支持纯文本,
命令行工具的调用可以使用 @hf/nousresearch/hermes-2-pro-mistral-7b 进行测试。