flock-core 0.4.542__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.
- flock/__init__.py +12 -217
- flock/agent.py +1079 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +86 -0
- flock/cli.py +147 -0
- flock/components.py +189 -0
- flock/dashboard/__init__.py +30 -0
- flock/dashboard/collector.py +559 -0
- flock/dashboard/events.py +188 -0
- flock/dashboard/graph_builder.py +563 -0
- flock/dashboard/launcher.py +235 -0
- flock/dashboard/models/graph.py +156 -0
- flock/dashboard/service.py +991 -0
- flock/dashboard/static_v2/assets/index-DFRnI_mt.js +111 -0
- flock/dashboard/static_v2/assets/index-fPLNdmp1.css +1 -0
- flock/dashboard/static_v2/index.html +13 -0
- flock/dashboard/websocket.py +246 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +932 -0
- flock/examples.py +131 -0
- flock/frontend/README.md +778 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4337 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +139 -0
- flock/frontend/src/__tests__/integration/graph-snapshot.test.tsx +647 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +58 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageDetailWindow.tsx +439 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +374 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +348 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/ArtifactTypeFilter.tsx +21 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterFlyout.module.css +104 -0
- flock/frontend/src/components/filters/FilterFlyout.tsx +80 -0
- flock/frontend/src/components/filters/FilterPills.module.css +220 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +189 -0
- flock/frontend/src/components/filters/FilterPills.tsx +143 -0
- flock/frontend/src/components/filters/ProducerFilter.tsx +21 -0
- flock/frontend/src/components/filters/SavedFiltersControl.module.css +60 -0
- flock/frontend/src/components/filters/SavedFiltersControl.test.tsx +158 -0
- flock/frontend/src/components/filters/SavedFiltersControl.tsx +159 -0
- flock/frontend/src/components/filters/TagFilter.tsx +21 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +115 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +110 -0
- flock/frontend/src/components/filters/VisibilityFilter.tsx +21 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +77 -0
- flock/frontend/src/components/graph/AgentNode.tsx +324 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +613 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +64 -0
- flock/frontend/src/components/graph/MessageNode.tsx +129 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +420 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +287 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.module.css +288 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModule.tsx +450 -0
- flock/frontend/src/components/modules/HistoricalArtifactsModuleWrapper.tsx +13 -0
- flock/frontend/src/components/modules/JsonAttributeRenderer.tsx +140 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +93 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +223 -0
- flock/frontend/src/components/modules/TraceModuleJaeger.tsx +1971 -0
- flock/frontend/src/components/modules/TraceModuleJaegerWrapper.tsx +13 -0
- flock/frontend/src/components/modules/registerModules.ts +29 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/MultiSelect.tsx +235 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/components/settings/TracingSettings.tsx +404 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +157 -0
- flock/frontend/src/hooks/usePersistence.ts +141 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +337 -0
- flock/frontend/src/services/graphService.test.ts +330 -0
- flock/frontend/src/services/graphService.ts +75 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +848 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +357 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.ts +650 -0
- flock/frontend/src/store/filterStore.test.ts +250 -0
- flock/frontend/src/store/filterStore.ts +272 -0
- flock/frontend/src/store/graphStore.test.ts +570 -0
- flock/frontend/src/store/graphStore.ts +462 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +75 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +122 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +47 -0
- flock/frontend/src/types/graph.ts +95 -0
- flock/frontend/src/types/modules.ts +10 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/artifacts.ts +24 -0
- flock/frontend/src/utils/mockData.ts +98 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/{core/util → helper}/cli_helper.py +9 -5
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/logging/auto_trace.py +159 -0
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -107
- flock/{core/logging → logging}/logging.py +78 -61
- flock/{core/logging → logging}/telemetry.py +66 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/logging/telemetry_exporter/duckdb_exporter.py +216 -0
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +13 -10
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/logging/trace_and_logged.py +304 -0
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +131 -158
- flock/{core/mcp/mcp_config.py → mcp/config.py} +86 -132
- flock/mcp/manager.py +286 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +16 -58
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +13 -53
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +22 -67
- flock/mcp/servers/websockets/flock_websocket_server.py +12 -45
- flock/{core/mcp/flock_mcp_tool_base.py → mcp/tool.py} +24 -78
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +12 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +3 -3
- flock/orchestrator.py +970 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +277 -0
- flock/store.py +1214 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkmatrix.toml +2 -2
- flock/themes/darkside.toml +1 -1
- flock/themes/deep.toml +2 -2
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +5 -5
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/utility/output_utility_component.py +226 -0
- flock/visibility.py +107 -0
- flock_core-0.5.0.dist-info/METADATA +964 -0
- flock_core-0.5.0.dist-info/RECORD +525 -0
- flock_core-0.5.0.dist-info/entry_points.txt +2 -0
- {flock_core-0.4.542.dist-info → flock_core-0.5.0.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/config.py +0 -56
- flock/core/__init__.py +0 -44
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -262
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -101
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/config/flock_agent_config.py +0 -11
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -214
- flock/core/context/context_manager.py +0 -40
- flock/core/context/context_vars.py +0 -11
- flock/core/evaluation/utils.py +0 -395
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -166
- flock/core/flock.py +0 -1003
- flock/core/flock_agent.py +0 -1258
- flock/core/flock_evaluator.py +0 -60
- flock/core/flock_factory.py +0 -513
- flock/core/flock_module.py +0 -207
- flock/core/flock_registry.py +0 -702
- flock/core/flock_router.py +0 -83
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/logging/live_capture.py +0 -137
- flock/core/logging/trace_and_logged.py +0 -59
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -640
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -445
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -854
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -409
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -141
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -41
- flock/evaluators/__init__.py +0 -1
- flock/evaluators/declarative/__init__.py +0 -1
- flock/evaluators/declarative/declarative_evaluator.py +0 -217
- flock/evaluators/memory/memory_evaluator.py +0 -90
- flock/evaluators/test/test_case_evaluator.py +0 -38
- flock/evaluators/zep/zep_evaluator.py +0 -59
- flock/modules/__init__.py +0 -1
- flock/modules/assertion/__init__.py +0 -1
- flock/modules/assertion/assertion_module.py +0 -286
- flock/modules/callback/__init__.py +0 -1
- flock/modules/callback/callback_module.py +0 -91
- flock/modules/enterprise_memory/README.md +0 -99
- flock/modules/enterprise_memory/enterprise_memory_module.py +0 -526
- flock/modules/mem0/__init__.py +0 -1
- flock/modules/mem0/mem0_module.py +0 -126
- flock/modules/mem0_async/__init__.py +0 -1
- flock/modules/mem0_async/async_mem0_module.py +0 -126
- flock/modules/memory/__init__.py +0 -1
- flock/modules/memory/memory_module.py +0 -429
- flock/modules/memory/memory_parser.py +0 -125
- flock/modules/memory/memory_storage.py +0 -736
- flock/modules/output/__init__.py +0 -1
- flock/modules/output/output_module.py +0 -196
- flock/modules/performance/__init__.py +0 -1
- flock/modules/performance/metrics_module.py +0 -678
- flock/modules/zep/__init__.py +0 -1
- flock/modules/zep/zep_module.py +0 -192
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/routers/__init__.py +0 -1
- flock/routers/agent/__init__.py +0 -1
- flock/routers/agent/agent_router.py +0 -236
- flock/routers/agent/handoff_agent.py +0 -58
- flock/routers/conditional/conditional_router.py +0 -486
- flock/routers/default/__init__.py +0 -1
- flock/routers/default/default_router.py +0 -80
- flock/routers/feedback/feedback_router.py +0 -114
- flock/routers/list_generator/list_generator_router.py +0 -166
- flock/routers/llm/__init__.py +0 -1
- flock/routers/llm/llm_router.py +0 -365
- flock/tools/__init__.py +0 -0
- flock/tools/azure_tools.py +0 -781
- flock/tools/code_tools.py +0 -167
- flock/tools/file_tools.py +0 -149
- flock/tools/github_tools.py +0 -157
- flock/tools/markdown_tools.py +0 -205
- flock/tools/system_tools.py +0 -9
- flock/tools/text_tools.py +0 -810
- flock/tools/web_tools.py +0 -92
- flock/tools/zendesk_tools.py +0 -501
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -237
- flock/webapp/app/api/execution.py +0 -503
- flock/webapp/app/api/flock_management.py +0 -125
- flock/webapp/app/api/registry_viewer.py +0 -29
- flock/webapp/app/chat.py +0 -662
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1086
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -345
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -597
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -811
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -219
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -281
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -389
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -127
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_live_logs.html +0 -13
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -237
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -240
- flock/workflow/flock_workflow.py +0 -225
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -60
- flock_core-0.4.542.dist-info/METADATA +0 -676
- flock_core-0.4.542.dist-info/RECORD +0 -572
- flock_core-0.4.542.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {flock_core-0.4.542.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
# src/flock/modules/asserts/assertion_module.py (New File)
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from collections.abc import Callable
|
|
5
|
-
from typing import Any, Literal
|
|
6
|
-
|
|
7
|
-
import dspy # For potential LLM-based rule checking
|
|
8
|
-
from pydantic import BaseModel, Field, PrivateAttr, ValidationError
|
|
9
|
-
|
|
10
|
-
from flock.core.context.context import FlockContext
|
|
11
|
-
from flock.core.flock_agent import FlockAgent
|
|
12
|
-
from flock.core.flock_module import FlockModule, FlockModuleConfig
|
|
13
|
-
|
|
14
|
-
# Need registry access if rules are callables defined elsewhere
|
|
15
|
-
from flock.core.flock_registry import flock_component, get_registry
|
|
16
|
-
from flock.core.logging.logging import get_logger
|
|
17
|
-
|
|
18
|
-
logger = get_logger("module.assertion")
|
|
19
|
-
|
|
20
|
-
# --- Rule Definition ---
|
|
21
|
-
# Rules can be defined in several ways:
|
|
22
|
-
# 1. Python lambda/function: (result: Dict, inputs: Dict, context: FlockContext) -> bool | Tuple[bool, str]
|
|
23
|
-
# 2. String referencing a registered callable: "my_validation_function"
|
|
24
|
-
# 3. Natural language rule string: "The summary must contain the keyword 'Flock'." (requires LLM judge)
|
|
25
|
-
# 4. Pydantic Model: The output must conform to this Pydantic model.
|
|
26
|
-
|
|
27
|
-
RuleType = (
|
|
28
|
-
Callable[[dict, dict, FlockContext | None], bool | tuple[bool, str]]
|
|
29
|
-
| str
|
|
30
|
-
| type[BaseModel]
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class Rule(BaseModel):
|
|
35
|
-
"""Container for a single assertion rule."""
|
|
36
|
-
|
|
37
|
-
condition: RuleType = Field(
|
|
38
|
-
...,
|
|
39
|
-
description="""
|
|
40
|
-
# --- Rule Definition ---
|
|
41
|
-
# Rules can be defined in several ways:
|
|
42
|
-
# 1. Python lambda/function: (result: Dict, inputs: Dict, context: FlockContext) -> bool | Tuple[bool, str]
|
|
43
|
-
# 2. String referencing a registered callable: "my_validation_function"
|
|
44
|
-
# 3. Natural language rule string: "The summary must contain the keyword 'Flock'." (requires LLM judge)
|
|
45
|
-
# 4. Pydantic Model: The output must conform to this Pydantic model.
|
|
46
|
-
""",
|
|
47
|
-
)
|
|
48
|
-
fail_message: str # Message to provide as feedback on failure
|
|
49
|
-
name: str | None = None # Optional name for clarity
|
|
50
|
-
|
|
51
|
-
def __post_init__(self):
|
|
52
|
-
# Basic validation of fail_message
|
|
53
|
-
if not isinstance(self.fail_message, str) or not self.fail_message:
|
|
54
|
-
raise ValueError("Rule fail_message must be a non-empty string.")
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
class AssertionModuleConfig(FlockModuleConfig):
|
|
58
|
-
"""--- Rule Definition ---
|
|
59
|
-
Rules can be defined in several ways:
|
|
60
|
-
1. Python lambda/function: (result: Dict, inputs: Dict, context: FlockContext) -> bool | Tuple[bool, str]
|
|
61
|
-
2. String referencing a registered callable: "my_validation_function"
|
|
62
|
-
3. Natural language rule string: "The summary must contain the keyword 'Flock'." (requires LLM judge)
|
|
63
|
-
4. Pydantic Model: The output must conform to this Pydantic model.
|
|
64
|
-
"""
|
|
65
|
-
|
|
66
|
-
rules: list[Rule] = Field(
|
|
67
|
-
default_factory=list,
|
|
68
|
-
description="List of rules to check against the agent's output.",
|
|
69
|
-
)
|
|
70
|
-
# Optional LLM for evaluating natural language rules
|
|
71
|
-
judge_lm_model: str | None = Field(
|
|
72
|
-
None, description="LLM model to use for judging natural language rules."
|
|
73
|
-
)
|
|
74
|
-
# How to handle failure
|
|
75
|
-
on_failure: Literal["add_feedback", "raise_error", "log_warning"] = Field(
|
|
76
|
-
default="add_feedback",
|
|
77
|
-
description="Action on rule failure: 'add_feedback' to context, 'raise_error', 'log_warning'.",
|
|
78
|
-
)
|
|
79
|
-
feedback_context_key: str = Field(
|
|
80
|
-
default="flock.assertion_feedback",
|
|
81
|
-
description="Context key to store failure messages for retry loops.",
|
|
82
|
-
)
|
|
83
|
-
clear_feedback_on_success: bool = Field(
|
|
84
|
-
default=True,
|
|
85
|
-
description="Clear the feedback key from context if all assertions pass.",
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@flock_component(config_class=AssertionModuleConfig)
|
|
90
|
-
class AssertionCheckerModule(FlockModule):
|
|
91
|
-
"""Checks the output of an agent against a set of defined rules.
|
|
92
|
-
|
|
93
|
-
Can trigger different actions on failure, including adding feedback
|
|
94
|
-
to the context to enable self-correction loops via routing.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
name: str = "assertion_checker"
|
|
98
|
-
config: AssertionModuleConfig = Field(default_factory=AssertionModuleConfig)
|
|
99
|
-
_judge_lm: dspy.LM | None = PrivateAttr(None) # Initialize lazily
|
|
100
|
-
|
|
101
|
-
def _get_judge_lm(self) -> dspy.LM | None:
|
|
102
|
-
"""Initializes the judge LM if needed."""
|
|
103
|
-
if self.config.judge_lm_model and self._judge_lm is None:
|
|
104
|
-
try:
|
|
105
|
-
self._judge_lm = dspy.LM(self.config.judge_lm_model)
|
|
106
|
-
except Exception as e:
|
|
107
|
-
logger.error(
|
|
108
|
-
f"Failed to initialize judge LM '{self.config.judge_lm_model}': {e}"
|
|
109
|
-
)
|
|
110
|
-
# Proceed without judge LM for other rule types
|
|
111
|
-
return self._judge_lm
|
|
112
|
-
|
|
113
|
-
async def on_post_evaluate(
|
|
114
|
-
self,
|
|
115
|
-
agent: FlockAgent,
|
|
116
|
-
inputs: dict[str, Any],
|
|
117
|
-
context: FlockContext | None = None,
|
|
118
|
-
result: dict[str, Any] | None = None,
|
|
119
|
-
) -> dict[str, Any]:
|
|
120
|
-
"""Checks rules after the main evaluator runs."""
|
|
121
|
-
if not self.config.rules:
|
|
122
|
-
return result # No rules to check
|
|
123
|
-
|
|
124
|
-
logger.debug(f"Running assertion checks for agent '{agent.name}'...")
|
|
125
|
-
all_passed = True
|
|
126
|
-
failed_messages = []
|
|
127
|
-
registry = get_registry() # Needed for callable lookup
|
|
128
|
-
|
|
129
|
-
for i, rule in enumerate(self.config.rules):
|
|
130
|
-
rule_name = rule.name or f"Rule_{i + 1}"
|
|
131
|
-
passed = False
|
|
132
|
-
eval_result = None
|
|
133
|
-
feedback_msg = rule.fail_message
|
|
134
|
-
|
|
135
|
-
try:
|
|
136
|
-
condition = rule.condition
|
|
137
|
-
if callable(condition):
|
|
138
|
-
# Rule is a Python function/lambda
|
|
139
|
-
logger.debug(f"Checking callable rule: {rule_name}")
|
|
140
|
-
eval_result = condition(result, inputs, context)
|
|
141
|
-
elif isinstance(condition, str) and registry.contains(
|
|
142
|
-
condition
|
|
143
|
-
):
|
|
144
|
-
# Rule is a string referencing a registered callable
|
|
145
|
-
logger.debug(
|
|
146
|
-
f"Checking registered callable rule: '{condition}'"
|
|
147
|
-
)
|
|
148
|
-
rule_func = registry.get_callable(condition)
|
|
149
|
-
eval_result = rule_func(result, inputs, context)
|
|
150
|
-
elif isinstance(condition, str):
|
|
151
|
-
# Rule is a natural language string (requires judge LLM)
|
|
152
|
-
logger.debug(
|
|
153
|
-
f"Checking natural language rule: '{condition}'"
|
|
154
|
-
)
|
|
155
|
-
judge_lm = self._get_judge_lm()
|
|
156
|
-
if judge_lm:
|
|
157
|
-
# Define a simple judge signature dynamically or use a predefined one
|
|
158
|
-
class JudgeSignature(dspy.Signature):
|
|
159
|
-
"""Evaluate if the output meets the rule based on input and output."""
|
|
160
|
-
|
|
161
|
-
program_input: str = dspy.InputField(
|
|
162
|
-
desc="Input provided to the agent."
|
|
163
|
-
)
|
|
164
|
-
program_output: str = dspy.InputField(
|
|
165
|
-
desc="Output generated by the agent."
|
|
166
|
-
)
|
|
167
|
-
rule_to_check: str = dspy.InputField(
|
|
168
|
-
desc="The rule to verify."
|
|
169
|
-
)
|
|
170
|
-
is_met: bool = dspy.OutputField(
|
|
171
|
-
desc="True if the rule is met, False otherwise."
|
|
172
|
-
)
|
|
173
|
-
reasoning: str = dspy.OutputField(
|
|
174
|
-
desc="Brief reasoning for the decision."
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
judge_predictor = dspy.Predict(
|
|
178
|
-
JudgeSignature, llm=judge_lm
|
|
179
|
-
)
|
|
180
|
-
# Convert complex dicts/lists to strings for the judge prompt
|
|
181
|
-
input_str = json.dumps(inputs, default=str, indent=2)
|
|
182
|
-
result_str = json.dumps(result, default=str, indent=2)
|
|
183
|
-
judge_pred = judge_predictor(
|
|
184
|
-
program_input=input_str,
|
|
185
|
-
program_output=result_str,
|
|
186
|
-
rule_to_check=condition,
|
|
187
|
-
)
|
|
188
|
-
passed = judge_pred.is_met
|
|
189
|
-
feedback_msg = f"{rule.fail_message} (Reason: {judge_pred.reasoning})"
|
|
190
|
-
logger.debug(
|
|
191
|
-
f"LLM Judge result for rule '{condition}': {passed} ({judge_pred.reasoning})"
|
|
192
|
-
)
|
|
193
|
-
else:
|
|
194
|
-
logger.warning(
|
|
195
|
-
f"Cannot evaluate natural language rule '{condition}' - no judge_lm_model configured."
|
|
196
|
-
)
|
|
197
|
-
passed = True # Default to pass if no judge available? Or fail? Let's pass.
|
|
198
|
-
|
|
199
|
-
elif isinstance(condition, type) and issubclass(
|
|
200
|
-
condition, BaseModel
|
|
201
|
-
):
|
|
202
|
-
# Rule is a Pydantic model for validation
|
|
203
|
-
logger.debug(
|
|
204
|
-
f"Checking Pydantic validation rule: {condition.__name__}"
|
|
205
|
-
)
|
|
206
|
-
try:
|
|
207
|
-
# Assumes the *entire* result dict should match the model
|
|
208
|
-
# More specific logic might be needed (e.g., validate only a specific key)
|
|
209
|
-
condition.model_validate(result)
|
|
210
|
-
passed = True
|
|
211
|
-
except ValidationError as e:
|
|
212
|
-
passed = False
|
|
213
|
-
feedback_msg = (
|
|
214
|
-
f"{rule.fail_message} (Validation Error: {e})"
|
|
215
|
-
)
|
|
216
|
-
else:
|
|
217
|
-
logger.warning(
|
|
218
|
-
f"Unsupported rule type for rule '{rule_name}': {type(condition)}"
|
|
219
|
-
)
|
|
220
|
-
continue # Skip rule
|
|
221
|
-
|
|
222
|
-
# Process result if it was a callable returning bool or (bool, msg)
|
|
223
|
-
if eval_result is not None:
|
|
224
|
-
if (
|
|
225
|
-
isinstance(eval_result, tuple)
|
|
226
|
-
and len(eval_result) == 2
|
|
227
|
-
and isinstance(eval_result[0], bool)
|
|
228
|
-
):
|
|
229
|
-
passed, custom_msg = eval_result
|
|
230
|
-
if not passed and custom_msg:
|
|
231
|
-
feedback_msg = (
|
|
232
|
-
custom_msg # Use custom message on failure
|
|
233
|
-
)
|
|
234
|
-
elif isinstance(eval_result, bool):
|
|
235
|
-
passed = eval_result
|
|
236
|
-
else:
|
|
237
|
-
logger.warning(
|
|
238
|
-
f"Rule callable '{rule_name}' returned unexpected type: {type(eval_result)}. Rule skipped."
|
|
239
|
-
)
|
|
240
|
-
continue
|
|
241
|
-
|
|
242
|
-
# Handle failure
|
|
243
|
-
if not passed:
|
|
244
|
-
all_passed = False
|
|
245
|
-
failed_messages.append(feedback_msg)
|
|
246
|
-
logger.warning(
|
|
247
|
-
f"Assertion Failed for agent '{agent.name}': {feedback_msg}"
|
|
248
|
-
)
|
|
249
|
-
# Optionally break early? For now, check all rules.
|
|
250
|
-
|
|
251
|
-
except Exception as e:
|
|
252
|
-
logger.error(
|
|
253
|
-
f"Error executing rule '{rule_name}' for agent '{agent.name}': {e}",
|
|
254
|
-
exc_info=True,
|
|
255
|
-
)
|
|
256
|
-
all_passed = False
|
|
257
|
-
failed_messages.append(
|
|
258
|
-
f"Error checking rule '{rule_name}': {e}"
|
|
259
|
-
)
|
|
260
|
-
# Treat error during check as failure
|
|
261
|
-
|
|
262
|
-
# --- Take action based on results ---
|
|
263
|
-
if not all_passed:
|
|
264
|
-
logger.warning(f"Agent '{agent.name}' failed assertion checks.")
|
|
265
|
-
if self.config.on_failure == "add_feedback" and context:
|
|
266
|
-
context.set_variable(
|
|
267
|
-
self.config.feedback_context_key, "\n".join(failed_messages)
|
|
268
|
-
)
|
|
269
|
-
logger.debug(
|
|
270
|
-
f"Added assertion feedback to context key '{self.config.feedback_context_key}'"
|
|
271
|
-
)
|
|
272
|
-
elif self.config.on_failure == "raise_error":
|
|
273
|
-
# Maybe wrap in a specific FlockAssertionError
|
|
274
|
-
raise AssertionError(
|
|
275
|
-
f"Agent '{agent.name}' failed assertions: {'; '.join(failed_messages)}"
|
|
276
|
-
)
|
|
277
|
-
# else "log_warning" is default behavior
|
|
278
|
-
elif context and self.config.clear_feedback_on_success:
|
|
279
|
-
# Clear feedback key if all rules passed and key exists
|
|
280
|
-
if self.config.feedback_context_key in context.state:
|
|
281
|
-
del context.state[self.config.feedback_context_key]
|
|
282
|
-
logger.debug(
|
|
283
|
-
f"Cleared assertion feedback key '{self.config.feedback_context_key}' on success."
|
|
284
|
-
)
|
|
285
|
-
|
|
286
|
-
return result # Return the original result unmodified
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Package for modules
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
"""Callback module for handling agent lifecycle hooks."""
|
|
2
|
-
|
|
3
|
-
from collections.abc import Awaitable, Callable
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from pydantic import Field
|
|
7
|
-
|
|
8
|
-
from flock.core import FlockModule, FlockModuleConfig
|
|
9
|
-
from flock.core.context.context import FlockContext
|
|
10
|
-
from flock.core.flock_registry import flock_component
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class CallbackModuleConfig(FlockModuleConfig):
|
|
14
|
-
"""Configuration for callback module."""
|
|
15
|
-
|
|
16
|
-
initialize_callback: (
|
|
17
|
-
Callable[[Any, dict[str, Any]], Awaitable[None]] | None
|
|
18
|
-
) = Field(
|
|
19
|
-
default=None,
|
|
20
|
-
description="Optional callback function for initialization",
|
|
21
|
-
)
|
|
22
|
-
evaluate_callback: (
|
|
23
|
-
Callable[[Any, dict[str, Any]], Awaitable[dict[str, Any]]] | None
|
|
24
|
-
) = Field(
|
|
25
|
-
default=None, description="Optional callback function for evaluate"
|
|
26
|
-
)
|
|
27
|
-
terminate_callback: (
|
|
28
|
-
Callable[[Any, dict[str, Any], dict[str, Any]], Awaitable[None]] | None
|
|
29
|
-
) = Field(
|
|
30
|
-
default=None, description="Optional callback function for termination"
|
|
31
|
-
)
|
|
32
|
-
on_error_callback: (
|
|
33
|
-
Callable[[Any, Exception, dict[str, Any]], Awaitable[None]] | None
|
|
34
|
-
) = Field(
|
|
35
|
-
default=None,
|
|
36
|
-
description="Optional callback function for error handling",
|
|
37
|
-
)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@flock_component(config_class=CallbackModuleConfig)
|
|
41
|
-
class CallbackModule(FlockModule):
|
|
42
|
-
"""Module that provides callback functionality for agent lifecycle events."""
|
|
43
|
-
|
|
44
|
-
name: str = "callbacks"
|
|
45
|
-
config: CallbackModuleConfig = Field(
|
|
46
|
-
default_factory=CallbackModuleConfig,
|
|
47
|
-
description="Callback module configuration",
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
async def pre_initialize(
|
|
51
|
-
self,
|
|
52
|
-
agent: Any,
|
|
53
|
-
inputs: dict[str, Any],
|
|
54
|
-
context: FlockContext | None = None,
|
|
55
|
-
) -> None:
|
|
56
|
-
"""Run initialize callback if configured."""
|
|
57
|
-
if self.config.initialize_callback:
|
|
58
|
-
await self.config.initialize_callback(agent, inputs)
|
|
59
|
-
|
|
60
|
-
async def on_pre_evaluate(
|
|
61
|
-
self,
|
|
62
|
-
agent: Any,
|
|
63
|
-
inputs: dict[str, Any],
|
|
64
|
-
context: FlockContext | None = None,
|
|
65
|
-
) -> dict[str, Any]:
|
|
66
|
-
"""Run evaluate callback if configured."""
|
|
67
|
-
if self.config.evaluate_callback:
|
|
68
|
-
return await self.config.evaluate_callback(agent, inputs)
|
|
69
|
-
return inputs
|
|
70
|
-
|
|
71
|
-
async def pre_terminate(
|
|
72
|
-
self,
|
|
73
|
-
agent: Any,
|
|
74
|
-
inputs: dict[str, Any],
|
|
75
|
-
context: FlockContext | None = None,
|
|
76
|
-
result: dict[str, Any] | None = None,
|
|
77
|
-
) -> None:
|
|
78
|
-
"""Run terminate callback if configured."""
|
|
79
|
-
if self.config.terminate_callback:
|
|
80
|
-
await self.config.terminate_callback(agent, inputs, result)
|
|
81
|
-
|
|
82
|
-
async def on_error(
|
|
83
|
-
self,
|
|
84
|
-
agent: Any,
|
|
85
|
-
error: Exception,
|
|
86
|
-
inputs: dict[str, Any],
|
|
87
|
-
context: FlockContext | None = None,
|
|
88
|
-
) -> None:
|
|
89
|
-
"""Run error callback if configured."""
|
|
90
|
-
if self.config.on_error_callback:
|
|
91
|
-
await self.config.on_error_callback(agent, error, inputs)
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# Enterprise Memory Module
|
|
2
|
-
|
|
3
|
-
The **EnterpriseMemoryModule** brings durable, scalable memory to Flock agents by
|
|
4
|
-
combining a true vector store (Chroma) with a property-graph database
|
|
5
|
-
(Neo4j / Memgraph). It is a drop‐in replacement for the default
|
|
6
|
-
`memory` module when you need:
|
|
7
|
-
|
|
8
|
-
* millions of memory chunks without exhausting RAM
|
|
9
|
-
* concurrent writers (many agents / processes / machines)
|
|
10
|
-
* rich concept-graph queries and visualisation
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
## How it works
|
|
14
|
-
|
|
15
|
-
| Concern | Technology |
|
|
16
|
-
|--------------------- |------------|
|
|
17
|
-
| Vector similarity | **Pinecone**, **Chroma**, **Azure Cognitive Search** |
|
|
18
|
-
| Concept graph | **Cypher** database (Neo4j / Memgraph) |
|
|
19
|
-
| Embeddings | `sentence-transformers` (`all-MiniLM-L6-v2`) |
|
|
20
|
-
| Concept extraction | Agent's LLM via DSPy signature |
|
|
21
|
-
|
|
22
|
-
* Each memory chunk is embedded and added to the Chroma collection.
|
|
23
|
-
* Concepts are extracted; duplicates are eliminated via case-insensitive
|
|
24
|
-
and fuzzy matching (≥ 0.85 similarity).
|
|
25
|
-
* Memory nodes and `(:Memory)-[:MENTIONS]->(:Concept)` edges are merged
|
|
26
|
-
into the graph DB in batched transactions.
|
|
27
|
-
* Optional: export a PNG of the concept graph after every update.
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
## Configuration options (`EnterpriseMemoryModuleConfig`)
|
|
31
|
-
|
|
32
|
-
```yaml
|
|
33
|
-
chroma_path: ./vector_store # disk path if running embedded
|
|
34
|
-
chroma_host: null # host of remote Chroma server (optional)
|
|
35
|
-
chroma_port: 8000
|
|
36
|
-
chroma_collection: flock_memories # collection name
|
|
37
|
-
|
|
38
|
-
# or Pinecone
|
|
39
|
-
vector_backend: pinecone
|
|
40
|
-
pinecone_api_key: <YOUR_KEY>
|
|
41
|
-
pinecone_env: gcp-starter
|
|
42
|
-
pinecone_index: flock-memories
|
|
43
|
-
|
|
44
|
-
# or Azure Cognitive Search
|
|
45
|
-
vector_backend: azure
|
|
46
|
-
azure_search_endpoint: https://<service>.search.windows.net
|
|
47
|
-
azure_search_key: <KEY>
|
|
48
|
-
azure_search_index_name: flock-memories
|
|
49
|
-
|
|
50
|
-
cypher_uri: bolt://localhost:7687
|
|
51
|
-
cypher_username: neo4j
|
|
52
|
-
cypher_password: password
|
|
53
|
-
|
|
54
|
-
similarity_threshold: 0.5 # for retrieval
|
|
55
|
-
max_results: 10
|
|
56
|
-
number_of_concepts_to_extract: 3
|
|
57
|
-
save_interval: 10 # batch size before commit
|
|
58
|
-
|
|
59
|
-
export_graph_image: false # set true to emit PNGs
|
|
60
|
-
graph_image_dir: ./concept_graphs # where to store images
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
## Dependencies
|
|
65
|
-
|
|
66
|
-
Add the following to your project (examples with pip):
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
pip install chromadb>=0.4.20
|
|
70
|
-
pip install neo4j>=5.14.0
|
|
71
|
-
pip install sentence-transformers>=2.7.0
|
|
72
|
-
pip install matplotlib networkx # only needed when export_graph_image = true
|
|
73
|
-
pip install pinecone-client # if using Pinecone
|
|
74
|
-
pip install azure-search-documents # if using Azure Search
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
You also need a running Neo4j **or** Memgraph instance. The module uses
|
|
78
|
-
the Bolt protocol and Cypher `MERGE`, which works on both.
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
## Usage
|
|
82
|
-
|
|
83
|
-
```python
|
|
84
|
-
from flock.modules.enterprise_memory.enterprise_memory_module import (
|
|
85
|
-
EnterpriseMemoryModule, EnterpriseMemoryModuleConfig,
|
|
86
|
-
)
|
|
87
|
-
|
|
88
|
-
agent.add_module(
|
|
89
|
-
EnterpriseMemoryModule(
|
|
90
|
-
name="enterprise_memory",
|
|
91
|
-
config=EnterpriseMemoryModuleConfig(
|
|
92
|
-
cypher_password=os.environ["NEO4J_PASSWORD"],
|
|
93
|
-
export_graph_image=True,
|
|
94
|
-
),
|
|
95
|
-
)
|
|
96
|
-
)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
The rest of the agent code stays unchanged.
|