会話の正規化と送信制御
会話の正規化と送信制御
Section titled “会話の正規化と送信制御”@alneas/ai-core/ai-chat(または末尾の/conversation、/session)から利用できます。
React・AI SDK・ストレージ・プロバイダーSDKは不要です。
import { normalizeAIChatMessages, streamAIChat } from '@alneas/ai-core/ai-chat';const messages = normalizeAIChatMessages([ { id: 'user-1', role: 'user', parts: [{ type: 'text', text: 'こんにちは' }] },]);for await (const event of streamAIChat(adapter, { messages, signal })) { // 利用側で表示や処理へ渡します。}adapterはAIChatAdapterの実装です。createOpenAIChatAdapter / createVercelAIChatAdapter または独自実装を指定します。signalは任意のAbortSignalです。VercelアダプターはHTTP プロトコルを解析するもので、npmのai SDKをimportしません。接続先・認証情報は利用側で 設定します。
履歴は順序・空でないID・role(system/user/assistant/tool)・text/file/tool-call/ tool-result/dataの各partとJSONメタデータを保持します。tool roleにはtool-resultだけを 許容します。履歴の追加・間引き、ツール呼出と結果の全履歴での対応付け、認可、実行は しません。必須項目の不足や非JSON値はアダプター開始前に拒否します。未知のJSON項目は 保持します。URL/mediaTypeは空でない文字列かを確認するだけなので、ファイルや表示URLの 安全性は利用側で判定してください。
新しい配列に、元データから切り離した再帰的freeze済みの要素を返します。履歴全体の上限は 深さ64・訪問値10,000個・直列化したJavaScript UTF-16コード単位1,000,000です。 アクセサー・循環・undefinedプロパティ・非有限数・JSON以外のオブジェクトは拒否します。 黙って切り詰めません。受信イベントにも同じJSON制約とイベント形式検証を適用します。
createAIChatStreamは呼び出し時にリクエストをスナップショット化し、最初のreadで アダプターを開始します。streamAIChatは非同期イテレーター版で、最初の反復時に スナップショット化します。tools/parametersも切り離して保持します。finishイベントの後に EOFが必要です。finishなしの終了・finish後のイベントは失敗です。maxResponseCharsは 既定1,000,000、設定範囲1〜10,000,000です。正規化イベントの直列化文字数の合計であり、 通信バイト数ではありません。各イベントのJSON上限も別途適用されます。HTTPアダプターは 受信プロトコルにも上限を適用します。ネットワーク・サーバー側の制限も設定してください。
親signalのabort・reader.cancel・検証失敗・反復の途中終了では、アダプターへ渡すsignalを abortし、イテレーターの後始末を要求します。中断に従わないnextが待機中でもreadは速やかに 終了します。その場合returnの完了は待たず、後から後始末が完了することがあります。 実際のネットワーク処理を停止するにはアダプターがAbortSignalに従う必要があります。 利用側は最後まで読むかcancelしてください。自動再試行・再開・履歴保存・ブラウザーイベント 購読・ツールの自動実行は提供しません。
AI SDK 7のUIMessage/ChatTransportとの接続は任意入口の
@alneas/react-ai/ai-chatです。SDK固有の変換はそちら、共通の検証と送信制御はai-core、
ブラウザー保存はUI側が担当します。