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/config.py
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
"""Global configuration for Flock.
|
|
2
|
-
|
|
3
|
-
Reads environment via `decouple` and exposes constants used across the codebase.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
# flock/config.py
|
|
7
|
-
import os
|
|
8
|
-
|
|
9
|
-
from decouple import config
|
|
10
|
-
|
|
11
|
-
from flock.core.logging.telemetry import TelemetryConfig
|
|
12
|
-
|
|
13
|
-
cfg_file = os.path.expanduser(f"~/.flock/flock.cfg")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# -- Connection and External Service Configurations --
|
|
17
|
-
TEMPORAL_SERVER_URL = config("TEMPORAL_SERVER_URL", "localhost:7233")
|
|
18
|
-
DEFAULT_MODEL = config("DEFAULT_MODEL", "openai/gpt-4o")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# API Keys and related settings
|
|
22
|
-
TAVILY_API_KEY = config("TAVILY_API_KEY", "")
|
|
23
|
-
GITHUB_PAT = config("GITHUB_PAT", "")
|
|
24
|
-
GITHUB_REPO = config("GITHUB_REPO", "")
|
|
25
|
-
GITHUB_USERNAME = config("GITHUB_USERNAME", "")
|
|
26
|
-
|
|
27
|
-
# -- Debugging and Logging Configurations --
|
|
28
|
-
LOCAL_DEBUG = config("LOCAL_DEBUG", True)
|
|
29
|
-
LOG_LEVEL = config("LOG_LEVEL", "DEBUG")
|
|
30
|
-
LOGGING_DIR = config("LOGGING_DIR", ".flock/logs")
|
|
31
|
-
|
|
32
|
-
OTEL_SERVICE_NAME = config("OTL_SERVICE_NAME", "otel-flock")
|
|
33
|
-
JAEGER_ENDPOINT = config(
|
|
34
|
-
"JAEGER_ENDPOINT", "http://localhost:14268/api/traces"
|
|
35
|
-
) # Default gRPC endpoint for Jaeger
|
|
36
|
-
JAEGER_TRANSPORT = config(
|
|
37
|
-
"JAEGER_TRANSPORT", "http"
|
|
38
|
-
).lower() # Options: "grpc" or "http"
|
|
39
|
-
OTEL_SQL_DATABASE_NAME = config("OTEL_SQL_DATABASE", "flock_events.db")
|
|
40
|
-
OTEL_FILE_NAME = config("OTEL_FILE_NAME", "flock_events.jsonl")
|
|
41
|
-
OTEL_ENABLE_SQL: bool = config("OTEL_ENABLE_SQL", True) == "True"
|
|
42
|
-
OTEL_ENABLE_FILE: bool = config("OTEL_ENABLE_FILE", True) == "True"
|
|
43
|
-
OTEL_ENABLE_JAEGER: bool = config("OTEL_ENABLE_JAEGER", False) == "True"
|
|
44
|
-
OTEL_ENABLE_OTLP: bool = config("OTEL_ENABLE_OTLP", False) == "True"
|
|
45
|
-
OTEL_EXPORTER_OTLP_PROTOCOL: str = config("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc")
|
|
46
|
-
OTEL_EXPORTER_OTLP_ENDPOINT: str = config("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317")
|
|
47
|
-
|
|
48
|
-
TELEMETRY = TelemetryConfig(
|
|
49
|
-
OTEL_SERVICE_NAME,
|
|
50
|
-
JAEGER_ENDPOINT,
|
|
51
|
-
JAEGER_TRANSPORT,
|
|
52
|
-
LOGGING_DIR,
|
|
53
|
-
OTEL_FILE_NAME,
|
|
54
|
-
OTEL_SQL_DATABASE_NAME,
|
|
55
|
-
OTEL_ENABLE_JAEGER,
|
|
56
|
-
OTEL_ENABLE_FILE,
|
|
57
|
-
OTEL_ENABLE_SQL,
|
|
58
|
-
OTEL_ENABLE_OTLP,
|
|
59
|
-
OTEL_EXPORTER_OTLP_PROTOCOL,
|
|
60
|
-
OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
61
|
-
)
|
flock/core/__init__.py
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
"""Core package public API with lazy imports.
|
|
2
|
-
|
|
3
|
-
This module exposes key symbols while avoiding heavy imports at package import time.
|
|
4
|
-
Symbols are imported lazily on first access via ``__getattr__``.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
from typing import Any
|
|
10
|
-
|
|
11
|
-
__all__ = [
|
|
12
|
-
"Flock",
|
|
13
|
-
"FlockAgent",
|
|
14
|
-
"DefaultAgent",
|
|
15
|
-
"FlockContext",
|
|
16
|
-
"FlockFactory",
|
|
17
|
-
# Components
|
|
18
|
-
"AgentComponent",
|
|
19
|
-
"AgentComponentConfig",
|
|
20
|
-
"EvaluationComponent",
|
|
21
|
-
"RoutingComponent",
|
|
22
|
-
"UtilityComponent",
|
|
23
|
-
# MCP
|
|
24
|
-
"FlockMCPClient",
|
|
25
|
-
"FlockMCPClientManager",
|
|
26
|
-
"FlockMCPServer",
|
|
27
|
-
"FlockMCPTool",
|
|
28
|
-
# Registry
|
|
29
|
-
"FlockRegistry",
|
|
30
|
-
"flock_callable",
|
|
31
|
-
"flock_component",
|
|
32
|
-
"flock_tool",
|
|
33
|
-
"flock_type",
|
|
34
|
-
"get_registry",
|
|
35
|
-
]
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def __getattr__(name: str) -> Any: # pragma: no cover - thin loader
|
|
39
|
-
if name == "Flock":
|
|
40
|
-
from .flock import Flock
|
|
41
|
-
|
|
42
|
-
return Flock
|
|
43
|
-
if name == "FlockAgent":
|
|
44
|
-
from .flock_agent import FlockAgent
|
|
45
|
-
|
|
46
|
-
return FlockAgent
|
|
47
|
-
if name == "DefaultAgent":
|
|
48
|
-
from .agent.default_agent import DefaultAgent
|
|
49
|
-
|
|
50
|
-
return DefaultAgent
|
|
51
|
-
if name == "FlockContext":
|
|
52
|
-
from .context.context import FlockContext
|
|
53
|
-
|
|
54
|
-
return FlockContext
|
|
55
|
-
if name == "FlockFactory":
|
|
56
|
-
from .flock_factory import FlockFactory
|
|
57
|
-
|
|
58
|
-
return FlockFactory
|
|
59
|
-
if name in {"AgentComponent", "AgentComponentConfig", "EvaluationComponent", "RoutingComponent", "UtilityComponent"}:
|
|
60
|
-
from .component import (
|
|
61
|
-
AgentComponent,
|
|
62
|
-
AgentComponentConfig,
|
|
63
|
-
EvaluationComponent,
|
|
64
|
-
RoutingComponent,
|
|
65
|
-
UtilityComponent,
|
|
66
|
-
)
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
"AgentComponent": AgentComponent,
|
|
70
|
-
"AgentComponentConfig": AgentComponentConfig,
|
|
71
|
-
"EvaluationComponent": EvaluationComponent,
|
|
72
|
-
"RoutingComponent": RoutingComponent,
|
|
73
|
-
"UtilityComponent": UtilityComponent,
|
|
74
|
-
}[name]
|
|
75
|
-
if name in {"FlockMCPClient", "FlockMCPClientManager", "FlockMCPServer", "FlockMCPTool"}:
|
|
76
|
-
if name == "FlockMCPClient":
|
|
77
|
-
from .mcp.mcp_client import FlockMCPClient
|
|
78
|
-
|
|
79
|
-
return FlockMCPClient
|
|
80
|
-
if name == "FlockMCPClientManager":
|
|
81
|
-
from .mcp.mcp_client_manager import FlockMCPClientManager
|
|
82
|
-
|
|
83
|
-
return FlockMCPClientManager
|
|
84
|
-
if name == "FlockMCPServer":
|
|
85
|
-
from .mcp.flock_mcp_server import FlockMCPServer
|
|
86
|
-
|
|
87
|
-
return FlockMCPServer
|
|
88
|
-
if name == "FlockMCPTool":
|
|
89
|
-
from .mcp.flock_mcp_tool import FlockMCPTool
|
|
90
|
-
|
|
91
|
-
return FlockMCPTool
|
|
92
|
-
if name in {"FlockRegistry", "flock_callable", "flock_component", "flock_tool", "flock_type", "get_registry"}:
|
|
93
|
-
from .registry import (
|
|
94
|
-
RegistryHub as FlockRegistry,
|
|
95
|
-
flock_callable,
|
|
96
|
-
flock_component,
|
|
97
|
-
flock_tool,
|
|
98
|
-
flock_type,
|
|
99
|
-
get_registry,
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
return {
|
|
103
|
-
"FlockRegistry": FlockRegistry,
|
|
104
|
-
"flock_callable": flock_callable,
|
|
105
|
-
"flock_component": flock_component,
|
|
106
|
-
"flock_tool": flock_tool,
|
|
107
|
-
"flock_type": flock_type,
|
|
108
|
-
"get_registry": get_registry,
|
|
109
|
-
}[name]
|
|
110
|
-
raise AttributeError(name)
|
flock/core/agent/__init__.py
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# src/flock/core/agent/__init__.py
|
|
2
|
-
"""Agent components package."""
|
|
3
|
-
|
|
4
|
-
from .flock_agent_components import FlockAgentComponents
|
|
5
|
-
from .flock_agent_execution import FlockAgentExecution
|
|
6
|
-
from .flock_agent_integration import FlockAgentIntegration
|
|
7
|
-
from .flock_agent_lifecycle import FlockAgentLifecycle
|
|
8
|
-
from .flock_agent_serialization import FlockAgentSerialization
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"FlockAgentComponents",
|
|
12
|
-
"FlockAgentExecution",
|
|
13
|
-
"FlockAgentIntegration",
|
|
14
|
-
"FlockAgentLifecycle",
|
|
15
|
-
"FlockAgentSerialization",
|
|
16
|
-
]
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
"""DefaultAgent: explicit preset agent wiring standard components.
|
|
2
|
-
|
|
3
|
-
This class replaces the need for using FlockFactory for common setups by
|
|
4
|
-
providing a clear, explicit Agent class that mirrors the factory's kwargs
|
|
5
|
-
and composes the standard components under the hood.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
from collections.abc import Callable
|
|
11
|
-
from typing import Any, Literal
|
|
12
|
-
|
|
13
|
-
from flock.components.utility.example_utility_component import (
|
|
14
|
-
ExampleUtilityComponent,
|
|
15
|
-
ExampleUtilityConfig,
|
|
16
|
-
)
|
|
17
|
-
from flock.components.utility.feedback_utility_component import (
|
|
18
|
-
FeedbackUtilityComponent,
|
|
19
|
-
FeedbackUtilityConfig,
|
|
20
|
-
)
|
|
21
|
-
from flock.components.utility.metrics_utility_component import (
|
|
22
|
-
MetricsUtilityComponent,
|
|
23
|
-
MetricsUtilityConfig,
|
|
24
|
-
)
|
|
25
|
-
from flock.core.config.flock_agent_config import FlockAgentConfig
|
|
26
|
-
from flock.core.flock_agent import DynamicStr, FlockAgent
|
|
27
|
-
from flock.core.logging.formatters.themes import OutputTheme
|
|
28
|
-
from flock.core.mcp.flock_mcp_server import FlockMCPServer
|
|
29
|
-
from flock.workflow.temporal_config import TemporalActivityConfig
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class DefaultAgent(FlockAgent):
|
|
33
|
-
"""Explicit agent class wiring standard evaluation + utility components.
|
|
34
|
-
|
|
35
|
-
Components included:
|
|
36
|
-
- DeclarativeEvaluationComponent (LLM evaluation)
|
|
37
|
-
- OutputUtilityComponent (formatting/printing)
|
|
38
|
-
- MetricsUtilityComponent (latency tracking)
|
|
39
|
-
- FeedbackUtilityComponent (feedback learning) - optional
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
def __init__(
|
|
43
|
-
self,
|
|
44
|
-
name: str,
|
|
45
|
-
description: DynamicStr | None = None,
|
|
46
|
-
model: str | None = None,
|
|
47
|
-
input: DynamicStr | None = None,
|
|
48
|
-
output: DynamicStr | None = None,
|
|
49
|
-
tools: list[Callable[..., Any] | Any] | None = None,
|
|
50
|
-
servers: list[str | FlockMCPServer] | None = None,
|
|
51
|
-
tool_whitelist: list[str] | None = None,
|
|
52
|
-
# Evaluation parameters
|
|
53
|
-
use_cache: bool = False,
|
|
54
|
-
temperature: float = 0.7,
|
|
55
|
-
max_tokens: int | None = None,
|
|
56
|
-
max_tool_calls: int = 10,
|
|
57
|
-
max_retries: int = 2,
|
|
58
|
-
stream: bool = True,
|
|
59
|
-
stream_callbacks: list[Callable[..., Any] | Any] | None = None,
|
|
60
|
-
stream_vertical_overflow: Literal["crop", "ellipsis", "crop_above", "visible"] = "crop_above",
|
|
61
|
-
include_thought_process: bool = False,
|
|
62
|
-
include_reasoning: bool = False,
|
|
63
|
-
include_status_output: bool = False,
|
|
64
|
-
# Output utility parameters
|
|
65
|
-
enable_rich_tables: bool = True,
|
|
66
|
-
output_theme: OutputTheme | None = None,
|
|
67
|
-
no_output: bool = False,
|
|
68
|
-
print_context: bool = False,
|
|
69
|
-
# Agent config
|
|
70
|
-
write_to_file: bool = False,
|
|
71
|
-
wait_for_input: bool = False,
|
|
72
|
-
# Metrics utility
|
|
73
|
-
alert_latency_threshold_ms: int = 30_000,
|
|
74
|
-
# Feedback utility
|
|
75
|
-
enable_feedback: bool = False,
|
|
76
|
-
feedback_config: FeedbackUtilityConfig | None = None,
|
|
77
|
-
# Example utility
|
|
78
|
-
enable_examples: bool = False,
|
|
79
|
-
example_config: ExampleUtilityConfig | None = None,
|
|
80
|
-
# Workflow
|
|
81
|
-
next_agent: DynamicStr | None = None,
|
|
82
|
-
temporal_activity_config: TemporalActivityConfig | None = None,
|
|
83
|
-
):
|
|
84
|
-
"""Initialize a DefaultAgent with standard components and configuration.
|
|
85
|
-
|
|
86
|
-
Args:
|
|
87
|
-
name: Unique identifier for the agent
|
|
88
|
-
description: Human-readable description of the agent's purpose
|
|
89
|
-
model: Model identifier (e.g., 'openai/gpt-4o'). Uses Flock default if None
|
|
90
|
-
input: Input signature for the agent
|
|
91
|
-
output: Output signature for the agent
|
|
92
|
-
tools: List of callable tools the agent can use
|
|
93
|
-
servers: List of MCP servers the agent can connect to
|
|
94
|
-
tool_whitelist: List of tool names that this agent is allowed to use.
|
|
95
|
-
If provided, the agent will only have access to tools
|
|
96
|
-
whose names are in this list. This applies to both native
|
|
97
|
-
Python tools and MCP tools. Recommended for security and
|
|
98
|
-
to prevent tool conflicts in multi-agent workflows.
|
|
99
|
-
use_cache: Whether to enable caching for evaluation
|
|
100
|
-
temperature: Sampling temperature for LLM generation
|
|
101
|
-
max_tokens: Maximum tokens for LLM response
|
|
102
|
-
max_tool_calls: Maximum number of tool calls per evaluation
|
|
103
|
-
max_retries: Maximum retries for failed LLM calls
|
|
104
|
-
stream: Whether to enable streaming responses
|
|
105
|
-
stream_callbacks: Optional callbacks invoked with each streaming chunk
|
|
106
|
-
stream_vertical_overflow: Rich Live overflow handling ('ellipsis', 'crop', 'crop_above', 'visible')
|
|
107
|
-
include_thought_process: Include reasoning in output
|
|
108
|
-
include_reasoning: Include detailed reasoning steps
|
|
109
|
-
include_status_output: Include status output in output
|
|
110
|
-
enable_rich_tables: Enable rich table formatting for output
|
|
111
|
-
output_theme: Theme for output formatting
|
|
112
|
-
no_output: Disable output printing
|
|
113
|
-
print_context: Include context in output
|
|
114
|
-
write_to_file: Save outputs to file
|
|
115
|
-
wait_for_input: Wait for user input after execution
|
|
116
|
-
alert_latency_threshold_ms: Threshold for latency alerts
|
|
117
|
-
enable_feedback: Whether to enable feedback learning component
|
|
118
|
-
feedback_config: Configuration for feedback component
|
|
119
|
-
enable_examples: Whether to enable example learning component
|
|
120
|
-
example_config: Configuration for example component
|
|
121
|
-
next_agent: Next agent in workflow chain
|
|
122
|
-
temporal_activity_config: Configuration for Temporal workflow execution
|
|
123
|
-
"""
|
|
124
|
-
# Import evaluation/output components lazily to avoid heavy imports at module import time
|
|
125
|
-
from flock.components.evaluation.declarative_evaluation_component import (
|
|
126
|
-
DeclarativeEvaluationComponent,
|
|
127
|
-
DeclarativeEvaluationConfig,
|
|
128
|
-
)
|
|
129
|
-
from flock.components.utility.output_utility_component import (
|
|
130
|
-
OutputUtilityComponent,
|
|
131
|
-
OutputUtilityConfig,
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
# Apply sensible defaults for special models if needed
|
|
135
|
-
if model and "gpt-oss" in model:
|
|
136
|
-
# Ensure defaults are generous for local OSS models
|
|
137
|
-
temperature = 1.0
|
|
138
|
-
max_tokens = 32_768
|
|
139
|
-
|
|
140
|
-
# Evaluation component
|
|
141
|
-
_eval_kwargs = dict(
|
|
142
|
-
model=model,
|
|
143
|
-
use_cache=use_cache,
|
|
144
|
-
temperature=temperature,
|
|
145
|
-
max_tool_calls=max_tool_calls,
|
|
146
|
-
max_retries=max_retries,
|
|
147
|
-
no_output=no_output,
|
|
148
|
-
stream=stream,
|
|
149
|
-
stream_callbacks=stream_callbacks,
|
|
150
|
-
stream_vertical_overflow=stream_vertical_overflow,
|
|
151
|
-
include_thought_process=include_thought_process,
|
|
152
|
-
include_reasoning=include_reasoning,
|
|
153
|
-
include_status_output=include_status_output,
|
|
154
|
-
)
|
|
155
|
-
if max_tokens is not None:
|
|
156
|
-
_eval_kwargs["max_tokens"] = max_tokens
|
|
157
|
-
eval_config = DeclarativeEvaluationConfig(**_eval_kwargs)
|
|
158
|
-
evaluator = DeclarativeEvaluationComponent(
|
|
159
|
-
name="default_evaluator", config=eval_config
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
# Output utility component
|
|
163
|
-
_output_kwargs = dict(
|
|
164
|
-
render_table=enable_rich_tables,
|
|
165
|
-
no_output=no_output,
|
|
166
|
-
print_context=print_context,
|
|
167
|
-
)
|
|
168
|
-
if output_theme is not None:
|
|
169
|
-
_output_kwargs["theme"] = output_theme
|
|
170
|
-
output_config = OutputUtilityConfig(**_output_kwargs)
|
|
171
|
-
output_component = OutputUtilityComponent(
|
|
172
|
-
name="output_formatter", config=output_config
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
# Metrics utility component
|
|
176
|
-
metrics_config = MetricsUtilityConfig(
|
|
177
|
-
latency_threshold_ms=alert_latency_threshold_ms
|
|
178
|
-
)
|
|
179
|
-
metrics_component = MetricsUtilityComponent(
|
|
180
|
-
name="metrics_tracker", config=metrics_config
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
# Feedback utility component (optional)
|
|
184
|
-
components = [evaluator, output_component, metrics_component]
|
|
185
|
-
if enable_feedback:
|
|
186
|
-
feedback_component = FeedbackUtilityComponent(
|
|
187
|
-
name="feedback",
|
|
188
|
-
config=feedback_config or FeedbackUtilityConfig()
|
|
189
|
-
)
|
|
190
|
-
components.append(feedback_component)
|
|
191
|
-
|
|
192
|
-
# Example utility component (optional)
|
|
193
|
-
if enable_examples:
|
|
194
|
-
example_component = ExampleUtilityComponent(
|
|
195
|
-
name="examples",
|
|
196
|
-
config=example_config or ExampleUtilityConfig()
|
|
197
|
-
)
|
|
198
|
-
components.append(example_component)
|
|
199
|
-
|
|
200
|
-
super().__init__(
|
|
201
|
-
name=name,
|
|
202
|
-
model=model,
|
|
203
|
-
description=description,
|
|
204
|
-
input=input,
|
|
205
|
-
output=output,
|
|
206
|
-
tools=tools,
|
|
207
|
-
servers=servers,
|
|
208
|
-
tool_whitelist=tool_whitelist,
|
|
209
|
-
components=components,
|
|
210
|
-
config=FlockAgentConfig(
|
|
211
|
-
write_to_file=write_to_file,
|
|
212
|
-
wait_for_input=wait_for_input,
|
|
213
|
-
),
|
|
214
|
-
next_agent=next_agent,
|
|
215
|
-
temporal_activity_config=temporal_activity_config,
|
|
216
|
-
)
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"""Component management functionality for FlockAgent."""
|
|
2
|
-
|
|
3
|
-
from typing import TYPE_CHECKING, Any
|
|
4
|
-
|
|
5
|
-
from flock.core.component.evaluation_component import EvaluationComponent
|
|
6
|
-
from flock.core.component.routing_component import RoutingComponent
|
|
7
|
-
from flock.core.component.utility_component import UtilityComponent
|
|
8
|
-
from flock.core.logging.logging import get_logger
|
|
9
|
-
|
|
10
|
-
if TYPE_CHECKING:
|
|
11
|
-
from flock.core.component.agent_component_base import AgentComponent
|
|
12
|
-
from flock.core.flock_agent import FlockAgent
|
|
13
|
-
|
|
14
|
-
logger = get_logger("agent.components")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class FlockAgentComponents:
|
|
18
|
-
"""Helper class for managing unified components on FlockAgent."""
|
|
19
|
-
|
|
20
|
-
def __init__(self, agent: "FlockAgent"):
|
|
21
|
-
self.agent = agent
|
|
22
|
-
|
|
23
|
-
def add_component(self, component: "AgentComponent") -> None:
|
|
24
|
-
"""Add a unified component to this agent."""
|
|
25
|
-
if not component.name:
|
|
26
|
-
logger.error("Component must have a name to be added.")
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
# Check if component with same name already exists
|
|
30
|
-
existing = self.get_component(component.name)
|
|
31
|
-
if existing:
|
|
32
|
-
logger.warning(f"Overwriting existing component: {component.name}")
|
|
33
|
-
self.agent.components.remove(existing)
|
|
34
|
-
|
|
35
|
-
self.agent.components.append(component)
|
|
36
|
-
logger.debug(f"Added component '{component.name}' to agent '{self.agent.name}'")
|
|
37
|
-
|
|
38
|
-
def remove_component(self, component_name: str) -> None:
|
|
39
|
-
"""Remove a component from this agent."""
|
|
40
|
-
component = self.get_component(component_name)
|
|
41
|
-
if component:
|
|
42
|
-
self.agent.components.remove(component)
|
|
43
|
-
logger.debug(f"Removed component '{component_name}' from agent '{self.agent.name}'")
|
|
44
|
-
else:
|
|
45
|
-
logger.warning(f"Component '{component_name}' not found on agent '{self.agent.name}'")
|
|
46
|
-
|
|
47
|
-
def get_component(self, component_name: str) -> "AgentComponent | None":
|
|
48
|
-
"""Get a component by name."""
|
|
49
|
-
for component in self.agent.components:
|
|
50
|
-
if component.name == component_name:
|
|
51
|
-
return component
|
|
52
|
-
return None
|
|
53
|
-
|
|
54
|
-
def get_enabled_components(self) -> list["AgentComponent"]:
|
|
55
|
-
"""Get a list of currently enabled components attached to this agent."""
|
|
56
|
-
return [c for c in self.agent.components if c.config.enabled]
|
|
57
|
-
|
|
58
|
-
def get_components_by_type(self, component_type: type) -> list["AgentComponent"]:
|
|
59
|
-
"""Get all components of a specific type."""
|
|
60
|
-
return [c for c in self.agent.components if isinstance(c, component_type)]
|
|
61
|
-
|
|
62
|
-
def get_evaluation_components(self) -> list[EvaluationComponent]:
|
|
63
|
-
"""Get all evaluation components."""
|
|
64
|
-
return self.get_components_by_type(EvaluationComponent)
|
|
65
|
-
|
|
66
|
-
def get_routing_components(self) -> list[RoutingComponent]:
|
|
67
|
-
"""Get all routing components."""
|
|
68
|
-
return self.get_components_by_type(RoutingComponent)
|
|
69
|
-
|
|
70
|
-
def get_utility_components(self) -> list[UtilityComponent]:
|
|
71
|
-
"""Get all utility components."""
|
|
72
|
-
return self.get_components_by_type(UtilityComponent)
|
|
73
|
-
|
|
74
|
-
def get_primary_evaluator(self) -> EvaluationComponent | None:
|
|
75
|
-
"""Get the primary evaluation component (first one found)."""
|
|
76
|
-
evaluators = self.get_evaluation_components()
|
|
77
|
-
return evaluators[0] if evaluators else None
|
|
78
|
-
|
|
79
|
-
def get_primary_router(self) -> RoutingComponent | None:
|
|
80
|
-
"""Get the primary routing component (first one found)."""
|
|
81
|
-
routers = self.get_routing_components()
|
|
82
|
-
return routers[0] if routers else None
|
|
83
|
-
|
|
84
|
-
# Legacy compatibility methods (delegate to new unified approach)
|
|
85
|
-
def add_module(self, module: Any) -> None:
|
|
86
|
-
"""DEPRECATED: Use add_component() instead."""
|
|
87
|
-
logger.warning("add_module is deprecated - use add_component() instead")
|
|
88
|
-
if hasattr(module, 'name'):
|
|
89
|
-
self.add_component(module)
|
|
90
|
-
|
|
91
|
-
def get_module(self, module_name: str) -> Any | None:
|
|
92
|
-
"""DEPRECATED: Use get_component() instead."""
|
|
93
|
-
logger.warning("get_module is deprecated - use get_component() instead")
|
|
94
|
-
return self.get_component(module_name)
|
|
95
|
-
|
|
96
|
-
def get_evaluator(self) -> Any | None:
|
|
97
|
-
"""DEPRECATED: Use get_primary_evaluator() instead."""
|
|
98
|
-
logger.warning("get_evaluator is deprecated - use get_primary_evaluator() instead")
|
|
99
|
-
return self.get_primary_evaluator()
|
|
100
|
-
|
|
101
|
-
def get_router(self) -> Any | None:
|
|
102
|
-
"""DEPRECATED: Use get_primary_router() instead."""
|
|
103
|
-
logger.warning("get_router is deprecated - use get_primary_router() instead")
|
|
104
|
-
return self.get_primary_router()
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# src/flock/core/agent/flock_agent_execution.py
|
|
2
|
-
"""Execution management functionality for FlockAgent."""
|
|
3
|
-
|
|
4
|
-
import asyncio
|
|
5
|
-
from typing import TYPE_CHECKING, Any
|
|
6
|
-
|
|
7
|
-
from opentelemetry import trace
|
|
8
|
-
from flock.core.logging.logging import get_logger
|
|
9
|
-
|
|
10
|
-
if TYPE_CHECKING:
|
|
11
|
-
from flock.core.flock_agent import FlockAgent
|
|
12
|
-
|
|
13
|
-
logger = get_logger("agent.execution")
|
|
14
|
-
tracer = trace.get_tracer(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class FlockAgentExecution:
|
|
18
|
-
"""Handles execution management for FlockAgent including run, run_async, and run_temporal."""
|
|
19
|
-
|
|
20
|
-
def __init__(self, agent: "FlockAgent"):
|
|
21
|
-
self.agent = agent
|
|
22
|
-
|
|
23
|
-
def run(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
24
|
-
"""Synchronous wrapper for run_async."""
|
|
25
|
-
try:
|
|
26
|
-
loop = asyncio.get_running_loop()
|
|
27
|
-
except (
|
|
28
|
-
RuntimeError
|
|
29
|
-
): # 'RuntimeError: There is no current event loop...'
|
|
30
|
-
loop = asyncio.new_event_loop()
|
|
31
|
-
asyncio.set_event_loop(loop)
|
|
32
|
-
return loop.run_until_complete(self.run_async(inputs))
|
|
33
|
-
|
|
34
|
-
async def run_async(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
35
|
-
"""Asynchronous execution logic with lifecycle hooks."""
|
|
36
|
-
with tracer.start_as_current_span("agent.run") as span:
|
|
37
|
-
span.set_attribute("agent.name", self.agent.name)
|
|
38
|
-
span.set_attribute("inputs", str(inputs))
|
|
39
|
-
try:
|
|
40
|
-
# Initialize lifecycle system if not already present
|
|
41
|
-
if not hasattr(self.agent, '_lifecycle'):
|
|
42
|
-
from flock.core.agent.flock_agent_lifecycle import FlockAgentLifecycle
|
|
43
|
-
self.agent._lifecycle = FlockAgentLifecycle(self.agent)
|
|
44
|
-
|
|
45
|
-
await self.agent._lifecycle.initialize(inputs)
|
|
46
|
-
result = await self.agent._lifecycle.evaluate(inputs)
|
|
47
|
-
await self.agent._lifecycle.terminate(inputs, result)
|
|
48
|
-
span.set_attribute("result", str(result))
|
|
49
|
-
logger.info("Agent run completed", agent=self.agent.name)
|
|
50
|
-
return result
|
|
51
|
-
except Exception as run_error:
|
|
52
|
-
logger.error(
|
|
53
|
-
"Error running agent", agent=self.agent.name, error=str(run_error)
|
|
54
|
-
)
|
|
55
|
-
if "evaluate" not in str(
|
|
56
|
-
run_error
|
|
57
|
-
): # Simple check, might need refinement
|
|
58
|
-
await self.agent._lifecycle.on_error(run_error, inputs)
|
|
59
|
-
logger.error(
|
|
60
|
-
f"Agent '{self.agent.name}' run failed: {run_error}",
|
|
61
|
-
exc_info=True,
|
|
62
|
-
)
|
|
63
|
-
span.record_exception(run_error)
|
|
64
|
-
raise # Re-raise after handling
|
|
65
|
-
|
|
66
|
-
async def run_temporal(self, inputs: dict[str, Any]) -> dict[str, Any]:
|
|
67
|
-
"""Execute agent using Temporal workflow orchestration."""
|
|
68
|
-
with tracer.start_as_current_span("agent.run_temporal") as span:
|
|
69
|
-
span.set_attribute("agent.name", self.agent.name)
|
|
70
|
-
span.set_attribute("inputs", str(inputs))
|
|
71
|
-
try:
|
|
72
|
-
from temporalio.client import Client
|
|
73
|
-
|
|
74
|
-
from flock.workflow.agent_activities import (
|
|
75
|
-
run_flock_agent_activity,
|
|
76
|
-
)
|
|
77
|
-
from flock.workflow.temporal_setup import run_activity
|
|
78
|
-
|
|
79
|
-
client = await Client.connect(
|
|
80
|
-
"localhost:7233", namespace="default"
|
|
81
|
-
)
|
|
82
|
-
agent_data = self.agent._serialization.to_dict()
|
|
83
|
-
inputs_data = inputs
|
|
84
|
-
|
|
85
|
-
result = await run_activity(
|
|
86
|
-
client,
|
|
87
|
-
self.agent.name,
|
|
88
|
-
run_flock_agent_activity,
|
|
89
|
-
{"agent_data": agent_data, "inputs": inputs_data},
|
|
90
|
-
)
|
|
91
|
-
span.set_attribute("result", str(result))
|
|
92
|
-
logger.info("Temporal run successful", agent=self.agent.name)
|
|
93
|
-
return result
|
|
94
|
-
except Exception as temporal_error:
|
|
95
|
-
logger.error(
|
|
96
|
-
"Error in Temporal workflow",
|
|
97
|
-
agent=self.agent.name,
|
|
98
|
-
error=str(temporal_error),
|
|
99
|
-
)
|
|
100
|
-
span.record_exception(temporal_error)
|
|
101
|
-
raise
|