repo_description: ✨ Light and Fast AI Assistant. Support: Web | iOS | MacOS | Android |  Linux | Windows
repo_topics: calclaude chatgpt claude cross-platform desktop fe gemini gemini-pro gemini-server gemini-ultra gpt-4o groq nextjs ollama react tauri tauri-app vercel webui
code: import { type OpenAIListModelResponse } from "@/app/client/platforms/openai";
  import { getServerSideConfig } from "@/app/config/server";
  import { ModelProvider, OpenaiPath } from "@/app/constant";
  import { prettyObject } from "@/app/utils/format";
  import { NextRequest, NextResponse } from "next/server";
  import { auth } from "./auth";
  import { requestOpenai } from "./common";
  
  const ALLOWED_PATH = new Set(Object.values(OpenaiPath));
  
  function getModels(remoteModelRes: OpenAIListModelResponse) {
    const config = getServerSideConfig();
  
    if (config.disableGPT4) {
      remoteModelRes.data = remoteModelRes.data.filter(
        (m) =>
          !(
            m.id.startsWith("gpt-4") ||
            m.id.startsWith("chatgpt-4o") ||
            m.id.startsWith("o1") ||
            m.id.startsWith("o3")
          ) || m.id.startsWith("gpt-4o-mini"),
      );
    }
  
    return remoteModelRes;
  }
  
  export async function handle(
    req: NextRequest,
    { params }: { params: { path: string[] } },
  ) {
    console.log("[OpenAI Route] params ", params);
  
    if (req.method === "OPTIONS") {
      return NextResponse.json({ body: "OK" }, { status: 200 });
    }
  
    const subpath = params.path.join("/");
  
    if (!ALLOWED_PATH.has(subpath)) {
      console.log("[OpenAI Route] forbidden path ", subpath);
      return NextResponse.json(
        {
          error: true,
          msg: "you are not allowed to request " + subpath,
        },
        {
          status: 403,
        },
      );
    }
  
    const authResult = auth(req, ModelProvider.GPT);
    if (authResult.error) {
      return NextResponse.json(authResult, {
        status: 401,
      });
    }
  
    try {
      const response = await requestOpenai(req);
  
      // list models
      if (subpath === OpenaiPath.ListModelPath && response.status === 200) {
        const resJson = (await response.json()) as OpenAIListModelResponse;
        const availableModels = getModels(resJson);
        return NextResponse.json(availableModels, {
          status: response.status,
        });
      }
  
      return response;
    } catch (e) {
      console.error("[OpenAI] ", e);
      return NextResponse.json(prettyObject(e));
    }
  }
  