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/cli/execute_flock.py
DELETED
|
@@ -1,620 +0,0 @@
|
|
|
1
|
-
"""Execute a Flock instance with a selected agent.
|
|
2
|
-
|
|
3
|
-
This module provides functionality to execute a Flock instance with
|
|
4
|
-
a selected agent and input configuration, including batch processing.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import json
|
|
8
|
-
import os
|
|
9
|
-
|
|
10
|
-
import questionary
|
|
11
|
-
from rich.console import Console
|
|
12
|
-
from rich.panel import Panel
|
|
13
|
-
|
|
14
|
-
from flock.core.flock import Flock
|
|
15
|
-
from flock.core.logging.logging import configure_logging
|
|
16
|
-
from flock.core.util.cli_helper import init_console
|
|
17
|
-
|
|
18
|
-
# Create console instance
|
|
19
|
-
console = Console()
|
|
20
|
-
|
|
21
|
-
# Try importing pandas for DataFrame support
|
|
22
|
-
try:
|
|
23
|
-
import pandas as pd
|
|
24
|
-
|
|
25
|
-
PANDAS_AVAILABLE = True
|
|
26
|
-
except ImportError:
|
|
27
|
-
pd = None
|
|
28
|
-
PANDAS_AVAILABLE = False
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def execute_flock(flock: Flock):
|
|
32
|
-
"""Execute a Flock instance.
|
|
33
|
-
|
|
34
|
-
Args:
|
|
35
|
-
flock: The Flock instance to execute
|
|
36
|
-
"""
|
|
37
|
-
if not flock:
|
|
38
|
-
console.print("[bold red]Error: No Flock instance provided.[/]")
|
|
39
|
-
return
|
|
40
|
-
|
|
41
|
-
agent_names = list(flock._agents.keys())
|
|
42
|
-
|
|
43
|
-
if not agent_names:
|
|
44
|
-
console.print("[yellow]No agents in this Flock to execute.[/]")
|
|
45
|
-
return
|
|
46
|
-
|
|
47
|
-
init_console()
|
|
48
|
-
console.print(Panel("[bold green]Execute Flock[/]"), justify="center")
|
|
49
|
-
|
|
50
|
-
# Step 1: Select start agent
|
|
51
|
-
console.print("\n[bold]Step 1: Select Start Agent[/]")
|
|
52
|
-
|
|
53
|
-
start_agent_name = questionary.select(
|
|
54
|
-
"Select an agent to start with:",
|
|
55
|
-
choices=agent_names,
|
|
56
|
-
).ask()
|
|
57
|
-
|
|
58
|
-
if not start_agent_name:
|
|
59
|
-
return
|
|
60
|
-
|
|
61
|
-
start_agent = flock._agents[start_agent_name]
|
|
62
|
-
|
|
63
|
-
# Step 2: Configure input
|
|
64
|
-
console.print("\n[bold]Step 2: Configure Input[/]")
|
|
65
|
-
|
|
66
|
-
# Parse input schema
|
|
67
|
-
input_fields = _parse_input_schema(start_agent.input)
|
|
68
|
-
|
|
69
|
-
# If we couldn't parse any fields, ask for generic input
|
|
70
|
-
if not input_fields:
|
|
71
|
-
raw_input = questionary.text(
|
|
72
|
-
"Enter input (JSON format):",
|
|
73
|
-
default="{}",
|
|
74
|
-
).ask()
|
|
75
|
-
|
|
76
|
-
try:
|
|
77
|
-
input_data = json.loads(raw_input)
|
|
78
|
-
except json.JSONDecodeError:
|
|
79
|
-
console.print("[bold red]Error: Invalid JSON input.[/]")
|
|
80
|
-
return
|
|
81
|
-
else:
|
|
82
|
-
# Otherwise, ask for each field
|
|
83
|
-
input_data = {}
|
|
84
|
-
|
|
85
|
-
for field, info in input_fields.items():
|
|
86
|
-
field_type = info.get("type", "str")
|
|
87
|
-
description = info.get("description", "")
|
|
88
|
-
prompt = f"Enter value for '{field}'"
|
|
89
|
-
|
|
90
|
-
if description:
|
|
91
|
-
prompt += f" ({description})"
|
|
92
|
-
|
|
93
|
-
prompt += ":"
|
|
94
|
-
|
|
95
|
-
value = questionary.text(prompt).ask()
|
|
96
|
-
|
|
97
|
-
# Convert value to appropriate type
|
|
98
|
-
if field_type == "int":
|
|
99
|
-
try:
|
|
100
|
-
value = int(value)
|
|
101
|
-
except ValueError:
|
|
102
|
-
console.print(
|
|
103
|
-
f"[yellow]Warning: Could not convert value to int, using as string.[/]"
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
input_data[field] = value
|
|
107
|
-
|
|
108
|
-
# Step 3: Run Options
|
|
109
|
-
console.print("\n[bold]Step 3: Run Options[/]")
|
|
110
|
-
|
|
111
|
-
# Logging options
|
|
112
|
-
enable_logging = questionary.confirm(
|
|
113
|
-
"Enable logging?",
|
|
114
|
-
default=False,
|
|
115
|
-
).ask()
|
|
116
|
-
if enable_logging:
|
|
117
|
-
log_level = questionary.select(
|
|
118
|
-
"Minimum log level:",
|
|
119
|
-
choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
|
120
|
-
default="ERROR",
|
|
121
|
-
).ask()
|
|
122
|
-
configure_logging(flock_level=log_level, external_level=log_level)
|
|
123
|
-
|
|
124
|
-
# Preview input
|
|
125
|
-
console.print("\n[bold]Input Preview:[/]")
|
|
126
|
-
console.print(json.dumps(input_data, indent=2))
|
|
127
|
-
|
|
128
|
-
# Confirm execution
|
|
129
|
-
confirm = questionary.confirm(
|
|
130
|
-
"Execute Flock with this configuration?",
|
|
131
|
-
default=True,
|
|
132
|
-
).ask()
|
|
133
|
-
|
|
134
|
-
if not confirm:
|
|
135
|
-
return
|
|
136
|
-
|
|
137
|
-
# Execute the Flock
|
|
138
|
-
console.print("\n[bold]Executing Flock...[/]")
|
|
139
|
-
|
|
140
|
-
try:
|
|
141
|
-
# Logging was configured earlier if enabled
|
|
142
|
-
|
|
143
|
-
# Run the Flock
|
|
144
|
-
result = flock.run(
|
|
145
|
-
agent=start_agent_name,
|
|
146
|
-
input=input_data,
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
# Display result
|
|
150
|
-
console.print("\n[bold green]Execution Complete![/]")
|
|
151
|
-
|
|
152
|
-
if result and enable_logging:
|
|
153
|
-
console.print("\n[bold]Result:[/]")
|
|
154
|
-
if isinstance(result, dict):
|
|
155
|
-
# Display as formatted JSON
|
|
156
|
-
console.print(json.dumps(result, indent=2))
|
|
157
|
-
else:
|
|
158
|
-
# Display as plain text
|
|
159
|
-
console.print(str(result))
|
|
160
|
-
|
|
161
|
-
except Exception as e:
|
|
162
|
-
console.print(f"\n[bold red]Error during execution:[/] {e!s}")
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
def _parse_input_schema(input_schema: str) -> dict[str, dict[str, str]]:
|
|
166
|
-
"""Parse the input schema string into a field dictionary.
|
|
167
|
-
|
|
168
|
-
Args:
|
|
169
|
-
input_schema: The input schema string (e.g., "query: str | The search query")
|
|
170
|
-
|
|
171
|
-
Returns:
|
|
172
|
-
A dictionary mapping field names to field info (type, description)
|
|
173
|
-
"""
|
|
174
|
-
if not input_schema:
|
|
175
|
-
return {}
|
|
176
|
-
|
|
177
|
-
fields = {}
|
|
178
|
-
|
|
179
|
-
try:
|
|
180
|
-
# Split by comma for multiple fields
|
|
181
|
-
for field_def in input_schema.split(","):
|
|
182
|
-
field_def = field_def.strip()
|
|
183
|
-
|
|
184
|
-
# Check for type hint with colon
|
|
185
|
-
if ":" in field_def:
|
|
186
|
-
field_name, rest = field_def.split(":", 1)
|
|
187
|
-
field_name = field_name.strip()
|
|
188
|
-
rest = rest.strip()
|
|
189
|
-
|
|
190
|
-
# Check for description with pipe
|
|
191
|
-
if "|" in rest:
|
|
192
|
-
field_type, description = rest.split("|", 1)
|
|
193
|
-
fields[field_name] = {
|
|
194
|
-
"type": field_type.strip(),
|
|
195
|
-
"description": description.strip(),
|
|
196
|
-
}
|
|
197
|
-
else:
|
|
198
|
-
fields[field_name] = {"type": rest.strip()}
|
|
199
|
-
else:
|
|
200
|
-
# Just a field name without type hint
|
|
201
|
-
if "|" in field_def:
|
|
202
|
-
field_name, description = field_def.split("|", 1)
|
|
203
|
-
fields[field_name.strip()] = {
|
|
204
|
-
"description": description.strip()
|
|
205
|
-
}
|
|
206
|
-
else:
|
|
207
|
-
fields[field_def.strip()] = {}
|
|
208
|
-
|
|
209
|
-
except Exception as e:
|
|
210
|
-
console.print(
|
|
211
|
-
f"[yellow]Warning: Could not parse input schema: {e!s}[/]"
|
|
212
|
-
)
|
|
213
|
-
return {}
|
|
214
|
-
|
|
215
|
-
return fields
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
def execute_flock_batch(flock: Flock):
|
|
219
|
-
"""Execute a Flock instance in batch mode.
|
|
220
|
-
|
|
221
|
-
Args:
|
|
222
|
-
flock: The Flock instance to execute
|
|
223
|
-
"""
|
|
224
|
-
if not flock:
|
|
225
|
-
console.print("[bold red]Error: No Flock instance provided.[/]")
|
|
226
|
-
return
|
|
227
|
-
|
|
228
|
-
agent_names = list(flock._agents.keys())
|
|
229
|
-
|
|
230
|
-
if not agent_names:
|
|
231
|
-
console.print("[yellow]No agents in this Flock to execute.[/]")
|
|
232
|
-
return
|
|
233
|
-
|
|
234
|
-
init_console()
|
|
235
|
-
console.print(
|
|
236
|
-
Panel("[bold green]Execute Flock - Batch Mode[/]"), justify="center"
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
# Step 1: Select start agent
|
|
240
|
-
console.print("\n[bold]Step 1: Select Start Agent[/]")
|
|
241
|
-
|
|
242
|
-
start_agent_name = questionary.select(
|
|
243
|
-
"Select an agent to start with:",
|
|
244
|
-
choices=agent_names,
|
|
245
|
-
).ask()
|
|
246
|
-
|
|
247
|
-
if not start_agent_name:
|
|
248
|
-
return
|
|
249
|
-
|
|
250
|
-
start_agent = flock._agents[start_agent_name]
|
|
251
|
-
|
|
252
|
-
# Step 2: Configure batch input source
|
|
253
|
-
console.print("\n[bold]Step 2: Select Batch Input Source[/]")
|
|
254
|
-
|
|
255
|
-
if not PANDAS_AVAILABLE:
|
|
256
|
-
console.print(
|
|
257
|
-
"[yellow]Warning: pandas not available. CSV input/output functionality will be limited.[/]"
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
input_source_choices = ["Enter batch items manually"]
|
|
261
|
-
|
|
262
|
-
if PANDAS_AVAILABLE:
|
|
263
|
-
input_source_choices.insert(0, "Load from CSV file")
|
|
264
|
-
|
|
265
|
-
input_source = questionary.select(
|
|
266
|
-
"How would you like to provide batch inputs?",
|
|
267
|
-
choices=input_source_choices,
|
|
268
|
-
).ask()
|
|
269
|
-
|
|
270
|
-
if not input_source:
|
|
271
|
-
return
|
|
272
|
-
|
|
273
|
-
batch_inputs = []
|
|
274
|
-
input_mapping = {}
|
|
275
|
-
|
|
276
|
-
if input_source == "Load from CSV file" and PANDAS_AVAILABLE:
|
|
277
|
-
# Ask for CSV file path
|
|
278
|
-
csv_path = questionary.path(
|
|
279
|
-
"Enter path to CSV file:",
|
|
280
|
-
).ask()
|
|
281
|
-
|
|
282
|
-
if not csv_path:
|
|
283
|
-
return
|
|
284
|
-
|
|
285
|
-
try:
|
|
286
|
-
# Validate path exists
|
|
287
|
-
if not os.path.exists(csv_path):
|
|
288
|
-
console.print(
|
|
289
|
-
f"[bold red]Error: File '{csv_path}' does not exist.[/]"
|
|
290
|
-
)
|
|
291
|
-
return
|
|
292
|
-
|
|
293
|
-
# Preview CSV
|
|
294
|
-
df = pd.read_csv(csv_path)
|
|
295
|
-
console.print("\n[bold]CSV Preview (first 5 rows):[/]")
|
|
296
|
-
console.print(df.head().to_string())
|
|
297
|
-
|
|
298
|
-
# Configure column mapping
|
|
299
|
-
console.print("\n[bold]Configure Column Mapping:[/]")
|
|
300
|
-
|
|
301
|
-
# Parse input schema (if available)
|
|
302
|
-
input_fields = _parse_input_schema(start_agent.input)
|
|
303
|
-
|
|
304
|
-
# If we have input fields, map CSV columns to them
|
|
305
|
-
if input_fields:
|
|
306
|
-
columns = df.columns.tolist()
|
|
307
|
-
|
|
308
|
-
for field in input_fields.keys():
|
|
309
|
-
field_desc = input_fields[field].get("description", "")
|
|
310
|
-
prompt = f"Select column for '{field}'"
|
|
311
|
-
|
|
312
|
-
if field_desc:
|
|
313
|
-
prompt += f" ({field_desc})"
|
|
314
|
-
|
|
315
|
-
selected_col = questionary.select(
|
|
316
|
-
prompt,
|
|
317
|
-
choices=["(Skip this field)"] + columns,
|
|
318
|
-
).ask()
|
|
319
|
-
|
|
320
|
-
if selected_col and selected_col != "(Skip this field)":
|
|
321
|
-
input_mapping[selected_col] = field
|
|
322
|
-
else:
|
|
323
|
-
# No schema, ask user to map columns manually
|
|
324
|
-
columns = df.columns.tolist()
|
|
325
|
-
|
|
326
|
-
for col in columns:
|
|
327
|
-
mapping = questionary.text(
|
|
328
|
-
f"Map column '{col}' to input field (leave empty to ignore):",
|
|
329
|
-
).ask()
|
|
330
|
-
|
|
331
|
-
if mapping:
|
|
332
|
-
input_mapping[col] = mapping
|
|
333
|
-
|
|
334
|
-
if not input_mapping:
|
|
335
|
-
console.print("[yellow]Warning: No column mapping defined.[/]")
|
|
336
|
-
if not questionary.confirm(
|
|
337
|
-
"Continue without mapping?", default=False
|
|
338
|
-
).ask():
|
|
339
|
-
return
|
|
340
|
-
|
|
341
|
-
# Use the CSV file path directly
|
|
342
|
-
batch_inputs = csv_path
|
|
343
|
-
|
|
344
|
-
except Exception as e:
|
|
345
|
-
console.print(f"[bold red]Error loading CSV: {e}[/]")
|
|
346
|
-
return
|
|
347
|
-
|
|
348
|
-
elif input_source == "Enter batch items manually":
|
|
349
|
-
# Parse input schema
|
|
350
|
-
input_fields = _parse_input_schema(start_agent.input)
|
|
351
|
-
|
|
352
|
-
if not input_fields:
|
|
353
|
-
console.print(
|
|
354
|
-
"[yellow]No input schema available. Using JSON input.[/]"
|
|
355
|
-
)
|
|
356
|
-
|
|
357
|
-
while True:
|
|
358
|
-
raw_input = questionary.text(
|
|
359
|
-
"Enter batch item as JSON (empty to finish):",
|
|
360
|
-
default="{}",
|
|
361
|
-
).ask()
|
|
362
|
-
|
|
363
|
-
if not raw_input:
|
|
364
|
-
break
|
|
365
|
-
|
|
366
|
-
try:
|
|
367
|
-
item_data = json.loads(raw_input)
|
|
368
|
-
batch_inputs.append(item_data)
|
|
369
|
-
console.print(f"[green]Added item {len(batch_inputs)}[/]")
|
|
370
|
-
except json.JSONDecodeError:
|
|
371
|
-
console.print("[bold red]Error: Invalid JSON input.[/]")
|
|
372
|
-
|
|
373
|
-
else:
|
|
374
|
-
# We have input fields, ask for each field for each item
|
|
375
|
-
item_count = 1
|
|
376
|
-
|
|
377
|
-
while True:
|
|
378
|
-
console.print(f"\n[bold]Batch Item {item_count}[/]")
|
|
379
|
-
|
|
380
|
-
item_data = {}
|
|
381
|
-
for field, info in input_fields.items():
|
|
382
|
-
field_type = info.get("type", "str")
|
|
383
|
-
description = info.get("description", "")
|
|
384
|
-
prompt = f"Enter value for '{field}'"
|
|
385
|
-
|
|
386
|
-
if description:
|
|
387
|
-
prompt += f" ({description})"
|
|
388
|
-
|
|
389
|
-
prompt += " (empty to skip):"
|
|
390
|
-
|
|
391
|
-
value = questionary.text(prompt).ask()
|
|
392
|
-
|
|
393
|
-
if not value:
|
|
394
|
-
continue
|
|
395
|
-
|
|
396
|
-
# Convert value to appropriate type
|
|
397
|
-
if field_type == "int":
|
|
398
|
-
try:
|
|
399
|
-
value = int(value)
|
|
400
|
-
except ValueError:
|
|
401
|
-
console.print(
|
|
402
|
-
f"[yellow]Warning: Could not convert value to int, using as string.[/]"
|
|
403
|
-
)
|
|
404
|
-
|
|
405
|
-
item_data[field] = value
|
|
406
|
-
|
|
407
|
-
if item_data:
|
|
408
|
-
batch_inputs.append(item_data)
|
|
409
|
-
console.print(f"[green]Added item {len(batch_inputs)}[/]")
|
|
410
|
-
|
|
411
|
-
if not questionary.confirm(
|
|
412
|
-
"Add another batch item?",
|
|
413
|
-
default=len(batch_inputs)
|
|
414
|
-
< 2, # Default to yes if we have less than 2 items
|
|
415
|
-
).ask():
|
|
416
|
-
break
|
|
417
|
-
|
|
418
|
-
item_count += 1
|
|
419
|
-
|
|
420
|
-
if isinstance(batch_inputs, list) and not batch_inputs:
|
|
421
|
-
console.print("[yellow]No batch items defined. Exiting.[/]")
|
|
422
|
-
return
|
|
423
|
-
|
|
424
|
-
# Step 3: Configure static inputs (if needed)
|
|
425
|
-
static_inputs = {}
|
|
426
|
-
|
|
427
|
-
if questionary.confirm(
|
|
428
|
-
"Would you like to add static inputs (common to all batch items)?",
|
|
429
|
-
default=False,
|
|
430
|
-
).ask():
|
|
431
|
-
console.print("\n[bold]Configure Static Inputs[/]")
|
|
432
|
-
|
|
433
|
-
raw_static = questionary.text(
|
|
434
|
-
"Enter static inputs as JSON:",
|
|
435
|
-
default="{}",
|
|
436
|
-
).ask()
|
|
437
|
-
|
|
438
|
-
try:
|
|
439
|
-
static_inputs = json.loads(raw_static)
|
|
440
|
-
except json.JSONDecodeError:
|
|
441
|
-
console.print(
|
|
442
|
-
"[bold red]Error: Invalid JSON for static inputs. Proceeding without static inputs.[/]"
|
|
443
|
-
)
|
|
444
|
-
static_inputs = {}
|
|
445
|
-
|
|
446
|
-
# Step 4: Configure batch execution options
|
|
447
|
-
console.print("\n[bold]Step 4: Configure Batch Execution Options[/]")
|
|
448
|
-
|
|
449
|
-
# Determine if we should use Temporal
|
|
450
|
-
use_temporal = False
|
|
451
|
-
# if questionary.confirm(
|
|
452
|
-
# f"Override Temporal setting? (Current: {flock.enable_temporal})",
|
|
453
|
-
# default=False,
|
|
454
|
-
# ).ask():
|
|
455
|
-
# use_temporal = questionary.confirm(
|
|
456
|
-
# "Use Temporal for batch execution?",
|
|
457
|
-
# default=flock.enable_temporal,
|
|
458
|
-
# ).ask()
|
|
459
|
-
|
|
460
|
-
# Configure parallelism
|
|
461
|
-
parallel = True
|
|
462
|
-
max_workers = 5
|
|
463
|
-
|
|
464
|
-
if not flock.enable_temporal if use_temporal is None else not use_temporal:
|
|
465
|
-
parallel = questionary.confirm(
|
|
466
|
-
"Run batch items in parallel?",
|
|
467
|
-
default=True,
|
|
468
|
-
).ask()
|
|
469
|
-
|
|
470
|
-
if parallel:
|
|
471
|
-
max_workers_input = questionary.text(
|
|
472
|
-
"Maximum number of parallel workers:",
|
|
473
|
-
default="5",
|
|
474
|
-
).ask()
|
|
475
|
-
|
|
476
|
-
try:
|
|
477
|
-
max_workers = int(max_workers_input)
|
|
478
|
-
except ValueError:
|
|
479
|
-
console.print(
|
|
480
|
-
"[yellow]Invalid worker count. Using default (5).[/]"
|
|
481
|
-
)
|
|
482
|
-
max_workers = 5
|
|
483
|
-
|
|
484
|
-
# Configure output options
|
|
485
|
-
silent_mode = questionary.confirm(
|
|
486
|
-
"Use silent mode with progress bar? (Recommended for large batches)",
|
|
487
|
-
default=True,
|
|
488
|
-
).ask()
|
|
489
|
-
|
|
490
|
-
write_to_csv = None
|
|
491
|
-
if (
|
|
492
|
-
PANDAS_AVAILABLE
|
|
493
|
-
and questionary.confirm(
|
|
494
|
-
"Write results to CSV file?",
|
|
495
|
-
default=True,
|
|
496
|
-
).ask()
|
|
497
|
-
):
|
|
498
|
-
write_to_csv = questionary.text(
|
|
499
|
-
"CSV output path:",
|
|
500
|
-
default="batch_results.csv",
|
|
501
|
-
).ask()
|
|
502
|
-
|
|
503
|
-
hide_columns = questionary.text(
|
|
504
|
-
"Hide columns (comma-separated - leave blank for hiding no columns):",
|
|
505
|
-
default="",
|
|
506
|
-
).ask()
|
|
507
|
-
|
|
508
|
-
hide_columns = hide_columns.split(",") if hide_columns else []
|
|
509
|
-
|
|
510
|
-
delimiter = questionary.text(
|
|
511
|
-
"Delimiter (default is comma):",
|
|
512
|
-
default=",",
|
|
513
|
-
).ask()
|
|
514
|
-
|
|
515
|
-
# Logging options
|
|
516
|
-
enable_logging = questionary.confirm(
|
|
517
|
-
"Enable logging?",
|
|
518
|
-
default=False,
|
|
519
|
-
).ask()
|
|
520
|
-
if enable_logging:
|
|
521
|
-
log_level = questionary.select(
|
|
522
|
-
"Minimum log level:",
|
|
523
|
-
choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
|
524
|
-
default="ERROR",
|
|
525
|
-
).ask()
|
|
526
|
-
configure_logging(log_level)
|
|
527
|
-
|
|
528
|
-
# Preview configuration
|
|
529
|
-
console.print("\n[bold]Batch Configuration Preview:[/]")
|
|
530
|
-
console.print(f"Agent: {start_agent_name}")
|
|
531
|
-
|
|
532
|
-
if isinstance(batch_inputs, str):
|
|
533
|
-
console.print(f"Input Source: CSV file ({batch_inputs})")
|
|
534
|
-
console.print(f"Column Mapping: {input_mapping}")
|
|
535
|
-
else:
|
|
536
|
-
console.print(f"Input Source: Manual entry ({len(batch_inputs)} items)")
|
|
537
|
-
|
|
538
|
-
if static_inputs:
|
|
539
|
-
console.print(f"Static Inputs: {json.dumps(static_inputs, indent=2)}")
|
|
540
|
-
|
|
541
|
-
# temporal_status = (
|
|
542
|
-
# "Default" if use_temporal is None else ("Yes" if use_temporal else "No")
|
|
543
|
-
# )
|
|
544
|
-
# console.print(f"Use Temporal: {temporal_status}")
|
|
545
|
-
|
|
546
|
-
if not (flock.enable_temporal if use_temporal is None else use_temporal):
|
|
547
|
-
console.print(f"Parallel Execution: {parallel}")
|
|
548
|
-
if parallel:
|
|
549
|
-
console.print(f"Max Workers: {max_workers}")
|
|
550
|
-
|
|
551
|
-
console.print(f"Silent Mode: {silent_mode}")
|
|
552
|
-
|
|
553
|
-
if write_to_csv:
|
|
554
|
-
console.print(f"Write Results to: {write_to_csv}")
|
|
555
|
-
|
|
556
|
-
# Confirm execution
|
|
557
|
-
confirm = questionary.confirm(
|
|
558
|
-
"Execute batch with this configuration?",
|
|
559
|
-
default=True,
|
|
560
|
-
).ask()
|
|
561
|
-
|
|
562
|
-
if not confirm:
|
|
563
|
-
return
|
|
564
|
-
|
|
565
|
-
# Execute the batch
|
|
566
|
-
console.print("\n[bold]Executing Batch...[/]")
|
|
567
|
-
|
|
568
|
-
try:
|
|
569
|
-
# Logging was already configured above if enabled
|
|
570
|
-
|
|
571
|
-
# Run the batch
|
|
572
|
-
results = flock.run_batch(
|
|
573
|
-
start_agent=start_agent_name,
|
|
574
|
-
batch_inputs=batch_inputs,
|
|
575
|
-
input_mapping=input_mapping or None,
|
|
576
|
-
static_inputs=static_inputs or None,
|
|
577
|
-
parallel=parallel,
|
|
578
|
-
max_workers=max_workers,
|
|
579
|
-
use_temporal=use_temporal,
|
|
580
|
-
box_results=True,
|
|
581
|
-
return_errors=True,
|
|
582
|
-
silent_mode=silent_mode,
|
|
583
|
-
write_to_csv=write_to_csv,
|
|
584
|
-
hide_columns=hide_columns,
|
|
585
|
-
delimiter=delimiter,
|
|
586
|
-
)
|
|
587
|
-
|
|
588
|
-
# Display results summary
|
|
589
|
-
console.print("\n[bold green]Batch Execution Complete![/]")
|
|
590
|
-
|
|
591
|
-
success_count = sum(1 for r in results if not isinstance(r, Exception))
|
|
592
|
-
error_count = sum(1 for r in results if isinstance(r, Exception))
|
|
593
|
-
|
|
594
|
-
console.print(f"Total Items: {len(results)}")
|
|
595
|
-
console.print(f"Successful: {success_count}")
|
|
596
|
-
|
|
597
|
-
if error_count > 0:
|
|
598
|
-
console.print(f"[bold red]Errors: {error_count}[/]")
|
|
599
|
-
|
|
600
|
-
# Ask if user wants to see detailed results
|
|
601
|
-
if questionary.confirm(
|
|
602
|
-
"View detailed results?",
|
|
603
|
-
default=False,
|
|
604
|
-
).ask():
|
|
605
|
-
for i, result in enumerate(results):
|
|
606
|
-
console.print(f"\n[bold]Item {i + 1}:[/]")
|
|
607
|
-
if isinstance(result, Exception):
|
|
608
|
-
console.print(f"[bold red]Error: {result}[/]")
|
|
609
|
-
else:
|
|
610
|
-
# Display as formatted JSON
|
|
611
|
-
try:
|
|
612
|
-
console.print(json.dumps(result, indent=2))
|
|
613
|
-
except:
|
|
614
|
-
console.print(str(result))
|
|
615
|
-
|
|
616
|
-
if write_to_csv:
|
|
617
|
-
console.print(f"\n[green]Results written to: {write_to_csv}[/]")
|
|
618
|
-
|
|
619
|
-
except Exception as e:
|
|
620
|
-
console.print(f"\n[bold red]Error during batch execution:[/] {e!s}")
|
flock/cli/load_agent.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# TODO
|
flock/cli/load_examples.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# TODO
|