@copilotkit/runtime
Version:
<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />
141 lines (139 loc) • 4.26 kB
JavaScript
require("reflect-metadata");
const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
let _copilotkit_shared = require("@copilotkit/shared");
//#region src/v2/runtime/core/middleware-sse-parser.ts
/**
* Parse a cloned SSE Response body into structured messages.
* Returns empty results for non-SSE responses.
*/
async function parseSSEResponse(response) {
if (!(response.headers.get("content-type") ?? "").includes("text/event-stream")) return { messages: [] };
let text;
try {
text = await response.text();
} catch {
_copilotkit_shared.logger.warn("Failed to read SSE response body in afterRequestMiddleware");
return { messages: [] };
}
if (!text.trim()) return { messages: [] };
let threadId;
let runId;
const messagesById = /* @__PURE__ */ new Map();
const toolCallsById = /* @__PURE__ */ new Map();
const toolCallParent = /* @__PURE__ */ new Map();
let snapshotMessages;
for (const line of text.split("\n")) {
const trimmed = line.trim();
if (!trimmed.startsWith("data:")) continue;
let event;
try {
event = JSON.parse(trimmed.slice(5).trim());
} catch {
continue;
}
switch (event.type) {
case "RUN_STARTED":
threadId = event.threadId;
runId = event.runId;
break;
case "MESSAGES_SNAPSHOT":
if (Array.isArray(event.messages)) snapshotMessages = event.messages;
break;
case "TEXT_MESSAGE_START":
messagesById.set(event.messageId, {
id: event.messageId,
role: event.role ?? "assistant",
content: ""
});
break;
case "TEXT_MESSAGE_CONTENT": {
const msg = messagesById.get(event.messageId);
if (msg) msg.content = (msg.content ?? "") + (event.delta ?? "");
break;
}
case "TEXT_MESSAGE_CHUNK":
if (event.messageId) {
const existing = messagesById.get(event.messageId);
if (existing) existing.content = (existing.content ?? "") + (event.delta ?? "");
else messagesById.set(event.messageId, {
id: event.messageId,
role: event.role ?? "assistant",
content: event.delta ?? ""
});
}
break;
case "TOOL_CALL_START": {
const tc = {
id: event.toolCallId,
name: event.toolCallName,
args: ""
};
toolCallsById.set(event.toolCallId, tc);
if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
break;
}
case "TOOL_CALL_ARGS": {
const tc = toolCallsById.get(event.toolCallId);
if (tc) tc.args += event.delta ?? "";
break;
}
case "TOOL_CALL_CHUNK":
if (event.toolCallId) {
let tc = toolCallsById.get(event.toolCallId);
if (!tc) {
tc = {
id: event.toolCallId,
name: event.toolCallName ?? "",
args: ""
};
toolCallsById.set(event.toolCallId, tc);
if (event.parentMessageId) toolCallParent.set(event.toolCallId, event.parentMessageId);
}
if (event.toolCallName) tc.name = event.toolCallName;
tc.args += event.delta ?? "";
}
break;
case "TOOL_CALL_END": {
const tc = toolCallsById.get(event.toolCallId);
const parentId = toolCallParent.get(event.toolCallId);
if (tc && parentId) {
const parent = messagesById.get(parentId);
if (parent) {
parent.toolCalls = parent.toolCalls ?? [];
parent.toolCalls.push(tc);
}
}
break;
}
case "TOOL_CALL_RESULT": {
let resultContent = event.content;
if (Array.isArray(resultContent)) resultContent = resultContent.filter((part) => part && typeof part.text === "string").map((part) => part.text).join("");
messagesById.set(event.messageId, {
id: event.messageId,
role: "tool",
content: resultContent,
toolCallId: event.toolCallId
});
break;
}
}
}
for (const [toolCallId, tc] of toolCallsById) {
const parentId = toolCallParent.get(toolCallId);
if (!parentId) continue;
const parent = messagesById.get(parentId);
if (!parent) continue;
if (!parent.toolCalls?.some((t) => t.id === tc.id)) {
parent.toolCalls = parent.toolCalls ?? [];
parent.toolCalls.push(tc);
}
}
return {
messages: snapshotMessages ?? [...messagesById.values()],
threadId,
runId
};
}
//#endregion
exports.parseSSEResponse = parseSSEResponse;
//# sourceMappingURL=middleware-sse-parser.cjs.map