Skip to main content

ouro-agents

A Python package for running long-lived autonomous agents on the Ouro platform. An agent process owns a workspace on disk, talks to Ouro through MCP, maintains its own memory, and runs in several modes — interactive chat, one-shot tasks, scheduled heartbeats, and a multi-cycle planning loop tied to Ouro quests.

Highlights

  • Multiple run modes — chat, autonomous, heartbeat, plan, review. Each mode has a declarative profile controlling prompt framing, tool access, and lifecycle.
  • Subagents — built-in research, planner, executor, writer, developer profiles, plus a parallel delegate tool for fan-out work. Custom profiles can be dropped into workspace/subagents/.
  • Three-layer memory — vector memory (mem0 + Chroma) for curated facts, working memory (MEMORY.md and daily logs) maintained by the agent itself, and conversation history for chat continuity.
  • Doc store — local markdown mirrored to Ouro posts, scoped per-team.
  • Planning loop — generates plan cycles tied to Ouro quests, drives them across heartbeats, incorporates comment feedback through review heartbeats.
  • Scheduler — heartbeat, consolidation, refinement, plus user-defined recurring tasks (cron or interval).
  • Refinement & cleanup — periodic LLM-driven rewrites of working memory based on a typed change-set queue, plus deterministic cleanup for asset.deleted webhooks.
  • OpenRouter integration — prompt caching for Anthropic models, per-mode and per-subagent reasoning effort, multi-model setups.

Install

pip install ouro-agents

Python 3.10+ is required.

Quickstart

Create a standalone agent project:

ouro-agents init my-agent
cd my-agent

python -m venv .venv
source .venv/bin/activate
pip install -e .

cp .env.example .env
# edit .env and agent.json, then:
ouro-agents build-sandbox
ouro-agents --config agent.json chat

The generated repository owns the agent's identity, skills, curated memory, coils, and service code. Runtime data and secrets are ignored. Its pyproject.toml pins the same released ouro-agents package an external user installs; no checkout of this repository is required. Harness-owned databases and run state live under agent.data_dir (generated as ~/ouro-data/<name>), outside the repository.

Run a one-shot task:

ouro-agents --config agent.json run "What teams am I on?"

Or start the long-running server (heartbeats + webhook receiver):

ouro-agents --config agent.json serve

The full walkthrough is in docs/getting-started.md.

Documentation

Full docs live in docs/. A few starting points:

CLI cheatsheet

ouro-agents init my-agent                       # scaffold a standalone agent repo
ouro-agents --config agent.json serve           # FastAPI server + scheduler
ouro-agents --config agent.json run "Summarize today's activity"
ouro-agents --config agent.json chat             # interactive REPL
ouro-agents --config agent.json heartbeat        # one heartbeat tick
ouro-agents --config agent.json plan ["goal"]    # force a planning heartbeat
ouro-agents --config agent.json review           # force a review heartbeat

Add -v for verbose output or --debug-md to capture a full run trace (see the CLI reference).

HTTP API

While ouro-agents serve is running:

# Threaded conversation-style chat
curl -X POST http://localhost:8000/run \
  -H "Content-Type: application/json" \
  -d '{"task":"Hi, can you help me post a dataset?","session_id":"demo-user-1"}'

# Same session reuses the same conversation id automatically
curl -X POST http://localhost:8000/run \
  -H "Content-Type: application/json" \
  -d '{"task":"Use the Machine Learning team","session_id":"demo-user-1"}'

# Health
curl http://localhost:8000/health

The server also accepts Ouro webhook events at server.webhook_path (default /events). See docs/http-api.md and docs/events.md.

Workspace

The agent reads and writes everything under agent.workspace (default ./workspace):

workspace/
├── SOUL.md           # required: identity, values, operating rules
├── NOTES.md          # optional: ambient notes
├── MEMORY.md         # curated cross-team memory
├── conversations/    # per-conversation transcripts ({id}.jsonl)
├── shared/logs/      # period logs (daily/weekly/biweekly)
├── teams/<id>/       # team memory, logs/, plans, doc registry
├── memory/           # mem0 + Chroma store (opaque)
├── skills/           # workspace skill overrides
└── subagents/        # custom SubAgentProfile files

See docs/workspace.md.

Configuration at a glance

Minimal agent.json shape (full reference in docs/configuration.md):

{
  "agent": {
    "name": "hermes",
    "org_id": "00000000-0000-0000-0000-000000000000",
    "workspace": ".",
    "data_dir": "~/ouro-data/hermes"
  },
  "models": {
    "strong": {
      "id": "anthropic/claude-4.6-sonnet",
      "reasoning": { "effort": "medium" }
    },
    "light": {
      "id": "google/gemini-2.5-flash",
      "reasoning": { "effort": "none" }
    }
  },
  "modes": {
    "run":      { "max_steps": 60 },
    "chat":     { "max_steps": 40 },
    "planning": { "enabled": true, "cadence": "4h" },
    "heartbeat": {
      "enabled": true,
      "every": "1h",
      "active_hours": { "start": "09:00", "end": "17:00", "timezone": "America/Chicago" }
    }
  },
  "subagents": {
    "research": { "max_steps": 30 }
  },
  "memory": {
    "provider": "mem0",
    "path": "./workspace/protected/memory",
    "embedder": "openai/text-embedding-3-small"
  },
  "mcp_servers": [
    {
      "name": "ouro",
      "transport": "stdio",
      "command": "/path/to/python",
      "args": ["-m", "ouro_mcp.server"],
      "env": { "OURO_API_KEY": "${OURO_API_KEY}", "OURO_BASE_URL": "${OURO_BASE_URL}" }
    }
  ],
  "prompt_caching": { "enabled": true, "ttl": "5m" }
}

models.strong / models.light (and optional mid) are the preferred way to pick models — the harness assigns them by role. Explicit subagents.<name>.model / modes.*.model overrides still win. See the docs for everything else.

Development

Tests are in tests/:

pytest

Linting:

ruff check .

The package layout:

ouro_agents/
├── agent.py            # OuroAgent orchestrator
├── cli/                # Typer CLI entry point (serve/run/chat/...)
├── server.py           # FastAPI + webhook routing
├── config.py           # Pydantic config models + loader
├── modes/              # mode profiles + heartbeat + planning
├── subagents/          # SubAgentProfile + runner + built-in prompts
├── memory/             # vector memory + doc store + reflection
├── refinement/         # change-set queue + LLM-driven rewrites
├── cleanup/            # deterministic asset.deleted handler
├── skills/             # built-in markdown skills
├── tools/              # built-in tools (delegate, run_python, etc.)
├── tui/                # team / plan pickers
└── utils/              # streaming, callbacks, conversation helpers

Browse docs/ for a guided tour.

License

See the repository root for license terms.

Metadata

Release files for ouro-agents 0.2.12

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ouro-agents 0.2.12
File Size Uploaded
ouro_agents-0.2.12.tar.gz 706.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ouro-agents 0.2.12
File Interpreter ABI Platform
ouro_agents-0.2.12-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / ouro_agents-0.2.12.tar.gz

Download URL ouro_agents-0.2.12.tar.gz
Size 706.4 kB
Tags Source
SHA-256 checksum
How to use checksums
d8c79e038587a1513e4c9da3c8188dc9abe44aa2af2835ece1639b7dae188a28
BLAKE2b-256 checksum
How to use checksums
3e37ec303011cc3c12fddafeffc37af51895592c46e800358f01dc4a6cbfa508
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / ouro_agents-0.2.12-py3-none-any.whl

Download URL ouro_agents-0.2.12-py3-none-any.whl
Size 568.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
761b0588b44a8fae5d8894435cf7198fb24c164d76e4ef134ecdebf4ead36dd8
BLAKE2b-256 checksum
How to use checksums
23642fffdc02aa0da4960c55bb57d27508dfd8dccf99a8b0764abd6a517382d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release history Release notifications | RSS feed

0.2.13

2 release files

This release

0.2.12 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page