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.
- 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.543.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.543.dist-info/METADATA +0 -676
- flock_core-0.4.543.dist-info/RECORD +0 -572
- flock_core-0.4.543.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.543.dist-info → flock_core-0.5.0.dist-info}/WHEEL +0 -0
flock/core/util/splitter.py
DELETED
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def split_top_level(spec: str) -> list[str]:
|
|
5
|
-
"""Return raw field strings, split on *top-level* commas."""
|
|
6
|
-
fields: list[str] = []
|
|
7
|
-
start = 0
|
|
8
|
-
depth = 0
|
|
9
|
-
quote_char: str | None = None
|
|
10
|
-
i = 0
|
|
11
|
-
ident_re = re.compile(r"[A-Za-z_]\w*") # cheap identifier
|
|
12
|
-
|
|
13
|
-
while i < len(spec):
|
|
14
|
-
ch = spec[i]
|
|
15
|
-
|
|
16
|
-
# ---------- string handling ----------
|
|
17
|
-
if quote_char:
|
|
18
|
-
if ch == "\\":
|
|
19
|
-
i += 2 # skip escaped char
|
|
20
|
-
continue
|
|
21
|
-
if ch == quote_char:
|
|
22
|
-
quote_char = None
|
|
23
|
-
i += 1
|
|
24
|
-
continue
|
|
25
|
-
|
|
26
|
-
if ch in {"'", '"'}:
|
|
27
|
-
prev = spec[i - 1] if i else " "
|
|
28
|
-
if (
|
|
29
|
-
depth or prev.isspace() or prev in "=([{,:"
|
|
30
|
-
): # looks like a quote
|
|
31
|
-
quote_char = ch
|
|
32
|
-
i += 1
|
|
33
|
-
continue
|
|
34
|
-
|
|
35
|
-
# ---------- bracket / brace / paren ----------
|
|
36
|
-
if ch in "([{":
|
|
37
|
-
depth += 1
|
|
38
|
-
i += 1
|
|
39
|
-
continue
|
|
40
|
-
if ch in ")]}":
|
|
41
|
-
depth = max(depth - 1, 0)
|
|
42
|
-
i += 1
|
|
43
|
-
continue
|
|
44
|
-
|
|
45
|
-
# ---------- field separators ----------
|
|
46
|
-
if ch == "," and depth == 0:
|
|
47
|
-
j = i + 1
|
|
48
|
-
while j < len(spec) and spec[j].isspace():
|
|
49
|
-
j += 1
|
|
50
|
-
if j >= len(spec): # comma at end – split
|
|
51
|
-
fields.append(spec[start:i].strip())
|
|
52
|
-
start = i + 1
|
|
53
|
-
i += 1
|
|
54
|
-
continue
|
|
55
|
-
|
|
56
|
-
id_match = ident_re.match(spec, j)
|
|
57
|
-
if id_match:
|
|
58
|
-
k = id_match.end()
|
|
59
|
-
while k < len(spec) and spec[k].isspace():
|
|
60
|
-
k += 1
|
|
61
|
-
if k >= len(spec) or spec[k] in {":", "|", ","}:
|
|
62
|
-
# confirmed: comma separates two fields
|
|
63
|
-
fields.append(spec[start:i].strip())
|
|
64
|
-
start = i + 1
|
|
65
|
-
i += 1
|
|
66
|
-
continue
|
|
67
|
-
|
|
68
|
-
i += 1
|
|
69
|
-
|
|
70
|
-
fields.append(spec[start:].strip())
|
|
71
|
-
return [f for f in fields if f] # prune empties
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def parse_schema(spec: str) -> list[tuple[str, str, str]]:
|
|
75
|
-
"""Turn *spec* into a list of (name, python_type, description)."""
|
|
76
|
-
result: list[tuple[str, str, str]] = []
|
|
77
|
-
|
|
78
|
-
for field in split_top_level(spec):
|
|
79
|
-
name = ""
|
|
80
|
-
type_str = "str" # default type
|
|
81
|
-
description = ""
|
|
82
|
-
|
|
83
|
-
name_part, _, desc_part = field.partition("|")
|
|
84
|
-
description = desc_part.strip()
|
|
85
|
-
main_part = name_part.strip()
|
|
86
|
-
|
|
87
|
-
if ":" in main_part:
|
|
88
|
-
name, type_candidate = main_part.split(":", 1)
|
|
89
|
-
name = name.strip()
|
|
90
|
-
type_candidate = type_candidate.strip()
|
|
91
|
-
if type_candidate:
|
|
92
|
-
type_str = type_candidate
|
|
93
|
-
else:
|
|
94
|
-
name = main_part # keeps default type
|
|
95
|
-
|
|
96
|
-
if name: # skip broken pieces
|
|
97
|
-
result.append((name, type_str, description))
|
|
98
|
-
|
|
99
|
-
return result
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
# ------------------------------ demo ------------------------------
|
|
103
|
-
if __name__ == "__main__":
|
|
104
|
-
SAMPLE_1 = (
|
|
105
|
-
" name: str | The character's full name,"
|
|
106
|
-
"race: str | The character's fantasy race,"
|
|
107
|
-
"class: Literal['mage','thief'] | The character's profession,"
|
|
108
|
-
"background: str | A brief backstory for the character"
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
SAMPLE_2 = (
|
|
112
|
-
"field_with_internal_quotes: Literal['type_A', "
|
|
113
|
-
'"type_B_with_\'_apostrophe"] | A literal with mixed quotes,'
|
|
114
|
-
" another_field :str| A field with a description"
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
SAMPLE_3 = (
|
|
118
|
-
"field_with_internal_quotes: Literal['type_A', "
|
|
119
|
-
'"type_B_with_\'_apostrophe"] | A literal with mixed quotes,'
|
|
120
|
-
" another_field | A field with a description"
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
SAMPLE_4 = "input, query, output"
|
|
124
|
-
|
|
125
|
-
SAMPLE_5 = (
|
|
126
|
-
"name: str | The character's full name,"
|
|
127
|
-
"race: str | The character's fantasy race,"
|
|
128
|
-
"class: Literal['mage','thief'] | The character's profession, which can be either mage or thief,"
|
|
129
|
-
"background: str | A brief backstory for the character"
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
SAMPLE_6 = (
|
|
133
|
-
"summary: str | A short blurb, e.g. key:value pairs that appear in logs"
|
|
134
|
-
)
|
|
135
|
-
# ➜ [('summary', 'str',
|
|
136
|
-
# 'A short blurb, e.g. key:value pairs that appear in logs')]
|
|
137
|
-
|
|
138
|
-
SAMPLE_7 = "path: str | The literal string 'C:\\\\Program Files\\\\My,App'"
|
|
139
|
-
|
|
140
|
-
# ➜ [('path', 'str',
|
|
141
|
-
# "The literal string 'C:\\Program Files\\My,App'")]
|
|
142
|
-
|
|
143
|
-
SAMPLE_8 = (
|
|
144
|
-
"transform: Callable[[int, str], bool] | Function that returns True on success,"
|
|
145
|
-
"retries: int | How many times to retry"
|
|
146
|
-
)
|
|
147
|
-
# ➜ ('transform', 'Callable[[int, str], bool]', 'Function that returns True on success')
|
|
148
|
-
# ('retries', 'int', 'How many times to retry')
|
|
149
|
-
|
|
150
|
-
SAMPLE_9 = (
|
|
151
|
-
r"regex: str | Pattern such as r'^[A-Z\|a-z]+$',"
|
|
152
|
-
"flags: int | re flags to use"
|
|
153
|
-
)
|
|
154
|
-
# ➜ ('regex', 'str', "Pattern such as r'^[A-Z\\|a-z]+$'")
|
|
155
|
-
# ('flags', 'int', 're flags to use')
|
|
156
|
-
|
|
157
|
-
SAMPLE_10 = "id:int, name:str," # note the final comma!
|
|
158
|
-
# ➜ ('id', 'int', '')
|
|
159
|
-
# ('name', 'str', '')
|
|
160
|
-
|
|
161
|
-
SAMPLE_11 = "id:int | Primary key\nname:str | Display name\nactive:bool"
|
|
162
|
-
# ➜ should not work!
|
|
163
|
-
|
|
164
|
-
SAMPLE_12 = (
|
|
165
|
-
'comment:str | The text "done | failed" goes here,'
|
|
166
|
-
'status:Literal["done","failed"]'
|
|
167
|
-
)
|
|
168
|
-
# ➜ ('comment', 'str', 'The text "done | failed" goes here')
|
|
169
|
-
# ('status', 'Literal["done","failed"]', '')
|
|
170
|
-
|
|
171
|
-
SAMPLE_13 = "choice: Literal['He said \\'yes\\'', 'no'] | User response"
|
|
172
|
-
# ➜ ('choice', "Literal['He said \\'yes\\'', 'no']", 'User response')
|
|
173
|
-
|
|
174
|
-
SAMPLE_14 = ""
|
|
175
|
-
# ➜ []
|
|
176
|
-
|
|
177
|
-
SAMPLE_15 = "username"
|
|
178
|
-
# ➜ [('username', 'str', '')]
|
|
179
|
-
|
|
180
|
-
SAMPLE_16 = (
|
|
181
|
-
"payload: dict[str, list[dict[str, tuple[int,str]]]] "
|
|
182
|
-
"| Arbitrarily complex structure"
|
|
183
|
-
)
|
|
184
|
-
# ➜ ('payload', 'dict[str, list[dict[str, tuple[int,str]]]]',
|
|
185
|
-
# 'Arbitrarily complex structure')
|
|
186
|
-
|
|
187
|
-
SAMPLE_17 = "münze: str | Deutsche Münzbezeichnung, engl. 'coin'"
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
SAMPLE_18 = "ticket_info : str, reasoning : str, search_queries : list[str], relevant_documents: dict[str, float] | dict of pdf_ids as keys and scores as values"
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
SAMPLE_19 = "title, headings: list[str], entities_and_metadata: list[dict[str, str]], type:Literal['news', 'blog', 'opinion piece', 'tweet']"
|
|
194
|
-
# ➜ [('münze', 'str', "Deutsche Münzbezeichnung, engl. 'coin'")]
|
|
195
|
-
|
|
196
|
-
for title, spec in [
|
|
197
|
-
("Sample-1", SAMPLE_1),
|
|
198
|
-
("Sample-2", SAMPLE_2),
|
|
199
|
-
("Sample-3", SAMPLE_3),
|
|
200
|
-
("Sample-4", SAMPLE_4),
|
|
201
|
-
("Sample-5", SAMPLE_5),
|
|
202
|
-
("Sample-6", SAMPLE_6),
|
|
203
|
-
("Sample-7", SAMPLE_7),
|
|
204
|
-
("Sample-8", SAMPLE_8),
|
|
205
|
-
("Sample-9", SAMPLE_9),
|
|
206
|
-
("Sample-10", SAMPLE_10),
|
|
207
|
-
("Sample-11", SAMPLE_11),
|
|
208
|
-
("Sample-12", SAMPLE_12),
|
|
209
|
-
("Sample-13", SAMPLE_13),
|
|
210
|
-
("Sample-14", SAMPLE_14),
|
|
211
|
-
("Sample-15", SAMPLE_15),
|
|
212
|
-
("Sample-16", SAMPLE_16),
|
|
213
|
-
("Sample-17", SAMPLE_17),
|
|
214
|
-
("Sample-18", SAMPLE_18),
|
|
215
|
-
("Sample-19", SAMPLE_19),
|
|
216
|
-
]:
|
|
217
|
-
print(f"\n{title}")
|
|
218
|
-
for row in parse_schema(spec):
|
|
219
|
-
print(row)
|
flock/di.py
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
"""Flock – Dependency-Injection helpers.
|
|
4
|
-
|
|
5
|
-
This module provides a very small façade over the `wd.di` container so that
|
|
6
|
-
other parts of the codebase do not need to know where the active container is
|
|
7
|
-
stored. The bootstrap code – usually located in the runner initialisation –
|
|
8
|
-
should store the `ServiceProvider` instance (returned by ``ServiceCollection.
|
|
9
|
-
build()``) on the `FlockContext` under the key ``di.container``.
|
|
10
|
-
|
|
11
|
-
Example
|
|
12
|
-
-------
|
|
13
|
-
>>> from wd.di import ServiceCollection
|
|
14
|
-
>>> sc = ServiceCollection()
|
|
15
|
-
>>> sc.add_singleton(str, lambda _: "hello")
|
|
16
|
-
>>> container = sc.build()
|
|
17
|
-
>>> ctx = FlockContext()
|
|
18
|
-
>>> ctx.set_variable("di.container", container)
|
|
19
|
-
>>> from flock.di import get_current_container
|
|
20
|
-
>>> assert get_current_container(ctx).get_service(str) == "hello"
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
from typing import TYPE_CHECKING
|
|
24
|
-
|
|
25
|
-
if TYPE_CHECKING: # pragma: no cover
|
|
26
|
-
from wd.di.container import (
|
|
27
|
-
ServiceProvider, # noqa: F401 – import only for typing
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
from flock.core.context.context import FlockContext
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def get_current_container(context: FlockContext | None = None):
|
|
34
|
-
"""Return the active `wd.di` container from *context* if present.
|
|
35
|
-
|
|
36
|
-
If *context* is ``None`` or no container has been attached to it the
|
|
37
|
-
function returns ``None``.
|
|
38
|
-
"""
|
|
39
|
-
if context is None:
|
|
40
|
-
return None
|
|
41
|
-
return context.get_variable("di.container")
|
flock/evaluators/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Package for modules
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Package for modules
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
from collections.abc import Generator
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
|
-
from temporalio import workflow
|
|
5
|
-
|
|
6
|
-
with workflow.unsafe.imports_passed_through():
|
|
7
|
-
import dspy
|
|
8
|
-
|
|
9
|
-
from pydantic import Field, PrivateAttr
|
|
10
|
-
|
|
11
|
-
from flock.core.flock_agent import FlockAgent
|
|
12
|
-
from flock.core.flock_evaluator import FlockEvaluator, FlockEvaluatorConfig
|
|
13
|
-
from flock.core.flock_registry import flock_component
|
|
14
|
-
from flock.core.logging.logging import get_logger
|
|
15
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
16
|
-
from flock.core.mixin.prompt_parser import PromptParserMixin
|
|
17
|
-
|
|
18
|
-
logger = get_logger("evaluators.declarative")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class DeclarativeEvaluatorConfig(FlockEvaluatorConfig):
|
|
22
|
-
"""Configuration for the DeclarativeEvaluator."""
|
|
23
|
-
|
|
24
|
-
override_evaluator_type: str | None = None
|
|
25
|
-
model: str | None = "openai/gpt-4o"
|
|
26
|
-
use_cache: bool = True
|
|
27
|
-
temperature: float = 1.0
|
|
28
|
-
max_tokens: int = 4096
|
|
29
|
-
max_retries: int = 3
|
|
30
|
-
max_tool_calls: int = 10
|
|
31
|
-
stream: bool = Field(
|
|
32
|
-
default=False,
|
|
33
|
-
description="Enable streaming output from the underlying DSPy program.",
|
|
34
|
-
)
|
|
35
|
-
include_thought_process: bool = Field(
|
|
36
|
-
default=False,
|
|
37
|
-
description="Include the thought process in the output.",
|
|
38
|
-
)
|
|
39
|
-
include_reasoning: bool = Field(
|
|
40
|
-
default=False,
|
|
41
|
-
description="Include the reasoning in the output.",
|
|
42
|
-
)
|
|
43
|
-
kwargs: dict[str, Any] = Field(default_factory=dict)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@flock_component(config_class=DeclarativeEvaluatorConfig)
|
|
47
|
-
class DeclarativeEvaluator(
|
|
48
|
-
FlockEvaluator, DSPyIntegrationMixin, PromptParserMixin
|
|
49
|
-
):
|
|
50
|
-
"""Evaluator that uses DSPy for generation."""
|
|
51
|
-
|
|
52
|
-
config: DeclarativeEvaluatorConfig = Field(
|
|
53
|
-
default_factory=DeclarativeEvaluatorConfig,
|
|
54
|
-
description="Evaluator configuration",
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
_cost: float = PrivateAttr(default=0.0)
|
|
58
|
-
_lm_history: list = PrivateAttr(default_factory=list)
|
|
59
|
-
|
|
60
|
-
# def __init__(self, name: str, config: DeclarativeEvaluatorConfig) -> None:
|
|
61
|
-
# super().__init__(name=name, config=config)
|
|
62
|
-
# self._configure_language_model(
|
|
63
|
-
# model=config.model,
|
|
64
|
-
# use_cache=config.use_cache,
|
|
65
|
-
# temperature=config.temperature,
|
|
66
|
-
# max_tokens=config.max_tokens,
|
|
67
|
-
# )
|
|
68
|
-
|
|
69
|
-
async def evaluate(
|
|
70
|
-
self,
|
|
71
|
-
agent: FlockAgent,
|
|
72
|
-
inputs: dict[str, Any],
|
|
73
|
-
tools: list[Any],
|
|
74
|
-
mcp_tools: list[Any] | None = None,
|
|
75
|
-
) -> dict[str, Any]:
|
|
76
|
-
"""Evaluate using DSPy, with optional asynchronous streaming."""
|
|
77
|
-
# --- Setup Signature and LM ---
|
|
78
|
-
|
|
79
|
-
with dspy.context(
|
|
80
|
-
lm=dspy.LM(
|
|
81
|
-
model=self.config.model or agent.model,
|
|
82
|
-
cache=self.config.use_cache,
|
|
83
|
-
temperature=self.config.temperature,
|
|
84
|
-
max_tokens=self.config.max_tokens,
|
|
85
|
-
num_retries=self.config.max_retries,
|
|
86
|
-
)
|
|
87
|
-
):
|
|
88
|
-
try:
|
|
89
|
-
from rich.console import Console
|
|
90
|
-
|
|
91
|
-
console = Console()
|
|
92
|
-
_dspy_signature = self.create_dspy_signature_class(
|
|
93
|
-
agent.name,
|
|
94
|
-
agent.description,
|
|
95
|
-
f"{agent.input} -> {agent.output}",
|
|
96
|
-
)
|
|
97
|
-
# --- Get output field names ---
|
|
98
|
-
# dspy.Signature holds fields in .output_fields attribute
|
|
99
|
-
output_field_names = list(_dspy_signature.output_fields.keys())
|
|
100
|
-
if not output_field_names:
|
|
101
|
-
logger.warning(
|
|
102
|
-
f"DSPy signature for agent '{agent.name}' has no defined output fields. Streaming might not produce text."
|
|
103
|
-
)
|
|
104
|
-
# -----------------------------
|
|
105
|
-
|
|
106
|
-
agent_task = self._select_task(
|
|
107
|
-
_dspy_signature,
|
|
108
|
-
override_evaluator_type=self.config.override_evaluator_type,
|
|
109
|
-
tools=tools,
|
|
110
|
-
max_tool_calls=self.config.max_tool_calls,
|
|
111
|
-
mcp_tools=mcp_tools,
|
|
112
|
-
kwargs=self.config.kwargs,
|
|
113
|
-
)
|
|
114
|
-
except Exception as setup_error:
|
|
115
|
-
logger.error(
|
|
116
|
-
f"Error setting up DSPy task for agent '{agent.name}': {setup_error}",
|
|
117
|
-
exc_info=True,
|
|
118
|
-
)
|
|
119
|
-
raise RuntimeError(
|
|
120
|
-
f"DSPy task setup failed: {setup_error}"
|
|
121
|
-
) from setup_error
|
|
122
|
-
|
|
123
|
-
# --- Conditional Evaluation (Stream vs No Stream) ---
|
|
124
|
-
if self.config.stream:
|
|
125
|
-
logger.info(
|
|
126
|
-
f"Evaluating agent '{agent.name}' with async streaming."
|
|
127
|
-
)
|
|
128
|
-
if not callable(agent_task):
|
|
129
|
-
logger.error("agent_task is not callable, cannot stream.")
|
|
130
|
-
raise TypeError(
|
|
131
|
-
"DSPy task could not be created or is not callable."
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
streaming_task = dspy.streamify(
|
|
135
|
-
agent_task, is_async_program=True
|
|
136
|
-
)
|
|
137
|
-
stream_generator: Generator = streaming_task(**inputs)
|
|
138
|
-
delta_content = ""
|
|
139
|
-
|
|
140
|
-
console.print("\n")
|
|
141
|
-
async for chunk in stream_generator:
|
|
142
|
-
if (
|
|
143
|
-
hasattr(chunk, "choices")
|
|
144
|
-
and chunk.choices
|
|
145
|
-
and hasattr(chunk.choices[0], "delta")
|
|
146
|
-
and chunk.choices[0].delta
|
|
147
|
-
and hasattr(chunk.choices[0].delta, "content")
|
|
148
|
-
):
|
|
149
|
-
delta_content = chunk.choices[0].delta.content
|
|
150
|
-
|
|
151
|
-
if delta_content:
|
|
152
|
-
console.print(delta_content, end="")
|
|
153
|
-
|
|
154
|
-
result_dict, cost, lm_history = self._process_result(
|
|
155
|
-
chunk, inputs
|
|
156
|
-
)
|
|
157
|
-
self._cost = cost
|
|
158
|
-
self._lm_history = lm_history
|
|
159
|
-
|
|
160
|
-
console.print("\n")
|
|
161
|
-
result_dict = self.filter_reasoning(
|
|
162
|
-
result_dict, self.config.include_reasoning
|
|
163
|
-
)
|
|
164
|
-
return self.filter_thought_process(
|
|
165
|
-
result_dict, self.config.include_thought_process
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
else: # Non-streaming path
|
|
169
|
-
logger.info(
|
|
170
|
-
f"Evaluating agent '{agent.name}' without streaming."
|
|
171
|
-
)
|
|
172
|
-
try:
|
|
173
|
-
# Ensure the call is awaited if the underlying task is async
|
|
174
|
-
result_obj = await agent_task.acall(**inputs)
|
|
175
|
-
result_dict, cost, lm_history = self._process_result(
|
|
176
|
-
result_obj, inputs
|
|
177
|
-
)
|
|
178
|
-
self._cost = cost
|
|
179
|
-
self._lm_history = lm_history
|
|
180
|
-
result_dict = self.filter_reasoning(
|
|
181
|
-
result_dict, self.config.include_reasoning
|
|
182
|
-
)
|
|
183
|
-
return self.filter_thought_process(
|
|
184
|
-
result_dict, self.config.include_thought_process
|
|
185
|
-
)
|
|
186
|
-
except Exception as e:
|
|
187
|
-
logger.error(
|
|
188
|
-
f"Error during non-streaming evaluation for agent '{agent.name}': {e}",
|
|
189
|
-
exc_info=True,
|
|
190
|
-
)
|
|
191
|
-
raise RuntimeError(f"Evaluation failed: {e}") from e
|
|
192
|
-
|
|
193
|
-
def filter_thought_process(
|
|
194
|
-
self, result_dict: dict[str, Any], include_thought_process: bool
|
|
195
|
-
) -> dict[str, Any]:
|
|
196
|
-
"""Filter out thought process from the result dictionary."""
|
|
197
|
-
if include_thought_process:
|
|
198
|
-
return result_dict
|
|
199
|
-
else:
|
|
200
|
-
return {
|
|
201
|
-
k: v
|
|
202
|
-
for k, v in result_dict.items()
|
|
203
|
-
if not (k.startswith("trajectory"))
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
def filter_reasoning(
|
|
207
|
-
self, result_dict: dict[str, Any], include_reasoning: bool
|
|
208
|
-
) -> dict[str, Any]:
|
|
209
|
-
"""Filter out reasoning from the result dictionary."""
|
|
210
|
-
if include_reasoning:
|
|
211
|
-
return result_dict
|
|
212
|
-
else:
|
|
213
|
-
return {
|
|
214
|
-
k: v
|
|
215
|
-
for k, v in result_dict.items()
|
|
216
|
-
if not (k.startswith("reasoning"))
|
|
217
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
from typing import Any, Literal
|
|
2
|
-
|
|
3
|
-
from pydantic import Field
|
|
4
|
-
|
|
5
|
-
from flock.core.flock_agent import FlockAgent
|
|
6
|
-
from flock.core.flock_evaluator import FlockEvaluator, FlockEvaluatorConfig
|
|
7
|
-
from flock.core.flock_registry import flock_component
|
|
8
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
9
|
-
from flock.core.mixin.prompt_parser import PromptParserMixin
|
|
10
|
-
from flock.modules.memory.memory_module import MemoryModule, MemoryModuleConfig
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class MemoryEvaluatorConfig(FlockEvaluatorConfig):
|
|
14
|
-
folder_path: str = Field(
|
|
15
|
-
default="concept_memory/",
|
|
16
|
-
description="Directory where memory file and concept graph will be saved",
|
|
17
|
-
)
|
|
18
|
-
concept_graph_file: str = Field(
|
|
19
|
-
default="concept_graph.png",
|
|
20
|
-
description="Base filename for the concept graph image",
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
file_path: str | None = Field(
|
|
24
|
-
default="agent_memory.json", description="Path to save memory file"
|
|
25
|
-
)
|
|
26
|
-
memory_mapping: str | None = Field(
|
|
27
|
-
default=None, description="Memory mapping configuration"
|
|
28
|
-
)
|
|
29
|
-
similarity_threshold: float = Field(
|
|
30
|
-
default=0.5, description="Threshold for semantic similarity"
|
|
31
|
-
)
|
|
32
|
-
max_length: int = Field(
|
|
33
|
-
default=1000, description="Max length of memory entry before splitting"
|
|
34
|
-
)
|
|
35
|
-
save_after_update: bool = Field(
|
|
36
|
-
default=True, description="Whether to save memory after each update"
|
|
37
|
-
)
|
|
38
|
-
splitting_mode: Literal["summary", "semantic", "characters", "none"] = (
|
|
39
|
-
Field(default="none", description="Mode to split memory content")
|
|
40
|
-
)
|
|
41
|
-
enable_read_only_mode: bool = Field(
|
|
42
|
-
default=False, description="Whether to enable read only mode"
|
|
43
|
-
)
|
|
44
|
-
number_of_concepts_to_extract: int = Field(
|
|
45
|
-
default=3, description="Number of concepts to extract from the memory"
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
@flock_component(config_class=MemoryEvaluatorConfig)
|
|
50
|
-
class MemoryEvaluator(FlockEvaluator, DSPyIntegrationMixin, PromptParserMixin):
|
|
51
|
-
"""Evaluator that uses DSPy for generation."""
|
|
52
|
-
|
|
53
|
-
config: MemoryEvaluatorConfig = Field(
|
|
54
|
-
default_factory=MemoryEvaluatorConfig,
|
|
55
|
-
description="Evaluator configuration",
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
async def evaluate(
|
|
59
|
-
self, agent: FlockAgent, inputs: dict[str, Any], tools: list[Any]
|
|
60
|
-
) -> dict[str, Any]:
|
|
61
|
-
"""Simple evaluator that uses a memory concept graph.
|
|
62
|
-
|
|
63
|
-
if inputs contain "query", it searches memory for the query and returns the facts.
|
|
64
|
-
if inputs contain "data", it adds the data to memory
|
|
65
|
-
"""
|
|
66
|
-
result = {}
|
|
67
|
-
memory_module = MemoryModule(
|
|
68
|
-
name=self.name,
|
|
69
|
-
config=MemoryModuleConfig(
|
|
70
|
-
folder_path=self.config.folder_path,
|
|
71
|
-
concept_graph_file=self.config.concept_graph_file,
|
|
72
|
-
file_path=self.config.file_path,
|
|
73
|
-
memory_mapping=self.config.memory_mapping,
|
|
74
|
-
similarity_threshold=self.config.similarity_threshold,
|
|
75
|
-
max_length=self.config.max_length,
|
|
76
|
-
save_after_update=self.config.save_after_update,
|
|
77
|
-
splitting_mode=self.config.splitting_mode,
|
|
78
|
-
enable_read_only_mode=self.config.enable_read_only_mode,
|
|
79
|
-
number_of_concepts_to_extract=self.config.number_of_concepts_to_extract,
|
|
80
|
-
),
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
if "query" in inputs:
|
|
84
|
-
facts = await memory_module.search_memory(agent, inputs)
|
|
85
|
-
result = {"facts": facts}
|
|
86
|
-
|
|
87
|
-
if "data" in inputs:
|
|
88
|
-
await memory_module.add_to_memory(agent, inputs)
|
|
89
|
-
result = {"message": "Data added to memory"}
|
|
90
|
-
return result
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
from pydantic import Field
|
|
4
|
-
|
|
5
|
-
from flock.core.flock_agent import FlockAgent
|
|
6
|
-
from flock.core.flock_evaluator import FlockEvaluator, FlockEvaluatorConfig
|
|
7
|
-
from flock.core.flock_registry import flock_component
|
|
8
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class TestCaseEvaluatorConfig(FlockEvaluatorConfig):
|
|
12
|
-
"""Configuration for the TestCaseEvaluator."""
|
|
13
|
-
|
|
14
|
-
pass
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@flock_component(config_class=TestCaseEvaluatorConfig)
|
|
18
|
-
class TestCaseEvaluator(FlockEvaluator, DSPyIntegrationMixin):
|
|
19
|
-
"""Evaluator for test cases."""
|
|
20
|
-
|
|
21
|
-
config: TestCaseEvaluatorConfig = Field(
|
|
22
|
-
default_factory=TestCaseEvaluatorConfig,
|
|
23
|
-
description="Evaluator configuration",
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
async def evaluate(
|
|
27
|
-
self, agent: FlockAgent, inputs: dict[str, Any], tools: list[Any]
|
|
28
|
-
) -> dict[str, Any]:
|
|
29
|
-
_dspy_signature = self.create_dspy_signature_class(
|
|
30
|
-
agent.name,
|
|
31
|
-
agent.description,
|
|
32
|
-
f"{agent.input} -> {agent.output}",
|
|
33
|
-
)
|
|
34
|
-
output_field_names = list(_dspy_signature.output_fields.keys())
|
|
35
|
-
result = {}
|
|
36
|
-
for output_field_name in output_field_names:
|
|
37
|
-
result[output_field_name] = "Test Result"
|
|
38
|
-
return result
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
from typing import Any
|
|
2
|
-
|
|
3
|
-
from pydantic import Field
|
|
4
|
-
|
|
5
|
-
from flock.core.flock_agent import FlockAgent
|
|
6
|
-
from flock.core.flock_evaluator import FlockEvaluator, FlockEvaluatorConfig
|
|
7
|
-
from flock.core.flock_registry import flock_component
|
|
8
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
9
|
-
from flock.core.mixin.prompt_parser import PromptParserMixin
|
|
10
|
-
from flock.modules.zep.zep_module import ZepModule, ZepModuleConfig
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class ZepEvaluatorConfig(FlockEvaluatorConfig):
|
|
14
|
-
zep_url: str = "http://localhost:8000"
|
|
15
|
-
zep_api_key: str = "apikey"
|
|
16
|
-
min_fact_rating: float = Field(
|
|
17
|
-
default=0.7, description="Minimum rating for facts to be considered"
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@flock_component(config_class=ZepEvaluatorConfig)
|
|
22
|
-
class ZepEvaluator(FlockEvaluator, DSPyIntegrationMixin, PromptParserMixin):
|
|
23
|
-
"""Evaluator that uses DSPy for generation."""
|
|
24
|
-
|
|
25
|
-
config: ZepEvaluatorConfig = Field(
|
|
26
|
-
default_factory=ZepEvaluatorConfig,
|
|
27
|
-
description="Evaluator configuration",
|
|
28
|
-
)
|
|
29
|
-
|
|
30
|
-
async def evaluate(
|
|
31
|
-
self, agent: FlockAgent, inputs: dict[str, Any], tools: list[Any]
|
|
32
|
-
) -> dict[str, Any]:
|
|
33
|
-
"""Simple evaluator that uses Zep.
|
|
34
|
-
|
|
35
|
-
if inputs contain "query", it searches memory for the query and returns the facts.
|
|
36
|
-
if inputs contain "data", it adds the data to memory
|
|
37
|
-
"""
|
|
38
|
-
result = {}
|
|
39
|
-
zep = ZepModule(
|
|
40
|
-
name=self.name,
|
|
41
|
-
config=ZepModuleConfig(
|
|
42
|
-
zep_api_key=self.config.zep_api_key,
|
|
43
|
-
zep_url=self.config.zep_url,
|
|
44
|
-
min_fact_rating=self.config.min_fact_rating,
|
|
45
|
-
enable_read=True,
|
|
46
|
-
enable_write=True,
|
|
47
|
-
),
|
|
48
|
-
)
|
|
49
|
-
client = zep.get_client()
|
|
50
|
-
if "query" in inputs:
|
|
51
|
-
query = inputs["query"]
|
|
52
|
-
facts = zep.search_memory(query, client)
|
|
53
|
-
result = {"facts": facts}
|
|
54
|
-
|
|
55
|
-
if "data" in inputs:
|
|
56
|
-
data = inputs["data"]
|
|
57
|
-
zep.add_to_memory(data, client)
|
|
58
|
-
result = {"message": "Data added to memory"}
|
|
59
|
-
return result
|
flock/modules/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Package for modules
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Package for modules
|