✨ 奇美拉协议 · 综合版 | Project Chimera: Synthesis Edition
将 Perplexity.ai 的 SSE 接口无损转换为 OpenAI 兼容 API 的智能代理服务
这是一个完全自包含的 Cloudflare Worker,它像一位"翻译官"👨💼,把 Perplexity.ai 的"方言"(SSE 接口)翻译成全世界开发者都懂的"普通话"(OpenAI API 标准)。
| 问题场景 | 传统方案痛点 | 我们的解决方案 |
|---|---|---|
| 🔄 API 兼容性 | Perplexity 使用特殊格式,需要重写大量代码 | ✅ 开箱即用,直接兼容 OpenAI 生态 |
| ⚡ 部署复杂度 | 需要服务器、环境配置、依赖管理 | 🚀 单文件部署,5分钟搞定 |
| 💰 成本控制 | 自建服务器费用高,维护成本大 | 🌐 边缘计算,按请求付费 |
| 🔒 访问稳定性 | 直接调用可能被限制或封禁 | 🛡️ 代理中转,增强稳定性 |
"简单不意味着简陋" - 我们相信优秀的技术应该像呼吸一样自然,让开发者专注于创造价值,而不是解决兼容性问题。
- 🎯 精准兼容 - 100% 兼容 OpenAI Chat Completions API
- ⚡ 极速响应 - 基于 Cloudflare 全球边缘网络
- 🔧 开箱即用 - 单文件部署,零依赖配置
- 🎨 美观界面 - 内置开发者驾驶舱,可视化调试
- 🛡️ 安全可靠 - API Key 认证 + CORS 安全防护
| 功能 | Perplexity 原生 | 我们的代理 |
|---|---|---|
| OpenAI 格式兼容 | ❌ 不支持 | ✅ 完全支持 |
| 流式响应 | ✅ 支持 | ✅ 完美转换 |
| 多模型支持 | ✅ 支持 | ✅ 统一接口 |
| 部署复杂度 | 🔴 复杂 | 🟢 极简 |
| 开发友好度 | 🟡 一般 | 🟢 优秀 |
或者手动复制粘贴:
-
📝 登录 Cloudflare Dashboard
# 访问 https://dash.cloudflare.com # 选择 Workers & Pages → 创建 Worker
-
🔄 复制代码
- 将本项目的完整
index.js代码复制粘贴到编辑器 - 点击"保存并部署"
- 将本项目的完整
-
🔑 配置环境变量 (可选)
API_MASTER_KEY = "你的自定义密钥" -
🎉 开始使用!
- 访问你的 Worker 域名,享受开发者驾驶舱
# 测试你的部署是否成功
curl -X POST "你的-worker.workers.dev/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 1" \
-d '{
"model": "gemini30pro",
"messages": [{"role": "user", "content": "你好,世界!"}],
"stream": true
}'访问你的 Worker 根路径,你将看到:
https://你的-worker.workers.dev/
界面功能区域:
- 🔐 API 密钥显示 - 显示当前使用的认证密钥
- 🌐 接口地址 - 可直接复制的 API 端点
- 🎛️ 模型选择器 - 支持所有可用模型
- 💬 实时聊天窗口 - 可视化测试界面
- 📋 代码示例 - cURL 和 Python 示例代码
import openai
client = openai.OpenAI(
api_key="1", # 或你的自定义密钥
base_url="https://你的-worker.workers.dev/v1"
)
# 流式响应
stream = client.chat.completions.create(
model="gemini30pro",
messages=[{"role": "user", "content": "解释量子计算"}],
stream=True
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end="", flush=True)const response = await fetch('https://你的-worker.workers.dev/v1/chat/completions', {
method: 'POST',
headers: {
'Authorization': 'Bearer 1',
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gemini30pro',
messages: [{ role: 'user', content: 'Hello!' }],
stream: true
})
});
// 处理流式响应
const reader = response.body.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log(new TextDecoder().decode(value));
}curl "https://你的-worker.workers.dev/v1/models" \
-H "Authorization: Bearer 1"在 Cloudflare Worker 设置中添加:
| 变量名 | 描述 | 默认值 |
|---|---|---|
API_MASTER_KEY |
API 认证密钥 | "1" |
PPLX_COOKIE |
Perplexity Cookie | 内置值 |
{
"model": "gemini30pro", // 模型选择
"messages": [ // 对话历史
{"role": "user", "content": "你的问题"}
],
"stream": true, // 是否流式输出
"temperature": 0.7, // 创造性 (未来支持)
"max_tokens": 1000 // 最大长度 (未来支持)
}┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 客户端 │ │ Cloudflare Worker │ │ Perplexity.ai │
│ (OpenAI SDK) │───▶│ 代理中转 │───▶│ 原始接口 │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
│ 1. OpenAI格式请求 │ 3. 转换格式请求 │ 4. SSE流式响应
│ │ │
│ 2. 流式响应 chunks │ 5. 实时转换 & 推送 │
◀─────────────────────── │ ◀────────────────────── │
// 原始 OpenAI 请求
{
"model": "gemini30pro",
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}
// 转换为 Perplexity 请求
{
"params": {
"model_preference": "gemini30pro",
"search_focus": "internet",
"dsl_query": "你好",
// ... 其他元数据字段
},
"query_str": "你好"
}// Perplexity SSE 数据格式
data: {"answer": "完整回答文本", "text": "..."}
// 转换为 OpenAI 格式
data: {"id": "req-xxx", "object": "chat.completion.chunk", "choices": [{"delta": {"content": "增量文本"}}]}let lastAnswer = ""; // 缓存上一次的完整答案
let currentAnswer = data.answer; // 当前接收的完整答案
// 计算增量:当前答案 - 上次答案 = 新增内容
const deltaText = currentAnswer.substring(lastAnswer.length);
lastAnswer = currentAnswer; // 更新缓存
// 只有新增内容才推送给客户端
if (deltaText) {
sendToClient(deltaText);
}try {
// 尝试解析 SSE 数据
const data = JSON.parse(line.substring(6));
// 多种数据提取策略
let content = extractContent(data);
} catch (e) {
// 优雅降级:忽略解析错误,继续处理后续数据
console.warn("SSE 解析跳过:", e.message);
}- 技术:
TextDecoder+ 流式解析 - 作用:实时处理 Perplexity 的流式响应
- 难点:数据包边界处理、缓冲区管理
- 技术:Web Streams API
- 作用:零拷贝实时数据转换
- 优势:内存高效、低延迟
function corsHeaders(headers = {}) {
return {
...headers,
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
};
}| 指标 | 数值 | 说明 |
|---|---|---|
| 🕒 响应延迟 | 100-300ms | 首 chunk 到达时间 |
| 🔄 吞吐量 | 1000+ RPM | 单个 Worker 处理能力 |
| 🌍 全球覆盖 | 300+ 节点 | Cloudflare 边缘网络 |
| 💾 内存使用 | < 128MB | 轻量级运行 |
- 🔍 搜索增强问答 - 利用 Perplexity 的实时搜索能力
- 📚 知识密集型任务 - 基于最新网络信息
- 💬 长文本对话 - 支持上下文理解
- 🌐 多语言处理 - 优秀的国际化支持
- 🔐 依赖 Cookie - 需要定期更新认证信息
- 📡 网络依赖 - 依赖 Perplexity 服务可用性
- ⏱️ 响应波动 - 受上游服务负载影响
- 实时状态指示器 - 系统健康度可视化
- 一键复制功能 - 快速获取配置信息
- 模型选择器 - 直观的模型切换
- 流式显示 - 实时打字机效果
- 消息区分 - 用户/AI/错误消息样式区分
- 自动滚动 - 智能跟随最新内容
- 多语言支持 - cURL、Python 等示例
- 选项卡切换 - 简洁的界面组织
- 一键复制 - 快速集成到项目
- 🔐 多密钥支持 - 支持轮换使用多个 Cookie
- 📊 使用统计 - 请求次数、令牌使用量统计
- ⚙️ 参数扩展 - temperature、max_tokens 等参数支持
- 🔍 智能重试 - 失败请求自动重试机制
- 🧩 插件架构 - 可扩展的转换器插件系统
- 📈 性能监控 - 实时性能指标和告警
- 🔒 安全增强 - 请求频率限制、IP 白名单
- 🌐 多上游支持 - 同时支持多个 AI 服务提供商
- 🔀 智能路由 - 基于内容类型的智能模型选择
- 💾 缓存层 - 响应缓存提升性能
- 📚 向量数据库 - 对话历史管理和检索
- 🧩 插件市场 - 社区贡献的转换器和功能
- 📱 移动端优化 - 响应式设计改进
- 🌍 国际化 - 多语言界面支持
perplexity-2api-cfwork/
├── 📄 README.md # 项目文档 (就是这个文件)
├── 🔧 wrangler.toml # Cloudflare Worker 配置
├── 📊 package.json # 项目依赖和元数据
└── 📁 src/
└── 🚀 index.js # 主程序文件 (单文件架构)
由于采用 Cloudflare Worker 的单文件部署模式,所有功能都集中在 index.js 中:
index.js
├── 🎯 配置区块 (CONFIG)
├── 🔄 Worker 入口 (export default)
├── 🌐 API 路由处理 (handleApi)
├── 💬 聊天完成处理 (handleChatCompletions)
├── 📋 模型列表处理 (handleModelsRequest)
├── 🛠️ 工具函数
│ ├── createErrorResponse
│ ├── handleCorsPreflight
│ └── corsHeaders
└── 🎨 Web 界面 (handleUI)
- 技术层级: Edge Computing Platform
- 核心技术: V8 Isolates, Service Workers API
- 搜索来源: Cloudflare 官方文档 + 社区最佳实践
- 难度评级: ⭐⭐☆☆☆ (2/5) - 中等偏易
- 扩展潜力: 🔥🔥🔥🔥☆ (4/5) - 高扩展性
- 技术标准: HTML5 EventSource
- 核心技术:
text/event-streamMIME 类型 - 搜索关键词: "SSE protocol implementation", "Server-Sent Events"
- 难度评级: ⭐⭐⭐☆☆ (3/5) - 中等难度
- 优化方向: 考虑 WebSocket 双向通信
- 技术标准: WHATWG Streams Standard
- 核心类:
TransformStream,ReadableStream,WritableStream - 搜索来源: MDN Web Docs + Chrome DevRel
- 难度评级: ⭐⭐⭐⭐☆ (4/5) - 较高难度
- 替代方案: 传统的 Buffer 拼接
// 1. 请求接收
Client Request → Worker fetch() → Route Matching
// 2. 认证验证
API Key Check → CORS Preflight → Error Handling
// 3. 格式转换
OpenAI Format → Perplexity Format → HTTP Headers
// 4. 上游通信
HTTP POST → SSE Stream → Real-time Processing
// 5. 响应转换
SSE Events → OpenAI Chunks → Stream Pipeline
// 6. 客户端推送
TransformStream → Incremental Updates → Clienttry {
// 主处理逻辑
} catch (error) {
// 层级化错误处理
if (error instanceof NetworkError) {
// 网络错误重试
} else if (error instanceof ParseError) {
// 数据解析错误恢复
} else {
// 通用错误处理
}
}// 扩展点:支持多上游服务
class ApiTransformer {
constructor(provider) {
this.provider = provider;
}
transformRequest(openaiRequest) {
// 转换为特定提供商格式
}
transformResponse(providerResponse) {
// 转换为 OpenAI 格式
}
}
// 使用示例
const perplexityTransformer = new ApiTransformer('perplexity');
const openaiRequest = perplexityTransformer.transformRequest(userInput);// 请求处理管道
const middlewarePipeline = [
authMiddleware, // 认证
rateLimitMiddleware, // 限流
cacheMiddleware, // 缓存
transformMiddleware, // 转换
logMiddleware // 日志
];
// 响应处理管道
const responsePipeline = [
errorHandlerMiddleware,
metricsMiddleware,
compressionMiddleware
];// 动态配置加载
class ConfigManager {
async loadConfig() {
// 从 KV 存储加载配置
// 支持热重载
// 环境特定配置
}
}// 1. 在 CONFIG.MODELS 中添加新模型
const CONFIG = {
MODELS: [
...原有模型,
"new-awesome-model", // 🆕 新增模型
"another-cool-model"
]
};
// 2. 在转换逻辑中处理新模型特性
function enhanceForNewModel(pplxPayload, model) {
if (model === "new-awesome-model") {
pplxPayload.params.enhanced_features = ["new_capability"];
}
return pplxPayload;
}// 使用 Cloudflare KV 实现缓存
async function getCachedResponse(query, model) {
const cacheKey = `${model}:${hash(query)}`;
const cached = await env.KV_STORE.get(cacheKey);
return cached ? JSON.parse(cached) : null;
}
async function setCachedResponse(query, model, response, ttl = 3600) {
const cacheKey = `${model}:${hash(query)}`;
await env.KV_STORE.put(cacheKey, JSON.stringify(response), { expirationTtl: ttl });
}Q: 部署后访问显示 404 错误?
A: 检查 Worker 域名是否正确,确保代码已成功部署。访问根路径 / 应该显示开发者驾驶舱。
Q: API 返回 "无效的 API Key"?
A: 确认请求头中的 Authorization 格式为 Bearer 你的密钥,默认密钥是 "1"。
Q: 流式响应中断或内容不完整?
A: 这通常是由于 Perplexity Cookie 过期导致的。需要更新 CONFIG.PPLX_COOKIE 的值。
Q: 如何更新 Perplexity Cookie? A: 使用浏览器开发者工具访问 Perplexity.ai,复制 Network 标签页中的 Cookie 值替换配置。
Q: 支持非流式响应吗? A: 当前主要优化流式响应,但可以通过在客户端拼接 chunks 实现非流式效果。
Q: 如何提高响应速度? A: 选择离你用户更近的 Cloudflare 区域部署,确保 Cookie 有效避免重试延迟。
Q: 可以商用吗? A: 可以,遵循 Apache 2.0 协议。但需要注意 Perplexity 自身的使用条款。
Q: 如何监控使用情况? A: 目前可以通过 Cloudflare Worker 的 analytics 查看基本指标,未来版本会加入详细统计。
Q: 支持自定义模型参数吗? A: 当前版本固定参数,v1.1 计划支持 temperature、max_tokens 等参数。
本项目采用 Apache 2.0 开源协议 - 详见 LICENSE 文件。
- ✅ 允许商业使用
- ✅ 允许修改和分发
- ✅ 允许专利使用
- ✅ 需要保留版权声明
- ✅ 需要声明变更
我们欢迎各种形式的贡献!包括但不限于:
- 🐛 Bug 报告 - 通过 Issue 提交
- 💡 功能建议 - 分享你的想法
- 🔧 代码提交 - Pull Request 欢迎
- 📚 文档改进 - 帮助完善文档
- 🌍 国际化 - 翻译和本地化
📝 文档最后更新: 2025-11-24 | 🏷️ 版本: 1.0.1 | 🔥 代号: Chimera Synthesis