|
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"; |
|
|
|
|
|
|
|
|
|
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); |
|
} |
|
|
|
|
|
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.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; |
|
|