59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { NextRequest } from "next/server";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
export const runtime = "nodejs";
|
|
|
|
const AGENT_BACKEND_BASE_URL =
|
|
process.env.AGENT_API_INTERNAL_BASE_URL ??
|
|
process.env.NEXT_PUBLIC_AGENT_API_BASE_URL ??
|
|
"http://127.0.0.1:8787";
|
|
|
|
type RouteContext = {
|
|
params: Promise<{ path?: string[] }>;
|
|
};
|
|
|
|
export async function GET(request: NextRequest, context: RouteContext) {
|
|
return proxyAgentRequest(request, context);
|
|
}
|
|
|
|
export async function POST(request: NextRequest, context: RouteContext) {
|
|
return proxyAgentRequest(request, context);
|
|
}
|
|
|
|
export async function PATCH(request: NextRequest, context: RouteContext) {
|
|
return proxyAgentRequest(request, context);
|
|
}
|
|
|
|
export async function DELETE(request: NextRequest, context: RouteContext) {
|
|
return proxyAgentRequest(request, context);
|
|
}
|
|
|
|
async function proxyAgentRequest(request: NextRequest, context: RouteContext) {
|
|
const { path = [] } = await context.params;
|
|
const upstreamUrl = new URL(`/api/v1/agent/chat/${path.map(encodeURIComponent).join("/")}`, AGENT_BACKEND_BASE_URL);
|
|
upstreamUrl.search = request.nextUrl.search;
|
|
|
|
const headers = new Headers(request.headers);
|
|
headers.delete("host");
|
|
headers.delete("content-length");
|
|
|
|
const body = request.method === "GET" || request.method === "HEAD" ? undefined : request.body;
|
|
const upstreamResponse = await fetch(upstreamUrl, {
|
|
method: request.method,
|
|
headers,
|
|
body,
|
|
cache: "no-store",
|
|
duplex: body ? "half" : undefined
|
|
} as RequestInit & { duplex?: "half" });
|
|
|
|
const responseHeaders = new Headers(upstreamResponse.headers);
|
|
responseHeaders.delete("content-encoding");
|
|
responseHeaders.delete("content-length");
|
|
|
|
return new Response(upstreamResponse.body, {
|
|
status: upstreamResponse.status,
|
|
statusText: upstreamResponse.statusText,
|
|
headers: responseHeaders
|
|
});
|
|
}
|