Skip to content

Talking to an agent

Wherever you are talking to it — Telegram, Discord, WhatsApp, the dashboard or nouride chat — the message travels the same path. The gateway is the only part that differs.

Slash commands

Type these instead of a message. They are answered by the daemon, not by the model, so they cost nothing and always work.

/helpList available commands
/statusShow agent status
/newStart a new conversation
/compactSummarise the conversation so far, keeping the recent turns
/resetHard reset: clear the conversation, expire approvals, reload config
/stopPause this agent
/startResume this agent
/modelSwitch model for this chat
/agentsList agents
/promptShow the system prompt this agent is running with
/reloadReload persona files and config from disk
/approvalsChange what this chat gets asked about
/approveApprove a pending tool call — add always to stop being asked for it
/denyDeny a pending tool call
/grantsList standing command permissions, or revoke them: /grants revoke <id|all>
/draftsSkills the agent has drafted and wants your call on — show, approve, deny
/commandsSync this list to the platform’s own command menu

/commands is worth running once per Telegram bot: it pushes the list into the native menu so the people using it do not have to know any of this.

Sessions, and what /new actually clears

A conversation is stored per agent per chat. /new starts a fresh one — the agent stops seeing the earlier messages.

What survives /new:

  • MEMORY.md — the agent’s own curated notes.
  • USER.md and the People entries — who you are, what you go by.
  • Skills — the shared pool.

So the fix for “it forgot my wife’s name after /new” is not to avoid /new. It is to have the fact written down in one of those three places, where it is permanent.

When the conversation gets long

The daemon compacts rather than truncating: it summarises the older part of the conversation and keeps the recent turns verbatim. That happens automatically, and /compact forces it early.

max_context_ratio decides how much of the model’s context window gets filled before that kicks in. Configuration reference →

Groups

Two settings decide how an agent behaves in a room it is not being spoken to directly in:

  • groups_require_mention — off by default. On, an agent ignores unaddressed group chatter entirely. DMs still answer everything.
  • group_context_messages — 20 by default. When an agent is addressed, this many recent messages come along, so @nouva ini gimana? arrives with the exchange it points at.

Chatter still triggers nothing. It is remembered, not answered.

Both are daemon-wide, and they live above the agent cards in the dashboard for that reason. A single connection can override the second, and that field says out loud that it is an override.

On Telegram, none of this works until privacy mode is off. BotFather → /setprivacy → Disable, or make the bot an admin. Otherwise Telegram simply does not deliver the messages.

Two agents in one room

Agents address each other by tag. Nouva writes @nox benerin build ini, Nox sees it and acts.

The tag is the handover. A reply without one reaches nobody, which is how an exchange ends naturally. That soft brake depends on a model choosing not to tag, so there is a hard one too: only a mention routes a message from an agent — never a channel binding, never the gateway owner, never the default agent — and after mention_max_hops handovers (5 by default) the daemon says so in the chat and stops delivering. A human saying anything resets the count, because the limit exists to bound unattended chatter.

Both agents share a working directory (workspace/shared/), which is what makes the handover meaningful: the build Nox was asked to fix is somewhere Nox can actually open.

In a one-to-one chat this is not how it works, and it cannot be. Each bot has its own private conversation with you, so a tag written in a DM reaches nobody — the other agent’s bot never sees the message. There, an agent hands work over with the ask_agent tool instead: the other agent runs behind the chat with its own skills and permissions, its progress appears labelled [nox], and its answer comes back to the agent that asked. The one you are talking to stays the only one that speaks.

Nothing to configure. The prompt tells each agent which of the two applies to the chat it is in, and mentions_enabled = false turns off both.

Files

Send an agent a file and it lands in its workspace. Images are read by a model if read_images is on — by the agent’s own model unless you name a cheaper one in [media] image_model. Documents are not sent to a model at all: they land in the workspace and the agent opens them with read or a command, so a PDF costs nothing until the agent looks at it.

Agents send files back with send_file.

From the terminal

Terminal window
nouride chat # the default agent
nouride chat nouva # address one by name

Messages go through a real in-process gateway, so routing, hooks, the queue, the tool loop and session persistence all run exactly as they would for a chat platform. Slash commands work. Approvals appear inline and you answer them with a keypress.

It also works non-interactively — piped stdin is detected, and approvals are printed rather than prompted for — which is how an end-to-end test talks to the daemon.

Terminal chat →