|
|
@@ -1,7 +1,15 @@
|
|
|
import { NextRequest, NextResponse } from "next/server";
|
|
|
import { auth } from "../../auth";
|
|
|
import { getServerSideConfig } from "@/app/config/server";
|
|
|
-import { GEMINI_BASE_URL, Google, ModelProvider } from "@/app/constant";
|
|
|
+import {
|
|
|
+ ApiPath,
|
|
|
+ GEMINI_BASE_URL,
|
|
|
+ Google,
|
|
|
+ ModelProvider,
|
|
|
+} from "@/app/constant";
|
|
|
+import { prettyObject } from "@/app/utils/format";
|
|
|
+
|
|
|
+const serverConfig = getServerSideConfig();
|
|
|
|
|
|
async function handle(
|
|
|
req: NextRequest,
|
|
|
@@ -13,32 +21,6 @@ async function handle(
|
|
|
return NextResponse.json({ body: "OK" }, { status: 200 });
|
|
|
}
|
|
|
|
|
|
- const controller = new AbortController();
|
|
|
-
|
|
|
- const serverConfig = getServerSideConfig();
|
|
|
-
|
|
|
- let baseUrl = serverConfig.googleUrl || GEMINI_BASE_URL;
|
|
|
-
|
|
|
- if (!baseUrl.startsWith("http")) {
|
|
|
- baseUrl = `https://${baseUrl}`;
|
|
|
- }
|
|
|
-
|
|
|
- if (baseUrl.endsWith("/")) {
|
|
|
- baseUrl = baseUrl.slice(0, -1);
|
|
|
- }
|
|
|
-
|
|
|
- let path = `${req.nextUrl.pathname}`.replaceAll("/api/google/", "");
|
|
|
-
|
|
|
- console.log("[Proxy] ", path);
|
|
|
- console.log("[Base Url]", baseUrl);
|
|
|
-
|
|
|
- const timeoutId = setTimeout(
|
|
|
- () => {
|
|
|
- controller.abort();
|
|
|
- },
|
|
|
- 10 * 60 * 1000,
|
|
|
- );
|
|
|
-
|
|
|
const authResult = auth(req, ModelProvider.GeminiPro);
|
|
|
if (authResult.error) {
|
|
|
return NextResponse.json(authResult, {
|
|
|
@@ -49,9 +31,9 @@ async function handle(
|
|
|
const bearToken = req.headers.get("Authorization") ?? "";
|
|
|
const token = bearToken.trim().replaceAll("Bearer ", "").trim();
|
|
|
|
|
|
- const key = token ? token : serverConfig.googleApiKey;
|
|
|
+ const apiKey = token ? token : serverConfig.googleApiKey;
|
|
|
|
|
|
- if (!key) {
|
|
|
+ if (!apiKey) {
|
|
|
return NextResponse.json(
|
|
|
{
|
|
|
error: true,
|
|
|
@@ -62,10 +44,63 @@ async function handle(
|
|
|
},
|
|
|
);
|
|
|
}
|
|
|
+ try {
|
|
|
+ const response = await request(req, apiKey);
|
|
|
+ return response;
|
|
|
+ } catch (e) {
|
|
|
+ console.error("[Google] ", e);
|
|
|
+ return NextResponse.json(prettyObject(e));
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- const fetchUrl = `${baseUrl}/${path}?key=${key}${
|
|
|
- req?.nextUrl?.searchParams?.get("alt") == "sse" ? "&alt=sse" : ""
|
|
|
+export const GET = handle;
|
|
|
+export const POST = handle;
|
|
|
+
|
|
|
+export const runtime = "edge";
|
|
|
+export const preferredRegion = [
|
|
|
+ "bom1",
|
|
|
+ "cle1",
|
|
|
+ "cpt1",
|
|
|
+ "gru1",
|
|
|
+ "hnd1",
|
|
|
+ "iad1",
|
|
|
+ "icn1",
|
|
|
+ "kix1",
|
|
|
+ "pdx1",
|
|
|
+ "sfo1",
|
|
|
+ "sin1",
|
|
|
+ "syd1",
|
|
|
+];
|
|
|
+
|
|
|
+async function request(req: NextRequest, apiKey: string) {
|
|
|
+ const controller = new AbortController();
|
|
|
+
|
|
|
+ let baseUrl = serverConfig.googleUrl || GEMINI_BASE_URL;
|
|
|
+
|
|
|
+ let path = `${req.nextUrl.pathname}`.replaceAll(ApiPath.Google, "");
|
|
|
+
|
|
|
+ if (!baseUrl.startsWith("http")) {
|
|
|
+ baseUrl = `https://${baseUrl}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (baseUrl.endsWith("/")) {
|
|
|
+ baseUrl = baseUrl.slice(0, -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log("[Proxy] ", path);
|
|
|
+ console.log("[Base Url]", baseUrl);
|
|
|
+
|
|
|
+ const timeoutId = setTimeout(
|
|
|
+ () => {
|
|
|
+ controller.abort();
|
|
|
+ },
|
|
|
+ 10 * 60 * 1000,
|
|
|
+ );
|
|
|
+ const fetchUrl = `${baseUrl}${path}?key=${apiKey}${
|
|
|
+ req?.nextUrl?.searchParams?.get("alt") === "sse" ? "&alt=sse" : ""
|
|
|
}`;
|
|
|
+
|
|
|
+ console.log("[Fetch Url] ", fetchUrl);
|
|
|
const fetchOptions: RequestInit = {
|
|
|
headers: {
|
|
|
"Content-Type": "application/json",
|
|
|
@@ -97,22 +132,3 @@ async function handle(
|
|
|
clearTimeout(timeoutId);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-export const GET = handle;
|
|
|
-export const POST = handle;
|
|
|
-
|
|
|
-export const runtime = "edge";
|
|
|
-export const preferredRegion = [
|
|
|
- "bom1",
|
|
|
- "cle1",
|
|
|
- "cpt1",
|
|
|
- "gru1",
|
|
|
- "hnd1",
|
|
|
- "iad1",
|
|
|
- "icn1",
|
|
|
- "kix1",
|
|
|
- "pdx1",
|
|
|
- "sfo1",
|
|
|
- "sin1",
|
|
|
- "syd1",
|
|
|
-];
|