agentomatic 0.3.0__tar.gz → 0.5.0__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.
Files changed (218) hide show
  1. agentomatic-0.5.0/PKG-INFO +636 -0
  2. agentomatic-0.5.0/README.md +531 -0
  3. {agentomatic-0.3.0 → agentomatic-0.5.0}/pyproject.toml +26 -4
  4. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/__init__.py +6 -0
  5. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/_version.py +1 -1
  6. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/cli/commands.py +44 -1
  7. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/cli/templates.py +24 -1
  8. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/lifespan.py +6 -0
  9. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/manifest.py +6 -0
  10. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/memory_manager.py +37 -6
  11. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/platform.py +92 -9
  12. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/registry.py +4 -0
  13. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/router_factory.py +26 -14
  14. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/state.py +3 -1
  15. agentomatic-0.5.0/src/agentomatic/demo/__init__.py +1 -0
  16. agentomatic-0.5.0/src/agentomatic/demo/agent.py +180 -0
  17. agentomatic-0.5.0/src/agentomatic/demo/server.py +82 -0
  18. agentomatic-0.5.0/src/agentomatic/middleware/__init__.py +36 -0
  19. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/middleware/feedback.py +5 -0
  20. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/__init__.py +77 -1
  21. agentomatic-0.5.0/src/agentomatic/optimize/config.py +477 -0
  22. agentomatic-0.5.0/src/agentomatic/optimize/deployment.py +338 -0
  23. agentomatic-0.5.0/src/agentomatic/optimize/eval_contract.py +300 -0
  24. agentomatic-0.5.0/src/agentomatic/optimize/failure_analysis.py +383 -0
  25. agentomatic-0.5.0/src/agentomatic/optimize/fitter.py +973 -0
  26. agentomatic-0.5.0/src/agentomatic/optimize/fitter_optimizers.py +1462 -0
  27. agentomatic-0.5.0/src/agentomatic/optimize/judges.py +403 -0
  28. agentomatic-0.5.0/src/agentomatic/optimize/llm_caller.py +361 -0
  29. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/metrics.py +439 -0
  30. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/optimizer.py +35 -0
  31. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/report.py +297 -0
  32. agentomatic-0.5.0/src/agentomatic/optimize/search_space.py +246 -0
  33. agentomatic-0.5.0/src/agentomatic/studio/__init__.py +36 -0
  34. agentomatic-0.5.0/src/agentomatic/studio/adapter.py +161 -0
  35. agentomatic-0.5.0/src/agentomatic/studio/adapters/__init__.py +78 -0
  36. agentomatic-0.5.0/src/agentomatic/studio/adapters/generic.py +352 -0
  37. agentomatic-0.5.0/src/agentomatic/studio/adapters/langchain.py +467 -0
  38. agentomatic-0.5.0/src/agentomatic/studio/adapters/langgraph.py +484 -0
  39. agentomatic-0.5.0/src/agentomatic/studio/decorators.py +133 -0
  40. agentomatic-0.5.0/src/agentomatic/studio/graph_inspector.py +209 -0
  41. agentomatic-0.5.0/src/agentomatic/studio/models.py +214 -0
  42. agentomatic-0.5.0/src/agentomatic/studio/router.py +465 -0
  43. agentomatic-0.5.0/src/agentomatic/studio/run_tracker.py +223 -0
  44. agentomatic-0.5.0/src/agentomatic/studio/serve.py +98 -0
  45. agentomatic-0.5.0/src/agentomatic/studio/static/asset-manifest.json +13 -0
  46. agentomatic-0.5.0/src/agentomatic/studio/static/imgs/graph_view.png +0 -0
  47. agentomatic-0.5.0/src/agentomatic/studio/static/imgs/logo.png +0 -0
  48. agentomatic-0.5.0/src/agentomatic/studio/static/imgs/main_screen.png +0 -0
  49. agentomatic-0.5.0/src/agentomatic/studio/static/imgs/main_screen_ok.png +0 -0
  50. agentomatic-0.5.0/src/agentomatic/studio/static/index.html +1 -0
  51. agentomatic-0.5.0/src/agentomatic/studio/static/manifest.json +9 -0
  52. agentomatic-0.5.0/src/agentomatic/studio/static/static/css/main.8b3c42dd.css +4 -0
  53. agentomatic-0.5.0/src/agentomatic/studio/static/static/css/main.8b3c42dd.css.map +1 -0
  54. agentomatic-0.5.0/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js +3 -0
  55. agentomatic-0.5.0/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js.LICENSE.txt +98 -0
  56. agentomatic-0.5.0/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js.map +1 -0
  57. {agentomatic-0.3.0 → agentomatic-0.5.0}/tests/test_agentomatic.py +4 -1
  58. agentomatic-0.5.0/tests/test_bugfixes_041.py +619 -0
  59. agentomatic-0.5.0/tests/test_coverage_boost.py +490 -0
  60. agentomatic-0.5.0/tests/test_deep_agent.py +534 -0
  61. agentomatic-0.5.0/tests/test_fitter.py +1390 -0
  62. agentomatic-0.5.0/tests/test_studio.py +902 -0
  63. agentomatic-0.3.0/.chainlit/config.toml +0 -178
  64. agentomatic-0.3.0/.chainlit/translations/ar-SA.json +0 -259
  65. agentomatic-0.3.0/.chainlit/translations/bn.json +0 -260
  66. agentomatic-0.3.0/.chainlit/translations/da-DK.json +0 -259
  67. agentomatic-0.3.0/.chainlit/translations/de-DE.json +0 -254
  68. agentomatic-0.3.0/.chainlit/translations/el-GR.json +0 -260
  69. agentomatic-0.3.0/.chainlit/translations/en-US.json +0 -260
  70. agentomatic-0.3.0/.chainlit/translations/es.json +0 -260
  71. agentomatic-0.3.0/.chainlit/translations/fr-FR.json +0 -260
  72. agentomatic-0.3.0/.chainlit/translations/gu.json +0 -260
  73. agentomatic-0.3.0/.chainlit/translations/he-IL.json +0 -260
  74. agentomatic-0.3.0/.chainlit/translations/hi.json +0 -260
  75. agentomatic-0.3.0/.chainlit/translations/it.json +0 -254
  76. agentomatic-0.3.0/.chainlit/translations/ja.json +0 -259
  77. agentomatic-0.3.0/.chainlit/translations/kn.json +0 -260
  78. agentomatic-0.3.0/.chainlit/translations/ko.json +0 -254
  79. agentomatic-0.3.0/.chainlit/translations/ml.json +0 -260
  80. agentomatic-0.3.0/.chainlit/translations/mr.json +0 -260
  81. agentomatic-0.3.0/.chainlit/translations/nl.json +0 -260
  82. agentomatic-0.3.0/.chainlit/translations/pt-PT.json +0 -260
  83. agentomatic-0.3.0/.chainlit/translations/ta.json +0 -260
  84. agentomatic-0.3.0/.chainlit/translations/te.json +0 -260
  85. agentomatic-0.3.0/.chainlit/translations/zh-CN.json +0 -260
  86. agentomatic-0.3.0/.chainlit/translations/zh-TW.json +0 -260
  87. agentomatic-0.3.0/.dockerignore +0 -90
  88. agentomatic-0.3.0/.env.example +0 -62
  89. agentomatic-0.3.0/.github/FUNDING.yml +0 -1
  90. agentomatic-0.3.0/.github/workflows/ci.yml +0 -157
  91. agentomatic-0.3.0/.github/workflows/docs.yml +0 -59
  92. agentomatic-0.3.0/.github/workflows/manual-docs.yml +0 -84
  93. agentomatic-0.3.0/.github/workflows/manual-pypi.yml +0 -70
  94. agentomatic-0.3.0/.github/workflows/pr-checks.yml +0 -64
  95. agentomatic-0.3.0/.github/workflows/release.yml +0 -186
  96. agentomatic-0.3.0/.gitignore +0 -47
  97. agentomatic-0.3.0/.pre-commit-config.yaml +0 -38
  98. agentomatic-0.3.0/.vscode-upload.json +0 -21
  99. agentomatic-0.3.0/CHANGELOG.md +0 -339
  100. agentomatic-0.3.0/CONTRIBUTING.md +0 -91
  101. agentomatic-0.3.0/Dockerfile +0 -82
  102. agentomatic-0.3.0/Dockerfile.distroless +0 -58
  103. agentomatic-0.3.0/Makefile +0 -103
  104. agentomatic-0.3.0/PKG-INFO +0 -379
  105. agentomatic-0.3.0/README.md +0 -275
  106. agentomatic-0.3.0/TODO.md +0 -1
  107. agentomatic-0.3.0/assets/logo.png +0 -0
  108. agentomatic-0.3.0/docker-compose.yml +0 -52
  109. agentomatic-0.3.0/docs/FRONTEND_API_GUIDE.md +0 -290
  110. agentomatic-0.3.0/docs/architecture/api-reference.md +0 -67
  111. agentomatic-0.3.0/docs/architecture/overview.md +0 -54
  112. agentomatic-0.3.0/docs/assets/architecture_diagram.png +0 -0
  113. agentomatic-0.3.0/docs/assets/logo.png +0 -0
  114. agentomatic-0.3.0/docs/assets/optimization_flow.png +0 -0
  115. agentomatic-0.3.0/docs/changelog.md +0 -67
  116. agentomatic-0.3.0/docs/cli/commands.md +0 -285
  117. agentomatic-0.3.0/docs/contributing.md +0 -41
  118. agentomatic-0.3.0/docs/getting-started/first-agent.md +0 -135
  119. agentomatic-0.3.0/docs/getting-started/installation.md +0 -130
  120. agentomatic-0.3.0/docs/getting-started/quickstart.md +0 -122
  121. agentomatic-0.3.0/docs/guide/agent-structure.md +0 -189
  122. agentomatic-0.3.0/docs/guide/configuration.md +0 -107
  123. agentomatic-0.3.0/docs/guide/debug-ui.md +0 -91
  124. agentomatic-0.3.0/docs/guide/middleware.md +0 -156
  125. agentomatic-0.3.0/docs/guide/optimization.md +0 -223
  126. agentomatic-0.3.0/docs/guide/platform-features.md +0 -689
  127. agentomatic-0.3.0/docs/guide/prompts.md +0 -151
  128. agentomatic-0.3.0/docs/guide/schemas.md +0 -252
  129. agentomatic-0.3.0/docs/guide/storage.md +0 -208
  130. agentomatic-0.3.0/docs/guide/telemetry.md +0 -198
  131. agentomatic-0.3.0/docs/guide/templates.md +0 -55
  132. agentomatic-0.3.0/docs/index.md +0 -123
  133. agentomatic-0.3.0/examples/full_agent/agents/weather/__init__.py +0 -35
  134. agentomatic-0.3.0/examples/full_agent/agents/weather/api.py +0 -49
  135. agentomatic-0.3.0/examples/full_agent/agents/weather/config.py +0 -39
  136. agentomatic-0.3.0/examples/full_agent/agents/weather/graph.py +0 -51
  137. agentomatic-0.3.0/examples/full_agent/agents/weather/langgraph.json +0 -7
  138. agentomatic-0.3.0/examples/full_agent/agents/weather/nodes.py +0 -60
  139. agentomatic-0.3.0/examples/full_agent/agents/weather/prompts.json +0 -14
  140. agentomatic-0.3.0/examples/full_agent/agents/weather/schemas.py +0 -39
  141. agentomatic-0.3.0/examples/full_agent/agents/weather/tools.py +0 -32
  142. agentomatic-0.3.0/examples/full_agent/main.py +0 -78
  143. agentomatic-0.3.0/examples/hello_agent/agents/hello/__init__.py +0 -22
  144. agentomatic-0.3.0/examples/hello_agent/agents/hello/graph.py +0 -26
  145. agentomatic-0.3.0/examples/hello_agent/agents/hello/nodes.py +0 -15
  146. agentomatic-0.3.0/examples/hello_agent/main.py +0 -28
  147. agentomatic-0.3.0/mkdocs.yml +0 -103
  148. agentomatic-0.3.0/src/__init__.py +0 -3
  149. agentomatic-0.3.0/src/agentomatic/middleware/__init__.py +0 -18
  150. agentomatic-0.3.0/src/agentomatic/ui/.chainlit/config.toml +0 -14
  151. agentomatic-0.3.0/src/agents/__init__.py +0 -1
  152. agentomatic-0.3.0/src/agents/alpha/__init__.py +0 -5
  153. agentomatic-0.3.0/src/agents/alpha/agent.py +0 -140
  154. agentomatic-0.3.0/src/agents/alpha/api.py +0 -67
  155. agentomatic-0.3.0/src/agents/alpha/config.py +0 -15
  156. agentomatic-0.3.0/src/agents/alpha/prompts.json +0 -14
  157. agentomatic-0.3.0/src/agents/alpha/schemas.py +0 -36
  158. agentomatic-0.3.0/src/agents/alpha/state.py +0 -22
  159. agentomatic-0.3.0/src/agents/beta/__init__.py +0 -5
  160. agentomatic-0.3.0/src/agents/beta/agent.py +0 -208
  161. agentomatic-0.3.0/src/agents/beta/api.py +0 -72
  162. agentomatic-0.3.0/src/agents/beta/config.py +0 -16
  163. agentomatic-0.3.0/src/agents/beta/prompts.json +0 -14
  164. agentomatic-0.3.0/src/agents/beta/schemas.py +0 -57
  165. agentomatic-0.3.0/src/agents/beta/state.py +0 -22
  166. agentomatic-0.3.0/src/app/__init__.py +0 -1
  167. agentomatic-0.3.0/src/app/api.py +0 -505
  168. agentomatic-0.3.0/src/app/dependencies.py +0 -189
  169. agentomatic-0.3.0/src/app/main.py +0 -230
  170. agentomatic-0.3.0/src/app/settings.py +0 -60
  171. agentomatic-0.3.0/src/common/__init__.py +0 -1
  172. agentomatic-0.3.0/src/common/agent_state.py +0 -24
  173. agentomatic-0.3.0/src/common/api_decorators.py +0 -177
  174. agentomatic-0.3.0/src/common/base_agent.py +0 -128
  175. agentomatic-0.3.0/src/common/llm_factory.py +0 -280
  176. agentomatic-0.3.0/src/common/prompt_manager.py +0 -78
  177. agentomatic-0.3.0/src/common/utilities.py +0 -131
  178. agentomatic-0.3.0/uv.lock +0 -6511
  179. {agentomatic-0.3.0 → agentomatic-0.5.0}/LICENSE +0 -0
  180. {agentomatic-0.3.0 → agentomatic-0.5.0}/examples/full_agent/README.md +0 -0
  181. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/cli/__init__.py +0 -0
  182. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/config/__init__.py +0 -0
  183. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/config/defaults.py +0 -0
  184. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/config/settings.py +0 -0
  185. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/core/__init__.py +0 -0
  186. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/middleware/auth.py +0 -0
  187. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/middleware/logging.py +0 -0
  188. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/middleware/metrics.py +0 -0
  189. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/middleware/rate_limit.py +0 -0
  190. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/observability/__init__.py +0 -0
  191. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/observability/concurrency.py +0 -0
  192. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/observability/metrics.py +0 -0
  193. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/observability/telemetry.py +0 -0
  194. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/dataset.py +0 -0
  195. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/loop.py +0 -0
  196. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/runner.py +0 -0
  197. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/strategies.py +0 -0
  198. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/optimize/synthesizer.py +0 -0
  199. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/prompts/__init__.py +0 -0
  200. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/prompts/manager.py +0 -0
  201. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/protocols/__init__.py +0 -0
  202. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/protocols/decorators.py +0 -0
  203. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/providers/__init__.py +0 -0
  204. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/providers/embeddings.py +0 -0
  205. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/providers/llm.py +0 -0
  206. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/py.typed +0 -0
  207. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/__init__.py +0 -0
  208. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/base.py +0 -0
  209. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/checkpointer.py +0 -0
  210. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/memory.py +0 -0
  211. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/models.py +0 -0
  212. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/storage/sqlalchemy.py +0 -0
  213. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/ui/__init__.py +0 -0
  214. {agentomatic-0.3.0 → agentomatic-0.5.0}/src/agentomatic/ui/chat.py +0 -0
  215. {agentomatic-0.3.0 → agentomatic-0.5.0}/tests/test_cli.py +0 -0
  216. {agentomatic-0.3.0 → agentomatic-0.5.0}/tests/test_integration.py +0 -0
  217. {agentomatic-0.3.0 → agentomatic-0.5.0}/tests/test_optimize.py +0 -0
  218. {agentomatic-0.3.0 → agentomatic-0.5.0}/tests/test_platform_features.py +0 -0
@@ -0,0 +1,636 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentomatic
3
+ Version: 0.5.0
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
+ [![CI](https://github.com/UnicoLab/agentomatic/actions/workflows/ci.yml/badge.svg)](https://github.com/UnicoLab/agentomatic/actions/workflows/ci.yml)
117
+ [![PyPI](https://img.shields.io/pypi/v/agentomatic.svg)](https://pypi.org/project/agentomatic/)
118
+ [![Python](https://img.shields.io/pypi/pyversions/agentomatic.svg)](https://pypi.org/project/agentomatic/)
119
+ [![License](https://img.shields.io/github/license/UnicoLab/agentomatic.svg)](https://github.com/UnicoLab/agentomatic/blob/main/LICENSE)
120
+ [![Docs](https://img.shields.io/badge/docs-mkdocs-blue.svg)](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>