You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
- BlueBubbles: pre-dispatch transcribe inbound voice notes via the upstream `audio-transcript` endpoint and substitute the transcript for the `<media:audio>` placeholder so agents see what the user said instead of apologizing about an empty body; gated by the new default-on `channels.bluebubbles.inboundAudioEnricher.enabled` flag, detects audio by both MIME and Apple UTIs, falls back silently on older BB Servers, and never logs transcript text. Fixes #68719. Thanks @markthebest12.
9
10
- Messages/docs: clarify that `BodyForAgent` is the primary inbound model text while `Body` is the legacy envelope fallback, and add Signal coverage so channel hardening patches target the real prompt path. Refs #66198. Thanks @defonota3box.
10
11
- Control UI/Usage: add UTC quarter-hour token buckets for the Usage Mosaic and reuse them for hour filtering, keeping the legacy session-span fallback for older summaries. (#74337) Thanks @konanok.
Copy file name to clipboardExpand all lines: docs/channels/bluebubbles.md
+21Lines changed: 21 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -546,6 +546,25 @@ Control whether responses are sent as a single message or streamed in blocks:
546
546
- Media cap via `channels.bluebubbles.mediaMaxMb` for inbound and outbound media (default: 8 MB).
547
547
- Outbound text is chunked to `channels.bluebubbles.textChunkLimit` (default: 4000 chars).
548
548
549
+
### Inbound voice notes (audio transcripts)
550
+
551
+
When BlueBubbles Server v1.14.0+ delivers an iMessage voice note, OpenClaw fetches the transcript Apple already produced on-device and substitutes it for the `<media:audio>` placeholder before the agent sees the message.
552
+
553
+
- No third-party speech-to-text provider is required and no extra cost is incurred — the text comes from Apple's built-in dictation that ran on the sending device.
554
+
- Audio attachments are detected by both MIME (`audio/*`) and Apple UTIs (`public.audio`, `public.mpeg-4-audio`, `com.apple.m4a-audio`, `com.apple.coreaudio-format`).
555
+
- The transcript text is treated as PII: it never appears in verbose logs, only the character length is recorded.
556
+
- Older BB Servers reply 404 to the `audio-transcript` endpoint; the call is best-effort and silently falls back to the placeholder body when unavailable.
557
+
- If the user typed text alongside the voice note, the original text is preserved.
558
+
559
+
Disable per account:
560
+
561
+
```yaml
562
+
channels:
563
+
bluebubbles:
564
+
inboundAudioEnricher:
565
+
enabled: false
566
+
```
567
+
549
568
## Configuration reference
550
569
551
570
Full configuration: [Configuration](/gateway/configuration)
@@ -577,6 +596,8 @@ Full configuration: [Configuration](/gateway/configuration)
577
596
</Accordion>
578
597
<Accordion title="Media and history">
579
598
- `channels.bluebubbles.mediaMaxMb`: Inbound/outbound media cap in MB (default: 8).
599
+
- `channels.bluebubbles.inboundAudioEnricher.enabled`: Pre-dispatch transcription of inbound voice notes via the upstream BlueBubbles `audio-transcript` endpoint (default: `true`). See [Inbound voice notes](#inbound-voice-notes-audio-transcripts).
600
+
- `channels.bluebubbles.inboundAudioEnricher.perType.audio`: Per-type opt-out for audio transcription (default: enabled when the parent flag is on).
580
601
- `channels.bluebubbles.mediaLocalRoots`: Explicit allowlist of absolute local directories permitted for outbound local media paths. Local path sends are denied by default unless this is configured. Per-account override: `channels.bluebubbles.accounts.<accountId>.mediaLocalRoots`.
581
602
- `channels.bluebubbles.coalesceSameSenderDms`: Merge consecutive same-sender DM webhooks into one agent turn so Apple's text+URL split-send arrives as a single message (default: `false`). See [Coalescing split-send DMs](#coalescing-split-send-dms-command--url-in-one-composition) for scenarios, window tuning, and trade-offs. Widens the default inbound debounce window from 500 ms to 2500 ms when enabled without an explicit `messages.inbound.byChannel.bluebubbles`.
582
603
- `channels.bluebubbles.historyLimit`: Max group messages for context (0 disables).
0 commit comments