flock-core 0.5.0b28__py3-none-any.whl → 0.5.56b0__py3-none-any.whl

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.

Potentially problematic release.


This version of flock-core might be problematic. Click here for more details.

Files changed (359) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +678 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +79 -0
  5. flock/cli.py +75 -0
  6. flock/components.py +173 -0
  7. flock/dashboard/__init__.py +28 -0
  8. flock/dashboard/collector.py +283 -0
  9. flock/dashboard/events.py +182 -0
  10. flock/dashboard/launcher.py +230 -0
  11. flock/dashboard/service.py +537 -0
  12. flock/dashboard/websocket.py +235 -0
  13. flock/engines/__init__.py +6 -0
  14. flock/engines/dspy_engine.py +856 -0
  15. flock/examples.py +128 -0
  16. flock/{core/util → helper}/cli_helper.py +4 -3
  17. flock/{core/logging → logging}/__init__.py +2 -3
  18. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  19. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  20. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
  21. flock/{core/logging → logging}/logging.py +77 -61
  22. flock/{core/logging → logging}/telemetry.py +20 -26
  23. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  24. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
  25. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  26. flock/{core/logging → logging}/trace_and_logged.py +20 -24
  27. flock/mcp/__init__.py +91 -0
  28. flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
  29. flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
  30. flock/mcp/manager.py +255 -0
  31. flock/mcp/servers/sse/__init__.py +1 -1
  32. flock/mcp/servers/sse/flock_sse_server.py +11 -53
  33. flock/mcp/servers/stdio/__init__.py +1 -1
  34. flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
  35. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
  36. flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
  37. flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
  38. flock/mcp/types/__init__.py +42 -0
  39. flock/{core/mcp → mcp}/types/callbacks.py +9 -15
  40. flock/{core/mcp → mcp}/types/factories.py +7 -6
  41. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  42. flock/{core/mcp → mcp}/types/types.py +70 -74
  43. flock/{core/mcp → mcp}/util/helpers.py +1 -1
  44. flock/orchestrator.py +645 -0
  45. flock/registry.py +148 -0
  46. flock/runtime.py +262 -0
  47. flock/service.py +140 -0
  48. flock/store.py +69 -0
  49. flock/subscription.py +111 -0
  50. flock/themes/andromeda.toml +1 -1
  51. flock/themes/apple-system-colors.toml +1 -1
  52. flock/themes/arcoiris.toml +1 -1
  53. flock/themes/atomonelight.toml +1 -1
  54. flock/themes/ayu copy.toml +1 -1
  55. flock/themes/ayu-light.toml +1 -1
  56. flock/themes/belafonte-day.toml +1 -1
  57. flock/themes/belafonte-night.toml +1 -1
  58. flock/themes/blulocodark.toml +1 -1
  59. flock/themes/breeze.toml +1 -1
  60. flock/themes/broadcast.toml +1 -1
  61. flock/themes/brogrammer.toml +1 -1
  62. flock/themes/builtin-dark.toml +1 -1
  63. flock/themes/builtin-pastel-dark.toml +1 -1
  64. flock/themes/catppuccin-latte.toml +1 -1
  65. flock/themes/catppuccin-macchiato.toml +1 -1
  66. flock/themes/catppuccin-mocha.toml +1 -1
  67. flock/themes/cga.toml +1 -1
  68. flock/themes/chalk.toml +1 -1
  69. flock/themes/ciapre.toml +1 -1
  70. flock/themes/coffee-theme.toml +1 -1
  71. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  72. flock/themes/dark+.toml +1 -1
  73. flock/themes/darkermatrix.toml +1 -1
  74. flock/themes/darkside.toml +1 -1
  75. flock/themes/desert.toml +1 -1
  76. flock/themes/django.toml +1 -1
  77. flock/themes/djangosmooth.toml +1 -1
  78. flock/themes/doomone.toml +1 -1
  79. flock/themes/dotgov.toml +1 -1
  80. flock/themes/dracula+.toml +1 -1
  81. flock/themes/duckbones.toml +1 -1
  82. flock/themes/encom.toml +1 -1
  83. flock/themes/espresso.toml +1 -1
  84. flock/themes/everblush.toml +1 -1
  85. flock/themes/fairyfloss.toml +1 -1
  86. flock/themes/fideloper.toml +1 -1
  87. flock/themes/fishtank.toml +1 -1
  88. flock/themes/flexoki-light.toml +1 -1
  89. flock/themes/floraverse.toml +1 -1
  90. flock/themes/framer.toml +1 -1
  91. flock/themes/galizur.toml +1 -1
  92. flock/themes/github.toml +1 -1
  93. flock/themes/grass.toml +1 -1
  94. flock/themes/grey-green.toml +1 -1
  95. flock/themes/gruvboxlight.toml +1 -1
  96. flock/themes/guezwhoz.toml +1 -1
  97. flock/themes/harper.toml +1 -1
  98. flock/themes/hax0r-blue.toml +1 -1
  99. flock/themes/hopscotch.256.toml +1 -1
  100. flock/themes/ic-green-ppl.toml +1 -1
  101. flock/themes/iceberg-dark.toml +1 -1
  102. flock/themes/japanesque.toml +1 -1
  103. flock/themes/jubi.toml +1 -1
  104. flock/themes/kibble.toml +1 -1
  105. flock/themes/kolorit.toml +1 -1
  106. flock/themes/kurokula.toml +1 -1
  107. flock/themes/materialdesigncolors.toml +1 -1
  108. flock/themes/matrix.toml +1 -1
  109. flock/themes/mellifluous.toml +1 -1
  110. flock/themes/midnight-in-mojave.toml +1 -1
  111. flock/themes/monokai-remastered.toml +1 -1
  112. flock/themes/monokai-soda.toml +1 -1
  113. flock/themes/neon.toml +1 -1
  114. flock/themes/neopolitan.toml +1 -1
  115. flock/themes/nord-light.toml +1 -1
  116. flock/themes/ocean.toml +1 -1
  117. flock/themes/onehalfdark.toml +1 -1
  118. flock/themes/onehalflight.toml +1 -1
  119. flock/themes/palenighthc.toml +1 -1
  120. flock/themes/paulmillr.toml +1 -1
  121. flock/themes/pencildark.toml +1 -1
  122. flock/themes/pnevma.toml +1 -1
  123. flock/themes/purple-rain.toml +1 -1
  124. flock/themes/purplepeter.toml +1 -1
  125. flock/themes/raycast-dark.toml +1 -1
  126. flock/themes/red-sands.toml +1 -1
  127. flock/themes/relaxed.toml +1 -1
  128. flock/themes/retro.toml +1 -1
  129. flock/themes/rose-pine.toml +1 -1
  130. flock/themes/royal.toml +1 -1
  131. flock/themes/ryuuko.toml +1 -1
  132. flock/themes/sakura.toml +1 -1
  133. flock/themes/scarlet-protocol.toml +1 -1
  134. flock/themes/seoulbones-dark.toml +1 -1
  135. flock/themes/shades-of-purple.toml +1 -1
  136. flock/themes/smyck.toml +1 -1
  137. flock/themes/softserver.toml +1 -1
  138. flock/themes/solarized-darcula.toml +1 -1
  139. flock/themes/square.toml +1 -1
  140. flock/themes/sugarplum.toml +1 -1
  141. flock/themes/thayer-bright.toml +1 -1
  142. flock/themes/tokyonight.toml +1 -1
  143. flock/themes/tomorrow.toml +1 -1
  144. flock/themes/ubuntu.toml +1 -1
  145. flock/themes/ultradark.toml +1 -1
  146. flock/themes/ultraviolent.toml +1 -1
  147. flock/themes/unikitty.toml +1 -1
  148. flock/themes/urple.toml +1 -1
  149. flock/themes/vesper.toml +1 -1
  150. flock/themes/vimbones.toml +1 -1
  151. flock/themes/wildcherry.toml +1 -1
  152. flock/themes/wilmersdorf.toml +1 -1
  153. flock/themes/wryan.toml +1 -1
  154. flock/themes/xcodedarkhc.toml +1 -1
  155. flock/themes/xcodelight.toml +1 -1
  156. flock/themes/zenbones-light.toml +1 -1
  157. flock/themes/zenwritten-dark.toml +1 -1
  158. flock/utilities.py +301 -0
  159. flock/{components/utility → utility}/output_utility_component.py +68 -53
  160. flock/visibility.py +107 -0
  161. flock_core-0.5.56b0.dist-info/METADATA +747 -0
  162. flock_core-0.5.56b0.dist-info/RECORD +398 -0
  163. flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
  164. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/licenses/LICENSE +1 -1
  165. flock/adapter/__init__.py +0 -14
  166. flock/adapter/azure_adapter.py +0 -68
  167. flock/adapter/chroma_adapter.py +0 -73
  168. flock/adapter/faiss_adapter.py +0 -97
  169. flock/adapter/pinecone_adapter.py +0 -51
  170. flock/adapter/vector_base.py +0 -47
  171. flock/cli/assets/release_notes.md +0 -140
  172. flock/cli/config.py +0 -8
  173. flock/cli/constants.py +0 -36
  174. flock/cli/create_agent.py +0 -1
  175. flock/cli/create_flock.py +0 -280
  176. flock/cli/execute_flock.py +0 -620
  177. flock/cli/load_agent.py +0 -1
  178. flock/cli/load_examples.py +0 -1
  179. flock/cli/load_flock.py +0 -192
  180. flock/cli/load_release_notes.py +0 -20
  181. flock/cli/loaded_flock_cli.py +0 -254
  182. flock/cli/manage_agents.py +0 -459
  183. flock/cli/registry_management.py +0 -889
  184. flock/cli/runner.py +0 -41
  185. flock/cli/settings.py +0 -857
  186. flock/cli/utils.py +0 -135
  187. flock/cli/view_results.py +0 -29
  188. flock/cli/yaml_editor.py +0 -396
  189. flock/components/__init__.py +0 -30
  190. flock/components/evaluation/__init__.py +0 -9
  191. flock/components/evaluation/declarative_evaluation_component.py +0 -606
  192. flock/components/routing/__init__.py +0 -15
  193. flock/components/routing/conditional_routing_component.py +0 -494
  194. flock/components/routing/default_routing_component.py +0 -103
  195. flock/components/routing/llm_routing_component.py +0 -206
  196. flock/components/utility/__init__.py +0 -22
  197. flock/components/utility/example_utility_component.py +0 -250
  198. flock/components/utility/feedback_utility_component.py +0 -206
  199. flock/components/utility/memory_utility_component.py +0 -550
  200. flock/components/utility/metrics_utility_component.py +0 -700
  201. flock/config.py +0 -61
  202. flock/core/__init__.py +0 -110
  203. flock/core/agent/__init__.py +0 -16
  204. flock/core/agent/default_agent.py +0 -216
  205. flock/core/agent/flock_agent_components.py +0 -104
  206. flock/core/agent/flock_agent_execution.py +0 -101
  207. flock/core/agent/flock_agent_integration.py +0 -260
  208. flock/core/agent/flock_agent_lifecycle.py +0 -186
  209. flock/core/agent/flock_agent_serialization.py +0 -381
  210. flock/core/api/__init__.py +0 -10
  211. flock/core/api/custom_endpoint.py +0 -45
  212. flock/core/api/endpoints.py +0 -254
  213. flock/core/api/main.py +0 -162
  214. flock/core/api/models.py +0 -97
  215. flock/core/api/run_store.py +0 -224
  216. flock/core/api/runner.py +0 -44
  217. flock/core/api/service.py +0 -214
  218. flock/core/component/__init__.py +0 -15
  219. flock/core/component/agent_component_base.py +0 -309
  220. flock/core/component/evaluation_component.py +0 -62
  221. flock/core/component/routing_component.py +0 -74
  222. flock/core/component/utility_component.py +0 -69
  223. flock/core/config/flock_agent_config.py +0 -58
  224. flock/core/config/scheduled_agent_config.py +0 -40
  225. flock/core/context/context.py +0 -213
  226. flock/core/context/context_manager.py +0 -37
  227. flock/core/context/context_vars.py +0 -10
  228. flock/core/evaluation/utils.py +0 -396
  229. flock/core/execution/batch_executor.py +0 -369
  230. flock/core/execution/evaluation_executor.py +0 -438
  231. flock/core/execution/local_executor.py +0 -31
  232. flock/core/execution/opik_executor.py +0 -103
  233. flock/core/execution/temporal_executor.py +0 -164
  234. flock/core/flock.py +0 -634
  235. flock/core/flock_agent.py +0 -336
  236. flock/core/flock_factory.py +0 -613
  237. flock/core/flock_scheduler.py +0 -166
  238. flock/core/flock_server_manager.py +0 -136
  239. flock/core/interpreter/python_interpreter.py +0 -689
  240. flock/core/mcp/__init__.py +0 -1
  241. flock/core/mcp/flock_mcp_server.py +0 -680
  242. flock/core/mcp/mcp_client_manager.py +0 -201
  243. flock/core/mcp/types/__init__.py +0 -1
  244. flock/core/mixin/dspy_integration.py +0 -403
  245. flock/core/mixin/prompt_parser.py +0 -125
  246. flock/core/orchestration/__init__.py +0 -15
  247. flock/core/orchestration/flock_batch_processor.py +0 -94
  248. flock/core/orchestration/flock_evaluator.py +0 -113
  249. flock/core/orchestration/flock_execution.py +0 -295
  250. flock/core/orchestration/flock_initialization.py +0 -149
  251. flock/core/orchestration/flock_server_manager.py +0 -67
  252. flock/core/orchestration/flock_web_server.py +0 -117
  253. flock/core/registry/__init__.py +0 -45
  254. flock/core/registry/agent_registry.py +0 -69
  255. flock/core/registry/callable_registry.py +0 -139
  256. flock/core/registry/component_discovery.py +0 -142
  257. flock/core/registry/component_registry.py +0 -64
  258. flock/core/registry/config_mapping.py +0 -64
  259. flock/core/registry/decorators.py +0 -137
  260. flock/core/registry/registry_hub.py +0 -205
  261. flock/core/registry/server_registry.py +0 -57
  262. flock/core/registry/type_registry.py +0 -86
  263. flock/core/serialization/__init__.py +0 -13
  264. flock/core/serialization/callable_registry.py +0 -52
  265. flock/core/serialization/flock_serializer.py +0 -832
  266. flock/core/serialization/json_encoder.py +0 -41
  267. flock/core/serialization/secure_serializer.py +0 -175
  268. flock/core/serialization/serializable.py +0 -342
  269. flock/core/serialization/serialization_utils.py +0 -412
  270. flock/core/util/file_path_utils.py +0 -223
  271. flock/core/util/hydrator.py +0 -309
  272. flock/core/util/input_resolver.py +0 -164
  273. flock/core/util/loader.py +0 -59
  274. flock/core/util/splitter.py +0 -219
  275. flock/di.py +0 -27
  276. flock/platform/docker_tools.py +0 -49
  277. flock/platform/jaeger_install.py +0 -86
  278. flock/webapp/__init__.py +0 -1
  279. flock/webapp/app/__init__.py +0 -0
  280. flock/webapp/app/api/__init__.py +0 -0
  281. flock/webapp/app/api/agent_management.py +0 -241
  282. flock/webapp/app/api/execution.py +0 -709
  283. flock/webapp/app/api/flock_management.py +0 -129
  284. flock/webapp/app/api/registry_viewer.py +0 -30
  285. flock/webapp/app/chat.py +0 -665
  286. flock/webapp/app/config.py +0 -104
  287. flock/webapp/app/dependencies.py +0 -117
  288. flock/webapp/app/main.py +0 -1070
  289. flock/webapp/app/middleware.py +0 -113
  290. flock/webapp/app/models_ui.py +0 -7
  291. flock/webapp/app/services/__init__.py +0 -0
  292. flock/webapp/app/services/feedback_file_service.py +0 -363
  293. flock/webapp/app/services/flock_service.py +0 -337
  294. flock/webapp/app/services/sharing_models.py +0 -81
  295. flock/webapp/app/services/sharing_store.py +0 -762
  296. flock/webapp/app/templates/theme_mapper.html +0 -326
  297. flock/webapp/app/theme_mapper.py +0 -812
  298. flock/webapp/app/utils.py +0 -85
  299. flock/webapp/run.py +0 -215
  300. flock/webapp/static/css/chat.css +0 -301
  301. flock/webapp/static/css/components.css +0 -167
  302. flock/webapp/static/css/header.css +0 -39
  303. flock/webapp/static/css/layout.css +0 -46
  304. flock/webapp/static/css/sidebar.css +0 -127
  305. flock/webapp/static/css/two-pane.css +0 -48
  306. flock/webapp/templates/base.html +0 -200
  307. flock/webapp/templates/chat.html +0 -152
  308. flock/webapp/templates/chat_settings.html +0 -19
  309. flock/webapp/templates/flock_editor.html +0 -16
  310. flock/webapp/templates/index.html +0 -12
  311. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  312. flock/webapp/templates/partials/_agent_list.html +0 -18
  313. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  314. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  315. flock/webapp/templates/partials/_chat_container.html +0 -15
  316. flock/webapp/templates/partials/_chat_messages.html +0 -57
  317. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  318. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  319. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  320. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  321. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  322. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  323. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  324. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  325. flock/webapp/templates/partials/_execution_form.html +0 -118
  326. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  327. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  328. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  329. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  330. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  331. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  332. flock/webapp/templates/partials/_registry_table.html +0 -25
  333. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  334. flock/webapp/templates/partials/_results_display.html +0 -78
  335. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  336. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  337. flock/webapp/templates/partials/_settings_view.html +0 -36
  338. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  339. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  340. flock/webapp/templates/partials/_sidebar.html +0 -74
  341. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  342. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  343. flock/webapp/templates/partials/_theme_preview.html +0 -36
  344. flock/webapp/templates/registry_viewer.html +0 -84
  345. flock/webapp/templates/shared_run_page.html +0 -140
  346. flock/workflow/__init__.py +0 -0
  347. flock/workflow/activities.py +0 -196
  348. flock/workflow/agent_activities.py +0 -24
  349. flock/workflow/agent_execution_activity.py +0 -202
  350. flock/workflow/flock_workflow.py +0 -214
  351. flock/workflow/temporal_config.py +0 -96
  352. flock/workflow/temporal_setup.py +0 -68
  353. flock_core-0.5.0b28.dist-info/METADATA +0 -274
  354. flock_core-0.5.0b28.dist-info/RECORD +0 -561
  355. flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
  356. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  357. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  358. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  359. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
@@ -1,309 +0,0 @@
1
- # src/flock/core/component/agent_component_base.py
2
- """Base classes for the unified Flock component system."""
3
-
4
- from abc import ABC
5
- from typing import Any, TypeVar
6
-
7
- from pydantic import BaseModel, Field, create_model
8
-
9
- from flock.core.context.context import FlockContext
10
-
11
- # HandOffRequest removed - using agent.next_agent directly
12
-
13
- T = TypeVar("T", bound="AgentComponentConfig")
14
-
15
-
16
- class AgentComponentConfig(BaseModel):
17
- """Base configuration class for all Flock agent components.
18
-
19
- This unified config class replaces FlockModuleConfig, FlockEvaluatorConfig,
20
- and FlockRouterConfig, providing common functionality for all component types.
21
- """
22
-
23
- enabled: bool = Field(
24
- default=True,
25
- description="Whether this component is currently enabled"
26
- )
27
-
28
- model: str | None = Field(
29
- default=None,
30
- description="Model to use for this component (if applicable)"
31
- )
32
-
33
- @classmethod
34
- def with_fields(cls: type[T], **field_definitions) -> type[T]:
35
- """Create a new config class with additional fields.
36
-
37
- This allows dynamic config creation for components with custom configuration needs.
38
-
39
- Example:
40
- CustomConfig = AgentComponentConfig.with_fields(
41
- temperature=Field(default=0.7, description="LLM temperature"),
42
- max_tokens=Field(default=1000, description="Max tokens to generate")
43
- )
44
- """
45
- return create_model(
46
- f"Dynamic{cls.__name__}",
47
- __base__=cls,
48
- **field_definitions
49
- )
50
-
51
-
52
- class AgentComponent(BaseModel, ABC):
53
- """Base class for all Flock agent components.
54
-
55
- This unified base class replaces the separate FlockModule, FlockEvaluator,
56
- and FlockRouter base classes. All agent extensions now inherit from this
57
- single base class and use the unified lifecycle hooks.
58
-
59
- Components can specialize by:
60
- - EvaluationComponentBase: Implements evaluate_core() for agent intelligence
61
- - RoutingComponentBase: Implements determine_next_step() for workflow routing
62
- - UtilityComponentBase: Uses standard lifecycle hooks for cross-cutting concerns
63
- """
64
-
65
- name: str = Field(
66
- ...,
67
- description="Unique identifier for this component"
68
- )
69
-
70
- config: AgentComponentConfig = Field(
71
- default_factory=AgentComponentConfig,
72
- description="Component configuration"
73
- )
74
-
75
- def __init__(self, **data):
76
- super().__init__(**data)
77
-
78
- # --- Standard Lifecycle Hooks ---
79
- # These are called for ALL components during agent execution
80
-
81
- async def on_initialize(
82
- self,
83
- agent: Any,
84
- inputs: dict[str, Any],
85
- context: FlockContext | None = None,
86
- ) -> None:
87
- """Called when the agent starts running.
88
-
89
- Use this for component initialization, resource setup, etc.
90
- """
91
- pass
92
-
93
- async def on_pre_evaluate(
94
- self,
95
- agent: Any,
96
- inputs: dict[str, Any],
97
- context: FlockContext | None = None,
98
- ) -> dict[str, Any]:
99
- """Called before agent evaluation, can modify inputs.
100
-
101
- Args:
102
- agent: The agent being executed
103
- inputs: Current input data
104
- context: Execution context
105
-
106
- Returns:
107
- Modified input data (or original if no changes)
108
- """
109
- return inputs
110
-
111
- async def on_post_evaluate(
112
- self,
113
- agent: Any,
114
- inputs: dict[str, Any],
115
- context: FlockContext | None = None,
116
- result: dict[str, Any] | None = None,
117
- ) -> dict[str, Any] | None:
118
- """Called after agent evaluation, can modify results.
119
-
120
- Args:
121
- agent: The agent that was executed
122
- inputs: Original input data
123
- context: Execution context
124
- result: Evaluation result
125
-
126
- Returns:
127
- Modified result data (or original if no changes)
128
- """
129
- return result
130
-
131
- async def on_terminate(
132
- self,
133
- agent: Any,
134
- inputs: dict[str, Any],
135
- context: FlockContext | None = None,
136
- result: dict[str, Any] | None = None,
137
- ) -> dict[str, Any] | None:
138
- """Called when the agent finishes running.
139
-
140
- Use this for cleanup, final result processing, etc.
141
- """
142
- return result
143
-
144
- async def on_error(
145
- self,
146
- agent: Any,
147
- inputs: dict[str, Any],
148
- context: FlockContext | None = None,
149
- error: Exception | None = None,
150
- ) -> None:
151
- """Called when an error occurs during agent execution.
152
-
153
- Use this for error handling, logging, recovery, etc.
154
- """
155
- pass
156
-
157
- # --- Specialized Hooks ---
158
- # These are overridden by specialized component types
159
-
160
- async def evaluate_core(
161
- self,
162
- agent: Any,
163
- inputs: dict[str, Any],
164
- context: FlockContext | None = None,
165
- tools: list[Any] | None = None,
166
- mcp_tools: list[Any] | None = None,
167
- ) -> dict[str, Any]:
168
- """Core evaluation logic - override in EvaluationComponentBase.
169
-
170
- This is where the main "intelligence" of the agent happens.
171
- Only one component per agent should implement this meaningfully.
172
-
173
- Args:
174
- agent: The agent being executed
175
- inputs: Input data for evaluation
176
- context: Execution context
177
- tools: Available tools for the agent
178
- mcp_tools: Available MCP tools
179
-
180
- Returns:
181
- Evaluation result
182
- """
183
- # Default implementation is pass-through
184
- return inputs
185
-
186
- async def determine_next_step(
187
- self,
188
- agent: Any,
189
- result: dict[str, Any],
190
- context: FlockContext | None = None,
191
- ) -> None:
192
- """Determine the next step in the workflow - override in RoutingComponentBase.
193
-
194
- This is where routing decisions are made. Sets agent.next_agent directly.
195
-
196
- Args:
197
- agent: The agent that just completed
198
- result: Result from the agent's evaluation
199
- context: Execution context
200
-
201
- Returns:
202
- None - routing components set agent.next_agent directly
203
- """
204
- # Default implementation provides no routing
205
- pass
206
-
207
- # --- MCP Server Lifecycle Hooks ---
208
- # For components that interact directly with MCP servers
209
-
210
- async def on_pre_server_init(self, server: Any) -> None:
211
- """Called before a server initializes."""
212
- pass
213
-
214
- async def on_post_server_init(self, server: Any) -> None:
215
- """Called after a server initializes."""
216
- pass
217
-
218
- async def on_pre_server_terminate(self, server: Any) -> None:
219
- """Called before a server terminates."""
220
- pass
221
-
222
- async def on_post_server_terminate(self, server: Any) -> None:
223
- """Called after a server terminates."""
224
- pass
225
-
226
- async def on_server_error(self, server: Any, error: Exception) -> None:
227
- """Called when a server errors."""
228
- pass
229
-
230
- async def on_connect(
231
- self,
232
- server: Any,
233
- additional_params: dict[str, Any],
234
- ) -> dict[str, Any]:
235
- """Called before a connection is being established to a mcp server.
236
-
237
- use `server` (type FlockMCPServer) to modify the core behavior of the server.
238
- use `additional_params` to 'tack_on' additional configurations (for example additional headers for sse-clients.)
239
-
240
- (For example: modify the server's config)
241
- new_config = NewConfigObject(...)
242
- server.config = new_config
243
-
244
- Warning:
245
- Be very careful when modifying a server's internal state.
246
- If you just need to 'tack on' additional information (such as headers)
247
- or want to temporarily override certain configurations (such as timeouts)
248
- use `additional_params` instead if you can.
249
-
250
- (Or pass additional values downstream:)
251
- additional_params["headers"] = { "Authorization": "Bearer 123" }
252
- additional_params["read_timeout_seconds"] = 100
253
-
254
-
255
- Note:
256
- `additional_params` resets between mcp_calls.
257
- so there is not persistence between individual calls.
258
- This choice has been made to allow developers to
259
- dynamically switch configurations.
260
- (This can be used, for example, to use a module to inject oauth headers for
261
- individual users on a call-to-call basis. this also gives you direct control over
262
- managing the headers yourself. For example, checking for lifetimes on JWT-Tokens.)
263
-
264
- Note:
265
- you can access `additional_params` when you are implementing your own subclasses of
266
- FlockMCPClientManager and FlockMCPClient. (with self.additional_params.)
267
-
268
- keys which are processed for `additional_params` in the flock core code are:
269
- --- General ---
270
-
271
- "refresh_client": bool -> defaults to False. Indicates whether or not to restart a connection on a call. (can be used when headers oder api-keys change to automatically switch to a new client.)
272
- "read_timeout_seconds": float -> How long to wait for a connection to happen.
273
-
274
- --- SSE ---
275
-
276
- "override_headers": bool -> default False. If set to false, additional headers will be appended, if set to True, additional headers will override existing ones.
277
- "headers": dict[str, Any] -> Additional Headers injected in sse-clients and ws-clients
278
- "sse_read_timeout_seconds": float -> how long until a connection is being terminated for sse-clients.
279
- "url": str -> which url the server listens on (allows switching between mcp-servers with modules.)
280
-
281
- --- Stdio ---
282
-
283
- "command": str -> Command to run for stdio-servers.
284
- "args": list[str] -> additional paramters for stdio-servers.
285
- "env": dict[str, Any] -> Environment-Variables for stdio-servers.
286
- "encoding": str -> Encoding to use when talking to stdio-servers.
287
- "encoding-error-handler": str -> Encoding error handler to use when talking to stdio-servers.
288
-
289
- --- Websockets ---
290
-
291
- "url": str -> Which url the server listens on (allows switching between mcp-servers with modules.)
292
- """
293
- pass
294
-
295
- async def on_pre_mcp_call(
296
- self,
297
- server: Any,
298
- arguments: Any | None = None,
299
- ) -> None:
300
- """Called before any MCP Calls."""
301
- pass
302
-
303
- async def on_post_mcp_call(
304
- self,
305
- server: Any,
306
- result: Any | None = None,
307
- ) -> None:
308
- """Called after any MCP Calls."""
309
- pass
@@ -1,62 +0,0 @@
1
- # src/flock/core/component/evaluation_component_base.py
2
- """Base class for evaluation components in the unified component system."""
3
-
4
- from abc import abstractmethod
5
- from typing import Any
6
-
7
- from flock.core.context.context import FlockContext
8
-
9
- from .agent_component_base import AgentComponent
10
-
11
-
12
- class EvaluationComponent(AgentComponent):
13
- """Base class for evaluation components.
14
-
15
- Evaluation components implement the core intelligence/logic of an agent.
16
- They are responsible for taking inputs and producing outputs using some
17
- evaluation strategy (e.g., DSPy, direct LLM calls, deterministic logic).
18
-
19
- Each agent should have exactly one primary evaluation component.
20
-
21
- Example implementations:
22
- - DeclarativeEvaluationComponent (DSPy-based)
23
- - ScriptEvaluationComponent (Python script-based)
24
- - LLMEvaluationComponent (direct LLM API)
25
- """
26
-
27
- @abstractmethod
28
- def set_model(self, model: str, temperature: float = 0.0, max_tokens: int = 4096) -> None:
29
- """Set the model for the evaluation component."""
30
- pass
31
-
32
-
33
- @abstractmethod
34
- async def evaluate_core(
35
- self,
36
- agent: Any,
37
- inputs: dict[str, Any],
38
- context: FlockContext | None = None,
39
- tools: list[Any] | None = None,
40
- mcp_tools: list[Any] | None = None,
41
- ) -> dict[str, Any]:
42
- """Core evaluation logic - MUST be implemented by concrete classes.
43
-
44
- This is the heart of the agent's intelligence. It takes the processed
45
- inputs (after all on_pre_evaluate hooks) and produces the agent's output.
46
-
47
- Args:
48
- agent: The agent being executed
49
- inputs: Input data for evaluation (after pre-processing)
50
- context: Execution context with variables, history, etc.
51
- tools: Available callable tools for the agent
52
- mcp_tools: Available MCP server tools
53
-
54
- Returns:
55
- Evaluation result as a dictionary
56
-
57
- Raises:
58
- NotImplementedError: Must be implemented by concrete classes
59
- """
60
- raise NotImplementedError(
61
- f"{self.__class__.__name__} must implement evaluate_core()"
62
- )
@@ -1,74 +0,0 @@
1
- # src/flock/core/component/routing_component_base.py
2
- """Base class for routing components in the unified component system."""
3
-
4
- from abc import abstractmethod
5
- from typing import Any
6
-
7
- from flock.core.context.context import FlockContext
8
-
9
- from .agent_component_base import AgentComponent
10
-
11
-
12
- class RoutingComponent(AgentComponent):
13
- """Base class for routing components.
14
-
15
- Routing components determine the next step in a workflow based on the
16
- current agent's output. They implement workflow orchestration logic
17
- and can enable complex multi-agent patterns.
18
-
19
- Each agent should have at most one routing component. If no routing
20
- component is present, the workflow ends after this agent.
21
-
22
- Example implementations:
23
- - ConditionalRoutingModule (rule-based routing)
24
- - LLMRoutingModule (AI-powered routing decisions)
25
- - DefaultRoutingModule (simple next-agent routing)
26
- - ListGeneratorRoutingModule (dynamic agent creation)
27
- """
28
-
29
- @abstractmethod
30
- async def determine_next_step(
31
- self,
32
- agent: Any,
33
- result: dict[str, Any],
34
- context: FlockContext | None = None,
35
- ) -> str | Any | None:
36
- """Determine the next agent in the workflow - MUST be implemented.
37
-
38
- This method analyzes the agent's result and determines what agent
39
- should execute next. The result will be stored in agent.next_agent
40
- for the orchestrator to process.
41
-
42
- Args:
43
- agent: The agent that just completed execution
44
- result: Result from the agent's evaluation (after post-processing)
45
- context: Execution context with workflow state
46
-
47
- Returns:
48
- String (agent name), FlockAgent instance, or None to end workflow
49
-
50
- Raises:
51
- NotImplementedError: Must be implemented by concrete classes
52
- """
53
- raise NotImplementedError(
54
- f"{self.__class__.__name__} must implement determine_next_step()"
55
- )
56
-
57
- async def evaluate_core(
58
- self,
59
- agent: Any,
60
- inputs: dict[str, Any],
61
- context: FlockContext | None = None,
62
- tools: list[Any] | None = None,
63
- mcp_tools: list[Any] | None = None,
64
- ) -> dict[str, Any]:
65
- """Routing components typically don't modify evaluation - pass through.
66
-
67
- Routing components usually don't implement core evaluation logic,
68
- they focus on workflow decisions. This default implementation
69
- passes inputs through unchanged.
70
-
71
- Override this if your routing component also needs to modify
72
- the evaluation process.
73
- """
74
- return inputs
@@ -1,69 +0,0 @@
1
- # src/flock/core/component/utility_component_base.py
2
- """Base class for utility components in the unified component system."""
3
-
4
- from typing import Any
5
-
6
- from flock.core.context.context import FlockContext
7
-
8
- # HandOffRequest removed - using agent.next_agent directly
9
- from .agent_component_base import AgentComponent
10
-
11
-
12
- class UtilityComponent(AgentComponent):
13
- """Base class for utility/enhancement components.
14
-
15
- Utility components add cross-cutting concerns to agents without being
16
- the primary evaluation or routing logic. They typically use the standard
17
- lifecycle hooks to enhance agent behavior.
18
-
19
- These components focus on concerns like:
20
- - Memory management
21
- - Output formatting
22
- - Metrics collection
23
- - Logging and tracing
24
- - Input validation
25
- - Error handling
26
- - Caching
27
- - Rate limiting
28
-
29
- Example implementations:
30
- - MemoryUtilityModule (memory persistence)
31
- - OutputUtilityModule (result formatting)
32
- - MetricsUtilityModule (performance tracking)
33
- - AssertionUtilityModule (result validation)
34
- """
35
-
36
- async def evaluate_core(
37
- self,
38
- agent: Any,
39
- inputs: dict[str, Any],
40
- context: FlockContext | None = None,
41
- tools: list[Any] | None = None,
42
- mcp_tools: list[Any] | None = None,
43
- ) -> dict[str, Any]:
44
- """Utility components typically don't implement core evaluation.
45
-
46
- This default implementation passes inputs through unchanged.
47
- Utility components usually enhance behavior through the standard
48
- lifecycle hooks (on_pre_evaluate, on_post_evaluate, etc.).
49
-
50
- Override this only if your utility component needs to participate
51
- in the core evaluation process.
52
- """
53
- return inputs
54
-
55
- async def determine_next_step(
56
- self,
57
- agent: Any,
58
- result: dict[str, Any],
59
- context: FlockContext | None = None,
60
- ) -> None:
61
- """Utility components typically don't implement routing logic.
62
-
63
- This default implementation does nothing, as utility components
64
- usually enhance behavior through other lifecycle hooks.
65
-
66
- Override this only if your utility component needs to influence
67
- workflow routing decisions by setting agent.next_agent.
68
- """
69
- pass
@@ -1,58 +0,0 @@
1
- """Configuration settings for FlockAgent."""
2
-
3
- from typing import Literal
4
-
5
- from pydantic import BaseModel, Field
6
-
7
-
8
- class FlockAgentConfig(BaseModel):
9
- """FlockAgentConfig is a class that holds the configuration for a Flock agent.
10
-
11
- It is used to store various settings and parameters that can be accessed throughout the agent's lifecycle.
12
- """
13
-
14
- write_to_file: bool = Field(
15
- default=False,
16
- description="Write the agent's output to a file.",
17
- )
18
- wait_for_input: bool = Field(
19
- default=False,
20
- description="Wait for user input after the agent's output is displayed.",
21
- )
22
-
23
- handoff_strategy: Literal["append", "override", "static", "map"] = Field(
24
- default="static",
25
- description="""Strategy for passing data to the next agent.
26
-
27
- example:
28
- ReviewAgent.next_agent = SummaryAgent
29
- ReviewAgent(output = "text:str, keywords:list[str], rating:int")
30
- SummaryAgent(input = "text:str, title:str")
31
-
32
- 'append' means the difference in signature is appended to the next agent's input signature.
33
- SummaryAgent(input = "text:str, title:str, keywords:list[str], rating:int")
34
-
35
- 'override' means the target agent's signature is getting overriden.
36
- SummaryAgent(input = "text:str, keywords:list[str], rating:int")
37
-
38
- 'static' means the the target agent's signature is not changed at all.
39
- If source agent has no output fields that match the target agent's input,
40
- there will be no data passed to the next agent.
41
- SummaryAgent(input = "text:str, title:str")
42
-
43
- 'map' means the source agent's output is mapped to the target agent's input
44
- based on 'handoff_map' configuration.
45
-
46
- """,
47
- )
48
-
49
- handoff_map: dict[str, str] | None = Field(
50
- default=None,
51
- description="""Mapping of source agent output fields to target agent input fields.
52
-
53
- Used with 'handoff_strategy' = 'map'.
54
- Example: {"text": "text", "keywords": "title"}
55
-
56
- If a field is not mapped, it will not be passed to the next agent.
57
- """,
58
- )
@@ -1,40 +0,0 @@
1
-
2
-
3
-
4
- from pydantic import Field
5
-
6
- from flock.core.config.flock_agent_config import FlockAgentConfig
7
-
8
-
9
- class ScheduledAgentConfig(FlockAgentConfig):
10
- """Configuration specific to agents that run on a schedule."""
11
- schedule_expression: str = Field(
12
- ...,
13
- description="Defines when the agent should run. "
14
- "Examples: 'every 60m', 'every 1h', 'daily at 02:00', '0 */2 * * *' (cron expression)"
15
- )
16
- enabled: bool = Field(
17
- True,
18
- description="Whether the scheduled agent is enabled. "
19
- "If False, the agent will not run even if the schedule expression is valid."
20
- )
21
- initial_run: bool = Field(
22
- False,
23
- description="If True, the agent will run immediately after being scheduled, "
24
- "regardless of the schedule expression."
25
- )
26
- max_runs: int = Field(
27
- 0,
28
- description="Maximum number of times the agent can run. "
29
- "0 means unlimited runs. If set, the agent will stop running after reaching this limit."
30
- )
31
-
32
- def __init__(self, **kwargs):
33
- super().__init__(**kwargs)
34
- # Ensure schedule_expression is always set
35
- if 'schedule_expression' not in kwargs:
36
- raise ValueError("schedule_expression is required for ScheduledAgentConfig")
37
-
38
- # Validate initial_run and max_runs
39
- if self.initial_run and self.max_runs > 0:
40
- raise ValueError("Cannot set initial_run to True if max_runs is greater than 0")