Changelog¶
All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
[Unreleased]¶
Added¶
- Generic
ai_corebatteries migrated into Agentomatic:ArtifactRegistry(blue/green promote/rollback), task-progressreport_stageContextVar bridge, publicextract_json/repair_json,local_npz+TextEncoder, ingestion text helpers + MarkItDown formats, optional JSONL op-audit (AGENTOMATIC_AUDIT_LOG), and language helpers. Domain estimation / Cosmos stay out of core (reference copy underexamples/scooper-ai-core/).
[1.9.0] - 2026-07-23¶
See root CHANGELOG.md
for the full semantic-release notes (optimizer bugfixes, train/eval UX,
multi-resource logs, HolySheet reports).
Added¶
TrainCliSettings/EvalCliSettings(1.8.10): Pydantic settings (envAGENTOMATIC_*+ kebab-case CLI) with.parse()/.to_train_config()/.to_eval_config()so scaffoldedtrain.py/eval.pystay flat. Alsoprint_eval_resultmirroringprint_train_result. Docs +_train_py/_eval_pyupdated.- Multi-resource
logs_history(1.8.9): Persist full I/O for plugins, pipelines, ingestion, and custom endpoints (not only agents). Cross-resource REST:GET /api/v1/logs?resource=β¦&name=β¦,GET /api/v1/logs/{id},POST /api/v1/logs/analyze,GET /api/v1/logs/analysis; per-agent/{agent}/logskept for BC. In-process pipeline steps log withendpoint=pipeline_stepandmetadata.pipeline. Gaps (documented): async task invocations are not written to invocation logs; there are no per-plugin/pipeline/ingestion/endpoint convenience/logsroutes. - Docs + CLI templates for thin train/eval (1.8.8 docs):
Prompt Optimization documents
TrainConfig/train_and_report/print_train_resultandEvalConfig/evaluate_and_report, including knobs (optimizer,epochs,trials,patience,augment/n_examples/persist,apply, judge metrics, HolySheet reports,persist_fit_store/DATABASE_URL,logs_history/allow_logsllm_analysis). Scaffold_train_py/_eval_pymatch the SCOOPER assistant thin pattern. - Durable multi-backend logs / retrain persistence (1.8.8): When
logs_historyis on, the platform no longer eagerly installsMemoryStore(that preempted DB auto-derive). Store resolution is backend-agnostic viaSQLAlchemyStore: MEMORY connection βAGENTOMATIC_DB_URL/DATABASE_URL/ stackdatabase.url(Postgres, SQLite, MySQL, β¦). If a DB URL is configured but init fails, MemoryStore fallback is refused. Offline train can audit retrain runs withTrainConfig.persist_fit_store/fit_store_url/AGENTOMATIC_PERSIST_FIT. Train UX helpers:print_train_result(result)/TrainResult.print_summary(). EvalConfig/evaluate_and_report(1.8.6): Thin eval scripts mirroringtrain_and_reportβ stack load, structured + LLM-judge metrics, split selection, optional augmented dataset reuse, and HolySheetgenerate_eval_report. Scaffoldagents/*/eval.pyupdated.OptimizeMetricAdapternow prefersquestionover meta-queryand forwards snapshotcontext+ rich expected references to judges.TrainConfig/train_and_report(1.8.5): Thin train scripts with HolySheet fit dashboards, augment/persist knobs, and apply guards.- Invocation log history + optional LLM analysis (extended in 1.8.9
to multi-resource): Opt-in flags
logs_history/AGENTOMATIC_LOGS_HISTORYandallow_logsllm_analysis/AGENTOMATIC_ALLOW_LOGSLLM_ANALYSISpersist full sync invoke/chat/stream payloads into the platform store (AgentInvocationLog). REST:GET /api/v1/logs,GET /api/v1/logs/{id},POST /api/v1/logs/analyze,GET /api/v1/logs/analysis(plus agent-scoped/{agent}/logsBC). Analyser samples/truncates logs for API budget safety and falls back to a heuristic when no LLM is configured. Related:OptimizationRunStore+optimize/fit_storefor auditable retrain artefacts. - Ordered LLM model fallbacks (ships in 1.8.0): Configure
fallbacks/fallback_onon stack LLM profiles or viaget_llm(..., fallbacks=..., fallback_on=...). On timeout, connection error, rate limit, or empty response the next model is tried;record_failoverand a success log identify which model answered. Single-model stacks are unchanged whenfallbacksis omitted. See LLM Providers and Stacks. - Multi-pass optimize (SLM + LLM):
optimize/briefing.pybuilds a full optimization briefing (runtime config, search space, dataset samples, eval I/O, metrics, history) for rewrite / GEPA / MIPRO. Auto multi-pass: 3 (draftβcritiqueβrevise) for SLMs / local providers, 2 (draftβself-check) for frontier LLMs. Prompt style and briefing size adapt per model class. Knobs:rewrite_passes,multipass,slm_multipass,llm_multipass,slm_default_passes,llm_default_passes. See Optimization. gemini/optimize provider:LLMCallerroutesgemini/gemini-β¦via the Generative Language API (GEMINI_API_KEY). Live suite:tests/test_live_gemini_optimize.py.- Hardened
openai/optimize routing: cloudgpt-*/o1/o3models are not hijacked by a localOPENAI_BASE_URL; clearOPENAI_API_KEYerrors;max_completion_tokensfor reasoning models; live suitetests/test_live_openai_optimize.py. - Thinking / reasoning LLMs:
message_text,message_thinking,strip_thinking_for_json,astream_with_thinking, andinvoke_with_retry(strip_thinking=β¦)normalize Qwen3 / tagged<think>/reasoning_contentresponses. Stackextra:forwardsenable_thinking,chat_template_kwargs,response_format, andextra_bodyfor oMLX / OpenAI-compatible servers. See LLM Providers. - Plugin reload API:
POST /api/v1/plugins/reload(all) andPOST /api/v1/plugins/{name}/reloadre-callload_model()on the live registry instance and return status +loaded_at+model_card. List plugins now includesloaded_at. See ML Plugins.
Fixed¶
- HolySheet nested report sections (1.8.7): Fit/eval dashboards nest
content in
Section/Tabs/Accordionchildren so cards are not empty. - Train / optimize mechanics: Fitted prompts and overrides apply during
evaluate/reevaluate; GridSearch/PromptFitterBridge persist
system_prompt; local in-process runner forfit(); honest LLM-as-judge failures; class-agent/invoke/streamper-node frames.GEvalMetricfalls through on any deepeval failure;MultiJudgePanelsetsevaluation_failedwhen all judges soft-fail. - optimize / oMLX:
omlx/provider routing; disable thinking on local OpenAI-compatible servers; strip residual CoT from optimize LLM calls; skip DeepEval for oMLX/local specs; MIPRO acceptsDataPointsamples;_wrap_local_agentinjects top-levelsystem_prompt_override. - Invoke context passthrough:
AgentInvokeRequest/ chat / Studio / async task dispatch useextra="allow"andbuild_invoke_state()so the entire client payload (richcontext+ unknown top-level keys) reaches class-agentinput_to_state - OpenAPI full schema:
StudioResumeRequestmoved to module scope so/openapi.jsonno longer falls back to the ~13-path stub catalog - Class-agent async tasks: default agent dispatcher uses
invoke_registered_agent(same as sync REST) soinput_to_stateruns agentomatic run+main.py: prefersuvicorn main:appwhen present; mapsAGENTOMATIC_ENABLE_METRICSon thefrom_folderfallback path- Invoke
context: flattened into the transform payload beforeinput_to_statefor class agents - Docs: invoke paths documented as
/api/v1/{name}/invoke(not/api/v1/agents/{name}/invoke)
[1.3.0] β 2026-07-16¶
Minor release: deployment ergonomics and coding-agent enablement. Builds on the 1.2.x production-readiness fixes (which ship together in this release). No breaking API changes.
Added¶
- Fully-featured, env-driven scaffolded
main.py: the projectmain.pybuilds a module-levelappthat is feature-identical toagentomatic run(Studio, docs, health, metrics on by default; all component dirs discovered), so a deployed container runninguvicorn main:appdrops no functionality. Behaviour is driven byAGENTOMATIC_*env vars (ENABLE_STUDIO,ENABLE_METRICS,ENABLE_AUTH,ENABLE_JWT,REQUIRE_AUTH,ENABLE_CONTROL_PLANE,ENABLE_RATE_LIMIT,TITLE,LOG_LEVEL) so the same file works in dev and in the container - Deploy profiles:
agentomatic deploy --profile full|minimal(and the--minimalshorthand).full(default) runs everything;minimalis a production-lean image that disables the Studio debug UI and quiets logging via baked-inAGENTOMATIC_*env vars while keeping the core REST API, health/readiness, metrics, and auth. Swagger/OpenAPI (/docs,/redoc,/openapi.json) is always available in both profiles. Both profiles share one env-drivenmain.pycode path (no separate image), andminimalstill installsagentomatic[all]so no required functionality is dropped agentomatic agents-guidecommand: prints an Agentomatic primer for bootstrapping any coding agent, or writes it into a project with--write AGENTS.md|CLAUDE.md|.cursor/skills/agentomatic/SKILL.md(refuses to overwrite without--force). Content comes from a single source of truth (agentomatic.cli.agent_guide) so the CLI, docs, and in-repo agent knowledge files stay in sync- Custom DB / vector-store connections for any Python client: the connection
abstraction robustly accepts arbitrary custom clients (async or sync SDKs,
graph/time-series DBs, in-house packages) with correct lifecycle. Provider
names are no longer limited to the built-ins β any name registered via
register_vector_providerresolves (unknown names raise a clear, actionable error);VectorConnection.close()now also handles clients exposing onlydisconnect; and a newinitialize_connections(scope, configs)helper registers and initialises connections in one call for standalone runs (get_graph(), scripts) that have no platform lifecycle. New dedicated guide: Custom DB & Vector Store Connections
[1.2.1] β 2026-07-16¶
Patch release: production/wiring fixes that landed after the 1.2.0 cut. No breaking API changes.
Fixed¶
- Class-agent
langgraph.json: points at./agent.py:get_graph(with a module-levelget_graph()export) instead of broken./graph.py:get_graph - Plugin train/optimize stubs: exit with
SystemExit(1)instead of logging fake success, sopython -mlifecycle commands fail loudly - Plugin
eval: computes real accuracy from labelled examples (and fails with a clear message when metrics cannot be derived) instead of reporting a fabricated score agentomatic optimize --llm: defaults fromAGENTOMATIC_TASK_MODEL/LLM__MODEL(thenollama/mistral:7b) instead of a hardwired default- OpenAPI fallback: minimal path list from
app.routeswhen schema generation fails (no empty"paths": {}, keeps/docsusable) - CLI list/inspect:
has_graphis true whenagent.pyorgraph.pyexists - Studio auth: client sends both
X-Api-KeyandAuthorization: Beareron REST + SSE requests so either credential scheme authenticates - Type-check hardening: resolved mypy errors in the task store / manager, registry LLM injection, pipeline steps, and status/health probes
Fixed (production-readiness audit)¶
- Class agents on every server path (P0): REST
invoke/chat/invoke/stream/optimize/invoke/ A2A / approve and the Studio streaming adapter now route class agents throughinvoke_registered_agent/input_to_stateinstead ofgraph.ainvoke(dict), so dataclass-state agents no longer raiseAttributeErrorβ HTTP 500 / Studiorun_error agentomatic deployDockerfile (P0): generates a project-appropriate image that installsagentomatic[all]==<version>from PyPI, copies only the project dirs that exist (main.py,agents/, β¦), and launchesuvicorn main:app; compose build context/volumes point back to the project root.init --projectnow emits a pinnedrequirements.txtagentomatic run --reload/workers>1(P1): run via a module-level factory import string (agentomatic._runtime:create_app) instead of passing an app instance (which made uvicornexit(1)); programmatic platforms degrade to a single instance with a clear message instead of crashing--require-auth-globallyJWT bypass (P1): refuses to start when no JWKS (or API-key auth) is configured instead of silently accepting forged/unsigned tokens; expiry (exp) is now always verified, even in dev modeAGENTOMATIC_AGENTSallow-list (P1): agent discovery now honours the env var (comma-separated names) sodeploy --with-agent-stubsactually scopes each replica to a single agentPromptFitterBridge.optimize()(P2): records a structuredagent._last_optimize_status("ok"/"skipped: <reason>") so callers can tell whether optimization ran instead of silently no-op'ing- CORS hardening (P2): wildcard origins (
cors_origins=["*"]) no longer sendAccess-Control-Allow-Credentials: trueβ credentials are auto-disabled (with a one-time warning) unless explicit origins are configured
[1.2.0] β 2026-07-15¶
Release notes for the develop / optimize / deploy platform wave: scaffolding, stacks, connections, deploy, Keras-style training polish, and the wiring fixes below.
Fixed¶
- Scaffolded
main.py: removed invalidpipelines_dir=kwarg that causedTypeErroron boot (pipelines auto-discovered from siblingpipelines/) - Store auto-derive timing: routers now use a lazy store proxy so MEMORY connections derived in lifespan wire conversation threads correctly
- Class-agent LLM / stack:
apply_stack_defaultsruns before discovery; registry passesstack_managerintoget_llm_for_agentfor role-aware LLMs - Pipelines + class agents: invoke via
atransform/input_to_stateinstead of rawgraph.ainvoke(dict)(dataclass states no longer break) --require-auth-globally: auto-enables JWT so the flag cannot lock out all traffic without a credential path- PromptFitterBridge: strips bridge-only kwargs (
metric, optimize toggles) before constructingPromptFitter(no more silent TypeError skip); runs fitter on a worker thread when called inside an existing event loop evaluate(): defaults to metrics fromcompile(); clear error when nonesave()/load(): persists and restores Keras-styleHistoryandevaluation_history;load()is an alias ofload_compiled()- Docker / compose healthcheck: probes
/health(not non-existent/api/v1/health); compose mounts plugins/endpoints/ingestion/pipelines - Studio class agents:
resolve_adapterprefersGraphAgentAdapterforframework=graph_agent/class_instancebefore treatinggraph_fnas LangGraph (unblocks Studio for scaffolded class agents) - Studio auth / SSE:
/studioand/statusskipped by JWT/API-key middleware (prefix match); SSE callsonDonewhen the stream ends without[DONE](clears stuck βthinkingβ¦β) - Plugin templates: relative imports (
from .plugin import β¦); project scaffold includesagents/__init__.py+plugins/__init__.pyforpython -mtrain/eval -
CLI:
--template classalias;agentomatic runaccepts--endpoints-dir/--ingestion-dir/--stacks-dir -
Top-level exports:
WeightedMetric,PromptFitterBridge, optimizers,VectorStore,register_store_provider,register_embedding_provider - Warn when
fit(..., search_space=...)knobs are ignored by a non-bridge optimizer; warn oncompile()without metrics - Scaffold
main.pyreuses one platform instance forapp+run() - Platform hardening (Swagger, Studio, scaffolding, generic RAG ops, deploy)
- Resilient OpenAPI: plugin/
response_modelBaseModel guards +custom_openapi()fallback so one bad schema no longer blanks/docs - Studio: resolve agents by name or slug; SSE errors surface in chat/ debug (no more stuck "thinkingβ¦"); stream chunk accumulation + node-prefix stripping for correct answers/graph highlight
- Project scaffold:
agentomatic init --project/agentomatic newwritesmain.py, stacks,.env.example, and component dirs - Agent templates emit
AgentManifestcards + stack-drivenllm.py; registry injects LLM + PromptManager into class agents - Safe merge init (no overwrite without
--force);agentomatic add connection|ingestion; ingestion/plugin/endpoint templates land in the correct top-level discovery dirs - Provider-agnostic
VectorStoreProtocol +register_vector_provider/register_embedding_provider/register_store_provider(users own vendor SDKs such as Cosmos β no first-party vendor connectors in-core) - Any-DB memory via connectionβstore factory +
MinimalDocumentStore; auto-derive platform store fromMEMORYconnections - Stack-aware
get_llm/set_llmwith custombase_url/openai_compatible; apply stack defaults at startup - Pipeline
mapstep (parallel scope fan-out), markdown ingestor, task retry/checkpoints,extractiontemplate agentomatic deploy(distroless/rootless),stack export --env, HTTPS cert flags,require_auth_globally- Optimize CLI +
BaseGraphAgent.fit(..., search_space=..., optimize_mode=..., optimize_prompt/params=...)for per-call control over what to tune; weighted multi-criteria train/eval templates - Durable
SQLAlchemyTaskStore - Drop-in, production-ready
TaskStorebacked by any SQLAlchemy async driver (SQLite/PostgreSQL/MySQL) β task status, progress, and results survive process restarts and are shared across workers/replicas - Wire it in one line:
AgentPlatform.from_folder(..., task_store=SQLAlchemyTaskStore(url)); the platform lifespan initialises and disposes it automatically - Fully configurable and safe by default: connection pooling,
table_name, TTL/max_recordseviction (best-effort, never blocks asave), reusable externalengine, and a forward-compatible indexed-JSON schema - Lazy import β
agentomatic.tasksnever requires the optionaldbextra; a clear install hint is raised only when the store is constructed - Exposed as
agentomatic.tasks.SQLAlchemyTaskStore; install viaagentomatic[db](SQLite) oragentomatic[db-postgres](PostgreSQL) - Keras-style agent training lifecycle
BaseGraphAgent.fit()is now epoch-aware and returns a realHistoryobject (.historylog-key β per-epoch values, plus.epoch,.params,final(),best(),to_dict(),summary()); also stored onagent.historyfit(dataset, *, epochs, verbose, callbacks, validation_data)β per-epoch optimizer step + train/validation evaluation, Keras-like verbose log lines, andval_*metrics whenvalidation_datais supplied- Callbacks:
Callbackbase class (on_train_begin/on_epoch_begin/on_epoch_end(epoch, logs)/on_train_end) and a built-inEarlyStoppingthat halts training viaagent.stop_training - Loss abstraction:
compile(..., loss=...)accepts aLoss, any metric-like object (converted to1 - scoreviaMetricLoss), or a callable (CallableLoss);resolve_loss()coerces any of these - Optimize-engine wiring:
PromptFitterBridgenow actually runs the asyncoptimize.PromptFitterfromfit(), applies the best prompt config back onto the agent, and stores the fullPromptFitResultonagent._last_fit_result(gracefully degrades to a baseline pass when theoptimizeextra is missing or called inside a running event loop) compile()arguments are now all optional (dataset/metrics can be provided atfit()time);History,Callback,EarlyStopping, andLossare exported fromagentomaticandagentomatic.agents- Pipeline data-passing hardening
- New
plugin:step type β call a registered ML plugin'spredict()mid-pipeline; the resolved input mapping is coerced into the plugin's declared input schema before inference (with input/output mapping, condition, retry, timeout, andon_errorlike every other step) - Rollback / compensation: under
on_error: rollback, completed steps are compensated in reverse order via an optional per-steprollbackcode block (withctxandoutputin scope); compensated steps are reported inresult.metadata["rolled_back_steps"] - Optional input/output schema enforcement:
input_schema/output_schemaare now validated (advisory by default, failing whenstrict_schema: true) via a lightweight type checker - Plugin registry is threaded through the pipeline engine, router, task
dispatcher, and sub-pipelines so plugin steps work in every run mode
(sync,
/run/async,/run/batch, and nested pipelines) - Per-resource execution-mode sugar
- Every resource now exposes consistent
/<sync>/asyncand/<sync>/batchcompanion routes backed by the unified task system: agents (/invoke/async,/invoke/batch), plugins (/predict/async,/predict/batch), pipelines (/run/async,/run/batch), ingestors, and custom endpoints - All return
202with a task id and hypermedialinks(status / events / result / cancel); batch bodies wrap a list of the normal input and fan out as one task with per-item progress - Shared
attach_execution_modeshelper +BatchSubmitRequestinagentomatic.taskskeep behaviour and links uniform across resource types - Unified Status Dashboard
- Self-contained, auto-refreshing HTML dashboard at
/statusshowing the health of every resource β agents, plugins, custom endpoints, ingestors, and pipelines β plus the task executor and storage backend, with no external assets - Structured
GET /api/v1/statusendpoint exposing the same snapshot as JSON (platform uptime/version, per-resource healthy/total summaries, task stats by status + concurrency, and storage health) for custom tooling - Extended
GET /healthto aggregate plugins, endpoints, ingestors, and pipelines (previously agents + storage only); root index now advertises resource counts and the/statuslink TaskManager.stats()snapshot (totals, per-status breakdown, running vs. max concurrency, supported targets)- First-class Ingestion / RAG ops layer
BaseIngestorpackages your document-ingestion code β built with any libraries you like (docling/unstructured/pymupdf4llmto parse,langchain-text-splittersto chunk, your own vector DB client) β as a deployable resource. Agentomatic provides the ops, not the implementation- Auto-discovery from an
ingestion/directory; routes mounted under/api/v1/ingestion/{name}with/run(sync),/run/async(background task),/info, and/health - Async runs use the unified task system for live progress, SSE streaming,
cancellation, and webhooks; the
ingest(request, ctx)context exposesawait ctx.report(...)andctx.cancelled - Flexible
IngestionResulttelemetry (documents/chunks/upserted/skipped + free-formstats/output) and a defaultIngestionRequestinput model - Hardened embeddings factory: cached per
(provider, kwargs), new dependency-freeHashEmbedder, andopenaiprovider support - Fully connected to the rest of the platform: new
ingestion:pipeline step type (with input/output mapping, condition, retry, timeout, and sub-pipeline support), inclusion in the unified/healthstatus (alongside plugins, endpoints, and pipelines), and resource counts on the root index agentomatic init <name> --template ingestionscaffolding- Public API:
BaseIngestor,IngestionRegistry,IngestionRequest,IngestionResult - Unified Task / Execution Subsystem
- Run any resource β agent, ML plugin, pipeline, or custom endpoint β in
sync, async (background), batch, or streaming modes through a
single, uniform
TaskRecordcontract - Task board API at
/api/v1/tasks: submit (202/200), list/filter, poll status, fetch result, cancel, delete, and a live SSE progress stream (/tasks/{id}/events) TaskManagerwith a bounded in-process queue (task_max_concurrency), cooperative cancellation, batch fan-out with per-item progress, and completion webhooks (callback_url)- Pluggable persistence via
TaskStore(default bounded, TTL-awareInMemoryTaskStore); enable/disable withenable_tasks - A2A task lifecycle is now real and pollable β
POST /{agent}/a2a/tasksruns asynchronously and returns a trackable id;GET .../a2a/tasks/{id}reports live status mapped to canonical A2A states, plus a newPOST .../a2a/tasks/{id}/cancel(replaces the previous synchronous stub) - Public API:
TaskManager,TaskRecord,TaskStatus,TargetType - Custom Endpoints
BaseEndpointβ user-defined HTTP APIs that call deployed model services via authenticatedhttpxrequests and aggregate their outputs- Auto-discovery from the
endpoints/directory; routes mounted under/api/v1/endpoints/{name}with auto-generated/healthand/info - Upstream auth: API key, bearer, basic, and OAuth2 client-credentials
(with token caching);
${ENV}interpolation keeps secrets out of code MultiModelClientfan-out withALL/FIRST_SUCCESS/MAJORITYaggregation, retries, timeouts, and Prometheus metrics- Usable as a pipeline step (
endpoint:) to feed model outputs into agents agentomatic init <name> --template endpointscaffolding- Per-Agent Connections
DatabaseConnectionConfig/HttpConnectionConfigfor scoped, authenticated databases (SQLAlchemy async) and HTTP services per agentget_connections(scope)runtime accessor; auto-discovery from an agent'sconnections.py(CONNECTIONS = [...])- Lifecycle-managed (initialised on startup, closed on shutdown) with health
checks;
agentomatic init <name> --template connectionscaffolding - Vector stores (
VectorConnectionConfig) for RAG / vector search with lazy, provider-agnostic clients (Qdrant, Chroma, Weaviate, Pinecone, Milvus) andregister_vector_provider()for custom backends - Purpose tagging (
ConnectionPurpose: memory/rag/vector/cache/analyticsβ¦) withby_purpose()/for_purpose()/first_for_purpose()lookups - Any backend, zero classes β
CustomConnectionConfigwraps any factory callable / dotted path (redis, mongo, elasticsearch, neo4jβ¦) with lazy build, deep${ENV}resolution, sync/async factories and auto-detected lifecycle; fetch the native client viaawait conns.client(name) - Pluggable type registry (
register_connection_type()) so any backend becomes a first-class connection with a full custom wrapper - Conversation memory can be backed by a connection's own engine via
DatabaseConnection.create_store()(shared pool, no double-dispose) ConnectionsMiddlewareexposes the routed agent's manager onrequest.state.connections(enabled byenable_connections_context)- Production Control Plane (
enable_control_plane=True) - Admin API under
/api/v1/controlto inspect agents/endpoints/connections, read health/metrics/config, drain/re-enable agents, and toggle maintenance mode; mutating ops protected by an optionalX-Control-Token - Observability & Monitoring
- New metrics for endpoints, upstream model calls, and connections
- Ready-to-run stack in
deploy/observability/(Prometheus + OpenTelemetry Collector + Grafana) with a pre-provisioned Agentomatic Overview dashboard - Zero-Trust enforcement activated via middleware so per-agent security policies (roles/scopes/auth) are enforced on the request path
-
Swagger/OpenAPI fixes: structured tag metadata, cleaner operation IDs, de-duplicated pipeline tags, and Studio UI routes excluded from the schema
-
Class-Owned Graph Agents (v0.7)
BaseGraphAgentβ define agents as Python classes with ML lifecyclebuild_graph()+new_graph()β LangGraph-style graph wiring (primary API)GraphBuilderwith LangGraph-compatible aliases:add_node(),add_edge(),set_entry_point(),set_finish_point(),add_conditional_edge(),compile()@agent_nodedecorator β optional fallback for simple linear chainsAgentGraphβ lightweight internal graph runtime (no LangGraph dependency)AgentDataset/AgentExampleβ rich evaluation datasets with JSONL I/O- Evaluation metrics:
ExactKeyMatchMetric,ContainsTermsMetric,CallableMetric - Optimizers:
NoOpOptimizer,GridSearchOptimizer,PromptFitterBridge - ML lifecycle:
compile()βfit()βevaluate()βtransform() - Per-node observability with
TraceEventtracing - Serialization:
save()/load_compiled()for compiled agent state - Auto-discovery: class agents found via
agent.pyor__init__.pybridge - Registry integration:
register_class_agent()+_discover_class_agent() agentomatic init --template classgenerates full package with__init__.py,agent.py,llm.py,prompts.json,train.py-
200 tests covering graph, dataset, metrics, lifecycle, and API aliases
-
Agent Pipelines / Composition DSL
- YAML, Builder, and Flow (decorator) interfaces
- Parallel, sequential, conditional, loop, and transform steps
- Auto-schema detection and delegation
-
99 tests with full platform integration
-
Custom LLM Injection β Pluggable Models Everywhere
set_llm()β inject a custom LLM as the global singletonget_llm(instance=...),get_named_llm(instance=...),get_structured_llm(instance=...)β bypass factory with pre-built LLMsLLMSpec = str | LLMCallabletype in theoptimizemodule β all optimizers, metrics, synthesizers, and fitters accept custom callablescall_llm()/call_llm_json()β unified dispatch with graceful error handling (string, async/sync callable, LangChain model)PromptFitterBridgeacceptsLLMSpecfortask_model/rewrite_model- Eliminated 5 raw
httpxOllama calls β all LLM traffic goes throughLLMCallerorcall_llm()
Changed¶
- Studio enabled by default β
agentomatic runnow enables Studio at/studio/ui/by default. Use--no-studioto disable. - Studio resilience β branded error pages (503) when Studio is disabled or assets are missing, instead of raw 404s.
Fixed¶
- Fixed literal
\\ncharacters appearing in generated__init__.pyfiles fromagentomatic inittemplates. - Added
from __future__ import annotationstoplugins/__init__.pyanddemo/__init__.pyper project rules. - Fixed
protocols/__init__.pymissing re-exports and__all__. - Fixed
Makefilecheck-citarget using auto-fixformatinstead of read-onlyformat-check.
0.3.0 - 2026-06-18¶
Added¶
- Agentomatic Studio β Built-in visual debugging environment
- Real-time graph visualization for any agent framework
- Universal adapter system (LangGraph, LangChain, Deep Agent, Custom)
- SSE streaming with node-level event mapping
- Time-travel debugging via checkpoints
- Breakpoints and state editing (LangGraph)
@studio_graph,@studio_state,@studio_streamdecorators for custom integration-
Studio UI bundled into the PyPI package
-
Deep Agent Integration
- Full support for LangChain's
deepagentsharness - Subagent event tracking (
subagent_start/subagent_end) - Task planning visualization (
task_update) - HITL interrupt handling with resume endpoint
-
agentomatic init --template deepagentscaffold -
LangChain Adapter
- LCEL chain graph extraction
astream_eventsv2 streaming- Message history tracking
-
Automatic framework detection
-
Enhanced LangGraph Adapter
- Retriever event mapping (
on_retriever_start/on_retriever_end) - LLM event mapping (
on_llm_start/on_llm_end) - Deep Agent node classification (subagent, planning, filesystem, execute)
- Interrupt/breakpoint event detection
-
Capability auto-detection from graph topology
-
Demo Command
agentomatic demoscaffolds a temporary agent and launches Studio-
Instant hands-on experience without project setup
-
Agent Skills for AI Assistants
.agents/skills/agentomatic/SKILL.mdβ comprehensive package skill.agents/AGENTS.mdβ project rules and conventions
Changed¶
- CI/CD pipeline now includes docs build verification and import smoke tests
- PR checks use
uvconsistently (replaced pip-based pre-commit install) - Makefile uses
uv syncinstead ofuv pip installfor consistency - Build verification step in CI now checks wheel contents
- Coverage threshold raised from 40% to 55%
0.2.0 - 2026-06-14¶
Added¶
- Universal Studio Adapter Architecture
- Pluggable adapter system for any agent framework
GenericAdapteras fallback for custom/unknown frameworks-
Adapter resolution chain with automatic framework detection
-
Comprehensive Documentation
- MkDocs Material site with 22+ documentation pages
- CLI reference, user guide, architecture overview
-
Mike versioning for release documentation
-
Enhanced CLI
agentomatic inspectβ show agent structure and configurationagentomatic doctorβ environment health checkagentomatic optimizeβ prompt optimization runner
Changed¶
- Test suite expanded to 393+ tests with multi-Python matrix CI
- Improved error messages and validation
0.1.0 - 2026-06-12¶
Added¶
- Core Framework
AgentPlatformclass for zero-code multi-agent API creation- Auto-discovery: drop agent folder β 12+ REST endpoints generated
- Agent manifest system with
MANIFESTdict or@agentdecorator BaseAgentStatefor typed agent state management-
Pluggable storage:
MemoryStore,SQLAlchemyStore, custom viaBaseStore -
CLI (click-based)
agentomatic init <name>β scaffold from templates (basic, full, rag, chatbot, custom)agentomatic runβ start platform server with uvicornagentomatic listβ rich table of discovered agentsagentomatic test <name>β interactive agent testing-
agentomatic uiβ launch Chainlit debug interface -
Prompt Optimization (DSPy-inspired)
- 7 optimization strategies: IterativeRewrite, FewShotBootstrap, ChainOfThought, MIPRO, BootstrapRandomSearch, EnsembleOptimizer
- 8 metric types: DeepEval, LLMJudge, GEval, Contains, ExactMatch, Custom, RedTeam
DataSynthesizerfor generating/augmenting eval datasets- HTML report generation with interactive dashboards
-
Red team adversarial testing (PII, bias, prompt injection)
-
Middleware Pipeline
- API key authentication with configurable header
- Token bucket rate limiting (per-IP or global)
- Prometheus metrics (request counts, latencies, error rates)
- Structured request/response logging
-
Feedback collection endpoint
-
A2A Protocol
- Auto-generated agent cards (model cards)
- Task submission and status endpoints
-
Inter-agent communication
-
Observability
- OpenTelemetry tracing integration
- Prometheus metrics exporter
CircuitBreakerfor external service protection-
AgentSemaphorefor concurrency control -
Providers
- Ollama, OpenAI, Azure, Vertex AI LLM support
-
Configurable embedding providers
-
Developer Experience
- Comprehensive test suite (161 tests)
- CI/CD with GitHub Actions
- Semantic release for automated versioning
- Ruff linting + formatting
py.typedmarker for mypy/pyright support