Catalog PyPI
PACKAGE EXPLORERView in registry

agentopy

PyPI

[Prototype] Filesystem-first durable agent framework built on pydantic-ai v2 — exploring ideas inspired by Eve.dev, fully open source with no vendor lock-in

Versions collected1
Direct dependencies7From release 0.1.0
Last observed20 Oct, 22:49 UTC

README

Version 0.1.0 documentation

AgentiPy

⚠️ Prototype — exploring the idea of a filesystem-first, durable agent framework built on pydantic-ai v2.

This is an experimental prototype for research and exploration. It is not production-ready. The API, architecture, and implementation are all subject to change as the ideas are validated and iterated on.

Inspired by Eve.dev — exploring how to replicate its filesystem-first developer experience in Python, entirely on open-source foundations with no vendor lock-in.

my-agent/
├── pyproject.toml
└── agent/
    ├── agent.py                # Model config
    ├── instructions.md         # System prompt
    ├── tools/
    │   └── get_weather.py      # Tool: filename = tool name
    ├── skills/
    │   └── be-concise.md       # On-demand procedures
    └── channels/               # Platform entrypoints

Philosophy

The filesystem IS the interface. A file's location determines its role. No registry to maintain — add a file, and the agent discovers it.

PathWhat it defines
agent/instructions.mdAlways-on system prompt
agent/agent.pyRuntime config (model, description)
agent/tools/get_weather.pyTool named get_weather
agent/skills/On-demand markdown procedures
agent/channels/Platform entrypoints (HTTP, Slack, etc.)

Quick Start

# Install
pip install agentopy

# Scaffold a new agent
agentopy init my-agent

# Chat with it
cd my-agent && agentopy chat

# Or start the HTTP server
agentopy dev --no-ui

Demo: Weather Agent

cd demo-agent
agentopy chat --agent-dir agent

# Or HTTP server
agentopy dev --agent-dir agent --no-ui

HTTP API

POST /agentopy/v1/session                 — Start a session
GET  /agentopy/v1/session/<id>/stream     — NDJSON event stream
POST /agentopy/v1/session/<id>            — Continue a session
GET  /health                               — Health check
curl -X POST http://127.0.0.1:2000/agentopy/v1/session \
  -H 'content-type: application/json' \
  -d '{"message":"What is the weather in New York?"}'

Architecture

┌─────────────────────────────────────────────────────────┐
│                    CLI / HTTP Client                     │
└──────────────────────┬──────────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────────┐
│                     EveAgent                             │
│  ┌─────────────┐  ┌──────────────────┐  ┌────────────┐  │
│  │  Loader     │  │  pydantic-ai     │  │  Sessions  │  │
│  │  (discovers │──►  Agent wrapper   │──►  (in-mem   │  │
│  │   files)    │  │  (tool reg,      │  │   store)   │  │
│  │             │  │   streaming)     │  │            │  │
│  └─────────────┘  └──────────────────┘  └────────────┘  │
└──────────────────────┬──────────────────────────────────┘
                       │
┌──────────────────────▼──────────────────────────────────┐
│                   pydantic-ai v2                         │
│  ┌──────────┐  ┌──────────┐  ┌──────────────────────┐   │
│  │ Agent    │  │ Tools    │  │ Capabilities          │   │
│  │ (loop,   │  │(typed fn)│  │ (Think, WebSearch, …) │   │
│  │  stream) │  │          │  │                       │   │
│  └──────────┘  └──────────┘  └──────────────────────┘   │
└─────────────────────────────────────────────────────────┘

Key Design Decisions

1. Filesystem-first discovery

No registries, no imports. loader.py walks agent/ and builds a config from file paths. A file at agent/tools/get_weather.py becomes tool get_weather.

2. Thin wrapper over pydantic-ai

AgentiPy leverages pydantic-ai's battle-tested Agent class, tool system, streaming, and model abstraction:

  • Provider-agnostic: OpenAI, Anthropic, Gemini, DeepSeek, Ollama — everything pydantic-ai supports
  • Type-safe tools: All tools get validated parameter schemas
  • Streaming: Built-in run_stream(), run_stream_events(), and iter() support
  • Capabilities: Plug in Thinking, WebSearch, MCP, etc. via YAML

3. API design

POST /agentopy/v1/session and GET /agentopy/v1/session/<id>/stream follow Eve.dev's NDJSON streaming protocol for familiarity.

4. Session management

In-memory session store with message history across turns. Pluggable — swap in SQLite/PostgreSQL for production.

Comparison

FeatureEve.devAgentiPypydantic-ai alone
LanguageTypeScriptPythonPython
Filesystem-first✅✅❌ (code-only)
YAML agent specs❌✅ (via agent.yaml)✅
Durable execution✅ (Workflow SDK)🔄 (via pydantic-ai caps)✅ (Temporal, DBOS, Prefect, Restate)
Open source✅✅✅
Vendor lock-in❌ (Vercel ecosystem)✅ none✅ none
Provider-agnostic✅ (AI SDK)✅ (pydantic-ai)✅
NDJSON streaming✅✅✅
MCP support✅🔄 (via pydantic-ai)✅
Capabilities system❌🔄 (leverages pydantic-ai)✅
PlatformIntel Mac, Apple SiliconAny (Python)Any

✅ = built-in | 🔄 = via pydantic-ai | ❌ = not available

Writing Tools

Each tool is a Python file in agent/tools/. The filename (minus .py) becomes the tool name.

# agent/tools/get_weather.py
from datetime import datetime

description = "Get the current weather for a city."


async def execute(city: str, units: str = "fahrenheit") -> dict:
    """Return weather data for the given city."""
    return {
        "city": city,
        "temp": 72,
        "condition": "Sunny",
        "unit": "F"[0],
        "reported_at": datetime.now().isoformat(),
    }

The file must define:

  • description (str): What the model sees for this tool
  • execute() (sync/async): The tool function, with typed parameters

Writing Skills

Skills are markdown files in agent/skills/. They're appended to the system prompt.

# Be Concise

When asked for a skill, respond in exactly one sentence.
No greetings, no sign-offs, no explanations.

Configuration

agent/agent.py:

model = "openai:gpt-4o"
description = "A friendly weather assistant"

Or agent/agent.yaml:

model: anthropic:claude-sonnet-4-20250514
description: A friendly weather assistant
instructions: "You are a concise weather bot."

Roadmap

  • Filesystem loader (tools, instructions, skills)
  • pydantic-ai Agent integration
  • Session management with message history
  • HTTP server with NDJSON streaming
  • CLI: init, dev, chat, run
  • YAML agent config support
  • Durable execution (Temporal, DBOS capabilities)
  • On-demand skill loading (not always in context)
  • Subagents (nested agent directories)
  • MCP connections
  • Human-in-the-loop tool approval
  • Slack/Discord channels
  • Persistent session store (SQLite)
  • OpenTelemetry/Logfire instrumentation

License

MIT

Downloads & popularity

4downloads
1-day window · source-reported counts20 Oct 2026
96480
2026-07-23: 96 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-23–2026-07-232026-07-24: 16 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-24–2026-07-242026-07-25: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-25–2026-07-252026-07-26: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-26–2026-07-262026-07-27: 7 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-27–2026-07-272026-07-28: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-28–2026-07-282026-07-29: 6 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-29–2026-07-292026-07-31: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-07-31–2026-07-312026-08-02: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-02–2026-08-022026-08-03: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-03–2026-08-032026-08-04: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-04–2026-08-042026-08-06: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-06–2026-08-062026-08-08: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-08–2026-08-082026-08-09: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-09–2026-08-092026-08-14: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-14–2026-08-142026-08-15: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-15–2026-08-152026-08-17: 6 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-17–2026-08-172026-08-21: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-21–2026-08-212026-08-23: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-23–2026-08-232026-08-24: 7 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-24–2026-08-242026-08-25: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-25–2026-08-252026-08-26: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-26–2026-08-262026-08-27: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-27–2026-08-272026-08-28: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-28–2026-08-282026-08-31: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-08-31–2026-08-312026-09-01: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-01–2026-09-012026-09-07: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-07–2026-09-072026-09-09: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-09–2026-09-092026-09-13: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-13–2026-09-132026-09-14: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-14–2026-09-142026-09-16: 3 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-16–2026-09-162026-09-19: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-19–2026-09-192026-09-20: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-20–2026-09-202026-09-21: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-21–2026-09-212026-09-22: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-22–2026-09-222026-09-23: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-23–2026-09-232026-09-26: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-26–2026-09-262026-09-27: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-27–2026-09-272026-09-30: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-09-30–2026-09-302026-10-01: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-01–2026-10-012026-10-02: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-02–2026-10-022026-10-03: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-03–2026-10-032026-10-06: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-06–2026-10-062026-10-09: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-09–2026-10-092026-10-11: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-11–2026-10-112026-10-12: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-12–2026-10-122026-10-13: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-13–2026-10-132026-10-14: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-14–2026-10-142026-10-15: 5 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-15–2026-10-152026-10-16: 1 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-16–2026-10-162026-10-17: 7 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-17–2026-10-172026-10-18: 2 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-18–2026-10-182026-10-20: 4 · observed 2026-10-21T11:24:14.5505204Z · period 2026-10-20–2026-10-20
23 Jul20 Oct

pypistats · 53 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2042026-10-21T11:24:14.5505204Z
2026-10-18 – 2026-10-1822026-10-21T11:24:14.5505204Z
2026-10-17 – 2026-10-1772026-10-21T11:24:14.5505204Z
2026-10-16 – 2026-10-1612026-10-21T11:24:14.5505204Z
2026-10-15 – 2026-10-1552026-10-21T11:24:14.5505204Z
2026-10-14 – 2026-10-1412026-10-21T11:24:14.5505204Z
2026-10-13 – 2026-10-1322026-10-21T11:24:14.5505204Z
2026-10-12 – 2026-10-1212026-10-21T11:24:14.5505204Z
2026-10-11 – 2026-10-1112026-10-21T11:24:14.5505204Z
2026-10-09 – 2026-10-0922026-10-21T11:24:14.5505204Z
2026-10-06 – 2026-10-0612026-10-21T11:24:14.5505204Z
2026-10-03 – 2026-10-0312026-10-21T11:24:14.5505204Z
2026-10-02 – 2026-10-0212026-10-21T11:24:14.5505204Z
2026-10-01 – 2026-10-0112026-10-21T11:24:14.5505204Z
2026-09-30 – 2026-09-3012026-10-21T11:24:14.5505204Z
2026-09-27 – 2026-09-2722026-10-21T11:24:14.5505204Z
2026-09-26 – 2026-09-2612026-10-21T11:24:14.5505204Z
2026-09-23 – 2026-09-2312026-10-21T11:24:14.5505204Z
2026-09-22 – 2026-09-2212026-10-21T11:24:14.5505204Z
2026-09-21 – 2026-09-2112026-10-21T11:24:14.5505204Z
2026-09-20 – 2026-09-2022026-10-21T11:24:14.5505204Z
2026-09-19 – 2026-09-1922026-10-21T11:24:14.5505204Z
2026-09-16 – 2026-09-1632026-10-21T11:24:14.5505204Z
2026-09-14 – 2026-09-1432026-10-21T11:24:14.5505204Z
2026-09-13 – 2026-09-1322026-10-21T11:24:14.5505204Z
2026-09-09 – 2026-09-0912026-10-21T11:24:14.5505204Z
2026-09-07 – 2026-09-0732026-10-21T11:24:14.5505204Z
2026-09-01 – 2026-09-0112026-10-21T11:24:14.5505204Z
2026-08-31 – 2026-08-3112026-10-21T11:24:14.5505204Z
2026-08-28 – 2026-08-2832026-10-21T11:24:14.5505204Z
2026-08-27 – 2026-08-2722026-10-21T11:24:14.5505204Z
2026-08-26 – 2026-08-2612026-10-21T11:24:14.5505204Z
2026-08-25 – 2026-08-2512026-10-21T11:24:14.5505204Z
2026-08-24 – 2026-08-2472026-10-21T11:24:14.5505204Z
2026-08-23 – 2026-08-2332026-10-21T11:24:14.5505204Z
2026-08-21 – 2026-08-2122026-10-21T11:24:14.5505204Z
2026-08-17 – 2026-08-1762026-10-21T11:24:14.5505204Z
2026-08-15 – 2026-08-1522026-10-21T11:24:14.5505204Z
2026-08-14 – 2026-08-1422026-10-21T11:24:14.5505204Z
2026-08-09 – 2026-08-0932026-10-21T11:24:14.5505204Z
2026-08-08 – 2026-08-0812026-10-21T11:24:14.5505204Z
2026-08-06 – 2026-08-0632026-10-21T11:24:14.5505204Z
2026-08-04 – 2026-08-0422026-10-21T11:24:14.5505204Z
2026-08-03 – 2026-08-0312026-10-21T11:24:14.5505204Z
2026-08-02 – 2026-08-0212026-10-21T11:24:14.5505204Z
2026-07-31 – 2026-07-3122026-10-21T11:24:14.5505204Z
2026-07-29 – 2026-07-2962026-10-21T11:24:14.5505204Z
2026-07-28 – 2026-07-2822026-10-21T11:24:14.5505204Z
2026-07-27 – 2026-07-2772026-10-21T11:24:14.5505204Z
2026-07-26 – 2026-07-2612026-10-21T11:24:14.5505204Z
2026-07-25 – 2026-07-2532026-10-21T11:24:14.5505204Z
2026-07-24 – 2026-07-24162026-10-21T11:24:14.5505204Z
2026-07-23 – 2026-07-23962026-10-21T11:24:14.5505204Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.023 Jul 20267

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 22:49 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:28bf49525a831db09d8aec6cfd04a0db6e501aab0939bb60ae7d7a4c66b8c615