Verify exact production traces and record rollout
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import { randomUUID } from "node:crypto";
|
||||
import type { AnswerBlock, AnswerPlan, Citation, SendMessageResponse } from "@duoc-thu/shared-types";
|
||||
|
||||
export const runtime = "nodejs";
|
||||
@@ -211,7 +212,13 @@ export async function POST(request: Request) {
|
||||
return NextResponse.json({ error: "conversation_id_too_long" }, { status: 400 });
|
||||
}
|
||||
|
||||
const correlationId = `req-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
||||
const incomingCorrelationId = request.headers.get("x-correlation-id")?.trim();
|
||||
const correlationId =
|
||||
incomingCorrelationId && /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/.test(incomingCorrelationId)
|
||||
? incomingCorrelationId
|
||||
: randomUUID();
|
||||
let responseCorrelationId = correlationId;
|
||||
let responseTraceId: string | null = null;
|
||||
|
||||
let rag: RagResponse;
|
||||
try {
|
||||
@@ -219,13 +226,19 @@ export async function POST(request: Request) {
|
||||
? API_GATEWAY_URL
|
||||
: `${API_GATEWAY_URL}/v1/rag/query`;
|
||||
|
||||
const upstreamHeaders: Record<string, string> = {
|
||||
"Content-Type": "application/json",
|
||||
"X-Correlation-ID": correlationId,
|
||||
"X-Client-Version": "1.0.0",
|
||||
};
|
||||
const traceparent = request.headers.get("traceparent");
|
||||
const tracestate = request.headers.get("tracestate");
|
||||
if (traceparent) upstreamHeaders.traceparent = traceparent;
|
||||
if (tracestate) upstreamHeaders.tracestate = tracestate;
|
||||
|
||||
const upstream = await fetch(targetUrl, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"X-Correlation-ID": correlationId,
|
||||
"X-Client-Version": "1.0.0",
|
||||
},
|
||||
headers: upstreamHeaders,
|
||||
body: JSON.stringify({
|
||||
query: content,
|
||||
subject_scope: "human",
|
||||
@@ -238,6 +251,8 @@ export async function POST(request: Request) {
|
||||
// prevents the BFF itself from keeping an orphaned HTTP request open.
|
||||
signal: request.signal,
|
||||
});
|
||||
responseCorrelationId = upstream.headers.get("x-correlation-id") ?? correlationId;
|
||||
responseTraceId = upstream.headers.get("x-trace-id");
|
||||
if (!upstream.ok) {
|
||||
rag = {
|
||||
trace_id: `fallback-${Date.now()}`,
|
||||
@@ -296,12 +311,15 @@ export async function POST(request: Request) {
|
||||
answerPlan: rag.answer_plan ? toAnswerPlan(rag.answer_plan) : undefined,
|
||||
};
|
||||
|
||||
const responseHeaders = new Headers({
|
||||
"X-Correlation-ID": responseCorrelationId,
|
||||
});
|
||||
if (responseTraceId) responseHeaders.set("X-Trace-ID", responseTraceId);
|
||||
|
||||
return NextResponse.json(
|
||||
{ message, sessionId: conversationId ?? undefined } satisfies SendMessageResponse,
|
||||
{
|
||||
headers: {
|
||||
"X-Correlation-ID": correlationId,
|
||||
},
|
||||
headers: responseHeaders,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user