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
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