Official Telegram channel no-response sentinel uses billable API calls

Resolved 💬 1 comment Opened Jun 6, 2026 by Qizhan7 Closed Jun 6, 2026

Claude Code channel no-response sentinel is making billable API calls

Summary

Claude Code channel turns that decide not to reply are sometimes being recorded as real model API calls instead of synthetic local "No response requested." turns.

Expected behavior: when Claude Code receives a channel message or tool result and decides no visible reply is needed, it should emit a synthetic local assistant message:

  • model: "<synthetic>"
  • no requestId
  • all usage fields are 0

Actual behavior observed in a Telegram channel session: the same sentinel text is emitted as a normal assistant model message:

  • model: "claude-opus-4-6"
  • has requestId
  • has non-zero usage, especially cache_read_input_tokens

This makes "deciding to stay silent" consume cache-read tokens. In the affected active Telegram channel session, I found 32 billable no-response sentinel events totaling 4,710,889 cache-read tokens.

Environment

  • Claude Code channel: plugin:telegram@claude-plugins-official
  • Launch command shape: claude --model claude-opus-4-6[1m] --effort max --permission-mode bypassPermissions --allow-dangerously-skip-permissions --channels plugin:telegram@claude-plugins-official --resume <session>
  • Active process version: 2.1.167
  • Session id: redacted publicly (0eedc14d...)
  • Local timezone for times below: Pacific/Auckland
  • Transcript: Claude Code project JSONL for session 0eedc14d...

The reproduction shape is a plain official Telegram channel session:

export TELEGRAM_CHANNEL_POLL=1
claude \
  --model claude-opus-4-6[1m] \
  --effort max \
  --permission-mode bypassPermissions \
  --allow-dangerously-skip-permissions \
  --channels plugin:telegram@claude-plugins-official \
  --resume <session>

Evidence

Synthetic no-response, expected

Transcript line 206, local time 2026-06-06T09:09:45.523+12:00, Claude Code 2.1.166:

{
  "type": "assistant",
  "version": "2.1.166",
  "message": {
    "model": "<synthetic>",
    "content": [{ "type": "text", "text": "No response requested." }],
    "usage": {
      "input_tokens": 0,
      "output_tokens": 0,
      "cache_creation_input_tokens": 0,
      "cache_read_input_tokens": 0
    }
  },
  "requestId": null
}

Billable no-response, unexpected

Transcript line 2335, local time 2026-06-07T05:10:52.012+12:00, Claude Code 2.1.167:

{
  "type": "assistant",
  "version": "2.1.167",
  "requestId": "req_...",
  "attributionMcpServer": "plugin:telegram:telegram",
  "attributionMcpTool": "reply",
  "message": {
    "model": "claude-opus-4-6",
    "content": [{ "type": "text", "text": "No response requested." }],
    "usage": {
      "input_tokens": 3,
      "output_tokens": 7,
      "cache_creation_input_tokens": 150,
      "cache_read_input_tokens": 218311
    }
  }
}

The sentinel text is identical, but the second event is a real request with usage.

Aggregate Counts

For the affected active Telegram session (0eedc14d...):

| Local date | Claude Code version | no-response events | synthetic | billable | cache_read total |
| --- | --- | ---: | ---: | ---: | ---: |
| 2026-06-06 | 2.1.166 | 10 | 1 | 9 | 1,037,907 |
| 2026-06-06 | 2.1.167 | 18 | 1 | 17 | 2,391,712 |
| 2026-06-07 | 2.1.167 | 6 | 0 | 6 | 1,281,270 |
| Total | 2.1.166-2.1.167 | 34 | 2 | 32 | 4,710,889 |

Version transitions in the same transcript:

| Local time | Transcript line | Version |
| --- | ---: | --- |
| 2026-06-06T07:11:45.025+12:00 | 5 | 2.1.165 |
| 2026-06-06T09:09:45.523+12:00 | 206 | 2.1.166 |
| 2026-06-06T21:23:57.158+12:00 | 1243 | 2.1.167 |

The first no-response after the 09:09 resume was synthetic. Later no-response sentinels in the same session became billable.

The affected Telegram session itself contains both forms, so this does not appear to be a JSONL parsing issue. The same sentinel text appears once as a synthetic zero-usage event and later as real model requests with non-zero usage.

Impact

The user-visible behavior is correct: messages that should get replies still get replies, and silent turns stay silent. The issue is billing/usage: no-response decisions that should be free synthetic turns consume large cache-read token counts.

In this one active session, 32 silent decisions consumed about 4.7M cache-read tokens.

Request

Please check whether Claude Code changed channel/tool-result continuation behavior around versions 2.1.166 / 2.1.167, causing No response requested. to be generated through a real model request instead of the previous synthetic local path.

Desired fix: no-response sentinels for channel/tool-result continuations should remain synthetic when no model reasoning is required, or at least should not consume billable API/cache-read usage.

Redaction Note

The evidence above omits Telegram message content and redacts request ids. I can provide the full session id and local JSONL excerpts privately if needed.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗