Files
GEOAgentArticleOptimizer/src/lib/llm/trace-http.ts
T
2026-07-16 12:25:28 +08:00

78 lines
2.2 KiB
TypeScript

import { NextResponse } from "next/server";
import { getLlmTracePayloadStoreFromRuntime } from "./trace-payload-store";
import { getLlmTraceRepositoryFromRuntime } from "./trace-repository";
import type {
LlmTraceCall,
LlmTraceCallPublic,
LlmTraceManifest,
} from "./trace-types";
export function noStoreJson(body: unknown, status = 200) {
return NextResponse.json(body, {
status,
headers: { "cache-control": "no-store" },
});
}
export function noStoreResponse<T extends Response>(response: T): T {
response.headers.set("cache-control", "no-store");
return response;
}
export function toPublicTraceCall(call: LlmTraceCall): LlmTraceCallPublic {
const {
request_object_key: requestObjectKey,
response_object_key: responseObjectKey,
...publicFields
} = call;
return {
...publicFields,
request_available: Boolean(requestObjectKey),
response_available: Boolean(responseObjectKey),
};
}
export async function getTraceManifest(
jobId: string,
): Promise<LlmTraceManifest | null> {
const repository = getLlmTraceRepositoryFromRuntime();
const run = await repository.getRun(jobId);
if (!run) return null;
const calls = await repository.listCalls(jobId);
return { run, calls: calls.map(toPublicTraceCall) };
}
export async function readTracePayload({
jobId,
callId,
kind,
}: {
jobId: string;
callId: string;
kind: "request" | "response";
}) {
const repository = getLlmTraceRepositoryFromRuntime();
const call = (await repository.listCalls(jobId)).find(
(candidate) => candidate.call_id === callId,
);
if (!call) return noStoreJson({ error: "追踪调用不存在" }, 404);
const key = kind === "request"
? call.request_object_key
: call.response_object_key;
if (!key) {
if (kind === "response" && call.status === "started") {
return noStoreJson({ state: "waiting" }, 202);
}
return noStoreJson({
error: kind === "response" ? "该调用未产生响应" : "追踪请求正文不存在",
}, 404);
}
const payload = await getLlmTracePayloadStoreFromRuntime().getJson(key);
return payload == null
? noStoreJson({ error: "追踪正文不存在" }, 404)
: noStoreJson(payload);
}