Ir al contenido

Streaming en TypeScript

ai-lib-ts ofrece soporte orientado al streaming con Server-Sent Events (SSE) y eventos de streaming tipados.

import { AiClient, Message } from '@ailib-official/ai-lib-ts';
const client = await AiClient.new('openai/gpt-4o');
const stream = client
.chat([Message.user('Tell me a story')])
.stream()
.executeStream();
for await (const event of stream) {
if (event.event_type === 'PartialContentDelta') {
process.stdout.write(event.content);
}
}
EventoDescripciónCampos clave
PartialContentDeltaTexto incrementalcontent
ToolCallStartedLlamada a herramienta iniciadatoolCallId, name
PartialToolCallArgumentos de herramienta incrementalestoolCallId, arguments
StreamEndFlujo completadofinishReason
import { StreamingEvent } from '@ailib-official/ai-lib-ts';
for await (const event of stream) {
switch (event.event_type) {
case 'PartialContentDelta':
process.stdout.write(event.content);
break;
case 'ToolCallStarted':
console.log(`\nCalling tool: ${event.name}`);
break;
case 'PartialToolCall':
process.stdout.write(event.arguments);
break;
case 'StreamEnd':
console.log(`\nFinished: ${event.finishReason}`);
break;
}
}
const { stream, cancelHandle } = client
.chat([Message.user('Write a very long story...')])
.stream()
.executeStreamWithCancel();
// Set a timeout to cancel after 10 seconds
setTimeout(() => {
cancelHandle.cancel();
console.log('Stream cancelled');
}, 10000);
for await (const event of stream) {
if (event.event_type === 'PartialContentDelta') {
process.stdout.write(event.content);
}
}

El pipeline de streaming procesa eventos en etapas:

SSE Stream → Decoder → Selector → EventMapper → Emitter

Analiza datos SSE en bruto en eventos estructurados:

// Automatically selects decoder based on provider
// OpenAI format, Anthropic format, etc.

Filtra eventos por tipo:

// Only content events
// Only tool events
// All events

Transforma eventos específicos del proveedor a tipos estándar:

// Provider format → Standard StreamingEvent
import { Pipeline, HttpTransport } from '@ailib-official/ai-lib-ts';
const pipeline = Pipeline.fromManifest(manifest);
const stream = transport.executeStream(request);
for await (const event of stream) {
const mapped = pipeline.map(event);
// Handle mapped event
}
const controller = new AbortController();
// Cancel after 5 seconds
setTimeout(() => controller.abort(), 5000);
const stream = client
.chat([Message.user('Long task')])
.stream()
.executeStream({ signal: controller.signal });
  1. Siempre maneje errores en los flujos
try {
for await (const event of stream) {
// Handle event
}
} catch (e) {
console.error('Stream error:', e);
}
  1. Use la cancelación para paradas iniciadas por el usuario
// UI: user clicks "Stop" button
cancelHandle.cancel();
  1. Acumule en búfer para limitar la tasa
let buffer = '';
for await (const event of stream) {
if (event.event_type === 'PartialContentDelta') {
buffer += event.content;
}
}