openai.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { type OpenAIListModelResponse } from "@/app/client/platforms/openai";
  2. import { getServerSideConfig } from "@/app/config/server";
  3. import { ModelProvider, OpenaiPath } from "@/app/constant";
  4. import { prettyObject } from "@/app/utils/format";
  5. import { NextRequest, NextResponse } from "next/server";
  6. import { auth } from "./auth";
  7. import { requestOpenai } from "./common";
  8. const ALLOWED_PATH = new Set(Object.values(OpenaiPath));
  9. function getModels(remoteModelRes: OpenAIListModelResponse) {
  10. const config = getServerSideConfig();
  11. if (config.disableGPT4) {
  12. remoteModelRes.data = remoteModelRes.data.filter(
  13. (m) =>
  14. !(m.id.startsWith("gpt-4") || m.id.startsWith("chatgpt-4o") || m.id.startsWith("o1")) ||
  15. m.id.startsWith("gpt-4o-mini"),
  16. );
  17. }
  18. return remoteModelRes;
  19. }
  20. export async function handle(
  21. req: NextRequest,
  22. { params }: { params: { path: string[] } },
  23. ) {
  24. console.log("[OpenAI Route] params ", params);
  25. if (req.method === "OPTIONS") {
  26. return NextResponse.json({ body: "OK" }, { status: 200 });
  27. }
  28. const subpath = params.path.join("/");
  29. if (!ALLOWED_PATH.has(subpath)) {
  30. console.log("[OpenAI Route] forbidden path ", subpath);
  31. return NextResponse.json(
  32. {
  33. error: true,
  34. msg: "you are not allowed to request " + subpath,
  35. },
  36. {
  37. status: 403,
  38. },
  39. );
  40. }
  41. const authResult = auth(req, ModelProvider.GPT);
  42. if (authResult.error) {
  43. return NextResponse.json(authResult, {
  44. status: 401,
  45. });
  46. }
  47. try {
  48. const response = await requestOpenai(req);
  49. // list models
  50. if (subpath === OpenaiPath.ListModelPath && response.status === 200) {
  51. const resJson = (await response.json()) as OpenAIListModelResponse;
  52. const availableModels = getModels(resJson);
  53. return NextResponse.json(availableModels, {
  54. status: response.status,
  55. });
  56. }
  57. return response;
  58. } catch (e) {
  59. console.error("[OpenAI] ", e);
  60. return NextResponse.json(prettyObject(e));
  61. }
  62. }