A session is one continuing conversation tied to a project and a way of reaching it. Inside the conversation, the slash commands are yours. Anything that reaches a session from outside it belongs to your DuoDuo.
Follow up while work is running#
You can send a correction or another detail while DuoDuo is working. A follow-up may join the current turn or wait for the next one, so one reply can address several messages.
Change the model#
/model
/model <model-id>
/model reset
/model changes the model for this session. The new choice applies on the next message; the daemon keeps running and the session history remains. A model id the runtime does not recognize may cost one restart of that session's process before it takes effect, and history survives the restart.
The model is not the runtime. A session is bound to the runtime that created its history, so pointing it at a different runtime (Claude, Codex, Grok, or Pi) is refused with runtime_mismatch, naming both. /clear first, then change the runtime.

Tell DuoDuo a model's real context window#
A model reached through a third-party endpoint can declare its own context window, its own endpoint and credential, and tier aliases. Without that, the session is capped by whatever window the runtime assumed, and compaction arrives too late or far too early. Claude sessions only.
Ask DuoDuo to profile the model. The duoduo-runtime-admin skill finds the window the endpoint publishes and records it under the exact model id the endpoint accepts. Aggregators rename models, and a renamed id runs unprofiled without saying so. A credential stored this way gets owner-only permissions on the file and is masked wherever DuoDuo displays it; where one is needed, you type it on the host, not in the chat.
Change reasoning effort#
/effort
/effort low | medium | high | xhigh | max
/effort reset
/effort sets reasoning depth for the conversation without changing the model you selected. On a Claude model without max support, max runs as high, and the reply says so.
Set defaults for many sessions#
/model and /effort change one session. To give every session of a runtime a model or an effort (host-wide, per channel kind, or for one channel), ask DuoDuo for the default you want, such as “use high effort for every Feishu/Lark conversation”. It writes the default at the right layer with duoduo-runtime-admin.
The keys are per runtime (claude.model, codex.model, grok.model, pi.model, and the matching .effort), so a channel that switches runtime never carries one vendor's model id into another. The most specific layer wins, key by key. A session's own /model still outranks all of them, and with nothing set the runtime's own configuration decides, as before.
The dashboard and the usage ledger record the model that served each turn, not the one requested, so an endpoint that quietly substitutes a model shows up there.
Compact or rewind#
/compact
/undo
/undo 3
/clear
/compactsummarizes older history while keeping the session./undorolls back recent exchanges./clear(also/reset) starts a fresh agent context for the next message.
Reach a session from outside it#
Sessions can be named: an alias such as “Research desk” stands in for the session key everywhere. A session can also be woken from outside. duoduo session notify delivers a message into a channel or job session and records where it came from; it cannot target the kernel. Run from inside a session's own shell, it sends as that session, so the recipient sees which session wrote. A watcher script calls it when data arrives.
A notification into a session nobody reads would vanish. With ALADUO_NOTIFY_UNCONSUMED_HOURS set, delivering into a foreground session whose reader has been gone longer than that is refused, and the refusal names the sessions that do have a reader. duoduo daemon status shows each channel session's last read and current subscribers, so the state behind a refusal is visible before anyone hits one.
The same knobs as /model, /effort and /compact also reach a channel session from the host or over SSH, which is how a session stuck on a model that cannot answer gets recovered. Job and partition sessions are refused: a job's model comes from its job file and a partition's from its frontmatter, so a per-session override there would report success and never take effect. Archiving moves a session's files out of the active set without deleting them, after live work has finished.
Ask DuoDuo to list, name, notify, re-model, compact or archive a session; duoduo-runtime-admin carries each of these. If DuoDuo itself is the session that is stuck, ask the agent that installed it.