Skip to main content

Streaming

CascadeAgent supports streaming via streamEvents() and stream() async iterators.

streamEvents()

import { CascadeAgent, StreamEventType } from '@cascadeflow/core';

const agent = new CascadeAgent({ models: [...] });

for await (const event of agent.streamEvents('Explain TypeScript')) {
  switch (event.type) {
    case StreamEventType.ROUTING:
      console.log(`Routing: ${event.data.strategy}`);
      break;
    case StreamEventType.CHUNK:
      process.stdout.write(event.content);
      break;
    case StreamEventType.DRAFT_DECISION:
      console.log(`Draft ${event.data.accepted ? 'accepted' : 'rejected'}`);
      break;
    case StreamEventType.COMPLETE:
      console.log(`\nModel: ${event.data.model}, Cost: $${event.data.cost}`);
      break;
  }
}

StreamEvent

interface StreamEvent {
  type: StreamEventType;
  content: string;
  data: StreamEventData;
}
FieldTypeDescription
typeStreamEventTypeEvent type
contentstringContent chunk (for CHUNK events)
dataStreamEventDataEvent metadata

StreamEventType

ValueDescription
ROUTINGRouting decision made
CHUNKContent chunk received
DRAFT_DECISIONDraft quality validation result
SWITCHSwitching from drafter to verifier
COMPLETEStreaming complete
ERRORError occurred

StreamEventData

FieldTypeDescription
modelstringCurrent model name
phasestringCurrent phase ("draft" or "verify")
strategystringRouting strategy used
acceptedbooleanWhether draft was accepted (on DRAFT_DECISION)
costnumberRunning cost (on COMPLETE)

StreamEventsOptions

Same as RunOptions — all parameters from agent.run() are accepted.
for await (const event of agent.streamEvents('Query', {
  maxTokens: 500,
  temperature: 0.7,
  systemPrompt: 'You are a helpful assistant.',
})) {
  // ...
}