assistant-stream
Version:
Streaming utilities for AI assistants
56 lines (48 loc) • 1.61 kB
text/typescript
import type { AssistantStream } from "../AssistantStream";
import type { AssistantMessage } from "../utils/types";
import { asAsyncIterableStream } from "../../utils/AsyncIterableStream";
import { AssistantMessageAccumulator } from "./assistant-message-accumulator";
export class AssistantMessageStream {
public readonly readable: ReadableStream<AssistantMessage>;
constructor(readable: ReadableStream<AssistantMessage>) {
this.readable = readable;
}
static fromAssistantStream(stream: AssistantStream) {
return new AssistantMessageStream(
stream.pipeThrough(new AssistantMessageAccumulator()),
);
}
/** @deprecated Experimental since 2025-01-14. Not scheduled for removal; the API may change in any release. */
async unstable_result(): Promise<AssistantMessage> {
let last: AssistantMessage | undefined;
for await (const chunk of this) {
last = chunk;
}
if (!last) {
return {
role: "assistant",
status: { type: "complete", reason: "unknown" },
parts: [],
content: [],
metadata: {
unstable_state: null,
unstable_data: [],
unstable_annotations: [],
steps: [],
custom: {},
},
};
}
return last;
}
[Symbol.asyncIterator]() {
return asAsyncIterableStream(this.readable)[Symbol.asyncIterator]();
}
tee(): [AssistantMessageStream, AssistantMessageStream] {
const [readable1, readable2] = this.readable.tee();
return [
new AssistantMessageStream(readable1),
new AssistantMessageStream(readable2),
];
}
}