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 --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 config.json shape (full reference in docs/configuration.md):

{
  "agent": {
    "name": "hermes",
    "org_id": "00000000-0000-0000-0000-000000000000",
    "workspace": "./workspace"
  },
  "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.

Release files for ouro-agents 0.1.2

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.1.2
File Size Uploaded
ouro_agents-0.1.2.tar.gz 681.7 kB Details

Built distribution (wheel)

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

Total release size: 1.2 MB

Release files / ouro_agents-0.1.2.tar.gz

Download URL ouro_agents-0.1.2.tar.gz
Size 681.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9a8df3f430d91bae085646da18874bdb467134c3ecf5a4ca63d90bc8ebe4b211
BLAKE2b-256 checksum
How to use checksums
e52a253da442ae84ea75d07dcad5e5a1bc5d55d0d82d0da200141026c53be7e5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

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

Download URL ouro_agents-0.1.2-py3-none-any.whl
Size 550.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3cb90046d870be3d1c0cf010b7f70cb8d85b2e3e4ee28b83bceaff29fc0ea5b8
BLAKE2b-256 checksum
How to use checksums
42d8510d8aada211b300d60bf203e7137908ad03a32adc06430274ebca5824af
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.0

Release history Release notifications | RSS feed

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

This release

0.1.2 This release

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