feat(agent): stream admin debug preview

This commit is contained in:
2026-07-17 13:47:05 +08:00
parent 13fed0467a
commit bfaf2ebf67
11 changed files with 620 additions and 75 deletions

View File

@@ -2,6 +2,7 @@ import type {
AdminProfile,
AdminUser,
AgentDebugResult,
AgentDebugStreamComplete,
AgentGenerationConfig,
AgentRuntimeConfig,
AiLogRecord,
@@ -217,3 +218,48 @@ export const api = {
clearFeishuCache: () =>
request<{ cleared: number; message: string }>("/admin/feishu/cache/clear", { method: "POST", body: "{}" }),
};
export async function streamDebugAgent(
payload: Record<string, unknown>,
onChunk: (chunk: string) => void,
onComplete: (result: AgentDebugStreamComplete) => void,
signal?: AbortSignal,
) {
const token = getToken();
const response = await fetch(`${API_BASE}/admin/agent/debug/stream`, {
method: "POST",
headers: {
"Content-Type": "application/json",
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: JSON.stringify(payload),
signal,
});
if (!response.ok || !response.body) {
const body = await readApiResponse<unknown>(response);
throw new Error(body.detail || body.message || "Agent 调试连接失败");
}
const reader = response.body.getReader();
const decoder = new TextDecoder("utf-8");
let buffer = "";
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const events = buffer.split(/\r?\n\r?\n/);
buffer = events.pop() ?? "";
for (const event of events) {
const dataLines = event.split(/\r?\n/).filter((line) => line.startsWith("data:"));
if (!dataLines.length) continue;
const data = dataLines.map((line) => line.slice(5).trimStart()).join("\n").trim();
if (data === "[DONE]") return;
const parsed = JSON.parse(data) as AgentDebugStreamComplete & {
type?: string;
content?: string;
};
if (parsed.type === "error") throw new Error(parsed.message || "Agent 调试失败");
if (parsed.type === "content" && parsed.content) onChunk(parsed.content);
if (parsed.type === "complete") onComplete(parsed);
}
}
}