flock-core 0.5.0b27__py3-none-any.whl → 0.5.0b50__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 (357) 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.0b50.dist-info/METADATA +747 -0
  162. flock_core-0.5.0b50.dist-info/RECORD +398 -0
  163. flock_core-0.5.0b50.dist-info/entry_points.txt +2 -0
  164. {flock_core-0.5.0b27.dist-info → flock_core-0.5.0b50.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 -15
  197. flock/components/utility/memory_utility_component.py +0 -550
  198. flock/components/utility/metrics_utility_component.py +0 -700
  199. flock/config.py +0 -61
  200. flock/core/__init__.py +0 -110
  201. flock/core/agent/__init__.py +0 -16
  202. flock/core/agent/default_agent.py +0 -180
  203. flock/core/agent/flock_agent_components.py +0 -104
  204. flock/core/agent/flock_agent_execution.py +0 -101
  205. flock/core/agent/flock_agent_integration.py +0 -260
  206. flock/core/agent/flock_agent_lifecycle.py +0 -186
  207. flock/core/agent/flock_agent_serialization.py +0 -381
  208. flock/core/api/__init__.py +0 -10
  209. flock/core/api/custom_endpoint.py +0 -45
  210. flock/core/api/endpoints.py +0 -254
  211. flock/core/api/main.py +0 -162
  212. flock/core/api/models.py +0 -97
  213. flock/core/api/run_store.py +0 -224
  214. flock/core/api/runner.py +0 -44
  215. flock/core/api/service.py +0 -214
  216. flock/core/component/__init__.py +0 -15
  217. flock/core/component/agent_component_base.py +0 -309
  218. flock/core/component/evaluation_component.py +0 -62
  219. flock/core/component/routing_component.py +0 -74
  220. flock/core/component/utility_component.py +0 -69
  221. flock/core/config/flock_agent_config.py +0 -58
  222. flock/core/config/scheduled_agent_config.py +0 -40
  223. flock/core/context/context.py +0 -213
  224. flock/core/context/context_manager.py +0 -37
  225. flock/core/context/context_vars.py +0 -10
  226. flock/core/evaluation/utils.py +0 -396
  227. flock/core/execution/batch_executor.py +0 -369
  228. flock/core/execution/evaluation_executor.py +0 -438
  229. flock/core/execution/local_executor.py +0 -31
  230. flock/core/execution/opik_executor.py +0 -103
  231. flock/core/execution/temporal_executor.py +0 -164
  232. flock/core/flock.py +0 -634
  233. flock/core/flock_agent.py +0 -336
  234. flock/core/flock_factory.py +0 -551
  235. flock/core/flock_scheduler.py +0 -166
  236. flock/core/flock_server_manager.py +0 -136
  237. flock/core/interpreter/python_interpreter.py +0 -689
  238. flock/core/mcp/__init__.py +0 -1
  239. flock/core/mcp/flock_mcp_server.py +0 -680
  240. flock/core/mcp/mcp_client_manager.py +0 -201
  241. flock/core/mcp/types/__init__.py +0 -1
  242. flock/core/mixin/dspy_integration.py +0 -403
  243. flock/core/mixin/prompt_parser.py +0 -125
  244. flock/core/orchestration/__init__.py +0 -15
  245. flock/core/orchestration/flock_batch_processor.py +0 -94
  246. flock/core/orchestration/flock_evaluator.py +0 -113
  247. flock/core/orchestration/flock_execution.py +0 -295
  248. flock/core/orchestration/flock_initialization.py +0 -149
  249. flock/core/orchestration/flock_server_manager.py +0 -67
  250. flock/core/orchestration/flock_web_server.py +0 -117
  251. flock/core/registry/__init__.py +0 -45
  252. flock/core/registry/agent_registry.py +0 -69
  253. flock/core/registry/callable_registry.py +0 -139
  254. flock/core/registry/component_discovery.py +0 -142
  255. flock/core/registry/component_registry.py +0 -64
  256. flock/core/registry/config_mapping.py +0 -64
  257. flock/core/registry/decorators.py +0 -137
  258. flock/core/registry/registry_hub.py +0 -205
  259. flock/core/registry/server_registry.py +0 -57
  260. flock/core/registry/type_registry.py +0 -86
  261. flock/core/serialization/__init__.py +0 -13
  262. flock/core/serialization/callable_registry.py +0 -52
  263. flock/core/serialization/flock_serializer.py +0 -832
  264. flock/core/serialization/json_encoder.py +0 -41
  265. flock/core/serialization/secure_serializer.py +0 -175
  266. flock/core/serialization/serializable.py +0 -342
  267. flock/core/serialization/serialization_utils.py +0 -412
  268. flock/core/util/file_path_utils.py +0 -223
  269. flock/core/util/hydrator.py +0 -309
  270. flock/core/util/input_resolver.py +0 -164
  271. flock/core/util/loader.py +0 -59
  272. flock/core/util/splitter.py +0 -219
  273. flock/di.py +0 -27
  274. flock/platform/docker_tools.py +0 -49
  275. flock/platform/jaeger_install.py +0 -86
  276. flock/webapp/__init__.py +0 -1
  277. flock/webapp/app/__init__.py +0 -0
  278. flock/webapp/app/api/__init__.py +0 -0
  279. flock/webapp/app/api/agent_management.py +0 -241
  280. flock/webapp/app/api/execution.py +0 -709
  281. flock/webapp/app/api/flock_management.py +0 -129
  282. flock/webapp/app/api/registry_viewer.py +0 -30
  283. flock/webapp/app/chat.py +0 -665
  284. flock/webapp/app/config.py +0 -104
  285. flock/webapp/app/dependencies.py +0 -117
  286. flock/webapp/app/main.py +0 -1070
  287. flock/webapp/app/middleware.py +0 -113
  288. flock/webapp/app/models_ui.py +0 -7
  289. flock/webapp/app/services/__init__.py +0 -0
  290. flock/webapp/app/services/feedback_file_service.py +0 -363
  291. flock/webapp/app/services/flock_service.py +0 -337
  292. flock/webapp/app/services/sharing_models.py +0 -81
  293. flock/webapp/app/services/sharing_store.py +0 -598
  294. flock/webapp/app/templates/theme_mapper.html +0 -326
  295. flock/webapp/app/theme_mapper.py +0 -812
  296. flock/webapp/app/utils.py +0 -85
  297. flock/webapp/run.py +0 -215
  298. flock/webapp/static/css/chat.css +0 -301
  299. flock/webapp/static/css/components.css +0 -167
  300. flock/webapp/static/css/header.css +0 -39
  301. flock/webapp/static/css/layout.css +0 -46
  302. flock/webapp/static/css/sidebar.css +0 -127
  303. flock/webapp/static/css/two-pane.css +0 -48
  304. flock/webapp/templates/base.html +0 -200
  305. flock/webapp/templates/chat.html +0 -152
  306. flock/webapp/templates/chat_settings.html +0 -19
  307. flock/webapp/templates/flock_editor.html +0 -16
  308. flock/webapp/templates/index.html +0 -12
  309. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  310. flock/webapp/templates/partials/_agent_list.html +0 -18
  311. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  312. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  313. flock/webapp/templates/partials/_chat_container.html +0 -15
  314. flock/webapp/templates/partials/_chat_messages.html +0 -57
  315. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  316. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  317. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  318. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  319. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  320. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  321. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  322. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  323. flock/webapp/templates/partials/_execution_form.html +0 -118
  324. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  325. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  326. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  327. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  328. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  329. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  330. flock/webapp/templates/partials/_registry_table.html +0 -25
  331. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  332. flock/webapp/templates/partials/_results_display.html +0 -78
  333. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  334. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  335. flock/webapp/templates/partials/_settings_view.html +0 -36
  336. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  337. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  338. flock/webapp/templates/partials/_sidebar.html +0 -74
  339. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  340. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  341. flock/webapp/templates/partials/_theme_preview.html +0 -36
  342. flock/webapp/templates/registry_viewer.html +0 -84
  343. flock/webapp/templates/shared_run_page.html +0 -140
  344. flock/workflow/__init__.py +0 -0
  345. flock/workflow/activities.py +0 -196
  346. flock/workflow/agent_activities.py +0 -24
  347. flock/workflow/agent_execution_activity.py +0 -202
  348. flock/workflow/flock_workflow.py +0 -214
  349. flock/workflow/temporal_config.py +0 -96
  350. flock/workflow/temporal_setup.py +0 -68
  351. flock_core-0.5.0b27.dist-info/METADATA +0 -274
  352. flock_core-0.5.0b27.dist-info/RECORD +0 -559
  353. flock_core-0.5.0b27.dist-info/entry_points.txt +0 -2
  354. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  355. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  356. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  357. {flock_core-0.5.0b27.dist-info → flock_core-0.5.0b50.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")