SessionEvent
Copilot からのメッセージはすべてRevolution\Copilot\Types\SessionEvent クラスです。
このクラスは最もよく使うため、Laravel らしい便利機能が追加されています。
content()
AI からの最も重要な応答メッセージを取得します。
__toString() による暗黙の型変換でもメッセージ内容を返します。
Event type の判定
isAssistantMessage(), isUserMessage(), isIdle(), isAssistantMessageDelta() が使えます。
よく使う Event type があれば、さらにヘルパーが追加される場合があります。
is() で任意の EventType を判定できます。
type() は SessionEventType enum の文字列値を返します。
failed() / successful()
イベントタイプが SESSION_ERROR の時は failed() が true になります。
successful() はその逆です。
Laravel の命名に合わせるため、isError() から改名されています。
throw()
Laravel の HTTP API や Process API と同じように、エラーは保持され、throw() で例外を送出できます。
エラーがない場合は何もしないため、次のように書けます。
SESSION_ERROR の場合は Revolution\Copilot\Exceptions\SessionErrorException を送出します。
タイムアウト時は Revolution\Copilot\Exceptions\SessionTimeoutException を送出します。
JSON-RPC のエラーでは Revolution\Copilot\Exceptions\JsonRpcException を送出します。
Conditionable
when() と unless() が使えます。
Dumpable
dump() と dd() が使えます。
Tappable
tap() が使えます。
InteractsWithData
この機能は SessionEvent の$data プロパティにのみ適用されます。
all(), has(), only(), collect() などの使い慣れたヘルパーを使えます。
詳しくは InteractsWithData を参照してください。
SessionEvent の $data は EventType ごとに構造が異なるため、イベントごとの値アクセスに便利です。
content() も内部的に InteractsWithData を使っています。
toArray() / toJson()
SessionEvent 全体を配列または JSON に変換できます。
collect() メソッドはありません。
$data には InteractsWithData の collect() があるためです。
イベント全体をコレクション操作したい場合は Laravel の collect() ヘルパーを使います。
broadcast() / broadcastNow()
Laravel AI SDK の StreamEvent と同じインターフェースでブロードキャストできます。
AI SDK ではストリーミング時に使いますが、SessionEvent では任意の EventType で使えます。
broadcastNow() はキューを経由せずに即時ブロードキャストします。
イベントメタデータ
Copilot CLI 1.0.99 以降、一部のイベントには追加のメタデータが含まれます。 SDK はこれらの値を$data にそのまま保持するため、$event->data や InteractsWithData のヘルパーで参照できます。
Compaction イベント
session.compaction_start と session.compaction_complete の data.compactionAttemptId は、開始イベントと完了イベントを関連付ける ID です。
モデル切り替えを伴う場合は switchTargetModel も含まれます。
切り替え先のプロンプトトークン予算が異なる場合は targetPromptTokenLimit も含まれます。
完了イベントには initialModel、model、outcome、outcomeReason、failureReason、tokenAccountingBasis などが含まれることがあります。
outcome や各理由は将来新しい値が追加される文字列です。
固定の Enum として扱わず、未知の値もそのまま保持してください。
フィールドがない場合は値が提供されていないことを表します。既定値を推測しないでください。
ツール実行の使用量
tool.execution_complete の data.toolUsage は、ランタイムが所有するツール操作についてプロバイダーから報告された使用量です。
会話モデルの assistant.usage とは別の使用量です。
ツール実行が失敗した場合でも、報告済みの使用量が含まれることがあります。
toolUsage.model はツール操作で要求されたモデルであり、会話モデルではありません。
トークン数や課金情報は一部だけ提供されることがあります。
フィールドがない場合は利用不可を意味し、0 トークンを意味しません。
inputTokensDetails と outputTokensDetails のモダリティ別トークン数は、それぞれの合計値に含まれる内訳です。合計値に加算しないでください。
toolUsage.requestId はランタイムが重複配信や再生を排除するための ID であり、上流の課金識別子ではありません。
session.usage_checkpoint と session.shutdown の data.toolUsageRequestIds も、会計スナップショットに含まれたツール操作を識別するランタイム内部の重複排除メタデータです。
上流の課金 ID として扱わないでください。
Fusion 解決イベント
session.fusion_resolved の data.selectedRuleId は、サーバー側のルーティングがローカルのルールとは異なるワークフローを選んだ場合に、そのサーバールールを識別します。
置き換えがない場合は省略されます。
MCP サーバーのツール読み込みイベント
SessionEventType::SESSION_MCP_SERVER_TOOLS_LOADED(session.mcp_server_tools_loaded)は、MCP サーバーのツール一覧が利用可能になったときに発生します。
接続ごとに一度だけ発生する ephemeral イベントで、永続化されません。
data.serverName と data.toolCount を含みます。
MCP サーバーが connected になっただけでは、ツールの読み込み完了を意味しません。
接続状態を離れた後は、次にこのイベントを受け取るまで読み込み中として扱ってください。
キャッシュ済みツールを使う場合、このイベントは connected より先に届くことがあります。
最新情報は GitHub リポジトリ を参照してください。