flock-core 0.5.0b28__py3-none-any.whl → 0.5.56b0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flock-core might be problematic. Click here for more details.
- flock/__init__.py +12 -217
- flock/agent.py +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/{core/util → helper}/cli_helper.py +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- 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 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -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 +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -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/darkside.toml +1 -1
- 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 +1 -1
- 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/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.56b0.dist-info/METADATA +747 -0
- flock_core-0.5.56b0.dist-info/RECORD +398 -0
- flock_core-0.5.56b0.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.56b0.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/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- 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 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- 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/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- 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 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- 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 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- 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 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- 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 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- 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 -118
- 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/_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/_streaming_results_container.html +0 -195
- 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 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.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.5.0b28.dist-info → flock_core-0.5.56b0.dist-info}/WHEEL +0 -0
|
@@ -1,606 +0,0 @@
|
|
|
1
|
-
# src/flock/components/evaluation/declarative_evaluation_component.py
|
|
2
|
-
"""DeclarativeEvaluationComponent - DSPy-based evaluation using the unified component system."""
|
|
3
|
-
|
|
4
|
-
from collections import OrderedDict
|
|
5
|
-
from collections.abc import Callable, Generator
|
|
6
|
-
from contextlib import nullcontext
|
|
7
|
-
from typing import Any, Literal, override
|
|
8
|
-
|
|
9
|
-
from temporalio import workflow
|
|
10
|
-
|
|
11
|
-
with workflow.unsafe.imports_passed_through():
|
|
12
|
-
import dspy
|
|
13
|
-
|
|
14
|
-
from pydantic import Field, PrivateAttr
|
|
15
|
-
|
|
16
|
-
from flock.core.component.agent_component_base import AgentComponentConfig
|
|
17
|
-
from flock.core.component.evaluation_component import EvaluationComponent
|
|
18
|
-
from flock.core.context.context import FlockContext
|
|
19
|
-
from flock.core.logging.logging import get_logger
|
|
20
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
21
|
-
from flock.core.mixin.prompt_parser import PromptParserMixin
|
|
22
|
-
from flock.core.registry import flock_component
|
|
23
|
-
|
|
24
|
-
logger = get_logger("components.evaluation.declarative")
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
_live_patch_applied = False
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def _ensure_live_crop_above() -> None:
|
|
31
|
-
"""Monkeypatch rich.live_render to support 'crop_above' overflow."""
|
|
32
|
-
global _live_patch_applied
|
|
33
|
-
if _live_patch_applied:
|
|
34
|
-
return
|
|
35
|
-
try:
|
|
36
|
-
from typing import Literal as _Literal
|
|
37
|
-
|
|
38
|
-
from rich import live_render as _lr
|
|
39
|
-
except Exception:
|
|
40
|
-
return
|
|
41
|
-
|
|
42
|
-
# Extend the accepted literal at runtime so type checks don't block the new option.
|
|
43
|
-
current_args = getattr(_lr.VerticalOverflowMethod, "__args__", ())
|
|
44
|
-
if "crop_above" not in current_args:
|
|
45
|
-
_lr.VerticalOverflowMethod = _Literal[
|
|
46
|
-
"crop", "crop_above", "ellipsis", "visible"
|
|
47
|
-
] # type: ignore[assignment]
|
|
48
|
-
|
|
49
|
-
if getattr(_lr.LiveRender.__rich_console__, "_flock_crop_above", False):
|
|
50
|
-
_live_patch_applied = True
|
|
51
|
-
return
|
|
52
|
-
|
|
53
|
-
Segment = _lr.Segment
|
|
54
|
-
Text = _lr.Text
|
|
55
|
-
loop_last = _lr.loop_last
|
|
56
|
-
|
|
57
|
-
def _patched_rich_console(self, console, options):
|
|
58
|
-
renderable = self.renderable
|
|
59
|
-
style = console.get_style(self.style)
|
|
60
|
-
lines = console.render_lines(
|
|
61
|
-
renderable, options, style=style, pad=False
|
|
62
|
-
)
|
|
63
|
-
shape = Segment.get_shape(lines)
|
|
64
|
-
|
|
65
|
-
_, height = shape
|
|
66
|
-
max_height = options.size.height
|
|
67
|
-
if height > max_height:
|
|
68
|
-
if self.vertical_overflow == "crop":
|
|
69
|
-
lines = lines[:max_height]
|
|
70
|
-
shape = Segment.get_shape(lines)
|
|
71
|
-
elif self.vertical_overflow == "crop_above":
|
|
72
|
-
lines = lines[-max_height:]
|
|
73
|
-
shape = Segment.get_shape(lines)
|
|
74
|
-
elif self.vertical_overflow == "ellipsis" and max_height > 0:
|
|
75
|
-
lines = lines[: (max_height - 1)]
|
|
76
|
-
overflow_text = Text(
|
|
77
|
-
"...",
|
|
78
|
-
overflow="crop",
|
|
79
|
-
justify="center",
|
|
80
|
-
end="",
|
|
81
|
-
style="live.ellipsis",
|
|
82
|
-
)
|
|
83
|
-
lines.append(list(console.render(overflow_text)))
|
|
84
|
-
shape = Segment.get_shape(lines)
|
|
85
|
-
self._shape = shape
|
|
86
|
-
|
|
87
|
-
new_line = Segment.line()
|
|
88
|
-
for last, line in loop_last(lines):
|
|
89
|
-
yield from line
|
|
90
|
-
if not last:
|
|
91
|
-
yield new_line
|
|
92
|
-
|
|
93
|
-
_patched_rich_console._flock_crop_above = True # type: ignore[attr-defined]
|
|
94
|
-
_lr.LiveRender.__rich_console__ = _patched_rich_console
|
|
95
|
-
_live_patch_applied = True
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
class DeclarativeEvaluationConfig(AgentComponentConfig):
|
|
99
|
-
"""Configuration for the DeclarativeEvaluationComponent."""
|
|
100
|
-
|
|
101
|
-
override_evaluator_type: str | None = None
|
|
102
|
-
model: str | None = "openai/gpt-4o"
|
|
103
|
-
use_cache: bool = True
|
|
104
|
-
temperature: float = 1.0
|
|
105
|
-
max_tokens: int = 32000
|
|
106
|
-
max_retries: int = 3
|
|
107
|
-
max_tool_calls: int = 10
|
|
108
|
-
no_output: bool = Field(
|
|
109
|
-
default=False,
|
|
110
|
-
description="Disable output from the underlying DSPy program.",
|
|
111
|
-
)
|
|
112
|
-
stream: bool = Field(
|
|
113
|
-
default=False,
|
|
114
|
-
description="Enable streaming output from the underlying DSPy program.",
|
|
115
|
-
)
|
|
116
|
-
include_thought_process: bool = Field(
|
|
117
|
-
default=False,
|
|
118
|
-
description="Include the thought process in the output.",
|
|
119
|
-
)
|
|
120
|
-
include_reasoning: bool = Field(
|
|
121
|
-
default=False,
|
|
122
|
-
description="Include the reasoning in the output.",
|
|
123
|
-
)
|
|
124
|
-
status_output_field: str = Field(
|
|
125
|
-
default="_status_output",
|
|
126
|
-
description="The field name for the status output.",
|
|
127
|
-
)
|
|
128
|
-
include_status_output: bool = Field(
|
|
129
|
-
default=False,
|
|
130
|
-
description="Include the status output in the finaloutput.",
|
|
131
|
-
)
|
|
132
|
-
adapter: Literal["chat", "json", "xml", "two_step"] | None = Field(
|
|
133
|
-
default=None,
|
|
134
|
-
description="Optional DSPy adapter to use for formatting/parsing.",
|
|
135
|
-
)
|
|
136
|
-
extraction_model: str | None = Field(
|
|
137
|
-
default=None,
|
|
138
|
-
description="Extraction LM for TwoStepAdapter when adapter='two_step'",
|
|
139
|
-
)
|
|
140
|
-
stream_callbacks: list[Callable[..., Any] | Any] | None = None
|
|
141
|
-
stream_vertical_overflow: Literal[
|
|
142
|
-
"crop", "ellipsis", "crop_above", "visible"
|
|
143
|
-
] = Field(
|
|
144
|
-
default="crop_above",
|
|
145
|
-
description=(
|
|
146
|
-
"Rich Live vertical overflow strategy; select how tall output is handled; 'crop_above' keeps the most recent rows visible."
|
|
147
|
-
),
|
|
148
|
-
)
|
|
149
|
-
kwargs: dict[str, Any] = Field(default_factory=dict)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
@flock_component(config_class=DeclarativeEvaluationConfig)
|
|
153
|
-
class DeclarativeEvaluationComponent(
|
|
154
|
-
EvaluationComponent, DSPyIntegrationMixin, PromptParserMixin
|
|
155
|
-
):
|
|
156
|
-
"""Evaluation component that uses DSPy for generation.
|
|
157
|
-
|
|
158
|
-
This component provides the core intelligence for agents using DSPy's
|
|
159
|
-
declarative programming model. It handles LLM interactions, tool usage,
|
|
160
|
-
and prompt management through DSPy's framework.
|
|
161
|
-
"""
|
|
162
|
-
|
|
163
|
-
config: DeclarativeEvaluationConfig = Field(
|
|
164
|
-
default_factory=DeclarativeEvaluationConfig,
|
|
165
|
-
description="Evaluation configuration",
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
_cost: float = PrivateAttr(default=0.0)
|
|
169
|
-
_lm_history: list = PrivateAttr(default_factory=list)
|
|
170
|
-
|
|
171
|
-
def __init__(self, **data):
|
|
172
|
-
super().__init__(**data)
|
|
173
|
-
|
|
174
|
-
@override
|
|
175
|
-
def set_model(
|
|
176
|
-
self, model: str, temperature: float = 1.0, max_tokens: int = 32000
|
|
177
|
-
) -> None:
|
|
178
|
-
"""Set the model for the evaluation component."""
|
|
179
|
-
self.config.model = model
|
|
180
|
-
self.config.temperature = temperature
|
|
181
|
-
self.config.max_tokens = max_tokens
|
|
182
|
-
|
|
183
|
-
async def evaluate_core(
|
|
184
|
-
self,
|
|
185
|
-
agent: Any,
|
|
186
|
-
inputs: dict[str, Any],
|
|
187
|
-
context: FlockContext | None = None,
|
|
188
|
-
tools: list[Any] | None = None,
|
|
189
|
-
mcp_tools: list[Any] | None = None,
|
|
190
|
-
) -> dict[str, Any]:
|
|
191
|
-
"""Core evaluation logic using DSPy - migrated from DeclarativeEvaluator."""
|
|
192
|
-
logger.debug(
|
|
193
|
-
f"Starting declarative evaluation for component '{self.name}'"
|
|
194
|
-
)
|
|
195
|
-
|
|
196
|
-
# Prepare LM and optional adapter; keep settings changes scoped with dspy.context
|
|
197
|
-
lm = dspy.LM(
|
|
198
|
-
model=self.config.model or agent.model,
|
|
199
|
-
cache=self.config.use_cache,
|
|
200
|
-
temperature=self.config.temperature,
|
|
201
|
-
max_tokens=self.config.max_tokens,
|
|
202
|
-
num_retries=self.config.max_retries,
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
adapter = None
|
|
206
|
-
if self.config.adapter:
|
|
207
|
-
try:
|
|
208
|
-
if self.config.adapter == "json":
|
|
209
|
-
adapter = dspy.JSONAdapter()
|
|
210
|
-
elif self.config.adapter == "xml":
|
|
211
|
-
adapter = dspy.XMLAdapter()
|
|
212
|
-
elif self.config.adapter == "two_step":
|
|
213
|
-
extractor = dspy.LM(
|
|
214
|
-
self.config.extraction_model or "openai/gpt-4o-mini"
|
|
215
|
-
)
|
|
216
|
-
adapter = dspy.TwoStepAdapter(extraction_model=extractor)
|
|
217
|
-
else:
|
|
218
|
-
# chat is default; leave adapter=None
|
|
219
|
-
adapter = None
|
|
220
|
-
except Exception as e:
|
|
221
|
-
logger.warning(
|
|
222
|
-
f"Failed to construct adapter '{self.config.adapter}': {e}. Proceeding without."
|
|
223
|
-
)
|
|
224
|
-
|
|
225
|
-
with dspy.context(lm=lm, adapter=adapter):
|
|
226
|
-
try:
|
|
227
|
-
from rich.console import Console
|
|
228
|
-
|
|
229
|
-
console = Console()
|
|
230
|
-
|
|
231
|
-
# Create DSPy signature from agent definition
|
|
232
|
-
_dspy_signature = self.create_dspy_signature_class(
|
|
233
|
-
agent.name,
|
|
234
|
-
agent.description,
|
|
235
|
-
f"{agent.input} -> {agent.output}",
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
# Get output field names for streaming
|
|
239
|
-
output_field_names = list(_dspy_signature.output_fields.keys())
|
|
240
|
-
if not output_field_names:
|
|
241
|
-
logger.warning(
|
|
242
|
-
f"DSPy signature for agent '{agent.name}' has no defined output fields. Streaming might not produce text."
|
|
243
|
-
)
|
|
244
|
-
|
|
245
|
-
# Select appropriate DSPy task
|
|
246
|
-
agent_task = self._select_task(
|
|
247
|
-
_dspy_signature,
|
|
248
|
-
override_evaluator_type=self.config.override_evaluator_type,
|
|
249
|
-
tools=tools or [],
|
|
250
|
-
max_tool_calls=self.config.max_tool_calls,
|
|
251
|
-
mcp_tools=mcp_tools or [],
|
|
252
|
-
kwargs=self.config.kwargs,
|
|
253
|
-
)
|
|
254
|
-
|
|
255
|
-
except Exception as setup_error:
|
|
256
|
-
logger.error(
|
|
257
|
-
f"Error setting up DSPy task for agent '{agent.name}': {setup_error}",
|
|
258
|
-
exc_info=True,
|
|
259
|
-
)
|
|
260
|
-
raise RuntimeError(
|
|
261
|
-
f"DSPy task setup failed: {setup_error}"
|
|
262
|
-
) from setup_error
|
|
263
|
-
|
|
264
|
-
# Execute with streaming or non-streaming
|
|
265
|
-
if self.config.stream:
|
|
266
|
-
return await self._execute_streaming(
|
|
267
|
-
_dspy_signature, agent_task, inputs, agent, console
|
|
268
|
-
)
|
|
269
|
-
else:
|
|
270
|
-
return await self._execute_standard(agent_task, inputs, agent)
|
|
271
|
-
|
|
272
|
-
async def _execute_streaming(
|
|
273
|
-
self, signature, agent_task, inputs: dict[str, Any], agent: Any, console
|
|
274
|
-
) -> dict[str, Any]:
|
|
275
|
-
"""Execute DSPy program in streaming mode with rich table updates."""
|
|
276
|
-
logger.info(f"Evaluating agent '{agent.name}' with async streaming.")
|
|
277
|
-
|
|
278
|
-
if not callable(agent_task):
|
|
279
|
-
logger.error("agent_task is not callable, cannot stream.")
|
|
280
|
-
raise TypeError(
|
|
281
|
-
"DSPy task could not be created or is not callable."
|
|
282
|
-
)
|
|
283
|
-
|
|
284
|
-
# Prepare stream listeners for any string output fields
|
|
285
|
-
listeners = []
|
|
286
|
-
try:
|
|
287
|
-
for name, field in signature.output_fields.items():
|
|
288
|
-
if field.annotation is str:
|
|
289
|
-
listeners.append(
|
|
290
|
-
dspy.streaming.StreamListener(signature_field_name=name)
|
|
291
|
-
)
|
|
292
|
-
except Exception:
|
|
293
|
-
listeners = []
|
|
294
|
-
|
|
295
|
-
streaming_task = dspy.streamify(
|
|
296
|
-
agent_task,
|
|
297
|
-
is_async_program=True,
|
|
298
|
-
stream_listeners=listeners if listeners else None,
|
|
299
|
-
)
|
|
300
|
-
stream_generator: Generator = streaming_task(**inputs)
|
|
301
|
-
|
|
302
|
-
from collections import defaultdict
|
|
303
|
-
|
|
304
|
-
from rich.live import Live
|
|
305
|
-
|
|
306
|
-
signature_order = []
|
|
307
|
-
status_field = self.config.status_output_field
|
|
308
|
-
try:
|
|
309
|
-
signature_order = list(signature.output_fields.keys())
|
|
310
|
-
except Exception:
|
|
311
|
-
signature_order = []
|
|
312
|
-
|
|
313
|
-
display_data: OrderedDict[str, Any] = OrderedDict()
|
|
314
|
-
for key in inputs:
|
|
315
|
-
display_data[key] = inputs[key]
|
|
316
|
-
|
|
317
|
-
for field_name in signature_order:
|
|
318
|
-
if field_name not in display_data:
|
|
319
|
-
display_data[field_name] = ""
|
|
320
|
-
|
|
321
|
-
display_data[status_field] = ""
|
|
322
|
-
|
|
323
|
-
stream_buffers: defaultdict[str, list[str]] = defaultdict(list)
|
|
324
|
-
stream_buffers[status_field] = []
|
|
325
|
-
|
|
326
|
-
formatter = theme_dict = styles = agent_label = None
|
|
327
|
-
live_cm = nullcontext()
|
|
328
|
-
overflow_mode = self.config.stream_vertical_overflow
|
|
329
|
-
initial_panel = None
|
|
330
|
-
if not self.config.no_output:
|
|
331
|
-
_ensure_live_crop_above()
|
|
332
|
-
(
|
|
333
|
-
formatter,
|
|
334
|
-
theme_dict,
|
|
335
|
-
styles,
|
|
336
|
-
agent_label,
|
|
337
|
-
) = self._prepare_stream_formatter(agent)
|
|
338
|
-
initial_panel = formatter.format_result(
|
|
339
|
-
display_data, agent_label, theme_dict, styles
|
|
340
|
-
)
|
|
341
|
-
live_cm = Live(
|
|
342
|
-
initial_panel,
|
|
343
|
-
console=console,
|
|
344
|
-
refresh_per_second=4,
|
|
345
|
-
transient=False,
|
|
346
|
-
vertical_overflow=overflow_mode,
|
|
347
|
-
)
|
|
348
|
-
|
|
349
|
-
final_result: dict[str, Any] | None = None
|
|
350
|
-
|
|
351
|
-
with live_cm as live:
|
|
352
|
-
|
|
353
|
-
def _refresh_panel() -> None:
|
|
354
|
-
if formatter is None or live is None:
|
|
355
|
-
return
|
|
356
|
-
live.update(
|
|
357
|
-
formatter.format_result(
|
|
358
|
-
display_data, agent_label, theme_dict, styles
|
|
359
|
-
)
|
|
360
|
-
)
|
|
361
|
-
|
|
362
|
-
async for value in stream_generator:
|
|
363
|
-
try:
|
|
364
|
-
import dspy as _d
|
|
365
|
-
from dspy.streaming import StatusMessage, StreamResponse
|
|
366
|
-
from litellm import ModelResponseStream
|
|
367
|
-
except Exception:
|
|
368
|
-
StatusMessage = object # type: ignore
|
|
369
|
-
StreamResponse = object # type: ignore
|
|
370
|
-
ModelResponseStream = object # type: ignore
|
|
371
|
-
_d = None
|
|
372
|
-
|
|
373
|
-
if isinstance(value, StatusMessage):
|
|
374
|
-
token = getattr(value, "message", "")
|
|
375
|
-
if token:
|
|
376
|
-
stream_buffers[status_field].append(str(token) + "\n")
|
|
377
|
-
display_data[status_field] = "".join(
|
|
378
|
-
stream_buffers[status_field]
|
|
379
|
-
)
|
|
380
|
-
if formatter is not None:
|
|
381
|
-
_refresh_panel()
|
|
382
|
-
continue
|
|
383
|
-
|
|
384
|
-
if isinstance(value, StreamResponse):
|
|
385
|
-
for callback in self.config.stream_callbacks or []:
|
|
386
|
-
try:
|
|
387
|
-
callback(value)
|
|
388
|
-
except Exception as e:
|
|
389
|
-
logger.warning(f"Stream callback error: {e}")
|
|
390
|
-
token = getattr(value, "chunk", None)
|
|
391
|
-
signature_field = getattr(
|
|
392
|
-
value, "signature_field_name", None
|
|
393
|
-
)
|
|
394
|
-
if signature_field:
|
|
395
|
-
if signature_field not in display_data:
|
|
396
|
-
display_data[signature_field] = ""
|
|
397
|
-
if token:
|
|
398
|
-
stream_buffers[signature_field].append(str(token))
|
|
399
|
-
display_data[signature_field] = "".join(
|
|
400
|
-
stream_buffers[signature_field]
|
|
401
|
-
)
|
|
402
|
-
if formatter is not None:
|
|
403
|
-
_refresh_panel()
|
|
404
|
-
continue
|
|
405
|
-
|
|
406
|
-
if isinstance(value, ModelResponseStream):
|
|
407
|
-
for callback in self.config.stream_callbacks or []:
|
|
408
|
-
try:
|
|
409
|
-
callback(value)
|
|
410
|
-
except Exception as e:
|
|
411
|
-
logger.warning(f"Stream callback error: {e}")
|
|
412
|
-
|
|
413
|
-
chunk = value
|
|
414
|
-
token = chunk.choices[0].delta.content or ""
|
|
415
|
-
signature_field = getattr(
|
|
416
|
-
value, "signature_field_name", None
|
|
417
|
-
)
|
|
418
|
-
if signature_field:
|
|
419
|
-
if signature_field not in display_data:
|
|
420
|
-
display_data[signature_field] = ""
|
|
421
|
-
if token:
|
|
422
|
-
stream_buffers[signature_field].append(str(token))
|
|
423
|
-
display_data[signature_field] = "".join(
|
|
424
|
-
stream_buffers[signature_field]
|
|
425
|
-
)
|
|
426
|
-
if formatter is not None:
|
|
427
|
-
_refresh_panel()
|
|
428
|
-
else:
|
|
429
|
-
if token:
|
|
430
|
-
stream_buffers[status_field].append(str(token))
|
|
431
|
-
display_data[status_field] = "".join(
|
|
432
|
-
stream_buffers[status_field]
|
|
433
|
-
)
|
|
434
|
-
if formatter is not None:
|
|
435
|
-
_refresh_panel()
|
|
436
|
-
continue
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
if _d and isinstance(value, _d.Prediction):
|
|
440
|
-
result_dict, cost, lm_history = self._process_result(
|
|
441
|
-
value, inputs
|
|
442
|
-
)
|
|
443
|
-
self._cost = cost
|
|
444
|
-
self._lm_history = lm_history
|
|
445
|
-
final_result = result_dict
|
|
446
|
-
|
|
447
|
-
if formatter is not None:
|
|
448
|
-
ordered_final = OrderedDict()
|
|
449
|
-
for key in inputs:
|
|
450
|
-
if key in final_result:
|
|
451
|
-
ordered_final[key] = final_result[key]
|
|
452
|
-
for field_name in signature_order:
|
|
453
|
-
if field_name in final_result:
|
|
454
|
-
ordered_final[field_name] = final_result[
|
|
455
|
-
field_name
|
|
456
|
-
]
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
for key, val in final_result.items():
|
|
460
|
-
if key not in ordered_final:
|
|
461
|
-
ordered_final[key] = val
|
|
462
|
-
|
|
463
|
-
if self.config.include_status_output:
|
|
464
|
-
ordered_final[self.config.status_output_field] = display_data[self.config.status_output_field]
|
|
465
|
-
display_data.clear()
|
|
466
|
-
display_data.update(ordered_final)
|
|
467
|
-
_refresh_panel()
|
|
468
|
-
|
|
469
|
-
if final_result is None:
|
|
470
|
-
raise RuntimeError("Streaming did not yield a final prediction.")
|
|
471
|
-
|
|
472
|
-
filtered_result = self.filter_reasoning(
|
|
473
|
-
final_result, self.config.include_reasoning
|
|
474
|
-
)
|
|
475
|
-
filtered_result = self.filter_thought_process(
|
|
476
|
-
filtered_result, self.config.include_thought_process
|
|
477
|
-
)
|
|
478
|
-
|
|
479
|
-
if not self.config.no_output:
|
|
480
|
-
context = getattr(agent, "context", None)
|
|
481
|
-
if context is not None:
|
|
482
|
-
context.state["_flock_stream_live_active"] = True
|
|
483
|
-
|
|
484
|
-
return filtered_result
|
|
485
|
-
|
|
486
|
-
async def _execute_standard(
|
|
487
|
-
self, agent_task, inputs: dict[str, Any], agent: Any
|
|
488
|
-
) -> dict[str, Any]:
|
|
489
|
-
"""Execute DSPy program in standard mode (from original implementation)."""
|
|
490
|
-
logger.info(f"Evaluating agent '{agent.name}' without streaming.")
|
|
491
|
-
|
|
492
|
-
try:
|
|
493
|
-
# Ensure the call is awaited if the underlying task is async
|
|
494
|
-
result_obj = await agent_task.acall(**inputs)
|
|
495
|
-
result_dict, cost, lm_history = self._process_result(
|
|
496
|
-
result_obj, inputs
|
|
497
|
-
)
|
|
498
|
-
self._cost = cost
|
|
499
|
-
self._lm_history = lm_history
|
|
500
|
-
result_dict = self.filter_reasoning(
|
|
501
|
-
result_dict, self.config.include_reasoning
|
|
502
|
-
)
|
|
503
|
-
return self.filter_thought_process(
|
|
504
|
-
result_dict, self.config.include_thought_process
|
|
505
|
-
)
|
|
506
|
-
except Exception as e:
|
|
507
|
-
logger.error(
|
|
508
|
-
f"Error during non-streaming evaluation for agent '{agent.name}': {e}",
|
|
509
|
-
exc_info=True,
|
|
510
|
-
)
|
|
511
|
-
raise RuntimeError(f"Evaluation failed: {e}") from e
|
|
512
|
-
|
|
513
|
-
def _prepare_stream_formatter(
|
|
514
|
-
self, agent: Any
|
|
515
|
-
) -> tuple[Any, dict[str, Any], dict[str, Any], str]:
|
|
516
|
-
"""Build formatter + theme metadata for streaming tables."""
|
|
517
|
-
import pathlib
|
|
518
|
-
|
|
519
|
-
from flock.core.logging.formatters.themed_formatter import (
|
|
520
|
-
ThemedAgentResultFormatter,
|
|
521
|
-
create_pygments_syntax_theme,
|
|
522
|
-
get_default_styles,
|
|
523
|
-
load_syntax_theme_from_file,
|
|
524
|
-
load_theme_from_file,
|
|
525
|
-
)
|
|
526
|
-
from flock.core.logging.formatters.themes import OutputTheme
|
|
527
|
-
|
|
528
|
-
stream_theme = OutputTheme.afterglow
|
|
529
|
-
output_component = None
|
|
530
|
-
try:
|
|
531
|
-
output_component = agent.get_component("output_formatter")
|
|
532
|
-
except Exception:
|
|
533
|
-
output_component = None
|
|
534
|
-
if output_component and getattr(output_component, "config", None):
|
|
535
|
-
stream_theme = getattr(
|
|
536
|
-
output_component.config, "theme", stream_theme
|
|
537
|
-
)
|
|
538
|
-
|
|
539
|
-
formatter = ThemedAgentResultFormatter(theme=stream_theme)
|
|
540
|
-
|
|
541
|
-
themes_dir = pathlib.Path(__file__).resolve().parents[2] / "themes"
|
|
542
|
-
theme_filename = stream_theme.value
|
|
543
|
-
if not theme_filename.endswith(".toml"):
|
|
544
|
-
theme_filename = f"{theme_filename}.toml"
|
|
545
|
-
theme_path = themes_dir / theme_filename
|
|
546
|
-
|
|
547
|
-
try:
|
|
548
|
-
theme_dict = load_theme_from_file(theme_path)
|
|
549
|
-
except Exception:
|
|
550
|
-
fallback_path = themes_dir / "afterglow.toml"
|
|
551
|
-
theme_dict = load_theme_from_file(fallback_path)
|
|
552
|
-
theme_path = fallback_path
|
|
553
|
-
|
|
554
|
-
styles = get_default_styles(theme_dict)
|
|
555
|
-
formatter.styles = styles
|
|
556
|
-
try:
|
|
557
|
-
syntax_theme = load_syntax_theme_from_file(theme_path)
|
|
558
|
-
formatter.syntax_style = create_pygments_syntax_theme(syntax_theme)
|
|
559
|
-
except Exception:
|
|
560
|
-
formatter.syntax_style = None
|
|
561
|
-
|
|
562
|
-
model_label = getattr(agent, "model", None) or self.config.model or ""
|
|
563
|
-
agent_label = (
|
|
564
|
-
agent.name if not model_label else f"{agent.name} - {model_label}"
|
|
565
|
-
)
|
|
566
|
-
|
|
567
|
-
return formatter, theme_dict, styles, agent_label
|
|
568
|
-
|
|
569
|
-
def filter_thought_process(
|
|
570
|
-
self, result_dict: dict[str, Any], include_thought_process: bool
|
|
571
|
-
) -> dict[str, Any]:
|
|
572
|
-
"""Filter out thought process from the result dictionary (from original implementation)."""
|
|
573
|
-
if include_thought_process:
|
|
574
|
-
return result_dict
|
|
575
|
-
else:
|
|
576
|
-
return {
|
|
577
|
-
k: v
|
|
578
|
-
for k, v in result_dict.items()
|
|
579
|
-
if not (k.startswith("reasoning") or k.startswith("trajectory"))
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
def filter_status_output(
|
|
583
|
-
self, result_dict: dict[str, Any], include_status_output: bool
|
|
584
|
-
) -> dict[str, Any]:
|
|
585
|
-
"""Filter out status output from the result dictionary."""
|
|
586
|
-
if include_status_output:
|
|
587
|
-
return result_dict
|
|
588
|
-
else:
|
|
589
|
-
return {
|
|
590
|
-
k: v
|
|
591
|
-
for k, v in result_dict.items()
|
|
592
|
-
if not (k.startswith("_status_output"))
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
def filter_reasoning(
|
|
596
|
-
self, result_dict: dict[str, Any], include_reasoning: bool
|
|
597
|
-
) -> dict[str, Any]:
|
|
598
|
-
"""Filter out reasoning from the result dictionary."""
|
|
599
|
-
if include_reasoning:
|
|
600
|
-
return result_dict
|
|
601
|
-
else:
|
|
602
|
-
return {
|
|
603
|
-
k: v
|
|
604
|
-
for k, v in result_dict.items()
|
|
605
|
-
if not (k.startswith("reasoning"))
|
|
606
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# src/flock/components/routing/__init__.py
|
|
2
|
-
"""Routing components for the Flock framework."""
|
|
3
|
-
|
|
4
|
-
from .conditional_routing_component import ConditionalRoutingComponent, ConditionalRoutingConfig
|
|
5
|
-
from .default_routing_component import DefaultRoutingComponent, DefaultRoutingConfig
|
|
6
|
-
from .llm_routing_component import LLMRoutingComponent, LLMRoutingConfig
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"ConditionalRoutingComponent",
|
|
10
|
-
"ConditionalRoutingConfig",
|
|
11
|
-
"DefaultRoutingComponent",
|
|
12
|
-
"DefaultRoutingConfig",
|
|
13
|
-
"LLMRoutingComponent",
|
|
14
|
-
"LLMRoutingConfig",
|
|
15
|
-
]
|