Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Sub-agents stream `assistant.reasoning_delta` but never emit the `assistant.reasoning` close event documented as always-sent

オープン
#1,402 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
45/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
静か
技術スタック
javascript, python
領域
api, devtools

調査の方向性

sdk/index.js の createAgentCallbackBridge (~L4554) 付近から始め、~L4541 付近の main-agent パスと比較してください。session-events.schema.json の 520-522 行目と README の契約を確認し、sub-agents が対応する assistant.reasoning イベントを発行すべきか、assistant.message の形式を文書化すべきかを判断してください。選択した動作が一貫して実装され、記載された reasoningId イベントシーケンスに対して検証されれば完了です。

索引モデルが issue の本文から書いたものです。

説明

bug

Summary

Per the Python SDK README:

Note: assistant.message and assistant.reasoning (final events) are always sent regardless of streaming setting.

And per the schema docstring on AssistantReasoningDeltaData.reasoningId (session-events.schema.json line 520-522):

Reasoning block ID this delta belongs to, matching the corresponding assistant.reasoning event.

In practice, sub-agents stream assistant.reasoning_delta events (with agentId set on the event), but the matching assistant.reasoning close is never emitted. Instead the reasoning content lands in the sub-agent's assistant.message.reasoningText / reasoningOpaque fields. Consumers that rely on the documented per-reasoningId close event end up with permanently-orphaned streaming reasoning blocks for every sub-agent turn.

Environment

  • @github/copilot (CLI bundle): 1.0.49
  • github-copilot-sdk (Python): 1.0.0b4
  • Default provider (not BYOK)
  • Reasoning model in use (Claude Opus / Sonnet via the default backend)

What I'd expect (per docs)

For every sub-agent reasoning block: one or more assistant.reasoning_delta events with a given reasoningId, followed by exactly one assistant.reasoning event carrying that same reasoningId and the complete content — symmetric with master-agent reasoning.

What actually happens

Code path (built bundle, sdk/index.js ~ L4554, inside createAgentCallbackBridge):

case "reasoning":
  u.reasoningId && u.deltaContent &&
    this.emitEphemeral("assistant.reasoning_delta",
      { reasoningId: u.reasoningId, deltaContent: u.deltaContent }, r);
// ...later, when the sub-agent's response completes:
this.emit("assistant.message",
  { parentToolCallId: r, messageId: kr(), ..., reasoningOpaque, reasoningText }, r);
// No paired emit("assistant.reasoning", ...) here.

Compare to the main-agent path (sdk/index.js ~ L4541) which does:

this.emit("assistant.message", { ... });
Ho && this.emitEphemeral("assistant.reasoning", { reasoningId: Ho, content: Yi ?? "" });

So the close emit is conditional on the main-agent code path and absent from the sub-agent bridge.

Empirical evidence

Across six debug-mode session JSONL transcripts (~17K reasoning_delta events total) captured from a production run with multiple custom sub-agents (planner, implementer, profiler_agent):

  • Every assistant.reasoning_delta carrying a sub-agent's agentId is never followed by a matching assistant.reasoning.
  • Sub-agent assistant.message events for those same turns do carry non-empty reasoningText (often several KB) and reasoningOpaque, so the data is being retained — it just travels via the message payload instead of the documented close event.
  • The two log files in the same run that contain no sub-agent activity (master-only) have zero orphan reasoning streams. The four files with sub-agent activity have 25 orphan streams collectively. The pattern is deterministic and 1:1 with sub-agent boundaries.

Suggested fixes (either or both)

  1. Behavior fix: also emit assistant.reasoning from the sub-agent bridge after endCurrentStreamingMessage, mirroring the main-agent path. This keeps the documented contract (1:1 reasoning_deltaassistant.reasoning) and matches downstream consumer expectations.
  2. Documentation fix: if the embed-in-assistant.message shape is intentional for sub-agents, document it explicitly on AssistantReasoningDeltaData (e.g. "for sub-agent reasoning, the closing assistant.message event for the same agentId carries the complete content in reasoningText / reasoningOpaque; no separate assistant.reasoning event is emitted") and in the streaming-events guide referenced by #922.

Related: #922 (CLOSED — "Extended thinking/reasoning events not firing for OpenAI and Anthropic models via Copilot SDK"), #1064 (CLOSED — "BYOK Anthropic provider missing multiple session events ... reasoning ..."). Same family of bug but neither covers this specific main-vs-sub-agent asymmetry on the default provider.

Happy to provide the full JSONL fixtures if helpful.

主要言語
Java
スター
10.5k
フォーク
1.5k
平均マージ
1日 9時間
マージ済み PR(30日)
131

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

github/copilot-sdk のほかの issue

github/copilot-sdk の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。