Releases: vstorm-co/pydantic-deepagents
Releases · vstorm-co/pydantic-deepagents
Release list
0.3.12
[0.3.12] - 2026-04-13
Added
- Bandit security scanner — Bandit is now part of the development toolchain and CI pipeline. It runs on every commit via the new
securityjob in GitHub Actions and is also available locally viamake security. The scanner checks production code (pydantic_deep/) for common Python security vulnerabilities (CWE-listed issues). No medium- or high-severity findings block a merge. - GitHub Issue Templates — structured forms for bug reports and feature requests guide contributors to provide the right information. Blank issues are disabled; the config redirects security reports to
security@vstorm.co. - Pull Request Template — a checklist-based PR template ensures contributors verify tests, linting, type checking, and the security scan before requesting review.
Fixed
- MD5
usedforsecurityflag (StuckLoopDetection) —hashlib.md5()calls used for tool-call fingerprinting instuck_loop.pynow passusedforsecurity=False, correctly signalling that the hash is used for deduplication (not cryptographic security). This resolves a Bandit B324 High-severity finding.
Changed
- CONTRIBUTING.md — expanded with an explicit test policy (new functionality requires tests; 100 % coverage is enforced mechanically), a coding-standards reference table (Ruff, Pyright, MyPy, Bandit with
pyproject.tomllinks), English-language requirement, API docs pointer, and a static-analysis section documenting all quality gates. make all— now includesmake security(Bandit scan) in addition to the existing format → lint → typecheck → testcov sequence.- Docs site — homepage (
docs/index.md) rewritten with a plain-language problem/solution description and explicit "Next Steps" links to Installation, Getting Help, and Contributing. Newdocs/contributing.mdpage added to the nav, covering setup, PR requirements, and test policy.docs/index.mdsubtitle updated to remove jargon. - OpenSSF Best Practices badge — badge embedded in README and docs homepage; badge targets project ID 12495 at bestpractices.dev.
0.3.11
[0.3.11] - 2026-04-13
Fixed
- Browser opens on every message (
BrowserCapability) —async_playwright()was entered eagerly
at the start ofwrap_run, spawning the Playwright Node.js driver process (which in turn opened a
browser window) on every agent run — even when no browser tool was ever called. The Playwright context
manager is now entered lazily inside the first-tool-call launcher, so runs that never use the browser
incur zero Playwright overhead and no browser process is started. - Browser window always visible (
browser_headlessdefault) — the CLI config defaulted
browser_headless = false, meaning any browser launch produced a visible Chrome window. Changed to
browser_headless = true.
0.3.10
0.3.9
[0.3.9] - 2026-04-12
Added
- Chromium auto-install (
BrowserCapability.auto_install) — when the Chromium binary is missing,
BrowserCapabilitynow automatically runsplaywright install chromiumvia the current Python
interpreter before the first agent run. On success the launch is retried immediately; on failure the
browser degrades gracefully (tools hidden, no instructions injected) without crashing the agent.
Controlled viaauto_install: bool = TrueonBrowserCapability.
Changed
install.shnow ships browser support out of the box — the one-line installer now installs
pydantic-deep[cli,browser](was[cli]) and runsplaywright install chromiumautomatically.
New users get a fully working browser without any manual steps.- Browser tool usage guidance —
BROWSER_INSTRUCTIONSnow includes an explicit "when to use
browser vs web_search / web_fetch" section. The model is instructed to prefer the lighter
web_search/web_fetchtools for information lookup and static pages, and to reserve the
Playwright browser for interactive workflows (login, forms, JS-heavy SPAs, screenshots).
0.3.8
[0.3.8] - 2026-04-12
Added
- Automatic context limit warnings (
LimitWarnerCapability) — the agent now receives URGENT/CRITICAL
warnings injected as user messages when approaching the context window limit. Warnings start at 70% usage
(well before auto-compression at 90%), giving the model time to wrap up or use/compact. Previously only
the TUI status bar showed context usage — the model itself had no awareness of approaching limits.
Enabled automatically whencontext_manager=True(the default) - Stuck loop detection (
StuckLoopDetection) — new capability that detects repetitive agent behavior
and intervenes before the agent wastes tokens. Detects three patterns: repeated identical tool calls,
A-B-A-B alternating calls, and no-op calls (same result). Configurable threshold (max_repeated, default 3)
and action (warnviaModelRetryorerrorviaStuckLoopError). Per-run state isolation viafor_run().
Enabled by default viastuck_loop_detection=Trueincreate_deep_agent() - BM25-ranked history search —
search_conversation_historynow uses BM25 ranking instead of naive
substring matching. Multi-word queries are tokenized — each word is scored independently, rare terms
(high IDF) rank higher than common ones, and results are sorted by relevance score. Zero dependencies
(pure Python implementation using the standard Elasticsearch/Lucene BM25 formula) - Expanded context file discovery —
DEFAULT_CONTEXT_FILENAMESnow discovers 7 convention file types
instead of 2: addedCLAUDE.md,.cursorrules,.github/copilot-instructions.md,CONVENTIONS.md,
andCODING_GUIDELINES.mdalongside the existingAGENTS.mdandSOUL.md. Subagent allowlist updated
to includeCLAUDE.md(project instructions relevant to subagents)
Changed
- Eviction uses
after_tool_executehook instead of history processor — large tool outputs are now
intercepted before they enter message history via the newEvictionCapability, rather than after
the fact viaEvictionProcessor(history processor). This means the full output never bloats the message
list in memory. The oldEvictionProcessoris preserved for backward compatibility but
create_deep_agent()now usesEvictionCapabilityby default - Orphan repair uses
before_model_requesthook instead of history processor —PatchToolCallsCapability
replacespatch_tool_calls_processoras the default increate_deep_agent(). Integrates with the
pydantic-ai capabilities system instead of raw history processors. The old processor function is preserved
for backward compatibility and standalone use
Fixed
- Browser tools never require approval —
BrowserCapabilitynow usesprepare_toolsto force
kind='function'on all browser tools (navigate, click, execute_js, etc.), ensuring they never
trigger approval dialogs even if a user adds browser tool names toapprove_tools - Checkpoint per-run state isolation —
CheckpointMiddlewarenow implementsfor_run()to return a
fresh instance per agent run with isolated_turn_counterand_latest_messages. Previously, concurrent
agent.run()calls on the same agent would share and corrupt checkpoint state
0.3.7
[0.3.7] - 2026-04-11
Fixed
web_searchnot working for non-Anthropic and OpenRouter models —duckduckgolocal fallback was not
included incli/tuiextras, soWebSearchsilently fell back to native-only mode. Models accessed
through OpenRouter (or any provider without native web-search support) would report noweb_searchtool.
pydantic-ai-slim[duckduckgo]is now bundled in bothcliandtuiextras
0.3.6
[0.3.6] - 2026-04-11
Added
- One-command installer (
install.sh) — macOS and Linux users can now install pydantic-deep without knowing
Python or pip. A single curl command installs uv (if missing) and then the CLI:The script auto-detects uv, falls back to installing it viacurl -fsSL https://raw.githubusercontent.com/vstorm-co/pydantic-deep/main/install.sh | bashastral.sh/uv, then runs
uv tool install "pydantic-deep[cli]". Verifies the installation and prints PATH instructions
if the binary is not immediately discoverable pydantic-deep updatecommand — self-update command that upgrades to the latest PyPI release.
Usesuv tool upgrade pydantic-deepwhen uv is available; falls back to
pip install --upgrade "pydantic-deep[cli]"otherwise- Startup update notifications — on every CLI invocation the tool silently checks PyPI for a newer
version and prints a one-line notice when one is found:The check is backed by a 24-hour file cache (Update available: v0.3.6 → v0.3.7 Run: pydantic-deep update~/.pydantic-deep/update_check.json) so the network
is only hit once per day. A 2-second timeout ensures the check never blocks startup
Fixed
ModuleNotFoundError: No module named 'textual'on fresh install —textualwas listed under the
tuioptional extra but missing fromcli, souv tool install "pydantic-deep[cli]"produced a broken
installation that crashed immediately on launch.textual>=3.0.0is now included in bothcliandtui
0.3.5
[0.3.5] - 2026-04-10
Added
- Headless runner (
pydantic-deep run) — new CLI command for non-interactive task execution. Designed for
benchmarks (Terminal Bench), CI/CD pipelines, and scripted automation. All feature flags mirror the TUI and default
from.pydantic-deep/config.toml. Supports--task-file,--json,--max-turns,--timeout,--model,
--working-dir,--web-search/--no-web-search,--web-fetch/--no-web-fetch,--thinking,--todo/--no-todo,
--subagents/--no-subagents,--skills/--no-skills,--plan/--no-plan,--memory/--no-memory,
--teams/--no-teams,--context/--no-context,--temperature - Harbor adapter (
apps/harbor/) —BaseInstalledAgentimplementation for Terminal Bench evaluation via Harbor.
Installs pydantic-deep in the container viauv, runs tasks withpydantic-deep run --json, parses JSON output for
usage stats. Supports model name conversion (provider/modeltoprovider:model), API key forwarding, custom git ref
viaPYDANTIC_DEEP_GIT_REFenv var. All headless feature flags configurable via Harbor--akkwargs (e.g.
--ak web_search=false) DEFAULT_USAGE_LIMITS— framework-wideUsageLimits(request_limit=None)exported frompydantic_deep.deps.
Removes pydantic-ai's default 50-request limit which causedUsageLimitExceededcrashes on complex benchmark tasks.
Applied in both headless runner and TUI- Docker sandbox for CLI (
--sandbox docker) — run the agent inside a Docker container for isolated code execution.
The TUI and headless runner stay in the terminal but all file operations and shell commands execute inside the
container. The working directory is mounted at/workspace(read-write) so project files are shared. Container is
automatically stopped on exit. Supports bothpydantic-deep tui --sandbox dockerand
pydantic-deep run "task" --sandbox docker. Configurable viasandboxandsandbox_imagein
.pydantic-deep/config.toml. Requirespydantic-ai-backend[docker] - Named workspaces (
--workspace <name>) — shared Docker environment that persists across threads. Installed
packages and any state outside the mounted volume survive between sessions. Multiple conversation threads can share
the same workspace — each thread keeps its own history (.pydantic-deep/sessions/{thread_id}/messages.json) while the
Docker container and its state are shared. Usage:pydantic-deep tui --workspace ml-envor
pydantic-deep run "task" --workspace dev. Implies--sandbox dockerautomatically - Workspace management (
pydantic-deep sandbox) — new subcommands:sandbox listshows Docker workspaces for the
current project with status/image/creation date;sandbox stop <name>stops a specific workspace;
sandbox stop all --rmstops and removes all project workspaces - Browser automation (
BrowserCapability) — Playwright-based browser control viapydantic-deep[browser].
Gives agents 9 tools:navigate,click,type_text,get_text,screenshot,scroll,go_back,go_forward,
execute_js. Single-tab design with automatic popup interception. Domain allowlist, content truncation, and optional
auto-screenshot on navigate. Browser lifecycle managed bywrap_run— Chromium starts before agent runs, closes
after (on success, exception, or cancellation). Requiresplaywright>=1.40.0andplaywright install chromium.
Optionalhtml2text>=2020.1for better content extraction --browser/--no-browserCLI flag — opt-in browser automation forpydantic-deep tuiandpydantic-deep run.
Disabled by default (include_browser = false). Enable with--browserflag orinclude_browser = truein
config.toml--browser-headless/--browser-headedCLI flag — control browser window visibility. Default is headed (window
visible,browser_headless = false). Use--browser-headlessfor CI/scripted use,--browser-headedfor
interactive sessionsBrowseResulttype — structured result from browser operations:url,title,content,screenshot,
errorfields. Exported frompydantic_deep.typesbrowserextras —pip install 'pydantic-deep[browser]'installsplaywright>=1.40.0andhtml2text>=2020.1.
Added toallextras
Changed
create_cli_agent()feature flags now read from config.toml —include_skills,include_plan,include_memory,
include_subagents,include_todo,context_discovery,web_search,web_fetch,thinking,include_teams, and
temperatureall default toNone(= read from config). Previously hardcoded toTrue, ignoring config.toml values.
Explicit parameters still override config- Headless runner uses same defaults as TUI —
pydantic-deep runno longer hardcodesinclude_plan=Falseand
include_memory=False. All features inherit from config.toml, overridable via CLI flags - Headless runner auto-initializes
.pydantic-deep/—pydantic-deep runnow callsensure_initialized()before
creating the agent, ensuring config, skills, and memory scaffolding exist in the working directory - Default model changed to
anthropic:claude-opus-4-6— updated inCliConfig,init.pytemplate, and model
picker - Model picker updated — 25 OpenRouter models (Anthropic, OpenAI, Google, Z-AI, X-AI), refreshed
Anthropic/OpenAI/Google direct models - Prompt stack deduplicated —
BASE_PROMPTwas included twice (framework + CLI layer). CLI prompt now only adds
CLI-specific sections (Path Handling, Exactness, Provided Data). Removed redundant "Bias Towards Action", "Avoid
Over-Engineering", "Parallel Tool Calls" from CLI layer (already in BASE_PROMPT) - Prompt streamlined — removed "Executing Actions with Care" section (approve_tools handles this mechanically),
merged "Tone and Formatting" + "Progress Updates" into 3-line "Output" section, added 5-step workflow (Research →
Understand → Implement → Verify → Retry), strengthened error handling with "NEVER declare done if last test failed" - Directory tree excludes
.pydantic-deep/— sessions, logs, and config internals no longer leak into the system
prompt tree - TUI: all tool calls now visible — todo tools (
read_todos,write_todos,add_todo,update_todo_status,
remove_todo) are no longer hidden from the UI - TUI: side panel visible by default — shows on startup when terminal >= 100 chars wide, responsive to resize
- TUI: default subagents shown on startup — side panel lists available subagents (planner, research) with idle
status before any delegation occurs - TUI: thinking content displayed — model thinking/reasoning streamed live as dimmed text, collapsed to summary
after completion - TUI: per-turn token usage — each assistant response shows
in:X · out:Y · total:Z · reqs:Nbelow the text - TUI: header shows cumulative tokens and cost —
in:45K out:3K · $0.12in the top bar after responses - TUI: all notifications logged —
DeepApp.notify()override andnotify_error/warning/successhelpers write to
per-session log file - TUI: session saved on error —
_save_session()moved tofinallyblock somessages.jsonis persisted even
after agent crashes or cancellation - TUI: subagent output fully logged —
tool_log.jsonlstores up to 20K chars for subagent task results (was 2K),
debug log includes full output for task tool calls
Fixed
ensure_initialized()now always populates missing scaffolding — previously only raninit_projectwhen
.pydantic-deep/didn't exist at all. Now always runs idempotent init, so missing built-in skills, config, or memory
templates are added to existing directoriescontextlibscope error in chat.py —import contextlibwas insideexceptblock but used infinally. Moved
to top-level import- CostUpdated message routing —
_on_cost_updatecallback now posts toapp.screen(notapp), fixing Textual
message routing soChatScreen.on_cost_updatedactually receives cost/token updates
0.3.4
[0.3.4] - 2026-04-09
Changed
- Merged TUI into
apps/cli/— removed old interactive/non-interactive CLI, TUI is now the default interface. Runningpydantic-deepwithout a subcommand launches the TUI - Redesigned
/improvepipeline — addedUserFactInsightandAgentLearningInsightextraction categories; relaxed synthesis rules so user facts from a single session are accepted; MEMORY.md is now the primary target for personal facts and agent learnings - Configurable context file paths in
/improve—ImprovementAnalyzeracceptscontext_filesmapping for backend-agnostic path resolution (supports LocalBackend, Docker, etc.) - Structured tool call logging — sessions now save
tool_log.jsonlalongsidemessages.jsonfor richer execution traces (inspired by Meta-Harness) - Raw tool traces in synthesis — synthesis agent receives both extracted insights and raw tool call sequences, following Meta-Harness finding that raw traces >> summaries
- Debug logging — per-session logs in
.pydantic-deep/logs/withlatest.logsymlink - Added
/configcommand to TUI for viewing and updating config.toml
Fixed
/improvecrash — unescaped{}in prompt templates causedstr.format()errors/improvesilent failures — extraction errors were swallowed; now reportsfailed_sessionscount andlast_error/improveAPI key missing — improve pipeline now loads keys from keystore before creating agents/improvewrong model — used hardcoded OpenRouter fallback; now uses current agent's model/improveMEMORY.md path mismatch — wrote to project root instead of.pydantic-deep/main/MEMORY.md
Removed
- Old interactive CLI (
apps/cli/interactive.py,non_interactive.py,display.py, etc.) runandchatCLI commands (replaced by TUI)- Dead
agent_worker.pycode
0.3.3
[0.3.3] - 2026-04-02
Changed
- Default models changed: main agent
anthropic:claude-opus-4-6, subagentsanthropic:claude-sonnet-4-6, summarizationanthropic:claude-haiku-4-5-20251001 - Replaced
include_general_purpose_subagentwithinclude_builtin_subagents— adds a built-in "research" deep agent (filesystem + web + memory) instead of a plain pydantic-ai Agent - Subagents are now deep agents by default — all subagents (built-in and custom) are created via
create_deep_agent()with filesystem, web, memory, eviction, and patch support. Custom subagents that don't specifyagentoragent_factoryautomatically get the deep agent factory - Removed
skillsparameter fromcreate_deep_agent()— pass pre-loaded skills viaSkillsToolset(skills=[...])in thetoolsetsparameter instead - Removed
image_supportparameter fromcreate_deep_agent()— image support is now always enabled (multimodalread_filefor.png,.jpg,.gif,.webp) - Changed
include_memorydefault fromFalsetoTrue— persistent agent memory is now enabled by default - Changed
max_nesting_depthdefault from0to1— subagents can now spawn their own subagents by default - Simplified context file discovery to
AGENTS.mdandSOUL.mdonly (removed DEEP.md, AGENT.md, CLAUDE.md). Subagents see onlyAGENTS.md;SOUL.mdis main-agent-only - Replaced
include_webwith separateweb_searchandweb_fetchparameters (both defaultTrue) — allows independent control of WebSearch and WebFetch capabilities - Added
thinkingparameter (default"high") — enables model thinking/reasoning via pydantic-aiThinkingcapability. SupportsTrue/False/"minimal"/"low"/"medium"/"high"/"xhigh" - Changed
eviction_token_limitdefault fromNoneto20_000— large tool outputs automatically saved to files - Changed
patch_tool_callsdefault fromFalsetoTrue— orphaned tool calls fixed automatically BASE_PROMPTis now always included in system prompt —instructionsparameter appends to it instead of replacing it- Moved
model_settingsparameter next tomodelincreate_deep_agent()signature
Added
- 5 new hook events:
BEFORE_RUN,AFTER_RUN,RUN_ERROR,BEFORE_MODEL_REQUEST,AFTER_MODEL_REQUEST— maps to pydantic-ai lifecycle hooks for session tracking, LLM call logging, and error alerts compact_conversationtool — agent can manually trigger context compression with optional focus topic (usesContextManagerCapability.request_compact())- Anthropic prompt caching enabled by default (
anthropic_cache_instructions,anthropic_cache_tool_definitions,anthropic_cache_messages) — silently ignored by non-Anthropic models - Built-in "research" subagent (
pydantic_deep/subagents.py) — full deep agent for codebase exploration and web research upload_files()batch method onDeepAgentDepsfor uploading multiple files at onceapprove_toolsconfig in CLI — configure which tools require user approval (default:["execute"]). Set via/config set approve_tools "execute,write_file,edit_file"or inconfig.toml- Skills as slash commands in CLI — type
/code-reviewto activate a skill directly from the picker - 3-tier skill discovery: built-in (
apps/cli/skills/) → user (~/.pydantic-deep/skills/) → project (.pydantic-deep/skills/), with later sources overriding earlier by name - Provider setup wizard in CLI — first-run auto-detects missing API keys and guides through provider selection (Anthropic, OpenAI, Google, OpenRouter) with key input. Keys saved to
.pydantic-deep/.env /providerslash command — switch AI provider and model mid-session/configslash command in CLI — view and change settings interactively (e.g.,/config set include_teams true)web_search,web_fetch,thinking_effort, andinclude_teamsas configurable options inconfig.toml- ACP (Agent Client Protocol) adapter in
apps/acp/— enables pydantic-deep agents to run inside editors like Zed. Streaming text deltas, tool call visibility with arguments and results, model switching, session management, auto-detect provider from API keys - Enhanced
BASE_PROMPTwith Claude Code-inspired sections: code quality, executing actions with care, tone and formatting - MCP documentation (
docs/advanced/mcp.md) — shows how to use pydantic-ai'sMCPcapability with deep agents - Documentation for
BackendSkillsDirectoryindocs/concepts/skills.md— covers usage withStateBackend,LocalBackend,DockerSandbox, and mixed configurations - Cross-reference to backend-aware skills in
docs/concepts/backends.md
Fixed
- CLI bundled skills fallback path — was resolving to non-existent
apps/pydantic_deep/bundled_skills, now correctly points toapps/cli/skills/