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
flock/core/flock.py DELETED
@@ -1,634 +0,0 @@
1
- # src/flock/core/flock.py
2
- """High-level orchestrator for managing and executing agents within the Flock framework."""
3
-
4
- from __future__ import annotations # Ensure forward references work
5
-
6
- import uuid
7
- from collections.abc import Callable, Sequence
8
- from pathlib import Path
9
- from typing import (
10
- TYPE_CHECKING,
11
- Any,
12
- Literal,
13
- TypeVar,
14
- )
15
-
16
- # Third-party imports
17
- from box import Box
18
- from temporalio import workflow
19
-
20
- from flock.core.mcp.flock_mcp_server import FlockMCPServer
21
-
22
- # Guard datasets import to avoid heavy side effects during tests (pyarrow extensions)
23
- from typing import Any as _Any
24
- try:
25
- with workflow.unsafe.imports_passed_through():
26
- from datasets import Dataset as _HF_Dataset # type: ignore
27
- Dataset = _HF_Dataset # type: ignore
28
- except Exception:
29
- Dataset = _Any # type: ignore
30
-
31
- from opentelemetry import trace
32
- from pandas import DataFrame # type: ignore
33
- from pydantic import BaseModel, Field
34
-
35
- # Flock core components & utilities
36
- from flock.config import DEFAULT_MODEL, TELEMETRY
37
- from flock.core.api.custom_endpoint import (
38
- FlockEndpoint, # Keep for type hinting custom_endpoints
39
- )
40
- from flock.core.context.context import FlockContext
41
- from flock.core.logging.logging import get_logger
42
- from flock.core.serialization.serializable import Serializable
43
- from flock.workflow.temporal_config import TemporalWorkflowConfig
44
-
45
- # Import FlockAgent using TYPE_CHECKING to avoid circular import at runtime
46
- if TYPE_CHECKING:
47
- # These imports are only for type hints
48
- from flock.core.flock_agent import FlockAgent
49
-
50
-
51
- # Registry
52
- from flock.core.registry import get_registry
53
-
54
- try:
55
- import pandas as pd # type: ignore
56
-
57
- PANDAS_AVAILABLE = True
58
- except ImportError:
59
- pd = None # type: ignore
60
- PANDAS_AVAILABLE = False
61
-
62
- logger = get_logger("flock.api")
63
- TELEMETRY.setup_tracing() # Setup OpenTelemetry
64
- tracer = trace.get_tracer(__name__)
65
- registry = get_registry() # Get the registry instance
66
-
67
- # Define TypeVar for generic class methods like from_dict
68
- T = TypeVar("T", bound="Flock")
69
- _R = TypeVar("_R")
70
-
71
-
72
- class Flock(BaseModel, Serializable):
73
- """Orchestrator for managing and executing agent systems.
74
-
75
- Manages agent definitions, context, and execution flow (local or Temporal).
76
- Relies on FlockSerializer for serialization/deserialization logic.
77
- Inherits from Pydantic BaseModel and Serializable.
78
- """
79
-
80
- name: str | None = Field(
81
- default_factory=lambda: f"flock_{uuid.uuid4().hex[:8]}",
82
- description="A unique identifier for this Flock instance.",
83
- )
84
- model: str | None = Field(
85
- default=DEFAULT_MODEL,
86
- description="Default model identifier for agents if not specified otherwise.",
87
- )
88
- description: str | None = Field(
89
- default=None,
90
- description="A brief description of the purpose of this Flock configuration.",
91
- )
92
- enable_temporal: bool = Field(
93
- default=False,
94
- description="If True, execute workflows via Temporal; otherwise, run locally.",
95
- )
96
- enable_opik: bool = Field(
97
- default=False,
98
- description="If True, enable Opik for cost tracking and model management.",
99
- )
100
- show_flock_banner: bool = Field(
101
- default=True,
102
- description="If True, show the Flock banner on console interactions.",
103
- )
104
- # --- Temporal Configuration (Optional) ---
105
- temporal_config: TemporalWorkflowConfig | None = Field(
106
- default=None,
107
- description="Optional Temporal settings specific to the workflow execution for this Flock.",
108
- )
109
- # --- Temporal Dev/Test Setting ---
110
- temporal_start_in_process_worker: bool = Field(
111
- default=True,
112
- description="If True (default) and enable_temporal=True, start a temporary in-process worker for development/testing convenience. Set to False when using dedicated workers.",
113
- )
114
-
115
- benchmark_agent_name: str | None = Field(
116
- default=None,
117
- description="The name of the agent to use for the benchmark.",
118
- )
119
- benchmark_eval_field: str | None = Field(
120
- default=None,
121
- description="The output field to use for the benchmark.",
122
- )
123
- benchmark_input_field: str | None = Field(
124
- default=None,
125
- description="The input field to use for the benchmark.",
126
- )
127
- # Internal agent storage - not part of the Pydantic model for direct serialization
128
- # Marked with underscore to indicate it's managed internally and accessed via property
129
- _agents: dict[str, FlockAgent]
130
- _start_agent_name: str | None = None # For potential pre-configuration
131
- _start_input: dict = {} # For potential pre-configuration
132
-
133
- # Internal server storage - not part of the Pydantic model for direct serialization
134
- _servers: dict[str, FlockMCPServer]
135
-
136
- # Note: _mgr is now handled by the server manager helper
137
-
138
- # Pydantic v2 model config
139
- model_config = {
140
- "arbitrary_types_allowed": True,
141
- # Assuming registry type might not be serializable by default
142
- "ignored_types": (type(registry),),
143
- }
144
-
145
- # --- COMPOSITION HELPERS (Lazy-Loaded) ---
146
- # Following the successful FlockAgent pattern
147
-
148
- @property
149
- def _execution(self):
150
- """Get the execution management helper (lazy-loaded)."""
151
- if not hasattr(self, '_execution_helper'):
152
- from flock.core.orchestration.flock_execution import FlockExecution
153
- self._execution_helper = FlockExecution(self)
154
- return self._execution_helper
155
-
156
- @property
157
- def _server_manager(self):
158
- """Get the server management helper (lazy-loaded)."""
159
- if not hasattr(self, '_server_manager_helper'):
160
- from flock.core.orchestration.flock_server_manager import (
161
- FlockServerManager,
162
- )
163
- self._server_manager_helper = FlockServerManager(self)
164
- return self._server_manager_helper
165
-
166
- @property
167
- def _batch_processor(self):
168
- """Get the batch processing helper (lazy-loaded)."""
169
- if not hasattr(self, '_batch_processor_helper'):
170
- from flock.core.orchestration.flock_batch_processor import (
171
- FlockBatchProcessor,
172
- )
173
- self._batch_processor_helper = FlockBatchProcessor(self)
174
- return self._batch_processor_helper
175
-
176
- @property
177
- def _evaluator(self):
178
- """Get the evaluation helper (lazy-loaded)."""
179
- if not hasattr(self, '_evaluator_helper'):
180
- from flock.core.orchestration.flock_evaluator import FlockEvaluator
181
- self._evaluator_helper = FlockEvaluator(self)
182
- return self._evaluator_helper
183
-
184
- @property
185
- def _web_server(self):
186
- """Get the web server helper (lazy-loaded)."""
187
- if not hasattr(self, '_web_server_helper'):
188
- from flock.core.orchestration.flock_web_server import FlockWebServer
189
- self._web_server_helper = FlockWebServer(self)
190
- return self._web_server_helper
191
-
192
- @property
193
- def _initialization(self):
194
- """Get the initialization helper (lazy-loaded)."""
195
- if not hasattr(self, '_initialization_helper'):
196
- from flock.core.orchestration.flock_initialization import (
197
- FlockInitialization,
198
- )
199
- self._initialization_helper = FlockInitialization(self)
200
- return self._initialization_helper
201
-
202
- @property
203
- def _mgr(self):
204
- """Get the internal server manager for compatibility."""
205
- return self._server_manager._internal_mgr
206
-
207
- def __init__(
208
- self,
209
- name: str | None = None,
210
- model: str | None = DEFAULT_MODEL,
211
- description: str | None = None,
212
- show_flock_banner: bool = True,
213
- enable_temporal: bool = False,
214
- enable_opik: bool = False,
215
- agents: list[FlockAgent] | None = None,
216
- servers: list[FlockMCPServer] | None = None,
217
- temporal_config: TemporalWorkflowConfig | None = None,
218
- temporal_start_in_process_worker: bool = True,
219
- **kwargs,
220
- ):
221
- """Initialize the Flock orchestrator."""
222
- # Use provided name or generate default BEFORE super init if needed elsewhere
223
- effective_name = name or f"flock_{uuid.uuid4().hex[:8]}"
224
-
225
- # Initialize Pydantic fields
226
- super().__init__(
227
- name=effective_name,
228
- model=model,
229
- description=description,
230
- enable_temporal=enable_temporal,
231
- enable_opik=enable_opik,
232
- show_flock_banner=show_flock_banner,
233
- temporal_config=temporal_config,
234
- temporal_start_in_process_worker=temporal_start_in_process_worker,
235
- **kwargs,
236
- )
237
-
238
- # Initialize runtime attributes AFTER super().__init__()
239
- self._agents = {}
240
- self._servers = {}
241
- self._start_agent_name = None
242
- self._start_input = {}
243
- # Note: _mgr will be handled by the server manager helper
244
-
245
- # Delegate complex initialization to the initialization helper
246
- self._initialization.setup(agents=agents, servers=servers)
247
-
248
- def prepare_benchmark(
249
- self,
250
- agent: FlockAgent | str | None = None,
251
- input_field: str | None = None,
252
- eval_field: str | None = None,
253
- ):
254
- """Prepare a benchmark for the Flock instance."""
255
- from flock.core.flock_agent import FlockAgent as ConcreteFlockAgent
256
-
257
- logger.info(
258
- f"Preparing benchmark for Flock instance '{self.name}' with agent '{agent}'."
259
- )
260
-
261
- name = agent.name if isinstance(agent, ConcreteFlockAgent) else agent
262
-
263
- if self._agents.get(name) is None:
264
- raise ValueError(
265
- f"Agent '{name}' not found in Flock instance '{self.name}'."
266
- )
267
-
268
- self.benchmark_agent_name = name
269
- self.benchmark_eval_field = eval_field
270
- self.benchmark_input_field = input_field
271
-
272
- def inspect(self):
273
- """Inspect the Flock instance."""
274
- logger.info(
275
- f"Inspecting Flock instance '{self.name}' with start agent '{self.benchmark_agent_name}' and input '{input}'."
276
- )
277
-
278
- async def run(input: dict[str, Any]) -> dict[str, Any]:
279
- """Inspect the Flock instance."""
280
- logger.info(
281
- f"Inspecting Flock instance '{self.name}' with start agent '{self.benchmark_agent_name}' and input '{input}'."
282
- )
283
- msg_content = input.get("messages")[0].get("content")
284
-
285
- agent_input = {self.benchmark_input_field: msg_content}
286
-
287
- result = await self.run_async(
288
- agent=self.benchmark_agent_name,
289
- input=agent_input,
290
- box_result=False,
291
- )
292
-
293
- agent_output = result.get(
294
- self.benchmark_eval_field, "No answer found"
295
- )
296
-
297
- return {
298
- "output": agent_output,
299
- }
300
-
301
- return run
302
-
303
-
304
-
305
- def add_server(self, server: FlockMCPServer) -> FlockMCPServer:
306
- """Adds a server instance to this Flock configuration and registry."""
307
- return self._server_manager.add_server(server)
308
-
309
- def add_agent(self, agent: FlockAgent) -> FlockAgent:
310
- """Adds an agent instance to this Flock configuration and registry.
311
-
312
- This also registers all servers attached to the agent, if they have not been registered
313
- beforehand.
314
- """
315
- from flock.core.flock_agent import FlockAgent as ConcreteFlockAgent
316
-
317
- if not isinstance(agent, ConcreteFlockAgent):
318
- raise TypeError("Provided object is not a FlockAgent instance.")
319
- if not agent.name:
320
- raise ValueError("Agent must have a name.")
321
-
322
- if agent.name in self._agents:
323
- # Allow re-adding the same instance, but raise error for different instance with same name
324
- if self._agents[agent.name] is not agent:
325
- raise ValueError(
326
- f"Agent with name '{agent.name}' already exists with a different instance."
327
- )
328
- else:
329
- logger.debug(
330
- f"Agent '{agent.name}' is already added. Skipping."
331
- )
332
- return agent # Return existing agent
333
-
334
- self._agents[agent.name] = agent
335
- registry.register_agent(agent) # Register globally
336
-
337
- # Set default model if agent doesn't have one
338
- if agent.model is None:
339
- if self.model:
340
- agent.set_model(self.model)
341
- logger.debug(
342
- f"Agent '{agent.name}' using Flock default model: {self.model}"
343
- )
344
- else:
345
- logger.warning(
346
- f"Agent '{agent.name}' has no model and Flock default model is not set."
347
- )
348
-
349
- logger.info(f"Agent '{agent.name}' added to Flock '{self.name}'.")
350
- return agent
351
-
352
- @property
353
- def agents(self) -> dict[str, FlockAgent]:
354
- """Returns the dictionary of agents managed by this Flock instance."""
355
- return self._agents
356
-
357
- @property
358
- def servers(self) -> dict[str, FlockMCPServer]:
359
- """Returns the dictionary of servers managed by this Flock instance."""
360
- return self._server_manager.servers
361
-
362
- def run(
363
- self,
364
- agent: FlockAgent | str | None = None,
365
- input: dict | None = None,
366
- context: FlockContext | None = None,
367
- run_id: str = "",
368
- box_result: bool = True,
369
- agents: list[FlockAgent] | None = None,
370
- servers: list[FlockMCPServer] | None = None,
371
- memo: dict[str, Any] | None = None,
372
- ) -> Box | dict:
373
- """Synchronous execution wrapper."""
374
- return self._execution.run(
375
- agent=agent,
376
- input=input,
377
- context=context,
378
- run_id=run_id,
379
- box_result=box_result,
380
- agents=agents,
381
- servers=servers,
382
- memo=memo,
383
- )
384
-
385
- async def run_async(
386
- self,
387
- agent: FlockAgent | str | None = None,
388
- input: dict | None = None,
389
- context: FlockContext | None = None,
390
- run_id: str = "",
391
- box_result: bool = True,
392
- agents: list[FlockAgent] | None = None,
393
- servers: list[FlockMCPServer] | None = None,
394
- memo: dict[str, Any] | None = None,
395
- ) -> Box | dict:
396
- """Entry point for running an agent system asynchronously."""
397
- return await self._execution.run_async(
398
- agent=agent,
399
- input=input,
400
- context=context,
401
- run_id=run_id,
402
- box_result=box_result,
403
- agents=agents,
404
- servers=servers,
405
- memo=memo,
406
- )
407
-
408
- # --- Batch Processing (Delegation) ---
409
- async def run_batch_async(
410
- self,
411
- start_agent: FlockAgent | str,
412
- batch_inputs: list[dict[str, Any]] | DataFrame | str,
413
- input_mapping: dict[str, str] | None = None,
414
- static_inputs: dict[str, Any] | None = None,
415
- parallel: bool = True,
416
- max_workers: int = 5,
417
- use_temporal: bool | None = None,
418
- box_results: bool = True,
419
- return_errors: bool = False,
420
- silent_mode: bool = False,
421
- write_to_csv: str | None = None,
422
- hide_columns: list[str] | None = None,
423
- delimiter: str = ",",
424
- ) -> list[Box | dict | None | Exception]:
425
- """Runs the specified agent/workflow for each item in a batch asynchronously (delegated)."""
426
- return await self._batch_processor.run_batch_async(
427
- start_agent=start_agent,
428
- batch_inputs=batch_inputs,
429
- input_mapping=input_mapping,
430
- static_inputs=static_inputs,
431
- parallel=parallel,
432
- max_workers=max_workers,
433
- use_temporal=use_temporal,
434
- box_results=box_results,
435
- return_errors=return_errors,
436
- silent_mode=silent_mode,
437
- write_to_csv=write_to_csv,
438
- hide_columns=hide_columns,
439
- delimiter=delimiter,
440
- )
441
-
442
- def run_batch(
443
- self,
444
- start_agent: FlockAgent | str,
445
- batch_inputs: list[dict[str, Any]] | DataFrame | str,
446
- input_mapping: dict[str, str] | None = None,
447
- static_inputs: dict[str, Any] | None = None,
448
- parallel: bool = True,
449
- max_workers: int = 5,
450
- use_temporal: bool | None = None,
451
- box_results: bool = True,
452
- return_errors: bool = False,
453
- silent_mode: bool = False,
454
- write_to_csv: str | None = None,
455
- hide_columns: list[str] | None = None,
456
- delimiter: str = ",",
457
- ) -> list[Box | dict | None | Exception]:
458
- """Synchronous wrapper for batch processing."""
459
- return self._batch_processor.run_batch(
460
- start_agent=start_agent,
461
- batch_inputs=batch_inputs,
462
- input_mapping=input_mapping,
463
- static_inputs=static_inputs,
464
- parallel=parallel,
465
- max_workers=max_workers,
466
- use_temporal=use_temporal,
467
- box_results=box_results,
468
- return_errors=return_errors,
469
- silent_mode=silent_mode,
470
- write_to_csv=write_to_csv,
471
- hide_columns=hide_columns,
472
- delimiter=delimiter,
473
- )
474
-
475
- # --- Evaluation (Delegation) ---
476
- async def evaluate_async(
477
- self,
478
- dataset: str | Path | list[dict[str, Any]] | DataFrame | Dataset, # type: ignore
479
- start_agent: FlockAgent | str,
480
- input_mapping: dict[str, str],
481
- answer_mapping: dict[str, str],
482
- metrics: list[
483
- str
484
- | Callable[[Any, Any], bool | float | dict[str, Any]]
485
- | FlockAgent # Type hint only
486
- ],
487
- metric_configs: dict[str, dict[str, Any]] | None = None,
488
- static_inputs: dict[str, Any] | None = None,
489
- parallel: bool = True,
490
- max_workers: int = 5,
491
- use_temporal: bool | None = None,
492
- error_handling: Literal["raise", "skip", "log"] = "log",
493
- output_file: str | Path | None = None,
494
- return_dataframe: bool = True,
495
- silent_mode: bool = False,
496
- metadata_columns: list[str] | None = None,
497
- ) -> DataFrame | list[dict[str, Any]]: # type: ignore
498
- """Evaluates the Flock's performance against a dataset (delegated)."""
499
- return await self._evaluator.evaluate_async(
500
- dataset=dataset,
501
- start_agent=start_agent,
502
- input_mapping=input_mapping,
503
- answer_mapping=answer_mapping,
504
- metrics=metrics,
505
- metric_configs=metric_configs,
506
- static_inputs=static_inputs,
507
- parallel=parallel,
508
- max_workers=max_workers,
509
- use_temporal=use_temporal,
510
- error_handling=error_handling,
511
- output_file=output_file,
512
- return_dataframe=return_dataframe,
513
- silent_mode=silent_mode,
514
- metadata_columns=metadata_columns,
515
- )
516
-
517
- def evaluate(
518
- self,
519
- dataset: str | Path | list[dict[str, Any]] | DataFrame | Dataset, # type: ignore
520
- start_agent: FlockAgent | str,
521
- input_mapping: dict[str, str],
522
- answer_mapping: dict[str, str],
523
- metrics: list[
524
- str
525
- | Callable[[Any, Any], bool | float | dict[str, Any]]
526
- | FlockAgent # Type hint only
527
- ],
528
- metric_configs: dict[str, dict[str, Any]] | None = None,
529
- static_inputs: dict[str, Any] | None = None,
530
- parallel: bool = True,
531
- max_workers: int = 5,
532
- use_temporal: bool | None = None,
533
- error_handling: Literal["raise", "skip", "log"] = "log",
534
- output_file: str | Path | None = None,
535
- return_dataframe: bool = True,
536
- silent_mode: bool = False,
537
- metadata_columns: list[str] | None = None,
538
- ) -> DataFrame | list[dict[str, Any]]: # type: ignore
539
- """Synchronous wrapper for evaluation."""
540
- return self._evaluator.evaluate(
541
- dataset=dataset,
542
- start_agent=start_agent,
543
- input_mapping=input_mapping,
544
- answer_mapping=answer_mapping,
545
- metrics=metrics,
546
- metric_configs=metric_configs,
547
- static_inputs=static_inputs,
548
- parallel=parallel,
549
- max_workers=max_workers,
550
- use_temporal=use_temporal,
551
- error_handling=error_handling,
552
- output_file=output_file,
553
- return_dataframe=return_dataframe,
554
- silent_mode=silent_mode,
555
- metadata_columns=metadata_columns,
556
- )
557
-
558
- # --- Server & CLI Starters (Delegation) ---
559
-
560
- def serve(
561
- self,
562
- host: str = "127.0.0.1",
563
- port: int = 8344,
564
- server_name: str = "Flock Server",
565
- ui: bool = True,
566
- chat: bool = False,
567
- chat_agent: str | None = None, # Reserved for future real agent chat
568
- chat_message_key: str = "message",
569
- chat_history_key: str = "history",
570
- chat_response_key: str = "response",
571
- ui_theme: str | None = None,
572
- custom_endpoints: Sequence[FlockEndpoint]
573
- | dict[tuple[str, list[str] | None], Callable[..., Any]]
574
- | None = None,
575
- ) -> None:
576
- """Launch an HTTP server that exposes the core REST API and, optionally, the browser-based UI."""
577
- return self._web_server.serve(
578
- host=host,
579
- port=port,
580
- server_name=server_name,
581
- ui=ui,
582
- chat=chat,
583
- chat_agent=chat_agent,
584
- chat_message_key=chat_message_key,
585
- chat_history_key=chat_history_key,
586
- chat_response_key=chat_response_key,
587
- ui_theme=ui_theme,
588
- custom_endpoints=custom_endpoints,
589
- )
590
-
591
- def start_cli(
592
- self,
593
- start_agent: FlockAgent
594
- | str
595
- | None = None, # Added start_agent to match method signature in file_26
596
- server_name: str = "Flock CLI",
597
- show_results: bool = False,
598
- edit_mode: bool = False,
599
- ) -> None:
600
- """Starts an interactive CLI for this Flock instance."""
601
- return self._web_server.start_cli(
602
- start_agent=start_agent,
603
- server_name=server_name,
604
- show_results=show_results,
605
- edit_mode=edit_mode,
606
- )
607
-
608
- # --- Serialization Delegation Methods ---
609
- def to_dict(self, path_type: str = "relative") -> dict[str, Any]:
610
- """Serialize Flock instance to dictionary using FlockSerializer."""
611
- from flock.core.serialization.flock_serializer import FlockSerializer
612
-
613
- return FlockSerializer.serialize(self, path_type=path_type)
614
-
615
- @classmethod
616
- def from_dict(cls: type[T], data: dict[str, Any]) -> T:
617
- """Deserialize Flock instance from dictionary using FlockSerializer."""
618
- from flock.core.serialization.flock_serializer import FlockSerializer
619
-
620
- return FlockSerializer.deserialize(cls, data)
621
-
622
- # --- Static Method Loader (Delegates to loader module) ---
623
- @staticmethod
624
- def load_from_file(file_path: str) -> Flock: # Ensure return type is Flock
625
- """Load a Flock instance from various file formats (delegates to loader)."""
626
- from flock.core.util.loader import load_flock_from_file
627
-
628
- loaded_flock = load_flock_from_file(file_path)
629
- # Ensure the loaded object is indeed a Flock instance
630
- if not isinstance(loaded_flock, Flock):
631
- raise TypeError(
632
- f"Loaded object from {file_path} is not a Flock instance, but {type(loaded_flock)}"
633
- )
634
- return loaded_flock