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.
| Path | What it defines |
|---|---|
agent/instructions.md |
Always-on system prompt |
agent/agent.py |
Runtime config (model, description) |
agent/tools/get_weather.py |
Tool 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(), anditer()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
| Feature | Eve.dev | AgentiPy | pydantic-ai alone |
|---|---|---|---|
| Language | TypeScript | Python | Python |
| 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) | ✅ |
| Platform | Intel Mac, Apple Silicon | Any (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 toolexecute()(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
Metadata
Release files for agentopy 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| agentopy-0.1.0.tar.gz | 16.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentopy-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.9 kB
Release files / agentopy-0.1.0.tar.gz
| Download URL | agentopy-0.1.0.tar.gz |
|---|---|
| Size | 16.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9bdc053b308d39c2ce3195a6ffd51f85a418685d90288bfafdf1076d90da1bbe
|
|
BLAKE2b-256 checksum How to use checksums |
6596886a9a167110a873ba413469dab39e674080360f5c49923c5159fa340f3b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / agentopy-0.1.0-py3-none-any.whl
| Download URL | agentopy-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
057d69f0558373397ec69d73573b22153187181d4c29ae30655c14d26f15e348
|
|
BLAKE2b-256 checksum How to use checksums |
53f1b28b5ea045d49c7b2c0e97e8c8fc5be75b3b81478d6a991376b2ceaff58e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Security for agentopy 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.