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
flock/core/flock_agent.py
DELETED
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
# src/flock/core/flock_agent.py
|
|
2
|
-
"""FlockAgent with unified component architecture."""
|
|
3
|
-
|
|
4
|
-
import uuid
|
|
5
|
-
from abc import ABC
|
|
6
|
-
from collections.abc import Callable
|
|
7
|
-
from typing import Any, TypeVar
|
|
8
|
-
|
|
9
|
-
from pydantic import BaseModel, Field
|
|
10
|
-
|
|
11
|
-
from flock.core.agent.flock_agent_execution import FlockAgentExecution
|
|
12
|
-
from flock.core.agent.flock_agent_integration import FlockAgentIntegration
|
|
13
|
-
from flock.core.agent.flock_agent_serialization import FlockAgentSerialization
|
|
14
|
-
from flock.core.component.agent_component_base import AgentComponent
|
|
15
|
-
from flock.core.component.evaluation_component import (
|
|
16
|
-
EvaluationComponent,
|
|
17
|
-
)
|
|
18
|
-
from flock.core.component.routing_component import RoutingComponent
|
|
19
|
-
from flock.core.config.flock_agent_config import FlockAgentConfig
|
|
20
|
-
from flock.core.context.context import FlockContext
|
|
21
|
-
from flock.core.logging.logging import get_logger
|
|
22
|
-
from flock.core.mcp.flock_mcp_server import FlockMCPServer
|
|
23
|
-
|
|
24
|
-
# Mixins and Serialization components
|
|
25
|
-
from flock.core.mixin.dspy_integration import DSPyIntegrationMixin
|
|
26
|
-
from flock.core.serialization.serializable import Serializable
|
|
27
|
-
from flock.workflow.temporal_config import TemporalActivityConfig
|
|
28
|
-
|
|
29
|
-
logger = get_logger("agent.unified")
|
|
30
|
-
|
|
31
|
-
T = TypeVar("T", bound="FlockAgent")
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
DynamicStr = str | Callable[[FlockContext], str]
|
|
35
|
-
|
|
36
|
-
class FlockAgent(BaseModel, Serializable, DSPyIntegrationMixin, ABC):
|
|
37
|
-
"""Unified FlockAgent using the new component architecture.
|
|
38
|
-
|
|
39
|
-
This is the next-generation FlockAgent that uses a single components list
|
|
40
|
-
instead of separate evaluator, router, and modules. All agent functionality
|
|
41
|
-
is now provided through AgentComponent instances.
|
|
42
|
-
|
|
43
|
-
Key changes:
|
|
44
|
-
- components: list[AgentComponent] - unified component list
|
|
45
|
-
- next_agent: str | None - explicit workflow state
|
|
46
|
-
- evaluator/router properties - convenience access to primary components
|
|
47
|
-
"""
|
|
48
|
-
|
|
49
|
-
agent_id: str = Field(
|
|
50
|
-
default_factory=lambda: str(uuid.uuid4()),
|
|
51
|
-
description="Internal, Unique UUID4 for this agent instance.",
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
name: str = Field(..., description="Unique identifier for the agent.")
|
|
55
|
-
|
|
56
|
-
model: str | None = Field(
|
|
57
|
-
None,
|
|
58
|
-
description="The model identifier to use (e.g., 'openai/gpt-4o'). If None, uses Flock's default.",
|
|
59
|
-
)
|
|
60
|
-
description_spec: DynamicStr | None = Field(
|
|
61
|
-
default="",
|
|
62
|
-
alias="description",
|
|
63
|
-
validation_alias="description",
|
|
64
|
-
description="A human-readable description or a callable returning one.",
|
|
65
|
-
)
|
|
66
|
-
input_spec: DynamicStr | None = Field(
|
|
67
|
-
default="",
|
|
68
|
-
alias="input",
|
|
69
|
-
validation_alias="input",
|
|
70
|
-
description="Signature for input keys. Supports type hints (:) and descriptions (|).",
|
|
71
|
-
)
|
|
72
|
-
output_spec: DynamicStr | None = Field(
|
|
73
|
-
default="",
|
|
74
|
-
alias="output",
|
|
75
|
-
validation_alias="output",
|
|
76
|
-
description="Signature for output keys. Supports type hints (:) and descriptions (|).",
|
|
77
|
-
)
|
|
78
|
-
tools: list[Callable[..., Any]] | None = Field(
|
|
79
|
-
default=None,
|
|
80
|
-
description="List of callable tools the agent can use. These must be registered.",
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
tool_whitelist: list[str] | None = Field(
|
|
84
|
-
default=None,
|
|
85
|
-
description="Whitelist of tool names that this agent can use during execution. "
|
|
86
|
-
"If provided, the agent will only have access to tools whose names "
|
|
87
|
-
"are in this list. This applies to both native Python tools (identified "
|
|
88
|
-
"by __name__) and MCP tools (identified by name attribute). "
|
|
89
|
-
"When combined with server-level tool filtering, the agent gets access "
|
|
90
|
-
"to the intersection of both whitelists. If None, all available tools "
|
|
91
|
-
"from servers and native tools are accessible. "
|
|
92
|
-
"Recommended over server-level filtering for granular control."
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
servers: list[str | FlockMCPServer] | None = Field(
|
|
96
|
-
default=None,
|
|
97
|
-
description="List of MCP Servers the agent can use to enhance its capabilities.",
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
# --- UNIFIED COMPONENT SYSTEM ---
|
|
101
|
-
components: list[AgentComponent] = Field(
|
|
102
|
-
default_factory=list,
|
|
103
|
-
description="List of all agent components (evaluators, routers, modules).",
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
# --- EXPLICIT WORKFLOW STATE ---
|
|
107
|
-
next_agent_spec: DynamicStr | None = Field(
|
|
108
|
-
default=None,
|
|
109
|
-
alias="next_agent",
|
|
110
|
-
validation_alias="next_agent",
|
|
111
|
-
description="Next agent in workflow - set by user or routing components.",
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
config: FlockAgentConfig = Field(
|
|
115
|
-
default_factory=lambda: FlockAgentConfig(),
|
|
116
|
-
description="Configuration for this agent.",
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
temporal_activity_config: TemporalActivityConfig | None = Field(
|
|
120
|
-
default=None,
|
|
121
|
-
description="Optional Temporal settings specific to this agent.",
|
|
122
|
-
)
|
|
123
|
-
|
|
124
|
-
# --- Runtime State (Excluded from Serialization) ---
|
|
125
|
-
context: FlockContext | None = Field(
|
|
126
|
-
default=None,
|
|
127
|
-
exclude=True,
|
|
128
|
-
description="Runtime context associated with the flock execution.",
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
def __init__(
|
|
132
|
-
self,
|
|
133
|
-
name: str,
|
|
134
|
-
model: str | None = None,
|
|
135
|
-
description: DynamicStr | None = None,
|
|
136
|
-
input: DynamicStr | None = None,
|
|
137
|
-
output: DynamicStr | None = None,
|
|
138
|
-
tools: list[Callable[..., Any]] | None = None,
|
|
139
|
-
servers: list[str | FlockMCPServer] | None = None,
|
|
140
|
-
tool_whitelist: list[str] | None = None,
|
|
141
|
-
components: list[AgentComponent] | None = None,
|
|
142
|
-
config: FlockAgentConfig | None = None,
|
|
143
|
-
next_agent: DynamicStr | None = None,
|
|
144
|
-
temporal_activity_config: TemporalActivityConfig | None = None,
|
|
145
|
-
):
|
|
146
|
-
"""Initialize the unified FlockAgent with components and configuration."""
|
|
147
|
-
if config is None:
|
|
148
|
-
config = FlockAgentConfig()
|
|
149
|
-
super().__init__(
|
|
150
|
-
name=name,
|
|
151
|
-
model=model,
|
|
152
|
-
description=description,
|
|
153
|
-
input=input,
|
|
154
|
-
output=output,
|
|
155
|
-
tools=tools,
|
|
156
|
-
servers=servers,
|
|
157
|
-
tool_whitelist=tool_whitelist,
|
|
158
|
-
components=components if components is not None else [],
|
|
159
|
-
config=config,
|
|
160
|
-
temporal_activity_config=temporal_activity_config,
|
|
161
|
-
next_agent=next_agent,
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
# Initialize helper systems (reuse existing logic)
|
|
165
|
-
self._execution = FlockAgentExecution(self)
|
|
166
|
-
self._integration = FlockAgentIntegration(self)
|
|
167
|
-
self._serialization = FlockAgentSerialization(self)
|
|
168
|
-
# Lifecycle will be lazy-loaded when needed
|
|
169
|
-
|
|
170
|
-
# --- CONVENIENCE PROPERTIES ---
|
|
171
|
-
# These provide familiar access patterns while using the unified model
|
|
172
|
-
|
|
173
|
-
@property
|
|
174
|
-
def evaluator(self) -> EvaluationComponent | None:
|
|
175
|
-
"""Get the primary evaluation component for this agent."""
|
|
176
|
-
return self._components.get_primary_evaluator()
|
|
177
|
-
|
|
178
|
-
@property
|
|
179
|
-
def router(self) -> RoutingComponent | None:
|
|
180
|
-
"""Get the primary routing component for this agent."""
|
|
181
|
-
return self._components.get_primary_router()
|
|
182
|
-
|
|
183
|
-
@property
|
|
184
|
-
def modules(self) -> list[AgentComponent]:
|
|
185
|
-
"""Get all components (for backward compatibility with module-style access)."""
|
|
186
|
-
return self.components.copy()
|
|
187
|
-
|
|
188
|
-
@property
|
|
189
|
-
def _components(self):
|
|
190
|
-
"""Get the component management helper."""
|
|
191
|
-
if not hasattr(self, '_components_helper'):
|
|
192
|
-
from flock.core.agent.flock_agent_components import (
|
|
193
|
-
FlockAgentComponents,
|
|
194
|
-
)
|
|
195
|
-
self._components_helper = FlockAgentComponents(self)
|
|
196
|
-
return self._components_helper
|
|
197
|
-
|
|
198
|
-
# Component management delegated to _components
|
|
199
|
-
def add_component(self, component: AgentComponent) -> None:
|
|
200
|
-
"""Add a component to this agent."""
|
|
201
|
-
self._components.add_component(component)
|
|
202
|
-
|
|
203
|
-
def remove_component(self, component_name: str) -> None:
|
|
204
|
-
"""Remove a component from this agent."""
|
|
205
|
-
self._components.remove_component(component_name)
|
|
206
|
-
|
|
207
|
-
def get_component(self, component_name: str) -> AgentComponent | None:
|
|
208
|
-
"""Get a component by name."""
|
|
209
|
-
return self._components.get_component(component_name)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def get_enabled_components(self) -> list[AgentComponent]:
|
|
213
|
-
"""Get enabled components (backward compatibility)."""
|
|
214
|
-
return self._components.get_enabled_components()
|
|
215
|
-
|
|
216
|
-
# --- LIFECYCLE DELEGATION ---
|
|
217
|
-
# Delegate lifecycle methods to the composition objects
|
|
218
|
-
|
|
219
|
-
@property
|
|
220
|
-
def _lifecycle(self):
|
|
221
|
-
"""Get the lifecycle management helper (lazy-loaded)."""
|
|
222
|
-
if not hasattr(self, '_lifecycle_helper'):
|
|
223
|
-
from flock.core.agent.flock_agent_lifecycle import (
|
|
224
|
-
FlockAgentLifecycle,
|
|
225
|
-
)
|
|
226
|
-
self._lifecycle_helper = FlockAgentLifecycle(self)
|
|
227
|
-
return self._lifecycle_helper
|
|
228
|
-
|
|
229
|
-
async def initialize(self, inputs: dict[str, Any]) -> None:
|
|
230
|
-
"""Initialize agent and run component initializers."""
|
|
231
|
-
return await self._lifecycle.initialize(inputs)
|
|
232
|
-
|
|
233
|
-
async def evaluate(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
234
|
-
"""Core evaluation logic using unified component system."""
|
|
235
|
-
return await self._lifecycle.evaluate(inputs)
|
|
236
|
-
|
|
237
|
-
async def terminate(self, inputs: dict[str, Any], result: dict[str, Any]) -> None:
|
|
238
|
-
"""Terminate agent and run component terminators."""
|
|
239
|
-
return await self._lifecycle.terminate(inputs, result)
|
|
240
|
-
|
|
241
|
-
async def on_error(self, error: Exception, inputs: dict[str, Any]) -> None:
|
|
242
|
-
"""Handle errors and run component error handlers."""
|
|
243
|
-
return await self._lifecycle.on_error(error, inputs)
|
|
244
|
-
|
|
245
|
-
# --- EXECUTION METHODS ---
|
|
246
|
-
# Delegate to the execution system
|
|
247
|
-
|
|
248
|
-
def run(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
249
|
-
"""Synchronous wrapper for run_async."""
|
|
250
|
-
return self._execution.run(inputs)
|
|
251
|
-
|
|
252
|
-
async def run_async(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
253
|
-
"""Asynchronous execution logic with unified lifecycle."""
|
|
254
|
-
return await self._execution.run_async(inputs)
|
|
255
|
-
|
|
256
|
-
# --- SERIALIZATION ---
|
|
257
|
-
# Delegate to the serialization system
|
|
258
|
-
|
|
259
|
-
def to_dict(self) -> dict[str, Any]:
|
|
260
|
-
"""Convert to dictionary using unified component serialization."""
|
|
261
|
-
return self._serialization.to_dict()
|
|
262
|
-
|
|
263
|
-
@classmethod
|
|
264
|
-
def from_dict(cls: type[T], data: dict[str, Any]) -> T:
|
|
265
|
-
"""Deserialize from dictionary using unified component deserialization."""
|
|
266
|
-
return FlockAgentSerialization.from_dict(cls, data)
|
|
267
|
-
|
|
268
|
-
def set_model(self, model: str):
|
|
269
|
-
"""Set the model for the agent and its evaluator.
|
|
270
|
-
|
|
271
|
-
This method updates both the agent's model property and propagates
|
|
272
|
-
the model to the evaluator component if it has a config with a model field.
|
|
273
|
-
"""
|
|
274
|
-
self.model = model
|
|
275
|
-
if self.evaluator and hasattr(self.evaluator, "config"):
|
|
276
|
-
self.evaluator.set_model(model)
|
|
277
|
-
logger.info(
|
|
278
|
-
f"Set model to '{model}' for agent '{self.name}' and its evaluator."
|
|
279
|
-
)
|
|
280
|
-
elif self.evaluator:
|
|
281
|
-
logger.warning(
|
|
282
|
-
f"Evaluator for agent '{self.name}' does not have a standard config to set model."
|
|
283
|
-
)
|
|
284
|
-
else:
|
|
285
|
-
logger.warning(
|
|
286
|
-
f"Agent '{self.name}' has no evaluator to set model for."
|
|
287
|
-
)
|
|
288
|
-
|
|
289
|
-
@property
|
|
290
|
-
def description(self) -> str | None:
|
|
291
|
-
"""Returns the resolved agent description."""
|
|
292
|
-
return self._integration.resolve_description(self.context)
|
|
293
|
-
|
|
294
|
-
@property
|
|
295
|
-
def input(self) -> str | None:
|
|
296
|
-
"""Returns the resolved agent input."""
|
|
297
|
-
return self._integration.resolve_input(self.context)
|
|
298
|
-
|
|
299
|
-
@property
|
|
300
|
-
def output(self) -> str | None:
|
|
301
|
-
"""Returns the resolved agent output."""
|
|
302
|
-
return self._integration.resolve_output(self.context)
|
|
303
|
-
|
|
304
|
-
@property
|
|
305
|
-
def next_agent(self) -> str | None:
|
|
306
|
-
"""Returns the resolved agent next agent."""
|
|
307
|
-
return self._integration.resolve_next_agent(self.context)
|
|
308
|
-
|
|
309
|
-
@description.setter
|
|
310
|
-
def description(self, value: DynamicStr) -> None:
|
|
311
|
-
self.description_spec = value
|
|
312
|
-
|
|
313
|
-
@input.setter
|
|
314
|
-
def input(self, value: DynamicStr) -> None:
|
|
315
|
-
self.input_spec = value
|
|
316
|
-
|
|
317
|
-
@output.setter
|
|
318
|
-
def output(self, value: DynamicStr) -> None:
|
|
319
|
-
self.output_spec = value
|
|
320
|
-
|
|
321
|
-
@next_agent.setter
|
|
322
|
-
def next_agent(self, value: DynamicStr) -> None:
|
|
323
|
-
self.next_agent_spec = value
|
|
324
|
-
|
|
325
|
-
def _save_output(self, agent_name: str, result: dict[str, Any]) -> None:
|
|
326
|
-
"""Save output to file if configured (delegated to serialization)."""
|
|
327
|
-
return self._serialization._save_output(agent_name, result)
|
|
328
|
-
|
|
329
|
-
# --- Pydantic v2 Configuration ---
|
|
330
|
-
model_config = {
|
|
331
|
-
"arbitrary_types_allowed": True,
|
|
332
|
-
"populate_by_name": True,
|
|
333
|
-
# "json_encoders": {
|
|
334
|
-
# Callable: lambda f: f"{f.__module__}.{f.__qualname__}",
|
|
335
|
-
# },
|
|
336
|
-
}
|