coderouter-cli 2.9.3__tar.gz → 2.9.4__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.9.3 → coderouter_cli-2.9.4}/.gitignore +1 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/CHANGELOG.md +97 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/PKG-INFO +2 -2
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/config/schemas.py +50 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/launcher_routes.py +796 -3
- coderouter_cli-2.9.4/coderouter/launcher_devices.py +518 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/translation/anthropic.py +26 -5
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/launcher-quickstart.en.md +2 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/launcher-quickstart.md +2 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/launcher.en.md +161 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/launcher.md +160 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/openrouter-roster/CHANGES.md +10 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/openrouter-roster/latest.json +6 -6
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.llamacpp-vllm.yaml +38 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/pyproject.toml +2 -2
- coderouter_cli-2.9.4/tests/test_launcher_config_bench.py +160 -0
- coderouter_cli-2.9.4/tests/test_launcher_devices.py +538 -0
- coderouter_cli-2.9.4/tests/test_launcher_devices_detect.py +196 -0
- coderouter_cli-2.9.4/tests/test_launcher_devices_routes.py +633 -0
- coderouter_cli-2.9.4/tests/test_launcher_gui_devices.py +492 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_gui_readiness.py +9 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_role_normalization.py +50 -13
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/LICENSE +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/README.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/adapters/registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/cli.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/cost.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/doctor.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/errors.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/launcher_swap.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/logging.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/README.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/claude-code-llamacpp-vllm.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/claude-code-llamacpp-vllm.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/external-agents.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/external-agents.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/install-backends.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/install-backends.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/llamacpp-direct.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/llamacpp-direct.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/agent-cli-plugin-extraction.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/external-agents-adapter.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/launcher-model-swap.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/orchestration-companion.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/security.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/subagent-routing.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/subagent-routing.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/start/quickstart.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/start/quickstart.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/start/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/docs/start/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/.env.example +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/README.md +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers-agent-cli.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.swap.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/examples/providers.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/__init__.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/conftest.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_agent_cli.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_capability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_cli.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_config.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_doctor.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_errors.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_readiness_restart.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_swap.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_launcher_swap_review.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_plugin_adapter.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.9.3 → coderouter_cli-2.9.4}/tests/test_translation_reverse.py +0 -0
|
@@ -9,6 +9,103 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.9.4] — 2026-07-19 (launcher device selection & bench sweep, cache-stable system prompt)
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **llama.cpp device selection (`--device` / `--tensor-split`) in the
|
|
17
|
+
Launcher.** Both the desktop GUI and the Web edition can now detect
|
|
18
|
+
available `llama-server` devices (via `--list-devices`), display their
|
|
19
|
+
VRAM, and let the operator pick which one(s) to offload to instead of
|
|
20
|
+
always relying on llama.cpp's own default placement. New shared module
|
|
21
|
+
`coderouter/launcher_devices.py` (dataclasses + pure functions only, no
|
|
22
|
+
pydantic, so the standalone GUI can import it without the `coderouter`
|
|
23
|
+
package) owns detection/caching (`detect_llama_devices`,
|
|
24
|
+
`parse_list_devices`, a 60s TTL cache keyed by binary path),
|
|
25
|
+
CLI-fragment building (`DeviceSelection.to_cli_args` — empty selection
|
|
26
|
+
emits nothing, preserving today's launch command byte-for-byte),
|
|
27
|
+
VRAM-ratio tensor-split suggestion (`suggest_tensor_split`), and backend
|
|
28
|
+
grouping (`backend_of` / `group_by_backend` / `selectable_devices`) so a
|
|
29
|
+
GPU listed twice under different backends (e.g. `CUDA0` and `Vulkan1`
|
|
30
|
+
for the same physical card) is never double-counted and cross-backend
|
|
31
|
+
configs are never auto-generated. Devices reporting `0 MiB` (e.g. macOS
|
|
32
|
+
`BLAS: Accelerate`) are still shown for information but excluded from
|
|
33
|
+
selection/suggestion. `StartRequest` gained `device_ids` / `tensor_split`
|
|
34
|
+
(both default empty — existing Web clients are unaffected), and
|
|
35
|
+
`GET /api/launcher/devices` (`?backend=`, `?refresh=1`) returns the
|
|
36
|
+
probe plus a per-backend `suggested_tensor_split` and `auto_configs`.
|
|
37
|
+
`launcher_gui.py`'s LAUNCH form gained a device checklist (🔍 Detect,
|
|
38
|
+
falling back to a manual comma-separated entry on detection failure)
|
|
39
|
+
and a tensor-split field that auto-hides when one or fewer devices are
|
|
40
|
+
detected. See `tests/test_launcher_devices.py`,
|
|
41
|
+
`tests/test_launcher_devices_detect.py`,
|
|
42
|
+
`tests/test_launcher_devices_routes.py`,
|
|
43
|
+
`tests/test_launcher_gui_devices.py`, and the new "Device selection"
|
|
44
|
+
section in `docs/backends/launcher.md` / `launcher.en.md`.
|
|
45
|
+
- **Bench sweep: automated device-configuration benchmarking against an
|
|
46
|
+
external `llmbench`.** Both Launcher editions can now drive a list of
|
|
47
|
+
device configurations (e.g. `CUDA0` alone / `CUDA1` alone / a
|
|
48
|
+
multi-GPU split) through start → wait for readiness → run an external
|
|
49
|
+
bench command → stop → advance to the next configuration, then compare
|
|
50
|
+
the results. `coderouter/launcher_devices.py` supplies the shared
|
|
51
|
+
`SweepPlan` / `SweepStep` / `SweepState` state machine,
|
|
52
|
+
`build_auto_sweep_configs` (one config per selectable device plus one
|
|
53
|
+
per multi-device backend group), `render_bench_command` (template
|
|
54
|
+
placeholders `{port}` `{config}` `{base_url}` `{results_dir}` `{runs}`,
|
|
55
|
+
expanded via plain string substitution rather than `str.format` so JSON
|
|
56
|
+
braces in the command aren't misinterpreted, then `shlex`-split with
|
|
57
|
+
`posix=False` on Windows to keep backslash paths intact), and
|
|
58
|
+
`load_latest_results` / `summarize_results` (best-effort, alias-tolerant
|
|
59
|
+
extraction of `tokens_per_sec` / `ttft_ms` / `latency_ms` from the
|
|
60
|
+
newest `llmbench` results JSON). New `LauncherBenchConfig`
|
|
61
|
+
(`command_template` / `runs` / `results_dir` / `readiness_timeout_s`,
|
|
62
|
+
read from an optional `launcher.bench:` block — omitted entirely by
|
|
63
|
+
default, so existing `providers.yaml` files are unaffected) supplies
|
|
64
|
+
the sweep's defaults. The Web edition gained
|
|
65
|
+
`POST /api/launcher/sweep/start` (token-gated; 409 if a sweep is
|
|
66
|
+
already running, 400 for empty `configs` or a busy/unavailable port),
|
|
67
|
+
`GET /api/launcher/sweep/status`, `POST /api/launcher/sweep/abort`
|
|
68
|
+
(token-gated), and `GET /api/launcher/sweep/logs`, backed by a new
|
|
69
|
+
`_SweepRunner` that reuses the existing `spawn_process` /
|
|
70
|
+
`stop_process` / `proc.ready` readiness primitives. `launcher_gui.py`
|
|
71
|
+
gained a "📊 Bench sweep" button opening a separate `SweepWindow` with
|
|
72
|
+
its own `_SweepWorker` thread, reusing `poll_until_ready` for readiness
|
|
73
|
+
and driving the same external bench subprocess model. See
|
|
74
|
+
`tests/test_launcher_config_bench.py` and the new "Bench sweep" section
|
|
75
|
+
in `docs/backends/launcher.md` / `launcher.en.md`.
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
|
|
79
|
+
- **Mid-conversation `role:"system"` messages are no longer hoisted into
|
|
80
|
+
the top-level `system` field.** (#75, contributed by @firelzrd.)
|
|
81
|
+
Claude Code CLI ≥ 2.1.154 emits volatile system reminders as
|
|
82
|
+
`role:"system"` messages *inside* `messages[]`; hoisting them meant the
|
|
83
|
+
serialized prompt's head changed every turn, so llama.cpp / LM Studio
|
|
84
|
+
style prefix-matching KV caches were invalidated wholesale (a captured
|
|
85
|
+
real session measured only 11.8 % reusable prefix between consecutive
|
|
86
|
+
requests). `normalize_message_roles()` now splits by position: leading
|
|
87
|
+
system messages (before any emitted turn) are hoisted as before — the
|
|
88
|
+
legitimate OpenAI-style system prompt — while mid-conversation ones are
|
|
89
|
+
coerced to `user` in place, keeping `messages` append-only and the
|
|
90
|
+
prompt head stable as the conversation grows. See
|
|
91
|
+
`tests/test_role_normalization.py`
|
|
92
|
+
(`test_leading_system_is_hoisted_but_mid_conversation_is_not`,
|
|
93
|
+
`test_system_prompt_is_stable_as_conversation_grows`).
|
|
94
|
+
|
|
95
|
+
### Security
|
|
96
|
+
|
|
97
|
+
- **Dependency bumps for two fresh advisories** (lockfile-only; both
|
|
98
|
+
verified with a clean `uv sync --frozen` + full test suite, 1905
|
|
99
|
+
passed): `click` 8.3.2 → 8.4.2 (PYSEC-2026-2132, fix ≥ 8.3.3;
|
|
100
|
+
transitive via uvicorn) and `json-repair` 0.59.10 → 0.61.5
|
|
101
|
+
(GHSA-xf7x-x43h-rpqh, CVSS 7.5, fix ≥ 0.60.1). The `json-repair`
|
|
102
|
+
floor in `pyproject.toml` was raised from `>=0.30` to `>=0.60.1` so
|
|
103
|
+
fresh installs can never resolve a vulnerable version; `uv.lock` also
|
|
104
|
+
records the new lockfile revision 3 format (upload-time metadata)
|
|
105
|
+
emitted by current uv.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
12
109
|
## [v2.9.3] — 2026-07-12 (GUI/Web parity, swap polish, launcher UI fixes)
|
|
13
110
|
|
|
14
111
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.9.
|
|
3
|
+
Version: 2.9.4
|
|
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
|
|
@@ -40,7 +40,7 @@ Requires-Dist: types-pyyaml>=6.0.12; extra == 'dev'
|
|
|
40
40
|
Provides-Extra: doctor
|
|
41
41
|
Requires-Dist: ruamel-yaml>=0.18.6; extra == 'doctor'
|
|
42
42
|
Provides-Extra: repair
|
|
43
|
-
Requires-Dist: json-repair>=0.
|
|
43
|
+
Requires-Dist: json-repair>=0.60.1; extra == 'repair'
|
|
44
44
|
Description-Content-Type: text/markdown
|
|
45
45
|
|
|
46
46
|
<h1 align="center">CodeRouter</h1>
|
|
@@ -1460,6 +1460,49 @@ class LauncherOptionProfile(BaseModel):
|
|
|
1460
1460
|
)
|
|
1461
1461
|
|
|
1462
1462
|
|
|
1463
|
+
class LauncherBenchConfig(BaseModel):
|
|
1464
|
+
"""The ``launcher.bench:`` block — defaults for the bench sweep feature.
|
|
1465
|
+
|
|
1466
|
+
設計 §4.1。デバイス構成スイープ(起動→readiness→外部ベンチ→停止→次)の
|
|
1467
|
+
既定値を providers.yaml から供給する。未設定(``LauncherConfig.bench`` が
|
|
1468
|
+
None)ならスイープ UI はハードコード既定を使う(完全後方互換)。すべての
|
|
1469
|
+
フィールドに ``default`` があるので、既存 YAML は無改変で通過する。
|
|
1470
|
+
"""
|
|
1471
|
+
|
|
1472
|
+
model_config = ConfigDict(extra="forbid")
|
|
1473
|
+
|
|
1474
|
+
command_template: str = Field(
|
|
1475
|
+
default="llmbench run --model local-openai --runs {runs}",
|
|
1476
|
+
description=(
|
|
1477
|
+
"外部ベンチコマンドのテンプレ。``{port}`` ``{config}`` "
|
|
1478
|
+
"``{base_url}`` ``{results_dir}`` ``{runs}`` を単純置換で展開して "
|
|
1479
|
+
"argv 化する(``str.format`` ではないので JSON 波括弧で誤爆しない)。"
|
|
1480
|
+
),
|
|
1481
|
+
)
|
|
1482
|
+
runs: int = Field(
|
|
1483
|
+
default=5,
|
|
1484
|
+
ge=1,
|
|
1485
|
+
le=1000,
|
|
1486
|
+
description="1 構成あたりのベンチ実行回数。``{runs}`` に展開される。",
|
|
1487
|
+
)
|
|
1488
|
+
results_dir: str | None = Field(
|
|
1489
|
+
default=None,
|
|
1490
|
+
description=(
|
|
1491
|
+
"llmbench の results/ ディレクトリ。相対はサーバ CWD 基準。"
|
|
1492
|
+
"設定時のみスイープ結果 JSON を読み比較サマリを付与する。"
|
|
1493
|
+
),
|
|
1494
|
+
)
|
|
1495
|
+
readiness_timeout_s: float = Field(
|
|
1496
|
+
default=300.0,
|
|
1497
|
+
ge=5.0,
|
|
1498
|
+
le=3600.0,
|
|
1499
|
+
description=(
|
|
1500
|
+
"スイープの各構成でサーバが ready になるのを待つ最大秒数。"
|
|
1501
|
+
"大きな GGUF ロードを考慮した既定 5 分。"
|
|
1502
|
+
),
|
|
1503
|
+
)
|
|
1504
|
+
|
|
1505
|
+
|
|
1463
1506
|
class SwapModelSpec(BaseModel):
|
|
1464
1507
|
"""One entry in ``launcher.swap.models`` (docs/designs/launcher-model-swap.md).
|
|
1465
1508
|
|
|
@@ -1863,6 +1906,13 @@ class LauncherConfig(BaseModel):
|
|
|
1863
1906
|
"behavior."
|
|
1864
1907
|
),
|
|
1865
1908
|
)
|
|
1909
|
+
bench: LauncherBenchConfig | None = Field(
|
|
1910
|
+
default=None,
|
|
1911
|
+
description=(
|
|
1912
|
+
"デバイス構成ベンチスイープ(設計 §4)の既定値。None(既定)なら "
|
|
1913
|
+
"スイープ UI はハードコード既定を使う=完全後方互換。"
|
|
1914
|
+
),
|
|
1915
|
+
)
|
|
1866
1916
|
|
|
1867
1917
|
@model_validator(mode="after")
|
|
1868
1918
|
def _check_auto_restart_backoff_ordered(self) -> LauncherConfig:
|