agents
Version:
A home for your AI agents
99 lines (98 loc) • 3.09 kB
JavaScript
//#region src/experimental/channels/apply-chunks.ts
/** Apply a response's chunks to the message it builds or extends. */
function applyChunks(message, chunks) {
const parts = message.parts.map((part) => ({ ...part }));
let metadata = message.metadata;
const open = /* @__PURE__ */ new Map();
const toolPart = (toolCallId) => parts.find((part) => part.type === "tool" && part.toolCallId === toolCallId);
for (const chunk of chunks) switch (chunk.type) {
case "text-start":
case "reasoning-start": {
const kind = chunk.type === "text-start" ? "text" : "reasoning";
const part = {
type: kind,
text: "",
...chunk.providerMetadata !== void 0 && { providerMetadata: chunk.providerMetadata }
};
open.set(`${kind}:${chunk.id}`, part);
parts.push(part);
break;
}
case "text-delta":
case "reasoning-delta": {
const kind = chunk.type === "text-delta" ? "text" : "reasoning";
const part = open.get(`${kind}:${chunk.id}`);
if (part) part.text += chunk.delta;
break;
}
case "text-end":
case "reasoning-end": {
const key = `${chunk.type.split("-")[0]}:${chunk.id}`;
const part = open.get(key);
if (part && chunk.providerMetadata !== void 0) part.providerMetadata = {
...part.providerMetadata,
...chunk.providerMetadata
};
open.delete(key);
break;
}
case "tool-input-start":
case "tool-input-available":
case "tool-input-error": {
const { type, ...call } = chunk;
const existing = toolPart(chunk.toolCallId);
const next = {
...existing,
...call,
type: "tool",
state: type === "tool-input-start" ? "input-streaming" : type === "tool-input-available" ? "input-available" : "output-error"
};
if (existing) parts[parts.indexOf(existing)] = next;
else parts.push(next);
break;
}
case "tool-input-delta": break;
case "tool-approval-request":
case "tool-output-available":
case "tool-output-error":
case "tool-output-denied": {
const part = toolPart(chunk.toolCallId);
if (!part) break;
if (chunk.type === "tool-approval-request") {
part.state = "approval-requested";
part.approval = { id: chunk.approvalId };
} else if (chunk.type === "tool-output-available") {
part.state = "output-available";
part.output = chunk.output;
part.preliminary = chunk.preliminary;
} else if (chunk.type === "tool-output-error") {
part.state = "output-error";
part.errorText = chunk.errorText;
} else part.state = "output-denied";
break;
}
case "data": {
if (chunk.transient) break;
const { transient: _transient, ...part } = chunk;
const index = parts.findIndex((p) => p.type === "data" && p.name === chunk.name && p.id !== void 0 && p.id === chunk.id);
if (index === -1) parts.push(part);
else parts[index] = part;
break;
}
case "metadata":
metadata = {
...metadata,
...chunk.metadata
};
break;
default: parts.push(chunk);
}
return {
...message,
parts,
...metadata && { metadata }
};
}
//#endregion
export { applyChunks as t };
//# sourceMappingURL=apply-chunks-1FheRb9W.js.map