OpenClawで、通常時はChatGPT OAuth経由の gpt-5.6-sol を使い、OAuth側の利用上限やレート制限などで利用できなくなった場合だけ、OpenAI API課金の gpt-5.6-luna にフォールバックする構成を作りました。
さらに今回は、OpenClawのMemory用Embeddingですでに使用しているOpenAI APIキーを、Lunaのフォールバックにも再利用します。
最終的な構成は次のようになります。
Primary
openai/gpt-5.6-sol
└─ ChatGPT OAuth
↓ OAuth上限・レート制限など
Fallback
openai-api/gpt-5.6-luna
└─ OpenAI API Key
Memory
└─ text-embedding-3-small
└─ 同じOpenAI API Key
環境
今回使用した環境はこちらです。
OpenClaw 2026.9.1
すでにデフォルトモデルとして、
openai/gpt-5.6-sol
を設定済みの状態から作業しています。
標準のモデル一覧では、SolとLunaは次のように認識されていました。
openai/gpt-5.6-luna text+image 372k
openai/gpt-5.6-sol text+image 372k default
やりたいこと
今回の目的は、単純なモデルフォールバックだけではありません。
次のように、モデルだけでなく認証方式も分離します。
GPT-5.6 Sol
└─ ChatGPT OAuthのみ
↓
GPT-5.6 Luna
└─ OpenAI APIキーのみ
通常はOAuth枠を利用し、必要なときだけAPI課金へ切り替える構成です。
なぜLuna用に別Providerを作るのか
OpenClawでは、同じProviderに複数の認証方式が存在すると、モデルを切り替える前に同じProvider内の認証プロファイルが試される場合があります。
そのため、標準の openai ProviderへOAuthとAPIキーを両方登録すると、
Sol + OAuth
↓
Sol + API Key
↓
Luna
のようなルートになる可能性があります。
今回やりたいのは、
Sol + OAuth
↓
Luna + API Key
です。
そこで、LunaのAPIアクセス専用として、
openai-api
という別Providerを作成します。
Memoryですでに使っているAPIキーを再利用する
今回の環境では、MemoryのEmbeddingですでにOpenAI APIを利用していました。
設定は概ね次のようになっています。
{
"provider": "openai-compatible",
"remote": {
"baseUrl": "https://api.openai.com/v1/",
"apiKey": {
"source": "file",
"provider": "embeddings",
"id": "__OPENCLAW_REDACTED__"
}
},
"model": "text-embedding-3-small"
}
ここで重要なのが、
__OPENCLAW_REDACTED__
です。
これは実際のSecret IDではありません。
OpenClawが config get の表示時に機密情報を隠しているため、この文字列をそのままコピーして新しい設定に使用してはいけません。
そこで、実際のAPIキーを画面に表示させず、現在の設定ファイルに保存されているSecretRefをそのまま再利用します。
Luna用Providerを作成する
まず、OpenClawが現在使用している設定ファイルを取得します。
openclaw config file
設定ファイルのパスをハードコードせず、このコマンドの結果を利用します。
続いて、Memoryで使っているSecretRefを取得し、Luna用Providerを追加するパッチファイルを生成します。
CONFIG="$(openclaw config file)"
python3 - "$CONFIG" <<'PY'
import json
import sys
config_path = sys.argv[1]
with open(config_path, "r", encoding="utf-8") as f:
cfg = json.load(f)
ref = cfg["memory"]["search"]["remote"]["apiKey"]
patch = {
"models": {
"providers": {
"openai-api": {
"baseUrl": "https://api.openai.com/v1",
"api": "openai-responses",
"apiKey": ref,
"models": [
{
"id": "gpt-5.6-luna",
"name": "GPT-5.6 Luna"
}
]
}
}
}
}
with open("/tmp/openclaw-luna.patch.json", "w", encoding="utf-8") as f:
json.dump(patch, f, indent=2)
print("Created /tmp/openclaw-luna.patch.json")
PY
このPythonスクリプトでは、APIキーそのものを表示していません。
Memoryが使用しているSecretRefを、そのまま新しいProviderへコピーしています。
dry-runで設定を確認する
いきなり設定を変更せず、まずdry-runします。
openclaw config patch \
--file /tmp/openclaw-luna.patch.json \
--dry-run
問題がなければ、本適用します。
openclaw config patch \
--file /tmp/openclaw-luna.patch.json
続いて設定を検証します。
openclaw config validate
Providerの設定を確認する
作成したProviderを確認します。
openclaw config get models.providers.openai-api
次のような構成になっていればOKです。
{
"baseUrl": "https://api.openai.com/v1",
"apiKey": {
"source": "file",
"provider": "embeddings",
"id": "__OPENCLAW_REDACTED__"
},
"api": "openai-responses",
"models": [
{
"id": "gpt-5.6-luna",
"name": "GPT-5.6 Luna"
}
]
}
ここでもSecretRefのIDが、
__OPENCLAW_REDACTED__
と表示されるのは正常です。
Lunaのモデル能力を設定する
カスタムProviderを作成した直後、Lunaが次のように認識される場合があります。
Input: text
Ctx: 200k
標準の openai/gpt-5.6-luna は今回の環境では、
text+image
372k
として認識されていたため、カスタムProvider側も合わせます。
次のパッチを作成します。
cat >/tmp/openclaw-luna-model.patch.json <<'EOF'
{
"models": {
"providers": {
"openai-api": {
"models": [
{
"id": "gpt-5.6-luna",
"name": "GPT-5.6 Luna",
"reasoning": true,
"input": [
"text",
"image"
],
"contextWindow": 372000,
"maxTokens": 8192,
"api": "openai-responses"
}
]
}
}
}
}
EOF
まずdry-runします。
openclaw config patch \
--file /tmp/openclaw-luna-model.patch.json \
--dry-run
問題なければ適用します。
openclaw config patch \
--file /tmp/openclaw-luna-model.patch.json
最後に検証します。
openclaw config validate
Lunaをフォールバックに設定する
既存のフォールバックをいったんクリアします。
openclaw models fallbacks clear
新しく作成したLunaを登録します。
openclaw models fallbacks add \
openai-api/gpt-5.6-luna
確認します。
openclaw models fallbacks list
次のようになっていればOKです。
openai-api/gpt-5.6-luna
Lunaが正しく認識されているか確認する
次のコマンドを実行します。
openclaw models list --provider openai-api
最終的には概ね次の状態になります。
Model Input Ctx Local Auth Tags
openai-api/gpt-5.6-luna text+image 372k no yes fallback#1,configured
特に確認したいのは次の3点です。
Input: text+image
Ctx: 372k
Auth: yes
そして、
fallback#1
が付いていれば、Lunaがフォールバックとして登録されています。
models status –probe が実行できない場合
最終確認として、
openclaw models status --probe
を実行できます。
ただし、Gatewayがすでに起動している環境では、
A Gateway is running for this state directory.
Stop the Gateway first, then rerun models status --probe.
というエラーになる場合があります。
この場合は一度Gatewayを停止します。
openclaw gateway stop
その後、
openclaw models status --probe
を実行します。
確認が終わったらGatewayを起動します。
openclaw gateway start
まとめると、
openclaw gateway stop
openclaw models status --probe
openclaw gateway start
です。
最終構成
今回完成した構成は次のとおりです。
openai/gpt-5.6-sol
│
└─ ChatGPT OAuth
│
│ OAuth利用上限
│ レート制限
│ その他failover対象エラー
▼
openai-api/gpt-5.6-luna
│
└─ OpenAI API Key
Memoryは引き続き同じAPIキーを使用します。
OpenAI API Key
│
├─ Memory
│ └─ text-embedding-3-small
│
└─ Luna fallback
└─ gpt-5.6-luna
これにより、
通常時
GPT-5.6 Sol
+ ChatGPT OAuth
↓ OAuth側で利用不可
フォールバック
GPT-5.6 Luna
+ OpenAI API課金
という運用ができます。
models.providers.openai は変更しない
今回の構成で重要なのが、標準の、
models.providers.openai
へAPIキーを追加しないことです。
今回の目的は、
Sol = OAuthのみ
Luna = API Keyのみ
と認証を分離することです。
標準の openai ProviderへAPIキーを追加すると、SolでもAPIキーが利用候補になる可能性があります。
そのため、
openai
と、
openai-api
を分離しています。
セキュリティ上の注意
OpenClawの設定内容をブログやSNSへ掲載するときは、次の情報を公開しないよう注意してください。
- OpenAI APIキーそのもの
- SecretRefの実際のID
- OAuthトークン
- OAuthプロファイルにメールアドレス等が含まれている場合、その値
- サーバのユーザー名を含む絶対パス
- ホスト名や内部ドメイン
- 公開していないIPアドレス
- 実行中プロセスのPID
- 独自変更しているGatewayのポート番号
- その他、社内・自宅ネットワーク固有の情報
openclaw config get で、
__OPENCLAW_REDACTED__
と表示されている部分は、OpenClawによって秘匿化されています。
ブログには秘匿化された状態だけを掲載し、実際の設定ファイルから取得したSecret IDやAPIキーは掲載しないようにします。
まとめ
今回行った作業は大きく4つです。
openai/gpt-5.6-solはChatGPT OAuthのまま維持- Memoryですでに使用しているOpenAI APIキーのSecretRefを再利用
openai-api/gpt-5.6-lunaというAPI専用Providerを作成- Lunaをフォールバック #1として登録
最終的には、
GPT-5.6 Sol + ChatGPT OAuth
↓
OAuth上限など
↓
GPT-5.6 Luna + OpenAI API
という構成になりました。
普段はChatGPT OAuth側を利用し、必要な場合だけOpenAI API課金へ切り替えたい場合に便利な構成です。

