Streaming

The askStream() method returns an async iterable that yields events as the AI generates a response.

Streaming Visualiser

Raw SSE Events

Click Play to start streaming...

Rendered Output

Output will appear here...

Event Types

EventFieldsDescription
startthreadIdStream has started, thread ID assigned
texttextIncremental text chunk of the answer
thinkingtextAI reasoning/thinking text (optional)
finishthreadId, answer, citations, citedDocuments, followUpSuggestionsFinal complete response with all metadata
errormessageAn error occurred during streaming

Basic Usage

const stream = client.askStream({
  buildingId: 'bld-789',
  query: 'What fire safety documents are available?',
});

let fullAnswer = '';

for await (const event of stream) {
  switch (event.event) {
    case 'start':
      console.log('Thread:', event.threadId);
      break;
    case 'text':
      fullAnswer += event.text;
      process.stdout.write(event.text);
      break;
    case 'finish':
      console.log('\nCitations:', Object.keys(event.citations).length);
      console.log('Follow-ups:', event.followUpSuggestions);
      break;
    case 'error':
      console.error('Error:', event.message);
      break;
  }
}

Aborting a Stream

Call abort() to cancel an in-flight stream:

const stream = client.askStream({ buildingId: 'bld-789', query: '...' });

// Abort after 5 seconds
setTimeout(() => stream.abort(), 5000);

try {
  for await (const event of stream) {
    // Process events...
  }
} catch (err) {
  if (err instanceof StreamAbortedError) {
    console.log('Stream was cancelled');
  }
}

Under the Hood

The SDK uses fetch() with a POST request and parses the Server-Sent Events (SSE) response using a built-in parser. No external dependencies are required. The wire format uses snake_case, but the SDK automatically converts to camelCase for idiomatic TypeScript.