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,97 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from pathlib import Path
4
- from typing import Any
5
-
6
- import numpy as np
7
-
8
- from .vector_base import VectorAdapter, VectorHit
9
-
10
-
11
- class FAISSAdapter(VectorAdapter):
12
- """Simple on-disk FAISS vector store.
13
-
14
- Index is stored in `index_path` (flat L2). Metadata & content are kept in a
15
- parallel JSONL file for quick prototyping; not optimised for massive scale.
16
- """
17
-
18
- def __init__(self, *, index_path: str = "./faiss.index") -> None:
19
- super().__init__()
20
- try:
21
- import faiss # type: ignore
22
- except ImportError as e:
23
- raise RuntimeError("faiss library is required for FAISSAdapter") from e
24
-
25
- self._faiss = __import__("faiss") # lazy alias
26
- self._index_path = Path(index_path)
27
- self._meta_path = self._index_path.with_suffix(".meta.jsonl")
28
- self._metadata: dict[int, dict[str, Any]] = {}
29
-
30
- if self._index_path.exists():
31
- self._index = self._faiss.read_index(str(self._index_path))
32
- # Load metadata
33
- if self._meta_path.exists():
34
- import json
35
-
36
- with open(self._meta_path) as f:
37
- for line_no, line in enumerate(f):
38
- self._metadata[line_no] = json.loads(line)
39
- else:
40
- self._index = None # created on first add
41
-
42
- # -----------------------------
43
- def _ensure_index(self, dim: int):
44
- if self._index is None:
45
- self._index = self._faiss.IndexFlatL2(dim)
46
-
47
- def add(
48
- self,
49
- *,
50
- id: str,
51
- content: str,
52
- embedding: list[float],
53
- metadata: dict[str, Any] | None = None,
54
- ) -> None:
55
- import json
56
-
57
- vec = np.array([embedding], dtype="float32")
58
- self._ensure_index(vec.shape[1])
59
- self._index.add(vec)
60
- # Row id is current size - 1
61
- row_id = self._index.ntotal - 1
62
- self._metadata[row_id] = {
63
- "id": id,
64
- "content": content,
65
- "metadata": metadata or {},
66
- }
67
- # Append metadata to file for persistence
68
- self._meta_path.parent.mkdir(parents=True, exist_ok=True)
69
- with open(self._meta_path, "a") as f:
70
- f.write(json.dumps(self._metadata[row_id]) + "\n")
71
- # Persist index lazily every 100 inserts
72
- if row_id % 100 == 0:
73
- self._faiss.write_index(self._index, str(self._index_path))
74
-
75
- def query(self, *, embedding: list[float], k: int) -> list[VectorHit]:
76
- if self._index is None or self._index.ntotal == 0:
77
- return []
78
- vec = np.array([embedding], dtype="float32")
79
- distances, indices = self._index.search(vec, k)
80
- hits: list[VectorHit] = []
81
- for dist, idx in zip(distances[0], indices[0]):
82
- if idx == -1:
83
- continue
84
- meta = self._metadata.get(idx, {})
85
- hits.append(
86
- VectorHit(
87
- id=meta.get("id", str(idx)),
88
- content=meta.get("content"),
89
- metadata=meta.get("metadata", {}),
90
- score=1 - float(dist), # approximate similarity
91
- )
92
- )
93
- return hits
94
-
95
- def close(self) -> None:
96
- if self._index is not None:
97
- self._faiss.write_index(self._index, str(self._index_path))
@@ -1,51 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Any
4
-
5
- from .vector_base import VectorAdapter, VectorHit
6
-
7
-
8
- class PineconeAdapter(VectorAdapter):
9
- """Adapter for Pinecone vector DB."""
10
-
11
- def __init__(
12
- self,
13
- *,
14
- api_key: str,
15
- environment: str,
16
- index: str,
17
- ) -> None:
18
- super().__init__()
19
- try:
20
- import pinecone
21
- except ImportError as e:
22
- raise RuntimeError("pinecone-client is required for PineconeAdapter") from e
23
-
24
- pinecone.init(api_key=api_key, environment=environment)
25
- self._index = pinecone.Index(index)
26
-
27
- # -------------------------------
28
- def add(
29
- self,
30
- *,
31
- id: str,
32
- content: str,
33
- embedding: list[float],
34
- metadata: dict[str, Any] | None = None,
35
- ) -> None:
36
- meta = {"content": content, **(metadata or {})}
37
- self._index.upsert(vectors=[(id, embedding, meta)])
38
-
39
- def query(self, *, embedding: list[float], k: int) -> list[VectorHit]:
40
- res = self._index.query(vector=embedding, top_k=k, include_values=False, include_metadata=True)
41
- hits: list[VectorHit] = []
42
- for match in res.matches or []:
43
- hits.append(
44
- VectorHit(
45
- id=match.id,
46
- content=match.metadata.get("content") if match.metadata else None,
47
- metadata={k: v for k, v in (match.metadata or {}).items() if k != "content"},
48
- score=match.score,
49
- )
50
- )
51
- return hits
@@ -1,47 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from dataclasses import dataclass
5
- from typing import Any
6
-
7
-
8
- @dataclass
9
- class VectorHit:
10
- """Result object returned from vector search."""
11
-
12
- id: str
13
- content: str | None
14
- metadata: dict[str, Any]
15
- score: float # similarity score (higher = more similar)
16
-
17
-
18
- class VectorAdapter(ABC):
19
- """Protocol for vector-store adapters."""
20
-
21
- def __init__(self, **kwargs):
22
- """Store-specific kwargs are passed through subclass constructor."""
23
- super().__init__()
24
-
25
- # ----------------------
26
- # CRUD operations
27
- # ----------------------
28
- @abstractmethod
29
- def add(
30
- self,
31
- *,
32
- id: str,
33
- content: str,
34
- embedding: list[float],
35
- metadata: dict[str, Any] | None = None,
36
- ) -> None: # pragma: no cover – interface
37
- """Insert or upsert a single document."""
38
-
39
- @abstractmethod
40
- def query(
41
- self, *, embedding: list[float], k: int
42
- ) -> list[VectorHit]: # pragma: no cover – interface
43
- """Return top-k most similar hits."""
44
-
45
- def close(self) -> None: # Optional override
46
- """Free resources / flush buffers."""
47
- return
@@ -1,140 +0,0 @@
1
- # Flock v0.3 - Hummingbird
2
-
3
- We're excited to announce Flock v0.3, codenamed **"Hummingbird"**! This release brings a fundamental redesign of Flock's core architecture, introducing **unprecedented modularity and flexibility** to AI agent development.
4
-
5
- Modules and evaluators were the last missing pieces to fully modularize Flock.
6
-
7
- Worried this might lead to hard-to-manage boilerplate? No problem! **FlockFactory** provides pre-configured agents, making interaction with modules and evaluators **purely optional**, so you can focus on **what** the agent does, not **how** it works.
8
-
9
- But if you want **total control** over your agent, feel free to dive into these new additions. They unlock **crazy new possibilities** in Flock!
10
-
11
- Like a hummingbird, modules are small and nimble code packages. Put enough of them inside a flock, and... well, even we don't know what happens next.
12
-
13
- ### Other notable additions:
14
- - **CLI Interface** – Flock now has a command-line interface
15
- - **REST API Server** – Expose your agents via HTTP endpoints
16
- - **Color-coded logging** – Better debugging experience
17
- - **New examples**
18
- - ...and much more!
19
-
20
- ---
21
-
22
- ## Core Changes
23
-
24
- ### New Module System
25
- - **Pluggable modules system á la FastAPI**
26
- - **Easy-to-implement** module interface
27
- - **Configuration system** for clean parameter management
28
-
29
- ### New Evaluator System
30
- - **Pluggable evaluation system**
31
- - Built-in support for multiple evaluation strategies:
32
- - **Declarative Evaluator** – The default way Flock is designed
33
- - **Natural Language Evaluator** – Use "classic" prompting
34
- - **Zep Evaluator** – Add or query data
35
- - **Easily extendable** with custom evaluation approaches
36
-
37
- ### New Router System
38
- - **Pluggable router system** for dynamic agent chaining
39
- - Built-in support for multiple routing strategies:
40
- - **Default Router** – Uses the agent's hand_off property
41
- - **LLM Router** – Uses an LLM to determine the next agent
42
- - **Agent Router** – Uses a dedicated agent to make routing decisions
43
- - **Easily extendable** with custom routing approaches
44
-
45
- ### REST API Server
46
- - **FastAPI-based** HTTP server for exposing agents
47
- - **Synchronous and asynchronous** execution modes
48
- - **Run status tracking** with unique run IDs
49
- - **Agent discovery** endpoint to list available agents
50
- - **Simple integration** with existing Flock instances
51
-
52
- ### Auto-Handoff Feature
53
- - **Dynamic agent chaining** without explicit handoff definitions
54
- - **LLM-powered routing** to determine the best next agent
55
- - **Emergent behavior** in multi-agent systems
56
- - **Simple to use** with the "auto_handoff" string value
57
-
58
- ### New high end examples like the Repository Analyzer
59
- - **Automatic documentation generation** for any codebase
60
- - **Rule-based version** using custom evaluators
61
- - **LLM-based version** for more flexible and powerful analysis
62
- - **Comprehensive documentation** including overview, architecture, components, and more
63
-
64
- ### FlockFactory
65
- - Provides **pre-configured agents**, so you don't have to manage modules and evaluators manually!
66
-
67
- ### Built-in Modules
68
- - **Memory Module** – Persistent agent memory
69
- - **Output Module** – Advanced output formatting and storage
70
- - **Metrics Module** – Detailed performance tracking
71
- - **Zep Module** – Uses Zep for Knowledge Graphs
72
- - **Azure Search Tools** – Integration with Azure AI Search for vector search and document retrieval
73
-
74
- ---
75
-
76
- ## Breaking Changes
77
- - **Removed callback handlers** from `FlockAgent` in favor of modules
78
- - **Changed agent initialization** pattern to support evaluators
79
- - **Simplified module lifecycle hooks** (removed redundant pre/post hooks)
80
-
81
- ---
82
-
83
- ## Small Changes & Fixes
84
-
85
- ### Theme Designer
86
-
87
- ### Color Coded Logging
88
-
89
- ---
90
-
91
- ## Code Rundown
92
-
93
- ### Old way:
94
- ```python
95
- agent = FlockAgent(
96
- name="bloggy",
97
- input="blog_idea",
98
- output="funny_blog_title, blog_headers",
99
- )
100
- flock.add_agent(bloggy)
101
- ```
102
-
103
- ### New way:
104
- ```python
105
- bloggy = FlockFactory.create_default_agent(
106
- name="bloggy",
107
- input="blog_idea",
108
- output="funny_blog_title, blog_headers",
109
- )
110
- flock.add_agent(bloggy)
111
- ```
112
-
113
- See? **Basically nothing changed!** Just more modular and flexible.
114
-
115
- ---
116
-
117
- ## What's Next?
118
-
119
- ### Coming in v0.3 updates:
120
- - **More modules** (built-in RAG coming soon!)
121
- - **More evaluators**
122
- - **CLI management tool improvements**
123
- - **Finishing documentation**
124
-
125
- ### Looking ahead to v0.4 – *Magpie*:
126
- - **Flock WebUI** – Real-time monitoring, no-code agent creation & management
127
- - **Seamless deployment** – Kubernetes, Docker, and enterprise-ready solutions
128
-
129
- ---
130
-
131
- ## Installation
132
-
133
- ```bash
134
- pip install flock-core>=0.3.0
135
- ```
136
-
137
- ---
138
-
139
- **Full documentation**: [https://whiteducksoftware.github.io/flock](https://whiteducksoftware.github.io/flock)
140
- **GitHub**: [https://github.com/whiteducksoftware/flock](https://github.com/whiteducksoftware/flock)
flock/cli/config.py DELETED
@@ -1,8 +0,0 @@
1
- def init_config_file():
2
- """Initialize the config file."""
3
- pass
4
-
5
-
6
- def load_config_file():
7
- """Load the config file."""
8
- pass
flock/cli/constants.py DELETED
@@ -1,36 +0,0 @@
1
- """Constants for the CLI module."""
2
-
3
- CLI_CFG_FILE = ".env"
4
- CLI_DEFAULT_ENV_VARS = {
5
- "FLICK_API_KEY": "flock-api-key",
6
- "FLICK_API_URL": "https://api.flock.com",
7
- "FLICK_API_VERSION": "v1",
8
- "FLICK_API_KEY": "flock-api-key",
9
- "FLICK_API_URL": "https://api.flock.com",
10
- "FLICK_API_VERSION": "v1",
11
- }
12
- CLI_DEFAULT_FOLDER = ".flock"
13
-
14
- CLI_CREATE_AGENT = "Create an agent"
15
- CLI_CREATE_FLOCK = "Create a new Flock"
16
- CLI_LOAD_AGENT = "Load an agent"
17
- CLI_LOAD_FLOCK = "Load a *.flock file"
18
- CLI_THEME_BUILDER = "Theme builder"
19
- CLI_LOAD_EXAMPLE = "Load a example"
20
- CLI_SETTINGS = "Settings"
21
- CLI_NOTES = "'Magpie' release notes"
22
- CLI_START_WEB_SERVER = "Start web server"
23
- CLI_REGISTRY_MANAGEMENT = "Registry management"
24
- CLI_EXIT = "Exit"
25
- CLI_CHOICES = [
26
- CLI_CREATE_AGENT,
27
- CLI_CREATE_FLOCK,
28
- CLI_LOAD_AGENT,
29
- CLI_LOAD_FLOCK,
30
- CLI_LOAD_EXAMPLE,
31
- CLI_THEME_BUILDER,
32
- CLI_REGISTRY_MANAGEMENT,
33
- CLI_SETTINGS,
34
- CLI_START_WEB_SERVER,
35
- CLI_EXIT,
36
- ]
flock/cli/create_agent.py DELETED
@@ -1 +0,0 @@
1
- # TODO
flock/cli/create_flock.py DELETED
@@ -1,280 +0,0 @@
1
- """Create a new Flock through a guided wizard.
2
-
3
- This module provides a wizard-like interface for creating new Flock instances,
4
- with options for basic configuration and initial agent creation.
5
- """
6
-
7
- from datetime import datetime
8
- from pathlib import Path
9
-
10
- import questionary
11
- from rich.console import Console
12
- from rich.panel import Panel
13
-
14
- from flock.cli.constants import CLI_DEFAULT_FOLDER
15
- from flock.cli.loaded_flock_cli import start_loaded_flock_cli
16
- from flock.core.flock import Flock
17
- from flock.core.flock_factory import FlockFactory
18
- from flock.core.logging.logging import get_logger
19
- from flock.core.util.cli_helper import init_console
20
-
21
- # Create console instance
22
- console = Console()
23
- logger = get_logger("cli.create_flock")
24
-
25
-
26
- def create_flock():
27
- """Create a new Flock through a guided wizard."""
28
- init_console()
29
- console.print(Panel("[bold green]Create New Flock[/]"), justify="center")
30
- console.line()
31
-
32
- # Step 1: Basic Flock Configuration
33
- console.print("[bold]Step 1: Basic Flock Configuration[/]")
34
- console.line()
35
-
36
- flock_name = questionary.text(
37
- "Enter a name for this Flock:",
38
- default="",
39
- ).ask()
40
-
41
- # Get description
42
- description = questionary.text(
43
- "Enter a description for this Flock (optional):",
44
- default="",
45
- ).ask()
46
-
47
- # Default model selection
48
- default_models = [
49
- "openai/gpt-4o",
50
- "openai/gpt-3.5-turbo",
51
- "anthropic/claude-3-opus-20240229",
52
- "anthropic/claude-3-sonnet-20240229",
53
- "gemini/gemini-1.5-pro",
54
- "Other (specify)",
55
- ]
56
-
57
- model_choice = questionary.select(
58
- "Select a default model:",
59
- choices=default_models,
60
- ).ask()
61
-
62
- if model_choice == "Other (specify)":
63
- model = questionary.text(
64
- "Enter the model identifier:",
65
- default="openai/gpt-4o",
66
- ).ask()
67
- else:
68
- model = model_choice
69
-
70
- # Execution options
71
- # enable_temporal = questionary.confirm(
72
- # "Enable Temporal for distributed execution?",
73
- # default=False,
74
- # ).ask()
75
- enable_temporal = False
76
-
77
- # Create the Flock instance
78
- flock = Flock(
79
- name=flock_name,
80
- model=model,
81
- description=description,
82
- enable_temporal=enable_temporal,
83
- )
84
-
85
- console.print("\n[green]✓[/] Flock created successfully!")
86
- console.line()
87
-
88
- # Step 2: Create Initial Agent (optional)
89
- create_agent = questionary.confirm(
90
- "Would you like to create an initial agent?",
91
- default=True,
92
- ).ask()
93
-
94
- if create_agent:
95
- _create_initial_agent(flock)
96
-
97
- # Step 3: Save Options
98
- console.print("\n[bold]Step 3: Save Options[/]")
99
- console.line()
100
-
101
- save_choice = questionary.select(
102
- "What would you like to do with this Flock?",
103
- choices=[
104
- "Save to YAML file",
105
- "Continue in CLI without saving",
106
- "Execute immediately",
107
- "Cancel and discard",
108
- ],
109
- ).ask()
110
-
111
- if save_choice == "Save to YAML file":
112
- _save_flock_to_yaml(flock)
113
-
114
- # Ask if user wants to continue working with this Flock
115
- continue_with_flock = questionary.confirm(
116
- "Would you like to continue working with this Flock in the CLI?",
117
- default=True,
118
- ).ask()
119
-
120
- if continue_with_flock:
121
- start_loaded_flock_cli(flock, server_name="New Flock")
122
-
123
- elif save_choice == "Continue in CLI without saving":
124
- start_loaded_flock_cli(flock, server_name="New Flock")
125
-
126
- elif save_choice == "Execute immediately":
127
- from flock.cli.execute_flock import execute_flock
128
-
129
- try:
130
- execute_flock(flock)
131
- except ImportError:
132
- console.print(
133
- "[yellow]Execute functionality not yet implemented.[/]"
134
- )
135
- input("\nPress Enter to continue...")
136
- start_loaded_flock_cli(flock, server_name="New Flock")
137
-
138
-
139
- def _create_initial_agent(flock):
140
- """Create an initial agent for the Flock.
141
-
142
- Args:
143
- flock: The Flock instance to add the agent to
144
- """
145
- console.print("\n[bold]Step 2: Create Initial Agent[/]")
146
- console.line()
147
-
148
- # Get agent name
149
- name = questionary.text(
150
- "Enter a name for the agent:",
151
- default="my_agent",
152
- ).ask()
153
-
154
- # Get agent description
155
- description = questionary.text(
156
- "Enter a description for the agent (optional):",
157
- default="",
158
- ).ask()
159
-
160
- # Get input specification
161
- input_spec = questionary.text(
162
- "Enter input specification (e.g., 'query: str | The search query'):",
163
- default="query",
164
- ).ask()
165
-
166
- # Get output specification
167
- output_spec = questionary.text(
168
- "Enter output specification (e.g., 'result: str | The generated result'):",
169
- default="result",
170
- ).ask()
171
-
172
- # Additional options
173
- use_cache = questionary.confirm(
174
- "Enable caching for this agent?",
175
- default=True,
176
- ).ask()
177
-
178
- enable_rich_tables = questionary.confirm(
179
- "Enable rich table output for this agent?",
180
- default=True,
181
- ).ask()
182
-
183
- # Create the agent
184
- agent = FlockFactory.create_default_agent(
185
- name=name,
186
- description=description,
187
- input=input_spec,
188
- output=output_spec,
189
- use_cache=use_cache,
190
- enable_rich_tables=enable_rich_tables,
191
- )
192
-
193
- # Add the agent to the Flock
194
- flock.add_agent(agent)
195
- console.print(f"\n[green]✓[/] Agent '{name}' created and added to Flock!")
196
-
197
-
198
- def _save_flock_to_yaml(flock):
199
- """Save the Flock to a YAML file.
200
-
201
- Args:
202
- flock: The Flock instance to save
203
- """
204
- # Get file path
205
- # default = flock.name + current date in 04_04_2025 format
206
- default_name = f"{flock.name}_{datetime.now().strftime('%m_%d_%Y')}"
207
- file_path = questionary.text(
208
- "Enter file path to save Flock:",
209
- default=default_name,
210
- ).ask()
211
-
212
- # Ensure the file has the correct extension
213
- if not file_path.endswith((".yaml", ".yml")):
214
- file_path += ".flock.yaml"
215
-
216
- file_path = CLI_DEFAULT_FOLDER + "/" + file_path
217
-
218
- # Create directory if it doesn't exist
219
- save_path = Path(file_path)
220
- save_path.parent.mkdir(parents=True, exist_ok=True)
221
-
222
- # Ask about path_type
223
- path_type_choice = questionary.select(
224
- "How should file paths be formatted?",
225
- choices=[
226
- "absolute (full paths, best for local use)",
227
- "relative (relative paths, better for sharing)",
228
- ],
229
- default="absolute (full paths, best for local use)",
230
- ).ask()
231
-
232
- # Extract just the first word
233
- path_type = path_type_choice.split()[0]
234
-
235
- console.print(
236
- f"[bold]Path type selected: [green]{path_type}[/green][/bold]"
237
- )
238
-
239
- try:
240
- # Check if the flock has tools to provide a helpful message
241
- has_tools = False
242
- for agent in flock.agents.values():
243
- if agent.tools and len(agent.tools) > 0:
244
- has_tools = True
245
- break
246
-
247
- # Save the Flock to YAML with proper tool serialization
248
- logger.info(f"Saving Flock to {file_path}")
249
- flock.to_yaml_file(file_path, path_type=path_type)
250
- console.print(
251
- f"\n[green]✓[/] Flock saved to {file_path} with {path_type} paths"
252
- )
253
-
254
- # Provide helpful information about tool serialization
255
- if has_tools:
256
- console.print("\n[bold blue]Tools Information:[/]")
257
- console.print(
258
- "This Flock contains tools that have been serialized as callable references."
259
- )
260
- console.print(
261
- "When loading this Flock on another system, ensure that:"
262
- )
263
- console.print(
264
- " - The tools/functions are registered in the Flock registry"
265
- )
266
- console.print(
267
- " - The containing modules are available in the Python path"
268
- )
269
- except Exception as e:
270
- logger.error(f"Error saving Flock: {e}", exc_info=True)
271
- console.print(f"\n[bold red]Error saving Flock:[/] {e!s}")
272
-
273
- # Provide guidance on potential issues with tool serialization
274
- if "callable" in str(e).lower() or "registry" in str(e).lower():
275
- console.print(
276
- "\n[yellow]This error might be related to tool serialization.[/]"
277
- )
278
- console.print(
279
- "[yellow]Check if all tools are properly registered in the Flock registry.[/]"
280
- )