2026-01-07 21:58:54 +00:00
|
|
|
|
---
|
2026-01-30 03:15:10 +01:00
|
|
|
|
summary: "When OpenClaw shows typing indicators and how to tune them"
|
2026-01-07 21:58:54 +00:00
|
|
|
|
read_when:
|
|
|
|
|
|
- Changing typing indicator behavior or defaults
|
2026-01-31 16:04:03 -05:00
|
|
|
|
title: "Typing Indicators"
|
2026-01-07 21:58:54 +00:00
|
|
|
|
---
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
# Typing indicators
|
|
|
|
|
|
|
2026-01-13 07:15:57 +00:00
|
|
|
|
Typing indicators are sent to the chat channel while a run is active. Use
|
2026-01-09 12:44:23 +00:00
|
|
|
|
`agents.defaults.typingMode` to control **when** typing starts and `typingIntervalSeconds`
|
2026-01-07 21:58:54 +00:00
|
|
|
|
to control **how often** it refreshes.
|
|
|
|
|
|
|
|
|
|
|
|
## Defaults
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-30 03:15:10 +01:00
|
|
|
|
When `agents.defaults.typingMode` is **unset**, OpenClaw keeps the legacy behavior:
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
- **Direct chats**: typing starts immediately once the model loop begins.
|
|
|
|
|
|
- **Group chats with a mention**: typing starts immediately.
|
|
|
|
|
|
- **Group chats without a mention**: typing starts only when message text begins streaming.
|
|
|
|
|
|
- **Heartbeat runs**: typing is disabled.
|
|
|
|
|
|
|
|
|
|
|
|
## Modes
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-09 12:44:23 +00:00
|
|
|
|
Set `agents.defaults.typingMode` to one of:
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
- `never` — no typing indicator, ever.
|
|
|
|
|
|
- `instant` — start typing **as soon as the model loop begins**, even if the run
|
|
|
|
|
|
later returns only the silent reply token.
|
|
|
|
|
|
- `thinking` — start typing on the **first reasoning delta** (requires
|
|
|
|
|
|
`reasoningLevel: "stream"` for the run).
|
|
|
|
|
|
- `message` — start typing on the **first non-silent text delta** (ignores
|
|
|
|
|
|
the `NO_REPLY` silent token).
|
|
|
|
|
|
|
|
|
|
|
|
Order of “how early it fires”:
|
|
|
|
|
|
`never` → `message` → `thinking` → `instant`
|
|
|
|
|
|
|
|
|
|
|
|
## Configuration
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
```json5
|
|
|
|
|
|
{
|
|
|
|
|
|
agent: {
|
|
|
|
|
|
typingMode: "thinking",
|
2026-01-31 21:13:13 +09:00
|
|
|
|
typingIntervalSeconds: 6,
|
|
|
|
|
|
},
|
2026-01-07 21:58:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-01-07 22:18:11 +00:00
|
|
|
|
You can override mode or cadence per session:
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
```json5
|
|
|
|
|
|
{
|
|
|
|
|
|
session: {
|
2026-01-07 22:18:11 +00:00
|
|
|
|
typingMode: "message",
|
2026-01-31 21:13:13 +09:00
|
|
|
|
typingIntervalSeconds: 4,
|
|
|
|
|
|
},
|
2026-01-07 21:58:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Notes
|
2026-01-31 21:13:13 +09:00
|
|
|
|
|
2026-01-07 21:58:54 +00:00
|
|
|
|
- `message` mode won’t show typing for silent-only replies (e.g. the `NO_REPLY`
|
|
|
|
|
|
token used to suppress output).
|
2026-01-07 22:18:11 +00:00
|
|
|
|
- `thinking` only fires if the run streams reasoning (`reasoningLevel: "stream"`).
|
|
|
|
|
|
If the model doesn’t emit reasoning deltas, typing won’t start.
|
2026-01-07 21:58:54 +00:00
|
|
|
|
- Heartbeats never show typing, regardless of mode.
|
|
|
|
|
|
- `typingIntervalSeconds` controls the **refresh cadence**, not the start time.
|
|
|
|
|
|
The default is 6 seconds.
|