coderouter-cli 2.8.1__tar.gz → 2.9.1__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.
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/CHANGELOG.md +168 -1
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/PKG-INFO +5 -3
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/README.en.md +4 -2
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/README.md +4 -2
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/registry.py +31 -48
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/schemas.py +555 -8
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/doctor.py +58 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/app.py +29 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/launcher_routes.py +476 -147
- coderouter_cli-2.9.1/coderouter/launcher_swap.py +466 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/fallback.py +225 -5
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/README.en.md +8 -3
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/README.md +10 -4
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/external-agents.en.md +32 -4
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/external-agents.md +32 -4
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/agent-cli-plugin-extraction.md +5 -1
- coderouter_cli-2.9.1/docs/designs/launcher-model-swap.md +556 -0
- coderouter_cli-2.9.1/docs/guides/subagent-routing.en.md +387 -0
- coderouter_cli-2.9.1/docs/guides/subagent-routing.md +387 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/README.md +2 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers-agent-cli.yaml +35 -6
- coderouter_cli-2.9.1/examples/providers.swap.yaml +121 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/pyproject.toml +1 -1
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_agent_cli.py +9 -6
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor.py +95 -0
- coderouter_cli-2.9.1/tests/test_launcher_readiness_restart.py +701 -0
- coderouter_cli-2.9.1/tests/test_launcher_swap.py +782 -0
- coderouter_cli-2.9.1/tests/test_launcher_swap_review.py +488 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugin_adapter.py +40 -49
- coderouter_cli-2.8.1/coderouter/adapters/agent_cli.py +0 -1168
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/.gitignore +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/LICENSE +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cli.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/cost.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/errors.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/logging.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher-quickstart.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/launcher.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/external-agents-adapter.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/orchestration-companion.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/security.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/.env.example +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.llamacpp-vllm.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/examples/providers.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/__init__.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/conftest.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_config.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_errors.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.8.1 → coderouter_cli-2.9.1}/tests/test_translation_reverse.py +0 -0
|
@@ -9,9 +9,176 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.9.1] — 2026-07-12 (launcher model swap Phase 1 — llama-swap-style on-demand models)
|
|
13
|
+
|
|
14
|
+
**New: `launcher.swap`** — an opt-in, dependency-free equivalent of
|
|
15
|
+
[llama-swap](https://github.com/mostlygeek/llama-swap)'s core loop, built on
|
|
16
|
+
the existing embedded Launcher. Declare a static model catalog and CodeRouter
|
|
17
|
+
will **spawn the backing `llama-server` on demand** when a request names the
|
|
18
|
+
model, **hold the request until the backend passes its readiness probe**, and
|
|
19
|
+
**auto-unload the process after an idle TTL** (`swap-unload`, memory returns
|
|
20
|
+
to zero). Only cataloged models can ever be spawned; `model_path` is resolved
|
|
21
|
+
against `launcher.model_dirs` both at config load (fail-fast) and again at
|
|
22
|
+
spawn (defense in depth). Design + as-built record:
|
|
23
|
+
`docs/designs/launcher-model-swap.md`. Sample: `examples/providers.swap.yaml`.
|
|
24
|
+
Verified end-to-end on macOS (M3 Max, Metal): cold spawn → warm reuse →
|
|
25
|
+
catalog-miss fallthrough → TTL unload → respawn, all green
|
|
26
|
+
(`_run/swap-test/` kit).
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- **`launcher.swap` config block** (`LauncherSwapConfig` / `SwapModelSpec`):
|
|
31
|
+
`enabled` (default `false` — zero impact until opted in), global
|
|
32
|
+
`ttl_seconds` (default 1800; `null` = never, `0` = unload at last release),
|
|
33
|
+
`readiness_timeout_s`, `sweep_interval_s`, `inject_auto_router_rules`, and
|
|
34
|
+
the static `models:` catalog (`name` / `backend` / `model_path` / fixed
|
|
35
|
+
`port` recommended / `num_ctx` / `extra_args` / speculative fields). Phase 2
|
|
36
|
+
fields (`group`, `est_weights_gb`, `memory_budget_gb`, `max_loaded`) are
|
|
37
|
+
schema-declared but not yet acted on.
|
|
38
|
+
- **`SwapManager`** (`coderouter/launcher_swap.py`): per-model
|
|
39
|
+
`asyncio.Lock` + lease accounting — concurrent requests for the same model
|
|
40
|
+
trigger exactly one spawn; streaming responses hold a lease for their whole
|
|
41
|
+
lifetime (a mid-stream process is never TTL-evicted); a failed spawn resets
|
|
42
|
+
to idle (no poisoning) and the next request retries.
|
|
43
|
+
- **Auto-generated routing**: with `default_profile: auto` and no explicit
|
|
44
|
+
`auto_router:` block, one exact-match rule per catalog model
|
|
45
|
+
(`id: swap:<name>`, `model_pattern = re.escape(name)`) is merged **ahead of
|
|
46
|
+
the bundled heuristics** (an explicitly named swap model beats
|
|
47
|
+
code-fence/image heuristics) while keeping the bundled rules and their
|
|
48
|
+
fallthrough intact. A user-declared `auto_router:` block keeps its full-
|
|
49
|
+
replacement semantics — swap rules are appended after user rules.
|
|
50
|
+
- **`FallbackEngine.deregister_provider`** — the long-missing inverse of
|
|
51
|
+
`register_provider`; TTL unload now removes the provider from its chain,
|
|
52
|
+
drops the cached adapter (closing its HTTP client), and leaves no dead-port
|
|
53
|
+
entries behind.
|
|
54
|
+
- **Launcher readiness gating** — spawned processes now report a new
|
|
55
|
+
`"loading"` status and are only registered as providers **after** the
|
|
56
|
+
backend passes a readiness probe (`GET /health` for llama.cpp/vllm, TCP
|
|
57
|
+
connect fallback otherwise; `launcher.readiness_timeout_s`, default 300 s).
|
|
58
|
+
Requests can no longer race a model that is still loading.
|
|
59
|
+
*Behavior change*: `POST /api/launcher/start` no longer performs the
|
|
60
|
+
provider sync synchronously (`provider_sync` in the response is always
|
|
61
|
+
`null`); watch `/api/launcher/processes` or the `provider sync:` log line.
|
|
62
|
+
- **Launcher auto-restart (opt-in)** — `launcher.auto_restart: true` enables
|
|
63
|
+
crash recovery with exponential backoff (`auto_restart_max_attempts`,
|
|
64
|
+
default 3); intentional stops (Stop button, shutdown, TTL unload) are
|
|
65
|
+
marked via `ManagedProcess.stopping` and never trigger a restart. Default
|
|
66
|
+
**off**, matching the opt-in stance of `restart_command`. Swap-managed
|
|
67
|
+
processes are excluded — `SwapManager` is their sole supervisor.
|
|
68
|
+
- Tests: `tests/test_launcher_readiness_restart.py` (21),
|
|
69
|
+
`tests/test_launcher_swap.py` (31), `tests/test_launcher_swap_review.py`
|
|
70
|
+
(15 regression tests from the adversarial review). Full suite: 1725 passed.
|
|
71
|
+
|
|
72
|
+
### Fixed
|
|
73
|
+
|
|
74
|
+
- **Launcher-spawned providers were registered before the model finished
|
|
75
|
+
loading**, so early requests failed against a half-up backend (readiness
|
|
76
|
+
gating above).
|
|
77
|
+
- **Crashed launcher processes stayed `status="error"` forever** with no
|
|
78
|
+
recovery path other than manual restart (auto-restart above).
|
|
79
|
+
- Adversarial-review fixes folded into the initial swap release: enabling
|
|
80
|
+
swap no longer silently discards the bundled auto-router rules; TTL unload
|
|
81
|
+
no longer leaks the generic `launcher-<backend>-<port>` provider (generic
|
|
82
|
+
registration is suppressed for swap-managed processes); swap processes are
|
|
83
|
+
exempt from launcher auto-restart (no dueling supervisors on a fixed
|
|
84
|
+
port); on-demand spawn keys off the **resolved profile**, not the raw
|
|
85
|
+
model string (no wasted spawns when routing goes elsewhere, and
|
|
86
|
+
catalog-mismatched model names hitting a swap profile still take a lease
|
|
87
|
+
so they cannot be unloaded mid-flight).
|
|
88
|
+
|
|
89
|
+
### Docs
|
|
90
|
+
|
|
91
|
+
- `docs/guides/subagent-routing.md` / `.en.md` — §6.1 measured-verification
|
|
92
|
+
results updated against the 2026-07-11/12 E2E artifacts (3/4 sub-agent
|
|
93
|
+
round trip + rerun evidence, `c6096ed` grok-fix reference, expected-log
|
|
94
|
+
notes), new §5(e) on running the main orchestrator on a 9B-class local
|
|
95
|
+
model (tool-support prerequisite, 9b→30b fallback chain, autocompact
|
|
96
|
+
caveat), §7 UNCONFIRMED items resolved as measured.
|
|
97
|
+
- `docs/designs/launcher-model-swap.md` — full design (phases, concurrency
|
|
98
|
+
model, security posture, §10 review decisions, §10.5 as-built record).
|
|
99
|
+
- `examples/providers.swap.yaml` + `examples/README.md` index row.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## [v2.9.0] — 2026-07-11 (agent_cli extraction Phase 2c — in-core adapter removed)
|
|
104
|
+
|
|
105
|
+
**PR #73**. **BREAKING.** Phase 2c of the agent_cli plugin extraction
|
|
106
|
+
(`docs/designs/agent-cli-plugin-extraction.md` §5/§7): the in-core
|
|
107
|
+
`agent_cli` adapter branch is **removed** from `coderouter/adapters/registry.py`.
|
|
108
|
+
`kind: agent_cli` now resolves exclusively through the external plugin
|
|
109
|
+
**`coderouter-plugin-agents`** — the Phase 2b grace period, during which the
|
|
110
|
+
in-core copy still won resolution, has ended.
|
|
111
|
+
|
|
112
|
+
**Who is affected**: anyone with one or more `kind: agent_cli` providers in
|
|
113
|
+
`providers.yaml`. If the plugin isn't installed and enabled, `coderouter
|
|
114
|
+
serve` now fails at startup.
|
|
115
|
+
|
|
116
|
+
**What to do**: install the plugin and enable it —
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
uv pip install "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
|
|
120
|
+
# or: pip install "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
|
|
121
|
+
# uv-tool installs of coderouter-cli need the plugin in the same tool env:
|
|
122
|
+
# uv tool install coderouter-cli \
|
|
123
|
+
# --with "coderouter-plugin-agents @ git+https://github.com/zephel01/coderouter-plugin-agents"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
plugins:
|
|
128
|
+
enabled: [agents]
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**What is unchanged**: existing `kind: agent_cli` provider entries and the
|
|
132
|
+
`agent_cli:` sub-config (`AgentCliConfig` — schema, fields, defaults) need no
|
|
133
|
+
edits; they remain a stable Core contract per the design's §4.4 case (b).
|
|
134
|
+
Per-CLI behavior (claude/codex/antigravity/grok argv, auth, output parsing)
|
|
135
|
+
is unaffected — only the adapter's Core-vs-plugin wiring changed.
|
|
136
|
+
|
|
137
|
+
**Safety nets**: a `kind: agent_cli` provider without the plugin installed
|
|
138
|
+
and enabled now fails `serve` at startup with a targeted migration hint
|
|
139
|
+
(install command + `plugins.enabled` snippet) rather than a generic
|
|
140
|
+
unknown-kind error, and `coderouter doctor` independently emits a
|
|
141
|
+
config-level warning with the same fix snippet for configs that would hit
|
|
142
|
+
this at startup.
|
|
143
|
+
|
|
144
|
+
### Removed
|
|
145
|
+
|
|
146
|
+
- **In-core `agent_cli` adapter** (`coderouter/adapters/agent_cli.py`, ~1181
|
|
147
|
+
lines) and the `build_adapter` in-core branch for `kind == "agent_cli"`
|
|
148
|
+
(`coderouter/adapters/registry.py`) — the adapter body, fully moved to
|
|
149
|
+
`coderouter-plugin-agents` 0.1.0 in Phase 2b, is deleted from Core. `kind:
|
|
150
|
+
agent_cli` now resolves only via the plugin-provided-kind lookup path.
|
|
151
|
+
- **`agent-cli-in-core-deprecated` warning** (introduced in Phase 2b,
|
|
152
|
+
`docs/designs/agent-cli-plugin-extraction.md` §5.1) — removed along with
|
|
153
|
+
the in-core branch it guarded; there is nothing left for it to warn about.
|
|
154
|
+
|
|
155
|
+
### Added
|
|
156
|
+
|
|
157
|
+
- **`coderouter doctor` migration check** — detects a config with one or
|
|
158
|
+
more `kind: agent_cli` providers where `plugins.enabled` does not include
|
|
159
|
+
`agents` (or the plugin isn't installed/discoverable), and emits a
|
|
160
|
+
config-level warning with a ready-to-paste fix snippet
|
|
161
|
+
(`plugins:\n enabled: [agents]` plus the install command).
|
|
162
|
+
- **Targeted unknown-kind / migration hint at `serve` startup** — when
|
|
163
|
+
`build_adapter` cannot resolve `kind: agent_cli` (plugin missing or not
|
|
164
|
+
enabled), the raised error now names the specific migration steps (install
|
|
165
|
+
`coderouter-plugin-agents`, add `plugins.enabled: [agents]`) instead of
|
|
166
|
+
the generic "unknown kind" listing used for arbitrary typos.
|
|
167
|
+
|
|
168
|
+
### Changed
|
|
169
|
+
|
|
170
|
+
- **`ProviderConfig` / `AgentCliConfig` docstrings and error text**
|
|
171
|
+
(`coderouter/config/schemas.py`) — updated to state plainly that
|
|
172
|
+
`agent_cli` is plugin-served as of v2.9.0 and that the schema itself is
|
|
173
|
+
unaffected.
|
|
174
|
+
- **`Adapter` plugin Protocol docstrings** (`coderouter/plugins/base.py`) —
|
|
175
|
+
updated to drop transitional Phase 2b language (in-core shadowing,
|
|
176
|
+
deprecation warning) now that `agent_cli` resolves solely through the
|
|
177
|
+
plugin path, same as any other plugin-provided `kind`.
|
|
178
|
+
|
|
12
179
|
## [v2.8.1] — 2026-07-11 (agent_cli moved to coderouter-plugin-agents — Phase 2b)
|
|
13
180
|
|
|
14
|
-
Phase 2b of the agent_cli plugin extraction
|
|
181
|
+
**PR #72**. Phase 2b of the agent_cli plugin extraction
|
|
15
182
|
(`docs/designs/agent-cli-plugin-extraction.md` §4/§5/§7): the adapter body
|
|
16
183
|
and its behavior tests now live in the new external package
|
|
17
184
|
**`coderouter-plugin-agents`** (0.1.0, entry point `coderouter.adapter` →
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.9.1
|
|
4
4
|
Summary: Local-first, free-first, fallback-built-in LLM router. Claude Code / OpenAI compatible.
|
|
5
5
|
Project-URL: Homepage, https://github.com/zephel01/CodeRouter
|
|
6
6
|
Project-URL: Repository, https://github.com/zephel01/CodeRouter
|
|
@@ -66,7 +66,7 @@ Description-Content-Type: text/markdown
|
|
|
66
66
|
## 何ができるか — 30 秒で
|
|
67
67
|
|
|
68
68
|
```
|
|
69
|
-
あなたのエージェント (Claude Code /
|
|
69
|
+
あなたのエージェント (Claude Code / codex / agy)
|
|
70
70
|
│
|
|
71
71
|
▼
|
|
72
72
|
┌─ CodeRouter ─┐
|
|
@@ -141,7 +141,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
141
141
|
| Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
|
|
142
142
|
| Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
|
|
143
143
|
| Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
|
|
144
|
-
| codex /
|
|
144
|
+
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
|
|
145
145
|
| Claude API を直接叩いてて問題ない | 不要 |
|
|
146
146
|
|
|
147
147
|
詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
|
|
@@ -311,6 +311,8 @@ English: [Quickstart](./docs/start/quickstart.en.md) · [Usage guide](./docs/gui
|
|
|
311
311
|
- **テスト**: 1,500+ 本(ランタイム依存 5 個は v1 系から不変)
|
|
312
312
|
- **対応 OS**: macOS (Apple Silicon 推奨) / Linux / Windows WSL2
|
|
313
313
|
- **対応 backend**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
|
|
314
|
+
- **外部エージェント CLI**: `agent_cli` provider として Claude Code / codex / grok / antigravity の4種を束ねて呼び出せる(要 `coderouter-plugin-agents`。詳細 → [external-agents ガイド](./docs/backends/external-agents.md))
|
|
315
|
+
- **プラグイン**: compress / memory / agents の3種を opt-in で追加可能(コアの依存は増えない。一覧・導入方法 → [docs/README.md](./docs/README.md#対応プラグイン--plugins))
|
|
314
316
|
- **ライセンス**: MIT
|
|
315
317
|
|
|
316
318
|
---
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
## What it does — in 30 seconds
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
Your agent (Claude Code /
|
|
24
|
+
Your agent (Claude Code / codex / agy)
|
|
25
25
|
│
|
|
26
26
|
▼
|
|
27
27
|
┌─ CodeRouter ──┐
|
|
@@ -77,7 +77,7 @@ That's it. Claude Code works as usual, but your local Ollama is answering behind
|
|
|
77
77
|
|---|---|
|
|
78
78
|
| Claude Code + local Ollama, tool calling breaks | **Yes** — wire translation + tool repair |
|
|
79
79
|
| Claude Code + local, dies after long sessions | **Helpful** — 6 guards + self-healing |
|
|
80
|
-
| codex /
|
|
80
|
+
| codex / agy + Ollama works fine | Optional — if you want fallback |
|
|
81
81
|
| Using Claude API directly, no issues | Not needed |
|
|
82
82
|
|
|
83
83
|
Full decision matrix → [Do I need CodeRouter?](./docs/start/when-do-i-need-coderouter.en.md)
|
|
@@ -247,6 +247,8 @@ Open `http://localhost:8088/dashboard` while debugging — most issues become vi
|
|
|
247
247
|
- **Tests**: 1,500+ (the 5 runtime deps have never grown since v1)
|
|
248
248
|
- **OS**: macOS (Apple Silicon recommended) / Linux / Windows WSL2
|
|
249
249
|
- **Backends**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
|
|
250
|
+
- **External agent CLIs**: bundle Claude Code / codex / grok / antigravity as a single `agent_cli` provider (requires `coderouter-plugin-agents`; details → [external-agents guide](./docs/backends/external-agents.en.md))
|
|
251
|
+
- **Plugins**: compress / memory / agents, all opt-in with zero impact on core dependencies (list & install → [docs/README.en.md](./docs/README.en.md#plugins))
|
|
250
252
|
- **License**: MIT
|
|
251
253
|
|
|
252
254
|
---
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
## 何ができるか — 30 秒で
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
あなたのエージェント (Claude Code /
|
|
24
|
+
あなたのエージェント (Claude Code / codex / agy)
|
|
25
25
|
│
|
|
26
26
|
▼
|
|
27
27
|
┌─ CodeRouter ─┐
|
|
@@ -96,7 +96,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
96
96
|
| Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
|
|
97
97
|
| Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
|
|
98
98
|
| Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
|
|
99
|
-
| codex /
|
|
99
|
+
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
|
|
100
100
|
| Claude API を直接叩いてて問題ない | 不要 |
|
|
101
101
|
|
|
102
102
|
詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
|
|
@@ -266,6 +266,8 @@ English: [Quickstart](./docs/start/quickstart.en.md) · [Usage guide](./docs/gui
|
|
|
266
266
|
- **テスト**: 1,500+ 本(ランタイム依存 5 個は v1 系から不変)
|
|
267
267
|
- **対応 OS**: macOS (Apple Silicon 推奨) / Linux / Windows WSL2
|
|
268
268
|
- **対応 backend**: Ollama / llama.cpp / LM Studio / vLLM / MLX-LM / OpenRouter / NVIDIA NIM / Anthropic API
|
|
269
|
+
- **外部エージェント CLI**: `agent_cli` provider として Claude Code / codex / grok / antigravity の4種を束ねて呼び出せる(要 `coderouter-plugin-agents`。詳細 → [external-agents ガイド](./docs/backends/external-agents.md))
|
|
270
|
+
- **プラグイン**: compress / memory / agents の3種を opt-in で追加可能(コアの依存は増えない。一覧・導入方法 → [docs/README.md](./docs/README.md#対応プラグイン--plugins))
|
|
269
271
|
- **ライセンス**: MIT
|
|
270
272
|
|
|
271
273
|
---
|
|
@@ -18,12 +18,27 @@ logger = get_logger(__name__)
|
|
|
18
18
|
# in-core kinds, in resolution order. Kept as a tuple (not derived from
|
|
19
19
|
# the if-chain below) so the "Unknown adapter kind" error message and
|
|
20
20
|
# the plugin-shadow guard have a single source of truth.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
|
|
21
|
+
#
|
|
22
|
+
# Phase 2c (docs/designs/agent-cli-plugin-extraction.md §7 row "2c"):
|
|
23
|
+
# "agent_cli" is no longer in this tuple. It is served exclusively by
|
|
24
|
+
# the coderouter-plugin-agents adapter plugin now that the in-core
|
|
25
|
+
# AgentCliAdapter and its build_adapter branch have been removed.
|
|
26
|
+
_IN_CORE_KINDS: tuple[str, ...] = ("openai_compat", "anthropic")
|
|
27
|
+
|
|
28
|
+
# Phase 2c migration hint (docs/designs/agent-cli-plugin-extraction.md
|
|
29
|
+
# §5.2): shown ONLY for kind="agent_cli" when no plugin resolves it, so
|
|
30
|
+
# operators upgrading from pre-2c configs get a targeted fix instead of
|
|
31
|
+
# the generic unknown-kind message.
|
|
32
|
+
_AGENT_CLI_MIGRATION_HINT = (
|
|
33
|
+
"kind='agent_cli' is served by the coderouter-plugin-agents plugin "
|
|
34
|
+
"(Core no longer ships an in-core agent_cli adapter as of Phase 2c). "
|
|
35
|
+
'Install it with: pip install "coderouter-plugin-agents @ '
|
|
36
|
+
'git+https://github.com/zephel01/coderouter-plugin-agents" and add '
|
|
37
|
+
"'agents' to plugins.enabled in providers.yaml, e.g.:\n"
|
|
38
|
+
"plugins:\n"
|
|
39
|
+
" enabled:\n"
|
|
40
|
+
" - agents"
|
|
41
|
+
)
|
|
27
42
|
|
|
28
43
|
|
|
29
44
|
def _plugin_kinds(plugin_registry: PluginRegistry | None) -> list[str]:
|
|
@@ -33,36 +48,6 @@ def _plugin_kinds(plugin_registry: PluginRegistry | None) -> list[str]:
|
|
|
33
48
|
return [factory.kind for factory in plugin_registry.adapters]
|
|
34
49
|
|
|
35
50
|
|
|
36
|
-
def _warn_agent_cli_in_core_deprecated_once() -> None:
|
|
37
|
-
"""Log ``agent-cli-in-core-deprecated`` once per process (§5.1).
|
|
38
|
-
|
|
39
|
-
Only called when the in-core ``agent_cli`` branch is taken AND an
|
|
40
|
-
adapter plugin has also registered a ``kind="agent_cli"`` factory —
|
|
41
|
-
i.e. the operator already has ``coderouter-plugin-agents`` installed
|
|
42
|
-
and enabled, but Core's in-core copy still wins resolution order
|
|
43
|
-
(§3.2) during the Phase 2b migration window. Nudges them toward the
|
|
44
|
-
plugin path ahead of its Phase 2c removal from Core.
|
|
45
|
-
"""
|
|
46
|
-
global _agent_cli_deprecation_logged
|
|
47
|
-
if _agent_cli_deprecation_logged:
|
|
48
|
-
return
|
|
49
|
-
_agent_cli_deprecation_logged = True
|
|
50
|
-
logger.warning(
|
|
51
|
-
"agent-cli-in-core-deprecated",
|
|
52
|
-
extra={
|
|
53
|
-
"hint": (
|
|
54
|
-
"an 'agent_cli' adapter plugin is installed and enabled, "
|
|
55
|
-
"but Core's in-core agent_cli implementation still served "
|
|
56
|
-
"this request (in-core wins resolution during the Phase 2b "
|
|
57
|
-
"migration window). The in-core copy will be removed in "
|
|
58
|
-
"Phase 2c — no action is required yet, but new setups "
|
|
59
|
-
"should already be relying on the plugin path "
|
|
60
|
-
"(coderouter-plugin-agents)."
|
|
61
|
-
),
|
|
62
|
-
},
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
|
|
66
51
|
def build_adapter(
|
|
67
52
|
provider: ProviderConfig,
|
|
68
53
|
plugin_registry: PluginRegistry | None = None,
|
|
@@ -72,27 +57,25 @@ def build_adapter(
|
|
|
72
57
|
Resolution order (docs/designs/agent-cli-plugin-extraction.md §3.2):
|
|
73
58
|
in-core kinds first, then plugin-provided kinds, then a fail-fast
|
|
74
59
|
error. In-core kinds are checked first so a plugin can never shadow
|
|
75
|
-
a kind Core itself guarantees (``openai_compat`` / ``anthropic``
|
|
76
|
-
|
|
60
|
+
a kind Core itself guarantees (``openai_compat`` / ``anthropic``).
|
|
61
|
+
|
|
62
|
+
As of Phase 2c, ``agent_cli`` is no longer an in-core kind — it
|
|
63
|
+
resolves ONLY via the plugin path (``coderouter-plugin-agents``).
|
|
77
64
|
"""
|
|
78
65
|
if provider.kind == "openai_compat":
|
|
79
66
|
return OpenAICompatAdapter(provider)
|
|
80
67
|
if provider.kind == "anthropic":
|
|
81
68
|
return AnthropicAdapter(provider)
|
|
82
|
-
if provider.kind == "agent_cli":
|
|
83
|
-
# Imported lazily so the external-agent adapter (and its subprocess /
|
|
84
|
-
# os plumbing) is only pulled in when a config actually uses it.
|
|
85
|
-
from coderouter.adapters.agent_cli import AgentCliAdapter
|
|
86
|
-
|
|
87
|
-
if plugin_registry is not None and any(
|
|
88
|
-
factory.kind == "agent_cli" for factory in plugin_registry.adapters
|
|
89
|
-
):
|
|
90
|
-
_warn_agent_cli_in_core_deprecated_once()
|
|
91
|
-
return AgentCliAdapter(provider)
|
|
92
69
|
if plugin_registry is not None:
|
|
93
70
|
for factory in plugin_registry.adapters:
|
|
94
71
|
if factory.kind == provider.kind:
|
|
95
72
|
return factory.build(provider)
|
|
73
|
+
if provider.kind == "agent_cli":
|
|
74
|
+
# Targeted migration hint (§5.2) instead of the generic message
|
|
75
|
+
# below — this is the single most common post-2c misconfiguration
|
|
76
|
+
# (an un-migrated providers.yaml that still relies on the removed
|
|
77
|
+
# in-core adapter).
|
|
78
|
+
raise ValueError(f"Unknown adapter kind {provider.kind!r}. {_AGENT_CLI_MIGRATION_HINT}")
|
|
96
79
|
raise ValueError(
|
|
97
80
|
f"Unknown adapter kind {provider.kind!r}. "
|
|
98
81
|
f"in-core kinds: {', '.join(_IN_CORE_KINDS)}; "
|