134 lines
3.7 KiB
Python
134 lines
3.7 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
from collections.abc import Callable
|
|
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
|
|
def _ensure_src_on_path() -> None:
|
|
repo_root = Path(__file__).resolve().parents[1]
|
|
src_path = repo_root / "src"
|
|
if str(src_path) not in sys.path:
|
|
sys.path.insert(0, str(src_path))
|
|
|
|
|
|
def run_env_defaults() -> None:
|
|
_ensure_src_on_path()
|
|
from cleveragents.config.settings import Settings, get_settings
|
|
from cleveragents.providers.registry import (
|
|
get_provider_registry,
|
|
reset_provider_registry,
|
|
)
|
|
|
|
Settings._instance = None # type: ignore[attr-defined]
|
|
reset_provider_registry()
|
|
|
|
settings = get_settings()
|
|
registry = get_provider_registry(settings)
|
|
provider = registry.create_ai_provider()
|
|
assert provider.name == "openai", provider.name
|
|
print(f"registry-openai-ok {provider.model_id}")
|
|
|
|
|
|
def run_cli_override() -> None:
|
|
_ensure_src_on_path()
|
|
from unittest.mock import patch
|
|
|
|
from typer.testing import CliRunner
|
|
|
|
from cleveragents.cli.main import app, ensure_cli_commands_registered
|
|
|
|
class StubPlanService:
|
|
def build_plan(
|
|
self,
|
|
project: object,
|
|
progress_callback: Callable[[int], None] | None = None,
|
|
actor: str | None = None,
|
|
) -> list[object]:
|
|
if progress_callback:
|
|
progress_callback(100)
|
|
|
|
assert actor == "openrouter/anthropic/claude-sonnet", actor
|
|
|
|
provider_name: str | None = None
|
|
model_name: str | None = None
|
|
|
|
if actor:
|
|
parts = actor.split("/", 1)
|
|
if parts:
|
|
provider_name = parts[0]
|
|
if len(parts) > 1:
|
|
model_name = parts[1]
|
|
|
|
print(f"actor-selected {actor}")
|
|
if provider_name and model_name:
|
|
print(f"provider-selected {provider_name} {model_name}")
|
|
return []
|
|
|
|
class StubProjectService:
|
|
def get_current_project(self): # type: ignore[no-untyped-def]
|
|
return SimpleNamespace(name="robot-project", id=1)
|
|
|
|
class StubContainer:
|
|
def __init__(self) -> None:
|
|
self._plan = StubPlanService()
|
|
self._project = StubProjectService()
|
|
|
|
def plan_service(self) -> StubPlanService:
|
|
return self._plan
|
|
|
|
def project_service(self) -> StubProjectService:
|
|
return self._project
|
|
|
|
runner = CliRunner()
|
|
stub_container = StubContainer()
|
|
env = {
|
|
"OPENROUTER_API_KEY": os.environ.get(
|
|
"OPENROUTER_API_KEY", "robot-openrouter-key"
|
|
)
|
|
}
|
|
|
|
ensure_cli_commands_registered()
|
|
|
|
with patch(
|
|
"cleveragents.application.container.get_container", return_value=stub_container
|
|
):
|
|
result = runner.invoke(
|
|
app,
|
|
[
|
|
"plan",
|
|
"build",
|
|
"--actor",
|
|
"openrouter/anthropic/claude-sonnet",
|
|
],
|
|
env=env,
|
|
catch_exceptions=False,
|
|
)
|
|
|
|
if result.exception:
|
|
raise result.exception
|
|
if result.exit_code != 0:
|
|
raise SystemExit(result.stdout)
|
|
if "provider-selected openrouter anthropic/claude-sonnet" not in result.stdout:
|
|
raise AssertionError("Missing provider log line")
|
|
|
|
print("cli-actor-selection-ok")
|
|
|
|
|
|
def main() -> None:
|
|
commands: dict[str, Callable[[], None]] = {
|
|
"env-defaults": run_env_defaults,
|
|
"cli-override": run_cli_override,
|
|
}
|
|
if len(sys.argv) < 2 or sys.argv[1] not in commands:
|
|
raise SystemExit(
|
|
"Usage: helper_provider_registry.py [env-defaults|cli-override]"
|
|
)
|
|
commands[sys.argv[1]]()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|