flock-core 0.5.0b27__py3-none-any.whl → 0.5.0b50__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.0b50.dist-info/METADATA +747 -0
- flock_core-0.5.0b50.dist-info/RECORD +398 -0
- flock_core-0.5.0b50.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b27.dist-info → flock_core-0.5.0b50.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 -15
- 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 -180
- 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 -551
- 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 -598
- 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.0b27.dist-info/METADATA +0 -274
- flock_core-0.5.0b27.dist-info/RECORD +0 -559
- flock_core-0.5.0b27.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.0b27.dist-info → flock_core-0.5.0b50.dist-info}/WHEEL +0 -0
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# src/flock/components/routing/llm_routing_component.py
|
|
2
|
-
"""LLM-based routing component implementation for the unified component architecture."""
|
|
3
|
-
|
|
4
|
-
import json
|
|
5
|
-
from typing import TYPE_CHECKING, Any
|
|
6
|
-
|
|
7
|
-
import litellm
|
|
8
|
-
from pydantic import Field
|
|
9
|
-
|
|
10
|
-
from flock.core.component.agent_component_base import AgentComponentConfig
|
|
11
|
-
from flock.core.component.routing_component import RoutingComponent
|
|
12
|
-
from flock.core.context.context import FlockContext
|
|
13
|
-
|
|
14
|
-
# HandOffRequest removed - using agent.next_agent directly
|
|
15
|
-
from flock.core.logging.logging import get_logger
|
|
16
|
-
from flock.core.registry import flock_component
|
|
17
|
-
|
|
18
|
-
if TYPE_CHECKING:
|
|
19
|
-
from flock.core.flock_agent import FlockAgent
|
|
20
|
-
|
|
21
|
-
logger = get_logger("components.routing.llm")
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class LLMRoutingConfig(AgentComponentConfig):
|
|
25
|
-
"""Configuration for the LLM routing component."""
|
|
26
|
-
|
|
27
|
-
temperature: float = Field(
|
|
28
|
-
default=0.2, description="Temperature for LLM routing decisions"
|
|
29
|
-
)
|
|
30
|
-
max_tokens: int = Field(
|
|
31
|
-
default=500, description="Maximum tokens for LLM response"
|
|
32
|
-
)
|
|
33
|
-
confidence_threshold: float = Field(
|
|
34
|
-
default=0.5, description="Minimum confidence threshold for routing"
|
|
35
|
-
)
|
|
36
|
-
model: str = Field(
|
|
37
|
-
default="azure/gpt-4.1", description="Model to use for routing decisions"
|
|
38
|
-
)
|
|
39
|
-
prompt_template: str = Field(
|
|
40
|
-
default="""You are a workflow routing assistant. Given the current agent's output and available next agents, determine which agent should execute next.
|
|
41
|
-
|
|
42
|
-
Current Agent: {current_agent_name}
|
|
43
|
-
Current Output: {current_output}
|
|
44
|
-
|
|
45
|
-
Available Agents:
|
|
46
|
-
{available_agents}
|
|
47
|
-
|
|
48
|
-
Select the most appropriate next agent based on the current output. Respond with JSON in this exact format:
|
|
49
|
-
{{"next_agent": "agent_name", "confidence": 0.8, "reasoning": "explanation"}}
|
|
50
|
-
|
|
51
|
-
If no agent is suitable, use "next_agent": "" to end the workflow.""",
|
|
52
|
-
description="Template for LLM routing prompt"
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@flock_component(config_class=LLMRoutingConfig)
|
|
57
|
-
class LLMRoutingComponent(RoutingComponent):
|
|
58
|
-
"""Router that uses an LLM to determine the next agent in a workflow.
|
|
59
|
-
|
|
60
|
-
This component analyzes the current agent's output and uses an LLM to
|
|
61
|
-
intelligently select the most appropriate next agent from available options.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
config: LLMRoutingConfig = Field(
|
|
65
|
-
default_factory=LLMRoutingConfig
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
def __init__(
|
|
69
|
-
self,
|
|
70
|
-
name: str = "llm_router",
|
|
71
|
-
config: LLMRoutingConfig | None = None,
|
|
72
|
-
**data,
|
|
73
|
-
):
|
|
74
|
-
if config is None:
|
|
75
|
-
config = LLMRoutingConfig()
|
|
76
|
-
super().__init__(name=name, config=config, **data)
|
|
77
|
-
|
|
78
|
-
def _get_available_agents(
|
|
79
|
-
self, agent_definitions: dict[str, Any], current_agent_name: str
|
|
80
|
-
) -> list[str]:
|
|
81
|
-
"""Get list of available agent names except the current one."""
|
|
82
|
-
available = []
|
|
83
|
-
for agent_name in agent_definitions:
|
|
84
|
-
if agent_name != current_agent_name:
|
|
85
|
-
available.append(agent_name)
|
|
86
|
-
return available
|
|
87
|
-
|
|
88
|
-
def _create_selection_prompt(
|
|
89
|
-
self,
|
|
90
|
-
current_agent: "FlockAgent",
|
|
91
|
-
result: dict[str, Any],
|
|
92
|
-
available_agents: list[str],
|
|
93
|
-
) -> str:
|
|
94
|
-
"""Create the prompt for LLM agent selection."""
|
|
95
|
-
# Format available agents
|
|
96
|
-
agents_list = []
|
|
97
|
-
for agent_name in available_agents:
|
|
98
|
-
agents_list.append(f"- {agent_name}")
|
|
99
|
-
|
|
100
|
-
available_agents_str = "\n".join(agents_list) if agents_list else "None available"
|
|
101
|
-
|
|
102
|
-
# Format current output
|
|
103
|
-
current_output = json.dumps(result, indent=2) if result else "No output"
|
|
104
|
-
|
|
105
|
-
return self.config.prompt_template.format(
|
|
106
|
-
current_agent_name=current_agent.name,
|
|
107
|
-
current_output=current_output,
|
|
108
|
-
available_agents=available_agents_str
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
async def _select_next_agent(
|
|
112
|
-
self,
|
|
113
|
-
current_agent: "FlockAgent",
|
|
114
|
-
result: dict[str, Any],
|
|
115
|
-
available_agents: list[str],
|
|
116
|
-
) -> tuple[str, float]:
|
|
117
|
-
"""Use an LLM to select the best next agent."""
|
|
118
|
-
if not available_agents:
|
|
119
|
-
logger.warning("No available agents for LLM routing")
|
|
120
|
-
return "", 0.0
|
|
121
|
-
|
|
122
|
-
# Create the selection prompt
|
|
123
|
-
prompt = self._create_selection_prompt(current_agent, result, available_agents)
|
|
124
|
-
|
|
125
|
-
try:
|
|
126
|
-
# Call the LLM
|
|
127
|
-
response = await litellm.acompletion(
|
|
128
|
-
model=self.config.model,
|
|
129
|
-
messages=[
|
|
130
|
-
{"role": "user", "content": prompt}
|
|
131
|
-
],
|
|
132
|
-
temperature=self.config.temperature,
|
|
133
|
-
max_tokens=self.config.max_tokens,
|
|
134
|
-
)
|
|
135
|
-
|
|
136
|
-
response_content = response.choices[0].message.content.strip()
|
|
137
|
-
logger.debug(f"LLM routing response: {response_content}")
|
|
138
|
-
|
|
139
|
-
# Parse the JSON response
|
|
140
|
-
try:
|
|
141
|
-
routing_decision = json.loads(response_content)
|
|
142
|
-
next_agent = routing_decision.get("next_agent", "")
|
|
143
|
-
confidence = routing_decision.get("confidence", 0.0)
|
|
144
|
-
reasoning = routing_decision.get("reasoning", "No reasoning provided")
|
|
145
|
-
|
|
146
|
-
logger.info(f"LLM routing decision: {next_agent} (confidence: {confidence}) - {reasoning}")
|
|
147
|
-
|
|
148
|
-
# Validate the selected agent is available
|
|
149
|
-
if next_agent and next_agent not in available_agents and next_agent != "":
|
|
150
|
-
logger.warning(f"LLM selected unavailable agent '{next_agent}', ending workflow")
|
|
151
|
-
return "", 0.0
|
|
152
|
-
|
|
153
|
-
return next_agent, confidence
|
|
154
|
-
|
|
155
|
-
except json.JSONDecodeError as e:
|
|
156
|
-
logger.error(f"Failed to parse LLM response as JSON: {e}")
|
|
157
|
-
return "", 0.0
|
|
158
|
-
|
|
159
|
-
except Exception as e:
|
|
160
|
-
logger.error(f"Error calling LLM for routing: {e}")
|
|
161
|
-
return "", 0.0
|
|
162
|
-
|
|
163
|
-
async def determine_next_step(
|
|
164
|
-
self,
|
|
165
|
-
agent: "FlockAgent",
|
|
166
|
-
result: dict[str, Any],
|
|
167
|
-
context: FlockContext | None = None,
|
|
168
|
-
) -> None:
|
|
169
|
-
"""Use LLM to determine the next agent based on current output."""
|
|
170
|
-
if not context:
|
|
171
|
-
logger.warning("No context provided for LLM routing")
|
|
172
|
-
return
|
|
173
|
-
|
|
174
|
-
logger.info(f"LLM routing from agent '{agent.name}'")
|
|
175
|
-
|
|
176
|
-
# Get available agents from context
|
|
177
|
-
agent_definitions = getattr(context, 'agent_definitions', {})
|
|
178
|
-
available_agents = self._get_available_agents(agent_definitions, agent.name)
|
|
179
|
-
|
|
180
|
-
logger.debug(f"Available agents for LLM routing: {available_agents}")
|
|
181
|
-
|
|
182
|
-
if not available_agents:
|
|
183
|
-
logger.warning("No available agents for LLM routing")
|
|
184
|
-
return
|
|
185
|
-
|
|
186
|
-
# Use LLM to select the next agent
|
|
187
|
-
next_agent_name, confidence = await self._select_next_agent(
|
|
188
|
-
agent, result, available_agents
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
logger.info(f"LLM routing result: {next_agent_name} (confidence: {confidence})")
|
|
192
|
-
|
|
193
|
-
# Check confidence threshold
|
|
194
|
-
if not next_agent_name or confidence < self.config.confidence_threshold:
|
|
195
|
-
logger.warning(
|
|
196
|
-
f"LLM routing confidence {confidence} below threshold {self.config.confidence_threshold}"
|
|
197
|
-
)
|
|
198
|
-
return
|
|
199
|
-
|
|
200
|
-
# Validate the selected agent exists
|
|
201
|
-
if next_agent_name not in agent_definitions:
|
|
202
|
-
logger.error(f"LLM selected non-existent agent '{next_agent_name}'")
|
|
203
|
-
return
|
|
204
|
-
|
|
205
|
-
logger.info(f"Successfully routed to agent '{next_agent_name}' with confidence {confidence}")
|
|
206
|
-
agent.next_agent = next_agent_name
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# src/flock/components/utility/__init__.py
|
|
2
|
-
"""Utility components for the Flock framework."""
|
|
3
|
-
|
|
4
|
-
from .memory_utility_component import MemoryUtilityComponent, MemoryUtilityConfig
|
|
5
|
-
from .metrics_utility_component import MetricsUtilityComponent, MetricsUtilityConfig
|
|
6
|
-
from .output_utility_component import OutputUtilityComponent, OutputUtilityConfig
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"MemoryUtilityComponent",
|
|
10
|
-
"MemoryUtilityConfig",
|
|
11
|
-
"MetricsUtilityComponent",
|
|
12
|
-
"MetricsUtilityConfig",
|
|
13
|
-
"OutputUtilityComponent",
|
|
14
|
-
"OutputUtilityConfig",
|
|
15
|
-
]
|