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.py
DELETED
|
@@ -1,634 +0,0 @@
|
|
|
1
|
-
# src/flock/core/flock.py
|
|
2
|
-
"""High-level orchestrator for managing and executing agents within the Flock framework."""
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations # Ensure forward references work
|
|
5
|
-
|
|
6
|
-
import uuid
|
|
7
|
-
from collections.abc import Callable, Sequence
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from typing import (
|
|
10
|
-
TYPE_CHECKING,
|
|
11
|
-
Any,
|
|
12
|
-
Literal,
|
|
13
|
-
TypeVar,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
# Third-party imports
|
|
17
|
-
from box import Box
|
|
18
|
-
from temporalio import workflow
|
|
19
|
-
|
|
20
|
-
from flock.core.mcp.flock_mcp_server import FlockMCPServer
|
|
21
|
-
|
|
22
|
-
# Guard datasets import to avoid heavy side effects during tests (pyarrow extensions)
|
|
23
|
-
from typing import Any as _Any
|
|
24
|
-
try:
|
|
25
|
-
with workflow.unsafe.imports_passed_through():
|
|
26
|
-
from datasets import Dataset as _HF_Dataset # type: ignore
|
|
27
|
-
Dataset = _HF_Dataset # type: ignore
|
|
28
|
-
except Exception:
|
|
29
|
-
Dataset = _Any # type: ignore
|
|
30
|
-
|
|
31
|
-
from opentelemetry import trace
|
|
32
|
-
from pandas import DataFrame # type: ignore
|
|
33
|
-
from pydantic import BaseModel, Field
|
|
34
|
-
|
|
35
|
-
# Flock core components & utilities
|
|
36
|
-
from flock.config import DEFAULT_MODEL, TELEMETRY
|
|
37
|
-
from flock.core.api.custom_endpoint import (
|
|
38
|
-
FlockEndpoint, # Keep for type hinting custom_endpoints
|
|
39
|
-
)
|
|
40
|
-
from flock.core.context.context import FlockContext
|
|
41
|
-
from flock.core.logging.logging import get_logger
|
|
42
|
-
from flock.core.serialization.serializable import Serializable
|
|
43
|
-
from flock.workflow.temporal_config import TemporalWorkflowConfig
|
|
44
|
-
|
|
45
|
-
# Import FlockAgent using TYPE_CHECKING to avoid circular import at runtime
|
|
46
|
-
if TYPE_CHECKING:
|
|
47
|
-
# These imports are only for type hints
|
|
48
|
-
from flock.core.flock_agent import FlockAgent
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
# Registry
|
|
52
|
-
from flock.core.registry import get_registry
|
|
53
|
-
|
|
54
|
-
try:
|
|
55
|
-
import pandas as pd # type: ignore
|
|
56
|
-
|
|
57
|
-
PANDAS_AVAILABLE = True
|
|
58
|
-
except ImportError:
|
|
59
|
-
pd = None # type: ignore
|
|
60
|
-
PANDAS_AVAILABLE = False
|
|
61
|
-
|
|
62
|
-
logger = get_logger("flock.api")
|
|
63
|
-
TELEMETRY.setup_tracing() # Setup OpenTelemetry
|
|
64
|
-
tracer = trace.get_tracer(__name__)
|
|
65
|
-
registry = get_registry() # Get the registry instance
|
|
66
|
-
|
|
67
|
-
# Define TypeVar for generic class methods like from_dict
|
|
68
|
-
T = TypeVar("T", bound="Flock")
|
|
69
|
-
_R = TypeVar("_R")
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
class Flock(BaseModel, Serializable):
|
|
73
|
-
"""Orchestrator for managing and executing agent systems.
|
|
74
|
-
|
|
75
|
-
Manages agent definitions, context, and execution flow (local or Temporal).
|
|
76
|
-
Relies on FlockSerializer for serialization/deserialization logic.
|
|
77
|
-
Inherits from Pydantic BaseModel and Serializable.
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
name: str | None = Field(
|
|
81
|
-
default_factory=lambda: f"flock_{uuid.uuid4().hex[:8]}",
|
|
82
|
-
description="A unique identifier for this Flock instance.",
|
|
83
|
-
)
|
|
84
|
-
model: str | None = Field(
|
|
85
|
-
default=DEFAULT_MODEL,
|
|
86
|
-
description="Default model identifier for agents if not specified otherwise.",
|
|
87
|
-
)
|
|
88
|
-
description: str | None = Field(
|
|
89
|
-
default=None,
|
|
90
|
-
description="A brief description of the purpose of this Flock configuration.",
|
|
91
|
-
)
|
|
92
|
-
enable_temporal: bool = Field(
|
|
93
|
-
default=False,
|
|
94
|
-
description="If True, execute workflows via Temporal; otherwise, run locally.",
|
|
95
|
-
)
|
|
96
|
-
enable_opik: bool = Field(
|
|
97
|
-
default=False,
|
|
98
|
-
description="If True, enable Opik for cost tracking and model management.",
|
|
99
|
-
)
|
|
100
|
-
show_flock_banner: bool = Field(
|
|
101
|
-
default=True,
|
|
102
|
-
description="If True, show the Flock banner on console interactions.",
|
|
103
|
-
)
|
|
104
|
-
# --- Temporal Configuration (Optional) ---
|
|
105
|
-
temporal_config: TemporalWorkflowConfig | None = Field(
|
|
106
|
-
default=None,
|
|
107
|
-
description="Optional Temporal settings specific to the workflow execution for this Flock.",
|
|
108
|
-
)
|
|
109
|
-
# --- Temporal Dev/Test Setting ---
|
|
110
|
-
temporal_start_in_process_worker: bool = Field(
|
|
111
|
-
default=True,
|
|
112
|
-
description="If True (default) and enable_temporal=True, start a temporary in-process worker for development/testing convenience. Set to False when using dedicated workers.",
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
benchmark_agent_name: str | None = Field(
|
|
116
|
-
default=None,
|
|
117
|
-
description="The name of the agent to use for the benchmark.",
|
|
118
|
-
)
|
|
119
|
-
benchmark_eval_field: str | None = Field(
|
|
120
|
-
default=None,
|
|
121
|
-
description="The output field to use for the benchmark.",
|
|
122
|
-
)
|
|
123
|
-
benchmark_input_field: str | None = Field(
|
|
124
|
-
default=None,
|
|
125
|
-
description="The input field to use for the benchmark.",
|
|
126
|
-
)
|
|
127
|
-
# Internal agent storage - not part of the Pydantic model for direct serialization
|
|
128
|
-
# Marked with underscore to indicate it's managed internally and accessed via property
|
|
129
|
-
_agents: dict[str, FlockAgent]
|
|
130
|
-
_start_agent_name: str | None = None # For potential pre-configuration
|
|
131
|
-
_start_input: dict = {} # For potential pre-configuration
|
|
132
|
-
|
|
133
|
-
# Internal server storage - not part of the Pydantic model for direct serialization
|
|
134
|
-
_servers: dict[str, FlockMCPServer]
|
|
135
|
-
|
|
136
|
-
# Note: _mgr is now handled by the server manager helper
|
|
137
|
-
|
|
138
|
-
# Pydantic v2 model config
|
|
139
|
-
model_config = {
|
|
140
|
-
"arbitrary_types_allowed": True,
|
|
141
|
-
# Assuming registry type might not be serializable by default
|
|
142
|
-
"ignored_types": (type(registry),),
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
# --- COMPOSITION HELPERS (Lazy-Loaded) ---
|
|
146
|
-
# Following the successful FlockAgent pattern
|
|
147
|
-
|
|
148
|
-
@property
|
|
149
|
-
def _execution(self):
|
|
150
|
-
"""Get the execution management helper (lazy-loaded)."""
|
|
151
|
-
if not hasattr(self, '_execution_helper'):
|
|
152
|
-
from flock.core.orchestration.flock_execution import FlockExecution
|
|
153
|
-
self._execution_helper = FlockExecution(self)
|
|
154
|
-
return self._execution_helper
|
|
155
|
-
|
|
156
|
-
@property
|
|
157
|
-
def _server_manager(self):
|
|
158
|
-
"""Get the server management helper (lazy-loaded)."""
|
|
159
|
-
if not hasattr(self, '_server_manager_helper'):
|
|
160
|
-
from flock.core.orchestration.flock_server_manager import (
|
|
161
|
-
FlockServerManager,
|
|
162
|
-
)
|
|
163
|
-
self._server_manager_helper = FlockServerManager(self)
|
|
164
|
-
return self._server_manager_helper
|
|
165
|
-
|
|
166
|
-
@property
|
|
167
|
-
def _batch_processor(self):
|
|
168
|
-
"""Get the batch processing helper (lazy-loaded)."""
|
|
169
|
-
if not hasattr(self, '_batch_processor_helper'):
|
|
170
|
-
from flock.core.orchestration.flock_batch_processor import (
|
|
171
|
-
FlockBatchProcessor,
|
|
172
|
-
)
|
|
173
|
-
self._batch_processor_helper = FlockBatchProcessor(self)
|
|
174
|
-
return self._batch_processor_helper
|
|
175
|
-
|
|
176
|
-
@property
|
|
177
|
-
def _evaluator(self):
|
|
178
|
-
"""Get the evaluation helper (lazy-loaded)."""
|
|
179
|
-
if not hasattr(self, '_evaluator_helper'):
|
|
180
|
-
from flock.core.orchestration.flock_evaluator import FlockEvaluator
|
|
181
|
-
self._evaluator_helper = FlockEvaluator(self)
|
|
182
|
-
return self._evaluator_helper
|
|
183
|
-
|
|
184
|
-
@property
|
|
185
|
-
def _web_server(self):
|
|
186
|
-
"""Get the web server helper (lazy-loaded)."""
|
|
187
|
-
if not hasattr(self, '_web_server_helper'):
|
|
188
|
-
from flock.core.orchestration.flock_web_server import FlockWebServer
|
|
189
|
-
self._web_server_helper = FlockWebServer(self)
|
|
190
|
-
return self._web_server_helper
|
|
191
|
-
|
|
192
|
-
@property
|
|
193
|
-
def _initialization(self):
|
|
194
|
-
"""Get the initialization helper (lazy-loaded)."""
|
|
195
|
-
if not hasattr(self, '_initialization_helper'):
|
|
196
|
-
from flock.core.orchestration.flock_initialization import (
|
|
197
|
-
FlockInitialization,
|
|
198
|
-
)
|
|
199
|
-
self._initialization_helper = FlockInitialization(self)
|
|
200
|
-
return self._initialization_helper
|
|
201
|
-
|
|
202
|
-
@property
|
|
203
|
-
def _mgr(self):
|
|
204
|
-
"""Get the internal server manager for compatibility."""
|
|
205
|
-
return self._server_manager._internal_mgr
|
|
206
|
-
|
|
207
|
-
def __init__(
|
|
208
|
-
self,
|
|
209
|
-
name: str | None = None,
|
|
210
|
-
model: str | None = DEFAULT_MODEL,
|
|
211
|
-
description: str | None = None,
|
|
212
|
-
show_flock_banner: bool = True,
|
|
213
|
-
enable_temporal: bool = False,
|
|
214
|
-
enable_opik: bool = False,
|
|
215
|
-
agents: list[FlockAgent] | None = None,
|
|
216
|
-
servers: list[FlockMCPServer] | None = None,
|
|
217
|
-
temporal_config: TemporalWorkflowConfig | None = None,
|
|
218
|
-
temporal_start_in_process_worker: bool = True,
|
|
219
|
-
**kwargs,
|
|
220
|
-
):
|
|
221
|
-
"""Initialize the Flock orchestrator."""
|
|
222
|
-
# Use provided name or generate default BEFORE super init if needed elsewhere
|
|
223
|
-
effective_name = name or f"flock_{uuid.uuid4().hex[:8]}"
|
|
224
|
-
|
|
225
|
-
# Initialize Pydantic fields
|
|
226
|
-
super().__init__(
|
|
227
|
-
name=effective_name,
|
|
228
|
-
model=model,
|
|
229
|
-
description=description,
|
|
230
|
-
enable_temporal=enable_temporal,
|
|
231
|
-
enable_opik=enable_opik,
|
|
232
|
-
show_flock_banner=show_flock_banner,
|
|
233
|
-
temporal_config=temporal_config,
|
|
234
|
-
temporal_start_in_process_worker=temporal_start_in_process_worker,
|
|
235
|
-
**kwargs,
|
|
236
|
-
)
|
|
237
|
-
|
|
238
|
-
# Initialize runtime attributes AFTER super().__init__()
|
|
239
|
-
self._agents = {}
|
|
240
|
-
self._servers = {}
|
|
241
|
-
self._start_agent_name = None
|
|
242
|
-
self._start_input = {}
|
|
243
|
-
# Note: _mgr will be handled by the server manager helper
|
|
244
|
-
|
|
245
|
-
# Delegate complex initialization to the initialization helper
|
|
246
|
-
self._initialization.setup(agents=agents, servers=servers)
|
|
247
|
-
|
|
248
|
-
def prepare_benchmark(
|
|
249
|
-
self,
|
|
250
|
-
agent: FlockAgent | str | None = None,
|
|
251
|
-
input_field: str | None = None,
|
|
252
|
-
eval_field: str | None = None,
|
|
253
|
-
):
|
|
254
|
-
"""Prepare a benchmark for the Flock instance."""
|
|
255
|
-
from flock.core.flock_agent import FlockAgent as ConcreteFlockAgent
|
|
256
|
-
|
|
257
|
-
logger.info(
|
|
258
|
-
f"Preparing benchmark for Flock instance '{self.name}' with agent '{agent}'."
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
name = agent.name if isinstance(agent, ConcreteFlockAgent) else agent
|
|
262
|
-
|
|
263
|
-
if self._agents.get(name) is None:
|
|
264
|
-
raise ValueError(
|
|
265
|
-
f"Agent '{name}' not found in Flock instance '{self.name}'."
|
|
266
|
-
)
|
|
267
|
-
|
|
268
|
-
self.benchmark_agent_name = name
|
|
269
|
-
self.benchmark_eval_field = eval_field
|
|
270
|
-
self.benchmark_input_field = input_field
|
|
271
|
-
|
|
272
|
-
def inspect(self):
|
|
273
|
-
"""Inspect the Flock instance."""
|
|
274
|
-
logger.info(
|
|
275
|
-
f"Inspecting Flock instance '{self.name}' with start agent '{self.benchmark_agent_name}' and input '{input}'."
|
|
276
|
-
)
|
|
277
|
-
|
|
278
|
-
async def run(input: dict[str, Any]) -> dict[str, Any]:
|
|
279
|
-
"""Inspect the Flock instance."""
|
|
280
|
-
logger.info(
|
|
281
|
-
f"Inspecting Flock instance '{self.name}' with start agent '{self.benchmark_agent_name}' and input '{input}'."
|
|
282
|
-
)
|
|
283
|
-
msg_content = input.get("messages")[0].get("content")
|
|
284
|
-
|
|
285
|
-
agent_input = {self.benchmark_input_field: msg_content}
|
|
286
|
-
|
|
287
|
-
result = await self.run_async(
|
|
288
|
-
agent=self.benchmark_agent_name,
|
|
289
|
-
input=agent_input,
|
|
290
|
-
box_result=False,
|
|
291
|
-
)
|
|
292
|
-
|
|
293
|
-
agent_output = result.get(
|
|
294
|
-
self.benchmark_eval_field, "No answer found"
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
return {
|
|
298
|
-
"output": agent_output,
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
return run
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
def add_server(self, server: FlockMCPServer) -> FlockMCPServer:
|
|
306
|
-
"""Adds a server instance to this Flock configuration and registry."""
|
|
307
|
-
return self._server_manager.add_server(server)
|
|
308
|
-
|
|
309
|
-
def add_agent(self, agent: FlockAgent) -> FlockAgent:
|
|
310
|
-
"""Adds an agent instance to this Flock configuration and registry.
|
|
311
|
-
|
|
312
|
-
This also registers all servers attached to the agent, if they have not been registered
|
|
313
|
-
beforehand.
|
|
314
|
-
"""
|
|
315
|
-
from flock.core.flock_agent import FlockAgent as ConcreteFlockAgent
|
|
316
|
-
|
|
317
|
-
if not isinstance(agent, ConcreteFlockAgent):
|
|
318
|
-
raise TypeError("Provided object is not a FlockAgent instance.")
|
|
319
|
-
if not agent.name:
|
|
320
|
-
raise ValueError("Agent must have a name.")
|
|
321
|
-
|
|
322
|
-
if agent.name in self._agents:
|
|
323
|
-
# Allow re-adding the same instance, but raise error for different instance with same name
|
|
324
|
-
if self._agents[agent.name] is not agent:
|
|
325
|
-
raise ValueError(
|
|
326
|
-
f"Agent with name '{agent.name}' already exists with a different instance."
|
|
327
|
-
)
|
|
328
|
-
else:
|
|
329
|
-
logger.debug(
|
|
330
|
-
f"Agent '{agent.name}' is already added. Skipping."
|
|
331
|
-
)
|
|
332
|
-
return agent # Return existing agent
|
|
333
|
-
|
|
334
|
-
self._agents[agent.name] = agent
|
|
335
|
-
registry.register_agent(agent) # Register globally
|
|
336
|
-
|
|
337
|
-
# Set default model if agent doesn't have one
|
|
338
|
-
if agent.model is None:
|
|
339
|
-
if self.model:
|
|
340
|
-
agent.set_model(self.model)
|
|
341
|
-
logger.debug(
|
|
342
|
-
f"Agent '{agent.name}' using Flock default model: {self.model}"
|
|
343
|
-
)
|
|
344
|
-
else:
|
|
345
|
-
logger.warning(
|
|
346
|
-
f"Agent '{agent.name}' has no model and Flock default model is not set."
|
|
347
|
-
)
|
|
348
|
-
|
|
349
|
-
logger.info(f"Agent '{agent.name}' added to Flock '{self.name}'.")
|
|
350
|
-
return agent
|
|
351
|
-
|
|
352
|
-
@property
|
|
353
|
-
def agents(self) -> dict[str, FlockAgent]:
|
|
354
|
-
"""Returns the dictionary of agents managed by this Flock instance."""
|
|
355
|
-
return self._agents
|
|
356
|
-
|
|
357
|
-
@property
|
|
358
|
-
def servers(self) -> dict[str, FlockMCPServer]:
|
|
359
|
-
"""Returns the dictionary of servers managed by this Flock instance."""
|
|
360
|
-
return self._server_manager.servers
|
|
361
|
-
|
|
362
|
-
def run(
|
|
363
|
-
self,
|
|
364
|
-
agent: FlockAgent | str | None = None,
|
|
365
|
-
input: dict | None = None,
|
|
366
|
-
context: FlockContext | None = None,
|
|
367
|
-
run_id: str = "",
|
|
368
|
-
box_result: bool = True,
|
|
369
|
-
agents: list[FlockAgent] | None = None,
|
|
370
|
-
servers: list[FlockMCPServer] | None = None,
|
|
371
|
-
memo: dict[str, Any] | None = None,
|
|
372
|
-
) -> Box | dict:
|
|
373
|
-
"""Synchronous execution wrapper."""
|
|
374
|
-
return self._execution.run(
|
|
375
|
-
agent=agent,
|
|
376
|
-
input=input,
|
|
377
|
-
context=context,
|
|
378
|
-
run_id=run_id,
|
|
379
|
-
box_result=box_result,
|
|
380
|
-
agents=agents,
|
|
381
|
-
servers=servers,
|
|
382
|
-
memo=memo,
|
|
383
|
-
)
|
|
384
|
-
|
|
385
|
-
async def run_async(
|
|
386
|
-
self,
|
|
387
|
-
agent: FlockAgent | str | None = None,
|
|
388
|
-
input: dict | None = None,
|
|
389
|
-
context: FlockContext | None = None,
|
|
390
|
-
run_id: str = "",
|
|
391
|
-
box_result: bool = True,
|
|
392
|
-
agents: list[FlockAgent] | None = None,
|
|
393
|
-
servers: list[FlockMCPServer] | None = None,
|
|
394
|
-
memo: dict[str, Any] | None = None,
|
|
395
|
-
) -> Box | dict:
|
|
396
|
-
"""Entry point for running an agent system asynchronously."""
|
|
397
|
-
return await self._execution.run_async(
|
|
398
|
-
agent=agent,
|
|
399
|
-
input=input,
|
|
400
|
-
context=context,
|
|
401
|
-
run_id=run_id,
|
|
402
|
-
box_result=box_result,
|
|
403
|
-
agents=agents,
|
|
404
|
-
servers=servers,
|
|
405
|
-
memo=memo,
|
|
406
|
-
)
|
|
407
|
-
|
|
408
|
-
# --- Batch Processing (Delegation) ---
|
|
409
|
-
async def run_batch_async(
|
|
410
|
-
self,
|
|
411
|
-
start_agent: FlockAgent | str,
|
|
412
|
-
batch_inputs: list[dict[str, Any]] | DataFrame | str,
|
|
413
|
-
input_mapping: dict[str, str] | None = None,
|
|
414
|
-
static_inputs: dict[str, Any] | None = None,
|
|
415
|
-
parallel: bool = True,
|
|
416
|
-
max_workers: int = 5,
|
|
417
|
-
use_temporal: bool | None = None,
|
|
418
|
-
box_results: bool = True,
|
|
419
|
-
return_errors: bool = False,
|
|
420
|
-
silent_mode: bool = False,
|
|
421
|
-
write_to_csv: str | None = None,
|
|
422
|
-
hide_columns: list[str] | None = None,
|
|
423
|
-
delimiter: str = ",",
|
|
424
|
-
) -> list[Box | dict | None | Exception]:
|
|
425
|
-
"""Runs the specified agent/workflow for each item in a batch asynchronously (delegated)."""
|
|
426
|
-
return await self._batch_processor.run_batch_async(
|
|
427
|
-
start_agent=start_agent,
|
|
428
|
-
batch_inputs=batch_inputs,
|
|
429
|
-
input_mapping=input_mapping,
|
|
430
|
-
static_inputs=static_inputs,
|
|
431
|
-
parallel=parallel,
|
|
432
|
-
max_workers=max_workers,
|
|
433
|
-
use_temporal=use_temporal,
|
|
434
|
-
box_results=box_results,
|
|
435
|
-
return_errors=return_errors,
|
|
436
|
-
silent_mode=silent_mode,
|
|
437
|
-
write_to_csv=write_to_csv,
|
|
438
|
-
hide_columns=hide_columns,
|
|
439
|
-
delimiter=delimiter,
|
|
440
|
-
)
|
|
441
|
-
|
|
442
|
-
def run_batch(
|
|
443
|
-
self,
|
|
444
|
-
start_agent: FlockAgent | str,
|
|
445
|
-
batch_inputs: list[dict[str, Any]] | DataFrame | str,
|
|
446
|
-
input_mapping: dict[str, str] | None = None,
|
|
447
|
-
static_inputs: dict[str, Any] | None = None,
|
|
448
|
-
parallel: bool = True,
|
|
449
|
-
max_workers: int = 5,
|
|
450
|
-
use_temporal: bool | None = None,
|
|
451
|
-
box_results: bool = True,
|
|
452
|
-
return_errors: bool = False,
|
|
453
|
-
silent_mode: bool = False,
|
|
454
|
-
write_to_csv: str | None = None,
|
|
455
|
-
hide_columns: list[str] | None = None,
|
|
456
|
-
delimiter: str = ",",
|
|
457
|
-
) -> list[Box | dict | None | Exception]:
|
|
458
|
-
"""Synchronous wrapper for batch processing."""
|
|
459
|
-
return self._batch_processor.run_batch(
|
|
460
|
-
start_agent=start_agent,
|
|
461
|
-
batch_inputs=batch_inputs,
|
|
462
|
-
input_mapping=input_mapping,
|
|
463
|
-
static_inputs=static_inputs,
|
|
464
|
-
parallel=parallel,
|
|
465
|
-
max_workers=max_workers,
|
|
466
|
-
use_temporal=use_temporal,
|
|
467
|
-
box_results=box_results,
|
|
468
|
-
return_errors=return_errors,
|
|
469
|
-
silent_mode=silent_mode,
|
|
470
|
-
write_to_csv=write_to_csv,
|
|
471
|
-
hide_columns=hide_columns,
|
|
472
|
-
delimiter=delimiter,
|
|
473
|
-
)
|
|
474
|
-
|
|
475
|
-
# --- Evaluation (Delegation) ---
|
|
476
|
-
async def evaluate_async(
|
|
477
|
-
self,
|
|
478
|
-
dataset: str | Path | list[dict[str, Any]] | DataFrame | Dataset, # type: ignore
|
|
479
|
-
start_agent: FlockAgent | str,
|
|
480
|
-
input_mapping: dict[str, str],
|
|
481
|
-
answer_mapping: dict[str, str],
|
|
482
|
-
metrics: list[
|
|
483
|
-
str
|
|
484
|
-
| Callable[[Any, Any], bool | float | dict[str, Any]]
|
|
485
|
-
| FlockAgent # Type hint only
|
|
486
|
-
],
|
|
487
|
-
metric_configs: dict[str, dict[str, Any]] | None = None,
|
|
488
|
-
static_inputs: dict[str, Any] | None = None,
|
|
489
|
-
parallel: bool = True,
|
|
490
|
-
max_workers: int = 5,
|
|
491
|
-
use_temporal: bool | None = None,
|
|
492
|
-
error_handling: Literal["raise", "skip", "log"] = "log",
|
|
493
|
-
output_file: str | Path | None = None,
|
|
494
|
-
return_dataframe: bool = True,
|
|
495
|
-
silent_mode: bool = False,
|
|
496
|
-
metadata_columns: list[str] | None = None,
|
|
497
|
-
) -> DataFrame | list[dict[str, Any]]: # type: ignore
|
|
498
|
-
"""Evaluates the Flock's performance against a dataset (delegated)."""
|
|
499
|
-
return await self._evaluator.evaluate_async(
|
|
500
|
-
dataset=dataset,
|
|
501
|
-
start_agent=start_agent,
|
|
502
|
-
input_mapping=input_mapping,
|
|
503
|
-
answer_mapping=answer_mapping,
|
|
504
|
-
metrics=metrics,
|
|
505
|
-
metric_configs=metric_configs,
|
|
506
|
-
static_inputs=static_inputs,
|
|
507
|
-
parallel=parallel,
|
|
508
|
-
max_workers=max_workers,
|
|
509
|
-
use_temporal=use_temporal,
|
|
510
|
-
error_handling=error_handling,
|
|
511
|
-
output_file=output_file,
|
|
512
|
-
return_dataframe=return_dataframe,
|
|
513
|
-
silent_mode=silent_mode,
|
|
514
|
-
metadata_columns=metadata_columns,
|
|
515
|
-
)
|
|
516
|
-
|
|
517
|
-
def evaluate(
|
|
518
|
-
self,
|
|
519
|
-
dataset: str | Path | list[dict[str, Any]] | DataFrame | Dataset, # type: ignore
|
|
520
|
-
start_agent: FlockAgent | str,
|
|
521
|
-
input_mapping: dict[str, str],
|
|
522
|
-
answer_mapping: dict[str, str],
|
|
523
|
-
metrics: list[
|
|
524
|
-
str
|
|
525
|
-
| Callable[[Any, Any], bool | float | dict[str, Any]]
|
|
526
|
-
| FlockAgent # Type hint only
|
|
527
|
-
],
|
|
528
|
-
metric_configs: dict[str, dict[str, Any]] | None = None,
|
|
529
|
-
static_inputs: dict[str, Any] | None = None,
|
|
530
|
-
parallel: bool = True,
|
|
531
|
-
max_workers: int = 5,
|
|
532
|
-
use_temporal: bool | None = None,
|
|
533
|
-
error_handling: Literal["raise", "skip", "log"] = "log",
|
|
534
|
-
output_file: str | Path | None = None,
|
|
535
|
-
return_dataframe: bool = True,
|
|
536
|
-
silent_mode: bool = False,
|
|
537
|
-
metadata_columns: list[str] | None = None,
|
|
538
|
-
) -> DataFrame | list[dict[str, Any]]: # type: ignore
|
|
539
|
-
"""Synchronous wrapper for evaluation."""
|
|
540
|
-
return self._evaluator.evaluate(
|
|
541
|
-
dataset=dataset,
|
|
542
|
-
start_agent=start_agent,
|
|
543
|
-
input_mapping=input_mapping,
|
|
544
|
-
answer_mapping=answer_mapping,
|
|
545
|
-
metrics=metrics,
|
|
546
|
-
metric_configs=metric_configs,
|
|
547
|
-
static_inputs=static_inputs,
|
|
548
|
-
parallel=parallel,
|
|
549
|
-
max_workers=max_workers,
|
|
550
|
-
use_temporal=use_temporal,
|
|
551
|
-
error_handling=error_handling,
|
|
552
|
-
output_file=output_file,
|
|
553
|
-
return_dataframe=return_dataframe,
|
|
554
|
-
silent_mode=silent_mode,
|
|
555
|
-
metadata_columns=metadata_columns,
|
|
556
|
-
)
|
|
557
|
-
|
|
558
|
-
# --- Server & CLI Starters (Delegation) ---
|
|
559
|
-
|
|
560
|
-
def serve(
|
|
561
|
-
self,
|
|
562
|
-
host: str = "127.0.0.1",
|
|
563
|
-
port: int = 8344,
|
|
564
|
-
server_name: str = "Flock Server",
|
|
565
|
-
ui: bool = True,
|
|
566
|
-
chat: bool = False,
|
|
567
|
-
chat_agent: str | None = None, # Reserved for future real agent chat
|
|
568
|
-
chat_message_key: str = "message",
|
|
569
|
-
chat_history_key: str = "history",
|
|
570
|
-
chat_response_key: str = "response",
|
|
571
|
-
ui_theme: str | None = None,
|
|
572
|
-
custom_endpoints: Sequence[FlockEndpoint]
|
|
573
|
-
| dict[tuple[str, list[str] | None], Callable[..., Any]]
|
|
574
|
-
| None = None,
|
|
575
|
-
) -> None:
|
|
576
|
-
"""Launch an HTTP server that exposes the core REST API and, optionally, the browser-based UI."""
|
|
577
|
-
return self._web_server.serve(
|
|
578
|
-
host=host,
|
|
579
|
-
port=port,
|
|
580
|
-
server_name=server_name,
|
|
581
|
-
ui=ui,
|
|
582
|
-
chat=chat,
|
|
583
|
-
chat_agent=chat_agent,
|
|
584
|
-
chat_message_key=chat_message_key,
|
|
585
|
-
chat_history_key=chat_history_key,
|
|
586
|
-
chat_response_key=chat_response_key,
|
|
587
|
-
ui_theme=ui_theme,
|
|
588
|
-
custom_endpoints=custom_endpoints,
|
|
589
|
-
)
|
|
590
|
-
|
|
591
|
-
def start_cli(
|
|
592
|
-
self,
|
|
593
|
-
start_agent: FlockAgent
|
|
594
|
-
| str
|
|
595
|
-
| None = None, # Added start_agent to match method signature in file_26
|
|
596
|
-
server_name: str = "Flock CLI",
|
|
597
|
-
show_results: bool = False,
|
|
598
|
-
edit_mode: bool = False,
|
|
599
|
-
) -> None:
|
|
600
|
-
"""Starts an interactive CLI for this Flock instance."""
|
|
601
|
-
return self._web_server.start_cli(
|
|
602
|
-
start_agent=start_agent,
|
|
603
|
-
server_name=server_name,
|
|
604
|
-
show_results=show_results,
|
|
605
|
-
edit_mode=edit_mode,
|
|
606
|
-
)
|
|
607
|
-
|
|
608
|
-
# --- Serialization Delegation Methods ---
|
|
609
|
-
def to_dict(self, path_type: str = "relative") -> dict[str, Any]:
|
|
610
|
-
"""Serialize Flock instance to dictionary using FlockSerializer."""
|
|
611
|
-
from flock.core.serialization.flock_serializer import FlockSerializer
|
|
612
|
-
|
|
613
|
-
return FlockSerializer.serialize(self, path_type=path_type)
|
|
614
|
-
|
|
615
|
-
@classmethod
|
|
616
|
-
def from_dict(cls: type[T], data: dict[str, Any]) -> T:
|
|
617
|
-
"""Deserialize Flock instance from dictionary using FlockSerializer."""
|
|
618
|
-
from flock.core.serialization.flock_serializer import FlockSerializer
|
|
619
|
-
|
|
620
|
-
return FlockSerializer.deserialize(cls, data)
|
|
621
|
-
|
|
622
|
-
# --- Static Method Loader (Delegates to loader module) ---
|
|
623
|
-
@staticmethod
|
|
624
|
-
def load_from_file(file_path: str) -> Flock: # Ensure return type is Flock
|
|
625
|
-
"""Load a Flock instance from various file formats (delegates to loader)."""
|
|
626
|
-
from flock.core.util.loader import load_flock_from_file
|
|
627
|
-
|
|
628
|
-
loaded_flock = load_flock_from_file(file_path)
|
|
629
|
-
# Ensure the loaded object is indeed a Flock instance
|
|
630
|
-
if not isinstance(loaded_flock, Flock):
|
|
631
|
-
raise TypeError(
|
|
632
|
-
f"Loaded object from {file_path} is not a Flock instance, but {type(loaded_flock)}"
|
|
633
|
-
)
|
|
634
|
-
return loaded_flock
|