agentomatic 0.3.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agentomatic-0.4.1/PKG-INFO +636 -0
- agentomatic-0.4.1/README.md +531 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/pyproject.toml +26 -5
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/__init__.py +6 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/_version.py +1 -1
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/cli/commands.py +44 -1
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/cli/templates.py +24 -1
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/platform.py +35 -0
- agentomatic-0.4.1/src/agentomatic/demo/__init__.py +1 -0
- agentomatic-0.4.1/src/agentomatic/demo/agent.py +180 -0
- agentomatic-0.4.1/src/agentomatic/demo/server.py +82 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/__init__.py +77 -1
- agentomatic-0.4.1/src/agentomatic/optimize/config.py +451 -0
- agentomatic-0.4.1/src/agentomatic/optimize/deployment.py +338 -0
- agentomatic-0.4.1/src/agentomatic/optimize/eval_contract.py +300 -0
- agentomatic-0.4.1/src/agentomatic/optimize/failure_analysis.py +383 -0
- agentomatic-0.4.1/src/agentomatic/optimize/fitter.py +973 -0
- agentomatic-0.4.1/src/agentomatic/optimize/fitter_optimizers.py +1462 -0
- agentomatic-0.4.1/src/agentomatic/optimize/judges.py +403 -0
- agentomatic-0.4.1/src/agentomatic/optimize/llm_caller.py +361 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/metrics.py +439 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/report.py +297 -0
- agentomatic-0.4.1/src/agentomatic/optimize/search_space.py +246 -0
- agentomatic-0.4.1/src/agentomatic/studio/__init__.py +36 -0
- agentomatic-0.4.1/src/agentomatic/studio/adapter.py +161 -0
- agentomatic-0.4.1/src/agentomatic/studio/adapters/__init__.py +78 -0
- agentomatic-0.4.1/src/agentomatic/studio/adapters/generic.py +352 -0
- agentomatic-0.4.1/src/agentomatic/studio/adapters/langchain.py +467 -0
- agentomatic-0.4.1/src/agentomatic/studio/adapters/langgraph.py +475 -0
- agentomatic-0.4.1/src/agentomatic/studio/decorators.py +133 -0
- agentomatic-0.4.1/src/agentomatic/studio/graph_inspector.py +209 -0
- agentomatic-0.4.1/src/agentomatic/studio/models.py +214 -0
- agentomatic-0.4.1/src/agentomatic/studio/router.py +465 -0
- agentomatic-0.4.1/src/agentomatic/studio/run_tracker.py +218 -0
- agentomatic-0.4.1/src/agentomatic/studio/serve.py +93 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/asset-manifest.json +13 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/imgs/graph_view.png +0 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/imgs/logo.png +0 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/imgs/main_screen.png +0 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/imgs/main_screen_ok.png +0 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/index.html +1 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/manifest.json +9 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/static/css/main.8692ac74.css +4 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/static/css/main.8692ac74.css.map +1 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/static/js/main.aa720e8f.js +3 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/static/js/main.aa720e8f.js.LICENSE.txt +98 -0
- agentomatic-0.4.1/src/agentomatic/studio/static/static/js/main.aa720e8f.js.map +1 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/tests/test_agentomatic.py +4 -1
- agentomatic-0.4.1/tests/test_coverage_boost.py +490 -0
- agentomatic-0.4.1/tests/test_deep_agent.py +534 -0
- agentomatic-0.4.1/tests/test_fitter.py +1390 -0
- agentomatic-0.4.1/tests/test_studio.py +902 -0
- agentomatic-0.3.0/.chainlit/config.toml +0 -178
- agentomatic-0.3.0/.chainlit/translations/ar-SA.json +0 -259
- agentomatic-0.3.0/.chainlit/translations/bn.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/da-DK.json +0 -259
- agentomatic-0.3.0/.chainlit/translations/de-DE.json +0 -254
- agentomatic-0.3.0/.chainlit/translations/el-GR.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/en-US.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/es.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/fr-FR.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/gu.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/he-IL.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/hi.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/it.json +0 -254
- agentomatic-0.3.0/.chainlit/translations/ja.json +0 -259
- agentomatic-0.3.0/.chainlit/translations/kn.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/ko.json +0 -254
- agentomatic-0.3.0/.chainlit/translations/ml.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/mr.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/nl.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/pt-PT.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/ta.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/te.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/zh-CN.json +0 -260
- agentomatic-0.3.0/.chainlit/translations/zh-TW.json +0 -260
- agentomatic-0.3.0/.dockerignore +0 -90
- agentomatic-0.3.0/.env.example +0 -62
- agentomatic-0.3.0/.github/FUNDING.yml +0 -1
- agentomatic-0.3.0/.github/workflows/ci.yml +0 -157
- agentomatic-0.3.0/.github/workflows/docs.yml +0 -59
- agentomatic-0.3.0/.github/workflows/manual-docs.yml +0 -84
- agentomatic-0.3.0/.github/workflows/manual-pypi.yml +0 -70
- agentomatic-0.3.0/.github/workflows/pr-checks.yml +0 -64
- agentomatic-0.3.0/.github/workflows/release.yml +0 -186
- agentomatic-0.3.0/.gitignore +0 -47
- agentomatic-0.3.0/.pre-commit-config.yaml +0 -38
- agentomatic-0.3.0/.vscode-upload.json +0 -21
- agentomatic-0.3.0/CHANGELOG.md +0 -339
- agentomatic-0.3.0/CONTRIBUTING.md +0 -91
- agentomatic-0.3.0/Dockerfile +0 -82
- agentomatic-0.3.0/Dockerfile.distroless +0 -58
- agentomatic-0.3.0/Makefile +0 -103
- agentomatic-0.3.0/PKG-INFO +0 -379
- agentomatic-0.3.0/README.md +0 -275
- agentomatic-0.3.0/TODO.md +0 -1
- agentomatic-0.3.0/assets/logo.png +0 -0
- agentomatic-0.3.0/docker-compose.yml +0 -52
- agentomatic-0.3.0/docs/FRONTEND_API_GUIDE.md +0 -290
- agentomatic-0.3.0/docs/architecture/api-reference.md +0 -67
- agentomatic-0.3.0/docs/architecture/overview.md +0 -54
- agentomatic-0.3.0/docs/assets/architecture_diagram.png +0 -0
- agentomatic-0.3.0/docs/assets/logo.png +0 -0
- agentomatic-0.3.0/docs/assets/optimization_flow.png +0 -0
- agentomatic-0.3.0/docs/changelog.md +0 -67
- agentomatic-0.3.0/docs/cli/commands.md +0 -285
- agentomatic-0.3.0/docs/contributing.md +0 -41
- agentomatic-0.3.0/docs/getting-started/first-agent.md +0 -135
- agentomatic-0.3.0/docs/getting-started/installation.md +0 -130
- agentomatic-0.3.0/docs/getting-started/quickstart.md +0 -122
- agentomatic-0.3.0/docs/guide/agent-structure.md +0 -189
- agentomatic-0.3.0/docs/guide/configuration.md +0 -107
- agentomatic-0.3.0/docs/guide/debug-ui.md +0 -91
- agentomatic-0.3.0/docs/guide/middleware.md +0 -156
- agentomatic-0.3.0/docs/guide/optimization.md +0 -223
- agentomatic-0.3.0/docs/guide/platform-features.md +0 -689
- agentomatic-0.3.0/docs/guide/prompts.md +0 -151
- agentomatic-0.3.0/docs/guide/schemas.md +0 -252
- agentomatic-0.3.0/docs/guide/storage.md +0 -208
- agentomatic-0.3.0/docs/guide/telemetry.md +0 -198
- agentomatic-0.3.0/docs/guide/templates.md +0 -55
- agentomatic-0.3.0/docs/index.md +0 -123
- agentomatic-0.3.0/examples/full_agent/agents/weather/__init__.py +0 -35
- agentomatic-0.3.0/examples/full_agent/agents/weather/api.py +0 -49
- agentomatic-0.3.0/examples/full_agent/agents/weather/config.py +0 -39
- agentomatic-0.3.0/examples/full_agent/agents/weather/graph.py +0 -51
- agentomatic-0.3.0/examples/full_agent/agents/weather/langgraph.json +0 -7
- agentomatic-0.3.0/examples/full_agent/agents/weather/nodes.py +0 -60
- agentomatic-0.3.0/examples/full_agent/agents/weather/prompts.json +0 -14
- agentomatic-0.3.0/examples/full_agent/agents/weather/schemas.py +0 -39
- agentomatic-0.3.0/examples/full_agent/agents/weather/tools.py +0 -32
- agentomatic-0.3.0/examples/full_agent/main.py +0 -78
- agentomatic-0.3.0/examples/hello_agent/agents/hello/__init__.py +0 -22
- agentomatic-0.3.0/examples/hello_agent/agents/hello/graph.py +0 -26
- agentomatic-0.3.0/examples/hello_agent/agents/hello/nodes.py +0 -15
- agentomatic-0.3.0/examples/hello_agent/main.py +0 -28
- agentomatic-0.3.0/mkdocs.yml +0 -103
- agentomatic-0.3.0/src/__init__.py +0 -3
- agentomatic-0.3.0/src/agentomatic/ui/.chainlit/config.toml +0 -14
- agentomatic-0.3.0/src/agents/__init__.py +0 -1
- agentomatic-0.3.0/src/agents/alpha/__init__.py +0 -5
- agentomatic-0.3.0/src/agents/alpha/agent.py +0 -140
- agentomatic-0.3.0/src/agents/alpha/api.py +0 -67
- agentomatic-0.3.0/src/agents/alpha/config.py +0 -15
- agentomatic-0.3.0/src/agents/alpha/prompts.json +0 -14
- agentomatic-0.3.0/src/agents/alpha/schemas.py +0 -36
- agentomatic-0.3.0/src/agents/alpha/state.py +0 -22
- agentomatic-0.3.0/src/agents/beta/__init__.py +0 -5
- agentomatic-0.3.0/src/agents/beta/agent.py +0 -208
- agentomatic-0.3.0/src/agents/beta/api.py +0 -72
- agentomatic-0.3.0/src/agents/beta/config.py +0 -16
- agentomatic-0.3.0/src/agents/beta/prompts.json +0 -14
- agentomatic-0.3.0/src/agents/beta/schemas.py +0 -57
- agentomatic-0.3.0/src/agents/beta/state.py +0 -22
- agentomatic-0.3.0/src/app/__init__.py +0 -1
- agentomatic-0.3.0/src/app/api.py +0 -505
- agentomatic-0.3.0/src/app/dependencies.py +0 -189
- agentomatic-0.3.0/src/app/main.py +0 -230
- agentomatic-0.3.0/src/app/settings.py +0 -60
- agentomatic-0.3.0/src/common/__init__.py +0 -1
- agentomatic-0.3.0/src/common/agent_state.py +0 -24
- agentomatic-0.3.0/src/common/api_decorators.py +0 -177
- agentomatic-0.3.0/src/common/base_agent.py +0 -128
- agentomatic-0.3.0/src/common/llm_factory.py +0 -280
- agentomatic-0.3.0/src/common/prompt_manager.py +0 -78
- agentomatic-0.3.0/src/common/utilities.py +0 -131
- agentomatic-0.3.0/uv.lock +0 -6511
- {agentomatic-0.3.0 → agentomatic-0.4.1}/LICENSE +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/examples/full_agent/README.md +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/cli/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/config/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/config/defaults.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/config/settings.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/lifespan.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/manifest.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/memory_manager.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/registry.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/router_factory.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/core/state.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/auth.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/feedback.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/logging.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/metrics.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/middleware/rate_limit.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/observability/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/observability/concurrency.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/observability/metrics.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/observability/telemetry.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/dataset.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/loop.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/optimizer.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/runner.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/strategies.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/optimize/synthesizer.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/prompts/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/prompts/manager.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/protocols/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/protocols/decorators.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/providers/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/providers/embeddings.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/providers/llm.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/py.typed +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/base.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/checkpointer.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/memory.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/models.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/storage/sqlalchemy.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/ui/__init__.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/src/agentomatic/ui/chat.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/tests/test_cli.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/tests/test_integration.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/tests/test_optimize.py +0 -0
- {agentomatic-0.3.0 → agentomatic-0.4.1}/tests/test_platform_features.py +0 -0
|
@@ -0,0 +1,636 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentomatic
|
|
3
|
+
Version: 0.4.1
|
|
4
|
+
Summary: Drop agents, not code — zero-code multi-agent API platform framework
|
|
5
|
+
Project-URL: Homepage, https://github.com/UnicoLab/agentomatic
|
|
6
|
+
Project-URL: Documentation, https://unicolab.github.io/agentomatic
|
|
7
|
+
Project-URL: Repository, https://github.com/UnicoLab/agentomatic
|
|
8
|
+
Project-URL: Issues, https://github.com/UnicoLab/agentomatic/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/UnicoLab/agentomatic/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: UnicoLab <contact@unicolab.com>
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: a2a,agents,fastapi,framework,langchain,langgraph,multi-agent
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Framework :: FastAPI
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
23
|
+
Classifier: Typing :: Typed
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Requires-Dist: click>=8.1.0
|
|
26
|
+
Requires-Dist: fastapi>=0.115
|
|
27
|
+
Requires-Dist: httpx>=0.28
|
|
28
|
+
Requires-Dist: loguru>=0.7
|
|
29
|
+
Requires-Dist: pydantic-settings>=2.6
|
|
30
|
+
Requires-Dist: pydantic>=2.9
|
|
31
|
+
Requires-Dist: python-multipart>=0.0.12
|
|
32
|
+
Requires-Dist: pyyaml>=6.0
|
|
33
|
+
Requires-Dist: typing-extensions>=4.12
|
|
34
|
+
Requires-Dist: uvicorn[standard]>=0.32
|
|
35
|
+
Provides-Extra: all
|
|
36
|
+
Requires-Dist: aiosqlite>=0.20; extra == 'all'
|
|
37
|
+
Requires-Dist: deepeval>=2.0; extra == 'all'
|
|
38
|
+
Requires-Dist: holysheet>=0.1; extra == 'all'
|
|
39
|
+
Requires-Dist: langchain-core>=0.3; extra == 'all'
|
|
40
|
+
Requires-Dist: langchain-ollama>=0.2; extra == 'all'
|
|
41
|
+
Requires-Dist: langgraph>=0.4; extra == 'all'
|
|
42
|
+
Requires-Dist: ollama>=0.4; extra == 'all'
|
|
43
|
+
Requires-Dist: opentelemetry-api>=1.20; extra == 'all'
|
|
44
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40; extra == 'all'
|
|
45
|
+
Requires-Dist: opentelemetry-instrumentation-httpx>=0.40; extra == 'all'
|
|
46
|
+
Requires-Dist: opentelemetry-sdk>=1.20; extra == 'all'
|
|
47
|
+
Requires-Dist: prometheus-client>=0.21; extra == 'all'
|
|
48
|
+
Requires-Dist: questionary>=2.0; extra == 'all'
|
|
49
|
+
Requires-Dist: rich>=13.0; extra == 'all'
|
|
50
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == 'all'
|
|
51
|
+
Provides-Extra: azure
|
|
52
|
+
Requires-Dist: langchain-openai>=0.3; extra == 'azure'
|
|
53
|
+
Provides-Extra: cli
|
|
54
|
+
Requires-Dist: questionary>=2.0; extra == 'cli'
|
|
55
|
+
Requires-Dist: rich>=13.0; extra == 'cli'
|
|
56
|
+
Provides-Extra: db
|
|
57
|
+
Requires-Dist: aiosqlite>=0.20; extra == 'db'
|
|
58
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == 'db'
|
|
59
|
+
Provides-Extra: db-postgres
|
|
60
|
+
Requires-Dist: asyncpg>=0.30; extra == 'db-postgres'
|
|
61
|
+
Requires-Dist: psycopg[binary]>=3.2; extra == 'db-postgres'
|
|
62
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == 'db-postgres'
|
|
63
|
+
Provides-Extra: dev
|
|
64
|
+
Requires-Dist: build>=1.0; extra == 'dev'
|
|
65
|
+
Requires-Dist: mypy>=1.13; extra == 'dev'
|
|
66
|
+
Requires-Dist: pre-commit>=4.0; extra == 'dev'
|
|
67
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
68
|
+
Requires-Dist: pytest-cov>=6.0; extra == 'dev'
|
|
69
|
+
Requires-Dist: pytest-mock>=3.14; extra == 'dev'
|
|
70
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
71
|
+
Requires-Dist: ruff>=0.8; extra == 'dev'
|
|
72
|
+
Requires-Dist: twine>=6.0; extra == 'dev'
|
|
73
|
+
Provides-Extra: docs
|
|
74
|
+
Requires-Dist: mike>=2.1; extra == 'docs'
|
|
75
|
+
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
|
|
76
|
+
Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
|
|
77
|
+
Provides-Extra: langchain
|
|
78
|
+
Requires-Dist: langchain-community>=0.3; extra == 'langchain'
|
|
79
|
+
Requires-Dist: langchain-core>=0.3; extra == 'langchain'
|
|
80
|
+
Requires-Dist: langchain>=0.3; extra == 'langchain'
|
|
81
|
+
Provides-Extra: langgraph
|
|
82
|
+
Requires-Dist: langchain-core>=0.3; extra == 'langgraph'
|
|
83
|
+
Requires-Dist: langgraph>=0.4; extra == 'langgraph'
|
|
84
|
+
Provides-Extra: metrics
|
|
85
|
+
Requires-Dist: prometheus-client>=0.21; extra == 'metrics'
|
|
86
|
+
Provides-Extra: ollama
|
|
87
|
+
Requires-Dist: langchain-ollama>=0.2; extra == 'ollama'
|
|
88
|
+
Requires-Dist: ollama>=0.4; extra == 'ollama'
|
|
89
|
+
Provides-Extra: openai
|
|
90
|
+
Requires-Dist: langchain-openai>=0.3; extra == 'openai'
|
|
91
|
+
Provides-Extra: optimize
|
|
92
|
+
Requires-Dist: deepeval>=2.0; extra == 'optimize'
|
|
93
|
+
Requires-Dist: holysheet>=0.1; extra == 'optimize'
|
|
94
|
+
Provides-Extra: studio
|
|
95
|
+
Provides-Extra: telemetry
|
|
96
|
+
Requires-Dist: opentelemetry-api>=1.20; extra == 'telemetry'
|
|
97
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40; extra == 'telemetry'
|
|
98
|
+
Requires-Dist: opentelemetry-instrumentation-httpx>=0.40; extra == 'telemetry'
|
|
99
|
+
Requires-Dist: opentelemetry-sdk>=1.20; extra == 'telemetry'
|
|
100
|
+
Provides-Extra: ui
|
|
101
|
+
Requires-Dist: chainlit>=2.0; extra == 'ui'
|
|
102
|
+
Provides-Extra: vertex
|
|
103
|
+
Requires-Dist: langchain-google-vertexai>=2.0; extra == 'vertex'
|
|
104
|
+
Description-Content-Type: text/markdown
|
|
105
|
+
|
|
106
|
+
<div align="center">
|
|
107
|
+
|
|
108
|
+
<p align="center">
|
|
109
|
+
<img src="assets/logo.png" width="300" alt="agentomatic">
|
|
110
|
+
</p>
|
|
111
|
+
|
|
112
|
+
# ⚡ Agentomatic
|
|
113
|
+
|
|
114
|
+
### Drop agents, not code
|
|
115
|
+
|
|
116
|
+
[](https://github.com/UnicoLab/agentomatic/actions/workflows/ci.yml)
|
|
117
|
+
[](https://pypi.org/project/agentomatic/)
|
|
118
|
+
[](https://pypi.org/project/agentomatic/)
|
|
119
|
+
[](https://github.com/UnicoLab/agentomatic/blob/main/LICENSE)
|
|
120
|
+
[](https://unicolab.github.io/agentomatic)
|
|
121
|
+
|
|
122
|
+
**The Zero-Code Multi-Agent API & Observability Framework.**
|
|
123
|
+
Build, trace, optimize, and time-travel debug production-ready AI agent APIs in just 3 lines of code. Agentomatic natively provides auto-discovery, auto-routing, dynamic streaming, a built-in visual Studio, and A2A protocols right out of the box.
|
|
124
|
+
|
|
125
|
+
[Documentation](https://unicolab.github.io/agentomatic) · [Agentomatic Studio](#-agentomatic-studio) · [Quick Start](#-quick-start) · [CLI Reference](#-cli) · [Templates](#-templates) · [Contributing](CONTRIBUTING.md)
|
|
126
|
+
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## ✨ Features
|
|
132
|
+
|
|
133
|
+
| Feature | Description |
|
|
134
|
+
|---|---|
|
|
135
|
+
| 🎯 **Agentomatic Studio** | Embedded visual agent debugger with graph rendering, live SSE node streaming, state mutation, and historical time-travel capabilities. |
|
|
136
|
+
| ⚡ **Prompt Optimizer** | Enterprise-grade prompt and configuration fitting utilizing 5 distinct optimizers with deployment recommendations. |
|
|
137
|
+
| 🔍 **Zero-Code Auto-Discovery** | Drop an agent folder → 25+ fully-documented REST endpoints appear automatically. |
|
|
138
|
+
| 🚀 **Rich API Surface** | Natively handles `invoke`, `stream`, `chat`, `A2A`, `health`, `config`, `threads`, `memory`, and `feedback`. |
|
|
139
|
+
| 🗄️ **Pluggable Storage** | Use `MemoryStore`, `SQLAlchemy`, or plug in your own custom persistence layer. |
|
|
140
|
+
| 🔐 **Enterprise Middleware** | High-performance pipeline with JWT Auth, dynamic rate limiting, and Prometheus telemetry — all toggleable. |
|
|
141
|
+
| 📦 **Scaffolding Templates** | Jumpstart development with 5 templates: `basic`, `full`, `rag`, `chatbot`, and `custom`. |
|
|
142
|
+
| 🤖 **A2A Protocol** | True Agent-to-Agent communication flows integrated out of the box. |
|
|
143
|
+
| 🔌 **Framework Agnostic** | Fully supports LangGraph, LangChain, or raw Python execution logic. |
|
|
144
|
+
| 🩺 **Beautiful CLI** | A rich terminal experience with commands like `doctor`, `inspect`, and `test`. |
|
|
145
|
+
| 🧪 **Data Synthesizer** | Auto-generate and systematically augment evaluation datasets using LLMs. |
|
|
146
|
+
| 📊 **Observability HTML Reports** | Generate rich SVG charts, prompt diffs, and deep experiment tracking analytics. |
|
|
147
|
+
| 🚦 **Human-in-the-Loop** | Seamlessly suspend, intercept, and resume execution with human approval gates. |
|
|
148
|
+
| 🌳 **Thread Lineage** | First-class parent/child conversation tracking with recursive ancestry traversal. |
|
|
149
|
+
| ⏰ **HITL TTL Expiry** | Automatic garbage collection and cleanup of stale suspended states (7-day default). |
|
|
150
|
+
| 🛡️ **LLM Failover Chains** | Multi-provider fallback pipelines to guarantee extreme runtime resilience. |
|
|
151
|
+
| 🧬 **Thread Forking** | Clone conversations and branch execution at any specific message index natively. |
|
|
152
|
+
| 🔀 **A/B Prompt Routing** | Dynamically inject weight-based prompt version selection to test optimizations in production. |
|
|
153
|
+
| 🪝 **State Hooks** | Before/after node interceptors designed specifically for robust audit and telemetry logs. |
|
|
154
|
+
| 🧠 **Conversation Memory** | Automatic short-term session logic paired with long-term memory windowing. |
|
|
155
|
+
| 📝 **Auto-Summarization** | Intelligent LLM-powered compression of excessively long conversations to save token limits. |
|
|
156
|
+
| 📋 **Thread CRUD** | Full lifecycle management (`create`, `update`, `delete`, `clear`). |
|
|
157
|
+
| 💬 **Message Persistence** | Every conversational turn is automatically saved to storage — ensuring history survives system restarts perfectly. |
|
|
158
|
+
|
|
159
|
+
## 🚀 Quick Start
|
|
160
|
+
|
|
161
|
+
### Install
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
pip install agentomatic[all]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Create an Agent
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
agentomatic init my_agent --template basic
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Build & Run
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
# main.py
|
|
177
|
+
from agentomatic import AgentPlatform
|
|
178
|
+
|
|
179
|
+
platform = AgentPlatform.from_folder("agents/")
|
|
180
|
+
app = platform.build()
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
uvicorn main:app --reload
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Test
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# CLI
|
|
191
|
+
agentomatic test my_agent
|
|
192
|
+
|
|
193
|
+
# curl
|
|
194
|
+
curl -X POST http://localhost:8000/api/v1/my_agent/invoke \
|
|
195
|
+
-H "Content-Type: application/json" \
|
|
196
|
+
-d '{"query": "Hello!"}'
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 🏗️ Architecture
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
203
|
+
│ AgentPlatform │
|
|
204
|
+
│ │
|
|
205
|
+
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────────┐ │
|
|
206
|
+
│ │ Registry │ │ Middleware │ │ Storage │ │
|
|
207
|
+
│ │ │ │ ├─ Auth │ │ ├─ MemoryStore │ │
|
|
208
|
+
│ │ agent_a │ │ ├─ RateLimit │ │ ├─ SQLAlchemyStore │ │
|
|
209
|
+
│ │ agent_b │ │ ├─ Metrics │ │ └─ YourStore(ABC) │ │
|
|
210
|
+
│ │ agent_c │ │ └─ Logging │ │ │ │
|
|
211
|
+
│ └──────────┘ └──────────────┘ └───────────────────────┘ │
|
|
212
|
+
│ │
|
|
213
|
+
│ Per Agent: POST /invoke, /stream, /chat, /a2a/tasks ... │
|
|
214
|
+
└─────────────────────────────────────────────────────────────┘
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 📂 Agent Structure
|
|
218
|
+
|
|
219
|
+
Only `__init__.py` is required. Everything else is optional overrides:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
agents/my_agent/
|
|
223
|
+
├── __init__.py ← REQUIRED: manifest + node_fn
|
|
224
|
+
├── graph.py ← Optional: LangGraph StateGraph
|
|
225
|
+
├── nodes.py ← Optional: node functions
|
|
226
|
+
├── config.py ← Optional: Pydantic config
|
|
227
|
+
├── schemas.py ← Optional: custom request/response models
|
|
228
|
+
├── tools.py ← Optional: LangChain tools
|
|
229
|
+
├── api.py ← Optional: custom router (REPLACES auto-gen)
|
|
230
|
+
├── prompts.json ← Optional: versioned prompt templates
|
|
231
|
+
├── langgraph.json ← Optional: LangGraph Studio config
|
|
232
|
+
├── .env.example ← Optional: environment variables
|
|
233
|
+
└── README.md ← Optional: agent documentation
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## 📦 Templates
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
agentomatic init my_agent --template <template>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
| Template | Files | Description |
|
|
243
|
+
|----------|-------|-------------|
|
|
244
|
+
| `basic` | 7 | Minimal agent — quick start |
|
|
245
|
+
| `full` | 11 | All override files — config, schemas, api, tools |
|
|
246
|
+
| `rag` | 9 | Retrieve → Generate pipeline |
|
|
247
|
+
| `chatbot` | 8 | Conversational with memory |
|
|
248
|
+
| `custom` | 4 | Framework-agnostic — no LangGraph |
|
|
249
|
+
|
|
250
|
+
## 🖥️ CLI
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
⚡ Agentomatic — Drop agents, not code
|
|
254
|
+
|
|
255
|
+
init <name> Scaffold a new agent from template
|
|
256
|
+
run Start the platform server
|
|
257
|
+
run --studio Start with Agentomatic Studio visual debugger 🎨
|
|
258
|
+
run --with-ui Start with Chainlit chat interface 💬
|
|
259
|
+
demo Launch demo platform with Studio (no setup needed)
|
|
260
|
+
list List discovered agents (Rich table)
|
|
261
|
+
test <name> Interactive terminal testing
|
|
262
|
+
inspect <name> Show agent structure + config
|
|
263
|
+
doctor Environment health check
|
|
264
|
+
optimize <name> Run prompt optimization
|
|
265
|
+
ui Launch Chainlit debug UI standalone
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 🎨 Agentomatic Studio
|
|
269
|
+
|
|
270
|
+
Agentomatic ships with a built-in React-based visual studio designed for time-travel debugging, real-time node streaming, and state inspection for all underlying LangGraph agents.
|
|
271
|
+
|
|
272
|
+
To use the studio, install the optional package dependencies and run with the `--studio` flag:
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
pip install "agentomatic[studio]"
|
|
276
|
+
agentomatic run --studio
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
The unified server will bind to `http://localhost:8000` and mount the studio at `http://localhost:8000/studio/ui/`.
|
|
280
|
+
|
|
281
|
+
**Key Studio Features**:
|
|
282
|
+
- **Live Node Streaming**: Watch Server-Sent Events (SSE) transition node activity dynamically.
|
|
283
|
+
- **Conditional Breakpoints**: Right-click graph nodes to intercept flow before execution triggers.
|
|
284
|
+
- **Time-Travel History**: Rewind to any state checkpoint and replay from historical forks.
|
|
285
|
+
- **Live State Editing**: Mutate graph state payloads on the fly during a breakpoint pause.
|
|
286
|
+
|
|
287
|
+
## ⚙️ Configuration
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
from agentomatic import AgentPlatform
|
|
291
|
+
from agentomatic.storage import MemoryStore # or SQLAlchemyStore
|
|
292
|
+
|
|
293
|
+
platform = AgentPlatform.from_folder(
|
|
294
|
+
"agents/",
|
|
295
|
+
# Storage
|
|
296
|
+
store=MemoryStore(),
|
|
297
|
+
# Auth
|
|
298
|
+
enable_auth=True,
|
|
299
|
+
auth_api_key="your-secret-key",
|
|
300
|
+
# Rate limiting
|
|
301
|
+
enable_rate_limit=True,
|
|
302
|
+
rate_limit_requests=100,
|
|
303
|
+
rate_limit_window=60,
|
|
304
|
+
# Prometheus metrics
|
|
305
|
+
enable_metrics=True,
|
|
306
|
+
# Custom middleware
|
|
307
|
+
middleware=[(MyMiddleware, {"arg": "value"})],
|
|
308
|
+
)
|
|
309
|
+
app = platform.build()
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## 🗄️ Storage Backends
|
|
313
|
+
|
|
314
|
+
```python
|
|
315
|
+
# Development
|
|
316
|
+
from agentomatic.storage import MemoryStore
|
|
317
|
+
store = MemoryStore()
|
|
318
|
+
|
|
319
|
+
# Production (PostgreSQL)
|
|
320
|
+
from agentomatic.storage import SQLAlchemyStore
|
|
321
|
+
store = SQLAlchemyStore("postgresql+asyncpg://user:pass@localhost/db")
|
|
322
|
+
|
|
323
|
+
# Custom
|
|
324
|
+
from agentomatic.storage import BaseStore
|
|
325
|
+
class RedisStore(BaseStore):
|
|
326
|
+
async def create_thread(self, ...): ...
|
|
327
|
+
async def get_thread(self, ...): ...
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## 🎨 Debug UI
|
|
331
|
+
|
|
332
|
+
Built-in ChatGPT-like interface powered by Chainlit:
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
pip install agentomatic[ui]
|
|
336
|
+
agentomatic run --with-ui
|
|
337
|
+
# → http://localhost:8000/chat
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Features: agent selector, streaming, tool call visualization, chain-of-thought, feedback collection.
|
|
341
|
+
|
|
342
|
+
## 🎨 Agentomatic Studio
|
|
343
|
+
|
|
344
|
+
Visual debugging environment for **any agent framework** — graph visualization, real-time execution tracing, state inspection, and time-travel debugging.
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# Quick demo (no setup required)
|
|
348
|
+
agentomatic demo
|
|
349
|
+
|
|
350
|
+
# With your agents
|
|
351
|
+
agentomatic run --studio
|
|
352
|
+
# → Studio at http://localhost:8000/studio/ui/
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Universal Framework Support:**
|
|
356
|
+
|
|
357
|
+
| Feature | LangGraph | LangChain | Custom / Raw Python |
|
|
358
|
+
|---|:---:|:---:|:---:|
|
|
359
|
+
| Graph Visualization | ✅ Real graph | ✅ LCEL / synthetic | ✅ Synthetic or `@studio_graph` |
|
|
360
|
+
| SSE Node Streaming | ✅ Full | ✅ `astream_events` | ✅ Trace-based |
|
|
361
|
+
| State Inspection | ✅ Checkpointer | ✅ I/O capture | ✅ Custom or in-memory |
|
|
362
|
+
| Time-Travel History | ✅ Checkpoints | ✅ Traces | ✅ Traces |
|
|
363
|
+
| Breakpoints / HITL | ✅ | ❌ | ❌ |
|
|
364
|
+
|
|
365
|
+
**Studio API Endpoints** (mounted at `/studio/`):
|
|
366
|
+
|
|
367
|
+
| Method | Path | Description |
|
|
368
|
+
|--------|------|-------------|
|
|
369
|
+
| `GET` | `/studio/info` | Server info + capabilities |
|
|
370
|
+
| `GET` | `/studio/agents` | List agents with debugging capabilities |
|
|
371
|
+
| `GET` | `/studio/agents/{name}/graph` | Graph topology (nodes, edges) |
|
|
372
|
+
| `GET` | `/studio/agents/{name}/schemas` | Input/output JSON schemas |
|
|
373
|
+
| `POST` | `/studio/agents/{name}/runs/stream` | Execute with SSE event streaming |
|
|
374
|
+
| `GET` | `/studio/agents/{name}/threads/{tid}/state` | Thread state snapshot |
|
|
375
|
+
| `GET` | `/studio/agents/{name}/threads/{tid}/history` | Checkpoint history |
|
|
376
|
+
|
|
377
|
+
**Studio Decorators** — incrementally upgrade any agent's Studio experience:
|
|
378
|
+
|
|
379
|
+
```python
|
|
380
|
+
from agentomatic.studio import studio_graph, studio_state
|
|
381
|
+
|
|
382
|
+
@studio_graph
|
|
383
|
+
def my_topology():
|
|
384
|
+
return {"nodes": [...], "edges": [...]}
|
|
385
|
+
|
|
386
|
+
@studio_state
|
|
387
|
+
async def get_state(thread_id: str) -> dict:
|
|
388
|
+
return await my_db.get_state(thread_id)
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## 📊 Auto-Generated Endpoints
|
|
392
|
+
|
|
393
|
+
Every agent gets 12+ endpoints automatically:
|
|
394
|
+
|
|
395
|
+
| Method | Path | Description |
|
|
396
|
+
|--------|------|-------------|
|
|
397
|
+
| `POST` | `/api/v1/{agent}/invoke` | Synchronous invocation |
|
|
398
|
+
| `POST` | `/api/v1/{agent}/invoke/stream` | SSE streaming |
|
|
399
|
+
| `POST` | `/api/v1/{agent}/chat` | Session-aware chat |
|
|
400
|
+
| `GET` | `/api/v1/{agent}/health` | Per-agent health |
|
|
401
|
+
| `GET` | `/api/v1/{agent}/card` | A2A agent card |
|
|
402
|
+
| `POST` | `/api/v1/{agent}/a2a/tasks` | A2A task submission |
|
|
403
|
+
| `GET` | `/api/v1/{agent}/threads` | List threads |
|
|
404
|
+
| `POST` | `/api/v1/{agent}/threads/{id}/approve` | HITL: approve suspended state |
|
|
405
|
+
| `POST` | `/api/v1/{agent}/threads/{id}/reject` | HITL: reject suspended state |
|
|
406
|
+
| `GET` | `/api/v1/{agent}/threads/{id}/pending` | HITL: list pending approvals |
|
|
407
|
+
| `POST` | `/api/v1/{agent}/threads/{id}/fork` | Fork thread at message index |
|
|
408
|
+
| `GET` | `/api/v1/{agent}/threads/{id}/lineage` | Thread ancestry/descendant tree |
|
|
409
|
+
| ... | ... | + config, prompts, thread messages |
|
|
410
|
+
|
|
411
|
+
### 🔧 Prompt Fitting (ML-like API)
|
|
412
|
+
|
|
413
|
+
Agentomatic Optimize treats your deployed agent configuration as a **parameter surface**
|
|
414
|
+
to fit against real evaluation data. The output is never a compiled program — it's a
|
|
415
|
+
**better deployment configuration**: an improved prompt, tuned model parameters,
|
|
416
|
+
optimized RAG settings, and a rollout recommendation you can ship with confidence.
|
|
417
|
+
|
|
418
|
+
> **Philosophy:** Your agent is already deployed. Optimization produces a *better version*
|
|
419
|
+
> of that deployment, not a new artifact. Every result includes a `DeploymentRecommendation`
|
|
420
|
+
> with canary weights and confidence scores so you can roll out safely.
|
|
421
|
+
|
|
422
|
+
#### EvalContract — Structural Quality Gate
|
|
423
|
+
|
|
424
|
+
Define what a valid agent response looks like *before* you optimize:
|
|
425
|
+
|
|
426
|
+
```python
|
|
427
|
+
from agentomatic.optimize import EvalContract
|
|
428
|
+
|
|
429
|
+
contract = EvalContract(
|
|
430
|
+
name="scoping_response",
|
|
431
|
+
input_fields=["query", "context"],
|
|
432
|
+
output_format="json",
|
|
433
|
+
required_output_fields=["answer", "confidence", "risks", "next_questions"],
|
|
434
|
+
constraints=["confidence must be between 0.0 and 1.0"],
|
|
435
|
+
)
|
|
436
|
+
|
|
437
|
+
score = contract.validate(response_text) # 0.0 – 1.0
|
|
438
|
+
metric = contract.as_metric(weight=0.10) # use inside CompositeMetric
|
|
439
|
+
criteria = contract.as_judge_criteria() # feed to LLM judge
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
#### CompositeMetric — Multi-Dimensional Scoring
|
|
443
|
+
|
|
444
|
+
Combine quality judges with **negative-weight** cost/latency penalties so the optimizer
|
|
445
|
+
balances accuracy against operational cost:
|
|
446
|
+
|
|
447
|
+
```python
|
|
448
|
+
from agentomatic.optimize import (
|
|
449
|
+
CompositeMetric, WeightedMetric,
|
|
450
|
+
LocalJudgeMetric, LatencyMetric, CostMetric,
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
metric = CompositeMetric(metrics=[
|
|
454
|
+
WeightedMetric("completeness", LocalJudgeMetric("completeness"), weight=0.30),
|
|
455
|
+
WeightedMetric("relevance", LocalJudgeMetric("business_relevance"),weight=0.25),
|
|
456
|
+
WeightedMetric("risk_detection", LocalJudgeMetric("risk_detection"), weight=0.20),
|
|
457
|
+
WeightedMetric("format", contract.as_metric(), weight=0.10),
|
|
458
|
+
WeightedMetric("latency", LatencyMetric(), weight=-0.10),
|
|
459
|
+
WeightedMetric("cost", CostMetric(), weight=-0.05),
|
|
460
|
+
])
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
> Negative weights penalize candidates that are slower or more expensive, steering the
|
|
464
|
+
> fitter toward cost-effective configurations.
|
|
465
|
+
|
|
466
|
+
#### PromptSearchSpace — Full Configuration Surface
|
|
467
|
+
|
|
468
|
+
Tell the fitter *what* it's allowed to change:
|
|
469
|
+
|
|
470
|
+
```python
|
|
471
|
+
from agentomatic.optimize import PromptSearchSpace
|
|
472
|
+
|
|
473
|
+
space = PromptSearchSpace(
|
|
474
|
+
optimize_system_prompt=True,
|
|
475
|
+
optimize_few_shot=True,
|
|
476
|
+
optimize_model_params=True,
|
|
477
|
+
optimize_model_choice=True,
|
|
478
|
+
model_choices=["ollama/qwen2.5:7b", "openai/gpt-4.1"],
|
|
479
|
+
fallback_models=["openai/gpt-4.1-mini"],
|
|
480
|
+
model_param_space={
|
|
481
|
+
"temperature": [0.0, 0.1, 0.2, 0.4, 0.7],
|
|
482
|
+
"top_p": [0.7, 0.9, 1.0],
|
|
483
|
+
},
|
|
484
|
+
rag_param_space={"top_k": [3, 5, 8, 12], "rerank": [True, False]},
|
|
485
|
+
optimize_rag_params=True,
|
|
486
|
+
)
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
#### PromptFitter — The scikit-learn-like API
|
|
490
|
+
|
|
491
|
+
```python
|
|
492
|
+
from agentomatic.optimize import PromptFitter
|
|
493
|
+
|
|
494
|
+
fitter = PromptFitter(
|
|
495
|
+
agent="scope_agent",
|
|
496
|
+
task_model="ollama/qwen2.5:7b",
|
|
497
|
+
rewrite_model="openai/gpt-4.1",
|
|
498
|
+
optimizer="gepa_like",
|
|
499
|
+
search_space=space,
|
|
500
|
+
max_trials=30,
|
|
501
|
+
min_absolute_improvement=0.05,
|
|
502
|
+
concurrency=5,
|
|
503
|
+
)
|
|
504
|
+
result = await fitter.fit(trainset, valset, metric, testset=testset)
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Access the full result surface:
|
|
508
|
+
|
|
509
|
+
```python
|
|
510
|
+
result.best_prompt # optimized system prompt
|
|
511
|
+
result.best_params # {"temperature": 0.2, "top_p": 0.9}
|
|
512
|
+
result.best_few_shot_examples # selected few-shot examples
|
|
513
|
+
result.metric_deltas # per-dimension improvement
|
|
514
|
+
result.suggestions # actionable recommendations
|
|
515
|
+
result.deployment_recommendation # canary rollout config
|
|
516
|
+
result.summary() # human-readable summary
|
|
517
|
+
result.apply(version="v2_optimized")
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Five optimisation strategies:**
|
|
521
|
+
|
|
522
|
+
| Strategy | What it does |
|
|
523
|
+
|---|---|
|
|
524
|
+
| `rewrite` | LLM-driven prompt rewrite based on failure analysis |
|
|
525
|
+
| `few_shot_bootstrap` | Score²-weighted example selection with diversity scoring |
|
|
526
|
+
| `mipro_like` | Multi-perspective instruction generation + cross-product search |
|
|
527
|
+
| `gepa_like` | Feedback-guided targeted prompt mutations |
|
|
528
|
+
| `param_search` | Grid search over model/RAG/tool parameters |
|
|
529
|
+
|
|
530
|
+
#### DeploymentRecommendation — Ship With Confidence
|
|
531
|
+
|
|
532
|
+
Every `PromptFitResult` includes a deployment recommendation based on the observed
|
|
533
|
+
improvement magnitude and variance:
|
|
534
|
+
|
|
535
|
+
```python
|
|
536
|
+
rec = result.deployment_recommendation
|
|
537
|
+
print(rec.confidence) # "high" / "medium" / "low"
|
|
538
|
+
print(rec.rollout.strategy) # "canary"
|
|
539
|
+
print(rec.rollout.initial_weight) # 0.40
|
|
540
|
+
print(rec.summary()) # human-readable deployment plan
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
#### Failure Clusters — Targeted Diagnostics
|
|
544
|
+
|
|
545
|
+
The fitter groups validation failures into actionable clusters, each with the parameters
|
|
546
|
+
most likely to resolve the issue and the expected metric gain:
|
|
547
|
+
|
|
548
|
+
```
|
|
549
|
+
Failure cluster 1:
|
|
550
|
+
Agent answered without using retrieval context.
|
|
551
|
+
→ Suggested fix: force context-first behavior.
|
|
552
|
+
→ Affected params: rag.top_k, tool_policy.force_retrieval
|
|
553
|
+
→ Expected metric gain: faithfulness +0.18
|
|
554
|
+
|
|
555
|
+
Failure cluster 2:
|
|
556
|
+
Agent produced unstructured answers.
|
|
557
|
+
→ Suggested fix: stronger output format block.
|
|
558
|
+
→ Affected params: prompt.output_contract
|
|
559
|
+
→ Expected metric gain: format_compliance +0.12
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
#### Ideal CLI Flow
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
# 1. Run your agents
|
|
566
|
+
agentomatic run
|
|
567
|
+
|
|
568
|
+
# 2. Generate a synthetic evaluation dataset from your docs
|
|
569
|
+
agentomatic dataset synth scope_agent --from-docs docs/scoping.md --n 100
|
|
570
|
+
|
|
571
|
+
# 3. Evaluate the current version
|
|
572
|
+
agentomatic eval scope_agent --dataset scope_eval.jsonl --metrics scoping_quality
|
|
573
|
+
|
|
574
|
+
# 4. Fit a better configuration
|
|
575
|
+
agentomatic optimize scope_agent --optimize prompt,params,rag,tools
|
|
576
|
+
|
|
577
|
+
# 5. Canary release — send 20 % traffic to the new version
|
|
578
|
+
agentomatic route scope_agent --version v2_optimized --weight 20
|
|
579
|
+
|
|
580
|
+
# 6. Promote when satisfied
|
|
581
|
+
agentomatic promote scope_agent --version v2_optimized
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
#### Vocabulary
|
|
585
|
+
|
|
586
|
+
| ❌ Avoid | ✅ Use instead |
|
|
587
|
+
|----------|----------------|
|
|
588
|
+
| Program | Agent endpoint |
|
|
589
|
+
| Compile | Fit / optimize / tune |
|
|
590
|
+
| Signature | EvalContract |
|
|
591
|
+
| Module | Deployment component |
|
|
592
|
+
| Predictor | Agent version |
|
|
593
|
+
| Compiled artifact | Optimized config version |
|
|
594
|
+
|
|
595
|
+
## 🛠️ Development
|
|
596
|
+
|
|
597
|
+
```bash
|
|
598
|
+
# Install
|
|
599
|
+
git clone https://github.com/UnicoLab/agentomatic.git
|
|
600
|
+
cd agentomatic
|
|
601
|
+
make dev # Installs all deps + pre-commit hooks
|
|
602
|
+
|
|
603
|
+
# Quality
|
|
604
|
+
make lint # Ruff linter
|
|
605
|
+
make format # Auto-format
|
|
606
|
+
make typecheck # Mypy
|
|
607
|
+
make test # All tests
|
|
608
|
+
make test-cov # With coverage
|
|
609
|
+
make check-all # lint + typecheck + test
|
|
610
|
+
|
|
611
|
+
# Docs
|
|
612
|
+
make docs-serve # Local docs server
|
|
613
|
+
make docs-build # Build static site
|
|
614
|
+
|
|
615
|
+
# Build
|
|
616
|
+
make build # Package
|
|
617
|
+
make publish # PyPI
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
## 📜 License
|
|
621
|
+
|
|
622
|
+
MIT — see [LICENSE](LICENSE).
|
|
623
|
+
|
|
624
|
+
## 👥 Authors
|
|
625
|
+
|
|
626
|
+
**[UnicoLab](https://github.com/UnicoLab)** — Building the future of AI agent platforms.
|
|
627
|
+
|
|
628
|
+
---
|
|
629
|
+
|
|
630
|
+
<div align="center">
|
|
631
|
+
|
|
632
|
+
**[⭐ Star us on GitHub](https://github.com/UnicoLab/agentomatic)** — it helps!
|
|
633
|
+
|
|
634
|
+
Made with ❤️ by UnicoLab
|
|
635
|
+
|
|
636
|
+
</div>
|