Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ XIAOMI_API_KEY=
# ── Deepgram (audio transcription, optional) ─────────────────────────────────
DEEPGRAM_API_KEY=

# ── OpenAI-Compatible Custom Provider ────────────────────────────────────────
# CUSTOM_API_KEY=sk-... # API key for any OpenAI-compatible endpoint (required)
# CUSTOM_BASE_URL= # Base URL (default: https://api.openai.com/v1)
# CUSTOM_MODEL= # Model ID (default: gpt-4)

# ── Amazon Bedrock (uses AWS credential chain) ───────────────────────────────
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,11 @@ Triggers: `schedule: '0 */6 * * *'` + `workflow_dispatch` (version, force_rebuil
| `SYNTHETIC_API_KEY` | Synthetic API key (Anthropic-compatible). |
| `COPILOT_GITHUB_TOKEN` | GitHub Copilot token. Configures Claude models via GitHub. |
| `XIAOMI_API_KEY` | Xiaomi MiMo API key (Anthropic-compatible). Configures MiMo v2 Flash. |
| `CUSTOM_API_KEY` | API key for any OpenAI-compatible endpoint. |
| `CUSTOM_BASE_URL` | Base URL for the custom provider (default: `https://api.openai.com/v1`). |
| `CUSTOM_MODEL` | Model ID for the custom provider (default: `gpt-4`). |

Multiple providers can be set simultaneously. Priority for primary model: Anthropic > OpenAI > OpenRouter > Gemini > OpenCode > GitHub Copilot > xAI > Groq > Mistral > Cerebras > Venice > Moonshot > Kimi > MiniMax > Synthetic > ZAI > AI Gateway > Xiaomi > Bedrock > Ollama.
Multiple providers can be set simultaneously. Priority for primary model: Anthropic > OpenAI > OpenRouter > Gemini > OpenCode > GitHub Copilot > xAI > Groq > Mistral > Cerebras > Venice > Moonshot > Kimi > MiniMax > Synthetic > ZAI > AI Gateway > Xiaomi > Bedrock > Ollama > OpenAI-Compatible.

If a provider env var is removed, that provider section is cleaned from `openclaw.json` on next start.

Expand Down
24 changes: 22 additions & 2 deletions scripts/configure.js
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,25 @@ if (ollamaUrl) {
removeProvider("ollama", "Ollama", "OLLAMA_BASE_URL");
}

// OpenAI-Compatible custom provider (arbitrary URL + token)
if (process.env.CUSTOM_API_KEY) {
console.log("[configure] configuring openai-compatible provider");
ensure(config, "models", "providers");
const modelName = process.env.CUSTOM_MODEL || "gpt-4";
config.models.providers["openai-compatible"] = {
api: "openai-completions",
apiKey: process.env.CUSTOM_API_KEY,
baseUrl: (process.env.CUSTOM_BASE_URL || "https://api.openai.com/v1").replace(/\/+$/, ""),
models: [
{ id: modelName, name: modelName, contextWindow: 128000 },
],
};
} else {
removeProvider("openai-compatible", "OpenAI-Compatible", "CUSTOM_API_KEY");
}

// ── Primary model selection (first available provider wins) ─────────────────
const customPrimaryModel = `openai-compatible/${process.env.CUSTOM_MODEL || "gpt-4"}`;
const primaryCandidates = [
[process.env.ANTHROPIC_API_KEY, "anthropic/claude-opus-4-5-20251101"],
[process.env.OPENAI_API_KEY, "openai/gpt-5.2"],
Expand All @@ -353,6 +371,7 @@ const primaryCandidates = [
[process.env.XIAOMI_API_KEY, "xiaomi/mimo-v2-flash"],
[process.env.AWS_ACCESS_KEY_ID, "amazon-bedrock/anthropic.claude-opus-4-5-20251101-v1:0"],
[ollamaUrl, "ollama/llama3.3"],
[process.env.CUSTOM_API_KEY, customPrimaryModel],
];
if (process.env.OPENCLAW_PRIMARY_MODEL) {
// Explicit env var override
Expand Down Expand Up @@ -745,7 +764,8 @@ const hasProvider =
// Custom proxy providers also need env var keys
!!process.env.VENICE_API_KEY || !!process.env.MINIMAX_API_KEY ||
!!process.env.MOONSHOT_API_KEY || !!process.env.KIMI_API_KEY ||
!!process.env.SYNTHETIC_API_KEY || !!process.env.XIAOMI_API_KEY;
!!process.env.SYNTHETIC_API_KEY || !!process.env.XIAOMI_API_KEY ||
!!process.env.CUSTOM_API_KEY;

if (!hasProvider) {
console.error("[configure] ERROR: No AI provider API key set.");
Expand All @@ -754,7 +774,7 @@ if (!hasProvider) {
console.error("[configure] XAI_API_KEY, GROQ_API_KEY, MISTRAL_API_KEY, CEREBRAS_API_KEY, ZAI_API_KEY,");
console.error("[configure] AI_GATEWAY_API_KEY, OPENCODE_API_KEY, COPILOT_GITHUB_TOKEN, VENICE_API_KEY,");
console.error("[configure] MOONSHOT_API_KEY, KIMI_API_KEY, MINIMAX_API_KEY, SYNTHETIC_API_KEY, XIAOMI_API_KEY,");
console.error("[configure] AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY (Bedrock), or OLLAMA_BASE_URL (local)");
console.error("[configure] AWS_ACCESS_KEY_ID+AWS_SECRET_ACCESS_KEY (Bedrock), OLLAMA_BASE_URL (local), or CUSTOM_API_KEY (OpenAI-compatible)");
process.exit(1);
}

Expand Down
Loading