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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (359) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +678 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +79 -0
  5. flock/cli.py +75 -0
  6. flock/components.py +173 -0
  7. flock/dashboard/__init__.py +28 -0
  8. flock/dashboard/collector.py +283 -0
  9. flock/dashboard/events.py +182 -0
  10. flock/dashboard/launcher.py +230 -0
  11. flock/dashboard/service.py +537 -0
  12. flock/dashboard/websocket.py +235 -0
  13. flock/engines/__init__.py +6 -0
  14. flock/engines/dspy_engine.py +856 -0
  15. flock/examples.py +128 -0
  16. flock/{core/util → helper}/cli_helper.py +4 -3
  17. flock/{core/logging → logging}/__init__.py +2 -3
  18. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  19. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  20. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
  21. flock/{core/logging → logging}/logging.py +77 -61
  22. flock/{core/logging → logging}/telemetry.py +20 -26
  23. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  24. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
  25. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  26. flock/{core/logging → logging}/trace_and_logged.py +20 -24
  27. flock/mcp/__init__.py +91 -0
  28. flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
  29. flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
  30. flock/mcp/manager.py +255 -0
  31. flock/mcp/servers/sse/__init__.py +1 -1
  32. flock/mcp/servers/sse/flock_sse_server.py +11 -53
  33. flock/mcp/servers/stdio/__init__.py +1 -1
  34. flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
  35. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
  36. flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
  37. flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
  38. flock/mcp/types/__init__.py +42 -0
  39. flock/{core/mcp → mcp}/types/callbacks.py +9 -15
  40. flock/{core/mcp → mcp}/types/factories.py +7 -6
  41. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  42. flock/{core/mcp → mcp}/types/types.py +70 -74
  43. flock/{core/mcp → mcp}/util/helpers.py +1 -1
  44. flock/orchestrator.py +645 -0
  45. flock/registry.py +148 -0
  46. flock/runtime.py +262 -0
  47. flock/service.py +140 -0
  48. flock/store.py +69 -0
  49. flock/subscription.py +111 -0
  50. flock/themes/andromeda.toml +1 -1
  51. flock/themes/apple-system-colors.toml +1 -1
  52. flock/themes/arcoiris.toml +1 -1
  53. flock/themes/atomonelight.toml +1 -1
  54. flock/themes/ayu copy.toml +1 -1
  55. flock/themes/ayu-light.toml +1 -1
  56. flock/themes/belafonte-day.toml +1 -1
  57. flock/themes/belafonte-night.toml +1 -1
  58. flock/themes/blulocodark.toml +1 -1
  59. flock/themes/breeze.toml +1 -1
  60. flock/themes/broadcast.toml +1 -1
  61. flock/themes/brogrammer.toml +1 -1
  62. flock/themes/builtin-dark.toml +1 -1
  63. flock/themes/builtin-pastel-dark.toml +1 -1
  64. flock/themes/catppuccin-latte.toml +1 -1
  65. flock/themes/catppuccin-macchiato.toml +1 -1
  66. flock/themes/catppuccin-mocha.toml +1 -1
  67. flock/themes/cga.toml +1 -1
  68. flock/themes/chalk.toml +1 -1
  69. flock/themes/ciapre.toml +1 -1
  70. flock/themes/coffee-theme.toml +1 -1
  71. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  72. flock/themes/dark+.toml +1 -1
  73. flock/themes/darkermatrix.toml +1 -1
  74. flock/themes/darkside.toml +1 -1
  75. flock/themes/desert.toml +1 -1
  76. flock/themes/django.toml +1 -1
  77. flock/themes/djangosmooth.toml +1 -1
  78. flock/themes/doomone.toml +1 -1
  79. flock/themes/dotgov.toml +1 -1
  80. flock/themes/dracula+.toml +1 -1
  81. flock/themes/duckbones.toml +1 -1
  82. flock/themes/encom.toml +1 -1
  83. flock/themes/espresso.toml +1 -1
  84. flock/themes/everblush.toml +1 -1
  85. flock/themes/fairyfloss.toml +1 -1
  86. flock/themes/fideloper.toml +1 -1
  87. flock/themes/fishtank.toml +1 -1
  88. flock/themes/flexoki-light.toml +1 -1
  89. flock/themes/floraverse.toml +1 -1
  90. flock/themes/framer.toml +1 -1
  91. flock/themes/galizur.toml +1 -1
  92. flock/themes/github.toml +1 -1
  93. flock/themes/grass.toml +1 -1
  94. flock/themes/grey-green.toml +1 -1
  95. flock/themes/gruvboxlight.toml +1 -1
  96. flock/themes/guezwhoz.toml +1 -1
  97. flock/themes/harper.toml +1 -1
  98. flock/themes/hax0r-blue.toml +1 -1
  99. flock/themes/hopscotch.256.toml +1 -1
  100. flock/themes/ic-green-ppl.toml +1 -1
  101. flock/themes/iceberg-dark.toml +1 -1
  102. flock/themes/japanesque.toml +1 -1
  103. flock/themes/jubi.toml +1 -1
  104. flock/themes/kibble.toml +1 -1
  105. flock/themes/kolorit.toml +1 -1
  106. flock/themes/kurokula.toml +1 -1
  107. flock/themes/materialdesigncolors.toml +1 -1
  108. flock/themes/matrix.toml +1 -1
  109. flock/themes/mellifluous.toml +1 -1
  110. flock/themes/midnight-in-mojave.toml +1 -1
  111. flock/themes/monokai-remastered.toml +1 -1
  112. flock/themes/monokai-soda.toml +1 -1
  113. flock/themes/neon.toml +1 -1
  114. flock/themes/neopolitan.toml +1 -1
  115. flock/themes/nord-light.toml +1 -1
  116. flock/themes/ocean.toml +1 -1
  117. flock/themes/onehalfdark.toml +1 -1
  118. flock/themes/onehalflight.toml +1 -1
  119. flock/themes/palenighthc.toml +1 -1
  120. flock/themes/paulmillr.toml +1 -1
  121. flock/themes/pencildark.toml +1 -1
  122. flock/themes/pnevma.toml +1 -1
  123. flock/themes/purple-rain.toml +1 -1
  124. flock/themes/purplepeter.toml +1 -1
  125. flock/themes/raycast-dark.toml +1 -1
  126. flock/themes/red-sands.toml +1 -1
  127. flock/themes/relaxed.toml +1 -1
  128. flock/themes/retro.toml +1 -1
  129. flock/themes/rose-pine.toml +1 -1
  130. flock/themes/royal.toml +1 -1
  131. flock/themes/ryuuko.toml +1 -1
  132. flock/themes/sakura.toml +1 -1
  133. flock/themes/scarlet-protocol.toml +1 -1
  134. flock/themes/seoulbones-dark.toml +1 -1
  135. flock/themes/shades-of-purple.toml +1 -1
  136. flock/themes/smyck.toml +1 -1
  137. flock/themes/softserver.toml +1 -1
  138. flock/themes/solarized-darcula.toml +1 -1
  139. flock/themes/square.toml +1 -1
  140. flock/themes/sugarplum.toml +1 -1
  141. flock/themes/thayer-bright.toml +1 -1
  142. flock/themes/tokyonight.toml +1 -1
  143. flock/themes/tomorrow.toml +1 -1
  144. flock/themes/ubuntu.toml +1 -1
  145. flock/themes/ultradark.toml +1 -1
  146. flock/themes/ultraviolent.toml +1 -1
  147. flock/themes/unikitty.toml +1 -1
  148. flock/themes/urple.toml +1 -1
  149. flock/themes/vesper.toml +1 -1
  150. flock/themes/vimbones.toml +1 -1
  151. flock/themes/wildcherry.toml +1 -1
  152. flock/themes/wilmersdorf.toml +1 -1
  153. flock/themes/wryan.toml +1 -1
  154. flock/themes/xcodedarkhc.toml +1 -1
  155. flock/themes/xcodelight.toml +1 -1
  156. flock/themes/zenbones-light.toml +1 -1
  157. flock/themes/zenwritten-dark.toml +1 -1
  158. flock/utilities.py +301 -0
  159. flock/{components/utility → utility}/output_utility_component.py +68 -53
  160. flock/visibility.py +107 -0
  161. flock_core-0.5.56b0.dist-info/METADATA +747 -0
  162. flock_core-0.5.56b0.dist-info/RECORD +398 -0
  163. flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
  164. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/licenses/LICENSE +1 -1
  165. flock/adapter/__init__.py +0 -14
  166. flock/adapter/azure_adapter.py +0 -68
  167. flock/adapter/chroma_adapter.py +0 -73
  168. flock/adapter/faiss_adapter.py +0 -97
  169. flock/adapter/pinecone_adapter.py +0 -51
  170. flock/adapter/vector_base.py +0 -47
  171. flock/cli/assets/release_notes.md +0 -140
  172. flock/cli/config.py +0 -8
  173. flock/cli/constants.py +0 -36
  174. flock/cli/create_agent.py +0 -1
  175. flock/cli/create_flock.py +0 -280
  176. flock/cli/execute_flock.py +0 -620
  177. flock/cli/load_agent.py +0 -1
  178. flock/cli/load_examples.py +0 -1
  179. flock/cli/load_flock.py +0 -192
  180. flock/cli/load_release_notes.py +0 -20
  181. flock/cli/loaded_flock_cli.py +0 -254
  182. flock/cli/manage_agents.py +0 -459
  183. flock/cli/registry_management.py +0 -889
  184. flock/cli/runner.py +0 -41
  185. flock/cli/settings.py +0 -857
  186. flock/cli/utils.py +0 -135
  187. flock/cli/view_results.py +0 -29
  188. flock/cli/yaml_editor.py +0 -396
  189. flock/components/__init__.py +0 -30
  190. flock/components/evaluation/__init__.py +0 -9
  191. flock/components/evaluation/declarative_evaluation_component.py +0 -606
  192. flock/components/routing/__init__.py +0 -15
  193. flock/components/routing/conditional_routing_component.py +0 -494
  194. flock/components/routing/default_routing_component.py +0 -103
  195. flock/components/routing/llm_routing_component.py +0 -206
  196. flock/components/utility/__init__.py +0 -22
  197. flock/components/utility/example_utility_component.py +0 -250
  198. flock/components/utility/feedback_utility_component.py +0 -206
  199. flock/components/utility/memory_utility_component.py +0 -550
  200. flock/components/utility/metrics_utility_component.py +0 -700
  201. flock/config.py +0 -61
  202. flock/core/__init__.py +0 -110
  203. flock/core/agent/__init__.py +0 -16
  204. flock/core/agent/default_agent.py +0 -216
  205. flock/core/agent/flock_agent_components.py +0 -104
  206. flock/core/agent/flock_agent_execution.py +0 -101
  207. flock/core/agent/flock_agent_integration.py +0 -260
  208. flock/core/agent/flock_agent_lifecycle.py +0 -186
  209. flock/core/agent/flock_agent_serialization.py +0 -381
  210. flock/core/api/__init__.py +0 -10
  211. flock/core/api/custom_endpoint.py +0 -45
  212. flock/core/api/endpoints.py +0 -254
  213. flock/core/api/main.py +0 -162
  214. flock/core/api/models.py +0 -97
  215. flock/core/api/run_store.py +0 -224
  216. flock/core/api/runner.py +0 -44
  217. flock/core/api/service.py +0 -214
  218. flock/core/component/__init__.py +0 -15
  219. flock/core/component/agent_component_base.py +0 -309
  220. flock/core/component/evaluation_component.py +0 -62
  221. flock/core/component/routing_component.py +0 -74
  222. flock/core/component/utility_component.py +0 -69
  223. flock/core/config/flock_agent_config.py +0 -58
  224. flock/core/config/scheduled_agent_config.py +0 -40
  225. flock/core/context/context.py +0 -213
  226. flock/core/context/context_manager.py +0 -37
  227. flock/core/context/context_vars.py +0 -10
  228. flock/core/evaluation/utils.py +0 -396
  229. flock/core/execution/batch_executor.py +0 -369
  230. flock/core/execution/evaluation_executor.py +0 -438
  231. flock/core/execution/local_executor.py +0 -31
  232. flock/core/execution/opik_executor.py +0 -103
  233. flock/core/execution/temporal_executor.py +0 -164
  234. flock/core/flock.py +0 -634
  235. flock/core/flock_agent.py +0 -336
  236. flock/core/flock_factory.py +0 -613
  237. flock/core/flock_scheduler.py +0 -166
  238. flock/core/flock_server_manager.py +0 -136
  239. flock/core/interpreter/python_interpreter.py +0 -689
  240. flock/core/mcp/__init__.py +0 -1
  241. flock/core/mcp/flock_mcp_server.py +0 -680
  242. flock/core/mcp/mcp_client_manager.py +0 -201
  243. flock/core/mcp/types/__init__.py +0 -1
  244. flock/core/mixin/dspy_integration.py +0 -403
  245. flock/core/mixin/prompt_parser.py +0 -125
  246. flock/core/orchestration/__init__.py +0 -15
  247. flock/core/orchestration/flock_batch_processor.py +0 -94
  248. flock/core/orchestration/flock_evaluator.py +0 -113
  249. flock/core/orchestration/flock_execution.py +0 -295
  250. flock/core/orchestration/flock_initialization.py +0 -149
  251. flock/core/orchestration/flock_server_manager.py +0 -67
  252. flock/core/orchestration/flock_web_server.py +0 -117
  253. flock/core/registry/__init__.py +0 -45
  254. flock/core/registry/agent_registry.py +0 -69
  255. flock/core/registry/callable_registry.py +0 -139
  256. flock/core/registry/component_discovery.py +0 -142
  257. flock/core/registry/component_registry.py +0 -64
  258. flock/core/registry/config_mapping.py +0 -64
  259. flock/core/registry/decorators.py +0 -137
  260. flock/core/registry/registry_hub.py +0 -205
  261. flock/core/registry/server_registry.py +0 -57
  262. flock/core/registry/type_registry.py +0 -86
  263. flock/core/serialization/__init__.py +0 -13
  264. flock/core/serialization/callable_registry.py +0 -52
  265. flock/core/serialization/flock_serializer.py +0 -832
  266. flock/core/serialization/json_encoder.py +0 -41
  267. flock/core/serialization/secure_serializer.py +0 -175
  268. flock/core/serialization/serializable.py +0 -342
  269. flock/core/serialization/serialization_utils.py +0 -412
  270. flock/core/util/file_path_utils.py +0 -223
  271. flock/core/util/hydrator.py +0 -309
  272. flock/core/util/input_resolver.py +0 -164
  273. flock/core/util/loader.py +0 -59
  274. flock/core/util/splitter.py +0 -219
  275. flock/di.py +0 -27
  276. flock/platform/docker_tools.py +0 -49
  277. flock/platform/jaeger_install.py +0 -86
  278. flock/webapp/__init__.py +0 -1
  279. flock/webapp/app/__init__.py +0 -0
  280. flock/webapp/app/api/__init__.py +0 -0
  281. flock/webapp/app/api/agent_management.py +0 -241
  282. flock/webapp/app/api/execution.py +0 -709
  283. flock/webapp/app/api/flock_management.py +0 -129
  284. flock/webapp/app/api/registry_viewer.py +0 -30
  285. flock/webapp/app/chat.py +0 -665
  286. flock/webapp/app/config.py +0 -104
  287. flock/webapp/app/dependencies.py +0 -117
  288. flock/webapp/app/main.py +0 -1070
  289. flock/webapp/app/middleware.py +0 -113
  290. flock/webapp/app/models_ui.py +0 -7
  291. flock/webapp/app/services/__init__.py +0 -0
  292. flock/webapp/app/services/feedback_file_service.py +0 -363
  293. flock/webapp/app/services/flock_service.py +0 -337
  294. flock/webapp/app/services/sharing_models.py +0 -81
  295. flock/webapp/app/services/sharing_store.py +0 -762
  296. flock/webapp/app/templates/theme_mapper.html +0 -326
  297. flock/webapp/app/theme_mapper.py +0 -812
  298. flock/webapp/app/utils.py +0 -85
  299. flock/webapp/run.py +0 -215
  300. flock/webapp/static/css/chat.css +0 -301
  301. flock/webapp/static/css/components.css +0 -167
  302. flock/webapp/static/css/header.css +0 -39
  303. flock/webapp/static/css/layout.css +0 -46
  304. flock/webapp/static/css/sidebar.css +0 -127
  305. flock/webapp/static/css/two-pane.css +0 -48
  306. flock/webapp/templates/base.html +0 -200
  307. flock/webapp/templates/chat.html +0 -152
  308. flock/webapp/templates/chat_settings.html +0 -19
  309. flock/webapp/templates/flock_editor.html +0 -16
  310. flock/webapp/templates/index.html +0 -12
  311. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  312. flock/webapp/templates/partials/_agent_list.html +0 -18
  313. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  314. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  315. flock/webapp/templates/partials/_chat_container.html +0 -15
  316. flock/webapp/templates/partials/_chat_messages.html +0 -57
  317. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  318. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  319. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  320. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  321. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  322. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  323. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  324. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  325. flock/webapp/templates/partials/_execution_form.html +0 -118
  326. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  327. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  328. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  329. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  330. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  331. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  332. flock/webapp/templates/partials/_registry_table.html +0 -25
  333. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  334. flock/webapp/templates/partials/_results_display.html +0 -78
  335. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  336. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  337. flock/webapp/templates/partials/_settings_view.html +0 -36
  338. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  339. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  340. flock/webapp/templates/partials/_sidebar.html +0 -74
  341. flock/webapp/templates/partials/_streaming_results_container.html +0 -195
  342. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  343. flock/webapp/templates/partials/_theme_preview.html +0 -36
  344. flock/webapp/templates/registry_viewer.html +0 -84
  345. flock/webapp/templates/shared_run_page.html +0 -140
  346. flock/workflow/__init__.py +0 -0
  347. flock/workflow/activities.py +0 -196
  348. flock/workflow/agent_activities.py +0 -24
  349. flock/workflow/agent_execution_activity.py +0 -202
  350. flock/workflow/flock_workflow.py +0 -214
  351. flock/workflow/temporal_config.py +0 -96
  352. flock/workflow/temporal_setup.py +0 -68
  353. flock_core-0.5.0b28.dist-info/METADATA +0 -274
  354. flock_core-0.5.0b28.dist-info/RECORD +0 -561
  355. flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
  356. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  357. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  358. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  359. {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
@@ -1,613 +0,0 @@
1
- """Factory for creating pre-configured Flock agents.
2
-
3
- Deprecated: Prefer explicit `DefaultAgent` class for new code. This factory
4
- remains as a thin adapter to ease migration and preserve backward compatibility.
5
- """
6
-
7
- import os
8
- import warnings
9
- from collections.abc import Callable
10
- from pathlib import Path
11
- from typing import Any, Literal
12
-
13
- import httpx
14
- from pydantic import AnyUrl, BaseModel, ConfigDict, Field, FileUrl
15
-
16
- from flock.components.utility.metrics_utility_component import (
17
- MetricsUtilityComponent,
18
- MetricsUtilityConfig,
19
- )
20
- from flock.core.agent.default_agent import DefaultAgent
21
-
22
- # New unified components imported locally to avoid circular imports
23
- from flock.core.config.scheduled_agent_config import ScheduledAgentConfig
24
- from flock.core.flock_agent import DynamicStr, FlockAgent
25
- from flock.core.logging.formatters.themes import OutputTheme
26
- from flock.core.logging.logging import get_logger
27
- from flock.core.mcp.flock_mcp_server import FlockMCPServer
28
- from flock.core.mcp.mcp_config import (
29
- FlockMCPCachingConfiguration,
30
- FlockMCPCallbackConfiguration,
31
- FlockMCPFeatureConfiguration,
32
- )
33
- from flock.core.mcp.types.types import (
34
- FlockListRootsMCPCallback,
35
- FlockLoggingMCPCallback,
36
- FlockMessageHandlerMCPCallback,
37
- FlockSamplingMCPCallback,
38
- MCPRoot,
39
- SseServerParameters,
40
- StdioServerParameters,
41
- StreamableHttpServerParameters,
42
- WebsocketServerParameters,
43
- )
44
- from flock.mcp.servers.sse.flock_sse_server import (
45
- FlockSSEConfig,
46
- FlockSSEConnectionConfig,
47
- FlockSSEServer,
48
- )
49
- from flock.mcp.servers.stdio.flock_stdio_server import (
50
- FlockMCPStdioServer,
51
- FlockStdioConfig,
52
- FlockStdioConnectionConfig,
53
- )
54
- from flock.mcp.servers.streamable_http.flock_streamable_http_server import (
55
- FlockStreamableHttpConfig,
56
- FlockStreamableHttpConnectionConfig,
57
- FlockStreamableHttpServer,
58
- )
59
- from flock.mcp.servers.websockets.flock_websocket_server import (
60
- FlockWSConfig,
61
- FlockWSConnectionConfig,
62
- FlockWSServer,
63
- )
64
- from flock.workflow.temporal_config import TemporalActivityConfig
65
-
66
- LoggingLevel = Literal[
67
- "debug",
68
- "info",
69
- "notice",
70
- "warning",
71
- "error",
72
- "critical",
73
- "alert",
74
- "emergency",
75
- ]
76
-
77
-
78
- class FlockFactory:
79
- """Factory for creating pre-configured Flock agents and pre-configured Flock MCPServers with common module setups."""
80
-
81
- # Classes for type-hints.
82
- class StdioParams(BaseModel):
83
- """Factory-Params for Stdio-Servers."""
84
-
85
- command: str = Field(
86
- ...,
87
- description="Command for starting the local script. (e.g. 'uvx', 'bun', 'npx', 'bunx', etc.)",
88
- )
89
-
90
- args: list[str] = Field(
91
- ...,
92
- description="Arguments for starting the local script. (e.g. ['run', './mcp-server.py'])",
93
- )
94
-
95
- env: dict[str, Any] | None = Field(
96
- default=None,
97
- description="Environment variables to pass to the server. (e.g. {'GOOGLE_API_KEY': 'MY_SUPER_SECRET_API_KEY'})",
98
- )
99
-
100
- cwd: str | Path | None = Field(
101
- default_factory=os.getcwd,
102
- description="The working directory to start the script in.",
103
- )
104
-
105
- encoding: str = Field(
106
- default="utf-8",
107
- description="The char-encoding to use when talking to a stdio server. (e.g. 'utf-8', 'ascii', etc.)",
108
- )
109
-
110
- encoding_error_handler: Literal["strict", "ignore", "replace"] = Field(
111
- default="strict",
112
- description="The text encoding error handler. See https://docs.python.org/3/library/codecs.html#codec-base-classes for explanations of possible values",
113
- )
114
-
115
- class StreamableHttpParams(BaseModel):
116
- """Factory-Params for Streamable Http Servers."""
117
-
118
- url: str | AnyUrl = Field(..., description="Url the server listens at.")
119
-
120
- headers: dict[str, Any] | None = Field(
121
- default=None,
122
- description="Additional Headers to pass to the client.",
123
- )
124
-
125
- auth: httpx.Auth | None = Field(
126
- default=None, description="Httpx Auth Schema."
127
- )
128
-
129
- timeout_seconds: float | int = Field(
130
- default=5, description="Http Timeout in Seconds"
131
- )
132
-
133
- sse_read_timeout_seconds: float | int = Field(
134
- default=60 * 5,
135
- description="How many seconds to wait for server-sent events until closing the connection.",
136
- )
137
-
138
- terminate_on_close: bool = Field(
139
- default=True,
140
- description="Whether or not to terminate the underlying connection on close.",
141
- )
142
-
143
- model_config = ConfigDict(
144
- arbitrary_types_allowed=True,
145
- extra="allow",
146
- )
147
-
148
- class SSEParams(BaseModel):
149
- """Factory-Params for SSE-Servers."""
150
-
151
- url: str | AnyUrl = Field(
152
- ...,
153
- description="Url the server listens at. (e.g. https://my-mcp-server.io/sse)",
154
- )
155
-
156
- headers: dict[str, Any] | None = Field(
157
- default=None,
158
- description="Additional Headers to pass to the client.",
159
- )
160
-
161
- timeout_seconds: float | int = Field(
162
- default=5, description="Http Timeout in Seconds."
163
- )
164
-
165
- sse_read_timeout_seconds: float | int = Field(
166
- default=60 * 5,
167
- description="How many seconds to wait for server-sent events until closing the connection. (connections will be automatically re-established.)",
168
- )
169
-
170
- auth: httpx.Auth | None = Field(
171
- default=None, description="Httpx Auth Scheme."
172
- )
173
-
174
- model_config = ConfigDict(
175
- arbitrary_types_allowed=True,
176
- extra="allow",
177
- )
178
-
179
- class WebsocketParams(BaseModel):
180
- """Factory-Params for Websocket Servers."""
181
-
182
- url: str | AnyUrl = Field(
183
- ...,
184
- description="The url the server listens at. (e.g. ws://my-mcp-server.io/messages)",
185
- )
186
-
187
- @staticmethod
188
- def create_mcp_server(
189
- name: str,
190
- connection_params: StreamableHttpParams
191
- | SSEParams
192
- | StdioParams
193
- | WebsocketParams,
194
- max_retries: int = 3,
195
- mount_points: list[str | MCPRoot] | None = None,
196
- timeout_seconds: int | float = 10,
197
- server_logging_level: LoggingLevel = "error",
198
- enable_roots_feature: bool = False,
199
- enable_tools_feature: bool = False,
200
- enable_sampling_feature: bool = False,
201
- enable_prompts_feature: bool = False,
202
- sampling_callback: FlockSamplingMCPCallback | None = None,
203
- list_roots_callback: FlockListRootsMCPCallback | None = None,
204
- logging_callback: FlockLoggingMCPCallback | None = None,
205
- message_handler: FlockMessageHandlerMCPCallback | None = None,
206
- tool_cache_size: float = 100,
207
- tool_cache_ttl: float = 60,
208
- resource_contents_cache_size=10,
209
- resource_contents_cache_ttl=60 * 5,
210
- resource_list_cache_size=100,
211
- resource_list_cache_ttl=100,
212
- tool_result_cache_size=100,
213
- tool_result_cache_ttl=100,
214
- description: str | Callable[..., str] | None = None,
215
- alert_latency_threshold_ms: int = 30000,
216
- tool_whitelist: list[str] | None = None,
217
- allow_all_tools: bool = True,
218
- ) -> FlockMCPServer:
219
- """Create a default MCP Server with common modules.
220
-
221
- Allows for creating one of the three default-implementations provided
222
- by Flock:
223
- - SSE-Server (specify "sse" in type)
224
- - Stdio-Server (specify "stdio" in type)
225
- - Websockets-Server (specifiy "websockets" in type)
226
-
227
- Args:
228
- name: Unique identifier for the MCP server
229
- connection_params: Connection configuration (StdioParams, SSEParams, etc.)
230
- tool_whitelist: List of tool names to allow from this server. If provided,
231
- only tools with these names will be available. Used with
232
- allow_all_tools=False for strict filtering. Agent-level
233
- filtering is generally preferred over server-level filtering.
234
- allow_all_tools: Whether to allow all tools from the server. When True
235
- (default), all tools are available. When False, only tools
236
- in tool_whitelist (if provided) are available.
237
- Other args: Various configuration options for caching, callbacks, etc.
238
-
239
- Returns:
240
- FlockMCPServer: Configured MCP server instance
241
-
242
- Note:
243
- For security and flexibility, prefer using agent-level tool_whitelist
244
- over server-level filtering. This allows different agents to access
245
- different tool subsets from the same server.
246
- """
247
- # infer server type from the pydantic model class
248
- if isinstance(connection_params, FlockFactory.StdioParams):
249
- server_kind = "stdio"
250
- concrete_server_cls = FlockMCPStdioServer
251
- if isinstance(connection_params, FlockFactory.SSEParams):
252
- server_kind = "sse"
253
- concrete_server_cls = FlockSSEServer
254
- if isinstance(connection_params, FlockFactory.WebsocketParams):
255
- server_kind = "websockets"
256
- concrete_server_cls = FlockWSServer
257
- if isinstance(connection_params, FlockFactory.StreamableHttpParams):
258
- server_kind = "streamable_http"
259
- concrete_server_cls = FlockStreamableHttpServer
260
-
261
- # convert mount points.
262
- mounts: list[MCPRoot] = []
263
- if mount_points:
264
- for item in mount_points:
265
- if isinstance(item, MCPRoot):
266
- mounts.append(item)
267
- elif isinstance(item, str):
268
- try:
269
- conv = MCPRoot(uri=FileUrl(url=item))
270
- mounts.append(conv)
271
- except Exception:
272
- continue # ignore
273
- else:
274
- continue # ignore
275
-
276
- # build generic configs
277
- feature_config = FlockMCPFeatureConfiguration(
278
- roots_enabled=enable_roots_feature,
279
- tools_enabled=enable_tools_feature,
280
- prompts_enabled=enable_prompts_feature,
281
- sampling_enabled=enable_sampling_feature,
282
- tool_whitelist=tool_whitelist,
283
- )
284
- callback_config = FlockMCPCallbackConfiguration(
285
- sampling_callback=sampling_callback,
286
- list_roots_callback=list_roots_callback,
287
- logging_callback=logging_callback,
288
- message_handler=message_handler,
289
- )
290
- caching_config = FlockMCPCachingConfiguration(
291
- tool_cache_max_size=tool_cache_size,
292
- tool_cache_max_ttl=tool_cache_ttl,
293
- resource_contents_cache_max_size=resource_contents_cache_size,
294
- resource_contents_cache_max_ttl=resource_contents_cache_ttl,
295
- resource_list_cache_max_size=resource_list_cache_size,
296
- resource_list_cache_max_ttl=resource_list_cache_ttl,
297
- tool_result_cache_max_size=tool_result_cache_size,
298
- tool_result_cache_max_ttl=tool_result_cache_ttl,
299
- )
300
- connection_config = None
301
- server_config: (
302
- FlockStdioConfig | FlockSSEConfig | FlockWSConfig | None
303
- ) = None
304
-
305
- # Instantiate correct server + config
306
- if server_kind == "stdio":
307
- # build stdio config
308
- connection_config = FlockStdioConnectionConfig(
309
- max_retries=max_retries,
310
- connection_parameters=StdioServerParameters(
311
- command=connection_params.command,
312
- args=connection_params.args,
313
- env=connection_params.env,
314
- encoding=connection_params.encoding,
315
- encoding_error_handler=connection_params.encoding_error_handler,
316
- cwd=connection_params.cwd,
317
- ),
318
- mount_points=mounts,
319
- read_timeout_seconds=timeout_seconds,
320
- server_logging_level=server_logging_level,
321
- )
322
- server_config = FlockStdioConfig(
323
- name=name,
324
- connection_config=connection_config,
325
- feature_config=feature_config,
326
- caching_config=caching_config,
327
- callback_config=callback_config,
328
- )
329
- elif server_kind == "streamable_http":
330
- # build streamable http config
331
- connection_config = FlockStreamableHttpConnectionConfig(
332
- max_retries=max_retries,
333
- connection_parameters=StreamableHttpServerParameters(
334
- url=connection_params.url,
335
- headers=connection_params.headers,
336
- auth=connection_params.auth,
337
- timeout=connection_params.timeout_seconds,
338
- sse_read_timeout=connection_params.sse_read_timeout_seconds,
339
- terminate_on_close=connection_params.terminate_on_close,
340
- ),
341
- mount_points=mounts,
342
- server_logging_level=server_logging_level,
343
- )
344
-
345
- server_config = FlockStreamableHttpConfig(
346
- name=name,
347
- connection_config=connection_config,
348
- feature_config=feature_config,
349
- caching_config=caching_config,
350
- callback_config=callback_config,
351
- allow_all_tools=allow_all_tools,
352
- )
353
-
354
- elif server_kind == "sse":
355
- # build sse config
356
- connection_config = FlockSSEConnectionConfig(
357
- max_retries=max_retries,
358
- connection_parameters=SseServerParameters(
359
- url=connection_params.url,
360
- auth=connection_params.auth,
361
- headers=connection_params.headers,
362
- timeout=connection_params.timeout_seconds,
363
- sse_read_timeout=connection_params.sse_read_timeout_seconds,
364
- ),
365
- mount_points=mounts,
366
- server_logging_level=server_logging_level,
367
- )
368
-
369
- server_config = FlockSSEConfig(
370
- name=name,
371
- connection_config=connection_config,
372
- feature_config=feature_config,
373
- caching_config=caching_config,
374
- callback_config=callback_config,
375
- allow_all_tools=allow_all_tools,
376
- )
377
-
378
- elif server_kind == "websockets":
379
- # build websocket config
380
- connection_config = FlockWSConnectionConfig(
381
- max_retries=max_retries,
382
- connection_parameters=WebsocketServerParameters(
383
- url=connection_params.url,
384
- ),
385
- mount_points=mounts,
386
- server_logging_level=server_logging_level,
387
- )
388
-
389
- server_config = FlockWSConfig(
390
- name=name,
391
- connection_config=connection_config,
392
- feature_config=feature_config,
393
- caching_config=caching_config,
394
- callback_config=callback_config,
395
- allow_all_tools=allow_all_tools,
396
- )
397
-
398
- else:
399
- raise ValueError(
400
- f"Unsupported connection_params type: {type(connection_params)}"
401
- )
402
-
403
- if not server_config:
404
- raise ValueError(
405
- "Unable to create server configuration for passed params."
406
- )
407
-
408
- server = concrete_server_cls(config=server_config)
409
-
410
- metrics_component_config = MetricsUtilityConfig(
411
- latency_threshold_ms=alert_latency_threshold_ms
412
- )
413
-
414
- metrics_component = MetricsUtilityComponent("metrics", config=metrics_component_config)
415
-
416
- server.add_component(metrics_component)
417
-
418
- return server
419
-
420
- @staticmethod
421
- def create_default_agent(
422
- name: str,
423
- description: DynamicStr| None = None,
424
- model: str | Callable[..., str] | None = None,
425
- input: DynamicStr = None,
426
- output: DynamicStr = None,
427
- tools: list[Callable[..., Any] | Any] | None = None,
428
- servers: list[str | FlockMCPServer] | None = None,
429
- use_cache: bool = True,
430
- enable_rich_tables: bool = False,
431
- output_theme: OutputTheme = OutputTheme.abernathy,
432
- wait_for_input: bool = False,
433
- temperature: float = 1.0,
434
- max_tokens: int = 8192,
435
- max_tool_calls: int = 10,
436
- max_retries: int = 3,
437
- alert_latency_threshold_ms: int = 30000,
438
- no_output: bool = False,
439
- print_context: bool = False,
440
- write_to_file: bool = False,
441
- stream: bool = False,
442
- include_thought_process: bool = False,
443
- include_reasoning: bool = False,
444
- next_agent: DynamicStr | None = None,
445
- temporal_activity_config: TemporalActivityConfig | None = None,
446
- # Feedback parameters
447
- enable_feedback: bool = False,
448
- feedback_storage_type: Literal["sqlite", "azure"] = "sqlite",
449
- feedback_max_items: int = 5,
450
- feedback_timeframe_days: int = 30,
451
- feedback_input_key: str = "feedback_context",
452
- feedback_include_expected_responses: bool = True,
453
- feedback_include_actual_responses: bool = False,
454
- feedback_filter_keywords: list[str] | None = None,
455
- feedback_exclude_keywords: list[str] | None = None,
456
- feedback_sqlite_db_path: str = "./flock_feedback.db",
457
- feedback_azure_connection_string: str | None = None,
458
- feedback_azure_table_name: str = "flockfeedback",
459
- # Example parameters
460
- enable_examples: bool = False,
461
- example_storage_type: Literal["sqlite", "azure"] = "sqlite",
462
- example_max_examples: int = 5,
463
- example_timeframe_days: int = 30,
464
- example_input_key: str = "examples_context",
465
- example_filter_keywords: list[str] | None = None,
466
- example_exclude_keywords: list[str] | None = None,
467
- example_sqlite_db_path: str = "./flock_examples.db",
468
- example_azure_connection_string: str | None = None,
469
- example_azure_table_name: str = "flockexamples",
470
- ) -> FlockAgent:
471
- """Create a default FlockAgent.
472
-
473
- Deprecated: Use `DefaultAgent(...)` instead. This method now delegates to
474
- `DefaultAgent` and emits an optional one-time deprecation warning if the
475
- environment variable `FLOCK_WARN_FACTORY_DEPRECATION` is truthy (default).
476
- """
477
- _maybe_warn_factory_deprecation()
478
-
479
- # Configure feedback if enabled
480
- feedback_config = None
481
- if enable_feedback:
482
- from flock.components.utility.feedback_utility_component import FeedbackUtilityConfig
483
- feedback_config = FeedbackUtilityConfig(
484
- storage_type=feedback_storage_type,
485
- max_feedback_items=feedback_max_items,
486
- feedback_timeframe_days=feedback_timeframe_days,
487
- feedback_input_key=feedback_input_key,
488
- include_expected_responses=feedback_include_expected_responses,
489
- include_actual_responses=feedback_include_actual_responses,
490
- feedback_filter_keywords=feedback_filter_keywords or [],
491
- feedback_exclude_keywords=feedback_exclude_keywords or [],
492
- sqlite_db_path=feedback_sqlite_db_path,
493
- azure_connection_string=feedback_azure_connection_string,
494
- azure_table_name=feedback_azure_table_name,
495
- )
496
-
497
- # Configure examples if enabled
498
- example_config = None
499
- if enable_examples:
500
- from flock.components.utility.example_utility_component import ExampleUtilityConfig
501
- example_config = ExampleUtilityConfig(
502
- storage_type=example_storage_type,
503
- max_examples=example_max_examples,
504
- example_timeframe_days=example_timeframe_days,
505
- example_input_key=example_input_key,
506
- example_filter_keywords=example_filter_keywords or [],
507
- example_exclude_keywords=example_exclude_keywords or [],
508
- sqlite_db_path=example_sqlite_db_path,
509
- azure_connection_string=example_azure_connection_string,
510
- azure_table_name=example_azure_table_name,
511
- )
512
-
513
- return DefaultAgent(
514
- name=name,
515
- description=description,
516
- model=model,
517
- input=input,
518
- output=output,
519
- tools=tools,
520
- servers=servers,
521
- use_cache=use_cache,
522
- temperature=temperature,
523
- max_tokens=max_tokens,
524
- max_tool_calls=max_tool_calls,
525
- max_retries=max_retries,
526
- stream=stream,
527
- include_thought_process=include_thought_process,
528
- include_reasoning=include_reasoning,
529
- enable_rich_tables=enable_rich_tables,
530
- output_theme=output_theme,
531
- no_output=no_output,
532
- print_context=print_context,
533
- write_to_file=write_to_file,
534
- wait_for_input=wait_for_input,
535
- alert_latency_threshold_ms=alert_latency_threshold_ms,
536
- next_agent=next_agent,
537
- temporal_activity_config=temporal_activity_config,
538
- enable_feedback=enable_feedback,
539
- feedback_config=feedback_config,
540
- enable_examples=enable_examples,
541
- example_config=example_config,
542
- )
543
-
544
- @staticmethod
545
- def create_scheduled_agent(
546
- name: str,
547
- schedule_expression: str, # e.g., "every 1h", "0 0 * * *"
548
- description: DynamicStr | None = None,
549
- model: str | None = None,
550
- output: DynamicStr | None = None, # Input might be implicit or none
551
- tools: list[Callable[..., Any] | Any] | None = None,
552
- servers: list[str | FlockMCPServer] | None = None,
553
- use_cache: bool = False, # Whether to cache results
554
- temperature: float = 0.7, # Temperature for model responses
555
- # ... other common agent params from create_default_agent ...
556
- next_agent: DynamicStr | None = None,
557
- temporal_activity_config: TemporalActivityConfig
558
- | None = None, # If you want scheduled tasks to be Temporal activities
559
- **kwargs, # Forward other standard agent params
560
- ) -> FlockAgent:
561
- """Creates a FlockAgent configured to run on a schedule."""
562
- agent_config = ScheduledAgentConfig( # Use the new config type
563
- schedule_expression=schedule_expression,
564
- enabled=True,
565
- initial_run=True,
566
- max_runs=0,
567
- **kwargs,
568
- )
569
-
570
- agent = DefaultAgent(
571
- name=name,
572
- description=description,
573
- model=model,
574
- input="trigger_time: str | Time of scheduled execution",
575
- output=output,
576
- tools=tools,
577
- servers=servers,
578
- temporal_activity_config=temporal_activity_config,
579
- use_cache=use_cache,
580
- temperature=temperature,
581
- next_agent=next_agent,
582
- **kwargs,
583
- )
584
- agent.config = agent_config # Assign the scheduled agent config
585
-
586
- return agent
587
-
588
-
589
- # ---- one-time deprecation warning helper ----
590
- _FACTORY_DEPRECATION_WARNED = False
591
- _factory_logger = get_logger("core.factory")
592
-
593
-
594
- def _maybe_warn_factory_deprecation() -> None: # pragma: no cover - side-effect
595
- global _FACTORY_DEPRECATION_WARNED
596
- if _FACTORY_DEPRECATION_WARNED:
597
- return
598
- flag = os.getenv("FLOCK_WARN_FACTORY_DEPRECATION", "1").strip()
599
- enabled = flag not in {"0", "false", "False", "off", "OFF"}
600
- if not enabled:
601
- _FACTORY_DEPRECATION_WARNED = True
602
- return
603
- msg = (
604
- "FlockFactory.create_default_agent is deprecated and will be removed in a future release. "
605
- "Please use DefaultAgent(...) instead. Set FLOCK_WARN_FACTORY_DEPRECATION=0 to disable this notice."
606
- )
607
- # Log and emit a warnings.warn once
608
- try:
609
- _factory_logger.warning(msg)
610
- except Exception:
611
- pass
612
- warnings.warn(msg, DeprecationWarning, stacklevel=2)
613
- _FACTORY_DEPRECATION_WARNED = True