How to Define an Ellipsis Agent with YAML Config Files
Updated
You define an Ellipsis agent by committing a YAML file (for example agent.yaml, standup-automator.yaml, or triage-issues.yaml) into your repository. The file declares the agent's name, description, trigger, session harness and model, prompt, environment, repositories, hooks, and budget. Ellipsis reads that config and runs the agent in its managed cloud infrastructure, so you never provision compute or wire up permissions yourself. This works if you have the Ellipsis app installed on GitHub and are comfortable editing repo files; the examples below follow the structure shown in Ellipsis's own documentation.
The core shape of an agent file
Every agent file starts with an ellipsis block and then describes what the agent is and when it runs. The fields you'll use most:
| Field | Purpose |
|---|---|
kind |
Declares this as an agent |
name |
Identifier for the agent |
description |
Human-readable summary of what it does |
trigger |
When the agent fires (cron schedule or repo event) |
session |
Which harness and model to run |
prompt |
The instruction the agent executes |
environment |
Repositories, hooks, and compute the agent gets |
budget |
Session limits to cap usage |
Step 1: Create the file and name the agent
Add a YAML file to your repo. The ellipsis key is the root, and kind: agent tells Ellipsis this is an agent definition rather than something else.
ellipsis:
kind: agent
name: triage-issues
prompt: Label new issues and find duplicates.
environment:
repositories:
- name: web-repo
The name is how you and the platform refer to the agent; prompt is the actual task. The environment.repositories list scopes which repos the agent can touch.
Step 2: Choose a trigger
Triggers decide when the agent runs. Two forms appear in the docs:
Cron (scheduled): run on a fixed schedule.
trigger:
type: cron
schedule: "30 8 * * 1-5"
This fires at 08:30 on weekdays — the pattern used by the standup-automator example, which posts a daily digest of merged PRs, pending reviews, and failing CI to Slack.
React (event-driven): run in response to repository activity such as a pushed pull request.
trigger:
type: react
pull_request:
on: [pushed]
repositories: [api-repo]
The check-api-changes example uses this to inspect changed API routes for missing test coverage whenever a PR is pushed.
Step 3: Pick a harness and model
The session block selects the coding harness and the model. Switching between them is a one-line change — you don't rebuild the agent.
session:
claude_code:
model: claude-opus-5-5
To move to a different harness and model, swap the block:
session:
codex:
model: gpt-6-sol
The rest of the file (name, prompt, environment) stays the same. This is the mechanism behind Ellipsis's "any agent, any model" claim — the config, not the code, decides what runs.
Step 4: Configure the environment and hooks
The environment block controls what the agent has access to and any setup it needs before running. repositories lists the repos; hooks run shell commands at defined points, such as after checkout.
environment:
repositories:
- name: api-repo
hooks:
after_checkout: |
cd api-repo
Use hooks for setup steps your agent needs before it starts its task — installing dependencies, checking out a branch, or preparing a working directory.
Step 5: Set a budget
The budget block caps how much a session can consume, so a runaway agent doesn't keep running.
budget:
session: 2
Set this deliberately for scheduled or event-driven agents that could otherwise fire repeatedly.
A complete example
Putting the pieces together, a scheduled digest agent looks like this:
ellipsis:
name: standup-automator
description: Posts a daily standup digest to Slack
trigger:
type: cron
schedule: "30 8 * * 1-5"
session:
claude_code:
model: claude-opus-4-8
prompt: |
Each weekday, summarize yesterday's merged PRs, the reviews still
waiting, and any failing CI, then post the digest to #engineering
and @ the right owners.
budget:
session: 2
How to verify it works
After committing the file, confirm the agent is registered and triggered as expected. The docs reference an API surface for this — POST /v1/agents to create an agent, POST /v1/agents/{id}/sessions to start a session, and POST /v1/sessions/{id}/messages to message a running session. Use these to check that your YAML parsed into an agent and to start a test session before relying on the trigger.
Common sticking points
- Trigger type mismatch. A
crontrigger needs a validschedule; areacttrigger needs the event (for examplepull_request.on) and the repos to watch. Mixing fields from both will fail. - Repo scope. If the agent can't see a repository, check that it's listed under
environment.repositories— the trigger'srepositoriesand the environment's list serve different purposes. - Hooks failing silently. A broken
after_checkoutcommand stops the agent before its prompt runs. Test the command locally first. - Missing budget. Scheduled agents without a
budget.sessioncap can accumulate sessions; set one for anything that fires on a timer.
Once the file is committed and the agent is registered, Ellipsis handles the infrastructure, permissions, logging, and budgets — your job is keeping the YAML accurate as the agent's task changes.