flock-core 0.4.543__py3-none-any.whl → 0.5.0__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 (501) hide show
  1. flock/__init__.py +12 -217
  2. flock/agent.py +1079 -0
  3. flock/api/themes.py +71 -0
  4. flock/artifacts.py +86 -0
  5. flock/cli.py +147 -0
  6. flock/components.py +189 -0
  7. flock/dashboard/__init__.py +30 -0
  8. flock/dashboard/collector.py +559 -0
  9. flock/dashboard/events.py +188 -0
  10. flock/dashboard/graph_builder.py +563 -0
  11. flock/dashboard/launcher.py +235 -0
  12. flock/dashboard/models/graph.py +156 -0
  13. flock/dashboard/service.py +991 -0
  14. flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
  15. flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
  16. flock/dashboard/static_v2/index.html +13 -0
  17. flock/dashboard/websocket.py +246 -0
  18. flock/engines/__init__.py +6 -0
  19. flock/engines/dspy_engine.py +932 -0
  20. flock/examples.py +131 -0
  21. flock/frontend/README.md +778 -0
  22. flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
  23. flock/frontend/index.html +12 -0
  24. flock/frontend/package-lock.json +4337 -0
  25. flock/frontend/package.json +48 -0
  26. flock/frontend/src/App.tsx +139 -0
  27. flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
  28. flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
  29. flock/frontend/src/components/common/BuildInfo.tsx +39 -0
  30. flock/frontend/src/components/common/EmptyState.module.css +115 -0
  31. flock/frontend/src/components/common/EmptyState.tsx +128 -0
  32. flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
  33. flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
  34. flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
  35. flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
  36. flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
  37. flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
  38. flock/frontend/src/components/controls/PublishControl.css +547 -0
  39. flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
  40. flock/frontend/src/components/controls/PublishControl.tsx +432 -0
  41. flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
  42. flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
  43. flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
  44. flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
  45. flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
  46. flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
  47. flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
  48. flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
  49. flock/frontend/src/components/details/tabs.test.tsx +1015 -0
  50. flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
  51. flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
  52. flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
  53. flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
  54. flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
  55. flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
  56. flock/frontend/src/components/filters/FilterPills.module.css +220 -0
  57. flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
  58. flock/frontend/src/components/filters/FilterPills.tsx +143 -0
  59. flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
  60. flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
  61. flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
  62. flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
  63. flock/frontend/src/components/filters/TagFilter.tsx +21 -0
  64. flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
  65. flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
  66. flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
  67. flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
  68. flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
  69. flock/frontend/src/components/graph/AgentNode.tsx +324 -0
  70. flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
  71. flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
  72. flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
  73. flock/frontend/src/components/graph/MessageNode.tsx +129 -0
  74. flock/frontend/src/components/graph/MiniMap.tsx +47 -0
  75. flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
  76. flock/frontend/src/components/layout/DashboardLayout.css +420 -0
  77. flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
  78. flock/frontend/src/components/layout/Header.module.css +88 -0
  79. flock/frontend/src/components/layout/Header.tsx +52 -0
  80. flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
  81. flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
  82. flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
  83. flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
  84. flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
  85. flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
  86. flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
  87. flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
  88. flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
  89. flock/frontend/src/components/modules/registerModules.ts +29 -0
  90. flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
  91. flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
  92. flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
  93. flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
  94. flock/frontend/src/components/settings/SettingsPanel.css +327 -0
  95. flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
  96. flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
  97. flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
  98. flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
  99. flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
  100. flock/frontend/src/hooks/useModulePersistence.ts +154 -0
  101. flock/frontend/src/hooks/useModules.ts +157 -0
  102. flock/frontend/src/hooks/usePersistence.ts +141 -0
  103. flock/frontend/src/main.tsx +13 -0
  104. flock/frontend/src/services/api.ts +337 -0
  105. flock/frontend/src/services/graphService.test.ts +330 -0
  106. flock/frontend/src/services/graphService.ts +75 -0
  107. flock/frontend/src/services/indexeddb.test.ts +793 -0
  108. flock/frontend/src/services/indexeddb.ts +848 -0
  109. flock/frontend/src/services/layout.test.ts +437 -0
  110. flock/frontend/src/services/layout.ts +357 -0
  111. flock/frontend/src/services/themeApplicator.ts +140 -0
  112. flock/frontend/src/services/themeService.ts +77 -0
  113. flock/frontend/src/services/websocket.ts +650 -0
  114. flock/frontend/src/store/filterStore.test.ts +250 -0
  115. flock/frontend/src/store/filterStore.ts +272 -0
  116. flock/frontend/src/store/graphStore.test.ts +570 -0
  117. flock/frontend/src/store/graphStore.ts +462 -0
  118. flock/frontend/src/store/moduleStore.test.ts +253 -0
  119. flock/frontend/src/store/moduleStore.ts +75 -0
  120. flock/frontend/src/store/settingsStore.ts +188 -0
  121. flock/frontend/src/store/streamStore.ts +68 -0
  122. flock/frontend/src/store/uiStore.test.ts +54 -0
  123. flock/frontend/src/store/uiStore.ts +122 -0
  124. flock/frontend/src/store/wsStore.ts +34 -0
  125. flock/frontend/src/styles/index.css +15 -0
  126. flock/frontend/src/styles/scrollbar.css +47 -0
  127. flock/frontend/src/styles/variables.css +488 -0
  128. flock/frontend/src/test/setup.ts +1 -0
  129. flock/frontend/src/types/filters.ts +47 -0
  130. flock/frontend/src/types/graph.ts +95 -0
  131. flock/frontend/src/types/modules.ts +10 -0
  132. flock/frontend/src/types/theme.ts +55 -0
  133. flock/frontend/src/utils/artifacts.ts +24 -0
  134. flock/frontend/src/utils/mockData.ts +98 -0
  135. flock/frontend/src/utils/performance.ts +16 -0
  136. flock/frontend/src/vite-env.d.ts +17 -0
  137. flock/frontend/tsconfig.json +27 -0
  138. flock/frontend/tsconfig.node.json +11 -0
  139. flock/frontend/vite.config.ts +25 -0
  140. flock/frontend/vitest.config.ts +11 -0
  141. flock/{core/util → helper}/cli_helper.py +9 -5
  142. flock/{core/logging → logging}/__init__.py +2 -3
  143. flock/logging/auto_trace.py +159 -0
  144. flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
  145. flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
  146. flock/{core/logging → logging}/formatters/themed_formatter.py +69 -107
  147. flock/{core/logging → logging}/logging.py +78 -61
  148. flock/{core/logging → logging}/telemetry.py +66 -26
  149. flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
  150. flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
  151. flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
  152. flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
  153. flock/logging/trace_and_logged.py +304 -0
  154. flock/mcp/__init__.py +91 -0
  155. flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
  156. flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
  157. flock/mcp/manager.py +286 -0
  158. flock/mcp/servers/sse/__init__.py +1 -1
  159. flock/mcp/servers/sse/flock_sse_server.py +16 -58
  160. flock/mcp/servers/stdio/__init__.py +1 -1
  161. flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
  162. flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
  163. flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
  164. flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
  165. flock/mcp/types/__init__.py +42 -0
  166. flock/{core/mcp → mcp}/types/callbacks.py +12 -15
  167. flock/{core/mcp → mcp}/types/factories.py +7 -6
  168. flock/{core/mcp → mcp}/types/handlers.py +13 -18
  169. flock/{core/mcp → mcp}/types/types.py +70 -74
  170. flock/{core/mcp → mcp}/util/helpers.py +3 -3
  171. flock/orchestrator.py +970 -0
  172. flock/registry.py +148 -0
  173. flock/runtime.py +262 -0
  174. flock/service.py +277 -0
  175. flock/store.py +1214 -0
  176. flock/subscription.py +111 -0
  177. flock/themes/andromeda.toml +1 -1
  178. flock/themes/apple-system-colors.toml +1 -1
  179. flock/themes/arcoiris.toml +1 -1
  180. flock/themes/atomonelight.toml +1 -1
  181. flock/themes/ayu copy.toml +1 -1
  182. flock/themes/ayu-light.toml +1 -1
  183. flock/themes/belafonte-day.toml +1 -1
  184. flock/themes/belafonte-night.toml +1 -1
  185. flock/themes/blulocodark.toml +1 -1
  186. flock/themes/breeze.toml +1 -1
  187. flock/themes/broadcast.toml +1 -1
  188. flock/themes/brogrammer.toml +1 -1
  189. flock/themes/builtin-dark.toml +1 -1
  190. flock/themes/builtin-pastel-dark.toml +1 -1
  191. flock/themes/catppuccin-latte.toml +1 -1
  192. flock/themes/catppuccin-macchiato.toml +1 -1
  193. flock/themes/catppuccin-mocha.toml +1 -1
  194. flock/themes/cga.toml +1 -1
  195. flock/themes/chalk.toml +1 -1
  196. flock/themes/ciapre.toml +1 -1
  197. flock/themes/coffee-theme.toml +1 -1
  198. flock/themes/cyberpunkscarletprotocol.toml +1 -1
  199. flock/themes/dark+.toml +1 -1
  200. flock/themes/darkermatrix.toml +1 -1
  201. flock/themes/darkmatrix.toml +2 -2
  202. flock/themes/darkside.toml +1 -1
  203. flock/themes/deep.toml +2 -2
  204. flock/themes/desert.toml +1 -1
  205. flock/themes/django.toml +1 -1
  206. flock/themes/djangosmooth.toml +1 -1
  207. flock/themes/doomone.toml +1 -1
  208. flock/themes/dotgov.toml +1 -1
  209. flock/themes/dracula+.toml +1 -1
  210. flock/themes/duckbones.toml +1 -1
  211. flock/themes/encom.toml +1 -1
  212. flock/themes/espresso.toml +1 -1
  213. flock/themes/everblush.toml +1 -1
  214. flock/themes/fairyfloss.toml +1 -1
  215. flock/themes/fideloper.toml +1 -1
  216. flock/themes/fishtank.toml +1 -1
  217. flock/themes/flexoki-light.toml +1 -1
  218. flock/themes/floraverse.toml +1 -1
  219. flock/themes/framer.toml +1 -1
  220. flock/themes/galizur.toml +1 -1
  221. flock/themes/github.toml +1 -1
  222. flock/themes/grass.toml +1 -1
  223. flock/themes/grey-green.toml +1 -1
  224. flock/themes/gruvboxlight.toml +1 -1
  225. flock/themes/guezwhoz.toml +1 -1
  226. flock/themes/harper.toml +1 -1
  227. flock/themes/hax0r-blue.toml +1 -1
  228. flock/themes/hopscotch.256.toml +1 -1
  229. flock/themes/ic-green-ppl.toml +1 -1
  230. flock/themes/iceberg-dark.toml +1 -1
  231. flock/themes/japanesque.toml +1 -1
  232. flock/themes/jubi.toml +1 -1
  233. flock/themes/kibble.toml +1 -1
  234. flock/themes/kolorit.toml +1 -1
  235. flock/themes/kurokula.toml +1 -1
  236. flock/themes/materialdesigncolors.toml +1 -1
  237. flock/themes/matrix.toml +1 -1
  238. flock/themes/mellifluous.toml +1 -1
  239. flock/themes/midnight-in-mojave.toml +1 -1
  240. flock/themes/monokai-remastered.toml +1 -1
  241. flock/themes/monokai-soda.toml +1 -1
  242. flock/themes/neon.toml +1 -1
  243. flock/themes/neopolitan.toml +5 -5
  244. flock/themes/nord-light.toml +1 -1
  245. flock/themes/ocean.toml +1 -1
  246. flock/themes/onehalfdark.toml +1 -1
  247. flock/themes/onehalflight.toml +1 -1
  248. flock/themes/palenighthc.toml +1 -1
  249. flock/themes/paulmillr.toml +1 -1
  250. flock/themes/pencildark.toml +1 -1
  251. flock/themes/pnevma.toml +1 -1
  252. flock/themes/purple-rain.toml +1 -1
  253. flock/themes/purplepeter.toml +1 -1
  254. flock/themes/raycast-dark.toml +1 -1
  255. flock/themes/red-sands.toml +1 -1
  256. flock/themes/relaxed.toml +1 -1
  257. flock/themes/retro.toml +1 -1
  258. flock/themes/rose-pine.toml +1 -1
  259. flock/themes/royal.toml +1 -1
  260. flock/themes/ryuuko.toml +1 -1
  261. flock/themes/sakura.toml +1 -1
  262. flock/themes/scarlet-protocol.toml +1 -1
  263. flock/themes/seoulbones-dark.toml +1 -1
  264. flock/themes/shades-of-purple.toml +1 -1
  265. flock/themes/smyck.toml +1 -1
  266. flock/themes/softserver.toml +1 -1
  267. flock/themes/solarized-darcula.toml +1 -1
  268. flock/themes/square.toml +1 -1
  269. flock/themes/sugarplum.toml +1 -1
  270. flock/themes/thayer-bright.toml +1 -1
  271. flock/themes/tokyonight.toml +1 -1
  272. flock/themes/tomorrow.toml +1 -1
  273. flock/themes/ubuntu.toml +1 -1
  274. flock/themes/ultradark.toml +1 -1
  275. flock/themes/ultraviolent.toml +1 -1
  276. flock/themes/unikitty.toml +1 -1
  277. flock/themes/urple.toml +1 -1
  278. flock/themes/vesper.toml +1 -1
  279. flock/themes/vimbones.toml +1 -1
  280. flock/themes/wildcherry.toml +1 -1
  281. flock/themes/wilmersdorf.toml +1 -1
  282. flock/themes/wryan.toml +1 -1
  283. flock/themes/xcodedarkhc.toml +1 -1
  284. flock/themes/xcodelight.toml +1 -1
  285. flock/themes/zenbones-light.toml +1 -1
  286. flock/themes/zenwritten-dark.toml +1 -1
  287. flock/utilities.py +301 -0
  288. flock/utility/output_utility_component.py +226 -0
  289. flock/visibility.py +107 -0
  290. flock_core-0.5.0.dist-info/METADATA +964 -0
  291. flock_core-0.5.0.dist-info/RECORD +525 -0
  292. flock_core-0.5.0.dist-info/entry_points.txt +2 -0
  293. {flock_core-0.4.543.dist-info → flock_core-0.5.0.dist-info}/licenses/LICENSE +1 -1
  294. flock/adapter/__init__.py +0 -14
  295. flock/adapter/azure_adapter.py +0 -68
  296. flock/adapter/chroma_adapter.py +0 -73
  297. flock/adapter/faiss_adapter.py +0 -97
  298. flock/adapter/pinecone_adapter.py +0 -51
  299. flock/adapter/vector_base.py +0 -47
  300. flock/cli/assets/release_notes.md +0 -140
  301. flock/cli/config.py +0 -8
  302. flock/cli/constants.py +0 -36
  303. flock/cli/create_agent.py +0 -1
  304. flock/cli/create_flock.py +0 -280
  305. flock/cli/execute_flock.py +0 -620
  306. flock/cli/load_agent.py +0 -1
  307. flock/cli/load_examples.py +0 -1
  308. flock/cli/load_flock.py +0 -192
  309. flock/cli/load_release_notes.py +0 -20
  310. flock/cli/loaded_flock_cli.py +0 -254
  311. flock/cli/manage_agents.py +0 -459
  312. flock/cli/registry_management.py +0 -889
  313. flock/cli/runner.py +0 -41
  314. flock/cli/settings.py +0 -857
  315. flock/cli/utils.py +0 -135
  316. flock/cli/view_results.py +0 -29
  317. flock/cli/yaml_editor.py +0 -396
  318. flock/config.py +0 -56
  319. flock/core/__init__.py +0 -44
  320. flock/core/api/__init__.py +0 -10
  321. flock/core/api/custom_endpoint.py +0 -45
  322. flock/core/api/endpoints.py +0 -262
  323. flock/core/api/main.py +0 -162
  324. flock/core/api/models.py +0 -101
  325. flock/core/api/run_store.py +0 -224
  326. flock/core/api/runner.py +0 -44
  327. flock/core/api/service.py +0 -214
  328. flock/core/config/flock_agent_config.py +0 -11
  329. flock/core/config/scheduled_agent_config.py +0 -40
  330. flock/core/context/context.py +0 -214
  331. flock/core/context/context_manager.py +0 -40
  332. flock/core/context/context_vars.py +0 -11
  333. flock/core/evaluation/utils.py +0 -395
  334. flock/core/execution/batch_executor.py +0 -369
  335. flock/core/execution/evaluation_executor.py +0 -438
  336. flock/core/execution/local_executor.py +0 -31
  337. flock/core/execution/opik_executor.py +0 -103
  338. flock/core/execution/temporal_executor.py +0 -166
  339. flock/core/flock.py +0 -1003
  340. flock/core/flock_agent.py +0 -1258
  341. flock/core/flock_evaluator.py +0 -60
  342. flock/core/flock_factory.py +0 -513
  343. flock/core/flock_module.py +0 -207
  344. flock/core/flock_registry.py +0 -702
  345. flock/core/flock_router.py +0 -83
  346. flock/core/flock_scheduler.py +0 -166
  347. flock/core/flock_server_manager.py +0 -136
  348. flock/core/interpreter/python_interpreter.py +0 -689
  349. flock/core/logging/live_capture.py +0 -137
  350. flock/core/logging/trace_and_logged.py +0 -59
  351. flock/core/mcp/__init__.py +0 -1
  352. flock/core/mcp/flock_mcp_server.py +0 -640
  353. flock/core/mcp/mcp_client_manager.py +0 -201
  354. flock/core/mcp/types/__init__.py +0 -1
  355. flock/core/mixin/dspy_integration.py +0 -445
  356. flock/core/mixin/prompt_parser.py +0 -125
  357. flock/core/serialization/__init__.py +0 -13
  358. flock/core/serialization/callable_registry.py +0 -52
  359. flock/core/serialization/flock_serializer.py +0 -854
  360. flock/core/serialization/json_encoder.py +0 -41
  361. flock/core/serialization/secure_serializer.py +0 -175
  362. flock/core/serialization/serializable.py +0 -342
  363. flock/core/serialization/serialization_utils.py +0 -409
  364. flock/core/util/file_path_utils.py +0 -223
  365. flock/core/util/hydrator.py +0 -309
  366. flock/core/util/input_resolver.py +0 -141
  367. flock/core/util/loader.py +0 -59
  368. flock/core/util/splitter.py +0 -219
  369. flock/di.py +0 -41
  370. flock/evaluators/__init__.py +0 -1
  371. flock/evaluators/declarative/__init__.py +0 -1
  372. flock/evaluators/declarative/declarative_evaluator.py +0 -217
  373. flock/evaluators/memory/memory_evaluator.py +0 -90
  374. flock/evaluators/test/test_case_evaluator.py +0 -38
  375. flock/evaluators/zep/zep_evaluator.py +0 -59
  376. flock/modules/__init__.py +0 -1
  377. flock/modules/assertion/__init__.py +0 -1
  378. flock/modules/assertion/assertion_module.py +0 -286
  379. flock/modules/callback/__init__.py +0 -1
  380. flock/modules/callback/callback_module.py +0 -91
  381. flock/modules/enterprise_memory/README.md +0 -99
  382. flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
  383. flock/modules/mem0/__init__.py +0 -1
  384. flock/modules/mem0/mem0_module.py +0 -126
  385. flock/modules/mem0_async/__init__.py +0 -1
  386. flock/modules/mem0_async/async_mem0_module.py +0 -126
  387. flock/modules/memory/__init__.py +0 -1
  388. flock/modules/memory/memory_module.py +0 -429
  389. flock/modules/memory/memory_parser.py +0 -125
  390. flock/modules/memory/memory_storage.py +0 -736
  391. flock/modules/output/__init__.py +0 -1
  392. flock/modules/output/output_module.py +0 -196
  393. flock/modules/performance/__init__.py +0 -1
  394. flock/modules/performance/metrics_module.py +0 -678
  395. flock/modules/zep/__init__.py +0 -1
  396. flock/modules/zep/zep_module.py +0 -192
  397. flock/platform/docker_tools.py +0 -49
  398. flock/platform/jaeger_install.py +0 -86
  399. flock/routers/__init__.py +0 -1
  400. flock/routers/agent/__init__.py +0 -1
  401. flock/routers/agent/agent_router.py +0 -236
  402. flock/routers/agent/handoff_agent.py +0 -58
  403. flock/routers/conditional/conditional_router.py +0 -486
  404. flock/routers/default/__init__.py +0 -1
  405. flock/routers/default/default_router.py +0 -80
  406. flock/routers/feedback/feedback_router.py +0 -114
  407. flock/routers/list_generator/list_generator_router.py +0 -166
  408. flock/routers/llm/__init__.py +0 -1
  409. flock/routers/llm/llm_router.py +0 -365
  410. flock/tools/__init__.py +0 -0
  411. flock/tools/azure_tools.py +0 -781
  412. flock/tools/code_tools.py +0 -167
  413. flock/tools/file_tools.py +0 -149
  414. flock/tools/github_tools.py +0 -157
  415. flock/tools/markdown_tools.py +0 -205
  416. flock/tools/system_tools.py +0 -9
  417. flock/tools/text_tools.py +0 -810
  418. flock/tools/web_tools.py +0 -92
  419. flock/tools/zendesk_tools.py +0 -501
  420. flock/webapp/__init__.py +0 -1
  421. flock/webapp/app/__init__.py +0 -0
  422. flock/webapp/app/api/__init__.py +0 -0
  423. flock/webapp/app/api/agent_management.py +0 -237
  424. flock/webapp/app/api/execution.py +0 -503
  425. flock/webapp/app/api/flock_management.py +0 -125
  426. flock/webapp/app/api/registry_viewer.py +0 -29
  427. flock/webapp/app/chat.py +0 -662
  428. flock/webapp/app/config.py +0 -104
  429. flock/webapp/app/dependencies.py +0 -117
  430. flock/webapp/app/main.py +0 -1086
  431. flock/webapp/app/middleware.py +0 -113
  432. flock/webapp/app/models_ui.py +0 -7
  433. flock/webapp/app/services/__init__.py +0 -0
  434. flock/webapp/app/services/feedback_file_service.py +0 -363
  435. flock/webapp/app/services/flock_service.py +0 -345
  436. flock/webapp/app/services/sharing_models.py +0 -81
  437. flock/webapp/app/services/sharing_store.py +0 -597
  438. flock/webapp/app/templates/theme_mapper.html +0 -326
  439. flock/webapp/app/theme_mapper.py +0 -811
  440. flock/webapp/app/utils.py +0 -85
  441. flock/webapp/run.py +0 -219
  442. flock/webapp/static/css/chat.css +0 -301
  443. flock/webapp/static/css/components.css +0 -167
  444. flock/webapp/static/css/header.css +0 -39
  445. flock/webapp/static/css/layout.css +0 -281
  446. flock/webapp/static/css/sidebar.css +0 -127
  447. flock/webapp/static/css/two-pane.css +0 -48
  448. flock/webapp/templates/base.html +0 -389
  449. flock/webapp/templates/chat.html +0 -152
  450. flock/webapp/templates/chat_settings.html +0 -19
  451. flock/webapp/templates/flock_editor.html +0 -16
  452. flock/webapp/templates/index.html +0 -12
  453. flock/webapp/templates/partials/_agent_detail_form.html +0 -93
  454. flock/webapp/templates/partials/_agent_list.html +0 -18
  455. flock/webapp/templates/partials/_agent_manager_view.html +0 -51
  456. flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
  457. flock/webapp/templates/partials/_chat_container.html +0 -15
  458. flock/webapp/templates/partials/_chat_messages.html +0 -57
  459. flock/webapp/templates/partials/_chat_settings_form.html +0 -85
  460. flock/webapp/templates/partials/_create_flock_form.html +0 -50
  461. flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
  462. flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
  463. flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
  464. flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
  465. flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
  466. flock/webapp/templates/partials/_env_vars_table.html +0 -23
  467. flock/webapp/templates/partials/_execution_form.html +0 -127
  468. flock/webapp/templates/partials/_execution_view_container.html +0 -28
  469. flock/webapp/templates/partials/_flock_file_list.html +0 -23
  470. flock/webapp/templates/partials/_flock_properties_form.html +0 -52
  471. flock/webapp/templates/partials/_flock_upload_form.html +0 -16
  472. flock/webapp/templates/partials/_header_flock_status.html +0 -5
  473. flock/webapp/templates/partials/_live_logs.html +0 -13
  474. flock/webapp/templates/partials/_load_manager_view.html +0 -49
  475. flock/webapp/templates/partials/_registry_table.html +0 -25
  476. flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
  477. flock/webapp/templates/partials/_results_display.html +0 -78
  478. flock/webapp/templates/partials/_settings_env_content.html +0 -9
  479. flock/webapp/templates/partials/_settings_theme_content.html +0 -14
  480. flock/webapp/templates/partials/_settings_view.html +0 -36
  481. flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
  482. flock/webapp/templates/partials/_share_link_snippet.html +0 -35
  483. flock/webapp/templates/partials/_sidebar.html +0 -74
  484. flock/webapp/templates/partials/_structured_data_view.html +0 -40
  485. flock/webapp/templates/partials/_theme_preview.html +0 -36
  486. flock/webapp/templates/registry_viewer.html +0 -84
  487. flock/webapp/templates/shared_run_page.html +0 -140
  488. flock/workflow/__init__.py +0 -0
  489. flock/workflow/activities.py +0 -237
  490. flock/workflow/agent_activities.py +0 -24
  491. flock/workflow/agent_execution_activity.py +0 -240
  492. flock/workflow/flock_workflow.py +0 -225
  493. flock/workflow/temporal_config.py +0 -96
  494. flock/workflow/temporal_setup.py +0 -60
  495. flock_core-0.4.543.dist-info/METADATA +0 -676
  496. flock_core-0.4.543.dist-info/RECORD +0 -572
  497. flock_core-0.4.543.dist-info/entry_points.txt +0 -2
  498. /flock/{core/logging → logging}/formatters/themes.py +0 -0
  499. /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
  500. /flock/{core/mcp → mcp}/util/__init__.py +0 -0
  501. {flock_core-0.4.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
@@ -1,781 +0,0 @@
1
- import os
2
- from typing import Any
3
-
4
- from azure.core.credentials import AzureKeyCredential
5
- from azure.search.documents import SearchClient
6
- from azure.search.documents.indexes import SearchIndexClient
7
- from azure.search.documents.indexes.models import (
8
- ExhaustiveKnnAlgorithmConfiguration,
9
- HnswAlgorithmConfiguration,
10
- SearchableField,
11
- SearchField,
12
- SearchFieldDataType,
13
- SearchIndex,
14
- SimpleField,
15
- VectorSearch,
16
- VectorSearchProfile,
17
- )
18
- from azure.search.documents.models import VectorizedQuery
19
- from azure.storage.blob import (
20
- BlobServiceClient,
21
- ContentSettings,
22
- )
23
-
24
- from flock.core.logging.trace_and_logged import traced_and_logged
25
-
26
-
27
- def _get_default_endpoint() -> str:
28
- """Get the default Azure Search endpoint from environment variables."""
29
- endpoint = os.environ.get("AZURE_SEARCH_ENDPOINT")
30
- if not endpoint:
31
- raise ValueError(
32
- "AZURE_SEARCH_ENDPOINT environment variable is not set"
33
- )
34
- return endpoint
35
-
36
-
37
- def _get_default_api_key() -> str:
38
- """Get the default Azure Search API key from environment variables."""
39
- api_key = os.environ.get("AZURE_SEARCH_API_KEY")
40
- if not api_key:
41
- raise ValueError("AZURE_SEARCH_API_KEY environment variable is not set")
42
- return api_key
43
-
44
-
45
- def _get_default_index_name() -> str:
46
- """Get the default Azure Search index name from environment variables."""
47
- index_name = os.environ.get("AZURE_SEARCH_INDEX_NAME")
48
- if not index_name:
49
- raise ValueError(
50
- "AZURE_SEARCH_INDEX_NAME environment variable is not set"
51
- )
52
- return index_name
53
-
54
-
55
- @traced_and_logged
56
- def azure_search_initialize_clients(
57
- endpoint: str | None = None,
58
- api_key: str | None = None,
59
- index_name: str | None = None,
60
- ) -> dict[str, Any]:
61
- """Initialize Azure AI Search clients.
62
-
63
- Args:
64
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
65
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
66
- index_name: Optional index name for SearchClient initialization (defaults to AZURE_SEARCH_INDEX_NAME env var if not None)
67
-
68
- Returns:
69
- Dictionary containing the initialized clients
70
- """
71
- # Use environment variables as defaults if not provided
72
- endpoint = endpoint or _get_default_endpoint()
73
- api_key = api_key or _get_default_api_key()
74
-
75
- credential = AzureKeyCredential(api_key)
76
-
77
- # Create the search index client
78
- search_index_client = SearchIndexClient(
79
- endpoint=endpoint, credential=credential
80
- )
81
-
82
- # Create clients dictionary
83
- clients = {
84
- "index_client": search_index_client,
85
- }
86
-
87
- # Add search client if index_name was provided or available in env
88
- if index_name is None and os.environ.get("AZURE_SEARCH_INDEX_NAME"):
89
- index_name = _get_default_index_name()
90
-
91
- if index_name:
92
- search_client = SearchClient(
93
- endpoint=endpoint, index_name=index_name, credential=credential
94
- )
95
- clients["search_client"] = search_client
96
-
97
- return clients
98
-
99
-
100
- @traced_and_logged
101
- def azure_search_create_index(
102
- index_name: str | None = None,
103
- fields: list[SearchField] = None,
104
- vector_search: VectorSearch | None = None,
105
- endpoint: str | None = None,
106
- api_key: str | None = None,
107
- ) -> dict[str, Any]:
108
- """Create a new search index in Azure AI Search.
109
-
110
- Args:
111
- index_name: Name of the search index to create (defaults to AZURE_SEARCH_INDEX_NAME env var)
112
- fields: List of field definitions for the index
113
- vector_search: Optional vector search configuration
114
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
115
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
116
-
117
- Returns:
118
- Dictionary containing information about the created index
119
- """
120
- # Use environment variables as defaults if not provided
121
- endpoint = endpoint or _get_default_endpoint()
122
- api_key = api_key or _get_default_api_key()
123
- index_name = index_name or _get_default_index_name()
124
-
125
- if fields is None:
126
- raise ValueError("Fields must be provided for index creation")
127
-
128
- clients = azure_search_initialize_clients(endpoint, api_key)
129
- index_client = clients["index_client"]
130
-
131
- # Create the index
132
- index = SearchIndex(
133
- name=index_name, fields=fields, vector_search=vector_search
134
- )
135
-
136
- result = index_client.create_or_update_index(index)
137
-
138
- return {
139
- "index_name": result.name,
140
- "fields": [field.name for field in result.fields],
141
- "created": True,
142
- }
143
-
144
-
145
- @traced_and_logged
146
- def azure_search_upload_documents(
147
- documents: list[dict[str, Any]],
148
- index_name: str | None = None,
149
- endpoint: str | None = None,
150
- api_key: str | None = None,
151
- ) -> dict[str, Any]:
152
- """Upload documents to an Azure AI Search index.
153
-
154
- Args:
155
- documents: List of documents to upload (as dictionaries)
156
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
157
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
158
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
159
-
160
- Returns:
161
- Dictionary containing the upload results
162
- """
163
- # Use environment variables as defaults if not provided
164
- endpoint = endpoint or _get_default_endpoint()
165
- api_key = api_key or _get_default_api_key()
166
- index_name = index_name or _get_default_index_name()
167
-
168
- clients = azure_search_initialize_clients(endpoint, api_key, index_name)
169
- search_client = clients["search_client"]
170
-
171
- result = search_client.upload_documents(documents=documents)
172
-
173
- # Process results
174
- succeeded = sum(1 for r in result if r.succeeded)
175
-
176
- return {
177
- "succeeded": succeeded,
178
- "failed": len(result) - succeeded,
179
- "total": len(result),
180
- }
181
-
182
-
183
- @traced_and_logged
184
- def azure_search_query(
185
- search_text: str | None = None,
186
- filter: str | None = None,
187
- select: list[str] | None = None,
188
- top: int | None = 50,
189
- vector: list[float] | None = None,
190
- vector_field: str | None = None,
191
- vector_k: int | None = 10,
192
- index_name: str | None = None,
193
- endpoint: str | None = None,
194
- api_key: str | None = None,
195
- ) -> list[dict[str, Any]]:
196
- """Search documents in an Azure AI Search index.
197
-
198
- Args:
199
- search_text: Optional text to search for (keyword search)
200
- filter: Optional OData filter expression
201
- select: Optional list of fields to return
202
- top: Maximum number of results to return
203
- vector: Optional vector for vector search
204
- vector_field: Name of the field containing vectors for vector search
205
- vector_k: Number of nearest neighbors to retrieve in vector search
206
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
207
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
208
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
209
-
210
- Returns:
211
- List of search results as dictionaries
212
- """
213
- # Use environment variables as defaults if not provided
214
- endpoint = endpoint or _get_default_endpoint()
215
- api_key = api_key or _get_default_api_key()
216
- index_name = index_name or _get_default_index_name()
217
-
218
- clients = azure_search_initialize_clients(endpoint, api_key, index_name)
219
- search_client = clients["search_client"]
220
-
221
- # Set up vector query if vector is provided
222
- vectorized_query = None
223
- if vector and vector_field:
224
- vectorized_query = VectorizedQuery(
225
- vector=vector, k=vector_k, fields=[vector_field]
226
- )
227
-
228
- # Execute the search
229
- results = search_client.search(
230
- search_text=search_text,
231
- filter=filter,
232
- select=select,
233
- top=top,
234
- vector_queries=[vectorized_query] if vectorized_query else None,
235
- )
236
-
237
- # Convert results to list of dictionaries
238
- # filter out the text_vector field
239
- result_list = [{**dict(result), "text_vector": ""} for result in results]
240
-
241
- return result_list
242
-
243
-
244
- @traced_and_logged
245
- def azure_search_get_document(
246
- key: str,
247
- select: list[str] | None = None,
248
- index_name: str | None = None,
249
- endpoint: str | None = None,
250
- api_key: str | None = None,
251
- ) -> dict[str, Any]:
252
- """Retrieve a specific document from an Azure AI Search index by key.
253
-
254
- Args:
255
- key: The unique key of the document to retrieve
256
- select: Optional list of fields to return
257
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
258
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
259
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
260
-
261
- Returns:
262
- The retrieved document as a dictionary
263
- """
264
- # Use environment variables as defaults if not provided
265
- endpoint = endpoint or _get_default_endpoint()
266
- api_key = api_key or _get_default_api_key()
267
- index_name = index_name or _get_default_index_name()
268
-
269
- clients = azure_search_initialize_clients(endpoint, api_key, index_name)
270
- search_client = clients["search_client"]
271
-
272
- result = search_client.get_document(key=key, selected_fields=select)
273
-
274
- return dict(result)
275
-
276
-
277
- @traced_and_logged
278
- def azure_search_delete_documents(
279
- keys: list[str],
280
- key_field_name: str = "id",
281
- index_name: str | None = None,
282
- endpoint: str | None = None,
283
- api_key: str | None = None,
284
- ) -> dict[str, Any]:
285
- """Delete documents from an Azure AI Search index.
286
-
287
- Args:
288
- keys: List of document keys to delete
289
- key_field_name: Name of the key field (defaults to "id")
290
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
291
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
292
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
293
-
294
- Returns:
295
- Dictionary containing the deletion results
296
- """
297
- # Use environment variables as defaults if not provided
298
- endpoint = endpoint or _get_default_endpoint()
299
- api_key = api_key or _get_default_api_key()
300
- index_name = index_name or _get_default_index_name()
301
-
302
- clients = azure_search_initialize_clients(endpoint, api_key, index_name)
303
- search_client = clients["search_client"]
304
-
305
- # Format documents for deletion (only need the key field)
306
- documents_to_delete = [{key_field_name: key} for key in keys]
307
-
308
- result = search_client.delete_documents(documents=documents_to_delete)
309
-
310
- # Process results
311
- succeeded = sum(1 for r in result if r.succeeded)
312
-
313
- return {
314
- "succeeded": succeeded,
315
- "failed": len(result) - succeeded,
316
- "total": len(result),
317
- }
318
-
319
-
320
- @traced_and_logged
321
- def azure_search_list_indexes(
322
- endpoint: str | None = None, api_key: str | None = None
323
- ) -> list[dict[str, Any]]:
324
- """List all indexes in the Azure AI Search service.
325
-
326
- Args:
327
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
328
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
329
-
330
- Returns:
331
- List of indexes as dictionaries
332
- """
333
- # Use environment variables as defaults if not provided
334
- endpoint = endpoint or _get_default_endpoint()
335
- api_key = api_key or _get_default_api_key()
336
-
337
- clients = azure_search_initialize_clients(endpoint, api_key)
338
- index_client = clients["index_client"]
339
-
340
- result = index_client.list_indexes()
341
-
342
- # Convert index objects to dictionaries with basic information
343
- indexes = [
344
- {
345
- "name": index.name,
346
- "fields": [field.name for field in index.fields],
347
- "field_count": len(index.fields),
348
- }
349
- for index in result
350
- ]
351
-
352
- return indexes
353
-
354
-
355
- @traced_and_logged
356
- def azure_search_get_index_statistics(
357
- index_name: str | None = None,
358
- endpoint: str | None = None,
359
- api_key: str | None = None,
360
- ) -> dict[str, Any]:
361
- """Get statistics for a specific Azure AI Search index.
362
-
363
- Args:
364
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
365
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
366
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
367
-
368
- Returns:
369
- Dictionary containing index statistics
370
- """
371
- # Use environment variables as defaults if not provided
372
- endpoint = endpoint or _get_default_endpoint()
373
- api_key = api_key or _get_default_api_key()
374
- index_name = index_name or _get_default_index_name()
375
-
376
- clients = azure_search_initialize_clients(endpoint, api_key, index_name)
377
- search_client = clients["search_client"]
378
-
379
- stats = search_client.get_document_count()
380
-
381
- return {"document_count": stats}
382
-
383
-
384
- @traced_and_logged
385
- def azure_search_create_vector_index(
386
- fields: list[dict[str, Any]],
387
- vector_dimensions: int,
388
- index_name: str | None = None,
389
- algorithm_kind: str = "hnsw",
390
- endpoint: str | None = None,
391
- api_key: str | None = None,
392
- ) -> dict[str, Any]:
393
- """Create a vector search index in Azure AI Search.
394
-
395
- Args:
396
- fields: List of field configurations (dicts with name, type, etc.)
397
- vector_dimensions: Dimensions of the vector field
398
- index_name: Name of the search index (defaults to AZURE_SEARCH_INDEX_NAME env var)
399
- algorithm_kind: Vector search algorithm ("hnsw" or "exhaustive")
400
- endpoint: The Azure AI Search service endpoint URL (defaults to AZURE_SEARCH_ENDPOINT env var)
401
- api_key: The Azure AI Search API key (defaults to AZURE_SEARCH_API_KEY env var)
402
-
403
- Returns:
404
- Dictionary with index creation result
405
- """
406
- # Use environment variables as defaults if not provided
407
- endpoint = endpoint or _get_default_endpoint()
408
- api_key = api_key or _get_default_api_key()
409
- index_name = index_name or _get_default_index_name()
410
-
411
- clients = azure_search_initialize_clients(endpoint, api_key)
412
- index_client = clients["index_client"]
413
-
414
- # Convert field configurations to SearchField objects
415
- index_fields = []
416
- vector_fields = []
417
-
418
- for field_config in fields:
419
- field_name = field_config["name"]
420
- field_type = field_config["type"]
421
- field_searchable = field_config.get("searchable", False)
422
- field_filterable = field_config.get("filterable", False)
423
- field_sortable = field_config.get("sortable", False)
424
- field_key = field_config.get("key", False)
425
- field_vector = field_config.get("vector", False)
426
-
427
- if field_searchable and field_type == "string":
428
- field = SearchableField(
429
- name=field_name,
430
- type=SearchFieldDataType.String,
431
- key=field_key,
432
- filterable=field_filterable,
433
- sortable=field_sortable,
434
- )
435
- else:
436
- data_type = None
437
- if field_type == "string":
438
- data_type = SearchFieldDataType.String
439
- elif field_type == "int":
440
- data_type = SearchFieldDataType.Int32
441
- elif field_type == "double":
442
- data_type = SearchFieldDataType.Double
443
- elif field_type == "boolean":
444
- data_type = SearchFieldDataType.Boolean
445
- elif field_type == "collection":
446
- data_type = SearchFieldDataType.Collection(
447
- SearchFieldDataType.String
448
- )
449
-
450
- field = SimpleField(
451
- name=field_name,
452
- type=data_type,
453
- key=field_key,
454
- filterable=field_filterable,
455
- sortable=field_sortable,
456
- )
457
-
458
- index_fields.append(field)
459
-
460
- if field_vector:
461
- vector_fields.append(field_name)
462
-
463
- # Set up vector search configuration
464
- algorithm_config = None
465
- if algorithm_kind.lower() == "hnsw":
466
- algorithm_config = HnswAlgorithmConfiguration(
467
- name="hnsw-config",
468
- parameters={"m": 4, "efConstruction": 400, "efSearch": 500},
469
- )
470
- else:
471
- algorithm_config = ExhaustiveKnnAlgorithmConfiguration(
472
- name="exhaustive-config"
473
- )
474
-
475
- # Create vector search configuration
476
- vector_search = VectorSearch(
477
- algorithms=[algorithm_config],
478
- profiles=[
479
- VectorSearchProfile(
480
- name="vector-profile",
481
- algorithm_configuration_name=algorithm_config.name,
482
- )
483
- ],
484
- )
485
-
486
- # Create the search index
487
- index = SearchIndex(
488
- name=index_name, fields=index_fields, vector_search=vector_search
489
- )
490
-
491
- try:
492
- result = index_client.create_or_update_index(index)
493
- return {
494
- "index_name": result.name,
495
- "vector_fields": vector_fields,
496
- "vector_dimensions": vector_dimensions,
497
- "algorithm": algorithm_kind,
498
- "created": True,
499
- }
500
- except Exception as e:
501
- return {"error": str(e), "created": False}
502
-
503
-
504
- # --- Azure Blob Storage Tools ---
505
-
506
- def _get_blob_service_client(conn_string_env_var: str) -> BlobServiceClient:
507
- """Helper function to get BlobServiceClient using a connection string from an environment variable."""
508
- actual_connection_string = os.environ.get(conn_string_env_var)
509
- if not actual_connection_string:
510
- raise ValueError(f"Environment variable '{conn_string_env_var}' for Azure Storage connection string is not set or is empty.")
511
- return BlobServiceClient.from_connection_string(actual_connection_string)
512
-
513
-
514
- @traced_and_logged
515
- def azure_storage_list_containers(conn_string_env_var: str) -> list[str]:
516
- """Lists all containers in the Azure Storage account.
517
-
518
- Args:
519
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
520
-
521
- Returns:
522
- A list of container names.
523
- """
524
- blob_service_client = _get_blob_service_client(conn_string_env_var)
525
- containers = blob_service_client.list_containers()
526
- return [container.name for container in containers]
527
-
528
-
529
- @traced_and_logged
530
- def azure_storage_create_container(container_name: str, conn_string_env_var: str) -> dict[str, Any]:
531
- """Creates a new container in the Azure Storage account.
532
-
533
- Args:
534
- container_name: The name of the container to create.
535
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
536
-
537
- Returns:
538
- A dictionary with creation status.
539
- """
540
- blob_service_client = _get_blob_service_client(conn_string_env_var)
541
- try:
542
- blob_service_client.create_container(container_name)
543
- return {"container_name": container_name, "created": True, "message": f"Container '{container_name}' created successfully."}
544
- except Exception as e:
545
- return {"container_name": container_name, "created": False, "error": str(e)}
546
-
547
-
548
- @traced_and_logged
549
- def azure_storage_delete_container(container_name: str, conn_string_env_var: str) -> dict[str, Any]:
550
- """Deletes an existing container from the Azure Storage account.
551
-
552
- Args:
553
- container_name: The name of the container to delete.
554
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
555
-
556
- Returns:
557
- A dictionary with deletion status.
558
- """
559
- blob_service_client = _get_blob_service_client(conn_string_env_var)
560
- try:
561
- blob_service_client.delete_container(container_name)
562
- return {"container_name": container_name, "deleted": True, "message": f"Container '{container_name}' deleted successfully."}
563
- except Exception as e:
564
- return {"container_name": container_name, "deleted": False, "error": str(e)}
565
-
566
-
567
- @traced_and_logged
568
- def azure_storage_list_blobs(container_name: str, conn_string_env_var: str) -> list[str]:
569
- """Lists all blobs in a specified container.
570
-
571
- Args:
572
- container_name: The name of the container.
573
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
574
-
575
- Returns:
576
- A list of blob names.
577
- """
578
- blob_service_client = _get_blob_service_client(conn_string_env_var)
579
- container_client = blob_service_client.get_container_client(container_name)
580
- blob_list = container_client.list_blobs()
581
- return [blob.name for blob in blob_list]
582
-
583
-
584
- @traced_and_logged
585
- def azure_storage_upload_blob_text(container_name: str, blob_name: str, text_content: str, conn_string_env_var: str, overwrite: bool = True) -> dict[str, Any]:
586
- """Uploads text content as a blob to the specified container.
587
-
588
- Args:
589
- container_name: The name of the container.
590
- blob_name: The name of the blob to create.
591
- text_content: The string content to upload.
592
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
593
- overwrite: Whether to overwrite the blob if it already exists. Defaults to True.
594
-
595
- Returns:
596
- A dictionary with upload status.
597
- """
598
- blob_service_client = _get_blob_service_client(conn_string_env_var)
599
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
600
- try:
601
- content_settings = ContentSettings(content_type='text/plain')
602
- blob_client.upload_blob(text_content.encode('utf-8'), overwrite=overwrite, content_settings=content_settings)
603
- return {"container_name": container_name, "blob_name": blob_name, "uploaded": True, "message": "Text content uploaded successfully."}
604
- except Exception as e:
605
- return {"container_name": container_name, "blob_name": blob_name, "uploaded": False, "error": str(e)}
606
-
607
-
608
- @traced_and_logged
609
- def azure_storage_upload_blob_bytes(container_name: str, blob_name: str, bytes_content: bytes, conn_string_env_var: str, overwrite: bool = True) -> dict[str, Any]:
610
- """Uploads bytes content as a blob to the specified container.
611
-
612
- Args:
613
- container_name: The name of the container.
614
- blob_name: The name of the blob to create.
615
- bytes_content: The bytes content to upload.
616
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
617
- overwrite: Whether to overwrite the blob if it already exists. Defaults to True.
618
-
619
- Returns:
620
- A dictionary with upload status.
621
- """
622
- blob_service_client = _get_blob_service_client(conn_string_env_var)
623
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
624
- try:
625
- content_settings = ContentSettings(content_type='application/octet-stream')
626
- blob_client.upload_blob(bytes_content, overwrite=overwrite, content_settings=content_settings)
627
- return {"container_name": container_name, "blob_name": blob_name, "uploaded": True, "message": "Bytes content uploaded successfully."}
628
- except Exception as e:
629
- return {"container_name": container_name, "blob_name": blob_name, "uploaded": False, "error": str(e)}
630
-
631
-
632
- @traced_and_logged
633
- def azure_storage_upload_blob_from_file(container_name: str, blob_name: str, file_path: str, conn_string_env_var: str, overwrite: bool = True) -> dict[str, Any]:
634
- """Uploads a local file to a blob in the specified container.
635
-
636
- Args:
637
- container_name: The name of the container.
638
- blob_name: The name of the blob to create.
639
- file_path: The local path to the file to upload.
640
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
641
- overwrite: Whether to overwrite the blob if it already exists. Defaults to True.
642
-
643
- Returns:
644
- A dictionary with upload status.
645
- """
646
- blob_service_client = _get_blob_service_client(conn_string_env_var)
647
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
648
- try:
649
- with open(file_path, "rb") as data:
650
- blob_client.upload_blob(data, overwrite=overwrite)
651
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "uploaded": True, "message": "File uploaded successfully."}
652
- except FileNotFoundError:
653
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "uploaded": False, "error": "File not found."}
654
- except Exception as e:
655
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "uploaded": False, "error": str(e)}
656
-
657
-
658
- @traced_and_logged
659
- def azure_storage_download_blob_to_text(container_name: str, blob_name: str, conn_string_env_var: str) -> str:
660
- """Downloads a blob's content as text.
661
-
662
- Args:
663
- container_name: The name of the container.
664
- blob_name: The name of the blob to download.
665
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
666
-
667
- Returns:
668
- The blob content as a string.
669
-
670
- Raises:
671
- Exception: If download fails or blob is not text.
672
- """
673
- blob_service_client = _get_blob_service_client(conn_string_env_var)
674
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
675
- try:
676
- download_stream = blob_client.download_blob()
677
- return download_stream.readall().decode('utf-8')
678
- except Exception as e:
679
- raise Exception(f"Failed to download or decode blob '{blob_name}' from container '{container_name}': {e!s}")
680
-
681
-
682
- @traced_and_logged
683
- def azure_storage_download_blob_to_bytes(container_name: str, blob_name: str, conn_string_env_var: str) -> bytes:
684
- """Downloads a blob's content as bytes.
685
-
686
- Args:
687
- container_name: The name of the container.
688
- blob_name: The name of the blob to download.
689
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
690
-
691
- Returns:
692
- The blob content as bytes.
693
- """
694
- blob_service_client = _get_blob_service_client(conn_string_env_var)
695
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
696
- download_stream = blob_client.download_blob()
697
- return download_stream.readall()
698
-
699
-
700
- @traced_and_logged
701
- def azure_storage_download_blob_to_file(container_name: str, blob_name: str, file_path: str, conn_string_env_var: str, overwrite: bool = True) -> dict[str, Any]:
702
- """Downloads a blob to a local file.
703
-
704
- Args:
705
- container_name: The name of the container.
706
- blob_name: The name of the blob to download.
707
- file_path: The local path to save the downloaded file.
708
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
709
- overwrite: Whether to overwrite the local file if it exists. Defaults to True.
710
-
711
- Returns:
712
- A dictionary with download status.
713
- """
714
- if not overwrite and os.path.exists(file_path):
715
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "downloaded": False, "error": "File exists and overwrite is False."}
716
-
717
- blob_service_client = _get_blob_service_client(conn_string_env_var)
718
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
719
- try:
720
- with open(file_path, "wb") as download_file:
721
- download_stream = blob_client.download_blob()
722
- download_file.write(download_stream.readall())
723
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "downloaded": True, "message": "File downloaded successfully."}
724
- except Exception as e:
725
- return {"container_name": container_name, "blob_name": blob_name, "file_path": file_path, "downloaded": False, "error": str(e)}
726
-
727
-
728
- @traced_and_logged
729
- def azure_storage_delete_blob(container_name: str, blob_name: str, conn_string_env_var: str) -> dict[str, Any]:
730
- """Deletes a specified blob from a container.
731
-
732
- Args:
733
- container_name: The name of the container.
734
- blob_name: The name of the blob to delete.
735
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
736
-
737
- Returns:
738
- A dictionary with deletion status.
739
- """
740
- blob_service_client = _get_blob_service_client(conn_string_env_var)
741
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
742
- try:
743
- blob_client.delete_blob()
744
- return {"container_name": container_name, "blob_name": blob_name, "deleted": True, "message": "Blob deleted successfully."}
745
- except Exception as e:
746
- return {"container_name": container_name, "blob_name": blob_name, "deleted": False, "error": str(e)}
747
-
748
-
749
- @traced_and_logged
750
- def azure_storage_get_blob_properties(container_name: str, blob_name: str, conn_string_env_var: str) -> dict[str, Any]:
751
- """Retrieves properties of a specified blob.
752
-
753
- Args:
754
- container_name: The name of the container.
755
- blob_name: The name of the blob.
756
- conn_string_env_var: The name of the environment variable holding the Azure Storage connection string.
757
-
758
- Returns:
759
- A dictionary containing blob properties.
760
- """
761
- blob_service_client = _get_blob_service_client(conn_string_env_var)
762
- blob_client = blob_service_client.get_blob_client(container=container_name, blob=blob_name)
763
- try:
764
- properties = blob_client.get_blob_properties()
765
- return {
766
- "name": properties.name,
767
- "container": properties.container,
768
- "size": properties.size,
769
- "content_type": properties.content_settings.content_type,
770
- "last_modified": properties.last_modified.isoformat() if properties.last_modified else None,
771
- "etag": properties.etag,
772
- # Add more properties as needed
773
- }
774
- except Exception as e:
775
- return {"container_name": container_name, "blob_name": blob_name, "error": str(e)}
776
-
777
- # Potential future tools:
778
- # - azure_storage_set_blob_metadata
779
- # - azure_storage_get_blob_metadata
780
- # - azure_storage_generate_sas_token_blob
781
- # - azure_storage_copy_blob