コンテンツにスキップ

ストリーミング

ストリーミングにより、LLMが生成するにつれてトークンごとにレスポンスを送信できます。ユーザーは完全なレスポンスを待つことなく、テキストがリアルタイムで表示されるのを確認できます。

StreamSession API

agent.stream()でストリームを開始します:

interface StreamSession {
delta(chunk: string): Promise<void>; // チャンクを送信
done(finalPayload: SendPayload): Promise<void>; // ストリームを完了
abort(): void; // ストリームをキャンセル
}

基本的な使い方

const session = agent.stream(conversationId);
// SDKが冪等性キー付きのstream.startフレームを送信
for await (const chunk of llmStream) {
await session.delta(chunk);
// 各deltaは個別に暗号化されて送信
}
await session.done({
type: "text",
content: fullText,
});
// SDKが永続化のための完全な暗号化ペイロード付きstream.doneを送信

OpenAIとの連携

agent.onMessage(async (msg) => {
const session = agent.stream(msg.conversation_id);
const stream = await openai.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: msg.content }],
stream: true,
});
let fullText = "";
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content ?? "";
if (delta) {
fullText += delta;
await session.delta(delta);
}
}
await session.done({
type: "text",
content: fullText,
});
});

ストリームの中断

ユーザーが新しいメッセージを送信した場合やエラーが発生した場合にストリームをキャンセルします:

session.abort();
// SDKがstream.abortフレームを送信し、クライアントは部分的なコンテンツを破棄

暗号化

deltaフレームは個別に暗号化されます。つまり、各チャンクは自己完結した暗号化ペイロードです。最終的なdoneフレームはサーバー側の永続化のための完全な暗号化メッセージを運びます。

制限

制約
最大ストリーム時間5分
孤立検出タイムアウト30秒(deltaなし)
大規模グループ(201〜500メンバー)ストリーミング無効

サーバーがストリームタイムアウトを検出すると、stream.errorフレームを送信します。SDKはセッションを中断し、onEventを通じてエラーを発行します。再開するかどうかはエージェントが判断します。

次のステップ