2025-02-14 17:46:58 -08:00
|
|
|
import subprocess
|
|
|
|
|
import json
|
|
|
|
|
import sys
|
2025-02-14 19:28:10 -08:00
|
|
|
import requests
|
2025-02-14 17:46:58 -08:00
|
|
|
|
2025-12-25 14:55:29 -08:00
|
|
|
from planoai.consts import (
|
2025-12-23 18:37:58 -08:00
|
|
|
PLANO_DOCKER_IMAGE,
|
|
|
|
|
PLANO_DOCKER_NAME,
|
2025-05-19 09:59:22 -07:00
|
|
|
)
|
2025-12-25 14:55:29 -08:00
|
|
|
from planoai.utils import getLogger
|
2025-02-14 17:46:58 -08:00
|
|
|
|
|
|
|
|
log = getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def docker_container_status(container: str) -> str:
|
|
|
|
|
result = subprocess.run(
|
2025-02-28 17:03:21 -08:00
|
|
|
["docker", "inspect", "--type=container", container],
|
|
|
|
|
capture_output=True,
|
|
|
|
|
text=True,
|
|
|
|
|
check=False,
|
2025-02-14 17:46:58 -08:00
|
|
|
)
|
|
|
|
|
if result.returncode != 0:
|
|
|
|
|
return "not found"
|
2025-02-20 16:19:48 -08:00
|
|
|
|
|
|
|
|
container_status = json.loads(result.stdout)[0]
|
|
|
|
|
return container_status.get("State", {}).get("Status", "")
|
2025-02-14 17:46:58 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def docker_stop_container(container: str) -> str:
|
|
|
|
|
result = subprocess.run(
|
|
|
|
|
["docker", "stop", container], capture_output=True, text=True, check=False
|
|
|
|
|
)
|
|
|
|
|
return result.returncode
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def docker_remove_container(container: str) -> str:
|
|
|
|
|
result = subprocess.run(
|
2026-02-10 13:17:43 -08:00
|
|
|
["docker", "rm", "-f", container], capture_output=True, text=True, check=False
|
2025-02-14 17:46:58 -08:00
|
|
|
)
|
|
|
|
|
return result.returncode
|
|
|
|
|
|
|
|
|
|
|
2025-12-23 18:37:58 -08:00
|
|
|
def docker_start_plano_detached(
|
Rename all arch references to plano (#745)
* Rename all arch references to plano across the codebase
Complete rebrand from "Arch"/"archgw" to "Plano" including:
- Config files: arch_config_schema.yaml, workflow, demo configs
- Environment variables: ARCH_CONFIG_* → PLANO_CONFIG_*
- Python CLI: variables, functions, file paths, docker mounts
- Rust crates: config paths, log messages, metadata keys
- Docker/build: Dockerfile, supervisord, .dockerignore, .gitignore
- Docker Compose: volume mounts and env vars across all demos/tests
- GitHub workflows: job/step names
- Shell scripts: log messages
- Demos: Python code, READMEs, VS Code configs, Grafana dashboard
- Docs: RST includes, code comments, config references
- Package metadata: package.json, pyproject.toml, uv.lock
External URLs (docs.archgw.com, github.com/katanemo/archgw) left as-is.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update remaining arch references in docs
- Rename RST cross-reference labels: arch_access_logging, arch_overview_tracing, arch_overview_threading → plano_*
- Update label references in request_lifecycle.rst
- Rename arch_config_state_storage_example.yaml → plano_config_state_storage_example.yaml
- Update config YAML comments: "Arch creates/uses" → "Plano creates/uses"
- Update "the Arch gateway" → "the Plano gateway" in configuration_reference.rst
- Update arch_config_schema.yaml reference in provider_models.py
- Rename arch_agent_router → plano_agent_router in config example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix remaining arch references found in second pass
- config/docker-compose.dev.yaml: ARCH_CONFIG_FILE → PLANO_CONFIG_FILE,
arch_config.yaml → plano_config.yaml, archgw_logs → plano_logs
- config/test_passthrough.yaml: container mount path
- tests/e2e/docker-compose.yaml: source file path (was still arch_config.yaml)
- cli/planoai/core.py: comment and log message
- crates/brightstaff/src/tracing/constants.rs: doc comment
- tests/{e2e,archgw}/common.py: get_arch_messages → get_plano_messages,
arch_state/arch_messages variables renamed
- tests/{e2e,archgw}/test_prompt_gateway.py: updated imports and usages
- demos/shared/test_runner/{common,test_demos}.py: same renames
- tests/e2e/test_model_alias_routing.py: docstring
- .dockerignore: archgw_modelserver → plano_modelserver
- demos/use_cases/claude_code_router/pretty_model_resolution.sh: container name
Note: x-arch-* HTTP header values and Rust constant names intentionally
preserved for backwards compatibility with existing deployments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:16:56 -08:00
|
|
|
plano_config_file: str,
|
2025-02-14 19:28:10 -08:00
|
|
|
env: dict,
|
2025-10-14 14:01:11 -07:00
|
|
|
gateway_ports: list[int],
|
2025-02-14 17:46:58 -08:00
|
|
|
) -> str:
|
|
|
|
|
env_args = [item for key, value in env.items() for item in ["-e", f"{key}={value}"]]
|
|
|
|
|
|
2025-02-14 19:28:10 -08:00
|
|
|
port_mappings = [
|
2026-02-10 13:17:43 -08:00
|
|
|
"12001:12001",
|
2025-05-23 09:37:15 -07:00
|
|
|
"19901:9901",
|
2025-02-14 19:28:10 -08:00
|
|
|
]
|
2025-10-14 14:01:11 -07:00
|
|
|
|
|
|
|
|
for port in gateway_ports:
|
|
|
|
|
port_mappings.append(f"{port}:{port}")
|
|
|
|
|
|
2025-02-14 17:46:58 -08:00
|
|
|
port_mappings_args = [item for port in port_mappings for item in ("-p", port)]
|
|
|
|
|
|
|
|
|
|
volume_mappings = [
|
Rename all arch references to plano (#745)
* Rename all arch references to plano across the codebase
Complete rebrand from "Arch"/"archgw" to "Plano" including:
- Config files: arch_config_schema.yaml, workflow, demo configs
- Environment variables: ARCH_CONFIG_* → PLANO_CONFIG_*
- Python CLI: variables, functions, file paths, docker mounts
- Rust crates: config paths, log messages, metadata keys
- Docker/build: Dockerfile, supervisord, .dockerignore, .gitignore
- Docker Compose: volume mounts and env vars across all demos/tests
- GitHub workflows: job/step names
- Shell scripts: log messages
- Demos: Python code, READMEs, VS Code configs, Grafana dashboard
- Docs: RST includes, code comments, config references
- Package metadata: package.json, pyproject.toml, uv.lock
External URLs (docs.archgw.com, github.com/katanemo/archgw) left as-is.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update remaining arch references in docs
- Rename RST cross-reference labels: arch_access_logging, arch_overview_tracing, arch_overview_threading → plano_*
- Update label references in request_lifecycle.rst
- Rename arch_config_state_storage_example.yaml → plano_config_state_storage_example.yaml
- Update config YAML comments: "Arch creates/uses" → "Plano creates/uses"
- Update "the Arch gateway" → "the Plano gateway" in configuration_reference.rst
- Update arch_config_schema.yaml reference in provider_models.py
- Rename arch_agent_router → plano_agent_router in config example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix remaining arch references found in second pass
- config/docker-compose.dev.yaml: ARCH_CONFIG_FILE → PLANO_CONFIG_FILE,
arch_config.yaml → plano_config.yaml, archgw_logs → plano_logs
- config/test_passthrough.yaml: container mount path
- tests/e2e/docker-compose.yaml: source file path (was still arch_config.yaml)
- cli/planoai/core.py: comment and log message
- crates/brightstaff/src/tracing/constants.rs: doc comment
- tests/{e2e,archgw}/common.py: get_arch_messages → get_plano_messages,
arch_state/arch_messages variables renamed
- tests/{e2e,archgw}/test_prompt_gateway.py: updated imports and usages
- demos/shared/test_runner/{common,test_demos}.py: same renames
- tests/e2e/test_model_alias_routing.py: docstring
- .dockerignore: archgw_modelserver → plano_modelserver
- demos/use_cases/claude_code_router/pretty_model_resolution.sh: container name
Note: x-arch-* HTTP header values and Rust constant names intentionally
preserved for backwards compatibility with existing deployments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:16:56 -08:00
|
|
|
f"{plano_config_file}:/app/plano_config.yaml:ro",
|
2025-02-14 17:46:58 -08:00
|
|
|
]
|
|
|
|
|
volume_mappings_args = [
|
|
|
|
|
item for volume in volume_mappings for item in ("-v", volume)
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
options = [
|
|
|
|
|
"docker",
|
|
|
|
|
"run",
|
|
|
|
|
"-d",
|
|
|
|
|
"--name",
|
2025-12-23 18:37:58 -08:00
|
|
|
PLANO_DOCKER_NAME,
|
2025-02-14 17:46:58 -08:00
|
|
|
*port_mappings_args,
|
|
|
|
|
*volume_mappings_args,
|
|
|
|
|
*env_args,
|
|
|
|
|
"--add-host",
|
|
|
|
|
"host.docker.internal:host-gateway",
|
2025-12-23 18:37:58 -08:00
|
|
|
PLANO_DOCKER_IMAGE,
|
2025-02-14 17:46:58 -08:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
result = subprocess.run(options, capture_output=True, text=True, check=False)
|
|
|
|
|
return result.returncode, result.stdout, result.stderr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def health_check_endpoint(endpoint: str) -> bool:
|
|
|
|
|
try:
|
|
|
|
|
response = requests.get(endpoint)
|
|
|
|
|
if response.status_code == 200:
|
|
|
|
|
return True
|
|
|
|
|
except requests.RequestException as e:
|
|
|
|
|
pass
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
2025-12-23 18:37:58 -08:00
|
|
|
def stream_gateway_logs(follow, service="plano"):
|
2025-02-14 17:46:58 -08:00
|
|
|
"""
|
2025-12-23 18:37:58 -08:00
|
|
|
Stream logs from the plano gateway service.
|
2025-02-14 17:46:58 -08:00
|
|
|
"""
|
2025-12-23 18:37:58 -08:00
|
|
|
log.info("Logs from plano gateway service.")
|
2025-02-14 17:46:58 -08:00
|
|
|
|
2025-02-20 16:19:48 -08:00
|
|
|
options = ["docker", "logs"]
|
2025-02-14 17:46:58 -08:00
|
|
|
if follow:
|
|
|
|
|
options.append("-f")
|
2025-05-19 09:59:22 -07:00
|
|
|
options.append(service)
|
2025-02-14 17:46:58 -08:00
|
|
|
try:
|
|
|
|
|
# Run `docker-compose logs` to stream logs from the gateway service
|
|
|
|
|
subprocess.run(
|
|
|
|
|
options,
|
|
|
|
|
check=True,
|
|
|
|
|
stdout=sys.stdout,
|
|
|
|
|
stderr=sys.stderr,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
|
|
|
log.info(f"Failed to stream logs: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
Rename all arch references to plano (#745)
* Rename all arch references to plano across the codebase
Complete rebrand from "Arch"/"archgw" to "Plano" including:
- Config files: arch_config_schema.yaml, workflow, demo configs
- Environment variables: ARCH_CONFIG_* → PLANO_CONFIG_*
- Python CLI: variables, functions, file paths, docker mounts
- Rust crates: config paths, log messages, metadata keys
- Docker/build: Dockerfile, supervisord, .dockerignore, .gitignore
- Docker Compose: volume mounts and env vars across all demos/tests
- GitHub workflows: job/step names
- Shell scripts: log messages
- Demos: Python code, READMEs, VS Code configs, Grafana dashboard
- Docs: RST includes, code comments, config references
- Package metadata: package.json, pyproject.toml, uv.lock
External URLs (docs.archgw.com, github.com/katanemo/archgw) left as-is.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update remaining arch references in docs
- Rename RST cross-reference labels: arch_access_logging, arch_overview_tracing, arch_overview_threading → plano_*
- Update label references in request_lifecycle.rst
- Rename arch_config_state_storage_example.yaml → plano_config_state_storage_example.yaml
- Update config YAML comments: "Arch creates/uses" → "Plano creates/uses"
- Update "the Arch gateway" → "the Plano gateway" in configuration_reference.rst
- Update arch_config_schema.yaml reference in provider_models.py
- Rename arch_agent_router → plano_agent_router in config example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix remaining arch references found in second pass
- config/docker-compose.dev.yaml: ARCH_CONFIG_FILE → PLANO_CONFIG_FILE,
arch_config.yaml → plano_config.yaml, archgw_logs → plano_logs
- config/test_passthrough.yaml: container mount path
- tests/e2e/docker-compose.yaml: source file path (was still arch_config.yaml)
- cli/planoai/core.py: comment and log message
- crates/brightstaff/src/tracing/constants.rs: doc comment
- tests/{e2e,archgw}/common.py: get_arch_messages → get_plano_messages,
arch_state/arch_messages variables renamed
- tests/{e2e,archgw}/test_prompt_gateway.py: updated imports and usages
- demos/shared/test_runner/{common,test_demos}.py: same renames
- tests/e2e/test_model_alias_routing.py: docstring
- .dockerignore: archgw_modelserver → plano_modelserver
- demos/use_cases/claude_code_router/pretty_model_resolution.sh: container name
Note: x-arch-* HTTP header values and Rust constant names intentionally
preserved for backwards compatibility with existing deployments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:16:56 -08:00
|
|
|
def docker_validate_plano_schema(plano_config_file):
|
2026-02-09 13:33:27 -08:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
env = os.environ.copy()
|
|
|
|
|
env.pop("PATH", None)
|
|
|
|
|
env_args = [item for key, value in env.items() for item in ["-e", f"{key}={value}"]]
|
|
|
|
|
|
2025-02-14 17:46:58 -08:00
|
|
|
result = subprocess.run(
|
|
|
|
|
[
|
|
|
|
|
"docker",
|
|
|
|
|
"run",
|
|
|
|
|
"--rm",
|
2026-02-09 13:33:27 -08:00
|
|
|
*env_args,
|
2025-02-14 17:46:58 -08:00
|
|
|
"-v",
|
Rename all arch references to plano (#745)
* Rename all arch references to plano across the codebase
Complete rebrand from "Arch"/"archgw" to "Plano" including:
- Config files: arch_config_schema.yaml, workflow, demo configs
- Environment variables: ARCH_CONFIG_* → PLANO_CONFIG_*
- Python CLI: variables, functions, file paths, docker mounts
- Rust crates: config paths, log messages, metadata keys
- Docker/build: Dockerfile, supervisord, .dockerignore, .gitignore
- Docker Compose: volume mounts and env vars across all demos/tests
- GitHub workflows: job/step names
- Shell scripts: log messages
- Demos: Python code, READMEs, VS Code configs, Grafana dashboard
- Docs: RST includes, code comments, config references
- Package metadata: package.json, pyproject.toml, uv.lock
External URLs (docs.archgw.com, github.com/katanemo/archgw) left as-is.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Update remaining arch references in docs
- Rename RST cross-reference labels: arch_access_logging, arch_overview_tracing, arch_overview_threading → plano_*
- Update label references in request_lifecycle.rst
- Rename arch_config_state_storage_example.yaml → plano_config_state_storage_example.yaml
- Update config YAML comments: "Arch creates/uses" → "Plano creates/uses"
- Update "the Arch gateway" → "the Plano gateway" in configuration_reference.rst
- Update arch_config_schema.yaml reference in provider_models.py
- Rename arch_agent_router → plano_agent_router in config example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix remaining arch references found in second pass
- config/docker-compose.dev.yaml: ARCH_CONFIG_FILE → PLANO_CONFIG_FILE,
arch_config.yaml → plano_config.yaml, archgw_logs → plano_logs
- config/test_passthrough.yaml: container mount path
- tests/e2e/docker-compose.yaml: source file path (was still arch_config.yaml)
- cli/planoai/core.py: comment and log message
- crates/brightstaff/src/tracing/constants.rs: doc comment
- tests/{e2e,archgw}/common.py: get_arch_messages → get_plano_messages,
arch_state/arch_messages variables renamed
- tests/{e2e,archgw}/test_prompt_gateway.py: updated imports and usages
- demos/shared/test_runner/{common,test_demos}.py: same renames
- tests/e2e/test_model_alias_routing.py: docstring
- .dockerignore: archgw_modelserver → plano_modelserver
- demos/use_cases/claude_code_router/pretty_model_resolution.sh: container name
Note: x-arch-* HTTP header values and Rust constant names intentionally
preserved for backwards compatibility with existing deployments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 15:16:56 -08:00
|
|
|
f"{plano_config_file}:/app/plano_config.yaml:ro",
|
2025-02-14 17:46:58 -08:00
|
|
|
"--entrypoint",
|
|
|
|
|
"python",
|
2025-12-23 18:37:58 -08:00
|
|
|
PLANO_DOCKER_IMAGE,
|
2025-10-14 14:01:11 -07:00
|
|
|
"-m",
|
2025-12-25 14:55:29 -08:00
|
|
|
"planoai.config_generator",
|
2025-02-14 17:46:58 -08:00
|
|
|
],
|
|
|
|
|
capture_output=True,
|
|
|
|
|
text=True,
|
|
|
|
|
check=False,
|
|
|
|
|
)
|
|
|
|
|
return result.returncode, result.stdout, result.stderr
|