openai.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. !(
  15. m.id.startsWith("gpt-4") ||
  16. m.id.startsWith("chatgpt-4o") ||
  17. m.id.startsWith("o1") ||
  18. m.id.startsWith("o3")
  19. ) || m.id.startsWith("gpt-4o-mini"),
  20. );
  21. }
  22. return remoteModelRes;
  23. }
  24. export async function handle(
  25. req: NextRequest,
  26. { params }: { params: { path: string[] } },
  27. ) {
  28. console.log("[OpenAI Route] params ", params);
  29. if (req.method === "OPTIONS") {
  30. return NextResponse.json({ body: "OK" }, { status: 200 });
  31. }
  32. const subpath = params.path.join("/");
  33. if (!ALLOWED_PATH.has(subpath)) {
  34. console.log("[OpenAI Route] forbidden path ", subpath);
  35. return NextResponse.json(
  36. {
  37. error: true,
  38. msg: "you are not allowed to request " + subpath,
  39. },
  40. {
  41. status: 403,
  42. },
  43. );
  44. }
  45. const authResult = auth(req, ModelProvider.GPT);
  46. if (authResult.error) {
  47. return NextResponse.json(authResult, {
  48. status: 401,
  49. });
  50. }
  51. try {
  52. const response = await requestOpenai(req);
  53. // list models
  54. if (subpath === OpenaiPath.ListModelPath && response.status === 200) {
  55. const resJson = (await response.json()) as OpenAIListModelResponse;
  56. const availableModels = getModels(resJson);
  57. return NextResponse.json(availableModels, {
  58. status: response.status,
  59. });
  60. }
  61. return response;
  62. } catch (e) {
  63. console.error("[OpenAI] ", e);
  64. return NextResponse.json(prettyObject(e));
  65. }
  66. }