Skip to main content
Channel processes use these tools to interact with users, delegate work, and manage conversation flow. Channels are the user-facing LLM processes with personality and context.

reply

Send a message to the user in the current conversation. Supports rich content including cards, interactive elements, and polls.
content
string
required
The message content to send. You can use markdown formatting. Mentions like @Username are automatically converted to platform-specific syntax.
thread_name
string
Create a new public thread with this name and post the reply inside it. Thread names are capped at 100 characters.
cards
array
Formatted cards (e.g., Discord embeds) to attach to the message. Great for structured reports, summaries, or visually distinct content. Maximum 10 cards.Each card can include:
  • title (string)
  • description (string)
  • color (integer) - Decimal color code
  • url (string)
  • fields (array) - Each field has name, value, and optional inline (boolean)
  • footer (string)
interactive_elements
array
Interactive components like buttons or select menus. Button clicks are sent back as InteractionEvent with the corresponding custom_id. Maximum 5 element rows.Each element can be:
  • Buttons: type: "buttons" with array of button objects containing label, custom_id, style (“primary”, “secondary”, “success”, “danger”, “link”), and optional url
  • Select menu: type: "select" with custom_id, options array (each with label, value, optional description and emoji), and optional placeholder
poll
object
A poll to attach to the message.Poll object includes:
  • question (string, required)
  • answers (array of strings, required)
  • allow_multiselect (boolean)
  • duration_hours (integer, defaults to 24)
success
boolean
Whether the reply was sent successfully
conversation_id
string
The conversation identifier
content
string
The final content that was sent (after mention conversion)

Example

{
  "content": "Task completed! Here's the summary:",
  "cards": [
    {
      "title": "Build Status",
      "description": "All tests passed",
      "color": 3066993,
      "fields": [
        {"name": "Duration", "value": "2m 34s", "inline": true},
        {"name": "Tests", "value": "42 passed", "inline": true}
      ]
    }
  ]
}
In email conversations, this sends an actual outbound email. Use branch + skip for internal thinking without sending.

branch

Fork the current conversation context to think independently. The branch gets a clone of your full conversation history and can use memory tools to recall and save information.
description
string
required
What the branch should investigate or think about. Be specific about what conclusion you want. The branch sees your full context but works independently.
branch_id
string
The UUID of the created branch
spawned
boolean
Whether the branch was created successfully
message
string
Status message about the branch

Example

{
  "description": "Search my memories for any previous conversations about API rate limits with this user. Return a summary of what we discussed and any decisions made."
}
Branches are for thinking and memory work. They have your context but work independently. You never see their working, only their conclusion.

spawn_worker

Create a new worker process to execute a task. Workers can be fire-and-forget (run once) or interactive (accept follow-up messages).
task
string
required
Clear, specific description of what the worker should do. Include all context needed since the worker can’t see your conversation history.
interactive
boolean
default:false
If true, the worker stays alive and accepts follow-up messages via route. If false, the worker runs once and returns.
suggested_skills
array
List of skill names from available skills that are relevant to this task. The worker sees all skills and can read any of them, but suggested skills are flagged as recommended.
worker_type
string
default:"builtin"
Worker type: "builtin" runs a Rig agent loop with shell/file/exec tools. "opencode" spawns an OpenCode subprocess with full coding agent capabilities. Use "opencode" for complex coding tasks.
directory
string
Working directory for the worker. Required for "opencode" workers. The OpenCode agent operates in this directory.
worker_id
string
The UUID of the spawned worker
spawned
boolean
Whether the worker was created successfully
interactive
boolean
Whether this is an interactive worker
message
string
Status message

Example: Fire-and-forget worker

{
  "task": "Run the test suite in the project directory and report any failures",
  "interactive": false
}

Example: Interactive coding session

{
  "task": "Help me refactor the authentication module. Start by analyzing the current structure.",
  "interactive": true,
  "worker_type": "opencode",
  "directory": "/home/user/project"
}

route

Send a follow-up message to an interactive worker. Only works with workers spawned with interactive: true.
worker_id
string
required
The worker ID (UUID format) from the spawn_worker result
message
string
required
The message to send to the worker
routed
boolean
Whether the message was delivered
worker_id
string
The worker ID
message
string
Status message

Example

{
  "worker_id": "550e8400-e29b-41d4-a716-446655440000",
  "message": "Now update the tests to match the new authentication flow"
}

cancel

Stop a running worker or branch. Use when the process is no longer needed or has gone off track.
process_type
string
required
Type of process to cancel: "worker" or "branch"
process_id
string
required
The UUID of the worker or branch to cancel
reason
string
Optional reason for cancellation (logged)
cancelled
boolean
Whether the cancellation was successful
process_type
string
The type of process that was cancelled
process_id
string
The process ID
message
string
Status message

Example

{
  "process_type": "worker",
  "process_id": "550e8400-e29b-41d4-a716-446655440000",
  "reason": "User requested different approach"
}

skip

Produce no response to the user. Use when a message doesn’t warrant a reply (e.g., lurking in group chat, message wasn’t directed at you).
reason
string
Brief internal reason for skipping (logged but not sent to the user)
skipped
boolean
Always true when the tool succeeds

Example

{
  "reason": "General conversation in group chat, not directed at me"
}
Calling skip suppresses all output for this turn and cancels the typing indicator.

react

Add an emoji reaction to the message. Quick, non-verbal acknowledgment.
emoji
string
required
A single unicode emoji character (e.g., ”👍”, ”😂”, ”🔥”, ”👀”)
success
boolean
Whether the reaction was added
emoji
string
The emoji that was used

Example

{
  "emoji": "👍"
}

send_file

Send a file attachment to the user. Reads a file from the agent’s workspace and delivers it in the conversation.
file_path
string
required
Path to the file to send, relative to the workspace directory
caption
string
Optional caption or description for the file
success
boolean
Whether the file was sent successfully
message
string
Status message
File access is restricted to the agent’s workspace boundary for security. Attempting to send files outside the workspace will fail.

Example

{
  "file_path": "reports/analysis.pdf",
  "caption": "Here's the analysis report you requested"
}

send_message_to_another_channel

Send a message to a different platform channel. Useful for cross-platform notifications or multi-channel workflows.
adapter
string
required
The messaging adapter name: discord, slack, telegram, webhook
channel_id
string
required
The target channel identifier (Discord channel ID, Slack channel name, Telegram chat ID, webhook URL)
message
string
required
The message content to send
success
boolean
Whether the message was sent successfully
message
string
Status message

Example

{
  "adapter": "discord",
  "channel_id": "1234567890123456789",
  "message": "Alert: New critical issue detected in production"
}

send_agent_message

Send a message to another agent through the agent communication graph. Currently validates that a link exists between agents.
agent_id
string
required
Target agent ID or display name
message
string
required
Message content to send to the target agent
Specific link ID to use if multiple links exist to the same agent
success
boolean
Whether the link was validated and message queued
message
string
Status message
This tool currently validates that the communication link exists in the agent graph. Full cross-agent task delegation will be implemented in a future release.

Example

{
  "agent_id": "research-assistant",
  "message": "Please analyze the market trends for Q4"
}

cron

Manage scheduled recurring tasks. Create, list, or delete cron jobs that run at specified intervals or on cron schedules.
action
string
required
The operation: "create", "list", or "delete"
id
string
For create: a short unique ID (e.g., “check-email”, “daily-summary”). For delete: the ID to remove. Must be 1-50 characters, alphanumeric with hyphens and underscores only.
prompt
string
For create: the instruction to execute on each run. Maximum 10,000 characters.
cron_expr
string
For create: strict wall-clock cron expression (5-field syntax, e.g., “0 9 * * *” for daily at 09:00). Takes precedence over interval_secs.
interval_secs
integer
For create: seconds between runs (minimum 60). Examples: 3600 = hourly, 86400 = daily.
delivery_target
string
For create: where to send results, format “adapter:target” (e.g., “discord:123456789” for DM, “discord:channel_id” for server). Defaults to current conversation.
active_start_hour
integer
For create: hour (0-23) when the job becomes active
active_end_hour
integer
For create: hour (0-23) when the job becomes inactive
timeout_secs
integer
default:120
For create: maximum seconds to wait for the job to complete. Use larger values (e.g., 600) for long-running research or writing tasks.
run_once
boolean
default:false
For create: if true, run this job once and auto-disable after the first execution.
delete_id
string
For delete: the ID of the cron job to remove (alternative to id)
success
boolean
Whether the operation succeeded
message
string
Status message
jobs
array
For list: array of cron job entries with id, prompt, interval_secs, delivery_target, run_once, and active_hours

Example: Create daily summary

{
  "action": "create",
  "id": "daily-summary",
  "prompt": "Generate a summary of today's conversations and send it to the user",
  "cron_expr": "0 18 * * *",
  "delivery_target": "discord:dm:123456789",
  "timeout_secs": 300
}

Example: List all jobs

{
  "action": "list"
}

Build docs developers (and LLMs) love