Skip to content

Commit d746a63

Browse files
committed
claude は、認証情報が無くても有効にできる相手にする
枠を取るには登録を空にする必要があるのに、claude は「認証情報が無いと有効に できない」相手として定義されていた。案内どおり登録を削除すると、そこで二度と 有効にできなくなる —— 手順そのものが成立していなかった。 登録は任意にする。空ならコンテナの中でサインインした結果を CLI が自分で使い、 入っていればそちらを環境変数で置く。止める条件は「接続を試す」が通っていない ことだけになる。 設定の案内を二択に書き直す。枠まで見たいならサインインして登録しない、 会話だけでよいならトークンを登録する(そのトークンでは枠は出ない)。 失敗したときの文面にも戻し方の順番を入れる —— 削除すると無効になるので、 削除・接続を試す・有効にする、の順で戻すことになる。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent ac715e0 commit d746a63

4 files changed

Lines changed: 51 additions & 5 deletions

File tree

app/providers.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,25 @@ class Provider:
147147
id="claude",
148148
label="Claude Code CLI",
149149
url="http://chiezo-bridge-claude:7013/v1",
150-
credential=CRED_REQUIRED,
150+
# **無くても動く。** 登録が空なら、コンテナの中でサインインした結果を CLI が
151+
# 自分で使う(`bridge/cli_bridge.py` の `apply_credential`)。
152+
# **required にしてはいけない** —— 枠を取るには登録を空にする必要があるのに、
153+
# 空にすると二度と有効にできなくなる(実際に詰んだ)。
154+
credential=CRED_OPTIONAL,
151155
billing="Claude のサブスクリプション(定額)",
152156
model_required=False,
153-
setup="ブリッジのコンテナ **chiezo-bridge-claude** を立ててから、手元の端末で\n"
157+
setup="ブリッジのコンテナ **chiezo-bridge-claude** を立ててから、"
158+
"**どちらか一方**を選んでください。\n"
159+
"\n"
160+
"**枠(使用量)まで見たいなら、コンテナの中でサインインします。**\n"
161+
"ここは**登録しないまま**にしてください ——\n"
162+
"`docker exec -it chiezo-bridge-claude claude` を実行して `/login`。\n"
163+
"**登録があるとそちらが優先される**ので、登録したままサインインしても枠は出ません。\n"
164+
"サインイン結果を残すため、`/srv/bridge/home` を名前付きボリュームにしておくこと。\n"
165+
"\n"
166+
"**会話だけでよいなら、トークンを登録します。** 手元の端末で\n"
154167
"`claude setup-token` を実行し、発行されたトークンをここに登録してください。\n"
168+
"この長期トークンは推論だけに絞られているので、**枠は出せません**。\n"
155169
"\n"
156170
"**コンテナ名はこのとおりにすること**(Chiezo はこの名前で呼びに行きます)。\n"
157171
"compose があるなら docker-compose.yml の該当サービスのコメントを外すだけです。\n"

bridge/cli_bridge.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,9 +1760,10 @@ def _usage_reason(raw: str) -> str:
17601760
# 壊れているのか、そもそも出せない頼み方をしているのかが読めない。
17611761
return ("枠のパネルではなく、会話を始めずに終わった締めの集計が返っています。"
17621762
"登録してある `claude setup-token` の長期トークンは推論だけに"
1763-
"絞られていて、枠を出せません —— コンテナの中で 1 回サインインし"
1763+
"絞られていて、枠を出せません。コンテナの中でサインインし"
17641764
"(`docker exec -it <ブリッジのコンテナ> claude` で `/login`)、"
1765-
"管理画面の登録を空にしてください。")
1765+
"管理画面で登録を「削除」してください —— 削除すると無効になるので、"
1766+
"そのあと「接続を試す」→「有効にする」の順に戻します。")
17661767
return text[:REASON_MAX]
17671768

17681769

docs/ai.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,15 +838,21 @@ Current week (Fable): 0% used · resets Sep 20, 6am (UTC)
838838
**枠まで欲しいときは、コンテナの中で 1 回サインインします。**
839839

840840
```bash
841-
# 管理画面(/admin/ai)で claude の登録を空にしてから
842841
docker exec -it chiezo-bridge-claude claude # /login
843842
```
844843

844+
そのうえで管理画面(`/admin/ai`)の claude の行で **登録を「削除」** します。
845+
**削除すると無効になる**ので、**「接続を試す」→「有効にする」の順**に戻してください
846+
`claude auth status` がコンテナのサインインを見るので通ります)。
847+
845848
登録が空のときだけ、ブリッジは CLI 自身のサインイン結果に任せます(Antigravity と
846849
同じ形)。登録があるとそちらを環境変数で置くので、**登録したままサインインしても
847850
枠は出ません****`/srv/bridge/home` を名前付きボリュームにしておいてください**——
848851
無いと、コンテナを作り直すたびにサインインが消えます。
849852

853+
**claude は「認証情報が無くても有効にできる」相手です**`CRED_OPTIONAL`)。
854+
required にすると、枠を取るために登録を空にした瞬間、二度と有効にできなくなります。
855+
850856
会話のほうはどちらでも動きます。枠が要るかどうかで選んでください。
851857

852858
**「取れない」と書いてある理由は、疑ってから消してください** ——あのときも口が

tests/test_ai_usage.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,3 +982,28 @@ def test_windows_without_a_length_keep_their_place_at_the_end(self, env):
982982
assert [w.label for w in usage.ordered([first, second, short])] == [
983983
"5 時間", "session", "week",
984984
]
985+
986+
987+
class TestClaudeDoesNotNeedARegisteredToken:
988+
"""登録が無くても有効にできる。**required にすると詰む** —— 枠を取るには
989+
登録を空にする必要があるのに、空にすると二度と有効にできなくなる。
990+
"""
991+
992+
def test_a_registered_token_is_optional(self, env):
993+
from app import providers
994+
995+
spec = providers.get("claude")
996+
997+
assert spec.credential == providers.CRED_OPTIONAL
998+
999+
def test_it_can_be_enabled_without_one(self, env):
1000+
"""止めているのは「接続を試す」が通っていないことだけであってほしい。"""
1001+
from app import settings_store
1002+
from app.views import ai_settings
1003+
1004+
with make_client(env, ReplyLLM()):
1005+
settings_store.set_verified("claude", True)
1006+
row = next(r for r in ai_settings._rows() if r["spec"].id == "claude")
1007+
1008+
assert row["has_credential"] is False
1009+
assert row["can_enable"] is True

0 commit comments

Comments
 (0)