agentomatic 0.5.1__tar.gz → 0.7.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 (163) hide show
  1. {agentomatic-0.5.1 → agentomatic-0.7.0}/PKG-INFO +100 -7
  2. {agentomatic-0.5.1 → agentomatic-0.7.0}/README.md +88 -6
  3. {agentomatic-0.5.1 → agentomatic-0.7.0}/pyproject.toml +15 -3
  4. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/__init__.py +38 -0
  5. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/_version.py +1 -1
  6. agentomatic-0.7.0/src/agentomatic/agents/__init__.py +93 -0
  7. agentomatic-0.7.0/src/agentomatic/agents/base.py +737 -0
  8. agentomatic-0.7.0/src/agentomatic/agents/builder.py +232 -0
  9. agentomatic-0.7.0/src/agentomatic/agents/decorators.py +109 -0
  10. agentomatic-0.7.0/src/agentomatic/agents/graph.py +507 -0
  11. agentomatic-0.7.0/src/agentomatic/agents/metrics.py +202 -0
  12. agentomatic-0.7.0/src/agentomatic/agents/mixins/__init__.py +31 -0
  13. agentomatic-0.7.0/src/agentomatic/agents/mixins/dataset.py +74 -0
  14. agentomatic-0.7.0/src/agentomatic/agents/mixins/evaluation.py +150 -0
  15. agentomatic-0.7.0/src/agentomatic/agents/mixins/graph_execution.py +181 -0
  16. agentomatic-0.7.0/src/agentomatic/agents/mixins/observability.py +71 -0
  17. agentomatic-0.7.0/src/agentomatic/agents/mixins/optimization.py +131 -0
  18. agentomatic-0.7.0/src/agentomatic/agents/mixins/serialization.py +135 -0
  19. agentomatic-0.7.0/src/agentomatic/agents/optimizers.py +223 -0
  20. agentomatic-0.7.0/src/agentomatic/agents/types.py +399 -0
  21. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/cli/commands.py +533 -5
  22. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/cli/templates.py +268 -49
  23. agentomatic-0.7.0/src/agentomatic/config/__init__.py +19 -0
  24. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/config/settings.py +45 -0
  25. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/__init__.py +2 -0
  26. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/manifest.py +14 -0
  27. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/platform.py +167 -1
  28. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/registry.py +159 -2
  29. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/router_factory.py +22 -1
  30. agentomatic-0.7.0/src/agentomatic/core/schemas.py +95 -0
  31. agentomatic-0.7.0/src/agentomatic/delegation/__init__.py +12 -0
  32. agentomatic-0.7.0/src/agentomatic/delegation/handoff.py +180 -0
  33. agentomatic-0.7.0/src/agentomatic/delegation/swarm.py +265 -0
  34. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/config.py +32 -0
  35. agentomatic-0.7.0/src/agentomatic/optimize/context.py +276 -0
  36. agentomatic-0.7.0/src/agentomatic/optimize/dashboard.py +562 -0
  37. agentomatic-0.7.0/src/agentomatic/optimize/events.py +248 -0
  38. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/fitter.py +207 -7
  39. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/fitter_optimizers.py +195 -102
  40. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/loop.py +148 -25
  41. agentomatic-0.7.0/src/agentomatic/optimize/progress.py +642 -0
  42. agentomatic-0.7.0/src/agentomatic/pipelines/__init__.py +82 -0
  43. agentomatic-0.7.0/src/agentomatic/pipelines/builder.py +572 -0
  44. agentomatic-0.7.0/src/agentomatic/pipelines/context.py +228 -0
  45. agentomatic-0.7.0/src/agentomatic/pipelines/engine.py +432 -0
  46. agentomatic-0.7.0/src/agentomatic/pipelines/flow.py +585 -0
  47. agentomatic-0.7.0/src/agentomatic/pipelines/loader.py +488 -0
  48. agentomatic-0.7.0/src/agentomatic/pipelines/models.py +295 -0
  49. agentomatic-0.7.0/src/agentomatic/pipelines/router.py +198 -0
  50. agentomatic-0.7.0/src/agentomatic/pipelines/steps.py +484 -0
  51. agentomatic-0.7.0/src/agentomatic/plugins/__init__.py +7 -0
  52. agentomatic-0.7.0/src/agentomatic/plugins/ml.py +78 -0
  53. agentomatic-0.7.0/src/agentomatic/plugins/registry.py +107 -0
  54. agentomatic-0.7.0/src/agentomatic/plugins/router.py +80 -0
  55. agentomatic-0.7.0/src/agentomatic/prompts/manager.py +131 -0
  56. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/providers/__init__.py +4 -0
  57. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/providers/llm.py +88 -3
  58. agentomatic-0.7.0/src/agentomatic/security/__init__.py +14 -0
  59. agentomatic-0.7.0/src/agentomatic/security/jwt_auth.py +176 -0
  60. agentomatic-0.7.0/src/agentomatic/security/policy.py +114 -0
  61. agentomatic-0.7.0/src/agentomatic/security/zero_trust.py +213 -0
  62. agentomatic-0.7.0/src/agentomatic/stacks/__init__.py +7 -0
  63. agentomatic-0.7.0/src/agentomatic/stacks/defaults.py +154 -0
  64. agentomatic-0.7.0/src/agentomatic/stacks/manager.py +431 -0
  65. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/adapters/__init__.py +8 -1
  66. agentomatic-0.7.0/src/agentomatic/studio/adapters/graph_agent.py +163 -0
  67. agentomatic-0.7.0/tests/test_agent_dataset.py +296 -0
  68. agentomatic-0.7.0/tests/test_agent_graph.py +506 -0
  69. agentomatic-0.7.0/tests/test_agent_graph_stream.py +63 -0
  70. agentomatic-0.7.0/tests/test_agent_metrics.py +170 -0
  71. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_agentomatic.py +27 -36
  72. agentomatic-0.7.0/tests/test_base_graph_agent.py +626 -0
  73. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_cli.py +33 -33
  74. agentomatic-0.7.0/tests/test_delegation.py +381 -0
  75. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_fitter.py +3 -3
  76. agentomatic-0.7.0/tests/test_flow.py +472 -0
  77. agentomatic-0.7.0/tests/test_optimizer_dashboard.py +64 -0
  78. agentomatic-0.7.0/tests/test_optimizer_events.py +65 -0
  79. agentomatic-0.7.0/tests/test_optimizer_progress.py +59 -0
  80. agentomatic-0.7.0/tests/test_pipelines.py +1068 -0
  81. agentomatic-0.7.0/tests/test_plugins.py +76 -0
  82. agentomatic-0.7.0/tests/test_security.py +460 -0
  83. agentomatic-0.7.0/tests/test_stacks.py +380 -0
  84. agentomatic-0.7.0/tests/test_v06_core.py +538 -0
  85. agentomatic-0.5.1/src/agentomatic/config/__init__.py +0 -3
  86. agentomatic-0.5.1/src/agentomatic/prompts/manager.py +0 -59
  87. {agentomatic-0.5.1 → agentomatic-0.7.0}/LICENSE +0 -0
  88. {agentomatic-0.5.1 → agentomatic-0.7.0}/examples/full_agent/README.md +0 -0
  89. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/cli/__init__.py +0 -0
  90. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/config/defaults.py +0 -0
  91. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/lifespan.py +0 -0
  92. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/memory_manager.py +0 -0
  93. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/core/state.py +0 -0
  94. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/demo/__init__.py +0 -0
  95. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/demo/agent.py +0 -0
  96. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/demo/server.py +0 -0
  97. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/__init__.py +0 -0
  98. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/auth.py +0 -0
  99. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/feedback.py +0 -0
  100. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/logging.py +0 -0
  101. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/metrics.py +0 -0
  102. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/middleware/rate_limit.py +0 -0
  103. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/observability/__init__.py +0 -0
  104. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/observability/concurrency.py +0 -0
  105. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/observability/metrics.py +0 -0
  106. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/observability/telemetry.py +0 -0
  107. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/__init__.py +0 -0
  108. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/dataset.py +0 -0
  109. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/deployment.py +0 -0
  110. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/eval_contract.py +0 -0
  111. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/failure_analysis.py +0 -0
  112. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/judges.py +0 -0
  113. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/llm_caller.py +0 -0
  114. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/metrics.py +0 -0
  115. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/optimizer.py +0 -0
  116. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/report.py +0 -0
  117. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/runner.py +0 -0
  118. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/search_space.py +0 -0
  119. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/strategies.py +0 -0
  120. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/optimize/synthesizer.py +0 -0
  121. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/prompts/__init__.py +0 -0
  122. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/protocols/__init__.py +0 -0
  123. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/protocols/decorators.py +0 -0
  124. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/providers/embeddings.py +0 -0
  125. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/py.typed +0 -0
  126. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/__init__.py +0 -0
  127. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/base.py +0 -0
  128. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/checkpointer.py +0 -0
  129. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/memory.py +0 -0
  130. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/models.py +0 -0
  131. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/storage/sqlalchemy.py +0 -0
  132. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/__init__.py +0 -0
  133. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/adapter.py +0 -0
  134. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/adapters/generic.py +0 -0
  135. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/adapters/langchain.py +0 -0
  136. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/adapters/langgraph.py +0 -0
  137. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/decorators.py +0 -0
  138. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/graph_inspector.py +0 -0
  139. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/models.py +0 -0
  140. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/router.py +0 -0
  141. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/run_tracker.py +0 -0
  142. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/serve.py +0 -0
  143. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/asset-manifest.json +0 -0
  144. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/imgs/graph_view.png +0 -0
  145. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/imgs/logo.png +0 -0
  146. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/imgs/main_screen.png +0 -0
  147. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/imgs/main_screen_ok.png +0 -0
  148. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/index.html +0 -0
  149. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/manifest.json +0 -0
  150. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/static/css/main.8b3c42dd.css +0 -0
  151. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/static/css/main.8b3c42dd.css.map +0 -0
  152. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js +0 -0
  153. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js.LICENSE.txt +0 -0
  154. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/studio/static/static/js/main.cbb2a8ee.js.map +0 -0
  155. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/ui/__init__.py +0 -0
  156. {agentomatic-0.5.1 → agentomatic-0.7.0}/src/agentomatic/ui/chat.py +0 -0
  157. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_bugfixes_041.py +0 -0
  158. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_coverage_boost.py +0 -0
  159. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_deep_agent.py +0 -0
  160. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_integration.py +0 -0
  161. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_optimize.py +0 -0
  162. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_platform_features.py +0 -0
  163. {agentomatic-0.5.1 → agentomatic-0.7.0}/tests/test_studio.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentomatic
3
- Version: 0.5.1
3
+ Version: 0.7.0
4
4
  Summary: Drop agents, not code — zero-code multi-agent API platform framework
5
5
  Project-URL: Homepage, https://github.com/UnicoLab/agentomatic
6
6
  Project-URL: Documentation, https://unicolab.github.io/agentomatic
@@ -34,10 +34,12 @@ Requires-Dist: typing-extensions>=4.12
34
34
  Requires-Dist: uvicorn[standard]>=0.32
35
35
  Provides-Extra: all
36
36
  Requires-Dist: aiosqlite>=0.20; extra == 'all'
37
+ Requires-Dist: cryptography>=42.0; extra == 'all'
37
38
  Requires-Dist: deepeval>=2.0; extra == 'all'
38
39
  Requires-Dist: holysheet>=0.1; extra == 'all'
39
40
  Requires-Dist: langchain-core>=0.3; extra == 'all'
40
41
  Requires-Dist: langchain-ollama>=0.2; extra == 'all'
42
+ Requires-Dist: langgraph-swarm>=0.1; extra == 'all'
41
43
  Requires-Dist: langgraph>=0.4; extra == 'all'
42
44
  Requires-Dist: ollama>=0.4; extra == 'all'
43
45
  Requires-Dist: opentelemetry-api>=1.20; extra == 'all'
@@ -45,6 +47,8 @@ Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40; extra == 'all'
45
47
  Requires-Dist: opentelemetry-instrumentation-httpx>=0.40; extra == 'all'
46
48
  Requires-Dist: opentelemetry-sdk>=1.20; extra == 'all'
47
49
  Requires-Dist: prometheus-client>=0.21; extra == 'all'
50
+ Requires-Dist: pyjwt[crypto]>=2.8; extra == 'all'
51
+ Requires-Dist: python-dotenv>=1.0; extra == 'all'
48
52
  Requires-Dist: questionary>=2.0; extra == 'all'
49
53
  Requires-Dist: rich>=13.0; extra == 'all'
50
54
  Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == 'all'
@@ -74,6 +78,8 @@ Provides-Extra: docs
74
78
  Requires-Dist: mike>=2.1; extra == 'docs'
75
79
  Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
76
80
  Requires-Dist: pymdown-extensions>=10.0; extra == 'docs'
81
+ Provides-Extra: dotenv
82
+ Requires-Dist: python-dotenv>=1.0; extra == 'dotenv'
77
83
  Provides-Extra: langchain
78
84
  Requires-Dist: langchain-community>=0.3; extra == 'langchain'
79
85
  Requires-Dist: langchain-core>=0.3; extra == 'langchain'
@@ -91,7 +97,12 @@ Requires-Dist: langchain-openai>=0.3; extra == 'openai'
91
97
  Provides-Extra: optimize
92
98
  Requires-Dist: deepeval>=2.0; extra == 'optimize'
93
99
  Requires-Dist: holysheet>=0.1; extra == 'optimize'
100
+ Provides-Extra: security
101
+ Requires-Dist: cryptography>=42.0; extra == 'security'
102
+ Requires-Dist: pyjwt[crypto]>=2.8; extra == 'security'
94
103
  Provides-Extra: studio
104
+ Provides-Extra: swarm
105
+ Requires-Dist: langgraph-swarm>=0.1; extra == 'swarm'
95
106
  Provides-Extra: telemetry
96
107
  Requires-Dist: opentelemetry-api>=1.20; extra == 'telemetry'
97
108
  Requires-Dist: opentelemetry-instrumentation-fastapi>=0.40; extra == 'telemetry'
@@ -138,7 +149,8 @@ Build, trace, optimize, and time-travel debug production-ready AI agent APIs in
138
149
  | 🚀 **Rich API Surface** | Natively handles `invoke`, `stream`, `chat`, `A2A`, `health`, `config`, `threads`, `memory`, and `feedback`. |
139
150
  | 🗄️ **Pluggable Storage** | Use `MemoryStore`, `SQLAlchemy`, or plug in your own custom persistence layer. |
140
151
  | 🔐 **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`. |
152
+ | 📦 **Scaffolding Templates** | Jumpstart development with 9 templates: `basic`, `full`, `rag`, `chatbot`, `deepagent`, `custom`, `swarm`, `pipeline`, `class`. |
153
+ | 🧬 **Class-Based Agents** | Define agents as Python classes with ML lifecycle: `compile()` → `fit()` → `evaluate()` → `transform()`. |
142
154
  | 🤖 **A2A Protocol** | True Agent-to-Agent communication flows integrated out of the box. |
143
155
  | 🔌 **Framework Agnostic** | Fully supports LangGraph, LangChain, or raw Python execution logic. |
144
156
  | 🩺 **Beautiful CLI** | A rich terminal experience with commands like `doctor`, `inspect`, and `test`. |
@@ -216,13 +228,12 @@ curl -X POST http://localhost:8000/api/v1/my_agent/invoke \
216
228
 
217
229
  ## 📂 Agent Structure
218
230
 
219
- Only `__init__.py` is required. Everything else is optional overrides:
231
+ Only `agent.py` is required. Everything else is optional overrides:
220
232
 
221
233
  ```
222
234
  agents/my_agent/
223
- ├── __init__.py ← REQUIRED: manifest + node_fn
224
- ├── graph.py ← Optional: LangGraph StateGraph
225
- ├── nodes.py ← Optional: node functions
235
+ ├── __init__.py ← Optional: Python package init
236
+ ├── agent.py ← REQUIRED: Contains your BaseGraphAgent subclass
226
237
  ├── config.py ← Optional: Pydantic config
227
238
  ├── schemas.py ← Optional: custom request/response models
228
239
  ├── tools.py ← Optional: LangChain tools
@@ -245,7 +256,11 @@ agentomatic init my_agent --template <template>
245
256
  | `full` | 11 | All override files — config, schemas, api, tools |
246
257
  | `rag` | 9 | Retrieve → Generate pipeline |
247
258
  | `chatbot` | 8 | Conversational with memory |
259
+ | `deepagent` | 6 | Autonomous planning with sub-agents |
248
260
  | `custom` | 4 | Framework-agnostic — no LangGraph |
261
+ | `swarm` | 10+ | Multi-agent delegation and handoffs |
262
+ | `pipeline` | 2 | Multi-agent workflow composition (YAML) |
263
+ | `class` | 4 | **NEW** Python class with ML lifecycle |
249
264
 
250
265
  ## 🖥️ CLI
251
266
 
@@ -263,6 +278,54 @@ agentomatic init my_agent --template <template>
263
278
  doctor Environment health check
264
279
  optimize <name> Run prompt optimization
265
280
  ui Launch Chainlit debug UI standalone
281
+ pipeline Pipeline management commands
282
+ ```
283
+
284
+ ## 🧬 Class-Based Agents (NEW)
285
+
286
+ Define agents as Python classes with LangGraph-style graph wiring and ML lifecycle:
287
+
288
+ ```python
289
+ from dataclasses import dataclass, field
290
+ from agentomatic import BaseGraphAgent
291
+
292
+ @dataclass
293
+ class MyState:
294
+ query: str = ""
295
+ output: dict = field(default_factory=dict)
296
+
297
+ class MyAgent(BaseGraphAgent[MyState]):
298
+ agent_name = "my_agent"
299
+
300
+ def build_graph(self):
301
+ g = self.new_graph()
302
+ g.add_node("process", self.process)
303
+ g.add_node("format", self.format_out)
304
+ g.set_entry_point("process")
305
+ g.add_edge("process", "format")
306
+ g.set_finish_point("format")
307
+ return g.compile()
308
+
309
+ def process(self, state):
310
+ state.output = {"response": f"Hello! You asked: {state.query}"}
311
+ return state
312
+
313
+ def format_out(self, state):
314
+ return state
315
+
316
+ def input_to_state(self, data):
317
+ return MyState(query=data.get("query", ""))
318
+
319
+ def state_to_output(self, state):
320
+ return state.output
321
+
322
+ # ML-like workflow
323
+ agent = MyAgent()
324
+ result = agent.transform({"query": "Hello!"})
325
+ agent.compile(dataset, metrics)
326
+ agent.fit(dataset)
327
+ report = agent.evaluate(dataset.test, metrics)
328
+ agent.save("compiled/v1")
266
329
  ```
267
330
 
268
331
  ## 🎨 Agentomatic Studio
@@ -276,7 +339,7 @@ pip install "agentomatic[studio]"
276
339
  agentomatic run --studio
277
340
  ```
278
341
 
279
- The unified server will bind to `http://localhost:8000` and mount the studio at `http://localhost:8000/studio/ui/`.
342
+ The unified server will bind to `http://localhost:8000` and mount the studio at `http://localhost:8000/studio/ui/`.
280
343
 
281
344
  **Key Studio Features**:
282
345
  - **Live Node Streaming**: Watch Server-Sent Events (SSE) transition node activity dynamically.
@@ -284,6 +347,36 @@ The unified server will bind to `http://localhost:8000` and mount the studio at
284
347
  - **Time-Travel History**: Rewind to any state checkpoint and replay from historical forks.
285
348
  - **Live State Editing**: Mutate graph state payloads on the fly during a breakpoint pause.
286
349
 
350
+ ## 🧠 ML Model Plugins (NEW)
351
+
352
+ Agentomatic isn't just for LLMs. Wrap classical ML models (Scikit-Learn, PyTorch, PyMC) securely with auto-generated REST endpoints:
353
+
354
+ ```python
355
+ from agentomatic.plugins import BaseMLPlugin
356
+ from pydantic import BaseModel
357
+
358
+ class IrisInput(BaseModel):
359
+ sepal_length: float
360
+ sepal_width: float
361
+ petal_length: float
362
+ petal_width: float
363
+
364
+ class IrisPlugin(BaseMLPlugin[IrisInput, dict]):
365
+ async def load_model(self):
366
+ # Load sklearn model from disk
367
+ import joblib
368
+ self.model = joblib.load("iris_model.pkl")
369
+
370
+ async def predict(self, inputs: IrisInput) -> dict:
371
+ prediction = self.model.predict([[
372
+ inputs.sepal_length, inputs.sepal_width,
373
+ inputs.petal_length, inputs.petal_width
374
+ ]])
375
+ return {"species": prediction[0]}
376
+ ```
377
+
378
+ Place it in `plugins/` and Agentomatic auto-discovers it alongside your AI agents!
379
+
287
380
  ## ⚙️ Configuration
288
381
 
289
382
  ```python
@@ -33,7 +33,8 @@ Build, trace, optimize, and time-travel debug production-ready AI agent APIs in
33
33
  | 🚀 **Rich API Surface** | Natively handles `invoke`, `stream`, `chat`, `A2A`, `health`, `config`, `threads`, `memory`, and `feedback`. |
34
34
  | 🗄️ **Pluggable Storage** | Use `MemoryStore`, `SQLAlchemy`, or plug in your own custom persistence layer. |
35
35
  | 🔐 **Enterprise Middleware** | High-performance pipeline with JWT Auth, dynamic rate limiting, and Prometheus telemetry — all toggleable. |
36
- | 📦 **Scaffolding Templates** | Jumpstart development with 5 templates: `basic`, `full`, `rag`, `chatbot`, and `custom`. |
36
+ | 📦 **Scaffolding Templates** | Jumpstart development with 9 templates: `basic`, `full`, `rag`, `chatbot`, `deepagent`, `custom`, `swarm`, `pipeline`, `class`. |
37
+ | 🧬 **Class-Based Agents** | Define agents as Python classes with ML lifecycle: `compile()` → `fit()` → `evaluate()` → `transform()`. |
37
38
  | 🤖 **A2A Protocol** | True Agent-to-Agent communication flows integrated out of the box. |
38
39
  | 🔌 **Framework Agnostic** | Fully supports LangGraph, LangChain, or raw Python execution logic. |
39
40
  | 🩺 **Beautiful CLI** | A rich terminal experience with commands like `doctor`, `inspect`, and `test`. |
@@ -111,13 +112,12 @@ curl -X POST http://localhost:8000/api/v1/my_agent/invoke \
111
112
 
112
113
  ## 📂 Agent Structure
113
114
 
114
- Only `__init__.py` is required. Everything else is optional overrides:
115
+ Only `agent.py` is required. Everything else is optional overrides:
115
116
 
116
117
  ```
117
118
  agents/my_agent/
118
- ├── __init__.py ← REQUIRED: manifest + node_fn
119
- ├── graph.py ← Optional: LangGraph StateGraph
120
- ├── nodes.py ← Optional: node functions
119
+ ├── __init__.py ← Optional: Python package init
120
+ ├── agent.py ← REQUIRED: Contains your BaseGraphAgent subclass
121
121
  ├── config.py ← Optional: Pydantic config
122
122
  ├── schemas.py ← Optional: custom request/response models
123
123
  ├── tools.py ← Optional: LangChain tools
@@ -140,7 +140,11 @@ agentomatic init my_agent --template <template>
140
140
  | `full` | 11 | All override files — config, schemas, api, tools |
141
141
  | `rag` | 9 | Retrieve → Generate pipeline |
142
142
  | `chatbot` | 8 | Conversational with memory |
143
+ | `deepagent` | 6 | Autonomous planning with sub-agents |
143
144
  | `custom` | 4 | Framework-agnostic — no LangGraph |
145
+ | `swarm` | 10+ | Multi-agent delegation and handoffs |
146
+ | `pipeline` | 2 | Multi-agent workflow composition (YAML) |
147
+ | `class` | 4 | **NEW** Python class with ML lifecycle |
144
148
 
145
149
  ## 🖥️ CLI
146
150
 
@@ -158,6 +162,54 @@ agentomatic init my_agent --template <template>
158
162
  doctor Environment health check
159
163
  optimize <name> Run prompt optimization
160
164
  ui Launch Chainlit debug UI standalone
165
+ pipeline Pipeline management commands
166
+ ```
167
+
168
+ ## 🧬 Class-Based Agents (NEW)
169
+
170
+ Define agents as Python classes with LangGraph-style graph wiring and ML lifecycle:
171
+
172
+ ```python
173
+ from dataclasses import dataclass, field
174
+ from agentomatic import BaseGraphAgent
175
+
176
+ @dataclass
177
+ class MyState:
178
+ query: str = ""
179
+ output: dict = field(default_factory=dict)
180
+
181
+ class MyAgent(BaseGraphAgent[MyState]):
182
+ agent_name = "my_agent"
183
+
184
+ def build_graph(self):
185
+ g = self.new_graph()
186
+ g.add_node("process", self.process)
187
+ g.add_node("format", self.format_out)
188
+ g.set_entry_point("process")
189
+ g.add_edge("process", "format")
190
+ g.set_finish_point("format")
191
+ return g.compile()
192
+
193
+ def process(self, state):
194
+ state.output = {"response": f"Hello! You asked: {state.query}"}
195
+ return state
196
+
197
+ def format_out(self, state):
198
+ return state
199
+
200
+ def input_to_state(self, data):
201
+ return MyState(query=data.get("query", ""))
202
+
203
+ def state_to_output(self, state):
204
+ return state.output
205
+
206
+ # ML-like workflow
207
+ agent = MyAgent()
208
+ result = agent.transform({"query": "Hello!"})
209
+ agent.compile(dataset, metrics)
210
+ agent.fit(dataset)
211
+ report = agent.evaluate(dataset.test, metrics)
212
+ agent.save("compiled/v1")
161
213
  ```
162
214
 
163
215
  ## 🎨 Agentomatic Studio
@@ -171,7 +223,7 @@ pip install "agentomatic[studio]"
171
223
  agentomatic run --studio
172
224
  ```
173
225
 
174
- The unified server will bind to `http://localhost:8000` and mount the studio at `http://localhost:8000/studio/ui/`.
226
+ The unified server will bind to `http://localhost:8000` and mount the studio at `http://localhost:8000/studio/ui/`.
175
227
 
176
228
  **Key Studio Features**:
177
229
  - **Live Node Streaming**: Watch Server-Sent Events (SSE) transition node activity dynamically.
@@ -179,6 +231,36 @@ The unified server will bind to `http://localhost:8000` and mount the studio at
179
231
  - **Time-Travel History**: Rewind to any state checkpoint and replay from historical forks.
180
232
  - **Live State Editing**: Mutate graph state payloads on the fly during a breakpoint pause.
181
233
 
234
+ ## 🧠 ML Model Plugins (NEW)
235
+
236
+ Agentomatic isn't just for LLMs. Wrap classical ML models (Scikit-Learn, PyTorch, PyMC) securely with auto-generated REST endpoints:
237
+
238
+ ```python
239
+ from agentomatic.plugins import BaseMLPlugin
240
+ from pydantic import BaseModel
241
+
242
+ class IrisInput(BaseModel):
243
+ sepal_length: float
244
+ sepal_width: float
245
+ petal_length: float
246
+ petal_width: float
247
+
248
+ class IrisPlugin(BaseMLPlugin[IrisInput, dict]):
249
+ async def load_model(self):
250
+ # Load sklearn model from disk
251
+ import joblib
252
+ self.model = joblib.load("iris_model.pkl")
253
+
254
+ async def predict(self, inputs: IrisInput) -> dict:
255
+ prediction = self.model.predict([[
256
+ inputs.sepal_length, inputs.sepal_width,
257
+ inputs.petal_length, inputs.petal_width
258
+ ]])
259
+ return {"species": prediction[0]}
260
+ ```
261
+
262
+ Place it in `plugins/` and Agentomatic auto-discovers it alongside your AI agents!
263
+
182
264
  ## ⚙️ Configuration
183
265
 
184
266
  ```python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentomatic"
3
- version = "0.5.1"
3
+ version = "0.7.0"
4
4
  description = "Drop agents, not code — zero-code multi-agent API platform framework"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -52,7 +52,10 @@ telemetry = [
52
52
  "opentelemetry-instrumentation-fastapi>=0.40",
53
53
  "opentelemetry-instrumentation-httpx>=0.40",
54
54
  ]
55
- all = ["agentomatic[langgraph,ollama,metrics,db,cli,studio,optimize,telemetry]"]
55
+ dotenv = ["python-dotenv>=1.0"]
56
+ security = ["pyjwt[crypto]>=2.8", "cryptography>=42.0"]
57
+ swarm = ["langgraph-swarm>=0.1"]
58
+ all = ["agentomatic[langgraph,ollama,metrics,db,cli,studio,optimize,telemetry,dotenv,security,swarm]"]
56
59
  docs = [
57
60
  "mkdocs-material>=9.5",
58
61
  "mike>=2.1",
@@ -85,6 +88,8 @@ Changelog = "https://github.com/UnicoLab/agentomatic/blob/main/CHANGELOG.md"
85
88
 
86
89
 
87
90
 
91
+
92
+
88
93
  [dependency-groups]
89
94
  dev = [
90
95
  "pytest>=8",
@@ -97,6 +102,8 @@ dev = [
97
102
  "build>=1.0",
98
103
  "twine>=6.0",
99
104
  "python-semantic-release>=9.0",
105
+ "mike>=2.2.0",
106
+ "mkdocs-material>=9.7.6",
100
107
  ]
101
108
  docs = [
102
109
  "mkdocs-material>=9.5",
@@ -189,12 +196,18 @@ exclude_lines = [
189
196
  # ---------------------------------------------------------------------------
190
197
  [tool.mypy]
191
198
  python_version = "3.11"
199
+ plugins = ["pydantic.mypy"]
192
200
  warn_return_any = false
193
201
  warn_unused_configs = true
194
202
  check_untyped_defs = true
195
203
  explicit_package_bases = true
196
204
  mypy_path = "src"
197
205
 
206
+ [tool.pydantic-mypy]
207
+ init_forbid_extra = true
208
+ init_typed = true
209
+ warn_required_dynamic_aliases = true
210
+
198
211
  # Pydantic models with Field(default=...) trigger false call-arg errors
199
212
  [[tool.mypy.overrides]]
200
213
  module = [
@@ -206,4 +219,3 @@ module = [
206
219
  "agentomatic.optimize.*",
207
220
  ]
208
221
  disable_error_code = ["call-arg", "override", "misc", "attr-defined"]
209
-
@@ -24,6 +24,13 @@ With storage::
24
24
  enable_auth=True,
25
25
  auth_api_key="secret",
26
26
  )
27
+
28
+ With stacks (v0.6)::
29
+
30
+ from agentomatic import AgentPlatform
31
+
32
+ platform = AgentPlatform.from_folder("agents/", stack="local")
33
+ app = platform.build()
27
34
  """
28
35
 
29
36
  from __future__ import annotations
@@ -36,6 +43,7 @@ from agentomatic.core.manifest import AgentManifest, RegisteredAgent
36
43
  from agentomatic.core.memory_manager import ConversationMemoryManager
37
44
  from agentomatic.core.platform import AgentPlatform
38
45
  from agentomatic.core.registry import AgentRegistry
46
+ from agentomatic.core.schemas import SchemaValidator
39
47
  from agentomatic.core.state import BaseAgentState
40
48
  from agentomatic.prompts import PromptManager
41
49
 
@@ -45,6 +53,24 @@ from agentomatic.protocols.decorators import APIResponse, handle_api_errors, log
45
53
  # Studio
46
54
  from agentomatic.studio import GraphInspector, RunTracker
47
55
 
56
+ # Pipelines (lazy — avoids hard failure if yaml not installed)
57
+ try:
58
+ from agentomatic.pipelines import Pipeline, PipelineConfig, PipelineResult
59
+ except ImportError:
60
+ Pipeline = None # type: ignore[assignment,misc]
61
+ PipelineConfig = None # type: ignore[assignment,misc]
62
+ PipelineResult = None # type: ignore[assignment,misc]
63
+
64
+ # Class-owned graph agents (v0.7)
65
+ from agentomatic.agents import (
66
+ AgentDataset,
67
+ AgentExample,
68
+ AgentGraph,
69
+ BaseGraphAgent,
70
+ GraphBuilder,
71
+ agent_node,
72
+ )
73
+
48
74
  __all__ = [
49
75
  # Core
50
76
  "AgentPlatform",
@@ -53,6 +79,7 @@ __all__ = [
53
79
  "AgentRegistry",
54
80
  "BaseAgentState",
55
81
  "ConversationMemoryManager",
82
+ "SchemaValidator",
56
83
  # Protocols
57
84
  "APIResponse",
58
85
  "handle_api_errors",
@@ -62,6 +89,17 @@ __all__ = [
62
89
  # Studio
63
90
  "GraphInspector",
64
91
  "RunTracker",
92
+ # Pipelines
93
+ "Pipeline",
94
+ "PipelineConfig",
95
+ "PipelineResult",
96
+ # Class-owned graph agents (v0.7)
97
+ "BaseGraphAgent",
98
+ "AgentGraph",
99
+ "GraphBuilder",
100
+ "agent_node",
101
+ "AgentDataset",
102
+ "AgentExample",
65
103
  # Version
66
104
  "__version__",
67
105
  ]
@@ -2,4 +2,4 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "0.5.1"
5
+ __version__ = "0.7.0"
@@ -0,0 +1,93 @@
1
+ """Class-owned graph agents — ML-like lifecycle for GenAI agents.
2
+
3
+ Define agents as Python classes with LangGraph-style graph wiring::
4
+
5
+ from dataclasses import dataclass
6
+ from agentomatic.agents import BaseGraphAgent
7
+
8
+ @dataclass
9
+ class MyState:
10
+ query: str = ""
11
+ response: str = ""
12
+
13
+ class MyAgent(BaseGraphAgent[MyState]):
14
+ agent_name = "my_agent"
15
+
16
+ def __init__(self, *, llm=None):
17
+ super().__init__()
18
+ self.llm = llm
19
+
20
+ def build_graph(self):
21
+ g = self.new_graph()
22
+ g.add_node("process", self.process)
23
+ g.set_entry_point("process")
24
+ g.set_finish_point("process")
25
+ return g.compile()
26
+
27
+ def process(self, state):
28
+ state.response = "hello"
29
+ return state
30
+
31
+ def input_to_state(self, data):
32
+ return MyState(query=data.get("query", ""))
33
+
34
+ def state_to_output(self, state):
35
+ return {"response": state.response}
36
+
37
+ # ML-like workflow
38
+ agent = MyAgent(llm=my_llm)
39
+ result = agent.transform({"query": "hello"})
40
+ """
41
+
42
+ from __future__ import annotations
43
+
44
+ from agentomatic.agents.base import BaseGraphAgent
45
+ from agentomatic.agents.builder import GraphBuilder
46
+ from agentomatic.agents.decorators import agent_node
47
+ from agentomatic.agents.graph import AgentGraph, GraphNode
48
+ from agentomatic.agents.metrics import (
49
+ CallableMetric,
50
+ ContainsTermsMetric,
51
+ ExactKeyMatchMetric,
52
+ OptimizeMetricAdapter,
53
+ )
54
+ from agentomatic.agents.optimizers import (
55
+ GridSearchOptimizer,
56
+ NoOpOptimizer,
57
+ PromptFitterBridge,
58
+ )
59
+ from agentomatic.agents.types import (
60
+ AgentDataset,
61
+ AgentExample,
62
+ EvaluationReport,
63
+ ExampleResult,
64
+ Metric,
65
+ Optimizer,
66
+ TraceEvent,
67
+ )
68
+
69
+ __all__ = [
70
+ # Core
71
+ "BaseGraphAgent",
72
+ "AgentGraph",
73
+ "GraphNode",
74
+ "GraphBuilder",
75
+ "agent_node",
76
+ # Types
77
+ "AgentDataset",
78
+ "AgentExample",
79
+ "EvaluationReport",
80
+ "ExampleResult",
81
+ "Metric",
82
+ "Optimizer",
83
+ "TraceEvent",
84
+ # Metrics
85
+ "ExactKeyMatchMetric",
86
+ "ContainsTermsMetric",
87
+ "CallableMetric",
88
+ "OptimizeMetricAdapter",
89
+ # Optimizers
90
+ "NoOpOptimizer",
91
+ "GridSearchOptimizer",
92
+ "PromptFitterBridge",
93
+ ]