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,45 +0,0 @@
1
- """Lightweight helper object for declaring additional REST routes.
2
-
3
- Developers can pass instances of :class:`FlockEndpoint` to
4
- ``Flock.start_api(custom_endpoints=[...])`` instead of the terse dictionary
5
- syntax. The class carries optional Pydantic request/response models plus
6
- OpenAPI metadata so the generated docs look perfect.
7
- """
8
- from __future__ import annotations
9
-
10
- from collections.abc import Callable
11
- from typing import Any
12
-
13
- from pydantic import BaseModel
14
-
15
- __all__ = [
16
- "FlockEndpoint",
17
- ]
18
-
19
-
20
- class FlockEndpoint(BaseModel):
21
- """Declarative description of an extra API route."""
22
-
23
- path: str
24
- methods: list[str] = ["GET"]
25
- callback: Callable[..., Any]
26
-
27
- # Optional schema models
28
- request_model: type[BaseModel] | None = None
29
- response_model: type[BaseModel] | None = None
30
- # Query-string parameters as a Pydantic model (treated as Depends())
31
- query_model: type[BaseModel] | None = None
32
-
33
- # OpenAPI / Swagger metadata
34
- summary: str | None = None
35
- description: str | None = None
36
- name: str | None = None # Route name in FastAPI
37
- include_in_schema: bool = True
38
-
39
- # FastAPI dependency injections (e.g. security)
40
- dependencies: list[Any] | None = None
41
-
42
- model_config = {
43
- "arbitrary_types_allowed": True,
44
- "validate_default": True,
45
- }
@@ -1,262 +0,0 @@
1
- # src/flock/core/api/endpoints.py
2
- """FastAPI endpoints for the Flock API, using FastAPI's dependency injection."""
3
-
4
- import uuid
5
- from typing import TYPE_CHECKING
6
-
7
- from fastapi import (
8
- APIRouter,
9
- BackgroundTasks,
10
- Depends, # Crucial import for dependency injection
11
- HTTPException,
12
- )
13
-
14
- from flock.core.logging.logging import get_logger
15
-
16
- # Import the dependency provider functions
17
- # This assumes you'll create 'src/flock/webapp/app/dependencies.py' (or similar)
18
- # with get_flock_instance and get_run_store functions.
19
- # For now, to make this file runnable in isolation for generation,
20
- # we might need temporary stubs or to adjust the import path later.
21
- # Let's assume a common location for dependencies.
22
- from flock.webapp.app.dependencies import get_flock_instance, get_run_store
23
-
24
- from .models import (
25
- FlockAPIRequest,
26
- FlockAPIResponse,
27
- FlockBatchRequest,
28
- FlockBatchResponse,
29
- )
30
-
31
- if TYPE_CHECKING:
32
- from flock.core.flock import Flock
33
-
34
- from .run_store import RunStore
35
- # We also need the _run_flock, _run_batch, _type_convert_inputs methods.
36
- # These will be part of the Flock instance itself or helper functions
37
- # that take Flock/RunStore as arguments. For now, let's assume they
38
- # are methods on the Flock instance or can be called statically with it.
39
-
40
- logger = get_logger("api.endpoints")
41
-
42
- # The create_api_router function no longer needs to be passed the FlockAPI instance
43
- # as dependencies will be injected directly into the route handlers.
44
- def create_api_router() -> APIRouter:
45
- """Creates the APIRouter for core Flock API endpoints."""
46
- router = APIRouter()
47
-
48
- # --- API Endpoints ---
49
- @router.post("/run/flock", response_model=FlockAPIResponse, tags=["Flock API Core"])
50
- async def run_flock_workflow(
51
- request_model: FlockAPIRequest, # Renamed from 'request' to avoid conflict with FastAPI's Request
52
- background_tasks: BackgroundTasks,
53
- flock_instance: "Flock" = Depends(get_flock_instance), # Injected
54
- run_store: "RunStore" = Depends(get_run_store) # Injected
55
- ):
56
- """Run a flock workflow starting with the specified agent."""
57
- run_id = None
58
- try:
59
- run_id = str(uuid.uuid4())
60
- run_store.create_run(run_id)
61
- response_data = run_store.get_run(run_id)
62
-
63
- if not response_data:
64
- logger.error(f"Failed to create run record for run_id: {run_id}")
65
- raise HTTPException(status_code=500, detail="Failed to initialize run.")
66
-
67
- processed_inputs = request_model.inputs if request_model.inputs else {}
68
- logger.info(
69
- f"API request: run flock '{request_model.agent_name}' (run_id: {run_id})",
70
- inputs=processed_inputs,
71
- )
72
-
73
- # The _run_flock logic now needs to be called. It could be a method on
74
- # flock_instance, or a static/helper function that takes flock_instance.
75
- # Let's assume it's a method on flock_instance for now.
76
- # To avoid direct calls to private-like methods from router,
77
- # Flock class would expose a public method that handles this internal logic.
78
- # For this refactoring step, let's assume a helper `_execute_flock_run` exists
79
- # that we can call.
80
-
81
- async def _execute_flock_run_task(
82
- run_id_task, agent_name_task, inputs_task, use_production_tools_task
83
- ):
84
- # This is a simplified version of what was in FlockAPI._run_flock
85
- try:
86
- if agent_name_task not in flock_instance.agents:
87
- raise ValueError(f"Starting agent '{agent_name_task}' not found")
88
- # Type conversion would ideally be part of the Flock's run logic
89
- # or a utility. For now, assume it's handled or simple.
90
- # typed_inputs = flock_instance._type_convert_inputs(agent_name_task, inputs_task) # Example if kept on Flock
91
- typed_inputs = inputs_task # Simplified for now
92
-
93
- result = await flock_instance.run_async(
94
- start_agent=agent_name_task,
95
- input=typed_inputs,
96
- use_production_tools=use_production_tools_task,
97
- )
98
- run_store.update_run_result(run_id_task, result)
99
- except Exception as e_task:
100
- logger.error(f"Error in background flock run {run_id_task}: {e_task!s}", exc_info=True)
101
- run_store.update_run_status(run_id_task, "failed", str(e_task))
102
-
103
-
104
- if request_model.async_run:
105
- logger.debug(
106
- f"Running flock '{request_model.agent_name}' asynchronously (run_id: {run_id})"
107
- )
108
- background_tasks.add_task(
109
- _execute_flock_run_task,
110
- run_id,
111
- request_model.agent_name,
112
- processed_inputs,
113
- request_model.use_production_tools,
114
- )
115
- run_store.update_run_status(run_id, "running")
116
- response_data.status = "running"
117
- else:
118
- logger.debug(
119
- f"Running flock '{request_model.agent_name}' synchronously (run_id: {run_id})"
120
- )
121
- await _execute_flock_run_task(
122
- run_id,
123
- request_model.agent_name,
124
- processed_inputs,
125
- request_model.use_production_tools,
126
- )
127
- response_data = run_store.get_run(run_id)
128
-
129
- if not response_data:
130
- logger.error(f"Run data lost for run_id: {run_id} after execution.")
131
- raise HTTPException(status_code=500, detail="Run data lost after execution.")
132
-
133
- return response_data
134
- except ValueError as ve:
135
- logger.error(f"Value error starting run for agent '{request_model.agent_name}': {ve}", exc_info=True)
136
- if run_id: run_store.update_run_status(run_id, "failed", str(ve))
137
- raise HTTPException(status_code=400, detail=str(ve))
138
- except Exception as e:
139
- error_msg = f"Internal server error during flock run: {type(e).__name__}"
140
- logger.error(f"Error starting flock run: {e!s}", exc_info=True)
141
- if run_id: run_store.update_run_status(run_id, "failed", error_msg)
142
- raise HTTPException(status_code=500, detail=error_msg)
143
-
144
- @router.post("/run/batch", response_model=FlockBatchResponse, tags=["Flock API Core"])
145
- async def run_batch_workflow(
146
- request_model: FlockBatchRequest, # Renamed from 'request'
147
- background_tasks: BackgroundTasks,
148
- flock_instance: "Flock" = Depends(get_flock_instance),
149
- run_store: "RunStore" = Depends(get_run_store)
150
- ):
151
- """Run a batch of inputs through the flock workflow."""
152
- batch_id = None
153
- try:
154
- if request_model.agent_name not in flock_instance.agents:
155
- raise ValueError(f"Agent '{request_model.agent_name}' not found in current Flock.")
156
-
157
- if isinstance(request_model.batch_inputs, list) and not request_model.batch_inputs:
158
- raise ValueError("Batch inputs list cannot be empty if provided as a list.")
159
-
160
- batch_id = str(uuid.uuid4())
161
- run_store.create_batch(batch_id)
162
- response_data = run_store.get_batch(batch_id)
163
-
164
- if not response_data:
165
- logger.error(f"Failed to create batch record for batch_id: {batch_id}")
166
- raise HTTPException(status_code=500, detail="Failed to initialize batch run.")
167
-
168
- batch_size = (
169
- len(request_model.batch_inputs)
170
- if isinstance(request_model.batch_inputs, list)
171
- else "CSV/DataFrame"
172
- )
173
- logger.info(
174
- f"API request: run batch with '{request_model.agent_name}' (batch_id: {batch_id})",
175
- batch_size=batch_size,
176
- )
177
-
178
- async def _execute_flock_batch_task(batch_id_task, batch_request_task: FlockBatchRequest):
179
- # This is a simplified version of what was in FlockAPI._run_batch
180
- try:
181
- # Directly use the flock_instance's run_batch_async method
182
- results = await flock_instance.run_batch_async(
183
- start_agent=batch_request_task.agent_name,
184
- batch_inputs=batch_request_task.batch_inputs,
185
- input_mapping=batch_request_task.input_mapping,
186
- static_inputs=batch_request_task.static_inputs,
187
- parallel=batch_request_task.parallel,
188
- max_workers=batch_request_task.max_workers,
189
- use_temporal=batch_request_task.use_temporal,
190
- box_results=batch_request_task.box_results,
191
- return_errors=batch_request_task.return_errors,
192
- silent_mode=True, # API batch runs should be internally silent
193
- write_to_csv=None # API handles CSV writing based on request if needed, not here
194
- )
195
- run_store.update_batch_result(batch_id_task, results)
196
- logger.info(f"Batch run completed (batch_id: {batch_id_task})", num_results=len(results))
197
- except Exception as e_task:
198
- logger.error(f"Error in background flock batch {batch_id_task}: {e_task!s}", exc_info=True)
199
- run_store.update_batch_status(batch_id_task, "failed", str(e_task))
200
-
201
- logger.debug(
202
- f"Running batch with '{request_model.agent_name}' asynchronously (batch_id: {batch_id})"
203
- )
204
- background_tasks.add_task(
205
- _execute_flock_batch_task,
206
- batch_id,
207
- request_model, # Pass the Pydantic request model
208
- )
209
- run_store.update_batch_status(batch_id, "running")
210
- response_data.status = "running"
211
-
212
- return response_data
213
- except ValueError as ve:
214
- error_msg = f"Value error starting batch for agent '{request_model.agent_name}': {ve}"
215
- logger.error(error_msg, exc_info=True)
216
- if batch_id: run_store.update_batch_status(batch_id, "failed", str(ve))
217
- raise HTTPException(status_code=400, detail=str(ve))
218
- except Exception as e:
219
- error_msg = f"Internal server error during batch run: {type(e).__name__}: {e!s}"
220
- logger.error(error_msg, exc_info=True)
221
- if batch_id: run_store.update_batch_status(batch_id, "failed", error_msg)
222
- raise HTTPException(status_code=500, detail=error_msg)
223
-
224
- @router.get("/run/{run_id}", response_model=FlockAPIResponse, tags=["Flock API Core"])
225
- async def get_run_status(
226
- run_id: str,
227
- run_store: "RunStore" = Depends(get_run_store)
228
- ):
229
- """Get the status of a specific run."""
230
- logger.debug(f"API request: get status for run_id: {run_id}")
231
- run_data = run_store.get_run(run_id)
232
- if not run_data:
233
- logger.warning(f"Run ID not found: {run_id}")
234
- raise HTTPException(status_code=404, detail="Run not found")
235
- return run_data
236
-
237
- @router.get("/batch/{batch_id}", response_model=FlockBatchResponse, tags=["Flock API Core"])
238
- async def get_batch_status(
239
- batch_id: str,
240
- run_store: "RunStore" = Depends(get_run_store)
241
- ):
242
- """Get the status and results of a specific batch run."""
243
- logger.debug(f"API request: get status for batch_id: {batch_id}")
244
- batch_data = run_store.get_batch(batch_id)
245
- if not batch_data:
246
- logger.warning(f"Batch ID not found: {batch_id}")
247
- raise HTTPException(status_code=404, detail="Batch not found")
248
- return batch_data
249
-
250
- @router.get("/agents", tags=["Flock API Core"])
251
- async def list_agents(
252
- flock_instance: "Flock" = Depends(get_flock_instance)
253
- ):
254
- """List all available agents in the currently loaded Flock."""
255
- logger.debug("API request: list agents")
256
- agents_list = [
257
- {"name": agent.name, "description": agent.resolved_description or agent.name}
258
- for agent in flock_instance.agents.values()
259
- ]
260
- return {"agents": agents_list}
261
-
262
- return router
flock/core/api/main.py DELETED
@@ -1,162 +0,0 @@
1
- # src/flock/core/api/main.py
2
- """This module defines the FlockAPI class, which is now primarily responsible for
3
- managing and adding user-defined custom API endpoints to a main FastAPI application.
4
- """
5
-
6
- import inspect
7
- from collections.abc import Callable, Sequence
8
- from typing import TYPE_CHECKING, Any
9
-
10
- from fastapi import ( # Ensure Request is aliased
11
- Body,
12
- Depends,
13
- FastAPI,
14
- Request as FastAPIRequest,
15
- )
16
-
17
- from flock.core.logging.logging import get_logger
18
-
19
- from .custom_endpoint import FlockEndpoint
20
-
21
- if TYPE_CHECKING:
22
- from flock.core.flock import Flock
23
-
24
- logger = get_logger("core.api.custom_setup")
25
-
26
-
27
- class FlockAPI:
28
- """A helper class to manage the addition of user-defined custom API endpoints
29
- to an existing FastAPI application, in the context of a Flock instance.
30
- """
31
-
32
- def __init__(
33
- self,
34
- flock_instance: "Flock",
35
- custom_endpoints: Sequence[FlockEndpoint] | dict[tuple[str, list[str] | None], Callable[..., Any]] | None = None,
36
- ):
37
- self.flock = flock_instance
38
- self.processed_custom_endpoints: list[FlockEndpoint] = []
39
- if custom_endpoints:
40
- if isinstance(custom_endpoints, dict):
41
- logger.warning("Received custom_endpoints as dict, converting. Prefer Sequence[FlockEndpoint].")
42
- for (path, methods), cb in custom_endpoints.items():
43
- self.processed_custom_endpoints.append(
44
- FlockEndpoint(path=path, methods=list(methods) if methods else ["GET"], callback=cb)
45
- )
46
- elif isinstance(custom_endpoints, Sequence):
47
- for ep_item in custom_endpoints: # Renamed loop variable
48
- if isinstance(ep_item, FlockEndpoint):
49
- self.processed_custom_endpoints.append(ep_item)
50
- else:
51
- logger.warning(f"Skipping non-FlockEndpoint item in custom_endpoints sequence: {type(ep_item)}")
52
- else:
53
- logger.warning(f"Unsupported type for custom_endpoints: {type(custom_endpoints)}")
54
- logger.info(
55
- f"FlockAPI helper initialized for Flock: '{self.flock.name}'. "
56
- f"Prepared {len(self.processed_custom_endpoints)} custom endpoints."
57
- )
58
-
59
- def add_custom_routes_to_app(self, app: FastAPI):
60
- if not self.processed_custom_endpoints:
61
- logger.debug("No custom endpoints to add to the FastAPI app.")
62
- return
63
-
64
- logger.info(f"Adding {len(self.processed_custom_endpoints)} custom endpoints to the FastAPI app instance.")
65
-
66
- for current_ep_def in self.processed_custom_endpoints: # Use current_ep_def to avoid closure issues
67
-
68
- # This factory now takes current_ep_def to ensure it uses the correct endpoint's details
69
- def _create_handler_factory(
70
- # Capture the specific endpoint definition for this factory instance
71
- specific_ep: FlockEndpoint
72
- ):
73
- # This inner function prepares the payload and calls the user's callback
74
- async def _invoke_user_callback(
75
- request_param: FastAPIRequest, # Parameter for FastAPI's Request object
76
- body_param: Any, # Will be populated by the _route_handler
77
- query_param: Any # Will be populated by the _route_handler
78
- ):
79
- payload_to_user: dict[str, Any] = {"flock": self.flock} # self here refers to FlockAPI instance
80
-
81
- if request_param: # Ensure request_param is not None
82
- payload_to_user.update(request_param.path_params)
83
- # query_param is already the parsed Pydantic model or None
84
- if specific_ep.query_model and query_param is not None:
85
- payload_to_user["query"] = query_param
86
- # Fallback for raw query if callback expects 'query' but no query_model was set
87
- elif 'query' in inspect.signature(specific_ep.callback).parameters and not specific_ep.query_model:
88
- if request_param.query_params:
89
- payload_to_user["query"] = dict(request_param.query_params)
90
-
91
- # body_param is already the parsed Pydantic model or None
92
- if specific_ep.request_model and body_param is not None:
93
- payload_to_user["body"] = body_param
94
- # Fallback for raw body if callback expects 'body' but no request_model was set
95
- elif 'body' in inspect.signature(specific_ep.callback).parameters and \
96
- not specific_ep.request_model and \
97
- request_param.method in {"POST", "PUT", "PATCH"}:
98
- try: payload_to_user["body"] = await request_param.json()
99
- except Exception: payload_to_user["body"] = await request_param.body()
100
-
101
- # If user callback explicitly asks for 'request'
102
- if 'request' in inspect.signature(specific_ep.callback).parameters:
103
- payload_to_user['request'] = request_param
104
-
105
-
106
- user_callback_sig = inspect.signature(specific_ep.callback)
107
- final_kwargs = {
108
- k: v for k, v in payload_to_user.items() if k in user_callback_sig.parameters
109
- }
110
-
111
- if inspect.iscoroutinefunction(specific_ep.callback):
112
- return await specific_ep.callback(**final_kwargs)
113
- return specific_ep.callback(**final_kwargs)
114
-
115
- # --- Select the correct handler signature based on specific_ep's models ---
116
- if specific_ep.request_model and specific_ep.query_model:
117
- async def _route_handler_body_query(
118
- request: FastAPIRequest, # Correct alias for FastAPI Request
119
- body: specific_ep.request_model = Body(...), # type: ignore
120
- query: specific_ep.query_model = Depends(specific_ep.query_model) # type: ignore
121
- ):
122
- return await _invoke_user_callback(request, body, query)
123
- return _route_handler_body_query
124
- elif specific_ep.request_model and not specific_ep.query_model:
125
- async def _route_handler_body_only(
126
- request: FastAPIRequest, # Correct alias
127
- body: specific_ep.request_model = Body(...) # type: ignore
128
- ):
129
- return await _invoke_user_callback(request, body, None)
130
- return _route_handler_body_only
131
- elif not specific_ep.request_model and specific_ep.query_model:
132
- async def _route_handler_query_only(
133
- request: FastAPIRequest, # Correct alias
134
- query: specific_ep.query_model = Depends(specific_ep.query_model) # type: ignore
135
- ):
136
- return await _invoke_user_callback(request, None, query)
137
- return _route_handler_query_only
138
- else: # Neither request_model nor query_model
139
- async def _route_handler_request_only(
140
- request: FastAPIRequest # Correct alias
141
- ):
142
- return await _invoke_user_callback(request, None, None)
143
- return _route_handler_request_only
144
-
145
- # Create the handler for the current_ep_def
146
- selected_handler = _create_handler_factory(current_ep_def) # Pass current_ep_def
147
- selected_handler.__name__ = f"handler_for_{current_ep_def.path.replace('/', '_').lstrip('_')}_{current_ep_def.methods[0]}"
148
-
149
-
150
- app.add_api_route(
151
- current_ep_def.path,
152
- selected_handler,
153
- methods=current_ep_def.methods or ["GET"],
154
- name=current_ep_def.name or f"custom:{current_ep_def.path.replace('/', '_').lstrip('_')}",
155
- include_in_schema=current_ep_def.include_in_schema,
156
- response_model=current_ep_def.response_model,
157
- summary=current_ep_def.summary,
158
- description=current_ep_def.description,
159
- dependencies=current_ep_def.dependencies,
160
- tags=["Flock API Custom Endpoints"],
161
- )
162
- logger.debug(f"Added custom route to app: {current_ep_def.methods} {current_ep_def.path} (Handler: {selected_handler.__name__}, Summary: {current_ep_def.summary})")
flock/core/api/models.py DELETED
@@ -1,101 +0,0 @@
1
- # src/flock/core/api/models.py
2
- """Pydantic models for the Flock API."""
3
-
4
- from datetime import datetime
5
- from typing import Any
6
-
7
- from pydantic import BaseModel, Field
8
-
9
-
10
- class FlockAPIRequest(BaseModel):
11
- """Request model for running an agent via JSON API."""
12
-
13
- agent_name: str = Field(..., description="Name of the agent to run")
14
- inputs: dict[str, Any] = Field(
15
- default_factory=dict, description="Input data for the agent"
16
- )
17
- async_run: bool = Field(
18
- default=False, description="Whether to run asynchronously"
19
- )
20
- use_production_tools: bool = Field(
21
- default=False,
22
- description="If true, run agents with their production tool set where available",
23
- )
24
-
25
-
26
- class FlockAPIResponse(BaseModel):
27
- """Response model for API run requests."""
28
-
29
- run_id: str = Field(..., description="Unique ID for this run")
30
- status: str = Field(..., description="Status of the run")
31
- result: dict[str, Any] | None = Field(
32
- None, description="Run result if completed"
33
- )
34
- started_at: datetime = Field(..., description="When the run started")
35
- completed_at: datetime | None = Field(
36
- None, description="When the run completed"
37
- )
38
- error: str | None = Field(None, description="Error message if failed")
39
-
40
-
41
- class FlockBatchRequest(BaseModel):
42
- """Request model for batch processing via JSON API."""
43
-
44
- agent_name: str = Field(..., description="Name of the agent to run")
45
- batch_inputs: list[dict[str, Any]] | str = Field(
46
- ..., description="List of input dictionaries or path to CSV file"
47
- )
48
- input_mapping: dict[str, str] | None = Field(
49
- None, description="Maps DataFrame/CSV column names to agent input keys"
50
- )
51
- static_inputs: dict[str, Any] | None = Field(
52
- None, description="Inputs constant across all batch runs"
53
- )
54
- parallel: bool = Field(
55
- default=True, description="Whether to run jobs in parallel"
56
- )
57
- max_workers: int = Field(
58
- default=5, description="Max concurrent workers for parallel runs"
59
- )
60
- use_temporal: bool | None = Field(
61
- None, description="Override Flock's enable_temporal setting"
62
- )
63
- box_results: bool = Field(
64
- default=True, description="Wrap results in Box objects"
65
- )
66
- return_errors: bool = Field(
67
- default=False, description="Return Exception objects for failed runs"
68
- )
69
- silent_mode: bool = Field(
70
- default=True, description="Suppress output and show progress bar"
71
- )
72
- write_to_csv: str | None = Field(
73
- None, description="Path to save results as CSV file"
74
- )
75
-
76
-
77
- class FlockBatchResponse(BaseModel):
78
- """Response model for batch processing requests."""
79
-
80
- batch_id: str = Field(..., description="Unique ID for this batch run")
81
- status: str = Field(..., description="Status of the batch run")
82
- results: list[Any] = Field(
83
- default_factory=list,
84
- description="List of results from batch processing",
85
- )
86
- started_at: datetime = Field(..., description="When the batch run started")
87
- completed_at: datetime | None = Field(
88
- None, description="When the batch run completed"
89
- )
90
- error: str | None = Field(None, description="Error message if failed")
91
-
92
- # Additional fields for batch progress tracking
93
- total_items: int = Field(
94
- 0, description="Total number of items in the batch"
95
- )
96
- completed_items: int = Field(
97
- 0, description="Number of completed items in the batch"
98
- )
99
- progress_percentage: float = Field(
100
- 0.0, description="Percentage of completion (0-100)"
101
- )