coderouter-cli 2.15.0__tar.gz → 2.15.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.15.0 → coderouter_cli-2.15.1}/CHANGELOG.md +48 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/PKG-INFO +16 -4
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/README.en.md +15 -3
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/README.md +15 -3
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/doctor.py +48 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/claude-code-llamacpp-vllm.en.md +2 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/claude-code-llamacpp-vllm.md +2 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/install-backends.en.md +2 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/install-backends.md +2 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/launcher.en.md +1 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/launcher.md +1 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/llamacpp-direct.en.md +3 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/llamacpp-direct.md +2 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/start/quickstart.en.md +18 -31
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/start/quickstart.md +18 -31
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/start/when-do-i-need-coderouter.en.md +3 -5
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/start/when-do-i-need-coderouter.md +3 -5
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.cli-session.yaml +1 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.llamacpp-vllm.yaml +2 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.yaml +3 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/pyproject.toml +1 -1
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_doctor.py +73 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/.gitignore +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/LICENSE +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/__main__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/adapters/openai_compat.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/adapters/registry.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/cli.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/config/loader.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/config/schemas.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/cost.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/credentials.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/env_security.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/errors.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/gguf_introspect.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/_fingerprint.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/backend_health.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/context_budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/continuous_probe.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/drift_actions.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/drift_detection.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/memory_budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/memory_pressure.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/self_healing.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/guards/tool_loop.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/hardware.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/launcher_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/ingress/ui_auth.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/language_tax.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/launcher_devices.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/launcher_speculative.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/launcher_swap.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/logging.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/output_filters.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/plugins/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/plugins/base.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/plugins/loader.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/plugins/registry.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/py.typed +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/rollback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/adaptive.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/routing/fallback_trace.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/secret_redaction.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/audit_log.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/replay.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/request_log.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/store.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/state/suggest_rules.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/token_estimation.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/token_estimation_accurate.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/coderouter/vscode_init.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/README.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/README.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/external-agents.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/external-agents.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/gguf_dl.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/gguf_dl.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/hf-ollama-models.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/hf-ollama-models.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/launcher-quickstart.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/launcher-quickstart.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/lmstudio-direct.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/lmstudio-direct.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/verify-ollama-0.23.1.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/architecture.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/architecture.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/context-budget.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/context-budget.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/continuous-probing.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/continuous-probing.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/drift-detection.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/drift-detection.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/partial-stitch.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/partial-stitch.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/stream-truncation.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/concepts/stream-truncation.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/agent-cli-plugin-extraction.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/external-agents-adapter.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/launcher-model-swap.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/launcher-multi-build.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/orchestration-companion.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/free-tier-guide.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/free-tier-guide.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/language-tax.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/language-tax.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/remote-access.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/remote-access.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/security.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/security.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/subagent-routing.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/subagent-routing.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/troubleshooting.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/troubleshooting.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/usage-guide.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/usage-guide.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/guides/vscode.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/low-memory-integration.en.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/low-memory-integration.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/openrouter-roster/CHANGES.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/.env.example +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/README.md +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers-agent-cli.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers-multiagent.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.context-budget-test.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.ollama-auto-custom.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.ollama-auto.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.ollama-free-chain.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.opusplan.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.raspberrypi.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/examples/providers.swap.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/smoke_v2_2.sh +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/verify-providers.yaml +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/verify_ollama_0_23.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/__init__.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/conftest.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_agent_cli.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_audit_log.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_auto_router.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_auto_router_cjk.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_backend_health.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_capability.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_capability_registry_cache_control.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_capability_tool_choice.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_cli.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_cli_bind_warning.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_config.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_config_cwd_warning.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_config_shim_actions.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_context_budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_continuous_probe.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_credentials.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_doctor_cache_probe.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_drift_actions.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_drift_detection.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_drift_detection_integration.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_env_file.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_env_security.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_errors.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_examples_yaml_roundtrip.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_cache_observed.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_cache_strip.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_empty_response.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_reason.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_tool_choice_emulate.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fallback_tool_integrity.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h1_prometheus_drift.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h2_h6_translation.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h3_client_reuse.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h4_h5_guards.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h7_probe_restore.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_h8_launcher_auth.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mA_routing.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mB_adapters.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mC_convert.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mD_logging_metrics.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mE_config_validation.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_mF_ingress.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_fix_v213_launcher_hardening.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_gguf_introspect.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_guards_tool_loop.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_hardware.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_import_hygiene.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_ingress_count_tokens.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_language_tax.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_language_tax_integration.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_backend_variants.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_config_bench.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_devices.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_devices_detect.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_devices_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_gui_devices.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_gui_events.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_gui_readiness.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_gui_sweep_close.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_mtp.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_mtp_fallback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_provider_sync.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_readiness_restart.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_swap.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_swap_review.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_variant_config.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_variant_gui.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_variant_routes.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_launcher_variant_sweep.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_memory_budget.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_memory_pressure.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_cache.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_cost.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_metrics_prometheus_cache.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_models_passthrough.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_output_filters.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_packaging.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_partial_stitch.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_plugin_adapter.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_plugins_integration.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_plugins_loader.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_plugins_registry.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_reasoning_strip.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_repair_byte_fallback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_request_log.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_role_normalization.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_rollback.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_routing_adaptive.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_secret_redaction.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_self_healing.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_setup_sh.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_state_store.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_stop_reason_forward_compat.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_stream_truncation.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_token_estimation.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_token_estimation_accurate.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tokens_saved_metric.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tool_repair_differential.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tool_repair_lenient.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tool_repair_r4.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_tool_repair_scanners.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_toolrepair_bench.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_translation_reverse.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_ui_auth.py +0 -0
- {coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/tests/test_vscode_init.py +0 -0
|
@@ -9,6 +9,54 @@ are kept verbatim where the Japanese text itself is the subject).
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## [v2.15.1] — 2026-10-24 (docs and defaults for the October 2026 ecosystem)
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **`doctor` names llama.cpp's default-port change.** llama.cpp b11521
|
|
17
|
+
(2026-10-09, ggml-org/llama.cpp#30159) moved `llama-server`'s default
|
|
18
|
+
listen port from 8080 to 9931. When the `auth+basic-chat` probe cannot
|
|
19
|
+
connect to a loopback provider on :8080 or :9931, `doctor` now checks the
|
|
20
|
+
other port's `/health` (1.5 s, IPv4 literal) and, if it answers, says so
|
|
21
|
+
in the transport-error detail with the two possible fixes. The config is
|
|
22
|
+
never rewritten. Other hosts and ports send no extra request.
|
|
23
|
+
- **SBOM on every release.** `release.yml` builds a CycloneDX JSON SBOM
|
|
24
|
+
(`cyclonedx-bom==7.4.0`) from a clean venv holding only the wheel and its
|
|
25
|
+
runtime dependencies, and attaches `coderouter-cli-<version>.cdx.json` to
|
|
26
|
+
the GitHub Release draft. It is written outside `dist/`, so the PyPI
|
|
27
|
+
upload is unchanged.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Codex CLI instructions corrected.** The quickstart (Pattern B), README
|
|
32
|
+
and the "do I need CodeRouter?" guide told users to set
|
|
33
|
+
`wire_api = "chat"`. Codex removed that option in 2026-02 and now fails
|
|
34
|
+
while loading such a config; it speaks only the Responses API, which
|
|
35
|
+
CodeRouter does not serve yet. The docs now say so and give the
|
|
36
|
+
direct-connect workaround (`codex --oss`, or a `wire_api = "responses"`
|
|
37
|
+
provider pointing at `llama-server`).
|
|
38
|
+
- **llama.cpp port notes.** Backend guides and examples keep their explicit
|
|
39
|
+
`--port 8080` (correct on every build) and now explain the 9931 default
|
|
40
|
+
for servers started without `--port`. The Launcher is unaffected: it
|
|
41
|
+
always passes `--port`, so its 8080 default stays.
|
|
42
|
+
- **README: package-name warning.** The PyPI project named `coderouter` is
|
|
43
|
+
a different product; the install section now says to install
|
|
44
|
+
`coderouter-cli`.
|
|
45
|
+
- **README: repair benchmark and release protections.** The tool-call
|
|
46
|
+
repair row links the benchmark and its numbers, and the Security section
|
|
47
|
+
lists the release protections as layers rather than resting on
|
|
48
|
+
Trusted Publishing alone.
|
|
49
|
+
|
|
50
|
+
### Security
|
|
51
|
+
|
|
52
|
+
- **Lockfile bumps for newly published advisories.** `anyio` 4.13.0 →
|
|
53
|
+
4.14.2 (PYSEC-2026-4024, PYSEC-2026-4025), `certifi` 2026.2.25 →
|
|
54
|
+
2026.10.23 (PYSEC-2026-4320), `fsspec` 2026.4.0 → 2026.9.0
|
|
55
|
+
(PYSEC-2026-4217; reached only through the optional `[accuracy]` extra
|
|
56
|
+
via `huggingface-hub`). Found by the CI dependency audit.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
12
60
|
## [v2.15.0] — 2026-08-21 (fallback explainability + stream truncation detection)
|
|
13
61
|
|
|
14
62
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 2.15.
|
|
3
|
+
Version: 2.15.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 / agy ほか ※)
|
|
70
70
|
│
|
|
71
71
|
▼
|
|
72
72
|
┌─ CodeRouter ─┐
|
|
@@ -76,6 +76,8 @@ Description-Content-Type: text/markdown
|
|
|
76
76
|
└──────────────┘
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
+
※ 現行の codex CLI は Responses API(`/v1/responses`)専用になったため、CodeRouter 経由ではまだ使えません(対応予定)。直結の代替手順 → [quickstart Pattern B](./docs/start/quickstart.md#pattern-b-codex-cli-で使う)
|
|
80
|
+
|
|
79
81
|
**やってくれること:**
|
|
80
82
|
|
|
81
83
|
- ローカルモデルが壊した tool calling を Claude Code に届く前に修復する
|
|
@@ -118,6 +120,8 @@ uvx --from coderouter-cli coderouter serve --port 8088
|
|
|
118
120
|
|
|
119
121
|
恒久インストールしたい場合: `uv tool install coderouter-cli`
|
|
120
122
|
|
|
123
|
+
> **パッケージ名に注意**: PyPI のパッケージ名は **`coderouter-cli`** です。PyPI の `coderouter`(名前だけ同じ)は別の製品なので、`pip install coderouter` と打たないでください。
|
|
124
|
+
|
|
121
125
|
---
|
|
122
126
|
|
|
123
127
|
## Claude Code で使う
|
|
@@ -143,7 +147,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
143
147
|
| Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
|
|
144
148
|
| Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
|
|
145
149
|
| Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
|
|
146
|
-
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
|
|
150
|
+
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら(codex は `/v1/responses` 対応後) |
|
|
147
151
|
| Claude API を直接叩いてて問題ない | 不要 |
|
|
148
152
|
|
|
149
153
|
詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
|
|
@@ -156,7 +160,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
156
160
|
|
|
157
161
|
| 機能 | 何をしてくれるか |
|
|
158
162
|
|---|---|
|
|
159
|
-
| **Tool-call 修復** | ローカルモデルがテキストで吐いた JSON を正しい tool_use
|
|
163
|
+
| **Tool-call 修復** | ローカルモデルがテキストで吐いた JSON を正しい tool_use ブロックに復元。実測は [修復ベンチ](./benchmarks/tool-repair/README.md)(壊れた tool call を出す 4 モデルで成功率 0% → 80〜100%、回帰コーパスで誤修復 0 件。CI でゲート) |
|
|
160
164
|
| **3 層フォールバック** | ローカル → 無料クラウド → 有料の順に自動切替 |
|
|
161
165
|
| **出力フィルタ** | `<think>` タグ漏れ、stop marker 漏れ、byte-fallback (`<0xNN>`) を自動除去/修復 |
|
|
162
166
|
| **Wire 翻訳** | Anthropic 形式 ↔ OpenAI 形式を自動変換 (ネイティブ `/v1/messages` 対応 backend は passthrough で翻訳ゼロ) |
|
|
@@ -333,6 +337,14 @@ CodeRouter は backend ルーター層として独立して動きます。`OPENA
|
|
|
333
337
|
|
|
334
338
|
シークレットは環境変数に置きます。[`docs/security.md`](./docs/guides/security.md) に完全な方針と報告手順があります。
|
|
335
339
|
|
|
340
|
+
リリースは多層で守っています。どれか 1 つを根拠に「安全」とは言いません(正規のパイプラインでビルドされた汚染版が出た例があります)。
|
|
341
|
+
|
|
342
|
+
- PyPI へは Trusted Publishing(OIDC)で公開し、長期の API トークンを置かない
|
|
343
|
+
- PyPI 側の公開許可は `release.yml` の `pypi` 環境に限定している
|
|
344
|
+
- タグは事前検査スクリプトを通してから打つ(version・CHANGELOG・main の一致を機械的に確認)
|
|
345
|
+
- 実行時の依存は 5 個に絞っている
|
|
346
|
+
- 各リリースに SBOM(CycloneDX)を添付する
|
|
347
|
+
|
|
336
348
|
## License
|
|
337
349
|
|
|
338
350
|
MIT
|
|
@@ -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 / agy, etc. *)
|
|
25
25
|
│
|
|
26
26
|
▼
|
|
27
27
|
┌─ CodeRouter ──┐
|
|
@@ -31,6 +31,8 @@ Your agent (Claude Code / codex / agy)
|
|
|
31
31
|
└────────────────┘
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
\* Current codex CLI speaks only the Responses API (`/v1/responses`), so it cannot go through CodeRouter yet (planned). Direct-connect workaround → [quickstart Pattern B](./docs/start/quickstart.en.md#pattern-b-use-it-with-the-codex-cli)
|
|
35
|
+
|
|
34
36
|
**What it does for you:**
|
|
35
37
|
|
|
36
38
|
- Repairs broken tool calling from local models before it reaches Claude Code
|
|
@@ -55,6 +57,8 @@ uvx --from coderouter-cli coderouter serve --port 8088
|
|
|
55
57
|
|
|
56
58
|
For a permanent install: `uv tool install coderouter-cli`
|
|
57
59
|
|
|
60
|
+
> **Mind the package name**: the PyPI package is **`coderouter-cli`**. The PyPI package named `coderouter` is a different product; don't `pip install coderouter`.
|
|
61
|
+
|
|
58
62
|
---
|
|
59
63
|
|
|
60
64
|
## Use with Claude Code
|
|
@@ -79,7 +83,7 @@ That's it. Claude Code works as usual, but your local Ollama is answering behind
|
|
|
79
83
|
|---|---|
|
|
80
84
|
| Claude Code + local Ollama, tool calling breaks | **Yes** — wire translation + tool repair |
|
|
81
85
|
| Claude Code + local, dies after long sessions | **Helpful** — 6 guards + self-healing |
|
|
82
|
-
| codex / agy + Ollama works fine | Optional — if you want fallback |
|
|
86
|
+
| codex / agy + Ollama works fine | Optional — if you want fallback (codex: once `/v1/responses` lands) |
|
|
83
87
|
| Using Claude API directly, no issues | Not needed |
|
|
84
88
|
|
|
85
89
|
Full decision matrix → [Do I need CodeRouter?](./docs/start/when-do-i-need-coderouter.en.md)
|
|
@@ -93,7 +97,7 @@ Full decision matrix → [Do I need CodeRouter?](./docs/start/when-do-i-need-cod
|
|
|
93
97
|
| Feature | What it does |
|
|
94
98
|
|---|---|
|
|
95
99
|
| **Wire translation** | Claude Code (Anthropic format) ↔ Ollama (OpenAI format) auto-converted |
|
|
96
|
-
| **Tool-call repair** | JSON that local models emit as plain text → valid tool_use blocks |
|
|
100
|
+
| **Tool-call repair** | JSON that local models emit as plain text → valid tool_use blocks. Measured in the [repair benchmark](./benchmarks/tool-repair/README.md): four models that break tool calls go from 0% to 80–100% success; zero false repairs on the regression corpus, gated in CI |
|
|
97
101
|
| **3-tier fallback** | Local → free cloud → paid, automatic switching |
|
|
98
102
|
| **Output filters** | Strips leaked `<think>` tags, stop markers, XML tool tags |
|
|
99
103
|
|
|
@@ -268,6 +272,14 @@ CodeRouter runs as an independent backend router layer. Point any project's `OPE
|
|
|
268
272
|
|
|
269
273
|
Secrets go in env vars, not config files. See [`docs/security.en.md`](./docs/guides/security.en.md) for the full policy and reporting instructions.
|
|
270
274
|
|
|
275
|
+
Releases are protected in layers. No single one of these is offered as proof of safety (tampered builds have shipped from legitimate pipelines before).
|
|
276
|
+
|
|
277
|
+
- Published to PyPI via Trusted Publishing (OIDC); no long-lived API token exists
|
|
278
|
+
- PyPI accepts uploads only from `release.yml` running in the `pypi` environment
|
|
279
|
+
- Tags are cut only after a pre-flight script checks version, CHANGELOG and main
|
|
280
|
+
- Five runtime dependencies
|
|
281
|
+
- An SBOM (CycloneDX) is attached to every release
|
|
282
|
+
|
|
271
283
|
## License
|
|
272
284
|
|
|
273
285
|
MIT
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
## 何ができるか — 30 秒で
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
あなたのエージェント (Claude Code /
|
|
24
|
+
あなたのエージェント (Claude Code / agy ほか ※)
|
|
25
25
|
│
|
|
26
26
|
▼
|
|
27
27
|
┌─ CodeRouter ─┐
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
└──────────────┘
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
※ 現行の codex CLI は Responses API(`/v1/responses`)専用になったため、CodeRouter 経由ではまだ使えません(対応予定)。直結の代替手順 → [quickstart Pattern B](./docs/start/quickstart.md#pattern-b-codex-cli-で使う)
|
|
35
|
+
|
|
34
36
|
**やってくれること:**
|
|
35
37
|
|
|
36
38
|
- ローカルモデルが壊した tool calling を Claude Code に届く前に修復する
|
|
@@ -73,6 +75,8 @@ uvx --from coderouter-cli coderouter serve --port 8088
|
|
|
73
75
|
|
|
74
76
|
恒久インストールしたい場合: `uv tool install coderouter-cli`
|
|
75
77
|
|
|
78
|
+
> **パッケージ名に注意**: PyPI のパッケージ名は **`coderouter-cli`** です。PyPI の `coderouter`(名前だけ同じ)は別の製品なので、`pip install coderouter` と打たないでください。
|
|
79
|
+
|
|
76
80
|
---
|
|
77
81
|
|
|
78
82
|
## Claude Code で使う
|
|
@@ -98,7 +102,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
98
102
|
| Claude Code + ローカル Ollama で tool calling が壊れる | **必須** — tool 修復 (+ 必要なら wire 変換) |
|
|
99
103
|
| Claude Code + ローカルで長時間回すと止まる | **必須級** — 6 系統ガード + self-healing |
|
|
100
104
|
| Ollama v0.14+ / LM Studio にネイティブ直結で動いてる | **便利** — 直結に無い fallback / ガード / 診断を追加 (passthrough で翻訳ゼロ) |
|
|
101
|
-
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら |
|
|
105
|
+
| codex / agy + Ollama 直繋ぎで動いてる | オプション — フォールバックが欲しいなら(codex は `/v1/responses` 対応後) |
|
|
102
106
|
| Claude API を直接叩いてて問題ない | 不要 |
|
|
103
107
|
|
|
104
108
|
詳細は → [要否判定ガイド](./docs/start/when-do-i-need-coderouter.md)
|
|
@@ -111,7 +115,7 @@ ANTHROPIC_BASE_URL=http://localhost:8088 ANTHROPIC_AUTH_TOKEN=dummy claude
|
|
|
111
115
|
|
|
112
116
|
| 機能 | 何をしてくれるか |
|
|
113
117
|
|---|---|
|
|
114
|
-
| **Tool-call 修復** | ローカルモデルがテキストで吐いた JSON を正しい tool_use
|
|
118
|
+
| **Tool-call 修復** | ローカルモデルがテキストで吐いた JSON を正しい tool_use ブロックに復元。実測は [修復ベンチ](./benchmarks/tool-repair/README.md)(壊れた tool call を出す 4 モデルで成功率 0% → 80〜100%、回帰コーパスで誤修復 0 件。CI でゲート) |
|
|
115
119
|
| **3 層フォールバック** | ローカル → 無料クラウド → 有料の順に自動切替 |
|
|
116
120
|
| **出力フィルタ** | `<think>` タグ漏れ、stop marker 漏れ、byte-fallback (`<0xNN>`) を自動除去/修復 |
|
|
117
121
|
| **Wire 翻訳** | Anthropic 形式 ↔ OpenAI 形式を自動変換 (ネイティブ `/v1/messages` 対応 backend は passthrough で翻訳ゼロ) |
|
|
@@ -288,6 +292,14 @@ CodeRouter は backend ルーター層として独立して動きます。`OPENA
|
|
|
288
292
|
|
|
289
293
|
シークレットは環境変数に置きます。[`docs/security.md`](./docs/guides/security.md) に完全な方針と報告手順があります。
|
|
290
294
|
|
|
295
|
+
リリースは多層で守っています。どれか 1 つを根拠に「安全」とは言いません(正規のパイプラインでビルドされた汚染版が出た例があります)。
|
|
296
|
+
|
|
297
|
+
- PyPI へは Trusted Publishing(OIDC)で公開し、長期の API トークンを置かない
|
|
298
|
+
- PyPI 側の公開許可は `release.yml` の `pypi` 環境に限定している
|
|
299
|
+
- タグは事前検査スクリプトを通してから打つ(version・CHANGELOG・main の一致を機械的に確認)
|
|
300
|
+
- 実行時の依存は 5 個に絞っている
|
|
301
|
+
- 各リリースに SBOM(CycloneDX)を添付する
|
|
302
|
+
|
|
291
303
|
## License
|
|
292
304
|
|
|
293
305
|
MIT
|
|
@@ -635,6 +635,49 @@ _PROBE_TOOL_SPEC_ANTHROPIC = {
|
|
|
635
635
|
}
|
|
636
636
|
|
|
637
637
|
|
|
638
|
+
# v2.15.1: llama.cpp changed ``llama-server``'s default listen port from
|
|
639
|
+
# 8080 to 9931 (ggml-org/llama.cpp#30159, build b11521, 2026-10-09). A server
|
|
640
|
+
# started without ``--port`` on a new build is invisible to a provider that
|
|
641
|
+
# still points at :8080, and the reverse holds for configs written against
|
|
642
|
+
# the new default. When the basic probe cannot connect to one of those two
|
|
643
|
+
# ports on a loopback host, check the other one so the transport error can
|
|
644
|
+
# name the likely cause instead of looking like "server not running".
|
|
645
|
+
_LLAMACPP_PORT_PAIR: dict[int, int] = {8080: 9931, 9931: 8080}
|
|
646
|
+
_LOOPBACK_HOSTS = frozenset({"localhost", "127.0.0.1", "::1"})
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
async def _llamacpp_port_hint(base_url: object) -> str | None:
|
|
650
|
+
"""Return a hint when the other llama.cpp default port answers.
|
|
651
|
+
|
|
652
|
+
Only fires for loopback hosts on port 8080 or 9931. The alternate
|
|
653
|
+
port is probed at ``GET /health`` (llama-server's readiness route)
|
|
654
|
+
with a short timeout on the IPv4 literal — ``localhost`` can resolve
|
|
655
|
+
to ``::1`` first on macOS, where llama-server is not listening. The
|
|
656
|
+
config is never rewritten; the operator decides.
|
|
657
|
+
"""
|
|
658
|
+
try:
|
|
659
|
+
parsed = httpx.URL(str(base_url))
|
|
660
|
+
except (httpx.InvalidURL, TypeError):
|
|
661
|
+
return None
|
|
662
|
+
if parsed.host not in _LOOPBACK_HOSTS or parsed.port not in _LLAMACPP_PORT_PAIR:
|
|
663
|
+
return None
|
|
664
|
+
other = _LLAMACPP_PORT_PAIR[parsed.port]
|
|
665
|
+
try:
|
|
666
|
+
async with httpx.AsyncClient(timeout=1.5) as client:
|
|
667
|
+
resp = await client.get(f"http://127.0.0.1:{other}/health")
|
|
668
|
+
except httpx.HTTPError:
|
|
669
|
+
return None
|
|
670
|
+
if resp.status_code >= 500:
|
|
671
|
+
return None
|
|
672
|
+
return (
|
|
673
|
+
f"Something is answering on port {other} instead. llama.cpp "
|
|
674
|
+
f"builds b11521+ listen on 9931 when started without --port "
|
|
675
|
+
f"(older builds: 8080). Either start llama-server with "
|
|
676
|
+
f"--port {parsed.port}, or change this provider's base_url to "
|
|
677
|
+
f"port {other}"
|
|
678
|
+
)
|
|
679
|
+
|
|
680
|
+
|
|
638
681
|
async def _probe_auth_and_basic_chat(
|
|
639
682
|
provider: ProviderConfig,
|
|
640
683
|
) -> ProbeResult:
|
|
@@ -670,10 +713,14 @@ async def _probe_auth_and_basic_chat(
|
|
|
670
713
|
)
|
|
671
714
|
|
|
672
715
|
if status is None:
|
|
716
|
+
detail = f"could not reach {url}: {raw}"
|
|
717
|
+
hint = await _llamacpp_port_hint(provider.base_url)
|
|
718
|
+
if hint:
|
|
719
|
+
detail = f"{detail}. {hint}"
|
|
673
720
|
return ProbeResult(
|
|
674
721
|
name="auth+basic-chat",
|
|
675
722
|
verdict=ProbeVerdict.TRANSPORT_ERROR,
|
|
676
|
-
detail=
|
|
723
|
+
detail=detail,
|
|
677
724
|
)
|
|
678
725
|
|
|
679
726
|
if status in (401, 403):
|
{coderouter_cli-2.15.0 → coderouter_cli-2.15.1}/docs/backends/claude-code-llamacpp-vllm.en.md
RENAMED
|
@@ -35,6 +35,8 @@ llama-server -m ~/models/<model>.gguf --host 127.0.0.1 --port 8080 \
|
|
|
35
35
|
# Always check "n_ctx = 32768" in the startup log
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
> **About llama.cpp's default port**: since llama.cpp b11521 (2026-10-09), `llama-server` started without `--port` listens on **9931** (older builds: 8080). The commands on this page pass `--port 8080` explicitly, so they work on either build. If you start it without `--port`, point `base_url` in `providers.yaml` at `:9931`. `coderouter doctor --check-model` calls this out when one port refuses and the other answers.
|
|
39
|
+
|
|
38
40
|
**vLLM (NVIDIA GPU)**
|
|
39
41
|
|
|
40
42
|
```bash
|
|
@@ -35,6 +35,8 @@ llama-server -m ~/models/<model>.gguf --host 127.0.0.1 --port 8080 \
|
|
|
35
35
|
# 起動ログの「n_ctx = 32768」を必ず確認する
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
> **llama.cpp の既定ポートについて**: llama.cpp b11521(2026-10-09)以降、`--port` を省略した `llama-server` は **9931** で待ち受けます(それより前は 8080)。このページの手順は `--port 8080` を明示しているので、どちらの版でもそのまま動きます。`--port` を省略して起動した場合は、`providers.yaml` の `base_url` を `:9931` に合わせてください。`coderouter doctor --check-model` は、片方のポートに繋がらずもう片方が応答しているときにそう指摘します。
|
|
39
|
+
|
|
38
40
|
**vLLM(NVIDIA GPU)**
|
|
39
41
|
|
|
40
42
|
```bash
|
|
@@ -78,6 +78,8 @@ llama-server -m ./model.gguf --port 8080
|
|
|
78
78
|
curl http://localhost:8080/v1/models
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
> **About llama.cpp's default port**: since llama.cpp b11521 (2026-10-09), `llama-server` started without `--port` listens on **9931** (older builds: 8080). The commands on this page pass `--port 8080` explicitly, so they work on either build. If you start it without `--port`, point `base_url` in `providers.yaml` at `:9931`. `coderouter doctor --check-model` calls this out when one port refuses and the other answers.
|
|
82
|
+
|
|
81
83
|
### Common pitfalls
|
|
82
84
|
|
|
83
85
|
- **CUDA and Metal cannot coexist in one binary.** Build/download for the machine you will run on.
|
|
@@ -78,6 +78,8 @@ llama-server -m ./model.gguf --port 8080
|
|
|
78
78
|
curl http://localhost:8080/v1/models
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
+
> **llama.cpp の既定ポートについて**: llama.cpp b11521(2026-10-09)以降、`--port` を省略した `llama-server` は **9931** で待ち受けます(それより前は 8080)。このページの手順は `--port 8080` を明示しているので、どちらの版でもそのまま動きます。`--port` を省略して起動した場合は、`providers.yaml` の `base_url` を `:9931` に合わせてください。`coderouter doctor --check-model` は、片方のポートに繋がらずもう片方が応答しているときにそう指摘します。
|
|
82
|
+
|
|
81
83
|
### よくあるつまずき
|
|
82
84
|
|
|
83
85
|
- **CUDA と Metal は同一バイナリに同梱できません。** 実行マシンに合わせてビルド/ダウンロードしてください。
|
|
@@ -106,7 +106,7 @@ The Launcher screen is made up of a "MODELS panel," a "LAUNCH form," a "PROCESSE
|
|
|
106
106
|
| Field | Description |
|
|
107
107
|
|---|---|
|
|
108
108
|
| **Name** | Any identifier for management purposes (e.g. `qwen-coder-8080`) |
|
|
109
|
-
| **Port** | The port the server will run on (default `8080`) |
|
|
109
|
+
| **Port** | The port the server will run on (default `8080`). The Launcher always passes `--port`, so llama.cpp's own default-port change (9931 since b11521) does not affect it |
|
|
110
110
|
| **Backend** | Choose from `llama.cpp` / `vllm` / `mlx`. The resolved binary path and availability are shown below |
|
|
111
111
|
| **Model path** | Selected from the MODELS panel or entered directly |
|
|
112
112
|
| **Option profile** | Choose a preset defined in `providers.yaml` |
|
|
@@ -106,7 +106,7 @@ Launcher の画面は「MODELS パネル」「LAUNCH フォーム」「PROCESSES
|
|
|
106
106
|
| 項目 | 説明 |
|
|
107
107
|
|---|---|
|
|
108
108
|
| **名前** | 管理用の任意の識別子(例: `qwen-coder-8080`) |
|
|
109
|
-
| **ポート** | 起動するサーバーのポート(既定 `8080`) |
|
|
109
|
+
| **ポート** | 起動するサーバーのポート(既定 `8080`)。Launcher は常に `--port` を明示して起動するので、llama.cpp 側の既定ポート変更(b11521 以降 9931)の影響は受けない |
|
|
110
110
|
| **バックエンド** | `llama.cpp` / `vllm` / `mlx` から選択。解決されたバイナリパスと利用可否が下に表示される |
|
|
111
111
|
| **モデルパス** | MODELS パネルから選択するか直接入力 |
|
|
112
112
|
| **オプションプロファイル** | `providers.yaml` で定義したプリセットを選択 |
|
|
@@ -78,6 +78,9 @@ hf download unsloth/Qwen3.6-35B-A3B-GGUF \
|
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
- `--port 8080`: where CodeRouter connects.
|
|
81
|
+
|
|
82
|
+
> **About llama.cpp's default port**: since llama.cpp b11521 (2026-10-09), `llama-server` started without `--port` listens on **9931** (older builds: 8080). The commands on this page pass `--port 8080` explicitly, so they work on either build. If you start it without `--port`, point `base_url` in `providers.yaml` at `:9931`. `coderouter doctor --check-model` calls this out when one port refuses and the other answers.
|
|
83
|
+
|
|
81
84
|
- `--ctx-size 32768`: leaves headroom for Claude Code's 15-20K-token system prompt.
|
|
82
85
|
- `--n-predict 4096`: per-call generation cap.
|
|
83
86
|
- `--jinja`: use the chat template embedded in GGUF metadata (Unsloth GGUFs ship one).
|
|
@@ -91,6 +91,8 @@ ls -lah ~/models/qwen3.6-35b-a3b-unsloth/
|
|
|
91
91
|
- `-ngl 999`: 全 layer を GPU にオフロード (Metal)
|
|
92
92
|
- `--host 127.0.0.1`: localhost からのみ受け付け (security)
|
|
93
93
|
|
|
94
|
+
> **llama.cpp の既定ポートについて**: llama.cpp b11521(2026-10-09)以降、`--port` を省略した `llama-server` は **9931** で待ち受けます(それより前は 8080)。このページの手順は `--port 8080` を明示しているので、どちらの版でもそのまま動きます。`--port` を省略して起動した場合は、`providers.yaml` の `base_url` を `:9931` に合わせてください。`coderouter doctor --check-model` は、片方のポートに繋がらずもう片方が応答しているときにそう指摘します。
|
|
95
|
+
|
|
94
96
|
起動 log で以下が出れば OK:
|
|
95
97
|
|
|
96
98
|
```
|
|
@@ -202,45 +202,32 @@ The `claude-code` profile (local 2-tier + free cloud) is selected automatically.
|
|
|
202
202
|
|
|
203
203
|
## Pattern B: use it with the codex CLI
|
|
204
204
|
|
|
205
|
-
> **
|
|
206
|
-
>
|
|
207
|
-
> (`/v1/
|
|
205
|
+
> **Status (as of 2026-10): current Codex CLI cannot go through CodeRouter.**
|
|
206
|
+
> Codex removed `wire_api = "chat"` in 2026-02 and now speaks only the Responses API
|
|
207
|
+
> (`/v1/responses`). The old instruction to set `wire_api = "chat"` makes current Codex
|
|
208
|
+
> fail while loading its config. CodeRouter does not serve `/v1/responses` yet
|
|
209
|
+
> (planned; until then, use the workaround below).
|
|
208
210
|
|
|
209
|
-
### B-1.
|
|
211
|
+
### B-1. Workaround: connect Codex directly to a local inference server
|
|
210
212
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
```
|
|
213
|
+
The major local servers already serve `/v1/responses`, so Codex can talk to them without
|
|
214
|
+
CodeRouter in between. CodeRouter's fallback and tool-call repair do not apply in this setup.
|
|
214
215
|
|
|
215
|
-
|
|
216
|
+
- **Ollama / LM Studio**: `codex --oss` (Codex's built-in OSS provider)
|
|
217
|
+
- **llama.cpp (`llama-server`)**: add a provider to `~/.codex/config.toml`
|
|
216
218
|
|
|
217
219
|
```toml
|
|
218
|
-
model = "
|
|
219
|
-
model_provider = "
|
|
220
|
-
|
|
221
|
-
[model_providers.coderouter]
|
|
222
|
-
name = "CodeRouter"
|
|
223
|
-
base_url = "http://localhost:8088/v1"
|
|
224
|
-
env_key = "OPENAI_API_KEY"
|
|
225
|
-
wire_api = "chat" # required: the responses endpoint is not yet supported
|
|
226
|
-
```
|
|
220
|
+
model = "local"
|
|
221
|
+
model_provider = "llamacpp"
|
|
227
222
|
|
|
228
|
-
|
|
229
|
-
|
|
223
|
+
[model_providers.llamacpp]
|
|
224
|
+
name = "llama.cpp"
|
|
225
|
+
base_url = "http://127.0.0.1:9931/v1" # default port since b11521; use your --port if you set one
|
|
226
|
+
wire_api = "responses"
|
|
230
227
|
```
|
|
231
228
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
```bash
|
|
235
|
-
codex "write a python function that reverses a string"
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
Same backend chain, just spoken to in OpenAI shape. The `default` profile (local 7b + free cloud) is selected.
|
|
239
|
-
|
|
240
|
-
> **Models without tool-call support**: Codex drives all file and shell operations
|
|
241
|
-
> through tool calls. If the Ollama model does not support tool calling, Codex will
|
|
242
|
-
> connect but tools will silently do nothing. Run
|
|
243
|
-
> `coderouter doctor --check-model <model>` and confirm `tool_calls: OK` before use.
|
|
229
|
+
> **Models without tool calling**: Codex does all file and shell work through tool
|
|
230
|
+
> calls. A model without tool-call support will connect, but no tool will work.
|
|
244
231
|
|
|
245
232
|
---
|
|
246
233
|
|
|
@@ -199,46 +199,33 @@ profile は自動で `claude-code` (ローカル 2 段 + 無料クラウド) が
|
|
|
199
199
|
|
|
200
200
|
## Pattern B: codex CLI で使う
|
|
201
201
|
|
|
202
|
-
>
|
|
203
|
-
>
|
|
204
|
-
>
|
|
205
|
-
>
|
|
202
|
+
> **現状(2026-10 時点): 現行の Codex CLI は CodeRouter 経由では使えません。**
|
|
203
|
+
> Codex は 2026-02 に `wire_api = "chat"` を廃止し、Responses API(`/v1/responses`)でしか
|
|
204
|
+
> 通信しなくなりました。古い手順の `wire_api = "chat"` を書くと、現行の Codex は設定の
|
|
205
|
+
> 読み込み時にエラーで止まります。CodeRouter はまだ `/v1/responses` を持っていません
|
|
206
|
+
> (対応予定。それまでの代替は下記)。
|
|
206
207
|
|
|
207
|
-
### B-1.
|
|
208
|
+
### B-1. 代替: Codex をローカル推論サーバへ直結する
|
|
208
209
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
```
|
|
210
|
+
主要なローカル推論サーバは `/v1/responses` を持っているので、CodeRouter を挟まずに
|
|
211
|
+
Codex を直結できます。この場合 CodeRouter のフォールバックと tool 修復は効きません。
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
- **Ollama / LM Studio**: `codex --oss`(Codex 組み込みの OSS provider)
|
|
214
|
+
- **llama.cpp(`llama-server`)**: `~/.codex/config.toml` に provider を書く
|
|
214
215
|
|
|
215
216
|
```toml
|
|
216
|
-
model = "
|
|
217
|
-
model_provider = "
|
|
218
|
-
|
|
219
|
-
[model_providers.coderouter]
|
|
220
|
-
name = "CodeRouter"
|
|
221
|
-
base_url = "http://localhost:8088/v1"
|
|
222
|
-
env_key = "OPENAI_API_KEY"
|
|
223
|
-
wire_api = "chat" # ← 必須: responses エンドポイントは未対応
|
|
224
|
-
```
|
|
217
|
+
model = "local"
|
|
218
|
+
model_provider = "llamacpp"
|
|
225
219
|
|
|
226
|
-
|
|
227
|
-
|
|
220
|
+
[model_providers.llamacpp]
|
|
221
|
+
name = "llama.cpp"
|
|
222
|
+
base_url = "http://127.0.0.1:9931/v1" # b11521 以降の既定ポート。--port を付けたならその値
|
|
223
|
+
wire_api = "responses"
|
|
228
224
|
```
|
|
229
225
|
|
|
230
|
-
### B-3. 実行
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
codex "write a python function that reverses a string"
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
同じバックエンドチェーンに対して OpenAI 形式で話しかけているだけです。profile は `default` (ローカル 7b + 無料クラウド) が選ばれます。
|
|
237
|
-
|
|
238
226
|
> **tool call 非対応モデルについて**: Codex はファイル操作・シェル実行をすべて
|
|
239
|
-
> tool call
|
|
240
|
-
>
|
|
241
|
-
> `tool_calls: OK` を確認してから使ってください。
|
|
227
|
+
> tool call で行います。モデルが tool call に対応していないと、接続はできてもツールが
|
|
228
|
+
> 動きません。
|
|
242
229
|
|
|
243
230
|
---
|
|
244
231
|
|
|
@@ -18,7 +18,7 @@ knob, and what wire format it speaks.
|
|
|
18
18
|
| Agent | Wire format | Can point at Ollama directly? | Need CodeRouter? |
|
|
19
19
|
|---|---|---|---|
|
|
20
20
|
| **Claude Code** | Anthropic `/v1/messages` | No — Ollama speaks OpenAI | **Yes** — wire translation is the whole point |
|
|
21
|
-
| **Codex CLI** (`@openai/codex`) | OpenAI | Yes,
|
|
21
|
+
| **Codex CLI** (`@openai/codex`) | OpenAI Responses | Yes, to servers with the Responses API (Ollama / LM Studio / llama.cpp) | **Not usable yet** — current Codex speaks only the Responses API, which CodeRouter does not serve yet (planned) |
|
|
22
22
|
| **Plain OpenAI SDK / `curl`** | OpenAI | Yes, via `base_url` | Optional — same as above |
|
|
23
23
|
| **gemini-cli** | Gemini | No — different wire | Yes, once a Gemini adapter is added |
|
|
24
24
|
| **GitHub Copilot CLI** (`gh copilot`) | GitHub-proprietary | **No — backend is locked** | **N/A** — Copilot cannot be redirected at all |
|
|
@@ -91,10 +91,8 @@ Miss any one, and CodeRouter does real work.
|
|
|
91
91
|
Before adopting anything, prove your direct path actually works:
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
#
|
|
95
|
-
|
|
96
|
-
export OPENAI_API_KEY=ollama # dummy, Ollama ignores it
|
|
97
|
-
codex "write a function that reverses a string in rust"
|
|
94
|
+
# Connect Codex straight to Ollama (Codex's built-in OSS provider)
|
|
95
|
+
codex --oss "write a function that reverses a string in rust"
|
|
98
96
|
```
|
|
99
97
|
|
|
100
98
|
Watch for these four symptoms:
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| エージェント | wire 形式 | Ollama に直接向けられる? | CodeRouter 必要? |
|
|
12
12
|
|---|---|---|---|
|
|
13
13
|
| **Claude Code** | Anthropic `/v1/messages` | ✕ — Ollama は OpenAI しか喋らない | **必須** — 翻訳こそが本題 |
|
|
14
|
-
| **Codex CLI** (`@openai/codex`) | OpenAI | ◯ —
|
|
14
|
+
| **Codex CLI** (`@openai/codex`) | OpenAI Responses | ◯ — Responses API を持つサーバ(Ollama / LM Studio / llama.cpp)へ | **現状は使えない** — 現行の Codex は Responses API 専用で、CodeRouter は未対応(対応予定) |
|
|
15
15
|
| **素の OpenAI SDK / `curl`** | OpenAI | ◯ — `base_url` で | オプション — 同上 |
|
|
16
16
|
| **gemini-cli** | Gemini | ✕ — 別 wire | 必要(Gemini アダプタ追加時) |
|
|
17
17
|
| **GitHub Copilot CLI** (`gh copilot`) | GitHub 独自 | **✕ — バックエンド固定** | **無力** — Copilot 側が差し替え不可 |
|
|
@@ -70,10 +70,8 @@ CodeRouter の出力フィルタと修復ロジックは、**特定のモデル
|
|
|
70
70
|
何かを導入する前に、まず直続きが本当に動くか試すのが早いです:
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
|
-
# Codex
|
|
74
|
-
|
|
75
|
-
export OPENAI_API_KEY=ollama # ダミー。Ollama は無視
|
|
76
|
-
codex "write a function that reverses a string in rust"
|
|
73
|
+
# Codex を Ollama に直結する(Codex 組み込みの OSS provider)
|
|
74
|
+
codex --oss "write a function that reverses a string in rust"
|
|
77
75
|
```
|
|
78
76
|
|
|
79
77
|
以下 4 症状を観察:
|
|
@@ -29,7 +29,8 @@
|
|
|
29
29
|
# ポート番号は /launcher の Launch フォームで指定したものと合わせてください。
|
|
30
30
|
|
|
31
31
|
providers:
|
|
32
|
-
# llama.cpp (llama-server) を 8080 で起動した場合
|
|
32
|
+
# llama.cpp (llama-server) を --port 8080 で起動した場合
|
|
33
|
+
# (b11521 以降の llama.cpp は --port を省略すると 9931 で待ち受ける)
|
|
33
34
|
- name: llama-cpp-local
|
|
34
35
|
kind: openai_compat
|
|
35
36
|
base_url: http://localhost:8080/v1
|
|
@@ -84,6 +84,8 @@ providers:
|
|
|
84
84
|
# ------------------------------------------------------------
|
|
85
85
|
|
|
86
86
|
# llama.cpp --api-server — fastest if you have a GGUF loaded
|
|
87
|
+
# Port: started with `--port 8080` here. llama.cpp b11521+ (2026-10-09)
|
|
88
|
+
# listens on 9931 when `--port` is omitted (older builds: 8080).
|
|
87
89
|
- name: local-llamacpp
|
|
88
90
|
kind: openai_compat
|
|
89
91
|
base_url: http://localhost:8080/v1
|
|
@@ -120,7 +122,7 @@ providers:
|
|
|
120
122
|
# --include "*UD-Q4_K_M*" "*tokenizer*" "*chat_template*" \
|
|
121
123
|
# --local-dir ~/models/qwen3.6-35b-a3b-unsloth
|
|
122
124
|
#
|
|
123
|
-
# # 3. llama-server 起動 (port 8080)
|
|
125
|
+
# # 3. llama-server 起動 (port 8080 を明示。b11521 以降は省略すると 9931)
|
|
124
126
|
# ~/llama.cpp/build/bin/llama-server \
|
|
125
127
|
# --model ~/models/qwen3.6-35b-a3b-unsloth/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf \
|
|
126
128
|
# --port 8080 --ctx-size 32768 --n-predict 4096 \
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
# in plan.md §11.B; once granted, this name will become an alias and
|
|
12
12
|
# `coderouter` will become the canonical distribution name.
|
|
13
13
|
name = "coderouter-cli"
|
|
14
|
-
version = "2.15.
|
|
14
|
+
version = "2.15.1"
|
|
15
15
|
description = "Local-first, free-first, fallback-built-in LLM router. Claude Code / OpenAI compatible."
|
|
16
16
|
readme = "README.md"
|
|
17
17
|
requires-python = ">=3.12"
|