HongShi AI正在绞尽脑汁想思路ING···
HongShiのAI摘要
GPT-4o

Venice逆向思路+过程

今天下午看了看,之前的dolphin对话似乎已经似了,不太甘心,就继续上网扒拉,找到一个看着挺靠谱的站(他们家收录的dolphin的模型)而且我一看,你似乎也没有道德审查啊,那很好了,直接开逆。

思路整理

1.我打算用deno写,毕竟那玩意好写()
2.转发请求到venice,并且返回结果搞成OpenAI标准格式,并且支持流式响应
3.增加一个API KEY,别是个东西就能刷

开写!

API鉴权

首先搞定API鉴权,这没啥好说的,在请求头中检查 Authorization 字段,要求格式为 Bearer key,缺失或者不对直接一个401糊脸。

1
2
3
4
5
6
7
function validateApiKey(req: Request): boolean {
const authHeader = req.headers.get("Authorization");
if (!authHeader) return false;
const match = authHeader.match(/^Bearer\s+(.+)$/);
if (!match) return false;
return match[1] === API_KEY;
}

模型列表接口

然后又到了喜闻乐见的/v1/models环节,目前这个站只有俩模型,就直接写死在代码里了,后面改再加()还是喜闻乐见的OpenAI格式。返回一个固定的 JSON,列出可用模型。包含id、object、created等字段。

1
2
3
4
5
6
7
8
9
function openaiModels() {
return {
object: "list",
data: [
{ id: "dolphin-3.0-mistral-24b-1dot1", object: "model", ... },
{ id: "mistral-31-24b", object: "model", ... }
]
};
}

chat接口

接下来是重中之重,聊天接口:/v1/chat/completions
需求:接收用户传入的 messages、model、temperature 等参数。转换为 Venice.ai 的请求格式(prompt、modelId 等)。发起请求并获取响应。
这个有两种模式:流式和非流

非流式:一次性拼接所有返回内容,组装成 OpenAI 的 chat.completion 格式。

流式:逐行读取 Venice.ai 的输出,每行 JSON 解析后立即转发为 SSE 格式的 data: {…},模拟 OpenAI 的流式输出。

1
2
3
4
5
6
7
if (stream) {
// 读取 Venice.ai 的响应流
// 每解析到一行 JSON,就转成 OpenAI 的 chunk 格式推送
} else {
// 收集所有行,拼接成完整回答
// 返回标准的 chat.completion JSON
}

然后直接启动服务,声明一下路径就行了。

1
2
3
4
5
6
serve(async (req: Request) => {
const url = new URL(req.url);
if (url.pathname === "/v1/models") { ... }
if (url.pathname === "/v1/chat/completions") { ... }
return new Response("Not Found", { status: 404 });
}, { port: 8000 });

大功告成!接下来愉快地去刷你的API去吧!

完整代码前往Venice2api逆向思路(附代码)(这个模型没有道德审查哦~) - 开发调优 / 开发调优, Lv2 - LINUX DO获取