Skip to main content

Pydantic AI Harness

CI PyPI versions license Join Slack

Your agent's favorite harness, built on Pydantic AI


Pydantic AI Harness is the official capability and harness library for Pydantic AI. Every Pydantic AI agent already has a light harness: the typed agent loop, any model, your own tools, structured output. For simple agents that's enough. But set an agent loose on complex, long-running work (fix a codebase, research a question, run for hours unattended) and what it needs around the model grows: a workspace to act in, a plan it keeps current, memory that carries across sessions, sub-agents to hand work to, context management that holds up in hour ten, and durable execution that survives a restart. Pydantic AI Harness ships that harness.

Everything here is one primitive: a capability, a self-contained unit of agent behavior you add to capabilities=[...] on any agent. There are 30+ of them, and complete agents like Coder and Researcher are themselves capabilities combined: they come apart the way they went together. Snap on a single block, compose your own stack, or start from the whole coding agent and take it apart later.

Quick start

Install with uv:

uv:

uv add "pydantic-ai-harness[coder,anthropic]"

pip:

pip install "pydantic-ai-harness[coder,anthropic]"
from pydantic_ai import Agent
from pydantic_ai.capabilities import LocalWorkspace
from pydantic_ai_harness.coder import Coder

agent = Agent(
    'anthropic:claude-opus-5-5',
    capabilities=[LocalWorkspace('.'), Coder()],
)
result = agent.run_sync('Find out why tests/test_parser.py fails and fix the bug it caught.')
print(result.output)

LocalWorkspace('.') is where the agent works: its file tools and commands run on your machine, in this directory. It is not a sandbox, so commands can reach anything you can. To run the same agent in an isolated cloud machine, swap it for a sandbox capability (Modal, E2B, or Sprites); see Workspaces.

With Modal, for example:

from pydantic_ai_harness.modal_sandbox import ModalSandbox

agent = Agent('anthropic:claude-opus-5-5', capabilities=[ModalSandbox(), Coder()])

Coder provides six tools: read_file, write_file, edit_file, list_files, grep, and shell, plus delegate_task to hand a sub-task to a fresh run of the same agent, repository context, and context controls. Shell commands are unrestricted and can persist beyond individual runs. Default instructions guide autonomous investigation, editing, and verification; pass instructions= to add your own guidance.

uvx --with "pydantic-ai-harness[coder]" clai -a pydantic_ai_harness.coder:coder_agent -m anthropic:claude-opus-5-5

The bundled coder_agent is the example above without a model.

Every model works: swap the string for any provider's. Need more? Add capabilities to the list; here's the same coder on gpt-5.6-sol, with web search and cross-session memory:

uv:

uv add "pydantic-ai-slim[openai]"

pip:

pip install "pydantic-ai-slim[openai]"
from pydantic_ai import Agent
from pydantic_ai.capabilities import LocalWorkspace, WebSearch
from pydantic_ai_harness import Coder, Memory
from pydantic_ai_harness.memory import FileStore

agent = Agent(
    'openai:gpt-5.6-sol',
    capabilities=[
        LocalWorkspace('.'),
        Coder(),
        WebSearch(),  # look up docs and error messages on the web
        Memory(FileStore('.agent-memory')),  # remembers across sessions
    ],
)

Skills (your SKILL.md procedures, loaded on demand; point it at a skills/ directory and add the skills extra), Web Fetch, Guardrails, and Dynamic Workflow slot in the same way; the Coder README lists what pairs well.

No magic: it's capabilities all the way down

Coder is a regular combined capability: FileSystem with five of its tools and content hashes off, Shell with its persistent shell tool and no allowlist, RepoContext, SubAgents delegating to the agent itself, ClearToolResults and WarnNearLimits, and a bounded ToolOutputLimits, plus its default instructions and JSON argument repair. Use it whole, or build the same agent from those capabilities to change any setting; the Coder page lists the exact configuration, tool signatures, delegation, and the persistent shell lifecycle.

Workspaces

A workspace is where the agent's files and commands live: your machine with LocalWorkspace, or an isolated sandbox. Harness capabilities never pick one for you. Attach one, or the run fails at its start and tells you what to attach.

Coder, FileSystem, Shell, Repo Context, and Macroscope work in the run's workspace, starting in its working directory. To work in a subdirectory, set it on the workspace: LocalWorkspace('./repo'). To continue in the same files from a later run or another agent, see Sharing a workspace.

Skills, SubAgents, ToolOutputLimits, and Memory's FileStore use the run's workspace for their own files too. To keep those files on your machine while the agent works in a sandbox, point them at a local location:

from pydantic_ai.workspaces import LocalWorkspaceBackend
from pydantic_ai_harness import Memory, ToolOutputLimits
from pydantic_ai_harness.memory import FileStore
from pydantic_ai_harness.tool_output_limits import LocalFileStore

memory = Memory(FileStore('.', workspace=LocalWorkspaceBackend('/var/lib/myapp/memory')))  # notes on this machine
limits = ToolOutputLimits(store=LocalFileStore())  # spills in this machine's temp directory

By default, harness files (Shell's background job logs, tool-output spills) go in .pydantic-ai-harness/ in the workspace's working directory, which is git-ignored.

Step Persistence's file and SQLite stores, Media's disk and SQLite stores, and Code Mode mounts use paths on the machine running the agent, not the run's workspace.

FileSystem's root_dir limits only the file tools, not Shell commands.

Upgrading from an earlier release? The Coder page lists what changed.

Capabilities

Every capability is a self-contained unit you drop into capabilities=[...], and they all compose, with each other and with your own. Some come with pydantic-ai itself, the rest with this package; the Package column says which. 50+ in all, grouped by what they give your agent:

Harnesses

Complete agent stacks as regular combined capabilities: one import gives you a working agent, and you can take either apart into the blocks below.

Harness Package What it provides
Coder Harness Six coding tools, persistent shell commands, delegation to itself, autonomous guidance, and context controls
Researcher Harness A complete web-research stack: search, page fetching, a delegated sub-researcher, and bounded tool output

Execution environments

The workspace the agent acts in: the files it edits and the commands it runs, local or isolated.

Capability Package What it does
FileSystem Harness Read, write, edit, list, and search files under a root in the run's workspace, with opt-in ripgrep tools; path-traversal checked, secrets read-only
Shell Harness Command execution in the run's workspace with allowlists, denylists, timeouts, credential-stripping, and opt-in commands that outlive the run
Modal Sandbox Harness Commands and files in an isolated Modal cloud sandbox
E2B Sandbox Harness Commands and files in an isolated E2B cloud sandbox
Sprites Sandbox Harness Commands and files in a persistent Fly.io Sprite
SSH Workspace Harness Commands and files on a remote host over your ssh client; no isolation
Bubblewrap Sandbox Harness Wraps another workspace capability so its commands run in a Linux bubblewrap sandbox on that workspace's host

Tools & native abilities

Connections to systems outside the agent's workspace, and abilities the provider executes natively.

Capability Package What it does
MCP Core Connect any MCP server's tools; local by default, provider-native connectors opt-in
Image Generation Core Generate and edit images; provider-native where supported, sub-agent fallback elsewhere
GitHub Harness Read and change GitHub repositories, issues, pull requests, and other accessible resources.
Linear Harness Read and change Linear issues, projects, teams, and comments.
Notion Harness Search and change Notion workspace content.
Google Workspace Harness Use Gmail, Calendar, Drive, and other Google Workspace tools.
StackOne Harness Act on linked SaaS accounts (HRIS, ATS, CRM, …) via StackOne
Slack Harness Give an agent Slack messages, channels, and canvas tools.
Ordinal Harness Draft, schedule, and analyze social posts through Ordinal's hosted MCP server
Grain Harness Search meetings, transcripts, and notes through Grain's hosted MCP server
Day AI Harness Search and update CRM records and meeting context through Day AI's hosted MCP server
PostHog Harness Query product analytics and manage feature flags, experiments, and dashboards through PostHog's hosted MCP server
Pylon Harness Work with support issues, accounts, and contacts through Pylon's hosted MCP server
LocalStack Harness An emulated AWS environment with AWS CLI tools
Macroscope Harness Run a local Macroscope code review and hand the findings to the agent

Web & research

Finding and reading things on the open web.

Capability Package What it does
Web Search Core Provider-native search where available, local DuckDuckGo fallback everywhere
Web Fetch Core Fetch and read URLs, native or local
X Search Core Search X; native on xAI, subagent fallback elsewhere
Exa Search Harness Web research via Exa: excerpted search, full-page reads, opt-in cited deep search
Exa Agent Harness Delegate open-ended research to the Exa Agent API
You.com Search Harness Web search and page reads via You.com: query-relevant excerpts or full-page markdown
You.com Research Harness Cited answers and multi-step research via the You.com Answer, Research, and Finance Research APIs
Browser Use Harness Hand web tasks to an autonomous browser-use agent driving a real browser
Playwright Browser Harness Drive a real Chromium page yourself: navigate, click, type, read, and inspect what the page did

Reasoning, planning & delegation

How the agent thinks and divides the work.

Capability Package What it does
Thinking Core Provider-adaptive extended thinking at configurable effort
Planning Harness Model-owned task plans with a cache-safe live reminder
Subagents Harness Delegate self-contained tasks to named child agents
Dynamic Workflow Harness The model orchestrates sub-agents from one Python script: fan-out, chain, vote in a single tool call, with hard max_agent_calls budgets
Advisor Harness Let an executor consult a stronger model mid-run
Background Tools Harness Run selected tools concurrently; results arrive as follow-up messages

Context management

How the agent spends its context window: the difference between an agent that degrades over a long run and one that doesn't, and between paying for tokens N times or once.

Capability Package What it does
Code Mode Harness The model writes one Python script that calls many tools inside a Monty sandbox: one round-trip instead of N, and intermediate results never enter the context window. The answer to tool-call token bloat
Tool Search Core Load tool definitions on demand instead of carrying hundreds in every prompt
Compaction Core Provider-native compaction on OpenAI and Anthropic; the provider summarizes history server-side
Compaction Harness Model-agnostic strategies: tool-result clearing, sliding-window trimming, LLM summarization, tiered; all window-relative, with live usage reporting
Tool Output Limits Harness Truncate, spill to a queryable file, or summarize oversized tool returns at the source
Warn On Cache Busts Harness Detect prompt-cache prefix collapses between requests, from the provider's own numbers

Knowledge & memory

What the agent knows and remembers, loaded when relevant instead of carried in every prompt.

Capability Package What it does
Memory Harness A persistent, namespaced notebook: bounded prompt injection, on-demand search; in-memory/file/Postgres stores
Conversation Search Harness BM25 search over stored history, including turns compaction dropped
Skills Harness Load Agent Skill (SKILL.md) instructions on demand
Repo Context Harness Start runs oriented: AGENTS.md/CLAUDE.md + repository structure
Pydantic AI Docs Harness On-demand Pydantic AI documentation lookup

Control & safety

Bounding what the agent may do, and keeping it on-instructions.

Capability Package What it does
Repair Tool Arguments Harness Repair malformed JSON tool arguments before schema validation.
Guardrails Harness Validate/block/redact user input, tool calls, tool results, and output, including secret masking and parallel async guards
Prompt Injection Defender Harness Classify local tool results for indirect prompt injection and optionally withhold high-risk results
Spend Limits Harness Cross-window USD/token budgets and per-response cost tracking, per model and per tenant
Ask User Harness Let the model ask the user multiple-choice questions mid-run; you supply the answerer (terminal, web, test)
Tool approval Core Flag tool calls that need human approval before they run
Tool Call Judge Harness A second model answers one risk question per tool call and blocks the call before the tool function runs
Handle Deferred Tool Calls Core Resolve approval-deferred tool calls programmatically
System Reminders Harness Cache-safe re-injection of guidance mid-run to counter instruction fade
Trajectory Judge Harness A second model reviews the live run every N requests over a sliding token window and steers it mid-run

Self-extension

Capability Package What it does
Capability Creation Harness The agent writes, validates, and persists new capabilities during a run; the host loads them into a later run via store.load_active() and capabilities=

Execution runtime

Outside the loop: how runs persist, survive failures, and get observed and configured in production.

Capability Package What it does
Durable execution Core Runs that survive restarts and failures on Temporal, DBOS, or Prefect, with Restate, Kitaru, and Airflow integrations. See what works on each engine for Coder, Shell, and FileSystem
AWS Lambda durability Harness Checkpoint model requests and tool calls into AWS Lambda durable function steps
Absurd durability Harness Checkpoint model requests, MCP calls, and tool calls into Absurd steps on PostgreSQL
Step Persistence Harness Save, restore, resume (continue_run), and fork (fork_run) runs; file/SQLite/Mongo backends
Instrumentation Core OpenTelemetry GenAI spans for every model and tool call; the raw material for Logfire traces
Logfire MCP Harness Query Logfire telemetry and manage observability resources.
Managed Prompt Harness Back instructions with a Logfire-managed prompt; version and roll out without redeploying
Thread Executor Core Run sync tools on a shared thread pool

Core also ships loop-customization capabilities for production servers: Select Model, Resolve Model ID, Prepare Tools / Prepare Output Tools, Prefix Tools, Set Tool Metadata, Include Tool Return Schemas, Process History, Process Event Stream, Reinject System Prompt, and Raise Content Filter Error.

And the agent plugs into any interface: ACP (experimental, Harness) serves it to editors like Zed over the Agent Client Protocol, and core ships the web chat UI, CLI, frontend adapters (AG-UI, Vercel AI), and realtime voice.

Community packages extend the same capability system further; see third-party capabilities.

Composing from blocks

A research agent from regular capabilities -- this is literally Researcher's composition, minus its short default instructions:

from pydantic_ai import Agent
from pydantic_ai.capabilities import WebFetch, WebSearch
from pydantic_ai_harness import SubAgent, SubAgents, ToolOutputLimits
from pydantic_ai_harness.tool_output_limits import LocalFileStore

sub_researcher = SubAgent(
    Agent(
        name='researcher',
        description='Research a focused sub-question on the web and report back with findings and source links',
        capabilities=[WebSearch(local=True), WebFetch(local=True), ToolOutputLimits(store=LocalFileStore())],
    )
)

agent = Agent(
    'anthropic:claude-opus-5-5',
    capabilities=[
        WebSearch(local=True),  # native provider search, DuckDuckGo fallback elsewhere
        WebFetch(local=True),  # read the pages behind the results, native or local
        SubAgents(agents=[sub_researcher], agent_folders=None),
        ToolOutputLimits(store=LocalFileStore()),  # fetched pages don't flood the context
    ],
)

result = agent.run_sync('What changed in the top three Python agent frameworks this month? Cite sources.')
print(result.output)
#> ...

Everything is observable: logfire.instrument_pydantic_ai() gives you a full trace of every run: every model call and tool call, with token and cost tracking. It's standard OpenTelemetry, so any OTLP backend works; Logfire is the easiest way to see it during development.

When do you need the Harness?

"Harness" is the field's term for everything around the model that turns it into an agent: the loop, the tools, the context management. Reach for this package when your agent should do more than core's lean harness covers: touch files, run code, browse, remember, delegate, or stay coherent through hours-long runs. The boundary between the packages is mechanical, not a maturity tier: core ships the capabilities that require model or framework support (provider-native tools like image generation, provider APIs like compaction, deep loop integration like tool search, and fundamentals like thinking, MCP, and web search) and the Harness ships everything else, as a separate package so capabilities can iterate at the speed the field moves while Pydantic AI itself stays lean.

Installation

uv:

uv add pydantic-ai-harness

pip:

pip install pydantic-ai-harness

This installs pydantic-ai-slim with it, so it works on its own; you don't need to install Pydantic AI separately. Model providers and the CLI come via extras that pass through to Pydantic AI: pydantic-ai-harness[anthropic], [cli]. Some capabilities need their own extra for optional dependencies; each capability's page gives its exact install line. Requires Python 3.11+.

Build your own

Capabilities are the primary extension point for Pydantic AI, and every capability in this repo doubles as a worked example. Publishing a standalone package? Use the pydantic-ai-<name> naming convention; see Publishing capability packages.

Contributing

We welcome capability contributions:

  1. Start with an issue. Open a feature request so we can discuss approach and priority before code is written.
  2. Then open a PR and link the issue. We review based on community interest; upvotes on both count.
  3. Don't chase green CI. Get the approach working and let us know; we may push to your branch or follow up, and you'll be credited as the original author. (See the Pydantic AI contributing guide.)

Development

make install   # install dependencies
make format    # ruff format
make lint      # ruff check
make typecheck # pyright strict
make test      # pytest
make testcov   # pytest with 100% branch coverage

Version policy

Pydantic AI Harness uses 0.x versioning, and that's a statement about API stability, not maturity: these capabilities are tested end-to-end and meant for production use, but their APIs may still move between minor releases (0.1 -> 0.2): renamed parameters, changed defaults, restructured APIs, always with deprecation warnings where practical. Patch releases will not intentionally break existing behavior, and every breaking change is documented in release notes with migration guidance your agent can follow. Keeping the Harness a separate package from Pydantic AI, which has a stricter version policy, is what lets capabilities iterate at the speed the field moves.

Part of the Pydantic Stack

Everything you need to ship production-grade AI agents:

License

MIT; see LICENSE.

Metadata

Release files for pydantic-ai-harness 0.55.0

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

Source distribution (sdist)

Source distribution for pydantic-ai-harness 0.55.0
File Size Uploaded
pydantic_ai_harness-0.55.0.tar.gz 1.0 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for pydantic-ai-harness 0.55.0
File Interpreter ABI Platform
pydantic_ai_harness-0.55.0-py3-none-any.whl Python 3 none any Details

Total release size: 2.3 MB

Release files / pydantic_ai_harness-0.55.0.tar.gz

Download URL pydantic_ai_harness-0.55.0.tar.gz
Size 1.0 MB
Tags Source
SHA-256 checksum
How to use checksums
f360d5b1aa0d285e304bc3f4fc6d816ed47fdbfc0b1e0dbf4c34cc87b6f6547a
BLAKE2b-256 checksum
How to use checksums
e690fb4e5935ff61de52f7c420fed6112f565987da4367eadba3c766abe27077
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Oct 9, 2026.

Transparency log

Release files / pydantic_ai_harness-0.55.0-py3-none-any.whl

Download URL pydantic_ai_harness-0.55.0-py3-none-any.whl
Size 1.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
3212a7c2dd53642d88f39bf28d94ef6ace72439e96468992352cd67ba7d5ee25
BLAKE2b-256 checksum
How to use checksums
94f441a2c082c43a69d5772159ba92880d027e5538a37ed7b2bcd151077b216e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

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 Oct 9, 2026.

Transparency log

Release history Release notifications | RSS feed

0.57.0

2 release files

0.56.0

2 release files

This release

0.55.0 This release

2 release files

0.52.0

2 release files

0.36.0

2 release files

0.35.0

2 release files

0.34.0

2 release files

0.33.0

2 release files

0.32.0

2 release files

0.31.0

2 release files

0.27.0

2 release files

0.26.0

2 release files

0.25.0

2 release files

0.24.0

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.18.1

2 release files

0.14.0

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

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