Describe the bug
When a session delegates work to subagents (the task tool / custom agents), the OTel spans for those subagent model calls omit all billing attributes. The subagent calls consume real AI credits (per the cumulative session display — see #4207, which notes session usage "including usage by the main agent, subagents, and background operations"), but that consumption is invisible to OpenTelemetry, so any external cost accounting built on the documented OTel telemetry (copilot help monitoring) systematically undercounts actual billing.
Main-agent chat spans carry the full billing envelope:
github.copilot.nano_aiu
github.copilot.cost
github.copilot.initiator (user / agent)
github.copilot.interaction_id / github.copilot.turn_id
Subagent model calls emit spans with correct gen_ai.* semconv attributes (gen_ai.operation.name, gen_ai.request.model, gen_ai.usage.input_tokens / output_tokens / cache_read.input_tokens / cache_creation.input_tokens) but carry none of the github.copilot.* billing attributes — no nano_aiu, no cost, not even initiator or an interaction id. This holds at every level:
- The subagent's child
chat spans: no billing attributes.
- The subagent's own nested
invoke_agent span (which does carry gen_ai.agent.name and rolled-up token counts): no billing attributes.
- The session root
invoke_agent span's github.copilot.nano_aiu rollup equals the sum of the main-agent chat spans' nano_aiu exactly — i.e. the subagent spend is not folded in anywhere.
Observed within a single trace from one session (models are our configured custom-agent models; the same holds for built-in task delegation):
| Span |
Model |
gen_ai.usage.input_tokens |
nano_aiu |
cost |
root invoke_agent |
claude-fable-5 |
1,963,612 |
506,956,900,000 |
13 |
main-agent chat × 13 |
claude-fable-5 |
… |
present on every one; sums to exactly 506,956,900,000 |
1 each |
nested invoke_agent (custom agent A) |
claude-haiku-4.5 |
296,978 |
absent |
absent |
nested invoke_agent (custom agent B) |
gpt-5.6-terra |
155,061 |
absent |
absent |
subagent chat spans |
claude-haiku-4.5 / gpt-5.6-terra |
124K–321K each |
absent |
absent |
In our sessions the unreported subagent calls account for roughly 10–15% of estimated session cost (rate-card priced from the token counts, which are reported).
Affected version
GitHub Copilot CLI 1.0.73
Steps to reproduce the behavior
- Enable OTel export (
COPILOT_OTEL_ENABLED with an OTLP endpoint, or COPILOT_OTEL_FILE_EXPORTER_PATH).
- Run an interactive session and issue a prompt that delegates to a subagent — e.g. a custom agent configured with a different model, or anything that triggers the
task tool.
- Inspect the exported spans for the session trace.
- Main-agent
chat spans carry github.copilot.nano_aiu / github.copilot.cost; the subagent invoke_agent and chat spans carry token usage but no billing attributes, and the root rollup excludes them.
Expected behavior
Subagent model calls should carry the same billing attributes as main-agent calls (github.copilot.nano_aiu, github.copilot.cost), so that OTel-based cost accounting matches what is actually billed. Alternatively, if this is intentional (subagent calls genuinely bill zero credits), it would be great to have that documented in copilot help billing / the monitoring docs — though the cumulative session credit display suggests they are billed.
Additional context
Describe the bug
When a session delegates work to subagents (the
tasktool / custom agents), the OTel spans for those subagent model calls omit all billing attributes. The subagent calls consume real AI credits (per the cumulative session display — see #4207, which notes session usage "including usage by the main agent, subagents, and background operations"), but that consumption is invisible to OpenTelemetry, so any external cost accounting built on the documented OTel telemetry (copilot help monitoring) systematically undercounts actual billing.Main-agent
chatspans carry the full billing envelope:github.copilot.nano_aiugithub.copilot.costgithub.copilot.initiator(user/agent)github.copilot.interaction_id/github.copilot.turn_idSubagent model calls emit spans with correct
gen_ai.*semconv attributes (gen_ai.operation.name,gen_ai.request.model,gen_ai.usage.input_tokens/output_tokens/cache_read.input_tokens/cache_creation.input_tokens) but carry none of thegithub.copilot.*billing attributes — nonano_aiu, nocost, not eveninitiatoror an interaction id. This holds at every level:chatspans: no billing attributes.invoke_agentspan (which does carrygen_ai.agent.nameand rolled-up token counts): no billing attributes.invoke_agentspan'sgithub.copilot.nano_aiurollup equals the sum of the main-agentchatspans'nano_aiuexactly — i.e. the subagent spend is not folded in anywhere.Observed within a single trace from one session (models are our configured custom-agent models; the same holds for built-in
taskdelegation):gen_ai.usage.input_tokensnano_aiucostinvoke_agentchat× 13invoke_agent(custom agent A)invoke_agent(custom agent B)chatspansIn our sessions the unreported subagent calls account for roughly 10–15% of estimated session cost (rate-card priced from the token counts, which are reported).
Affected version
GitHub Copilot CLI 1.0.73
Steps to reproduce the behavior
COPILOT_OTEL_ENABLEDwith an OTLP endpoint, orCOPILOT_OTEL_FILE_EXPORTER_PATH).tasktool.chatspans carrygithub.copilot.nano_aiu/github.copilot.cost; the subagentinvoke_agentandchatspans carry token usage but no billing attributes, and the root rollup excludes them.Expected behavior
Subagent model calls should carry the same billing attributes as main-agent calls (
github.copilot.nano_aiu,github.copilot.cost), so that OTel-based cost accounting matches what is actually billed. Alternatively, if this is intentional (subagent calls genuinely bill zero credits), it would be great to have that documented incopilot help billing/ the monitoring docs — though the cumulative session credit display suggests they are billed.Additional context
/usage— confirms subagent usage is part of session credit consumption), /usage premium request counter significantly undercounts actual quota consumption #1582 (/usageundercounts quota consumption; suspects background operations), Background compaction consumes 1 premium request (VS Code does not) #2068 (background compaction consumes a premium request), --output-format json omits token/cost usage that OTel exposes #4107 (verifiednano_aiumatches the interactive footer exactly for main-agent sessions — the mismatch reported here only appears once subagents are involved), Feature Request: Emit cost / premium-request metric via OpenTelemetry (parity with Claude Code's claude_code.cost.usage) #3778 (OTel cost metric feature request).