coderouter-cli 1.8.2__tar.gz → 1.8.5__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-1.8.2 → coderouter_cli-1.8.5}/CHANGELOG.md +130 -3
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/PKG-INFO +13 -9
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/README.en.md +14 -9
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/README.md +12 -8
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/adapters/openai_compat.py +30 -14
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/doctor.py +94 -14
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/free-tier-guide.en.md +4 -1
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/free-tier-guide.md +3 -1
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/hf-ollama-models.md +17 -3
- coderouter_cli-1.8.5/docs/llamacpp-direct.en.md +232 -0
- coderouter_cli-1.8.5/docs/llamacpp-direct.md +285 -0
- coderouter_cli-1.8.5/docs/lmstudio-direct.en.md +405 -0
- coderouter_cli-1.8.5/docs/lmstudio-direct.md +407 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/quickstart.en.md +15 -7
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/quickstart.md +12 -6
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/troubleshooting.en.md +24 -3
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/troubleshooting.md +40 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/providers.yaml +181 -2
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/pyproject.toml +1 -1
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_doctor.py +78 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_reasoning_strip.py +72 -2
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_setup_sh.py +6 -6
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/.gitignore +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/LICENSE +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/__main__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/adapters/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/adapters/anthropic_native.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/adapters/base.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/adapters/registry.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/cli.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/cli_stats.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/config/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/config/capability_registry.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/config/env_file.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/config/loader.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/config/schemas.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/data/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/data/model-capabilities.yaml +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/doctor_apply.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/env_security.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/errors.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/anthropic_routes.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/app.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/dashboard_routes.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/metrics_routes.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/ingress/openai_routes.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/logging.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/metrics/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/metrics/collector.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/metrics/prometheus.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/output_filters.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/routing/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/routing/auto_router.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/routing/capability.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/routing/fallback.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/translation/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/translation/anthropic.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/translation/convert.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/coderouter/translation/tool_repair.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/assets/dashboard-demo.png +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/designs/v1.5-dashboard-mockup.html +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/designs/v1.6-auto-router-verification.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/designs/v1.6-auto-router.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/openrouter-roster/README.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/openrouter-roster/latest.json +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v0.4.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v0.5-verify.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v0.5.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v0.6.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v0.7.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v1.0-verify.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/retrospectives/v1.0.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/security.en.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/security.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/usage-guide.en.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/usage-guide.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/when-do-i-need-coderouter.en.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/docs/when-do-i-need-coderouter.md +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/.env.example +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/providers.auto-custom.yaml +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/providers.auto.yaml +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/providers.note-2026.yaml +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/examples/providers.nvidia-nim.yaml +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/scripts/demo_traffic.sh +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/scripts/openrouter_roster_diff.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/scripts/verify_v0_5.sh +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/scripts/verify_v1_0.sh +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/__init__.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/conftest.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_adapter_anthropic.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_auto_router.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_capability.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_capability_degraded_payload.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_capability_registry.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_claude_code_suitability.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_cli.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_cli_stats.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_config.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_dashboard_endpoint.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_doctor_apply.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_env_file.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_env_security.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_errors.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_examples_yaml.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback_anthropic.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback_cache_control.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback_misconfig_warn.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback_paid_gate.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_fallback_thinking.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_ingress_anthropic.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_ingress_profile.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_metrics_collector.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_metrics_endpoint.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_metrics_jsonl.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_metrics_prometheus.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_openai_compat.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_openrouter_roster_diff.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_output_filters.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_output_filters_adapters.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_tool_repair.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_translation_anthropic.py +0 -0
- {coderouter_cli-1.8.2 → coderouter_cli-1.8.5}/tests/test_translation_reverse.py +0 -0
|
@@ -6,6 +6,133 @@ versioning follows [SemVer](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
## [v1.8.5] — 2026-04-28 (doctor NEEDS_TUNING メッセージを v1.8.3 thinking-aware budget の事実に揃える + `docs/lmstudio-direct.md` 新規)
|
|
10
|
+
|
|
11
|
+
**Theme: 文言の整合 patch + ドキュメント補完。**v1.8.3 で `tool_calls` / `num_ctx` / `streaming` の 3 probe に thinking-aware budget (256 / 1024) を入れた。今回はその事実を NEEDS_TUNING 時の detail メッセージに反映し、operator が「probe budget が小さすぎたのでは」と疑う余地をなくす。あわせて v1.8.4 で実機検証した LM Studio 0.4.12 経由経路を `docs/llamacpp-direct.md` と対をなす形で `docs/lmstudio-direct.md` (+ `.en.md`) として正式化。
|
|
12
|
+
|
|
13
|
+
- Tests: 737 → 737 (既存 assert は phrase-substring を見ていないので追従不要、新規 assertion は不足分を 1 件追加)
|
|
14
|
+
- Runtime deps: 5 → 5 (22 sub-release 連続据え置き)
|
|
15
|
+
- Backward compat: 完全互換、`providers.yaml` / `~/.coderouter/model-capabilities.yaml` / コード側 API 変更なし
|
|
16
|
+
|
|
17
|
+
### Changes
|
|
18
|
+
|
|
19
|
+
#### Doctor NEEDS_TUNING 文言更新 (suggestion を thinking-aware budget 前提に揃える)
|
|
20
|
+
|
|
21
|
+
- **`coderouter/doctor.py` `_probe_tool_calls`**: 「Common for quantized small models」を残しつつ、thinking モデル時は `Probed with thinking-aware budget (1024 tokens, covers reasoning_content plus the call) — this is a true tools=false case, not budget exhaustion.` を前置。非 thinking 時は `Probed with default budget (256 tokens) — the model produced no tool-shaped output at all.` を前置
|
|
22
|
+
- **`coderouter/doctor.py` `_probe_streaming`**: `finish_reason='length'` 偽陽性回避のため、thinking 時は `Probe sent max_tokens=1024 (thinking-aware), so the cap is server-side options.num_predict rather than the probe budget.` を前置。非 thinking 時は `Probe sent max_tokens=512;` 系を前置
|
|
23
|
+
- **`coderouter/doctor.py` `_probe_num_ctx`**: 「canary missing」3 ケース (declared=None / declared<threshold / declared>=threshold) すべてに、thinking モデル時は `Probe sent max_tokens=1024 (thinking-aware), so the miss is prompt-side truncation rather than reply truncation.` の budget note を追加。これで operator が「probe の reply budget が足りなかったのでは」という疑問を即座に消せる
|
|
24
|
+
|
|
25
|
+
#### Documentation 補完: `docs/lmstudio-direct.md` 新規
|
|
26
|
+
|
|
27
|
+
- **`docs/lmstudio-direct.md` / `.en.md` 新規** — v1.8.4 で実機検証した LM Studio 0.4.12 経由経路を `docs/llamacpp-direct.md` と対をなす形で 7 step + Troubleshooting で。M3 Max 64GB / Q4_K_M / Metal 想定 + GUI 操作前提の canonical recipe
|
|
28
|
+
- Step 1: LM Studio install & Discover タブで Q4_K_M モデルダウンロード (Qwen3.5 9B / Qwen3.6 35B-A3B / Jackrong/Qwopus3.5-9B-v3-GGUF)
|
|
29
|
+
- Step 2: Chat タブで Load Model (Context 32768 / GPU max / Flash Attention ON)
|
|
30
|
+
- Step 3: Local Server タブで Port 1234 / Just-in-time Model Loading: ON / Start Server
|
|
31
|
+
- Step 4: curl 直叩き (OpenAI 互換 + Anthropic 互換 両ルート、native tool_calls / native tool_use 両方確認)
|
|
32
|
+
- Step 5: CodeRouter に provider 登録 (`kind: openai_compat` 経路 + `kind: anthropic` 経路の 2 種)
|
|
33
|
+
- Step 6: doctor 6 probe で動作確認 (両ルートとも全 probe OK)
|
|
34
|
+
- Step 7: CodeRouter 経由 end-to-end (Anthropic prompt caching `cache_read_input_tokens: 280` 観測も含む)
|
|
35
|
+
|
|
36
|
+
### Why
|
|
37
|
+
|
|
38
|
+
v1.8.3 で `tool_calls` probe の active-harmful 誤診断 (thinking モデルに対して `tools: false` 提案) を fix したが、メッセージ文面はそのまま v1.8.2 以前の言い回し (「Common for quantized small models」のみ) を残していた。operator が NEEDS_TUNING を見たときに「probe budget が小さすぎたのでは」「v1.8.2 のバグの再発では」と疑う余地が文面上残っていたのを、**実装が既に thinking-aware なので断定できる** という事実に文言を揃える。診断ツールの出力は実装の confidence を反映すべき。
|
|
39
|
+
|
|
40
|
+
`docs/lmstudio-direct.md` は v1.8.4 で実機検証 + `examples/providers.yaml` に provider 例追加までは済ませていたが、`docs/llamacpp-direct.md` と並ぶレベルの canonical recipe ドキュメントが欠けていた。LM Studio 経由が現時点で最も `qwen35` / `qwen35moe` architecture を安定して動かせる経路 (Anthropic prompt caching まで透過) なので、operator が辿り着けるドキュメントとして正式化。
|
|
41
|
+
|
|
42
|
+
### Migration
|
|
43
|
+
|
|
44
|
+
`pyproject.toml version 1.8.3 → 1.8.5`、`coderouter --version` は 1.8.5 を返す。**手元の `~/.coderouter/providers.yaml` は触らない限り完全に変化なし**。doctor 出力の文面が変わるが verdict と suggested_patch の semantic は完全互換。
|
|
45
|
+
|
|
46
|
+
### Files touched
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
M CHANGELOG.md
|
|
50
|
+
M coderouter/doctor.py
|
|
51
|
+
M pyproject.toml
|
|
52
|
+
A docs/lmstudio-direct.md
|
|
53
|
+
A docs/lmstudio-direct.en.md
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## [v1.8.3] — 2026-04-26 (tool_calls probe も thinking モデル対応 + adapter で `reasoning_content` strip — llama.cpp 直叩き対応)
|
|
59
|
+
|
|
60
|
+
**Theme: v1.8.2 と同日リリースの第 2 弾 patch。Qwen3.6:35b-a3b on llama.cpp の実機検証で発見した 2 つの追加課題 — `tool_calls` probe の thinking モデル偽陽性 + llama.cpp が emit する `reasoning_content` フィールドの adapter strip 不足 — を解消。**
|
|
61
|
+
|
|
62
|
+
v1.8.2 リリース直後、note 記事 v1.8.2「自分が作った診断ツールに自分が騙された話」の続編として **「Ollama 経由で詰んだ Qwen3.6 を Unsloth GGUF + llama.cpp 直叩きで動かしたら native tool_calls が完璧に出た」** を実機検証中、CodeRouter doctor で `tool_calls [NEEDS TUNING]` が依然として出る矛盾に直面。深掘りで `tool_calls` probe の `max_tokens=64` が thinking モデルで `reasoning_content` トークン消費に食い切られる **v1.8.2 で num_ctx / streaming に対して直したのと完全に同じバグ pattern が tool_calls probe にも残っていた** ことが判明。あわせて llama.cpp の `reasoning_content` フィールド (Ollama / OpenRouter は `reasoning`) が openai_compat adapter の strip 対象に入っていなかった事実も発見。両者を v1.8.3 として 1 patch に統合。
|
|
63
|
+
|
|
64
|
+
**Ollama 経由詰みの真因が完全確定**: Ollama の chat template / tool 仕様未成熟、モデル本体は健全。llama.cpp 直叩きでは Qwen3.6 系の `tool_calls` が native で動作。
|
|
65
|
+
|
|
66
|
+
- Tests: 733 → **737** (+4: tool_calls probe budget thinking variant / reasoning_content strip 3 件)
|
|
67
|
+
- Runtime deps: 5 → 5 (21 sub-release 連続据え置き)
|
|
68
|
+
- Backward compat: 完全互換、`providers.yaml` / `~/.coderouter/model-capabilities.yaml` 編集不要
|
|
69
|
+
|
|
70
|
+
### Changes
|
|
71
|
+
|
|
72
|
+
#### Doctor `tool_calls` probe: thinking モデル対応バジェット
|
|
73
|
+
|
|
74
|
+
- **`coderouter/doctor.py`**: `_probe_tool_calls` の `max_tokens` を `64` 固定から **thinking 検出付きの動的選択** (256 default / 1024 thinking) に変更。`_TOOL_CALLS_PROBE_MAX_TOKENS_DEFAULT/_THINKING` 定数を新設、既存の `_is_reasoning_model(provider, resolved)` ヘルパで分岐。
|
|
75
|
+
- 旧 64 では Qwen3.6:35b-a3b on llama.cpp が `reasoning_content` で 64 token 食い切り → `tool_calls` 出力前に length cap → **NEEDS_TUNING + suggested patch 「`tools: false` にしろ」という真逆の推奨** を出していた
|
|
76
|
+
- 新 1024 で thinking + tool_call が両方収まる headroom
|
|
77
|
+
|
|
78
|
+
#### Adapter: `reasoning_content` フィールド strip 追加
|
|
79
|
+
|
|
80
|
+
- **`coderouter/adapters/openai_compat.py`**: `_strip_reasoning_field` を `_NON_STANDARD_REASONING_KEYS = ("reasoning", "reasoning_content")` の両方を strip するように拡張。
|
|
81
|
+
- `reasoning` (Ollama / OpenRouter 命名) と `reasoning_content` (llama.cpp `llama-server` 命名) は同じ概念で、ベンダー命名が違うだけ
|
|
82
|
+
- 厳格な OpenAI client はどちらも unknown key として reject するので、両方 strip するのが正しい
|
|
83
|
+
- `capability-degraded` log の `dropped` フィールドも `["reasoning", "reasoning_content"]` に更新 (両方 strip し得ることを表現)
|
|
84
|
+
|
|
85
|
+
#### Doctor `reasoning-leak` probe: `reasoning_content` 検出
|
|
86
|
+
|
|
87
|
+
- **`coderouter/doctor.py`**: `_probe_reasoning_leak` の `has_reasoning` 判定を `"reasoning" in msg or "reasoning_content" in msg` に拡張。llama.cpp 経由 provider でも reasoning leak を informational に検出可能に。
|
|
88
|
+
|
|
89
|
+
#### Tests
|
|
90
|
+
|
|
91
|
+
- **`tests/test_doctor.py`** + 1: `test_tool_calls_max_tokens_bumped_for_thinking_provider` (thinking provider で tool_calls probe が 1024 を要求、native tool_calls 応答で OK 判定)
|
|
92
|
+
- **`tests/test_reasoning_strip.py`** + 3: `test_strip_helper_removes_reasoning_content_field` / `test_strip_helper_removes_both_reasoning_and_reasoning_content` / `test_strip_helper_removes_reasoning_content_from_delta` (各 layer で `reasoning_content` 除去確認)
|
|
93
|
+
- 既存 `tests/test_reasoning_strip.py` の `recs[0].dropped == ["reasoning"]` を `["reasoning", "reasoning_content"]` に更新 (log の表現変更に追従)
|
|
94
|
+
|
|
95
|
+
### Why
|
|
96
|
+
|
|
97
|
+
v1.8.2 で「diagnostic ツール自身も diagnostic され続ける必要がある」というメタ教訓を書いた直後、まさにそのことを実証する形で残バグが発見された。`tool_calls` probe は num_ctx / streaming probe と同じ「thinking モデルの reasoning トークン消費を考慮していない `max_tokens=64`」問題を抱えていて、しかも doctor の出した suggested patch (`tools: false` に倒せ) は **完全に逆の対処を勧めていた** — false-positive どころか、誠実なユーザーが従うと healthy なモデルを抑制してしまう **active-harmful な誤診断**。
|
|
98
|
+
|
|
99
|
+
これは v1.8.2 の patch を当てる時点で見つけるべきだった見落としで、note 記事 v1.8.2 のメタ教訓「diagnostic ツール自身も diagnostic され続ける」が現実に試された格好。素早く v1.8.3 で潰す。
|
|
100
|
+
|
|
101
|
+
`reasoning_content` strip 追加は llama.cpp 直叩き経路を CodeRouter から綺麗に使えるようにする ergonomic 改善で、`v1.8.x` patch 候補で plan.md に記録済みだった項目を実機発見と同時に消化。
|
|
102
|
+
|
|
103
|
+
### Migration
|
|
104
|
+
|
|
105
|
+
`pyproject.toml version 1.8.2 → 1.8.3`、`coderouter --version` は 1.8.3 を返す。**手元の `~/.coderouter/providers.yaml` は触らない限り完全に変化なし**。
|
|
106
|
+
|
|
107
|
+
v1.8.2 で Qwen3.6 / Gemma 4 系 thinking provider に対して `tool_calls [NEEDS TUNING]` が出ていたユーザーは v1.8.3 で再実行すると **OK** 判定 (実機で動いていた provider が doctor 上でも妥当に評価される)。llama.cpp 直叩き provider を使っているユーザーは `reasoning_content` が client に流れることなく綺麗に strip される。
|
|
108
|
+
|
|
109
|
+
### Files touched
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
M CHANGELOG.md
|
|
113
|
+
M coderouter/adapters/openai_compat.py
|
|
114
|
+
M coderouter/doctor.py
|
|
115
|
+
M pyproject.toml
|
|
116
|
+
M plan.md
|
|
117
|
+
M docs/troubleshooting.md
|
|
118
|
+
M tests/test_doctor.py
|
|
119
|
+
M tests/test_reasoning_strip.py
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Post-release docs followup (同 commit ではなく追加 commit で)
|
|
123
|
+
|
|
124
|
+
llama.cpp 直叩き経路を canonical な救済路として正式採用したのを受け、関連ドキュメントを v1.8.3 後に整理:
|
|
125
|
+
|
|
126
|
+
- **`docs/llamacpp-direct.md` / `.en.md` 新規** — `llama.cpp` build → Unsloth GGUF → `llama-server` → CodeRouter 接続を 7 step + Troubleshooting で。M3 Max 64GB / Q4_K_M / Metal 想定の canonical recipe
|
|
127
|
+
- **`setup.sh`**: 48 GB+ tier の推奨を旧 `qwen3.6:35b` → `gemma4:26b` に変更 (Ollama 経由詰みのため)。upgrade hint からも Qwen3.6 系を撤去、代わりに `docs/llamacpp-direct.md` への誘導を追加
|
|
128
|
+
- **`docs/quickstart.md` / `.en.md`**: 「より良いモデル」セクションの `ollama pull qwen3.6:35b` を撤去、`docs/llamacpp-direct.md` への誘導追加
|
|
129
|
+
- **`docs/hf-ollama-models.md`**: `ollama pull qwen3.6:35b` を「⚠️ Qwen3.6 系は Ollama 経由で詰みやすい」警告に置換、llama.cpp 直叩き経路の案内を追加
|
|
130
|
+
- **`README.md` / `.en.md`**: ドキュメント目次に「llama.cpp 直叩きガイド」行を追加、英語版言語スイッチャーにも `llama.cpp direct` リンクを追加
|
|
131
|
+
- **`examples/providers.yaml`**: `llamacpp-qwen3-6-35b-a3b` provider 例を追加 + `coding` profile chain primary に組み込み (詳細コメント付き)。Qwen3.6 系 Ollama 経路のコメントも v1.8.3 結果反映で更新
|
|
132
|
+
- **`tests/test_setup_sh.py`**: 48 GB / 64 GB tier の expected_model assertion を `qwen3.6:35b` → `gemma4:26b` に追従更新
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
9
136
|
## [v1.8.2] — 2026-04-26 (doctor probe を thinking モデル対応に — Gemma 4 偽陽性の解消)
|
|
10
137
|
|
|
11
138
|
**Theme: v1.8.1 リリース直後の深掘りで `doctor` の `num_ctx` / `streaming` probe が thinking モデルに対して偽陽性 NEEDS_TUNING を出していた事実を発見、probe の `max_tokens` バジェットを reasoning トークン消費分込みで設計し直した patch。**
|
|
@@ -333,7 +460,7 @@ $ curl -sI "https://pypi.org/pypi/coderouter-cli/json" | head -1
|
|
|
333
460
|
HTTP/2 200
|
|
334
461
|
```
|
|
335
462
|
|
|
336
|
-
CDN 伝播後に `uvx coderouter-cli --version` で本物の PyPI
|
|
463
|
+
CDN 伝播後に `uvx --from coderouter-cli coderouter --version` で本物の PyPI 経由インストールも確認済み (uv 0.11+ では package 名 ≠ executable 名のとき `--from` 必須、Issue #10 で報告者から fb)。
|
|
337
464
|
|
|
338
465
|
### Migration
|
|
339
466
|
|
|
@@ -343,8 +470,8 @@ CDN 伝播後に `uvx coderouter-cli --version` で本物の PyPI 経由イン
|
|
|
343
470
|
# 旧 (引き続き有効)
|
|
344
471
|
uv tool install --from git+https://github.com/zephel01/CodeRouter.git coderouter-cli
|
|
345
472
|
|
|
346
|
-
# 新 (PyPI から、コマンド 1 行)
|
|
347
|
-
uvx coderouter-cli serve --port 8088
|
|
473
|
+
# 新 (PyPI から、コマンド 1 行 — uv 0.11+ canonical 形式)
|
|
474
|
+
uvx --from coderouter-cli coderouter serve --port 8088
|
|
348
475
|
# あるいは恒久的に:
|
|
349
476
|
uv tool install coderouter-cli
|
|
350
477
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: coderouter-cli
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.5
|
|
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
|
|
@@ -60,7 +60,7 @@ Description-Content-Type: text/markdown
|
|
|
60
60
|
<p align="center">
|
|
61
61
|
<a href="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml"><img src="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
|
|
62
62
|
<a href=""><img src="https://img.shields.io/badge/status-stable-brightgreen" alt="status"></a>
|
|
63
|
-
<a href=""><img src="https://img.shields.io/badge/version-1.8.
|
|
63
|
+
<a href=""><img src="https://img.shields.io/badge/version-1.8.5-blue" alt="version"></a>
|
|
64
64
|
<a href=""><img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="python"></a>
|
|
65
65
|
<a href=""><img src="https://img.shields.io/badge/runtime%20deps-5-brightgreen" alt="deps"></a>
|
|
66
66
|
<a href=""><img src="https://img.shields.io/badge/license-MIT-yellow" alt="license"></a>
|
|
@@ -99,11 +99,13 @@ Description-Content-Type: text/markdown
|
|
|
99
99
|
| **無料で回す** | [無料枠ガイド](./docs/free-tier-guide.md) | NVIDIA NIM 40 req/min × OpenRouter 無料枠の使い分け・live 検証済みモデル表・地雷 5 点 |
|
|
100
100
|
| **要るか判断する** | [要否判定ガイド](./docs/when-do-i-need-coderouter.md) | エージェント × モデルの詳細マトリクスで「そもそも自分に必要か」を決める |
|
|
101
101
|
| **詰まったとき** | [トラブルシューティング](./docs/troubleshooting.md) | `doctor` の使い方、`.env` の export 必須、Ollama サイレント失敗 5 症状、Claude Code 連携の罠 |
|
|
102
|
+
| **llama.cpp 直叩き** | [llama.cpp 直叩きガイド](./docs/llamacpp-direct.md) | Qwen3.6 を Ollama 詰みから救出する経路。`llama.cpp` build → Unsloth GGUF → `llama-server` → CodeRouter 接続を 7 step で(v1.8.3 実機検証済)|
|
|
103
|
+
| **LM Studio 直接** | [LM Studio 直接ガイド](./docs/lmstudio-direct.md) | `qwen35` / `qwen35moe` を救う第 2 経路。LM Studio 0.4.12+ Local Server 経由で OpenAI 互換 + Anthropic 互換 (`/v1/messages`) 両対応、prompt caching 透過(v1.8.4 実機検証済)|
|
|
102
104
|
| **安全に使う** | [セキュリティ方針](./docs/security.md) | 脅威モデル・秘密情報の扱い・脆弱性報告経路 |
|
|
103
|
-
| **履歴** | [CHANGELOG](./CHANGELOG.md) | 全リリース履歴(最新: v1.8.
|
|
105
|
+
| **履歴** | [CHANGELOG](./CHANGELOG.md) | 全リリース履歴(最新: v1.8.5 — doctor NEEDS_TUNING メッセージを v1.8.3 thinking-aware budget の事実に揃える + `docs/lmstudio-direct.md` 新規) |
|
|
104
106
|
| **設計を追う** | [plan.md](./plan.md) | 設計不変項・マイルストーン・今後のロードマップ |
|
|
105
107
|
|
|
106
|
-
English versions: [Quickstart](./docs/quickstart.en.md) · [Usage guide](./docs/usage-guide.en.md) · [Free-tier guide](./docs/free-tier-guide.en.md) · [When you need it](./docs/when-do-i-need-coderouter.en.md) · [Troubleshooting](./docs/troubleshooting.en.md) · [Security](./docs/security.en.md)
|
|
108
|
+
English versions: [Quickstart](./docs/quickstart.en.md) · [Usage guide](./docs/usage-guide.en.md) · [Free-tier guide](./docs/free-tier-guide.en.md) · [When you need it](./docs/when-do-i-need-coderouter.en.md) · [Troubleshooting](./docs/troubleshooting.en.md) · [llama.cpp direct](./docs/llamacpp-direct.en.md) · [LM Studio direct](./docs/lmstudio-direct.en.md) · [Security](./docs/security.en.md)
|
|
107
109
|
|
|
108
110
|
## CodeRouter で何が楽になるか
|
|
109
111
|
|
|
@@ -175,7 +177,7 @@ OpenAI 互換エージェント + お行儀の良いモデル + フォールバ
|
|
|
175
177
|
|
|
176
178
|
## クイックスタート(3 コマンド)
|
|
177
179
|
|
|
178
|
-
**v1.7.0 で PyPI 公開**、**v1.8.0 で用途別 4 プロファイル + Z.AI/GLM
|
|
180
|
+
**v1.7.0 で PyPI 公開**、**v1.8.0 で用途別 4 プロファイル + Z.AI/GLM 連携**を追加、**v1.8.2 で doctor probe を thinking モデル対応**にしました。`uvx` 一発で動きます (Python 3.12 以上必須):
|
|
179
181
|
|
|
180
182
|
```bash
|
|
181
183
|
# 1. サンプル設定を置く
|
|
@@ -184,7 +186,9 @@ curl -fsSL https://raw.githubusercontent.com/zephel01/CodeRouter/main/examples/p
|
|
|
184
186
|
> ~/.coderouter/providers.yaml
|
|
185
187
|
|
|
186
188
|
# 2. uvx で起動 (インストール + 起動が 1 行)
|
|
187
|
-
|
|
189
|
+
# PyPI 配布名 (coderouter-cli) と console script 名 (coderouter) が異なるため、
|
|
190
|
+
# uv 0.11+ では --from 形式が必須 (旧 uv でも動く canonical 形式)
|
|
191
|
+
uvx --from coderouter-cli coderouter serve --port 8088
|
|
188
192
|
```
|
|
189
193
|
|
|
190
194
|
恒久的にインストールしておきたい場合:
|
|
@@ -205,7 +209,7 @@ uv run coderouter serve --port 8088
|
|
|
205
209
|
|
|
206
210
|
> **注**: PyPI 上のパッケージ名は `coderouter-cli` ですが、コマンド名と Python import 名は `coderouter` のままです。詳しくは [CHANGELOG `[v1.7.0]`](./CHANGELOG.md#v170--2026-04-25-pypi-公開-uvx-coderouter-cli-一発で動く) 参照。
|
|
207
211
|
>
|
|
208
|
-
>
|
|
212
|
+
> **`--apply` 自動化を使う場合** (v1.8.0+): `ruamel.yaml` を optional dep として一緒に入れます (`pip install 'coderouter-cli[doctor]'` または `uv pip install ruamel.yaml`)。基本機能には不要です。
|
|
209
213
|
|
|
210
214
|
あとは任意の OpenAI クライアントを `http://127.0.0.1:8088` に向けるだけです:
|
|
211
215
|
|
|
@@ -257,7 +261,7 @@ CodeRouter 自体は純 Python 3.12+ で、実質的な OS 対応範囲は `min(
|
|
|
257
261
|
|
|
258
262
|
**リリース単位の詳細が欲しい?** v0.x と v1.0-A/B/C の各スライス — 何が入り、何本のテストが増え、なぜ必要だったのか — は [CHANGELOG.md](./CHANGELOG.md) に揃っています。設計の不変項と今後のロードマップは [plan.md](./plan.md)。
|
|
259
263
|
|
|
260
|
-
**次の予定**(v1.0 は [plan.md §10](./plan.md)、v1.0+ は §18): v1.5 ✅ メトリクス / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`、v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM 無料枠 + トラブルシュートドキュメント分離 + `--env-file` / `doctor --check-env`、v1.7 ✅ PyPI 公開 (`uvx coderouter-cli`)、v1.8 ✅ 用途別 4 プロファイル (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) 登録 + `setup.sh` onboarding ウィザード + `coderouter doctor --check-model --apply` (非破壊 YAML 書き戻し) + `claude_code_suitability` startup チェック + Trusted Publishing 自動化。残り (v1.9 候補) は `coderouter doctor --network` (CI 用) / launcher スクリプト / 起動時アップデートチェック (opt-in)。
|
|
264
|
+
**次の予定**(v1.0 は [plan.md §10](./plan.md)、v1.0+ は §18): v1.5 ✅ メトリクス / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`、v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM 無料枠 + トラブルシュートドキュメント分離 + `--env-file` / `doctor --check-env`、v1.7 ✅ PyPI 公開 (`uvx --from coderouter-cli coderouter`)、v1.8 ✅ 用途別 4 プロファイル (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) 登録 + `setup.sh` onboarding ウィザード + `coderouter doctor --check-model --apply` (非破壊 YAML 書き戻し) + `claude_code_suitability` startup チェック + Trusted Publishing 自動化。残り (v1.9 候補) は `coderouter doctor --network` (CI 用) / launcher スクリプト / 起動時アップデートチェック (opt-in)。
|
|
261
265
|
|
|
262
266
|
### Claude Code と一緒に使う
|
|
263
267
|
|
|
@@ -432,7 +436,7 @@ suggested patch for ~/.coderouter/providers.yaml:
|
|
|
432
436
|
- v1.0 ✅ — 14 ケースのリグレッションスイート、Code Mode (スリム版 Claude Code ハーネス); 出力クリーニングは **v1.0-A** で `output_filters` チェーンとして完了
|
|
433
437
|
- v1.5 ✅ — **メトリクスダッシュボード(出荷済み)** — `MetricsCollector` + `GET /metrics.json` + `GET /metrics` (Prometheus) + `GET /dashboard` (HTML 1 ページ) + `coderouter stats` curses TUI + `scripts/demo_traffic.sh` トラフィックジェネレータ + `display_timezone` 設定
|
|
434
438
|
- v1.6 ✅ — `auto_router` (task-aware routing、`default_profile: auto` で画像/コード濃度/その他を自動振り分け) + NVIDIA NIM 無料枠 8 段チェーン + ドキュメント言語スワップ (JA primary) + トラブルシュート独立ドキュメント + `--env-file` / `doctor --check-env`
|
|
435
|
-
- v1.7 ✅ — PyPI 公開 (`uvx coderouter-cli` で 1 行起動) + Trusted Publishing 経路 (release.yml で自動 publish)
|
|
439
|
+
- v1.7 ✅ — PyPI 公開 (`uvx --from coderouter-cli coderouter` で 1 行起動) + Trusted Publishing 経路 (release.yml で自動 publish)
|
|
436
440
|
- v1.8 ✅ — **用途別 4 プロファイル + GLM/Gemma 4/Qwen3.6 公式化 + apply 自動化**: `multi` (default) / `coding` / `general` / `reasoning` の 4 プロファイル + 全プロファイルに `append_system_prompt` で Claude 風応答 nudge + `mode_aliases` (default/fast/vision/think/cheap)、Ollama 公式 tag 化された `gemma4:e4b/26b/31b` / `qwen3.6:27b/35b` を active stanza に格上げ、Z.AI を OpenAI-compat で 2 base_url 提供 (Coding Plan / General API)、`coderouter doctor --check-model --apply` で YAML パッチを非破壊書き戻し (`ruamel.yaml` round-trip でコメント・key 順序保持、冪等)、`setup.sh` onboarding ウィザード、`claude_code_suitability` startup チェック (Llama-3.3-70B 系を `claude-code-*` profile で WARN)。残り (v1.9 以降): `coderouter doctor --network` (CI 用)、launcher スクリプト (`.command` / `.sh` / `.bat`)、opt-in 起動時アップデートチェック
|
|
437
441
|
|
|
438
442
|
## `kind: openai_compat` と `kind: anthropic` の選び方
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<p align="center">
|
|
21
21
|
<a href="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml"><img src="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
|
|
22
22
|
<a href=""><img src="https://img.shields.io/badge/status-stable-brightgreen" alt="status"></a>
|
|
23
|
-
<a href=""><img src="https://img.shields.io/badge/version-1.8.
|
|
23
|
+
<a href=""><img src="https://img.shields.io/badge/version-1.8.5-blue" alt="version"></a>
|
|
24
24
|
<a href=""><img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="python"></a>
|
|
25
25
|
<a href=""><img src="https://img.shields.io/badge/runtime%20deps-5-brightgreen" alt="deps"></a>
|
|
26
26
|
<a href=""><img src="https://img.shields.io/badge/license-MIT-yellow" alt="license"></a>
|
|
@@ -58,11 +58,13 @@
|
|
|
58
58
|
| **Run for free** | [Free-tier guide](./docs/free-tier-guide.en.md) | Stacking NVIDIA NIM (40 req/min) with OpenRouter free: live-verified roster and five footguns |
|
|
59
59
|
| **Decide if you need it** | [Decision guide](./docs/when-do-i-need-coderouter.en.md) | Agent × model matrix to figure out whether CodeRouter fits your setup at all |
|
|
60
60
|
| **When stuck** | [Troubleshooting](./docs/troubleshooting.en.md) | How to use `doctor`, why `.env` needs `export`, the 5 Ollama silent-fail symptoms, Claude Code integration gotchas |
|
|
61
|
+
| **llama.cpp direct** | [llama.cpp direct guide](./docs/llamacpp-direct.en.md) | Rescue path for Qwen3.6 (Ollama is brittle). 7-step recipe: `llama.cpp` build → Unsloth GGUF → `llama-server` → CodeRouter wiring. Real-machine verified in v1.8.3. |
|
|
62
|
+
| **LM Studio direct** | [LM Studio direct guide](./docs/lmstudio-direct.en.md) | Second rescue path for `qwen35` / `qwen35moe`. LM Studio 0.4.12+ Local Server with both OpenAI-compatible and Anthropic-compatible (`/v1/messages`) routes — prompt caching survives end-to-end. Real-machine verified in v1.8.4. |
|
|
61
63
|
| **Operate safely** | [Security](./docs/security.en.md) | Threat model, secret handling, vulnerability reporting |
|
|
62
|
-
| **History** | [CHANGELOG](./CHANGELOG.md) | All releases (latest: v1.8.
|
|
64
|
+
| **History** | [CHANGELOG](./CHANGELOG.md) | All releases (latest: v1.8.5 — doctor NEEDS_TUNING messages aligned with v1.8.3 thinking-aware budget + new `docs/lmstudio-direct.md`) |
|
|
63
65
|
| **Track the design** | [plan.md](./plan.md) | Design invariants, milestones, roadmap |
|
|
64
66
|
|
|
65
|
-
日本語版: [Quickstart](./docs/quickstart.md) · [利用ガイド](./docs/usage-guide.md) · [無料枠ガイド](./docs/free-tier-guide.md) · [要否判定](./docs/when-do-i-need-coderouter.md) · [トラブルシューティング](./docs/troubleshooting.md) · [Security](./docs/security.md)
|
|
67
|
+
日本語版: [Quickstart](./docs/quickstart.md) · [利用ガイド](./docs/usage-guide.md) · [無料枠ガイド](./docs/free-tier-guide.md) · [要否判定](./docs/when-do-i-need-coderouter.md) · [トラブルシューティング](./docs/troubleshooting.md) · [LM Studio 直接](./docs/lmstudio-direct.md) · [Security](./docs/security.md)
|
|
66
68
|
|
|
67
69
|
## What gets easier with CodeRouter
|
|
68
70
|
|
|
@@ -134,7 +136,7 @@ Design invariants and the roadmap are in [`plan.md`](./plan.md). Beginner-friend
|
|
|
134
136
|
|
|
135
137
|
## Quickstart (2 commands)
|
|
136
138
|
|
|
137
|
-
**v1.7.0 published to PyPI**, **v1.8.0 added use-case-aware 4 profiles + Z.AI/GLM integration**. `uvx` installs and runs in one shot (Python 3.12+ required):
|
|
139
|
+
**v1.7.0 published to PyPI**, **v1.8.0 added use-case-aware 4 profiles + Z.AI/GLM integration**, **v1.8.2 made the `doctor` probe thinking-model-aware**. `uvx` installs and runs in one shot (Python 3.12+ required):
|
|
138
140
|
|
|
139
141
|
```bash
|
|
140
142
|
# 1. Drop a sample config
|
|
@@ -142,8 +144,11 @@ mkdir -p ~/.coderouter
|
|
|
142
144
|
curl -fsSL https://raw.githubusercontent.com/zephel01/CodeRouter/main/examples/providers.yaml \
|
|
143
145
|
> ~/.coderouter/providers.yaml
|
|
144
146
|
|
|
145
|
-
# 2. Install + run, in one line
|
|
146
|
-
|
|
147
|
+
# 2. Install + run, in one line.
|
|
148
|
+
# The PyPI distribution name (coderouter-cli) differs from the console
|
|
149
|
+
# script name (coderouter), so uv 0.11+ requires the --from form. (It
|
|
150
|
+
# also works on older uv, so this is the canonical incantation.)
|
|
151
|
+
uvx --from coderouter-cli coderouter serve --port 8088
|
|
147
152
|
```
|
|
148
153
|
|
|
149
154
|
Want a permanent install?
|
|
@@ -164,7 +169,7 @@ uv run coderouter serve --port 8088
|
|
|
164
169
|
|
|
165
170
|
> **Note**: the PyPI distribution name is `coderouter-cli`, but the command and Python import name are both `coderouter`. See [CHANGELOG `[v1.7.0]`](./CHANGELOG.md#v170--2026-04-25-pypi-公開-uvx-coderouter-cli-一発で動く) for details.
|
|
166
171
|
>
|
|
167
|
-
> **For the v1.8.0
|
|
172
|
+
> **For the `--apply` automation** (v1.8.0+): install `ruamel.yaml` as the optional dependency (`pip install 'coderouter-cli[doctor]'` or `uv pip install ruamel.yaml`). Not required for the base feature set.
|
|
168
173
|
|
|
169
174
|
Then point any OpenAI client at `http://127.0.0.1:8088`:
|
|
170
175
|
|
|
@@ -216,7 +221,7 @@ What CodeRouter can do for you today:
|
|
|
216
221
|
|
|
217
222
|
**Want the per-release detail?** Every v0.x and v1.0-A/B/C slice — what shipped, how many tests it added, why it was needed — is in [CHANGELOG.md](./CHANGELOG.md). Design invariants and the forward roadmap live in [plan.md](./plan.md).
|
|
218
223
|
|
|
219
|
-
**Coming next** (see [plan.md §10](./plan.md) for v1.0, §18 for v1.0+): v1.5 ✅ metrics / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`. v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM free tier + troubleshooting doc split + `--env-file` / `doctor --check-env`. v1.7 ✅ PyPI publish (`uvx coderouter-cli`). v1.8 ✅ Use-case-aware 4 profiles (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) registration + `setup.sh` wizard + `coderouter doctor --check-model --apply` (non-destructive YAML write-back) + `claude_code_suitability` startup check + Trusted Publishing automation. Remaining for v1.9+: `coderouter doctor --network` (CI), launcher scripts, opt-in update check.
|
|
224
|
+
**Coming next** (see [plan.md §10](./plan.md) for v1.0, §18 for v1.0+): v1.5 ✅ metrics / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`. v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM free tier + troubleshooting doc split + `--env-file` / `doctor --check-env`. v1.7 ✅ PyPI publish (`uvx --from coderouter-cli coderouter`). v1.8 ✅ Use-case-aware 4 profiles (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) registration + `setup.sh` wizard + `coderouter doctor --check-model --apply` (non-destructive YAML write-back) + `claude_code_suitability` startup check + Trusted Publishing automation. Remaining for v1.9+: `coderouter doctor --network` (CI), launcher scripts, opt-in update check.
|
|
220
225
|
|
|
221
226
|
### Use it with Claude Code
|
|
222
227
|
|
|
@@ -393,7 +398,7 @@ Coming next (see [plan.md §10](./plan.md) for v1.0, §18 for v1.0+):
|
|
|
393
398
|
- v1.0 ✅ — 14-case regression suite, Code Mode (slim Claude Code harness); output cleaning shipped in **v1.0-A** (`output_filters` chain, done)
|
|
394
399
|
- v1.5 ✅ — **Metrics dashboard (shipped)** — `MetricsCollector` + `GET /metrics.json` + `GET /metrics` (Prometheus) + `GET /dashboard` (HTML one-pager) + `coderouter stats` curses TUI + `scripts/demo_traffic.sh` traffic generator + `display_timezone` config
|
|
395
400
|
- v1.6 ✅ — `auto_router` (task-aware routing; `default_profile: auto` dispatches by image attachment / code-fence ratio / else) + NVIDIA NIM free-tier 8-step chain + doc language swap (JA primary) + troubleshooting page split + `--env-file` / `doctor --check-env`
|
|
396
|
-
- v1.7 ✅ — PyPI publish (`uvx coderouter-cli` one-line bootstrap) + Trusted Publishing path (release.yml auto-publish on tag push)
|
|
401
|
+
- v1.7 ✅ — PyPI publish (`uvx --from coderouter-cli coderouter` one-line bootstrap) + Trusted Publishing path (release.yml auto-publish on tag push)
|
|
397
402
|
- v1.8 ✅ — **Use-case-aware 4 profiles + GLM/Gemma 4/Qwen3.6 official tags + apply automation**: `multi` (default) / `coding` / `general` / `reasoning` profiles + `append_system_prompt` per profile to nudge non-Claude models toward Claude-style replies + `mode_aliases` (default/fast/vision/think/cheap), Ollama-official `gemma4:e4b/26b/31b` and `qwen3.6:27b/35b` promoted to active stanzas, Z.AI provided as OpenAI-compat with two base URLs (Coding Plan / General API), `coderouter doctor --check-model --apply` writes YAML patches non-destructively (`ruamel.yaml` round-trip preserves comments + key order; idempotent), `setup.sh` onboarding wizard, `claude_code_suitability` startup check (Llama-3.3-70B in `claude-code-*` profiles emits a structured WARN). Remaining for v1.9+: `coderouter doctor --network` (CI-friendly), launcher scripts (`.command` / `.sh` / `.bat`), opt-in startup update check
|
|
398
403
|
|
|
399
404
|
## Choosing `kind: openai_compat` vs `kind: anthropic`
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<p align="center">
|
|
20
20
|
<a href="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml"><img src="https://github.com/zephel01/CodeRouter/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a>
|
|
21
21
|
<a href=""><img src="https://img.shields.io/badge/status-stable-brightgreen" alt="status"></a>
|
|
22
|
-
<a href=""><img src="https://img.shields.io/badge/version-1.8.
|
|
22
|
+
<a href=""><img src="https://img.shields.io/badge/version-1.8.5-blue" alt="version"></a>
|
|
23
23
|
<a href=""><img src="https://img.shields.io/badge/python-3.12%2B-blue" alt="python"></a>
|
|
24
24
|
<a href=""><img src="https://img.shields.io/badge/runtime%20deps-5-brightgreen" alt="deps"></a>
|
|
25
25
|
<a href=""><img src="https://img.shields.io/badge/license-MIT-yellow" alt="license"></a>
|
|
@@ -58,11 +58,13 @@
|
|
|
58
58
|
| **無料で回す** | [無料枠ガイド](./docs/free-tier-guide.md) | NVIDIA NIM 40 req/min × OpenRouter 無料枠の使い分け・live 検証済みモデル表・地雷 5 点 |
|
|
59
59
|
| **要るか判断する** | [要否判定ガイド](./docs/when-do-i-need-coderouter.md) | エージェント × モデルの詳細マトリクスで「そもそも自分に必要か」を決める |
|
|
60
60
|
| **詰まったとき** | [トラブルシューティング](./docs/troubleshooting.md) | `doctor` の使い方、`.env` の export 必須、Ollama サイレント失敗 5 症状、Claude Code 連携の罠 |
|
|
61
|
+
| **llama.cpp 直叩き** | [llama.cpp 直叩きガイド](./docs/llamacpp-direct.md) | Qwen3.6 を Ollama 詰みから救出する経路。`llama.cpp` build → Unsloth GGUF → `llama-server` → CodeRouter 接続を 7 step で(v1.8.3 実機検証済)|
|
|
62
|
+
| **LM Studio 直接** | [LM Studio 直接ガイド](./docs/lmstudio-direct.md) | `qwen35` / `qwen35moe` を救う第 2 経路。LM Studio 0.4.12+ Local Server 経由で OpenAI 互換 + Anthropic 互換 (`/v1/messages`) 両対応、prompt caching 透過(v1.8.4 実機検証済)|
|
|
61
63
|
| **安全に使う** | [セキュリティ方針](./docs/security.md) | 脅威モデル・秘密情報の扱い・脆弱性報告経路 |
|
|
62
|
-
| **履歴** | [CHANGELOG](./CHANGELOG.md) | 全リリース履歴(最新: v1.8.
|
|
64
|
+
| **履歴** | [CHANGELOG](./CHANGELOG.md) | 全リリース履歴(最新: v1.8.5 — doctor NEEDS_TUNING メッセージを v1.8.3 thinking-aware budget の事実に揃える + `docs/lmstudio-direct.md` 新規) |
|
|
63
65
|
| **設計を追う** | [plan.md](./plan.md) | 設計不変項・マイルストーン・今後のロードマップ |
|
|
64
66
|
|
|
65
|
-
English versions: [Quickstart](./docs/quickstart.en.md) · [Usage guide](./docs/usage-guide.en.md) · [Free-tier guide](./docs/free-tier-guide.en.md) · [When you need it](./docs/when-do-i-need-coderouter.en.md) · [Troubleshooting](./docs/troubleshooting.en.md) · [Security](./docs/security.en.md)
|
|
67
|
+
English versions: [Quickstart](./docs/quickstart.en.md) · [Usage guide](./docs/usage-guide.en.md) · [Free-tier guide](./docs/free-tier-guide.en.md) · [When you need it](./docs/when-do-i-need-coderouter.en.md) · [Troubleshooting](./docs/troubleshooting.en.md) · [llama.cpp direct](./docs/llamacpp-direct.en.md) · [LM Studio direct](./docs/lmstudio-direct.en.md) · [Security](./docs/security.en.md)
|
|
66
68
|
|
|
67
69
|
## CodeRouter で何が楽になるか
|
|
68
70
|
|
|
@@ -134,7 +136,7 @@ OpenAI 互換エージェント + お行儀の良いモデル + フォールバ
|
|
|
134
136
|
|
|
135
137
|
## クイックスタート(3 コマンド)
|
|
136
138
|
|
|
137
|
-
**v1.7.0 で PyPI 公開**、**v1.8.0 で用途別 4 プロファイル + Z.AI/GLM
|
|
139
|
+
**v1.7.0 で PyPI 公開**、**v1.8.0 で用途別 4 プロファイル + Z.AI/GLM 連携**を追加、**v1.8.2 で doctor probe を thinking モデル対応**にしました。`uvx` 一発で動きます (Python 3.12 以上必須):
|
|
138
140
|
|
|
139
141
|
```bash
|
|
140
142
|
# 1. サンプル設定を置く
|
|
@@ -143,7 +145,9 @@ curl -fsSL https://raw.githubusercontent.com/zephel01/CodeRouter/main/examples/p
|
|
|
143
145
|
> ~/.coderouter/providers.yaml
|
|
144
146
|
|
|
145
147
|
# 2. uvx で起動 (インストール + 起動が 1 行)
|
|
146
|
-
|
|
148
|
+
# PyPI 配布名 (coderouter-cli) と console script 名 (coderouter) が異なるため、
|
|
149
|
+
# uv 0.11+ では --from 形式が必須 (旧 uv でも動く canonical 形式)
|
|
150
|
+
uvx --from coderouter-cli coderouter serve --port 8088
|
|
147
151
|
```
|
|
148
152
|
|
|
149
153
|
恒久的にインストールしておきたい場合:
|
|
@@ -164,7 +168,7 @@ uv run coderouter serve --port 8088
|
|
|
164
168
|
|
|
165
169
|
> **注**: PyPI 上のパッケージ名は `coderouter-cli` ですが、コマンド名と Python import 名は `coderouter` のままです。詳しくは [CHANGELOG `[v1.7.0]`](./CHANGELOG.md#v170--2026-04-25-pypi-公開-uvx-coderouter-cli-一発で動く) 参照。
|
|
166
170
|
>
|
|
167
|
-
>
|
|
171
|
+
> **`--apply` 自動化を使う場合** (v1.8.0+): `ruamel.yaml` を optional dep として一緒に入れます (`pip install 'coderouter-cli[doctor]'` または `uv pip install ruamel.yaml`)。基本機能には不要です。
|
|
168
172
|
|
|
169
173
|
あとは任意の OpenAI クライアントを `http://127.0.0.1:8088` に向けるだけです:
|
|
170
174
|
|
|
@@ -216,7 +220,7 @@ CodeRouter 自体は純 Python 3.12+ で、実質的な OS 対応範囲は `min(
|
|
|
216
220
|
|
|
217
221
|
**リリース単位の詳細が欲しい?** v0.x と v1.0-A/B/C の各スライス — 何が入り、何本のテストが増え、なぜ必要だったのか — は [CHANGELOG.md](./CHANGELOG.md) に揃っています。設計の不変項と今後のロードマップは [plan.md](./plan.md)。
|
|
218
222
|
|
|
219
|
-
**次の予定**(v1.0 は [plan.md §10](./plan.md)、v1.0+ は §18): v1.5 ✅ メトリクス / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`、v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM 無料枠 + トラブルシュートドキュメント分離 + `--env-file` / `doctor --check-env`、v1.7 ✅ PyPI 公開 (`uvx coderouter-cli`)、v1.8 ✅ 用途別 4 プロファイル (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) 登録 + `setup.sh` onboarding ウィザード + `coderouter doctor --check-model --apply` (非破壊 YAML 書き戻し) + `claude_code_suitability` startup チェック + Trusted Publishing 自動化。残り (v1.9 候補) は `coderouter doctor --network` (CI 用) / launcher スクリプト / 起動時アップデートチェック (opt-in)。
|
|
223
|
+
**次の予定**(v1.0 は [plan.md §10](./plan.md)、v1.0+ は §18): v1.5 ✅ メトリクス / `/dashboard` / `coderouter stats` TUI / `scripts/demo_traffic.sh`、v1.6 ✅ `auto_router` (task-aware routing) + NVIDIA NIM 無料枠 + トラブルシュートドキュメント分離 + `--env-file` / `doctor --check-env`、v1.7 ✅ PyPI 公開 (`uvx --from coderouter-cli coderouter`)、v1.8 ✅ 用途別 4 プロファイル (multi/coding/general/reasoning) + Gemma 4 / Qwen3.6 / Z.AI (GLM) 登録 + `setup.sh` onboarding ウィザード + `coderouter doctor --check-model --apply` (非破壊 YAML 書き戻し) + `claude_code_suitability` startup チェック + Trusted Publishing 自動化。残り (v1.9 候補) は `coderouter doctor --network` (CI 用) / launcher スクリプト / 起動時アップデートチェック (opt-in)。
|
|
220
224
|
|
|
221
225
|
### Claude Code と一緒に使う
|
|
222
226
|
|
|
@@ -391,7 +395,7 @@ suggested patch for ~/.coderouter/providers.yaml:
|
|
|
391
395
|
- v1.0 ✅ — 14 ケースのリグレッションスイート、Code Mode (スリム版 Claude Code ハーネス); 出力クリーニングは **v1.0-A** で `output_filters` チェーンとして完了
|
|
392
396
|
- v1.5 ✅ — **メトリクスダッシュボード(出荷済み)** — `MetricsCollector` + `GET /metrics.json` + `GET /metrics` (Prometheus) + `GET /dashboard` (HTML 1 ページ) + `coderouter stats` curses TUI + `scripts/demo_traffic.sh` トラフィックジェネレータ + `display_timezone` 設定
|
|
393
397
|
- v1.6 ✅ — `auto_router` (task-aware routing、`default_profile: auto` で画像/コード濃度/その他を自動振り分け) + NVIDIA NIM 無料枠 8 段チェーン + ドキュメント言語スワップ (JA primary) + トラブルシュート独立ドキュメント + `--env-file` / `doctor --check-env`
|
|
394
|
-
- v1.7 ✅ — PyPI 公開 (`uvx coderouter-cli` で 1 行起動) + Trusted Publishing 経路 (release.yml で自動 publish)
|
|
398
|
+
- v1.7 ✅ — PyPI 公開 (`uvx --from coderouter-cli coderouter` で 1 行起動) + Trusted Publishing 経路 (release.yml で自動 publish)
|
|
395
399
|
- v1.8 ✅ — **用途別 4 プロファイル + GLM/Gemma 4/Qwen3.6 公式化 + apply 自動化**: `multi` (default) / `coding` / `general` / `reasoning` の 4 プロファイル + 全プロファイルに `append_system_prompt` で Claude 風応答 nudge + `mode_aliases` (default/fast/vision/think/cheap)、Ollama 公式 tag 化された `gemma4:e4b/26b/31b` / `qwen3.6:27b/35b` を active stanza に格上げ、Z.AI を OpenAI-compat で 2 base_url 提供 (Coding Plan / General API)、`coderouter doctor --check-model --apply` で YAML パッチを非破壊書き戻し (`ruamel.yaml` round-trip でコメント・key 順序保持、冪等)、`setup.sh` onboarding ウィザード、`claude_code_suitability` startup チェック (Llama-3.3-70B 系を `claude-code-*` profile で WARN)。残り (v1.9 以降): `coderouter doctor --network` (CI 用)、launcher スクリプト (`.command` / `.sh` / `.bat`)、opt-in 起動時アップデートチェック
|
|
396
400
|
|
|
397
401
|
## `kind: openai_compat` と `kind: anthropic` の選び方
|
|
@@ -48,14 +48,25 @@ logger = get_logger(__name__)
|
|
|
48
48
|
_RETRYABLE_STATUSES = {404, 408, 425, 429, 500, 502, 503, 504}
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
# v1.8.3: non-standard reasoning fields emitted by various upstreams.
|
|
52
|
+
# Different runtimes use different field names for the same concept:
|
|
53
|
+
# * ``reasoning`` — OpenRouter free models (gpt-oss-120b:free
|
|
54
|
+
# confirmed 2026-04-20), Ollama
|
|
55
|
+
# * ``reasoning_content`` — llama.cpp ``llama-server`` (Qwen3.6 etc.,
|
|
56
|
+
# confirmed 2026-04-26 with Unsloth GGUF)
|
|
57
|
+
# Strict OpenAI clients reject either as an unknown key. The strip
|
|
58
|
+
# function below removes both at the adapter boundary so downstream
|
|
59
|
+
# layers never see them, regardless of which runtime fronts the model.
|
|
60
|
+
_NON_STANDARD_REASONING_KEYS = ("reasoning", "reasoning_content")
|
|
61
|
+
|
|
62
|
+
|
|
51
63
|
def _strip_reasoning_field(choices: list[dict[str, Any]] | None, *, delta_key: bool) -> bool:
|
|
52
|
-
"""Remove non-standard
|
|
64
|
+
"""Remove non-standard reasoning keys from a choices list, in place.
|
|
53
65
|
|
|
54
|
-
v0.5-C
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
We strip it at the adapter boundary so downstream layers never see it.
|
|
66
|
+
v0.5-C originally targeted OpenRouter's ``reasoning`` field. v1.8.3
|
|
67
|
+
extends the strip to ``reasoning_content`` (llama.cpp ``llama-server``
|
|
68
|
+
naming) since both denote the same hidden chain-of-thought trace and
|
|
69
|
+
neither is part of the OpenAI Chat Completions spec.
|
|
59
70
|
|
|
60
71
|
Args:
|
|
61
72
|
choices: The ``choices`` list from the response body or stream chunk.
|
|
@@ -64,7 +75,7 @@ def _strip_reasoning_field(choices: list[dict[str, Any]] | None, *, delta_key: b
|
|
|
64
75
|
``False`` for non-streaming responses (look in ``choice["message"]``).
|
|
65
76
|
|
|
66
77
|
Returns:
|
|
67
|
-
True iff at least one
|
|
78
|
+
True iff at least one reasoning key was removed. Callers use
|
|
68
79
|
this to decide whether to emit a one-shot log line.
|
|
69
80
|
"""
|
|
70
81
|
if not choices:
|
|
@@ -75,9 +86,12 @@ def _strip_reasoning_field(choices: list[dict[str, Any]] | None, *, delta_key: b
|
|
|
75
86
|
if not isinstance(choice, dict):
|
|
76
87
|
continue
|
|
77
88
|
inner = choice.get(inner_key)
|
|
78
|
-
if isinstance(inner, dict)
|
|
79
|
-
|
|
80
|
-
|
|
89
|
+
if not isinstance(inner, dict):
|
|
90
|
+
continue
|
|
91
|
+
for key in _NON_STANDARD_REASONING_KEYS:
|
|
92
|
+
if key in inner:
|
|
93
|
+
inner.pop(key, None)
|
|
94
|
+
stripped = True
|
|
81
95
|
return stripped
|
|
82
96
|
|
|
83
97
|
|
|
@@ -235,15 +249,17 @@ class OpenAICompatAdapter(BaseAdapter):
|
|
|
235
249
|
retryable=False,
|
|
236
250
|
) from exc
|
|
237
251
|
|
|
238
|
-
# v0.5-C: passive strip of non-standard
|
|
239
|
-
#
|
|
252
|
+
# v0.5-C / v1.8.3: passive strip of non-standard reasoning fields
|
|
253
|
+
# on choices (covers both Ollama/OpenRouter ``reasoning`` and
|
|
254
|
+
# llama.cpp ``reasoning_content``). No-op when the provider opted
|
|
255
|
+
# into passthrough.
|
|
240
256
|
if not self.config.capabilities.reasoning_passthrough and _strip_reasoning_field(
|
|
241
257
|
data.get("choices"), delta_key=False
|
|
242
258
|
):
|
|
243
259
|
log_capability_degraded(
|
|
244
260
|
logger,
|
|
245
261
|
provider=self.name,
|
|
246
|
-
dropped=
|
|
262
|
+
dropped=list(_NON_STANDARD_REASONING_KEYS),
|
|
247
263
|
reason="non-standard-field",
|
|
248
264
|
)
|
|
249
265
|
|
|
@@ -344,7 +360,7 @@ class OpenAICompatAdapter(BaseAdapter):
|
|
|
344
360
|
log_capability_degraded(
|
|
345
361
|
logger,
|
|
346
362
|
provider=self.name,
|
|
347
|
-
dropped=
|
|
363
|
+
dropped=list(_NON_STANDARD_REASONING_KEYS),
|
|
348
364
|
reason="non-standard-field",
|
|
349
365
|
)
|
|
350
366
|
reasoning_logged = True
|