@ai2070/l0
Version:
L0: The Missing Reliability Substrate for AI
116 lines • 3.98 kB
JavaScript
export async function* wrapVercelAIStream(streamResult, options = {}) {
const { includeUsage = true, includeToolCalls = true } = options;
try {
const fullStream = streamResult.fullStream;
const reader = fullStream.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
if (!value)
continue;
const chunk = value;
switch (chunk.type) {
case "text-delta":
yield {
type: "token",
value: chunk.text,
timestamp: Date.now(),
};
break;
case "tool-call":
if (includeToolCalls) {
yield {
type: "message",
value: JSON.stringify({
type: "tool_call",
id: chunk.toolCallId,
name: chunk.toolName,
arguments: chunk.input,
}),
role: "assistant",
timestamp: Date.now(),
};
}
break;
case "tool-input-start":
break;
case "tool-input-delta":
break;
case "tool-result":
if (includeToolCalls) {
yield {
type: "message",
value: JSON.stringify({
type: "tool_result",
id: chunk.toolCallId,
name: chunk.toolName,
result: chunk.output,
}),
role: "tool",
timestamp: Date.now(),
};
}
break;
case "finish": {
let usage;
if (includeUsage) {
try {
usage = await streamResult.usage;
}
catch {
}
}
yield {
type: "complete",
timestamp: Date.now(),
...(includeUsage && usage ? { usage } : {}),
...(chunk.finishReason ? { finishReason: chunk.finishReason } : {}),
};
break;
}
case "error":
yield {
type: "error",
error: chunk.error instanceof Error
? chunk.error
: new Error(String(chunk.error)),
timestamp: Date.now(),
};
break;
}
}
}
catch (error) {
yield {
type: "error",
error: error instanceof Error ? error : new Error(String(error)),
timestamp: Date.now(),
};
}
}
export function isVercelAIStream(obj) {
if (!obj || typeof obj !== "object") {
return false;
}
const stream = obj;
return ("textStream" in stream &&
"fullStream" in stream &&
"text" in stream &&
"toolCalls" in stream &&
"usage" in stream &&
"finishReason" in stream);
}
export const vercelAIAdapter = {
name: "vercel-ai",
detect: isVercelAIStream,
wrap: wrapVercelAIStream,
};
import { registerAdapter } from "./registry";
try {
registerAdapter(vercelAIAdapter, { silent: true });
}
catch {
}
//# sourceMappingURL=vercel-ai.js.map