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,309 +0,0 @@
|
|
|
1
|
-
# src/flock/core/component/agent_component_base.py
|
|
2
|
-
"""Base classes for the unified Flock component system."""
|
|
3
|
-
|
|
4
|
-
from abc import ABC
|
|
5
|
-
from typing import Any, TypeVar
|
|
6
|
-
|
|
7
|
-
from pydantic import BaseModel, Field, create_model
|
|
8
|
-
|
|
9
|
-
from flock.core.context.context import FlockContext
|
|
10
|
-
|
|
11
|
-
# HandOffRequest removed - using agent.next_agent directly
|
|
12
|
-
|
|
13
|
-
T = TypeVar("T", bound="AgentComponentConfig")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class AgentComponentConfig(BaseModel):
|
|
17
|
-
"""Base configuration class for all Flock agent components.
|
|
18
|
-
|
|
19
|
-
This unified config class replaces FlockModuleConfig, FlockEvaluatorConfig,
|
|
20
|
-
and FlockRouterConfig, providing common functionality for all component types.
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
enabled: bool = Field(
|
|
24
|
-
default=True,
|
|
25
|
-
description="Whether this component is currently enabled"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
model: str | None = Field(
|
|
29
|
-
default=None,
|
|
30
|
-
description="Model to use for this component (if applicable)"
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
@classmethod
|
|
34
|
-
def with_fields(cls: type[T], **field_definitions) -> type[T]:
|
|
35
|
-
"""Create a new config class with additional fields.
|
|
36
|
-
|
|
37
|
-
This allows dynamic config creation for components with custom configuration needs.
|
|
38
|
-
|
|
39
|
-
Example:
|
|
40
|
-
CustomConfig = AgentComponentConfig.with_fields(
|
|
41
|
-
temperature=Field(default=0.7, description="LLM temperature"),
|
|
42
|
-
max_tokens=Field(default=1000, description="Max tokens to generate")
|
|
43
|
-
)
|
|
44
|
-
"""
|
|
45
|
-
return create_model(
|
|
46
|
-
f"Dynamic{cls.__name__}",
|
|
47
|
-
__base__=cls,
|
|
48
|
-
**field_definitions
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class AgentComponent(BaseModel, ABC):
|
|
53
|
-
"""Base class for all Flock agent components.
|
|
54
|
-
|
|
55
|
-
This unified base class replaces the separate FlockModule, FlockEvaluator,
|
|
56
|
-
and FlockRouter base classes. All agent extensions now inherit from this
|
|
57
|
-
single base class and use the unified lifecycle hooks.
|
|
58
|
-
|
|
59
|
-
Components can specialize by:
|
|
60
|
-
- EvaluationComponentBase: Implements evaluate_core() for agent intelligence
|
|
61
|
-
- RoutingComponentBase: Implements determine_next_step() for workflow routing
|
|
62
|
-
- UtilityComponentBase: Uses standard lifecycle hooks for cross-cutting concerns
|
|
63
|
-
"""
|
|
64
|
-
|
|
65
|
-
name: str = Field(
|
|
66
|
-
...,
|
|
67
|
-
description="Unique identifier for this component"
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
config: AgentComponentConfig = Field(
|
|
71
|
-
default_factory=AgentComponentConfig,
|
|
72
|
-
description="Component configuration"
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
def __init__(self, **data):
|
|
76
|
-
super().__init__(**data)
|
|
77
|
-
|
|
78
|
-
# --- Standard Lifecycle Hooks ---
|
|
79
|
-
# These are called for ALL components during agent execution
|
|
80
|
-
|
|
81
|
-
async def on_initialize(
|
|
82
|
-
self,
|
|
83
|
-
agent: Any,
|
|
84
|
-
inputs: dict[str, Any],
|
|
85
|
-
context: FlockContext | None = None,
|
|
86
|
-
) -> None:
|
|
87
|
-
"""Called when the agent starts running.
|
|
88
|
-
|
|
89
|
-
Use this for component initialization, resource setup, etc.
|
|
90
|
-
"""
|
|
91
|
-
pass
|
|
92
|
-
|
|
93
|
-
async def on_pre_evaluate(
|
|
94
|
-
self,
|
|
95
|
-
agent: Any,
|
|
96
|
-
inputs: dict[str, Any],
|
|
97
|
-
context: FlockContext | None = None,
|
|
98
|
-
) -> dict[str, Any]:
|
|
99
|
-
"""Called before agent evaluation, can modify inputs.
|
|
100
|
-
|
|
101
|
-
Args:
|
|
102
|
-
agent: The agent being executed
|
|
103
|
-
inputs: Current input data
|
|
104
|
-
context: Execution context
|
|
105
|
-
|
|
106
|
-
Returns:
|
|
107
|
-
Modified input data (or original if no changes)
|
|
108
|
-
"""
|
|
109
|
-
return inputs
|
|
110
|
-
|
|
111
|
-
async def on_post_evaluate(
|
|
112
|
-
self,
|
|
113
|
-
agent: Any,
|
|
114
|
-
inputs: dict[str, Any],
|
|
115
|
-
context: FlockContext | None = None,
|
|
116
|
-
result: dict[str, Any] | None = None,
|
|
117
|
-
) -> dict[str, Any] | None:
|
|
118
|
-
"""Called after agent evaluation, can modify results.
|
|
119
|
-
|
|
120
|
-
Args:
|
|
121
|
-
agent: The agent that was executed
|
|
122
|
-
inputs: Original input data
|
|
123
|
-
context: Execution context
|
|
124
|
-
result: Evaluation result
|
|
125
|
-
|
|
126
|
-
Returns:
|
|
127
|
-
Modified result data (or original if no changes)
|
|
128
|
-
"""
|
|
129
|
-
return result
|
|
130
|
-
|
|
131
|
-
async def on_terminate(
|
|
132
|
-
self,
|
|
133
|
-
agent: Any,
|
|
134
|
-
inputs: dict[str, Any],
|
|
135
|
-
context: FlockContext | None = None,
|
|
136
|
-
result: dict[str, Any] | None = None,
|
|
137
|
-
) -> dict[str, Any] | None:
|
|
138
|
-
"""Called when the agent finishes running.
|
|
139
|
-
|
|
140
|
-
Use this for cleanup, final result processing, etc.
|
|
141
|
-
"""
|
|
142
|
-
return result
|
|
143
|
-
|
|
144
|
-
async def on_error(
|
|
145
|
-
self,
|
|
146
|
-
agent: Any,
|
|
147
|
-
inputs: dict[str, Any],
|
|
148
|
-
context: FlockContext | None = None,
|
|
149
|
-
error: Exception | None = None,
|
|
150
|
-
) -> None:
|
|
151
|
-
"""Called when an error occurs during agent execution.
|
|
152
|
-
|
|
153
|
-
Use this for error handling, logging, recovery, etc.
|
|
154
|
-
"""
|
|
155
|
-
pass
|
|
156
|
-
|
|
157
|
-
# --- Specialized Hooks ---
|
|
158
|
-
# These are overridden by specialized component types
|
|
159
|
-
|
|
160
|
-
async def evaluate_core(
|
|
161
|
-
self,
|
|
162
|
-
agent: Any,
|
|
163
|
-
inputs: dict[str, Any],
|
|
164
|
-
context: FlockContext | None = None,
|
|
165
|
-
tools: list[Any] | None = None,
|
|
166
|
-
mcp_tools: list[Any] | None = None,
|
|
167
|
-
) -> dict[str, Any]:
|
|
168
|
-
"""Core evaluation logic - override in EvaluationComponentBase.
|
|
169
|
-
|
|
170
|
-
This is where the main "intelligence" of the agent happens.
|
|
171
|
-
Only one component per agent should implement this meaningfully.
|
|
172
|
-
|
|
173
|
-
Args:
|
|
174
|
-
agent: The agent being executed
|
|
175
|
-
inputs: Input data for evaluation
|
|
176
|
-
context: Execution context
|
|
177
|
-
tools: Available tools for the agent
|
|
178
|
-
mcp_tools: Available MCP tools
|
|
179
|
-
|
|
180
|
-
Returns:
|
|
181
|
-
Evaluation result
|
|
182
|
-
"""
|
|
183
|
-
# Default implementation is pass-through
|
|
184
|
-
return inputs
|
|
185
|
-
|
|
186
|
-
async def determine_next_step(
|
|
187
|
-
self,
|
|
188
|
-
agent: Any,
|
|
189
|
-
result: dict[str, Any],
|
|
190
|
-
context: FlockContext | None = None,
|
|
191
|
-
) -> None:
|
|
192
|
-
"""Determine the next step in the workflow - override in RoutingComponentBase.
|
|
193
|
-
|
|
194
|
-
This is where routing decisions are made. Sets agent.next_agent directly.
|
|
195
|
-
|
|
196
|
-
Args:
|
|
197
|
-
agent: The agent that just completed
|
|
198
|
-
result: Result from the agent's evaluation
|
|
199
|
-
context: Execution context
|
|
200
|
-
|
|
201
|
-
Returns:
|
|
202
|
-
None - routing components set agent.next_agent directly
|
|
203
|
-
"""
|
|
204
|
-
# Default implementation provides no routing
|
|
205
|
-
pass
|
|
206
|
-
|
|
207
|
-
# --- MCP Server Lifecycle Hooks ---
|
|
208
|
-
# For components that interact directly with MCP servers
|
|
209
|
-
|
|
210
|
-
async def on_pre_server_init(self, server: Any) -> None:
|
|
211
|
-
"""Called before a server initializes."""
|
|
212
|
-
pass
|
|
213
|
-
|
|
214
|
-
async def on_post_server_init(self, server: Any) -> None:
|
|
215
|
-
"""Called after a server initializes."""
|
|
216
|
-
pass
|
|
217
|
-
|
|
218
|
-
async def on_pre_server_terminate(self, server: Any) -> None:
|
|
219
|
-
"""Called before a server terminates."""
|
|
220
|
-
pass
|
|
221
|
-
|
|
222
|
-
async def on_post_server_terminate(self, server: Any) -> None:
|
|
223
|
-
"""Called after a server terminates."""
|
|
224
|
-
pass
|
|
225
|
-
|
|
226
|
-
async def on_server_error(self, server: Any, error: Exception) -> None:
|
|
227
|
-
"""Called when a server errors."""
|
|
228
|
-
pass
|
|
229
|
-
|
|
230
|
-
async def on_connect(
|
|
231
|
-
self,
|
|
232
|
-
server: Any,
|
|
233
|
-
additional_params: dict[str, Any],
|
|
234
|
-
) -> dict[str, Any]:
|
|
235
|
-
"""Called before a connection is being established to a mcp server.
|
|
236
|
-
|
|
237
|
-
use `server` (type FlockMCPServer) to modify the core behavior of the server.
|
|
238
|
-
use `additional_params` to 'tack_on' additional configurations (for example additional headers for sse-clients.)
|
|
239
|
-
|
|
240
|
-
(For example: modify the server's config)
|
|
241
|
-
new_config = NewConfigObject(...)
|
|
242
|
-
server.config = new_config
|
|
243
|
-
|
|
244
|
-
Warning:
|
|
245
|
-
Be very careful when modifying a server's internal state.
|
|
246
|
-
If you just need to 'tack on' additional information (such as headers)
|
|
247
|
-
or want to temporarily override certain configurations (such as timeouts)
|
|
248
|
-
use `additional_params` instead if you can.
|
|
249
|
-
|
|
250
|
-
(Or pass additional values downstream:)
|
|
251
|
-
additional_params["headers"] = { "Authorization": "Bearer 123" }
|
|
252
|
-
additional_params["read_timeout_seconds"] = 100
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
Note:
|
|
256
|
-
`additional_params` resets between mcp_calls.
|
|
257
|
-
so there is not persistence between individual calls.
|
|
258
|
-
This choice has been made to allow developers to
|
|
259
|
-
dynamically switch configurations.
|
|
260
|
-
(This can be used, for example, to use a module to inject oauth headers for
|
|
261
|
-
individual users on a call-to-call basis. this also gives you direct control over
|
|
262
|
-
managing the headers yourself. For example, checking for lifetimes on JWT-Tokens.)
|
|
263
|
-
|
|
264
|
-
Note:
|
|
265
|
-
you can access `additional_params` when you are implementing your own subclasses of
|
|
266
|
-
FlockMCPClientManager and FlockMCPClient. (with self.additional_params.)
|
|
267
|
-
|
|
268
|
-
keys which are processed for `additional_params` in the flock core code are:
|
|
269
|
-
--- General ---
|
|
270
|
-
|
|
271
|
-
"refresh_client": bool -> defaults to False. Indicates whether or not to restart a connection on a call. (can be used when headers oder api-keys change to automatically switch to a new client.)
|
|
272
|
-
"read_timeout_seconds": float -> How long to wait for a connection to happen.
|
|
273
|
-
|
|
274
|
-
--- SSE ---
|
|
275
|
-
|
|
276
|
-
"override_headers": bool -> default False. If set to false, additional headers will be appended, if set to True, additional headers will override existing ones.
|
|
277
|
-
"headers": dict[str, Any] -> Additional Headers injected in sse-clients and ws-clients
|
|
278
|
-
"sse_read_timeout_seconds": float -> how long until a connection is being terminated for sse-clients.
|
|
279
|
-
"url": str -> which url the server listens on (allows switching between mcp-servers with modules.)
|
|
280
|
-
|
|
281
|
-
--- Stdio ---
|
|
282
|
-
|
|
283
|
-
"command": str -> Command to run for stdio-servers.
|
|
284
|
-
"args": list[str] -> additional paramters for stdio-servers.
|
|
285
|
-
"env": dict[str, Any] -> Environment-Variables for stdio-servers.
|
|
286
|
-
"encoding": str -> Encoding to use when talking to stdio-servers.
|
|
287
|
-
"encoding-error-handler": str -> Encoding error handler to use when talking to stdio-servers.
|
|
288
|
-
|
|
289
|
-
--- Websockets ---
|
|
290
|
-
|
|
291
|
-
"url": str -> Which url the server listens on (allows switching between mcp-servers with modules.)
|
|
292
|
-
"""
|
|
293
|
-
pass
|
|
294
|
-
|
|
295
|
-
async def on_pre_mcp_call(
|
|
296
|
-
self,
|
|
297
|
-
server: Any,
|
|
298
|
-
arguments: Any | None = None,
|
|
299
|
-
) -> None:
|
|
300
|
-
"""Called before any MCP Calls."""
|
|
301
|
-
pass
|
|
302
|
-
|
|
303
|
-
async def on_post_mcp_call(
|
|
304
|
-
self,
|
|
305
|
-
server: Any,
|
|
306
|
-
result: Any | None = None,
|
|
307
|
-
) -> None:
|
|
308
|
-
"""Called after any MCP Calls."""
|
|
309
|
-
pass
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
# src/flock/core/component/evaluation_component_base.py
|
|
2
|
-
"""Base class for evaluation components in the unified component system."""
|
|
3
|
-
|
|
4
|
-
from abc import abstractmethod
|
|
5
|
-
from typing import Any
|
|
6
|
-
|
|
7
|
-
from flock.core.context.context import FlockContext
|
|
8
|
-
|
|
9
|
-
from .agent_component_base import AgentComponent
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class EvaluationComponent(AgentComponent):
|
|
13
|
-
"""Base class for evaluation components.
|
|
14
|
-
|
|
15
|
-
Evaluation components implement the core intelligence/logic of an agent.
|
|
16
|
-
They are responsible for taking inputs and producing outputs using some
|
|
17
|
-
evaluation strategy (e.g., DSPy, direct LLM calls, deterministic logic).
|
|
18
|
-
|
|
19
|
-
Each agent should have exactly one primary evaluation component.
|
|
20
|
-
|
|
21
|
-
Example implementations:
|
|
22
|
-
- DeclarativeEvaluationComponent (DSPy-based)
|
|
23
|
-
- ScriptEvaluationComponent (Python script-based)
|
|
24
|
-
- LLMEvaluationComponent (direct LLM API)
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
@abstractmethod
|
|
28
|
-
def set_model(self, model: str, temperature: float = 0.0, max_tokens: int = 4096) -> None:
|
|
29
|
-
"""Set the model for the evaluation component."""
|
|
30
|
-
pass
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@abstractmethod
|
|
34
|
-
async def evaluate_core(
|
|
35
|
-
self,
|
|
36
|
-
agent: Any,
|
|
37
|
-
inputs: dict[str, Any],
|
|
38
|
-
context: FlockContext | None = None,
|
|
39
|
-
tools: list[Any] | None = None,
|
|
40
|
-
mcp_tools: list[Any] | None = None,
|
|
41
|
-
) -> dict[str, Any]:
|
|
42
|
-
"""Core evaluation logic - MUST be implemented by concrete classes.
|
|
43
|
-
|
|
44
|
-
This is the heart of the agent's intelligence. It takes the processed
|
|
45
|
-
inputs (after all on_pre_evaluate hooks) and produces the agent's output.
|
|
46
|
-
|
|
47
|
-
Args:
|
|
48
|
-
agent: The agent being executed
|
|
49
|
-
inputs: Input data for evaluation (after pre-processing)
|
|
50
|
-
context: Execution context with variables, history, etc.
|
|
51
|
-
tools: Available callable tools for the agent
|
|
52
|
-
mcp_tools: Available MCP server tools
|
|
53
|
-
|
|
54
|
-
Returns:
|
|
55
|
-
Evaluation result as a dictionary
|
|
56
|
-
|
|
57
|
-
Raises:
|
|
58
|
-
NotImplementedError: Must be implemented by concrete classes
|
|
59
|
-
"""
|
|
60
|
-
raise NotImplementedError(
|
|
61
|
-
f"{self.__class__.__name__} must implement evaluate_core()"
|
|
62
|
-
)
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# src/flock/core/component/routing_component_base.py
|
|
2
|
-
"""Base class for routing components in the unified component system."""
|
|
3
|
-
|
|
4
|
-
from abc import abstractmethod
|
|
5
|
-
from typing import Any
|
|
6
|
-
|
|
7
|
-
from flock.core.context.context import FlockContext
|
|
8
|
-
|
|
9
|
-
from .agent_component_base import AgentComponent
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class RoutingComponent(AgentComponent):
|
|
13
|
-
"""Base class for routing components.
|
|
14
|
-
|
|
15
|
-
Routing components determine the next step in a workflow based on the
|
|
16
|
-
current agent's output. They implement workflow orchestration logic
|
|
17
|
-
and can enable complex multi-agent patterns.
|
|
18
|
-
|
|
19
|
-
Each agent should have at most one routing component. If no routing
|
|
20
|
-
component is present, the workflow ends after this agent.
|
|
21
|
-
|
|
22
|
-
Example implementations:
|
|
23
|
-
- ConditionalRoutingModule (rule-based routing)
|
|
24
|
-
- LLMRoutingModule (AI-powered routing decisions)
|
|
25
|
-
- DefaultRoutingModule (simple next-agent routing)
|
|
26
|
-
- ListGeneratorRoutingModule (dynamic agent creation)
|
|
27
|
-
"""
|
|
28
|
-
|
|
29
|
-
@abstractmethod
|
|
30
|
-
async def determine_next_step(
|
|
31
|
-
self,
|
|
32
|
-
agent: Any,
|
|
33
|
-
result: dict[str, Any],
|
|
34
|
-
context: FlockContext | None = None,
|
|
35
|
-
) -> str | Any | None:
|
|
36
|
-
"""Determine the next agent in the workflow - MUST be implemented.
|
|
37
|
-
|
|
38
|
-
This method analyzes the agent's result and determines what agent
|
|
39
|
-
should execute next. The result will be stored in agent.next_agent
|
|
40
|
-
for the orchestrator to process.
|
|
41
|
-
|
|
42
|
-
Args:
|
|
43
|
-
agent: The agent that just completed execution
|
|
44
|
-
result: Result from the agent's evaluation (after post-processing)
|
|
45
|
-
context: Execution context with workflow state
|
|
46
|
-
|
|
47
|
-
Returns:
|
|
48
|
-
String (agent name), FlockAgent instance, or None to end workflow
|
|
49
|
-
|
|
50
|
-
Raises:
|
|
51
|
-
NotImplementedError: Must be implemented by concrete classes
|
|
52
|
-
"""
|
|
53
|
-
raise NotImplementedError(
|
|
54
|
-
f"{self.__class__.__name__} must implement determine_next_step()"
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
async def evaluate_core(
|
|
58
|
-
self,
|
|
59
|
-
agent: Any,
|
|
60
|
-
inputs: dict[str, Any],
|
|
61
|
-
context: FlockContext | None = None,
|
|
62
|
-
tools: list[Any] | None = None,
|
|
63
|
-
mcp_tools: list[Any] | None = None,
|
|
64
|
-
) -> dict[str, Any]:
|
|
65
|
-
"""Routing components typically don't modify evaluation - pass through.
|
|
66
|
-
|
|
67
|
-
Routing components usually don't implement core evaluation logic,
|
|
68
|
-
they focus on workflow decisions. This default implementation
|
|
69
|
-
passes inputs through unchanged.
|
|
70
|
-
|
|
71
|
-
Override this if your routing component also needs to modify
|
|
72
|
-
the evaluation process.
|
|
73
|
-
"""
|
|
74
|
-
return inputs
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# src/flock/core/component/utility_component_base.py
|
|
2
|
-
"""Base class for utility components in the unified component system."""
|
|
3
|
-
|
|
4
|
-
from typing import Any
|
|
5
|
-
|
|
6
|
-
from flock.core.context.context import FlockContext
|
|
7
|
-
|
|
8
|
-
# HandOffRequest removed - using agent.next_agent directly
|
|
9
|
-
from .agent_component_base import AgentComponent
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class UtilityComponent(AgentComponent):
|
|
13
|
-
"""Base class for utility/enhancement components.
|
|
14
|
-
|
|
15
|
-
Utility components add cross-cutting concerns to agents without being
|
|
16
|
-
the primary evaluation or routing logic. They typically use the standard
|
|
17
|
-
lifecycle hooks to enhance agent behavior.
|
|
18
|
-
|
|
19
|
-
These components focus on concerns like:
|
|
20
|
-
- Memory management
|
|
21
|
-
- Output formatting
|
|
22
|
-
- Metrics collection
|
|
23
|
-
- Logging and tracing
|
|
24
|
-
- Input validation
|
|
25
|
-
- Error handling
|
|
26
|
-
- Caching
|
|
27
|
-
- Rate limiting
|
|
28
|
-
|
|
29
|
-
Example implementations:
|
|
30
|
-
- MemoryUtilityModule (memory persistence)
|
|
31
|
-
- OutputUtilityModule (result formatting)
|
|
32
|
-
- MetricsUtilityModule (performance tracking)
|
|
33
|
-
- AssertionUtilityModule (result validation)
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
async def evaluate_core(
|
|
37
|
-
self,
|
|
38
|
-
agent: Any,
|
|
39
|
-
inputs: dict[str, Any],
|
|
40
|
-
context: FlockContext | None = None,
|
|
41
|
-
tools: list[Any] | None = None,
|
|
42
|
-
mcp_tools: list[Any] | None = None,
|
|
43
|
-
) -> dict[str, Any]:
|
|
44
|
-
"""Utility components typically don't implement core evaluation.
|
|
45
|
-
|
|
46
|
-
This default implementation passes inputs through unchanged.
|
|
47
|
-
Utility components usually enhance behavior through the standard
|
|
48
|
-
lifecycle hooks (on_pre_evaluate, on_post_evaluate, etc.).
|
|
49
|
-
|
|
50
|
-
Override this only if your utility component needs to participate
|
|
51
|
-
in the core evaluation process.
|
|
52
|
-
"""
|
|
53
|
-
return inputs
|
|
54
|
-
|
|
55
|
-
async def determine_next_step(
|
|
56
|
-
self,
|
|
57
|
-
agent: Any,
|
|
58
|
-
result: dict[str, Any],
|
|
59
|
-
context: FlockContext | None = None,
|
|
60
|
-
) -> None:
|
|
61
|
-
"""Utility components typically don't implement routing logic.
|
|
62
|
-
|
|
63
|
-
This default implementation does nothing, as utility components
|
|
64
|
-
usually enhance behavior through other lifecycle hooks.
|
|
65
|
-
|
|
66
|
-
Override this only if your utility component needs to influence
|
|
67
|
-
workflow routing decisions by setting agent.next_agent.
|
|
68
|
-
"""
|
|
69
|
-
pass
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
"""Configuration settings for FlockAgent."""
|
|
2
|
-
|
|
3
|
-
from typing import Literal
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel, Field
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class FlockAgentConfig(BaseModel):
|
|
9
|
-
"""FlockAgentConfig is a class that holds the configuration for a Flock agent.
|
|
10
|
-
|
|
11
|
-
It is used to store various settings and parameters that can be accessed throughout the agent's lifecycle.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
write_to_file: bool = Field(
|
|
15
|
-
default=False,
|
|
16
|
-
description="Write the agent's output to a file.",
|
|
17
|
-
)
|
|
18
|
-
wait_for_input: bool = Field(
|
|
19
|
-
default=False,
|
|
20
|
-
description="Wait for user input after the agent's output is displayed.",
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
handoff_strategy: Literal["append", "override", "static", "map"] = Field(
|
|
24
|
-
default="static",
|
|
25
|
-
description="""Strategy for passing data to the next agent.
|
|
26
|
-
|
|
27
|
-
example:
|
|
28
|
-
ReviewAgent.next_agent = SummaryAgent
|
|
29
|
-
ReviewAgent(output = "text:str, keywords:list[str], rating:int")
|
|
30
|
-
SummaryAgent(input = "text:str, title:str")
|
|
31
|
-
|
|
32
|
-
'append' means the difference in signature is appended to the next agent's input signature.
|
|
33
|
-
SummaryAgent(input = "text:str, title:str, keywords:list[str], rating:int")
|
|
34
|
-
|
|
35
|
-
'override' means the target agent's signature is getting overriden.
|
|
36
|
-
SummaryAgent(input = "text:str, keywords:list[str], rating:int")
|
|
37
|
-
|
|
38
|
-
'static' means the the target agent's signature is not changed at all.
|
|
39
|
-
If source agent has no output fields that match the target agent's input,
|
|
40
|
-
there will be no data passed to the next agent.
|
|
41
|
-
SummaryAgent(input = "text:str, title:str")
|
|
42
|
-
|
|
43
|
-
'map' means the source agent's output is mapped to the target agent's input
|
|
44
|
-
based on 'handoff_map' configuration.
|
|
45
|
-
|
|
46
|
-
""",
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
handoff_map: dict[str, str] | None = Field(
|
|
50
|
-
default=None,
|
|
51
|
-
description="""Mapping of source agent output fields to target agent input fields.
|
|
52
|
-
|
|
53
|
-
Used with 'handoff_strategy' = 'map'.
|
|
54
|
-
Example: {"text": "text", "keywords": "title"}
|
|
55
|
-
|
|
56
|
-
If a field is not mapped, it will not be passed to the next agent.
|
|
57
|
-
""",
|
|
58
|
-
)
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
from pydantic import Field
|
|
5
|
-
|
|
6
|
-
from flock.core.config.flock_agent_config import FlockAgentConfig
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class ScheduledAgentConfig(FlockAgentConfig):
|
|
10
|
-
"""Configuration specific to agents that run on a schedule."""
|
|
11
|
-
schedule_expression: str = Field(
|
|
12
|
-
...,
|
|
13
|
-
description="Defines when the agent should run. "
|
|
14
|
-
"Examples: 'every 60m', 'every 1h', 'daily at 02:00', '0 */2 * * *' (cron expression)"
|
|
15
|
-
)
|
|
16
|
-
enabled: bool = Field(
|
|
17
|
-
True,
|
|
18
|
-
description="Whether the scheduled agent is enabled. "
|
|
19
|
-
"If False, the agent will not run even if the schedule expression is valid."
|
|
20
|
-
)
|
|
21
|
-
initial_run: bool = Field(
|
|
22
|
-
False,
|
|
23
|
-
description="If True, the agent will run immediately after being scheduled, "
|
|
24
|
-
"regardless of the schedule expression."
|
|
25
|
-
)
|
|
26
|
-
max_runs: int = Field(
|
|
27
|
-
0,
|
|
28
|
-
description="Maximum number of times the agent can run. "
|
|
29
|
-
"0 means unlimited runs. If set, the agent will stop running after reaching this limit."
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
def __init__(self, **kwargs):
|
|
33
|
-
super().__init__(**kwargs)
|
|
34
|
-
# Ensure schedule_expression is always set
|
|
35
|
-
if 'schedule_expression' not in kwargs:
|
|
36
|
-
raise ValueError("schedule_expression is required for ScheduledAgentConfig")
|
|
37
|
-
|
|
38
|
-
# Validate initial_run and max_runs
|
|
39
|
-
if self.initial_run and self.max_runs > 0:
|
|
40
|
-
raise ValueError("Cannot set initial_run to True if max_runs is greater than 0")
|