Skip to main content
Every agent follows the same structure. Once you understand it, you can create any agent you need.

File Location

Your agents are stored in ~/innate-os/workspace/custom_agents/ on the robot (shipped agents live next door in workspace/innate_agents/). The system automatically discovers Python files in these directories—no registration or configuration required. The directory is watched while the robot runs: new files and edits hot-reload automatically within a second or two — no restart required. (innate service restart remains the fallback if something doesn’t get picked up.)

Core Interface

Every agent implements four methods: Optional methods:

Minimal Example

The simplest possible agent:
This agent loads and runs, but does very little—it has no skills and a minimal prompt.

Complete Example

A functional agent with skills, inputs, and a detailed prompt:
This agent combines navigation and waving skills, microphone input, a friendly prompt, and gaze tracking for more natural interaction.

Naming skills

Prefer the class — an import is checked by your editor, so a rename or a typo fails before it reaches the robot:
Full ID strings still work and are the escape hatch when the ID is only known at runtime. They’re namespaced by the package the skill comes from: IDs are matched exactly — a custom skill named victory_spin must be listed as "local/victory_spin", not bare.
An agent whose file fails to import no longer disappears from the picker. It shows up as a disabled option with its error, and clears when you fix it.

Enabling the Microphone

If you want to talk to your agent, you must enable the microphone input — it is not on by default. Return the microphone device from get_inputs():
That’s all: when the agent starts, the runtime opens MARS’s built-in microphone and everything you say is streamed into the agent’s context as chat input. Without this, the agent only reacts to what it sees and to messages typed in the app. The same mechanism works for any input device (added sensors, network events, …) — "micro" is just the built-in one. See Example: Microphone for how it works under the hood.

Writing Effective Prompts

The prompt determines how the robot behaves. Skills define what’s possible; the prompt defines what actually happens. A good prompt defines personality, goals, constraints, and strategy in plain language. Be specific. The AI interprets your prompt literally, and vague instructions produce inconsistent behavior.

Template

Copy and modify this template for new agents:

Deploy your agent

1

Save the file in the right place

Save your agent as my_agent.py in ~/innate-os/workspace/custom_agents/ on the robot. This is the one directory the system scans for your agents — anywhere else and it won’t load.
2

Let hot reload pick it up

The runtime watches custom_agents/ — your new agent loads automatically within a second or two of saving, and so does every later edit. If it ever fails to appear, restart the runtime as a fallback:
3

Check it appears in the app

Your agent shows up as a card on the app Home screen — pull down to refresh if needed. From there, tap to start it.