meshagent-cli 0.43.0__tar.gz → 0.43.2__tar.gz
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.
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/PKG-INFO +17 -17
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create_test.py +2 -2
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/process.py +193 -70
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/process_test.py +114 -34
- meshagent_cli-0.43.2/meshagent/cli/version.py +1 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/PKG-INFO +17 -17
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/requires.txt +16 -16
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/pyproject.toml +16 -16
- meshagent_cli-0.43.0/meshagent/cli/version.py +0 -1
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/LICENSE +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/README.md +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/__init__.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/_filedrop.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agent.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agent_cli_options_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agent_package_cli.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agent_package_cli_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agents.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/agents_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/api_keys.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/api_keys_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/ask.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/ask_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/async_typer.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/async_typer_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/auth.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/auth_async.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/auth_async_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/auth_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/call.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/chatbot.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/cli.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/cli_mcp.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/cli_secrets.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/cli_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/common_options.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/config.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/config_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/containers.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/containers_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create_project_templates/__init__.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create_project_templates/python/backend-agent/server.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create_project_templates/python/contact-form/server.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/create_project_templates/python/webserver/server.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/dataset.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/dataset_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/developer.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/developer_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/doctor.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/doctor_dockerfiles/__init__.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/doctor_templates/__init__.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/doctor_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/feeds.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/helper.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/helper_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/helpers.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/host.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/image.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/image_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/launch.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/launch_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/llm.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/llm_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/local_settings.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/local_settings_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/mailbot.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/mailbot_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/mailboxes.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/meeting_transcriber.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/memory.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/memory_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/meshagent_images.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/meshagent_images_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/messaging.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/multi.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/oauth2.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/oauth2_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/oci_archive.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/oci_archive_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/participant_token.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/port.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/port_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/preamble_rules.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/preamble_rules_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/process_live_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/projects.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/projects_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/queue.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/queue_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/registry.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/registry_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/room.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/room_connect.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/room_connect_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/room_services.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/rooms.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/rooms_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/root_commands.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/root_commands_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/routes.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/scheduled_tasks.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/scheduled_tasks_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/services.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/services_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/sessions.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/sessions_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/storage.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/storage_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/subscriptions.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/sync.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/sync_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/task_runner.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/task_runner_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/thread_inspect.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/thread_inspect_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/thread_sidebar.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tool_call_summary.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tool_call_summary_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tool_integrations.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tool_integrations_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/__init__.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/auth_switch.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/auth_switch_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/create.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/deploy_room.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/deploy_room_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/project_activate.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/project_activate_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/setup.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/setup_splash_frames.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/tui/setup_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/version_check.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/version_check_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/voicebot.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/webhook.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/webserver.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/webserver_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/worker.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent/cli/worker_test.py +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/SOURCES.txt +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/dependency_links.txt +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/entry_points.txt +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/meshagent_cli.egg-info/top_level.txt +0 -0
- {meshagent_cli-0.43.0 → meshagent_cli-0.43.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meshagent-cli
|
|
3
|
-
Version: 0.43.
|
|
3
|
+
Version: 0.43.2
|
|
4
4
|
Summary: CLI for Meshagent
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Documentation, https://docs.meshagent.com
|
|
@@ -22,8 +22,8 @@ Requires-Dist: openpyxl~=3.1
|
|
|
22
22
|
Requires-Dist: xlsxwriter~=3.2
|
|
23
23
|
Requires-Dist: pathspec<2,>=1.0.3
|
|
24
24
|
Requires-Dist: zstandard~=0.25.0
|
|
25
|
-
Requires-Dist: meshagent-llm-proxy==0.43.
|
|
26
|
-
Requires-Dist: meshagent-codex==0.43.
|
|
25
|
+
Requires-Dist: meshagent-llm-proxy==0.43.2
|
|
26
|
+
Requires-Dist: meshagent-codex==0.43.2
|
|
27
27
|
Requires-Dist: rich~=14.3.0
|
|
28
28
|
Requires-Dist: sounddevice~=0.5
|
|
29
29
|
Requires-Dist: textual<9.0,>=8.2.3
|
|
@@ -32,23 +32,23 @@ Requires-Dist: prompt-toolkit~=3.0.52
|
|
|
32
32
|
Requires-Dist: ascii-magic~=2.3
|
|
33
33
|
Requires-Dist: pillow~=11.3.0
|
|
34
34
|
Provides-Extra: all
|
|
35
|
-
Requires-Dist: meshagent-agents[all]==0.43.
|
|
36
|
-
Requires-Dist: meshagent-api[all]==0.43.
|
|
37
|
-
Requires-Dist: meshagent-commoncrawl==0.43.
|
|
38
|
-
Requires-Dist: meshagent-scrapy==0.43.
|
|
39
|
-
Requires-Dist: meshagent-computers==0.43.
|
|
40
|
-
Requires-Dist: meshagent-openai==0.43.
|
|
41
|
-
Requires-Dist: meshagent-anthropic==0.43.
|
|
42
|
-
Requires-Dist: meshagent-otel==0.43.
|
|
43
|
-
Requires-Dist: meshagent-mcp==0.43.
|
|
44
|
-
Requires-Dist: meshagent-tools==0.43.
|
|
35
|
+
Requires-Dist: meshagent-agents[all]==0.43.2; extra == "all"
|
|
36
|
+
Requires-Dist: meshagent-api[all]==0.43.2; extra == "all"
|
|
37
|
+
Requires-Dist: meshagent-commoncrawl==0.43.2; extra == "all"
|
|
38
|
+
Requires-Dist: meshagent-scrapy==0.43.2; extra == "all"
|
|
39
|
+
Requires-Dist: meshagent-computers==0.43.2; extra == "all"
|
|
40
|
+
Requires-Dist: meshagent-openai==0.43.2; extra == "all"
|
|
41
|
+
Requires-Dist: meshagent-anthropic==0.43.2; extra == "all"
|
|
42
|
+
Requires-Dist: meshagent-otel==0.43.2; extra == "all"
|
|
43
|
+
Requires-Dist: meshagent-mcp==0.43.2; extra == "all"
|
|
44
|
+
Requires-Dist: meshagent-tools==0.43.2; extra == "all"
|
|
45
45
|
Requires-Dist: supabase-auth~=2.28.0; extra == "all"
|
|
46
46
|
Requires-Dist: prompt-toolkit~=3.0.52; extra == "all"
|
|
47
47
|
Provides-Extra: mcp-service
|
|
48
|
-
Requires-Dist: meshagent-agents[all]==0.43.
|
|
49
|
-
Requires-Dist: meshagent-api==0.43.
|
|
50
|
-
Requires-Dist: meshagent-mcp==0.43.
|
|
51
|
-
Requires-Dist: meshagent-tools==0.43.
|
|
48
|
+
Requires-Dist: meshagent-agents[all]==0.43.2; extra == "mcp-service"
|
|
49
|
+
Requires-Dist: meshagent-api==0.43.2; extra == "mcp-service"
|
|
50
|
+
Requires-Dist: meshagent-mcp==0.43.2; extra == "mcp-service"
|
|
51
|
+
Requires-Dist: meshagent-tools==0.43.2; extra == "mcp-service"
|
|
52
52
|
Requires-Dist: supabase-auth~=2.28.0; extra == "mcp-service"
|
|
53
53
|
Dynamic: license-file
|
|
54
54
|
|
|
@@ -1062,7 +1062,7 @@ def test_init_creates_typescript_room_chat_non_interactively(tmp_path) -> None:
|
|
|
1062
1062
|
dockerfile = (tmp_path / "Dockerfile").read_text(encoding="utf-8")
|
|
1063
1063
|
assert '"name": "meshagent-create-typescript-room-chat"' in package_json
|
|
1064
1064
|
assert '"@meshagent/meshagent": "^' in package_json
|
|
1065
|
-
assert '"@meshagent/meshagent-node
|
|
1065
|
+
assert '"@meshagent/meshagent-node": "^' in package_json
|
|
1066
1066
|
assert '"next": "^16.2.6"' in package_json
|
|
1067
1067
|
assert "http-proxy" not in package_json
|
|
1068
1068
|
assert '"@msgpack/msgpack"' not in package_json
|
|
@@ -1087,7 +1087,7 @@ def test_init_creates_typescript_room_chat_non_interactively(tmp_path) -> None:
|
|
|
1087
1087
|
in readme
|
|
1088
1088
|
)
|
|
1089
1089
|
dev_server = (tmp_path / "dev-server.mjs").read_text(encoding="utf-8")
|
|
1090
|
-
assert 'from "@meshagent/meshagent-node
|
|
1090
|
+
assert 'from "@meshagent/meshagent-node"' in dev_server
|
|
1091
1091
|
assert "attachRoomWebSocketProxy(server" in dev_server
|
|
1092
1092
|
assert "FROM scratch" in dockerfile
|
|
1093
1093
|
assert "LABEL meshagent.runtime=node" in dockerfile
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import typer
|
|
2
2
|
import contextlib
|
|
3
|
-
import inspect
|
|
4
3
|
import jwt
|
|
5
4
|
from aiohttp import web
|
|
6
5
|
from rich import print
|
|
@@ -179,7 +178,7 @@ from meshagent.agents.chat_client import (
|
|
|
179
178
|
MessagingChatClient,
|
|
180
179
|
WebSocketChatClient,
|
|
181
180
|
)
|
|
182
|
-
from meshagent.agents.process import ContentScheme
|
|
181
|
+
from meshagent.agents.process import ContentScheme
|
|
183
182
|
from meshagent.agents.images_dataset import ImageDatasetClient, ImagesDataset
|
|
184
183
|
from meshagent.agents.thread_storage import (
|
|
185
184
|
NoopThreadStorageRepository,
|
|
@@ -215,7 +214,8 @@ from meshagent.api.client import ConflictError
|
|
|
215
214
|
|
|
216
215
|
OutputModality = Literal["text", "audio"]
|
|
217
216
|
WebSocketAuthMode = Literal["iap", "jwt", "none"]
|
|
218
|
-
ProcessBackendName = Literal["llm", "codex"]
|
|
217
|
+
ProcessBackendName = Literal["llm", "codex", "chat"]
|
|
218
|
+
ProcessBackendOptionName = Literal["llm", "codex", "chat"]
|
|
219
219
|
|
|
220
220
|
logger = logging.getLogger("process")
|
|
221
221
|
_MESHAGENT_PROJECT_ID_HEADER = "Meshagent-Project-Id"
|
|
@@ -508,18 +508,6 @@ def _mesh_document_agent_messages(
|
|
|
508
508
|
return messages
|
|
509
509
|
|
|
510
510
|
|
|
511
|
-
async def _thread_agent_messages_from_storage(
|
|
512
|
-
thread_storage: object,
|
|
513
|
-
) -> list[AgentMessage]:
|
|
514
|
-
from meshagent.agents.dataset_thread_storage import DatasetThreadStorage
|
|
515
|
-
from meshagent.agents.process_thread_adapter import MeshDocumentThreadStorage
|
|
516
|
-
|
|
517
|
-
if isinstance(thread_storage, (DatasetThreadStorage, MeshDocumentThreadStorage)):
|
|
518
|
-
await thread_storage.wait_until_ready()
|
|
519
|
-
return thread_storage.agent_messages()
|
|
520
|
-
return []
|
|
521
|
-
|
|
522
|
-
|
|
523
511
|
def _thread_storage_class_for_backend(thread_storage: "ThreadStorageBackend"):
|
|
524
512
|
thread_storage = _normalize_thread_storage_backend(thread_storage)
|
|
525
513
|
if thread_storage == "dataset":
|
|
@@ -821,7 +809,6 @@ async def _run_process_run_tui(
|
|
|
821
809
|
current_model=initial_model,
|
|
822
810
|
fallback=", ".join(configured_models),
|
|
823
811
|
)
|
|
824
|
-
resolved_agent_name = _normalized_annotation_string(agent_name)
|
|
825
812
|
open_on_start = not (
|
|
826
813
|
threading_mode == "default-new"
|
|
827
814
|
and (thread_path is None or thread_path.strip() == "")
|
|
@@ -852,56 +839,23 @@ async def _run_process_run_tui(
|
|
|
852
839
|
current = _current_session()
|
|
853
840
|
return current.thread_path if current.has_thread_path else None
|
|
854
841
|
|
|
855
|
-
def _stored_message_with_sender(message: AgentMessage) -> AgentMessage:
|
|
856
|
-
if resolved_agent_name is None:
|
|
857
|
-
return message
|
|
858
|
-
if isinstance(message, (AgentTextContentDelta, AgentFileContentDelta)):
|
|
859
|
-
if message.sender_name is not None and message.sender_name.strip() != "":
|
|
860
|
-
return message
|
|
861
|
-
return message.model_copy(update={"sender_name": resolved_agent_name})
|
|
862
|
-
return message
|
|
863
|
-
|
|
864
842
|
async def _load_current_thread_from_process_storage() -> None:
|
|
865
843
|
current = _current_session()
|
|
866
844
|
if not current.has_thread_path:
|
|
867
845
|
return
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
load=True,
|
|
873
|
-
)
|
|
874
|
-
await current.send(open_thread)
|
|
875
|
-
while True:
|
|
876
|
-
event = await current.receive()
|
|
877
|
-
if event.get("type") != AGENT_EVENT_THREAD_LOADED:
|
|
878
|
-
continue
|
|
879
|
-
if event.get("source_message_id") != open_thread.message_id:
|
|
880
|
-
continue
|
|
881
|
-
return
|
|
882
|
-
supervisor = bot._supervisor
|
|
883
|
-
await supervisor.route(
|
|
884
|
-
Message(
|
|
885
|
-
data=OpenThread(
|
|
886
|
-
type=AGENT_MESSAGE_THREAD_OPEN,
|
|
887
|
-
thread_id=current.thread_path,
|
|
888
|
-
)
|
|
889
|
-
)
|
|
846
|
+
open_thread = OpenThread(
|
|
847
|
+
type=AGENT_MESSAGE_THREAD_OPEN,
|
|
848
|
+
thread_id=current.thread_path,
|
|
849
|
+
load=True,
|
|
890
850
|
)
|
|
891
|
-
|
|
892
|
-
|
|
851
|
+
await current.send(open_thread)
|
|
852
|
+
while True:
|
|
853
|
+
event = await current.receive()
|
|
854
|
+
if event.get("type") != AGENT_EVENT_THREAD_LOADED:
|
|
893
855
|
continue
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
storage_messages = _thread_agent_messages_from_storage(
|
|
898
|
-
process_thread_storage
|
|
899
|
-
)
|
|
900
|
-
if inspect.isawaitable(storage_messages):
|
|
901
|
-
storage_messages = await storage_messages
|
|
902
|
-
for stored_message in storage_messages:
|
|
903
|
-
current.add_agent_message(_stored_message_with_sender(stored_message))
|
|
904
|
-
break
|
|
856
|
+
if event.get("source_message_id") != open_thread.message_id:
|
|
857
|
+
continue
|
|
858
|
+
return
|
|
905
859
|
|
|
906
860
|
def _selected_model_modalities() -> tuple[OutputModality, ...]:
|
|
907
861
|
model_info = _model_info_for_current_selection(
|
|
@@ -3173,7 +3127,7 @@ def _parse_process_model_spec(model: str) -> _ProcessModelSpec:
|
|
|
3173
3127
|
backend_name = parts[0]
|
|
3174
3128
|
provider_name = parts[1]
|
|
3175
3129
|
model_name = "/".join(parts[2:]).strip()
|
|
3176
|
-
if backend_name not in ("llm", "codex"):
|
|
3130
|
+
if backend_name not in ("llm", "codex", "chat"):
|
|
3177
3131
|
raise ValueError(f"unknown model backend {backend_name!r}")
|
|
3178
3132
|
if provider_name == "" or model_name == "":
|
|
3179
3133
|
raise ValueError(f"invalid model spec {model!r}")
|
|
@@ -3194,6 +3148,14 @@ def _parse_process_model_spec(model: str) -> _ProcessModelSpec:
|
|
|
3194
3148
|
provider="openai",
|
|
3195
3149
|
model=model_name,
|
|
3196
3150
|
)
|
|
3151
|
+
if prefix == "chat":
|
|
3152
|
+
if model_name != "none":
|
|
3153
|
+
raise ValueError("chat backend only supports model 'none'")
|
|
3154
|
+
return _ProcessModelSpec(
|
|
3155
|
+
backend="chat",
|
|
3156
|
+
provider="chat",
|
|
3157
|
+
model=model_name,
|
|
3158
|
+
)
|
|
3197
3159
|
if prefix == "llm":
|
|
3198
3160
|
return _ProcessModelSpec(
|
|
3199
3161
|
backend="llm",
|
|
@@ -3211,6 +3173,52 @@ def _normalize_process_model_specs(model: str | list[str]) -> list[_ProcessModel
|
|
|
3211
3173
|
return [_parse_process_model_spec(item) for item in _normalize_model_options(model)]
|
|
3212
3174
|
|
|
3213
3175
|
|
|
3176
|
+
def _process_models_for_backend_option(
|
|
3177
|
+
*,
|
|
3178
|
+
model: str | list[str],
|
|
3179
|
+
backend: list[str] | None,
|
|
3180
|
+
) -> list[str]:
|
|
3181
|
+
if backend is None or len(backend) == 0:
|
|
3182
|
+
return _normalize_model_options(model)
|
|
3183
|
+
|
|
3184
|
+
models: list[str] = []
|
|
3185
|
+
for backend_name in backend:
|
|
3186
|
+
if backend_name == "llm":
|
|
3187
|
+
models.extend(
|
|
3188
|
+
[
|
|
3189
|
+
"llm/openai/gpt-5.2",
|
|
3190
|
+
"llm/anthropic/claude-3-5-sonnet-latest",
|
|
3191
|
+
]
|
|
3192
|
+
)
|
|
3193
|
+
elif backend_name == "codex":
|
|
3194
|
+
models.append("codex/gpt-5.5")
|
|
3195
|
+
elif backend_name == "chat":
|
|
3196
|
+
models.append("chat/none")
|
|
3197
|
+
else:
|
|
3198
|
+
raise ValueError(f"unknown backend {backend_name!r}")
|
|
3199
|
+
return models
|
|
3200
|
+
|
|
3201
|
+
|
|
3202
|
+
def _normalize_process_backend_options(
|
|
3203
|
+
backend: list[str] | None,
|
|
3204
|
+
) -> list[ProcessBackendOptionName]:
|
|
3205
|
+
normalized: list[ProcessBackendOptionName] = []
|
|
3206
|
+
for item in backend or []:
|
|
3207
|
+
if item == "llm":
|
|
3208
|
+
backend_name: ProcessBackendOptionName = "llm"
|
|
3209
|
+
elif item == "codex":
|
|
3210
|
+
backend_name = "codex"
|
|
3211
|
+
elif item == "chat":
|
|
3212
|
+
backend_name = "chat"
|
|
3213
|
+
else:
|
|
3214
|
+
raise typer.BadParameter(
|
|
3215
|
+
f"unknown backend {item!r}; supported: llm, codex, chat"
|
|
3216
|
+
)
|
|
3217
|
+
if backend_name not in normalized:
|
|
3218
|
+
normalized.append(backend_name)
|
|
3219
|
+
return normalized
|
|
3220
|
+
|
|
3221
|
+
|
|
3214
3222
|
def _provider_model_display_name(
|
|
3215
3223
|
*,
|
|
3216
3224
|
backend: str | None = None,
|
|
@@ -3545,6 +3553,8 @@ def _models_response_backend_name(backend: str | None) -> ProcessBackendName | N
|
|
|
3545
3553
|
return "llm"
|
|
3546
3554
|
if backend == "codex":
|
|
3547
3555
|
return "codex"
|
|
3556
|
+
if backend == "chat":
|
|
3557
|
+
return "chat"
|
|
3548
3558
|
return None
|
|
3549
3559
|
|
|
3550
3560
|
|
|
@@ -4158,6 +4168,7 @@ def _build_runtime_agent(
|
|
|
4158
4168
|
runtime: Literal["chatbot", "process"],
|
|
4159
4169
|
normalized_tool_options: NormalizedRequiredToolOptions,
|
|
4160
4170
|
model: str | list[str],
|
|
4171
|
+
backend: list[str] | None,
|
|
4161
4172
|
rule: list[str],
|
|
4162
4173
|
rules_file: Optional[list[str]],
|
|
4163
4174
|
instructions: Optional[list[str]],
|
|
@@ -4219,7 +4230,11 @@ def _build_runtime_agent(
|
|
|
4219
4230
|
preamble_rule: bool = True,
|
|
4220
4231
|
):
|
|
4221
4232
|
builder = _builder_for_runtime(runtime)
|
|
4222
|
-
selected_models =
|
|
4233
|
+
selected_models = (
|
|
4234
|
+
_process_models_for_backend_option(model=model, backend=backend)
|
|
4235
|
+
if runtime == "process"
|
|
4236
|
+
else _normalize_model_options(model)
|
|
4237
|
+
)
|
|
4223
4238
|
selected_output_modalities = _normalize_output_modalities(output_modalities)
|
|
4224
4239
|
builder_model: str | list[str]
|
|
4225
4240
|
if runtime == "process":
|
|
@@ -4289,6 +4304,7 @@ def _build_runtime_agent(
|
|
|
4289
4304
|
"output_audio_bitrate": output_audio_bitrate,
|
|
4290
4305
|
}
|
|
4291
4306
|
if runtime == "process":
|
|
4307
|
+
builder_kwargs["backend"] = backend
|
|
4292
4308
|
builder_kwargs["meshagent_project_id"] = meshagent_project_id
|
|
4293
4309
|
builder_kwargs["thread_storage"] = thread_storage
|
|
4294
4310
|
builder_kwargs["context_management"] = context_management
|
|
@@ -4959,6 +4975,7 @@ def build_process_agent(
|
|
|
4959
4975
|
shell_copy_env: Optional[list[str]] = None,
|
|
4960
4976
|
shell_set_env: Optional[list[str]] = None,
|
|
4961
4977
|
channels: Optional[list[str]] = None,
|
|
4978
|
+
backend: list[str] | None = None,
|
|
4962
4979
|
websocket_auth: WebSocketAuthMode = "jwt",
|
|
4963
4980
|
transcription_model: str | None = DEFAULT_OPENAI_REALTIME_TRANSCRIPTION_MODEL,
|
|
4964
4981
|
voice: str | None = None,
|
|
@@ -4994,6 +5011,8 @@ def build_process_agent(
|
|
|
4994
5011
|
from meshagent.agents.process import (
|
|
4995
5012
|
AgentBackend,
|
|
4996
5013
|
AgentSupervisor,
|
|
5014
|
+
ChatBackend,
|
|
5015
|
+
ChatAgentProcess,
|
|
4997
5016
|
LLMBackend,
|
|
4998
5017
|
LLMAgentProcess,
|
|
4999
5018
|
Message,
|
|
@@ -5074,13 +5093,21 @@ def build_process_agent(
|
|
|
5074
5093
|
except FileNotFoundError:
|
|
5075
5094
|
print(f"[yellow]rules file not found at {rules_path}[/yellow]")
|
|
5076
5095
|
|
|
5077
|
-
|
|
5096
|
+
selected_backends = _normalize_process_backend_options(backend)
|
|
5097
|
+
selected_model_specs = _normalize_process_model_specs(
|
|
5098
|
+
_process_models_for_backend_option(model=model, backend=selected_backends)
|
|
5099
|
+
)
|
|
5100
|
+
filter_model_specs = [] if len(selected_backends) > 0 else selected_model_specs
|
|
5078
5101
|
llm_model_specs = [spec for spec in selected_model_specs if spec.backend == "llm"]
|
|
5079
5102
|
codex_model_specs = [
|
|
5080
5103
|
spec for spec in selected_model_specs if spec.backend == "codex"
|
|
5081
5104
|
]
|
|
5105
|
+
chat_model_specs = [spec for spec in selected_model_specs if spec.backend == "chat"]
|
|
5082
5106
|
has_llm_backend = len(llm_model_specs) > 0
|
|
5083
5107
|
has_codex_backend = len(codex_model_specs) > 0
|
|
5108
|
+
has_chat_backend = len(chat_model_specs) > 0
|
|
5109
|
+
unfiltered_llm_backend = "llm" in selected_backends
|
|
5110
|
+
unfiltered_codex_backend = "codex" in selected_backends
|
|
5084
5111
|
if thread_storage == "codex" and has_llm_backend:
|
|
5085
5112
|
print("[red]--thread-storage=codex only supports Codex backends[/red]")
|
|
5086
5113
|
raise typer.Exit(1)
|
|
@@ -5197,7 +5224,7 @@ def build_process_agent(
|
|
|
5197
5224
|
compaction_threshold=compaction_threshold,
|
|
5198
5225
|
max_output_tokens=max_output_tokens,
|
|
5199
5226
|
reasoning_effort=reasoning_effort,
|
|
5200
|
-
allowed_models=openai_models,
|
|
5227
|
+
allowed_models=None if unfiltered_llm_backend else openai_models,
|
|
5201
5228
|
**openai_adapter_kwargs,
|
|
5202
5229
|
),
|
|
5203
5230
|
)
|
|
@@ -5233,7 +5260,7 @@ def build_process_agent(
|
|
|
5233
5260
|
model=anthropic_models[0],
|
|
5234
5261
|
api_key=api_key,
|
|
5235
5262
|
log_requests=log_llm_requests,
|
|
5236
|
-
allowed_models=anthropic_models,
|
|
5263
|
+
allowed_models=None if unfiltered_llm_backend else anthropic_models,
|
|
5237
5264
|
),
|
|
5238
5265
|
)
|
|
5239
5266
|
for provider_name in provider_order:
|
|
@@ -5546,7 +5573,9 @@ def build_process_agent(
|
|
|
5546
5573
|
client_title="MeshAgent Process Codex",
|
|
5547
5574
|
),
|
|
5548
5575
|
client_factory=CodexAsyncAppServerClient,
|
|
5549
|
-
default_model=
|
|
5576
|
+
default_model=None
|
|
5577
|
+
if unfiltered_codex_backend
|
|
5578
|
+
else codex_model_specs[0].model,
|
|
5550
5579
|
provider_name=codex_model_specs[0].provider,
|
|
5551
5580
|
provider_friendly_name="OpenAI Codex",
|
|
5552
5581
|
thread_storage=codex_thread_storage,
|
|
@@ -5570,6 +5599,18 @@ def build_process_agent(
|
|
|
5570
5599
|
realtime_connection_factory=create_realtime_connection,
|
|
5571
5600
|
)
|
|
5572
5601
|
|
|
5602
|
+
chat_backend: ChatBackend | None = None
|
|
5603
|
+
if has_chat_backend:
|
|
5604
|
+
chat_backend = ChatBackend(
|
|
5605
|
+
process_factory=lambda thread_id, backend_name: (
|
|
5606
|
+
supervisor.create_chat_thread_process(
|
|
5607
|
+
thread_id=thread_id,
|
|
5608
|
+
backend_name=backend_name,
|
|
5609
|
+
)
|
|
5610
|
+
),
|
|
5611
|
+
thread_id_factory=create_thread_id,
|
|
5612
|
+
)
|
|
5613
|
+
|
|
5573
5614
|
for spec in selected_model_specs:
|
|
5574
5615
|
if spec.backend == "llm" and llm_backend is not None:
|
|
5575
5616
|
if llm_backend not in agent_backends:
|
|
@@ -5577,6 +5618,9 @@ def build_process_agent(
|
|
|
5577
5618
|
elif spec.backend == "codex" and codex_backend is not None:
|
|
5578
5619
|
if codex_backend not in agent_backends:
|
|
5579
5620
|
agent_backends.append(codex_backend)
|
|
5621
|
+
elif spec.backend == "chat" and chat_backend is not None:
|
|
5622
|
+
if chat_backend not in agent_backends:
|
|
5623
|
+
agent_backends.append(chat_backend)
|
|
5580
5624
|
|
|
5581
5625
|
if len(agent_backends) == 0:
|
|
5582
5626
|
raise RoomException("no process backends are configured")
|
|
@@ -6132,7 +6176,7 @@ def build_process_agent(
|
|
|
6132
6176
|
message = Message(
|
|
6133
6177
|
data=_filter_models_response_to_configured_models(
|
|
6134
6178
|
message.data,
|
|
6135
|
-
model_specs=
|
|
6179
|
+
model_specs=filter_model_specs,
|
|
6136
6180
|
),
|
|
6137
6181
|
sender=message.sender,
|
|
6138
6182
|
source=message.source,
|
|
@@ -6232,6 +6276,25 @@ def build_process_agent(
|
|
|
6232
6276
|
process.register_content_scheme(_room_content_scheme(room=room))
|
|
6233
6277
|
return process
|
|
6234
6278
|
|
|
6279
|
+
def create_chat_thread_process(
|
|
6280
|
+
self,
|
|
6281
|
+
*,
|
|
6282
|
+
thread_id: str,
|
|
6283
|
+
backend_name: str,
|
|
6284
|
+
) -> ChatAgentProcess:
|
|
6285
|
+
room = self._agent.room
|
|
6286
|
+
thread_storage_instance = None
|
|
6287
|
+
if room is not None:
|
|
6288
|
+
thread_storage_instance = create_thread_storage(
|
|
6289
|
+
room=room,
|
|
6290
|
+
thread_id=thread_id,
|
|
6291
|
+
)
|
|
6292
|
+
return ChatAgentProcess(
|
|
6293
|
+
thread_id=thread_id,
|
|
6294
|
+
backend=backend_name,
|
|
6295
|
+
thread_storage=thread_storage_instance,
|
|
6296
|
+
)
|
|
6297
|
+
|
|
6235
6298
|
return CustomProcessAgent
|
|
6236
6299
|
|
|
6237
6300
|
|
|
@@ -6295,6 +6358,16 @@ async def join(
|
|
|
6295
6358
|
help="Name of an LLM model to make available. Can be repeated.",
|
|
6296
6359
|
),
|
|
6297
6360
|
] = ["gpt-5.5"],
|
|
6361
|
+
backend: Annotated[
|
|
6362
|
+
list[str],
|
|
6363
|
+
typer.Option(
|
|
6364
|
+
"--backend",
|
|
6365
|
+
help=(
|
|
6366
|
+
"Process backend to make available. Can be repeated. "
|
|
6367
|
+
"Supported: llm, codex, chat."
|
|
6368
|
+
),
|
|
6369
|
+
),
|
|
6370
|
+
] = [],
|
|
6298
6371
|
image_generation: Annotated[
|
|
6299
6372
|
Optional[str], typer.Option(..., help="Name of an image gen model")
|
|
6300
6373
|
] = None,
|
|
@@ -6637,6 +6710,7 @@ async def join(
|
|
|
6637
6710
|
runtime=runtime,
|
|
6638
6711
|
normalized_tool_options=normalized_tool_options,
|
|
6639
6712
|
model=model,
|
|
6713
|
+
backend=backend,
|
|
6640
6714
|
rule=rule,
|
|
6641
6715
|
rules_file=rules_file,
|
|
6642
6716
|
instructions=instructions,
|
|
@@ -6775,6 +6849,16 @@ async def service(
|
|
|
6775
6849
|
help="Name of an LLM model to make available. Can be repeated.",
|
|
6776
6850
|
),
|
|
6777
6851
|
] = ["gpt-5.5"],
|
|
6852
|
+
backend: Annotated[
|
|
6853
|
+
list[str],
|
|
6854
|
+
typer.Option(
|
|
6855
|
+
"--backend",
|
|
6856
|
+
help=(
|
|
6857
|
+
"Process backend to make available. Can be repeated. "
|
|
6858
|
+
"Supported: llm, codex, chat."
|
|
6859
|
+
),
|
|
6860
|
+
),
|
|
6861
|
+
] = [],
|
|
6778
6862
|
image_generation: Annotated[
|
|
6779
6863
|
Optional[str], typer.Option(..., help="Name of an image gen model")
|
|
6780
6864
|
] = None,
|
|
@@ -7090,6 +7174,7 @@ async def service(
|
|
|
7090
7174
|
runtime=runtime,
|
|
7091
7175
|
normalized_tool_options=normalized_tool_options,
|
|
7092
7176
|
model=model,
|
|
7177
|
+
backend=backend,
|
|
7093
7178
|
rule=rule,
|
|
7094
7179
|
rules_file=rules_file,
|
|
7095
7180
|
instructions=instructions,
|
|
@@ -7209,6 +7294,16 @@ async def spec(
|
|
|
7209
7294
|
help="Name of an LLM model to make available. Can be repeated.",
|
|
7210
7295
|
),
|
|
7211
7296
|
] = ["gpt-5.5"],
|
|
7297
|
+
backend: Annotated[
|
|
7298
|
+
list[str],
|
|
7299
|
+
typer.Option(
|
|
7300
|
+
"--backend",
|
|
7301
|
+
help=(
|
|
7302
|
+
"Process backend to make available. Can be repeated. "
|
|
7303
|
+
"Supported: llm, codex, chat."
|
|
7304
|
+
),
|
|
7305
|
+
),
|
|
7306
|
+
] = [],
|
|
7212
7307
|
image_generation: Annotated[
|
|
7213
7308
|
Optional[str], typer.Option(..., help="Name of an image gen model")
|
|
7214
7309
|
] = None,
|
|
@@ -7493,6 +7588,7 @@ async def spec(
|
|
|
7493
7588
|
runtime=runtime,
|
|
7494
7589
|
normalized_tool_options=normalized_tool_options,
|
|
7495
7590
|
model=model,
|
|
7591
|
+
backend=backend,
|
|
7496
7592
|
rule=rule,
|
|
7497
7593
|
rules_file=rules_file,
|
|
7498
7594
|
instructions=instructions,
|
|
@@ -7628,6 +7724,16 @@ async def deploy(
|
|
|
7628
7724
|
help="Name of an LLM model to make available. Can be repeated.",
|
|
7629
7725
|
),
|
|
7630
7726
|
] = ["gpt-5.5"],
|
|
7727
|
+
backend: Annotated[
|
|
7728
|
+
list[str],
|
|
7729
|
+
typer.Option(
|
|
7730
|
+
"--backend",
|
|
7731
|
+
help=(
|
|
7732
|
+
"Process backend to make available. Can be repeated. "
|
|
7733
|
+
"Supported: llm, codex, chat."
|
|
7734
|
+
),
|
|
7735
|
+
),
|
|
7736
|
+
] = [],
|
|
7631
7737
|
image_generation: Annotated[
|
|
7632
7738
|
Optional[str], typer.Option(..., help="Name of an image gen model")
|
|
7633
7739
|
] = None,
|
|
@@ -7919,6 +8025,7 @@ async def deploy(
|
|
|
7919
8025
|
runtime=runtime,
|
|
7920
8026
|
normalized_tool_options=normalized_tool_options,
|
|
7921
8027
|
model=model,
|
|
8028
|
+
backend=backend,
|
|
7922
8029
|
rule=rule,
|
|
7923
8030
|
rules_file=rules_file,
|
|
7924
8031
|
instructions=instructions,
|
|
@@ -10118,6 +10225,16 @@ async def run(
|
|
|
10118
10225
|
help="Name of an LLM model to make available. Can be repeated.",
|
|
10119
10226
|
),
|
|
10120
10227
|
] = ["gpt-5.5"],
|
|
10228
|
+
backend: Annotated[
|
|
10229
|
+
list[str],
|
|
10230
|
+
typer.Option(
|
|
10231
|
+
"--backend",
|
|
10232
|
+
help=(
|
|
10233
|
+
"Process backend to make available. Can be repeated. "
|
|
10234
|
+
"Supported: llm, codex, chat."
|
|
10235
|
+
),
|
|
10236
|
+
),
|
|
10237
|
+
] = [],
|
|
10121
10238
|
image_generation: Annotated[
|
|
10122
10239
|
Optional[str], typer.Option(..., help="Name of an image gen model")
|
|
10123
10240
|
] = None,
|
|
@@ -10477,7 +10594,12 @@ async def run(
|
|
|
10477
10594
|
else:
|
|
10478
10595
|
room_name = _require_resolved_room(resolve_room(room))
|
|
10479
10596
|
|
|
10480
|
-
|
|
10597
|
+
selected_backends = _normalize_process_backend_options(backend)
|
|
10598
|
+
resolved_process_models = _process_models_for_backend_option(
|
|
10599
|
+
model=model,
|
|
10600
|
+
backend=selected_backends,
|
|
10601
|
+
)
|
|
10602
|
+
selected_model_specs = _normalize_process_model_specs(resolved_process_models)
|
|
10481
10603
|
has_llm_backend = any(spec.backend == "llm" for spec in selected_model_specs)
|
|
10482
10604
|
|
|
10483
10605
|
key = None if no_room else await resolve_key(project_id=project_id, key=key)
|
|
@@ -10555,7 +10677,8 @@ async def run(
|
|
|
10555
10677
|
meshagent_project_id=meshagent_project_id,
|
|
10556
10678
|
runtime=runtime,
|
|
10557
10679
|
normalized_tool_options=normalized_tool_options,
|
|
10558
|
-
model=
|
|
10680
|
+
model=resolved_process_models,
|
|
10681
|
+
backend=selected_backends,
|
|
10559
10682
|
rule=rule,
|
|
10560
10683
|
rules_file=rules_file,
|
|
10561
10684
|
instructions=instructions,
|
|
@@ -10620,7 +10743,7 @@ async def run(
|
|
|
10620
10743
|
process_tui_kwargs: dict[str, Any] = {
|
|
10621
10744
|
"bot": bot,
|
|
10622
10745
|
"room": client,
|
|
10623
|
-
"model":
|
|
10746
|
+
"model": resolved_process_models,
|
|
10624
10747
|
"thread_path": thread_path,
|
|
10625
10748
|
"thread_storage": resolved_thread_storage,
|
|
10626
10749
|
"agent_name": agent_name,
|