oai-proxy / src /proxy /openai.ts
Xeeph's picture
Duplicate from idosal/oai-proxy
5bddbd8
raw
history blame contribute delete
No virus
1.7 kB
import { Request, Router } from "express";
import * as http from "http";
import { createProxyMiddleware, fixRequestBody } from "http-proxy-middleware";
import { logger } from "../logger";
import { Key, keys } from "../keys";
import { handleResponse, onError } from "./common";
/**
* Modifies the request body to add a randomly selected API key.
*/
const rewriteRequest = (proxyReq: http.ClientRequest, req: Request) => {
let key: Key;
try {
key = keys.get(req.body?.model || "gpt-3.5")!;
} catch (err) {
proxyReq.destroy(err as any);
return;
}
req.key = key;
proxyReq.setHeader("Authorization", `Bearer ${key.key}`);
if (req.method === "POST" && req.body) {
if (req.body?.stream) {
req.body.stream = false;
const updatedBody = JSON.stringify(req.body);
proxyReq.setHeader("Content-Length", Buffer.byteLength(updatedBody));
(req as any).rawBody = Buffer.from(updatedBody);
}
// body-parser and http-proxy-middleware don't play nice together
fixRequestBody(proxyReq, req);
}
};
const openaiProxy = createProxyMiddleware({
target: "https://api.openai.com",
changeOrigin: true,
on: {
proxyReq: rewriteRequest,
proxyRes: handleResponse,
error: onError,
},
selfHandleResponse: true,
logger,
});
const openaiRouter = Router();
openaiRouter.post("/v1/chat/completions", openaiProxy);
// openaiRouter.post("/v1/completions", openaiProxy); // TODO: Implement Davinci
openaiRouter.get("/v1/models", openaiProxy);
openaiRouter.use((req, res) => {
logger.warn(`Blocked openai proxy request: ${req.method} ${req.path}`);
res.status(404).json({ error: "Not found" });
});
export const openai = openaiRouter;