Releases: vstorm-co/pydantic-deepagents
Releases · vstorm-co/pydantic-deepagents
0.3.15
[0.3.15] - 2026-04-17
Fixed
PatchToolCallsCapabilitycausedValidationException: duplicate Idson Bedrock when tools raisedModelRetry— when a tool raisedModelRetry, pydantic-ai records the retry as aRetryPromptPart(carrying the originaltool_call_id) on the followingModelRequest, not as aToolReturnPart. The patch processor only scanned forToolReturnPartwhen deciding whether aToolCallPartwas orphaned, so it injected a syntheticToolReturnPartwith the same id — leaving the request with two parts sharing onetool_call_id. Strict providers (Bedrockminimax.minimax-m2.5and others) rejected the request withThe toolResult blocks at messages.N.content contain duplicate Ids. The processor now treatsRetryPromptPartas a valid answer to aToolCallPart, so no synthetic return is injected and the history remains valid. (#79, reported by @thatGreekGuy96)
0.3.14
[0.3.14] - 2026-04-16
Fixed
- Subagents ignored parent
web_search/web_fetchsettings — the default subagent factory increate_deep_agenthardcodedweb_search=Trueandweb_fetch=True, overriding the parent agent's configuration. On Bedrock and Vertex Anthropic models this produced a 400 error (web_fetch_20250910not accepted), because the beta web tools are not supported there. The factory now propagates the parent agent'sweb_searchandweb_fetchflags to spawned subagents. (#77, reported by @SvdR82)
0.3.13
[0.3.13] - 2026-04-13
Fixed
- User-provided tools lost metadata when passed via
tools=parameter — tools registered throughcreate_deep_agent(tools=[...])were previously added viaagent.tool(tool.function)after construction, which hardcodedtakes_ctx=Trueand discarded allTool-level metadata (name,description,prepare,max_retries,requires_approval,timeout). Tools are now passed directly to theAgentconstructor, preserving all metadata and correctly honouring the originaltakes_ctxvalue. (PR #75 by @ilayu-blip)
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