@just-every/ensemble
Version:
LLM provider abstraction layer with unified streaming interface
164 lines • 6.76 kB
JavaScript
export async function ensembleResult(stream) {
const result = {
message: '',
completed: false,
startTime: new Date(),
messageIds: new Set(),
};
const messageDeltas = new Map();
const thinkingDeltas = new Map();
const toolCalls = new Map();
const files = [];
const responseOutputs = [];
try {
for await (const event of stream) {
switch (event.type) {
case 'message_start': {
const msgEvent = event;
if (msgEvent.message_id) {
result.messageIds.add(msgEvent.message_id);
messageDeltas.set(msgEvent.message_id, []);
if (msgEvent.thinking_content || msgEvent.thinking_signature) {
thinkingDeltas.set(msgEvent.message_id, {
content: [],
signature: [],
});
}
}
break;
}
case 'message_delta': {
const msgEvent = event;
if (msgEvent.message_id && messageDeltas.has(msgEvent.message_id)) {
messageDeltas.get(msgEvent.message_id).push(msgEvent.content);
}
if (msgEvent.thinking_content && msgEvent.message_id && thinkingDeltas.has(msgEvent.message_id)) {
thinkingDeltas.get(msgEvent.message_id).content.push(msgEvent.thinking_content);
}
if (msgEvent.thinking_signature && msgEvent.message_id && thinkingDeltas.has(msgEvent.message_id)) {
thinkingDeltas.get(msgEvent.message_id).signature?.push(msgEvent.thinking_signature);
}
break;
}
case 'message_complete': {
const msgEvent = event;
if (msgEvent.message_id) {
if (msgEvent.content) {
result.message = msgEvent.content;
}
else if (messageDeltas.has(msgEvent.message_id)) {
const deltas = messageDeltas.get(msgEvent.message_id);
result.message = deltas.join('');
}
if (thinkingDeltas.has(msgEvent.message_id)) {
const thinking = thinkingDeltas.get(msgEvent.message_id);
result.thinking = {
content: msgEvent.thinking_content || thinking.content.join(''),
signature: msgEvent.thinking_signature ||
(thinking.signature?.length ? thinking.signature.join('') : undefined),
};
}
}
break;
}
case 'file_start':
case 'file_delta':
case 'file_complete': {
const fileEvent = event;
if (event.type === 'file_complete') {
files.push({
mime_type: fileEvent.mime_type,
data: fileEvent.data,
data_format: fileEvent.data_format,
});
}
break;
}
case 'tool_start': {
const toolEvent = event;
const callId = toolEvent.tool_call.call_id || toolEvent.tool_call.id;
toolCalls.set(callId, {
toolCall: toolEvent.tool_call,
id: toolEvent.tool_call.id,
call_id: callId,
});
break;
}
case 'tool_done': {
const toolEvent = event;
if (toolEvent.result) {
const existing = toolCalls.get(toolEvent.result.call_id);
if (existing) {
existing.output = toolEvent.result.output;
existing.error = toolEvent.result.error;
}
}
break;
}
case 'cost_update': {
const costEvent = event;
result.cost = {
input_tokens: costEvent.usage.input_tokens,
output_tokens: costEvent.usage.output_tokens,
total_tokens: costEvent.usage.total_tokens,
cached_tokens: costEvent.usage.cached_tokens,
thought_delay: costEvent.thought_delay,
};
break;
}
case 'error': {
const errorEvent = event;
result.error = errorEvent.error;
break;
}
case 'response_output': {
const outputEvent = event;
responseOutputs.push(outputEvent.message);
break;
}
case 'agent_start':
case 'agent_status':
case 'agent_done': {
const agentEvent = event;
result.agent = agentEvent.agent;
break;
}
case 'stream_end': {
result.completed = true;
break;
}
}
}
if (!result.message && messageDeltas.size > 0) {
const allDeltas = [];
for (const deltas of messageDeltas.values()) {
allDeltas.push(...deltas);
}
result.message = allDeltas.join('');
}
if (toolCalls.size > 0) {
result.tools = {
calls: Array.from(toolCalls.values()),
totalCalls: toolCalls.size,
};
}
if (files.length > 0) {
result.files = files;
}
if (responseOutputs.length > 0) {
result.responseOutputs = responseOutputs;
}
if (!result.error && !result.completed) {
result.completed = true;
}
}
catch (error) {
result.error = error instanceof Error ? error.message : String(error);
result.completed = false;
}
finally {
result.endTime = new Date();
}
return result;
}
//# sourceMappingURL=ensemble_result.js.map