Skip to main content
Some skills reach beyond the robot’s body — sending emails, calling APIs, retrieving information. These are ordinary code-defined skills that happen to talk to the network: they implement explicit protocols and handle authentication, errors, and connectivity.

What to keep in mind

Talking to an external service is a more deterministic domain than acting in the physical world, but it comes with its own constraints:
  • Protocol-based: Follow defined APIs and standards
  • Atomic: Many operations cannot be cancelled once started
  • Reliable: Once working, behavior is consistent
  • Network-dependent: Must handle connectivity issues

Built-in examples

SendEmail

Sends email notifications, typically for alerts or status updates.
Parameters:

SendPictureViaEmail

Sends an email with the robot’s current camera view attached.
This skill demonstrates state dependencies—using the RobotState descriptor to declare required robot state that the system updates at 50Hz.

RetrieveEmails

Fetches recent emails from configured account.
Want to build your own version against your own account? There’s a complete implementation in the worked example below.

Building a service skill

Template

Worked example: RetrieveEmails

Here’s a complete, runnable custom skill that fetches your latest Gmail messages over IMAP. Save it as ~/innate-os/workspace/custom_skills/retrieve_emails.py on the robot, and reference it from an agent as local/retrieve_emails (custom skills are namespaced local/, shipped skills innate-os/):

Best Practices

Authentication
  • Store credentials in environment variables or secret managers
  • Never hardcode passwords or API keys
  • Validate credentials at initialization
Error Handling
Timeouts
  • Always set explicit timeouts on network calls
  • Prevent blocking indefinitely on slow services
Idempotency
  • Design operations to be safely retryable when possible
  • Consider partial failure scenarios

Requesting Robot State

Skills declare sensor data dependencies using the RobotState descriptor:
The system automatically updates declared state at 50Hz while your skill runs. Always check for None on first access. Available state types: See Robot State for more details on the RobotState system.

Cancellation

Many service operations are atomic and cannot be meaningfully cancelled:
The Innate agent understands this limitation and factors it into planning decisions.