使用 deno 把 deepinfra api 转换成的标准 openai 格式
想把 deepinfra 接入 oneApi 但是发现 deepinfra 怎么配置都不对
import { serve } from "https://deno.land/std@0.224.0/http/server.ts";
import { crypto } from "https://deno.land/std@0.224.0/crypto/mod.ts";
const DEEPINFRA_API_BASE = "https://api.deepinfra.com";
const PORT = 8080;
const PATH_MAPPINGS: { [key: string]: string } = {
"/v1/chat": "/v1/openai/chat",
"/v1/models": "/v1/openai/models",
};
const generateRandomUserAgent = () => {
const osList = [
"Windows NT 10.0; Win64; x64",
"Macintosh; Intel Mac OS X 10_15_7",
"X11; Linux x86_64",
];
const browserList = [
{ name: "Chrome", engine: "AppleWebKit/537.36 (KHTML, like Gecko)", version: "122.0.6261.94" },
{ name: "Safari", engine: "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3", version: "605.1.15" },
{ name: "Edge", engine: "AppleWebKit/537.36 (KHTML, like Gecko)", version: "122.0.2365.52" },
{ name: "Firefox", engine: "Gecko/20100101", version: "123.0" },
{ name: "Opera", engine: "Presto/2.12.388 Version/12.16", version: "12.16" },
{ name: "Internet Explorer", engine: "Trident/7.0", version: "11.0" }
];
const randomOS = osList[Math.floor(Math.random() * osList.length)];
const randomBrowser = browserList[Math.floor(Math.random() * browserList.length)];
const randomMinorVersion = Math.floor(Math.random() * 100) + 1;
let userAgent = `Mozilla/5.0 (${randomOS}) ${randomBrowser.engine} ${randomBrowser.name}/${randomBrowser.version}.${randomMinorVersion}`;
if (Math.random() < 0.3) {
userAgent += ` (KHTML, like Gecko) Chrome/${Math.floor(Math.random() * 5) + 120}.0.0.0`;
}
if (Math.random() < 0.1) {
userAgent = `Mozilla/4.0 (compatible; MSIE ${Math.floor(Math.random() * 3) + 8}.0; ${randomOS})`;
}
return userAgent;
};
const generateRequestId = () => crypto.randomUUID();
const modifyRequestBody = async (body: string | null): Promise<string | null> => {
if (!body) return null;
try {
const bodyJson = JSON.parse(body);
if (bodyJson.messages) {
bodyJson.client = "web";
bodyJson.client_info = {
platform: "web",
client_version: "1.0." + Math.floor(Math.random() * 100),
};
return JSON.stringify(bodyJson);
}
return body;
} catch {
return body;
}
};
const proxyRequestHandler = async (req: Request): Promise<Response> => {
try {
const url = new URL(req.url);
let pathname = url.pathname;
for (const [originalPath, replacementPath] of Object.entries(PATH_MAPPINGS)) {
if (pathname.startsWith(originalPath)) {
pathname = pathname.replace(originalPath, replacementPath);
break;
}
}
console.log('request url', url.pathname, pathname)
const targetUrl = `${DEEPINFRA_API_BASE}${pathname}${url.search}`;
const headers = new Headers(req.headers);
headers.set("User-Agent", generateRandomUserAgent());
headers.set("X-Request-ID", generateRequestId());
headers.set("Accept", "application/json");
headers.set("Accept-Encoding", "gzip, deflate, br");
headers.set("Connection", "keep-alive");
headers.set("Cache-Control", "no-cache");
headers.set("Pragma", "no-cache");
headers.set("Sec-Fetch-Dest", "empty");
headers.set("Sec-Fetch-Mode", "cors");
headers.set("Sec-Fetch-Site", "cross-site");
const requestBody = await req.text();
const modifiedBody = await modifyRequestBody(requestBody);
const proxyResponse = await fetch(targetUrl, {
method: req.method,
headers: headers,
body: modifiedBody,
});
const responseHeaders = new Headers(proxyResponse.headers);
responseHeaders.set("Server", "cloudflare");
responseHeaders.set("X-Response-ID", generateRequestId());
return new Response(proxyResponse.body, {
status: proxyResponse.status,
headers: responseHeaders,
});
} catch (error) {
console.error("Proxy request failed:", error);
return new Response(
JSON.stringify({
error: "Internal server error",
code: "internal_error",
timestamp: new Date().toISOString(),
}),
{
status: 500,
headers: {
"Content-Type": "application/json",
"Server": "cloudflare",
},
},
);
}
};
console.log(`AI API proxy server running on port ${PORT}`);
serve(proxyRequestHandler, { port: PORT });