Repository navigation
Releases: akorda-software/exagent
Release list
ExAgent 2.2.3
ExAgent 2.2.3
Maintenance patch refreshing the model catalogue and transitive error library.
ExAgent's runtime sources, public APIs, persisted formats and dependency
requirements remain unchanged.
- LLMDB 2026.10.6 → 2026.10.7: new catalogue entries and refreshed metadata.
- Splode 0.3.2 → 0.3.3: fix error-variable keys when deserializing JSON.
- All 45 locked packages reviewed; Zoi and gproc remain at the newest versions
permitted by their stock parent dependencies. ReqLLM stays at 1.29.0.
The catalogue adds 609 IDs, removes 501 and changes metadata for 4,674 retained
IDs. Review selected models, prices, limits and capabilities. Explicit model
specs remain available for verified application-owned metadata. New catalogue
entries do not imply new qualified provider transports or tool profiles.
{:exagent, "~> 2.2.3"}Existing applications own their lockfiles. Run
mix deps.update exagent llm_db splode to adopt these transitive updates.
Keep persisted continuation mismatch checks intact when changing models.
Validation: 2,320 offline tests pass (28 provider/PostgreSQL exclusions), plus
76 focused tests and 16 installed-consumer contracts on Elixir 1.18/1.20.
The dependency audit is clean. Strict consumer diagnostics retain the known
upstream TOML/WebSockex warnings. Details are in docs/development/dependencies.md.
No new paid-provider or external PostgreSQL qualification is claimed.
ExAgent 2.2.2
ExAgent 2.2.2
Maintenance release with an updated ReqLLM security floor and fixes for ETS,
fallback continuation and integer-backed enum schemas.
Dependencies and compatibility
- Require official ReqLLM
~> 1.29.0, which fixes
GHSA-6vww-5m28-f26v.
The advisory affects ReqLLM WebSocket TLS verification; ExAgent uses the
unaffected HTTP/Finch transport. - Update the checkout to LLMDB 2026.10.6 and the test-only TLS certificate bundle
to 1.36.0. Zoi and gproc remain within their parents' supported requirements. - LLMDB has removed catalogue entries. Applications must review their selected
models or supply explicit model specs with verified capabilities, limits and
prices. A resolved unknown ID does not imply known pricing or tool support. - ReqLLM's new implicit provider-option defaults are rejected before IO or
continuation binding. Configure supported options explicitly on the ExAgent
model so request routing and persisted authority remain aligned.
Fixes
- Connected BEAM nodes can start their own ETS store; data remains local to each
node. Connecting already running nodes preserves their independent stores. - Fallback can resume valid backup history through a compatible candidate in
synchronous and streaming requests, skipping incompatible models before IO. - Integer-backed
Ecto.Enumschemas use JSON integers; custom enum restrictions
use the same vocabulary as their mappings.
Upgrade
{:exagent, "~> 2.2.2"}Update the application's ExAgent/ReqLLM/LLMDB lock entries. Regenerate cached
schemas for affected enums. Persisted continuations with an old affected output
schema retain their mismatch rejection: finish with the original definition or
start a new execution after reconciling prior effects. Do not rewrite approvals
or bypass fingerprint checks. No snapshot format migration is introduced.
Verification
- 2,320 offline tests pass; 28 provider/PostgreSQL tests are intentionally excluded.
- 40 installed-consumer contracts pass across Elixir 1.18/OTP28 and 1.20/OTP29,
including the optional API, SDK and exporter graphs. Separate strict dependency
diagnostics retain known TOML/WebSockex compiler warnings. - Formatting, strict project compilation, documentation links, package isolation
and release guards pass. Hex audit reports no retired or advisory packages.
No new live-provider, database or external-backend qualification is claimed.
ExAgent v2.2.1
ExAgent 2.2.1
Compatible maintenance release. Public APIs, defaults, runtime, events, history
and persisted snapshots are unchanged from 2.2.0.
Dependencies
- Require JSV
~> 0.26.1(previously~> 0.26.0). The patched validator's
stricter date/time formats do not alter ExAgent's annotation-only handling. - Retain LLMDB 2026.10.3 in the checkout lock: the newer catalog removes existing
entries and their pricing/limit metadata. Consumer LLMDB ranges are unchanged. - No forced gproc override; its test-only parent still requires 1.2.x.
Upgrade
{:exagent, "~> 2.2.1"}Update the application's ExAgent/JSV lock entries. No code or data migration is
required. Review model selection before independently updating LLMDB; a library's
lock does not pin transitive versions in consuming applications.
Verification
- 2,307 offline tests pass; 28 provider/PostgreSQL tests intentionally excluded.
- Eight installed-consumer contracts pass. Known upstream compiler warnings remain
visible in the separate strict dependency diagnostic. - Documentation, package isolation and compatibility checks pass.
No new live-provider, database or external-backend qualification is claimed.
ExAgent v2.2.0
ExAgent 2.2.0 adds model fallback with retries, prompt caching, multimodal prompts and a final answer at the step limit, and refreshes ReqLLM to 1.28. It is additive: agents and models that do not use the new options behave as in 2.1.
Retry and fall back to another model
primary = ExAgent.Models.ReqLLM.new(primary_options ++ [foreign_history: :portable])
backup = ExAgent.Models.ReqLLM.new(backup_options ++ [foreign_history: :portable])
agent = ExAgent.new(model: ExAgent.Models.Fallback.new(models: [primary, backup]), tools: tools)- Retries HTTP 408/429/5xx/529 without output, with exponential backoff and jitter; connection failures only with
retry_transport: true. - Each attempt keeps
ModelSettings.timeout; the run deadline (newModelRequestParameters.deadline) bounds all attempts. Streams retry only before their first event. - One admitted request per model call; every retry emits
[:exagent, :model, :retry]telemetry. foreign_history: :portablesends another model's history as plain text and tool calls, so the backup can continue the conversation.
Prompt caching
ExAgent.Models.ReqLLM option prompt_cache: cache_control breakpoints on OpenRouter (true or [ttl: "5m" | "1h"]) or a stable prompt_cache_key on OpenAI ([key: key]).
Images and documents in the prompt
ExAgent.run/3 accepts a list of content parts: text, image_url, image and file (PDF). Parts are validated and stored with string keys before any request.
Finish at the step limit
ExAgent.new(on_max_steps: :final) keeps tools declared but disallows calls in the last step and asks for a final answer. The instruction stays out of history.
Dependencies
req_llm ~> 1.28.0(withllm_db 2026.10.3) anddecimal 3.2.0. Update your application lock.- A sparse OpenAI-style usage map now keeps the reported counter instead of normalizing every counter to 0.
Verification
- Offline suite: 2,305 of 2,306 passed, 28 excluded. The one failure was a test pinning the agent struct's fields, updated for
on_max_steps; that file passes 5/5. - Live OpenRouter E2E, new
featuressuite (fallback, caching, final step, PNG + PDF prompt): 4/4 with GPT-6-Luna and 4/4 with DeepSeek V4.1 Flash, including real cache hits on later turns. - GPT-6-Luna: smoke 23/23, skills 4/4, complex 4/4.
- DeepSeek V4.1 Flash: smoke 22/23, skills 2/4 and complex 3/4. These failures come from the model's output: it doesn't copy a literal JSON value, returns reasoning with reasoning disabled, or skips a skill. ReqLLM's reasoning decoding is unchanged between 1.27 and 1.28.
Full details in the changelog.
ExAgent v2.1.0
ExAgent 2.1.0 adds skills loaded on demand and refreshes dependencies. It is additive: agents built without :skills behave as in 2.0.
Skills
Give an agent many task-specific procedures without sending them all on every request. The model sees a catalog of names and descriptions and loads a skill's instructions when a task needs them. Skills use the Agent Skills SKILL.md format shared with other agent harnesses.
skills = ExAgent.Skills.from_dir!(Application.app_dir(:my_app, "priv/skills"))
agent = ExAgent.new(model: model, instructions: "You are...", skills: skills)load_skillreturns the instructions as an ordinary tool result, so a loaded skill persists across steps,Serverturns, snapshots and continuations.read_skill_filereads a skill's own files (for examplereferences/). Paths are confined to the skill directory; hidden, binary and oversized files are rejected.- A skill can carry tools that are offered only after it is loaded (
ExAgent.Skills.Gate). ExAgent.Skills.Restorerestores loaded skills that compaction removed from the request.- Skills never grant permissions or execute scripts.
Guide: Skills.
Dependencies
req_llm ~> 1.27.0(withllm_db 2026.10.0) andjsv ~> 0.26.0. Update your application lock.- ReqLLM 1.27 returns a Finch pool queue timeout as an error tuple instead of raising.
Verification
- Offline suite: 2,283 passed, 28 excluded.
- Live OpenRouter E2E with GPT-6-Luna: smoke 23/23 and skills 4/4.
- Live OpenRouter E2E with DeepSeek V4.1 Flash: smoke 20/23 and skills 3/4. The three smoke failures reproduce identically on ReqLLM 1.26, so they come from the model or route rather than from this release.
Full details in the changelog.
ExAgent 2.0.1
Added
- Opt-in tool-call argument previews while streaming.
ModelRequestParametersgainstool_call_deltas: false; when a run's deps carryon_tool_call_delta(arity 1), the request opts in and the callback receives%{index, name, fragment}as arguments are generated. Existing consumers see no new events; previews never enter partial responses, history or retention, and the terminal response stays authoritative. Incremental delivery depends on the upstream provider.
Documentation
- Task-oriented public manual and docs-only publication workflow (already published for 2.0.0 docs).
See docs/changelog.md for details.
🤖 Generated with Claude Code
ExAgent 2.0.0
ExAgent 2.0.0
ExAgent 2 consolidates the agent loop, supervised conversations, multi-agent
coordination and durable human approval into one framework using official
ReqLLM 1.26. Applications own their effects, persistence and observability services.
- One-shot and streaming runs with validated tools, structured Ecto output,
explicit capabilities and bounded host retention/accounting. - Stateful supervised agents and coordinated sessions, composition and delegation.
- Durable snapshots and persisted approval/continuation with explicit recovery,
authority checks and protection against unintended effect replay. - Qualified OpenRouter tool routing and application-defined shared-state codecs.
- Opt-in OpenTelemetry tracing and metrics. ExAgent is the span producer for its
runs; ReqLLM metadata supplies usage without duplicate model spans. - MCP, Phoenix/LiveView, Oban and PostgreSQL integration recipes, with human and
agent documentation generated from the same source.
This is a major upgrade. Read the
migration guide before updating
an application. Supported runtime combinations are Elixir 1.18/OTP 28 and
Elixir 1.20/OTP 29; provider capability profiles remain explicitly qualified.
See supported features for
capability profiles, application responsibilities and deployment boundaries.
The documentation index
provides task guides, integration recipes and the public API reference.
Known limits remain explicit: stock TOML/WebSockex/gproc compiler diagnostics,
qualified provider profiles, normalized rather than invoiced usage, and no
upstream hard RAM bound before decoding. Direct native in-process OTLP HTTP has
a cleanup limitation; use the qualified application-owned disposable-VM or
Collector recipes when that transport is required. There is no fork, patch or
unsupported dependency override. See
known limits.
Install with {:exagent, "~> 2.0"}. The package and versioned documentation
are available on Hex and HexDocs.