# LLM プロバイダ / ノード選択 各 Box は、プラットフォーム全体の既定とは独立に、どの LLM バックエンドを使うかを override できる。**provider** と **node** の 2 つの直交する設定が、同一 DB 行(`box_llm_overrides`)と同一エンドポイント `GET`/`PUT /api/v1/boxes/{box_id}/llm`(MCP: `atasira_get_box_llm` / `atasira_set_box_llm`)に載る。 > **方針(絶対)**: Atasira のベースラインは AtsLLM(弊社内完結)。外部 provider(claude/gpt)への切替は**明示依頼と正当理由がある時のみ**。既定で外部へ倒さない。node の既定は `m5`。 ## 設定軸 - **provider**: `atsllm` | `claude` | `gpt` - **node**: **実効 provider が `atsllm` のときのみ意味を持つ**(claude/gpt では engine が無視)。 - `m5` = **ローカル既定ノード**(このホスト上の AtsLLM。マルチノード化前からの従来動作。**既定**) - `m1` = **公開プラットフォームノード**(`https://llm.atasino.biz`) ## 解決順(precedence) provider と node は同一の 4 階層チェーンで解決される: ``` db_override > BoxManifest.llm.{provider,node} > env 既定 > builtin ``` | 軸 | env 既定 | builtin | |----|----------|---------| | provider | `ATASIRA_DEFAULT_LLM_PROVIDER` | `atsllm` | | node | `ATASIRA_DEFAULT_ATSLLM_NODE` | `m5` | GET 応答の `source` / `node_source` が現在どの階層で解決されたか(`db_override` / `manifest` / `env` / `builtin`)を示す。 ## 実効設定の確認 ``` atasira_get_box_llm(box_id="<db id>") ``` または: ```bash curl -sS "$ATASIRA_BFF_URL/api/v1/boxes/<box_id>/llm" -H "Authorization: Bearer $ATASIRA_PAT" ``` 応答の要点: - `effective_provider` / `effective_node` — 実際に使われる値 - `source` / `node_source` — 解決階層 - `available_providers` — `["atsllm","claude","gpt"]` - `available_nodes` — `[{"id":"m5","configured":true,...},{"id":"m1","configured":true/false,...}]` - `override_provider` / `override_model` / `override_node` — DB に保存された生 override(`null` = 未設定) ## 切替方法 ### MCP 経由(推奨。box_id は Box の **DB id**) ``` # GPT へ(node は非 atsllm では無視) atasira_set_box_llm(box_id="<db id>", provider="gpt") # AtsLLM box を公開 m1 ノードへ atasira_set_box_llm(box_id="<db id>", node="m1") # 既定へ全解除(atsllm / manifest+env チェーンへ) atasira_set_box_llm(box_id="<db id>", provider="none", node="none") ``` 引数の merge/clear 規約: 省略 or `""` = 現状維持、`"none"` = そのフィールドの override 解除、その他文字列 = set(詳細は `03-mcp-tools.md` ツール 8)。**実効値は merge back しない** — 保存済み `override_*` のみをマージするため、env 既定の将来変更に box が追従し続ける。 ### curl / 管理画面 UI 経由 同一の GET/PUT 契約・同一の認可規則。UI では console の per-box **LLM タブ**。 ```bash # m1 へ切替 curl -sS -X PUT "$ATASIRA_BFF_URL/api/v1/boxes/<box_id>/llm" \ -H "Authorization: Bearer $ATASIRA_PAT" -H "Content-Type: application/json" \ -d '{"node": "m1"}' # m5(既定・このホスト)へ戻す / node override 解除 curl -sS -X PUT "$ATASIRA_BFF_URL/api/v1/boxes/<box_id>/llm" \ -H "Authorization: Bearer $ATASIRA_PAT" -H "Content-Type: application/json" \ -d '{"node": null}' ``` ## 認可・安全性 - **PUT は admin または当該 box の primary assignee のみ**。secondary/observer は(instruct/view できても)LLM 設定変更で 403。 - 全変更は署名付き監査(`audit_logs`, `event_type=llm_override`)。 - **node は fail-closed**: 未 configured の `node` id(`available_nodes[].configured == false`)を指定すると即 HTTP 400。迷ったら先に `atasira_get_box_llm` の `available_nodes` を確認する。 - 選択した provider/node の engine 構築に失敗した場合は **fail-closed(HTTP 503)** で、env 既定 engine へ無音フォールバックしない(無音 provider 差替えは禁止という CRITICAL SAFETY RULE)。 ## 反映タイミング(propagation) - 変更は即座に永続化・監査される。 - **task 実行経路**(worker box の cron/task 実行)へは `host_agent` の **heartbeat 応答**(`llm_overrides` フィールド)経由で届く → 次の heartbeat 後の**次 task から有効**(heartbeat 間隔 ~30 秒、再起動不要)。 - **chat/session 経路**(`atasira_send_instruction` が使う `box_sessions`)はリクエスト毎に `resolve_effective_box_llm` で実効 LLM を再解決するため、**次メッセージから実質即時**(30 秒待ち不要)。 ## node 選択の注意 `m1`(公開プラットフォーム玄関)は**同時実行上限が低い**(`max_num_seqs=1`)。高並列用途では `m5` を維持すること。既定は `m5`。