#help with setup
1 messages · Page 1 of 1 (latest)
That config won’t work as-is — a bunch of the keys/sections don’t match OpenClaw’s schema, and a few provider concepts are mixed up.
What’s wrong / what to change
providersis not a top-level block
- Custom model endpoints go under
models.providers, notproviders. - Docs: https://docs.openclaw.ai/gateway/configuration#models
- OAuth is not configured with
auth: "oauth"in a provider block
- Codex OAuth is the built-in provider
openai-codex(you log in via CLI). - Google Antigravity OAuth is the built-in provider
google-antigravity(plugin + CLI login). - You generally don’t set
baseUrlfor those in config; you enable the plugin and login, and OpenClaw stores tokens in auth profiles. - Docs: https://docs.openclaw.ai/concepts/model-providers
google-antigravityis not “Claude via OpenAI-compatible endpoint”
- Don’t put Claude model IDs under
google-antigravity. If you want Claude, use theanthropic/*provider models. - (Antigravity is a Google auth path for Google models.)
- Heartbeat config is in the wrong place
- It’s
agents.defaults.heartbeat, notgateway.heartbeat. - There is no
silent_hours/silent_hoursfield in the schema. - Docs: https://docs.openclaw.ai/gateway/configuration (search for
agents.defaults.heartbeat)
- Your “memory/chromadb/embeddingModel” block doesn’t match OpenClaw
- OpenClaw durable memory is Markdown (
MEMORY.md+memory/*.md) and optional semantic search is configured viamemory/agents.defaults.memorySearch. - Docs: https://docs.openclaw.ai/concepts/memory
- Your
channels: { default/coding/secure_local }block is not a thing
- In OpenClaw,
channelsmeans WhatsApp/Telegram/Discord/etc config. - If you want “coding uses Codex” vs “secure_local uses Ollama”, do it with multi-agent routing (
agents.list+bindings) or just switch models in the same session using/model. - Docs: https://docs.openclaw.ai/concepts/channel-routing
- Model failover key name
- Use
agents.defaults.model: { primary, fallbacks: [...] }(pluralfallbacks). - Docs: https://docs.openclaw.ai/gateway/configuration (search
fallbacks)
“Can I use all those models in the same OpenClaw + same session?”
Yes — within one agent, you can /model <alias> back and forth and it stays the same session context. But OpenClaw won’t auto-pick “coding vs secure_local” based on a custom channels.coding block; that part needs to be either:
- manual (
/model codex,/model fast, etc.), or - multi-agent (different agents, routed by Discord channel / DM / etc).
What else you need to do (checklist)
- Validate your install + schema drift
openclaw --version
openclaw doctor
- Auth/login for the providers you want
- Codex OAuth:
openclaw models auth login --provider openai-codex --set-default - Google Antigravity OAuth (if you actually want it):
openclaw plugins enable google-antigravity-auth openclaw models auth login --provider google-antigravity --set-default - API-key providers: set env vars (or
models.providers.<id>.apiKey), e.g.ZAI_API_KEY,OPENAI_API_KEY,ANTHROPIC_API_KEY, etc.
- Confirm OpenClaw sees the models + auth
openclaw models list
openclaw models status
If you paste your openclaw --version and (redacted) output of openclaw doctor / openclaw models status, I can tell you exactly which blocks to remove/rename and what the minimal “hybrid cloud + Ollama local + fallbacks + aliases” config should look like for your setup.
can you write the files I need to replace for me ? antigravity oauth Claude 4.5 Opus, ollama cloud Kimi 2.5 (80B), antigravity oauth Gemini 3 Pro
antigravity Claude Sonnet 4.5, ollama cloud Qwen3-Coder-Next, ollama cloud MiniMax m2.1
ollama Qwen3-8B, ollama local Ministral 3B, antigravity oauth Gemini 3 Flash
local Qwen 3 VL, local Skywork-Browser
local TimesFM 2.0.0 wsl2 , local Chronos wsl2
local Flux.1 wsl2 , SDXL WSL2, local AudioCraft (MusicGen/AudioGen) wsl2
local F5-TTS WSL2, local Whisper (2025) BAAI/bge-m3 codex gpt 5.3 antigravity claude code 4.6
I can’t directly write/replace files on your Pi from Discord, but I can give you copy‑pasteable files that match the real OpenClaw schema.
Also: your model list mixes LLMs (Claude/Gemini/Ollama/etc) with non‑LLM tools (TimesFM, Chronos, Flux/SDXL, Whisper, MusicGen, TTS). OpenClaw’s models config is for chat-capable models behind an OpenAI/Anthropic-style API. The non‑LLM stuff needs either:
- a skill (custom tool integration), or
- you wrap it behind an OpenAI-compatible “chat” proxy (LiteLLM/custom server) so OpenClaw can call it like an LLM.
Below is a solid “hybrid cloud + Ollama local + Ollama remote” baseline that will work for “same OpenClaw + same session, switch models with /model”.
File 1) ~/.openclaw/openclaw.json (or .json5)
Paste this, then adjust the placeholders (especially OLLAMA_CLOUD_BASE_URL):
{
$schema: "https://docs.openclaw.ai/schema/openclaw.schema.json",
gateway: {
name: "Pi_v5.1_Hybrid",
mode: "local",
port: 3456,
bind: "loopback",
// Optional but recommended (or set OPENCLAW_GATEWAY_TOKEN in .env)
// auth: { mode: "token", token: "${OPENCLAW_GATEWAY_TOKEN}" },
},
// Use .env for secrets/keys (recommended)
env: {
shellEnv: { enabled: true }, // optional convenience
},
agents: {
defaults: {
// Default model for the agent (same session; you can switch with /model)
model: {
// Pick ONE primary you know you have working first.
// Examples (don’t guess IDs — verify with `openclaw models list`):
primary: "ollama/ministral:3b",
fallbacks: [
"anthropic/claude-sonnet-4-5",
"google-antigravity/gemini-3-pro",
],
},
// Allowlist + aliases for /model
// IMPORTANT: Only put models here that actually exist on your providers.
models: {
// ---- Anthropic (Claude) ----
"anthropic/claude-opus-4-5": { alias: "opus" },
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
// ---- Google Antigravity (Gemini via OAuth plugin) ----
"google-antigravity/gemini-3-pro": { alias: "g3p" },
"google-antigravity/gemini-3-flash": { alias: "flash" },
// ---- Ollama LOCAL (runs where the Gateway runs!) ----
// These IDs must match `ollama list` exactly.
"ollama/ministral:3b": { alias: "fast-local" },
"ollama/qwen3:8b": { alias: "qwen8b" },
openclaw configure will get you a working bot and your bot can then add onto its config. your bot has access to the schema for the config so it'll know what to do
// If your Ollama has these and they support tools:
// "ollama/qwen3-coder-next": { alias: "coder-local" },
// "ollama/qwen3-vl": { alias: "vl" },
// "ollama/skywork-browser": { alias: "browser" },
// ---- Ollama “cloud” / remote box (custom provider below) ----
"ollama-cloud/kimi-k2.5-80b": { alias: "kimi" },
"ollama-cloud/qwen3-coder-next": { alias: "coder" },
"ollama-cloud/minimax-m2.1": { alias: "m2.1" },
},
heartbeat: {
every: "30m",
target: "last",
// No "silent_hours" config key exists; if you need quiet hours, do it operationally
// (disable heartbeats overnight) or via separate automation outside of heartbeat.
},
// Memory: OpenClaw durable memory is Markdown (MEMORY.md + memory/*.md).
// Semantic search is configured via memorySearch (not chromadb).
//
// If you want BGE-M3 embeddings locally, you need a LOCAL embedding setup that OpenClaw supports.
// Start with defaults first; then tune memorySearch after everything else is stable.
// memorySearch: { provider: "openai" | "gemini" | "local", ... }
},
},
// Custom providers (base URLs) go here:
models: {
mode: "merge",
providers: {
// Remote Ollama box (or “Ollama Cloud”) MUST be reachable from the Gateway host.
// If your Gateway is on a Pi, DO NOT use localhost unless Ollama is on the Pi.
"ollama-cloud": {
baseUrl: "${OLLAMA_CLOUD_BASE_URL}", // e.g. "http://100.x.y.z:11434/v1" (Tailscale IP) or "http://192.168.1.50:11434/v1"
apiKey: "${OLLAMA_CLOUD_API_KEY}", // can be any string; Ollama doesn’t require a real key
api: "openai-completions",
models: [
{ id: "kimi-k2.5-80b", name: "Kimi K2.5 80B (remote)" },
{ id: "qwen3-coder-next", name: "Qwen3 Coder Next (remote)" },
{ id: "minimax-m2.1", name: "MiniMax M2.1 (remote)" },
],
},
},
},
}
Docs:
- Models + custom providers: https://docs.openclaw.ai/gateway/configuration#models
- Model providers overview (OAuth vs API keys): https://docs.openclaw.ai/concepts/model-providers
- Ollama provider behavior: https://docs.openclaw.ai/providers/ollama
File 2) ~/.openclaw/.env (example)
# Remote Ollama box (NOT localhost unless it’s on the same machine as the Gateway)
OLLAMA_CLOUD_BASE_URL="http://192.168.1.50:11434/v1"
OLLAMA_CLOUD_API_KEY="ollama-local"
# Enable LOCAL Ollama autodiscovery (Ollama on the Gateway host)
OLLAMA_API_KEY="ollama-local"
# If you enable gateway token auth:
# OPENCLAW_GATEWAY_TOKEN="paste-a-long-random-token-here"
# Cloud keys (only if you use those providers)
# ANTHROPIC_API_KEY="..."
# GEMINI_API_KEY="..." # (not needed if you use google-antigravity OAuth instead)
# ZAI_API_KEY="..."
Required CLI steps (for the OAuth ones you asked for)
Google Antigravity (Gemini OAuth)
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
Claude (Anthropic)
Claude is not “antigravity”. Use Anthropic auth (API key or setup-token).
Docs: https://docs.openclaw.ai/providers/anthropic
Then restart + verify
openclaw doctor
openclaw gateway restart
openclaw models list
openclaw models status
Two quick questions so I can finish this exactly for your setup
- Where is the Gateway running physically (Pi?) and where are the “WSL2” services running? (PC on LAN? Tailscale?)
- Do your TimesFM/Chronos/Flux/SDXL/Whisper/TTS endpoints expose an OpenAI-compatible chat API (
/v1/chat/completionsor/v1/responses)? If not, they can’t just be added undermodels.providersand need skills/wrappers.
Answer those and paste your openclaw models list output (just the provider/model lines; no secrets) and I’ll rewrite the config with the correct model IDs for your machine.
Yep — The Smart One is right here.
If you want this to be actually working (not “a huge config that looks right”), the best path is:
- Get a minimal working bot via the wizard
openclaw --version
openclaw configure
# (or: openclaw configure --section models --section channels)
This writes a schema-valid config and avoids guessing keys like providers, silent_hours, etc.
- Login/auth using the CLI flows (especially OAuth providers)
# Codex OAuth (if you want it)
openclaw models auth login --provider openai-codex --set-default
# Google Antigravity (Gemini OAuth)
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
- Verify what OpenClaw actually sees
openclaw models list
openclaw models status
- Only then start “adding onto config” (custom baseUrls, remote Ollama boxes, etc.) under:
models.providers(custom endpoints)agents.defaults.models(aliases/allowlist)agents.defaults.model(primary + fallbacks)
If you paste the output of openclaw models list (just the model refs) I can tell you exactly what to add next without inventing model IDs.
I am on my bots v5 already lfmao, spend time on other stuff and then when I ask for model testing I realize no images, no music, and oh scrap
That’s the key gotcha: adding “image/music models” to models.providers doesn’t magically give OpenClaw image/music output.
OpenClaw’s models config is for LLMs you chat with (text in/out, sometimes vision in). Image/music generation is typically done via skills (tools) that call a generator (ComfyUI/Flux/SDXL, AudioCraft/MusicGen, Whisper, TTS, etc.), save a file, then send it as an attachment.
So when you say “no images, no music” — there are two different problems:
1) “No images” = can’t understand images you send?
That’s vision / inbound media understanding (optional). Configure tools.media.image (and/or pick a multimodal LLM as your active /model). Docs:
2) “No images / no music” = can’t generate images/music on request?
That needs a generator backend + a skill:
- Flux/SDXL: run ComfyUI (WSL2 is fine) and expose its HTTP API to the machine running the Gateway (LAN/Tailscale). Then write/install a skill that hits ComfyUI, downloads the output PNG, and returns it so OpenClaw can attach it.
- MusicGen/AudioCraft / F5-TTS / Whisper: same pattern—wrap your local Python scripts/services behind a skill.
Skill docs:
One important reality check
If your Gateway is on a Pi, “WSL2 local” is not local to the Pi. The Pi must reach those services over the network (e.g. http://<tailscale-ip>:port/...), otherwise you’ll always get “no image/music” behavior because nothing is reachable.
Fastest way forward
Reply with just:
- Where is the Gateway running (Pi?) and where is WSL2 running (Windows PC?)
- For “no images”: do you mean understand inbound images or generate images?
Then I’ll give you a minimal, correct config snippet for (a) vision understanding and (b) one concrete generator path (ComfyUI Flux or SDXL), instead of trying to jam 15 tools into the LLM model registry.
still if I install Audicraft and /model audiocraft it will give me the audio straight into our conversation no?
No — not “just by installing AudioCraft”.
AudioCraft (MusicGen/AudioGen) is a generator library/runtime, not a chat surface. OpenClaw won’t automatically know to run it, capture the WAV/MP3 it produces, and attach it back into Discord.
To get “audio straight into our conversation” you need one of these integration paths:
Option A (recommended): AudioCraft behind a small local HTTP service + an OpenClaw skill
Flow:
- You run a local service (WSL2 is fine) like:
POST /musicgenwith{ prompt, duration } - Service generates
out.wav(or mp3) and returns it (or a URL) - OpenClaw skill calls that endpoint, downloads the file, then sends it as an attachment back into Discord.
This is the “it feels native” experience.
Option B: Skill runs a command locally (exec) to generate audio
Only works if:
- the generator is installed on the same machine (or node) where the skill executes, and
- OpenClaw has permission/tools to run it (
exec) and access the output file to attach it.
This is usually more fragile than Option A, but quick for prototypes.
Option C: Use a hosted TTS/music API instead
Same as A, but the backend is a cloud API.
Quick clarifying question
Where do you want AudioCraft to run?
- WSL2 Windows box, while the Gateway is on Pi (most common), or
- directly on the Pi?
If it’s WSL2 + Pi, we’ll do Option A with a Tailscale/LAN URL and a skill. That will give you “generate music → bot replies with an audio file” reliably.
through wsl2
WSL2 is perfect for this — but AudioCraft still won’t “just show up” in Discord unless you give OpenClaw a way to call it and send the resulting file back.
The simplest reliable setup is:
1) Run a tiny “MusicGen server” in WSL2 (HTTP)
Your goal: from the Pi (Gateway host), you can do:
POST http://<wsl2-host>:7777/generate→ returns anmp3/wav
Critical: bind the server to 0.0.0.0 and make it reachable from the Pi (LAN or Tailscale). If the Pi can’t curl it, OpenClaw can’t use it.
Quick connectivity test from the Pi:
curl -v http://<wsl2-host>:7777/health
(If you want, I’ll give you a minimal FastAPI example for AudioCraft/MusicGen — but first confirm whether you’ll reach WSL2 via Tailscale IP or LAN IP.)
2) Add an OpenClaw skill that calls that server + sends the audio file
Create a skill folder in your agent workspace (default):
mkdir -p ~/.openclaw/workspace/skills/audiocraft-musicgen
Create:
~/.openclaw/workspace/skills/audiocraft-musicgen/SKILL.md
Example SKILL.md (copy/paste):
---
name: audiocraft_musicgen
description: Generate short music clips via a MusicGen/AudioCraft HTTP server and send them back as an audio attachment.
---
# AudioCraft / MusicGen skill
When the user asks to generate music:
1) Generate audio by calling the MusicGen server (WSL2) over HTTP.
2) Save the result into `media/out.mp3` inside the workspace.
3) Send it back to the current chat as an attachment using the `message` tool.
4) Reply with exactly `NO_REPLY` (to avoid sending an extra text message after the attachment).
Assumptions:
- The MusicGen server base URL is in env var `MUSICGEN_URL` (example: http://100.x.y.z:7777).
- The endpoint is `POST $MUSICGEN_URL/generate` with JSON: { "prompt": "...", "seconds": 10 } returning audio bytes (mp3).
Implementation notes:
- Use the `exec` tool to run curl:
curl -fsSL -X POST "$MUSICGEN_URL/generate" \
-H "content-type: application/json" \
-d '{"prompt":"<PROMPT>","seconds":10}' \
-o "media/out.mp3"
- Then send:
message.send with `media: "media/out.mp3"` and a short caption.
Docs for skills: https://docs.openclaw.ai/tools/creating-skills
Docs for sending media: https://docs.openclaw.ai/nodes/images (concept applies beyond WhatsApp; “send with media” is the key)
3) Set one env var on the Pi (so the skill knows where WSL2 is)
In ~/.openclaw/.env on the Pi:
MUSICGEN_URL="http://<reachable-wsl2-ip>:7777"
Then restart (or reload) the gateway so it picks up the skill + env:
openclaw gateway restart
4) Reality checks (the usual “why it doesn’t send audio”)
- Discord file size limits: keep clips short (e.g. 6–12 seconds) and prefer MP3.
- WSL2 reachability: WSL2 localhost is not Pi localhost. Use LAN or Tailscale.
- Tool permissions/sandbox: if you’ve locked down tools, the skill needs
exec+messageand write access to the workspace.
Two quick answers and I’ll tailor the exact code
- Will the Pi reach WSL2 via Tailscale or plain LAN IP?
- Do you want the server to return mp3 (recommended) or wav?
if I was doing a project, could I ask my bot to just prompt himself the /model command so it first makes for example the UI/UX and the main model , lets say GLM 4.7 calls opus 4.6 with /model , then when its done with the frontend calls codex gpt 5.3 with /model ? or am I tripping? this is an example if its possible then can they jump anytime autonomously?
You’re not tripping — multi-model “handoff” workflows are doable, but not exactly the way you described.
What is possible
A) Manual switching in the same session (you drive it)
You can switch the active session model any time with /model, do a phase of work, then switch again.
That’s the clean “same context, different brain” mode — but it’s you sending /model (it’s a slash command handled by the gateway, not something the LLM typically triggers for itself).
Docs: https://docs.openclaw.ai/help/faq#how-do-i-switch-models-on-the-fly-without-restarting
B) Autonomous multi-model work (recommended): sub-agents
This is the closest match to what you want “autonomously”:
- Keep GLM (or whatever) as the orchestrator
- When it hits “UI/UX phase” → it spawns a sub-agent using Opus (model override)
- When it hits “coding phase” → it spawns a sub-agent using Codex
- Each sub-agent runs in its own session and announces results back into your Discord thread
You can do this with natural language like:
“Design the UI/UX using Opus as a sub-agent, then implement using Codex as a sub-agent, then merge results.”
And you can monitor/control them with:
/subagents list/subagents stop …
Docs: https://docs.openclaw.ai/tools/subagents
The key limitation
- Fallbacks (
agents.defaults.model.fallbacks) are for errors/timeouts/rate limits, not “switch to a better model for this task.” - “Autonomously jump models mid-project” is best done via sub-agents, not by the main agent flipping
/modelback and forth.
If you tell me what aliases you want (e.g. glm, opus, codex) and confirm you already see them in /model list, I can give you a tight config snippet for:
- main orchestrator model
- sub-agent default model (optional)
- allowlist/aliases so sub-agents can request the right ones without “Model not allowed” errors.
subagent would automatically switch to main agent when task done/end?
Yes.
A sub-agent is a separate, temporary worker session. It runs the task you gave it, and when it finishes it announces the result back into your current chat (the main agent’s conversation). After that, you’re effectively “back” with the main agent because:
- the main session is still the one attached to the Discord thread
- the sub-agent doesn’t stay “in control” unless you keep talking to it explicitly via
/subagents send ...
A few practical notes:
- Sub-agent sessions are auto-archived later (default ~60 min) unless configured otherwise.
- If you want the main agent to continue automatically after the sub-agent returns, just phrase the request like:
“Spawn a sub-agent to do UI/UX, then when it announces, integrate it and proceed to coding.”
You can always check what’s running with:
/subagents list
what do you think on setting up chromadb + faiss as secondary hybrid with rag wapper and BAAI/bge-m3 for running openclaw, is it really gamechanger? even better than paying for supermemory ai? is it worth? is there anything better? will I see massive difference on how openclaw runs?
ChromaDB + FAISS isn’t a “drop-in upgrade” for OpenClaw right now — there’s no built-in config path where you flip memory.backend: chromadb and suddenly everything gets better. If you want that stack, you’re talking about building a custom RAG service + a skill/tool that queries it and injects results into the prompt.
Will it be a gamechanger / massive difference?
Only if your pain is specifically retrieval over lots of external text (docs, repos, notes, transcripts) that you don’t already keep in MEMORY.md / memory/*.md.
If your pain is more like:
- “the agent forgets what it was doing mid-task”
- “it loses context”
- “it doesn’t follow through”
…then a vector DB won’t fix that. That’s more about session management, compaction, task structure, and using sub-agents, not RAG.
What OpenClaw already has (the “80%”)
OpenClaw already supports semantic memory search over MEMORY.md + memory/**/*.md (and can index extra paths), using embeddings + keyword fallback. That’s usually enough for “personal assistant memory”.
Docs: https://docs.openclaw.ai/concepts/memory
And if you want a bigger retrieval jump without building your own Chroma/FAISS stack, look at the QMD backend (BM25 + vectors + reranking sidecar) which is actually described as an integrated option:
Docs: https://docs.openclaw.ai/concepts/memory (QMD section)
“Better than paying for Supermemory AI?”
Different tradeoff:
- Supermemory (hosted) is mainly worth it for product UX + connectors + low-ops.
- Self-host (Chroma/FAISS/Qdrant/etc) is worth it for control/privacy + custom pipelines, but you pay in setup/maintenance and you still must integrate it into OpenClaw via a skill.
What I’d do (practical recommendation)
- Get OpenClaw’s built-in memory search working well first (and/or QMD).
- Only add Chroma/FAISS if you have a clear target like: “I want it to answer questions over 50k+ Markdown/PDF pages / a big repo / lots of transcripts”.
If you tell me what you want to “RAG” over (Discord logs? Notion? PDFs? Git repos?) and roughly how big it is, I’ll tell you whether you’ll likely feel a real improvement — and which route (built-in + extraPaths, QMD, or external RAG skill) is the least painful.
yes, my pain is more like you say
“the agent forgets what it was doing mid-task”
“it loses context”
“it doesn’t follow through”
Can you give me a military grade idea to improve this?
“Military grade” for this problem is less about RAG and more about (1) keeping enough context, (2) preventing context bloat, and (3) enforcing an execution loop so the agent can’t wander.
Here’s a battle-tested approach that actually moves the needle in OpenClaw:
1) Use a strong “orchestrator” model + don’t lie about context
If your primary model is small / low-context (common with local), it will inevitably lose the plot mid-task.
- Pick one solid model as the main agent default (GLM/Opus/Sonnet/etc).
- Use cheaper/local models for sub-tasks only.
- Make sure your model’s
contextWindowis accurate (custom providers especially). If you overstate it, compaction/pruning timing gets worse.
2) Stop tool output from eating your context (big cause of “forgot what we were doing”)
Enable/tune context pruning so old tool results don’t crowd out the plan:
agents: {
defaults: {
contextPruning: {
mode: "adaptive",
keepLastAssistants: 5,
// Optional: don’t prune browser/canvas results if you rely on them heavily
// tools: { deny: ["browser", "canvas"] },
},
},
}
This keeps the “decision-making” messages but trims/clears old tool spam.
3) Make compaction safer (so summaries don’t destroy the plan)
Turn on “safer” compaction and force a memory flush before compaction:
agents: {
defaults: {
compaction: {
mode: "safeguard",
reserveTokensFloor: 24000,
memoryFlush: {
enabled: true,
softThresholdTokens: 6000,
prompt: "Write durable project state to memory/YYYY-MM-DD.md (decisions, next steps, constraints). Reply NO_REPLY.",
},
},
},
}
This helps a lot with “it doesn’t follow through” across long sessions, because the bot writes down state before it gets summarized.
4) Force single-threaded execution (prevents derailment)
A hidden killer is concurrency + message queueing: you send follow-ups while it’s mid-run and it half-switches goals.
Set:
agents: { defaults: { maxConcurrent: 1, timeoutSeconds: 900 } },
messages: {
inbound: { debounceMs: 1200 },
queue: { mode: "collect", cap: 20, drop: "summarize" },
},
This makes it finish one thing, then process the backlog coherently.
5) Use sub-agents for “specialists” (instead of model-flipping the main brain)
Do not rely on fallbacks for “hard tasks”. Use sub-agents:
- Main agent: orchestrates + keeps the plan
- Sub-agent: UI/UX with Opus, coding with Codex, etc.
- Then main agent integrates.
This is the most reliable way to “jump models autonomously” without losing the central thread.
6) Add a “Mission File” checkpoint habit (this is the real military part)
For any project longer than ~10 minutes, have it create and maintain a single source of truth in the workspace, e.g.:
PROJECT.mdwith:- Objective
- Constraints
- Current status
- Next 3 actions
- Definition of Done
And instruct it: after each phase, update PROJECT.md before continuing. That one habit crushes the “wander off / forget” failure mode.
If you paste your current agents.defaults block (redact keys) and tell me your primary model + rough context window (128k? 200k?), I’ll give you a ready-to-paste tuned config snippet (compaction + pruning + queue + subagents) that matches your setup exactly.
what does this mean? Provider notes:
Z.AI (zai/*) only supports binary thinking (on/off). Any non-off level is treated as on (mapped to low).
It’s about the “thinking” / reasoning mode knob.
OpenClaw can express different thinking levels (e.g. off / low / medium / high) for models that support it. But Z.AI’s GLM endpoint only supports a boolean: thinking is either off or on.
So that note means:
- If you set thinking to
off→ Z.AI runs with thinking disabled. - If you set thinking to anything else (
low,medium,high) → OpenClaw has no way to request different intensities, so it just turns thinking on. - Internally it “maps” any non-off level to
lowbecause there’s no finer control available on that provider.
Practical impact:
- Don’t expect “high thinking” to be more than “low thinking” on Z.AI — they’re the same.
- If you want real multi-level thinking control, use a provider/model that supports it (Anthropic is the common example).
If you tell me where you saw that line (from /model status, logs, or the Control UI), I can point to the exact setting that triggered it and how to disable thinking for Z.AI if you want.
what is the command to turn on mi zai glm 4.7 then
If /model zai/glm-4.7 isn’t found or says “not allowed”:
- run
/model listand pick it from the numbered list, or - add
"zai/glm-4.7"toagents.defaults.models(if you’re using an allowlist), and make sureZAI_API_KEYis set on the gateway host.
and how do I know how it was (enabled or disabled) before touching it?
Use the thinking directive without an argument — it prints the current state.
Send:
/thinking
(or the shorter alias)
/think
That shows the current session thinking level (on/off/low/etc).
If you also want the “full picture” (model + auth profile + any pinned overrides), use:
/model status
That will show which model is active and any session overrides currently applied.
timesFM and chronos can run directly as subagent or they need skill?
They need a skill (or a wrapper).
A sub-agent is still just an LLM session (a “worker brain”). It can’t “become TimesFM/Chronos” unless TimesFM/Chronos are exposed behind something that looks like a callable tool.
You have 2 good integration patterns:
Option A (best): Run TimesFM/Chronos as an HTTP service (WSL2) + skill
- WSL2 runs
POST /forecast(TimesFM) andPOST /predict(Chronos) - Skill calls the endpoint, gets JSON back, and the bot replies with the forecast (and/or attaches a CSV/plot)
This is the cleanest + works even if the Gateway is on the Pi.
Option B (quick prototype): Skill runs a local command (exec) on the machine that has them
- Write a small Python script that reads input JSON, outputs forecast JSON
- Skill calls it via
exec - Only works if OpenClaw can execute on the right machine (Pi vs WSL2 vs a paired node) and can access the output files.
So: sub-agent = orchestration, skill = actually running TimesFM/Chronos.
If you tell me where TimesFM/Chronos will run (WSL2 box IP/Tailscale) and what input format you want (CSV? JSON with timestamps?), I can sketch the minimal “forecast service + OpenClaw skill” interface.
what about BAAI bge m3
BAAI bge-m3 is not something you run “as a sub-agent”. It’s an embedding model (vectorizer) — useful for semantic memory search / RAG, not for chat replies by itself.
Where it fits in OpenClaw
It plugs into memory search (memory_search) via:
agents.defaults.memorySearch(built-in SQLite + vectors + BM25 hybrid)- optionally the QMD backend (different local retrieval engine)
Docs: https://docs.openclaw.ai/concepts/memory
If you want bge-m3 specifically
OpenClaw “local embeddings” expects a GGUF (or hf: URI that resolves to a GGUF) via node-llama-cpp.
Example (local embeddings):
{
agents: {
defaults: {
memorySearch: {
provider: "local",
local: {
// You need a GGUF here (either a local path or an hf: URI to a GGUF file)
modelPath: "hf:<some-bge-m3-gguf-repo>/<file>.gguf"
},
fallback: "none"
}
}
}
}
Important caveats:
- You must actually have a bge-m3 GGUF available. (If you only have the original HF transformers model, that’s not enough for this local path.)
- Local embeddings require native deps (
node-llama-cpp). On a Pi this can be annoying/heavy.
The practical recommendation (for most people)
Use remote embeddings first (simpler, works great):
{
agents: {
defaults: {
memorySearch: { provider: "openai", model: "text-embedding-3-small" }
// or provider: "gemini"
}
}
}
Also: Codex OAuth does not grant embeddings, so for OpenAI embeddings you still need an actual OPENAI_API_KEY (docs mention this).
Will bge-m3 “massively fix” forgetting mid-task?
Usually no — bge-m3 helps when the agent decides to retrieve something it wrote before. Your symptoms (“loses the plot mid-task”) are more about context/compaction/pruning + execution loop, not embeddings quality.
If you want, paste what host your Gateway is on (Pi?) and whether you have OpenAI/Gemini keys available, and I’ll tell you the best “lowest ops” memorySearch config for your setup (local vs remote, plus whether to enable experimental.sessionMemory).
Ese “Blindaje de Seguridad v5.1” como prompt puede servir como recordatorio de comportamiento (“no pegues keys en chat / no las guardes en archivos”), pero no convierte OpenClaw en un vault cifrado ni activa ninguna función real de “security.vault”.
Puntos clave (importantes):
1) Ese bloque de config "security": { "vault": ... } no existe en el schema de OpenClaw
En OpenClaw no hay una sección estándar gateway.security / security.vault como la que pones. Si lo agregas, lo normal es que:
- el config no valide o
- simplemente sea ignorado (dependiendo del validador/versión), pero no te da vault.
2) Cómo maneja secretos OpenClaw “de verdad” hoy
- API keys: lo más sano es env vars (o
${VAR}en config). OpenClaw soporta sustitución${VAR}. - OAuth (Codex/Antigravity/etc): se guarda en auth profiles en disco (ej.
~/.openclaw/agents/<agentId>/agent/auth-profiles.json). Eso es práctico, pero no es un vault cifrado.
O sea: el “zero persistence” que describes no es el comportamiento actual.
3) Si quieres un “vault cifrado” estilo militar: se hace fuera de OpenClaw
Lo viable es:
- guardar secretos en un secrets manager (1Password CLI, sops/age, pass, Vault, etc.)
- al arrancar el gateway, inyectar secretos como env vars (sin escribirlos en
openclaw.json)
Ejemplo (patrón correcto en OpenClaw):
models: {
providers: {
"my-proxy": {
baseUrl: "https://…",
apiKey: "${MY_PROXY_API_KEY}"
}
}
}
…y MY_PROXY_API_KEY lo resuelve el sistema operativo (systemd/launchd/tu wrapper), no el LLM.
4) Para reducir leaks en la práctica (sin inventar features)
- No pegues keys en Discord (esto es el leak #1).
- Mantén activado el redaction por defecto (OpenClaw ya redácta tool outputs sensibles en logs en muchos casos).
- Evita
/verbose fullen canales públicos. - Restringe tools/sandbox si es un bot expuesto.
Si me dices en qué host corre el Gateway (Pi) y cómo lo arrancas (systemd service? terminal?) te digo el enfoque más limpio para “vault cifrado externo → export env vars → OpenClaw” en tu caso.
hello Krill, the 1password default skill on installation...is it only for API keys or also discord connection tokens with my bot will be stored there?
The 1Password skill is just a helper for using the op CLI (read/inject/run secrets). It doesn’t automatically store anything for OpenClaw.
What gets stored where (by default)
- Discord bot token: either
- plaintext in config:
channels.discord.token, or - env var:
DISCORD_BOT_TOKEN(env fallback)
Docs: https://docs.openclaw.ai/channels/discord#quick-setup-beginner
- plaintext in config:
- Model API keys: usually env vars (or config
models.providers.*.apiKey). - OAuth logins (Codex/Antigravity/etc): stored in OpenClaw’s auth profiles on disk (
auth-profiles.json), not in 1Password.
If you want Discord tokens in 1Password
Yes, you can store the Discord token in 1Password — but you must wire it in yourself by starting the gateway with env injected from 1Password, e.g.:
- keep
channels.discord.tokenunset (so it’s not written in plaintext), and - set
DISCORD_BOT_TOKENviaop run(or similar), so the secret never lands inopenclaw.json.
So: 1Password can be used for API keys and Discord tokens, but only if you choose that pattern. OpenClaw won’t automatically move/manage those tokens in 1Password for you.
If you tell me what OS your Gateway runs on (Pi/Linux?) and how you start it (systemd service vs manual), I can show the cleanest op run -- … setup for that environment.
will it load ollama models will load as subagents if doing openclaw onboard and selecting z ai glm 4.7 as a main? or I have to follow any further steps?
No — picking Z.AI GLM 4.7 as your main model in openclaw onboard won’t automatically make Ollama models “load as subagents.”
What happens by default:
- Main agent uses whatever you set as
agents.defaults.model.primary(GLM 4.7 in your case). - Sub-agents (spawned via
sessions_spawn) inherit the caller’s model unless you configure a sub-agent default model or explicitly override the model when spawning.
What you need to do (minimum)
1) Make Ollama models available to OpenClaw
If Ollama runs on the same machine as the Gateway:
- install/run Ollama
ollama pull <model>- set
OLLAMA_API_KEYto any value (it’s just an enable flag) - don’t define
models.providers.ollamaif you want autodiscovery
If your Gateway is on a Pi and Ollama is on WSL2, then localhost won’t work — you must point OpenClaw at the WSL2/LAN/Tailscale URL via models.providers (custom provider/baseUrl).
2) Set a default model for sub-agents (optional but recommended)
Add this to your config:
{
agents: {
defaults: {
subagents: {
model: "ollama/qwen3:8b",
maxConcurrent: 1
}
}
}
}
Also make sure that model is allowed if you’re using an allowlist (agents.defaults.models).
Docs: https://docs.openclaw.ai/tools/subagents
How to verify it’s working
Run:
openclaw models list
openclaw models status
and in chat you can check/manage subagents with:
/subagents list
If you tell me where Ollama is running (Pi local vs WSL2) and the exact model IDs from ollama list, I can give you the exact models.providers + subagents.model snippet that matches your topology.
do I have to set anything up before doing it from openclaw?
Yes — you need Ollama itself running + reachable before OpenClaw can use it (main agent or sub-agents). OpenClaw won’t “pull/load” Ollama models for you; it just sends requests to an Ollama server.
Minimal checklist (before you try it in OpenClaw)
1) On the machine that will run Ollama
- Install Ollama
- Pull the models you want:
ollama pull qwen3:8b # etc ollama list - Make sure the Ollama server is running.
2) Make sure the Gateway host can reach Ollama
From the machine running the OpenClaw Gateway (Pi/VPS/etc), test:
curl http://<ollama-host>:11434/api/tags
If that fails, OpenClaw can’t use Ollama (common issue when Ollama is on WSL2 but only bound to localhost).
3) Enable Ollama in OpenClaw
On the Gateway host, set an API key value (any string is fine; it’s an enable flag):
- Env var:
OLLAMA_API_KEY=ollama-local
(or via config:models.providers.ollama.apiKey)
Then confirm OpenClaw sees the models:
openclaw models list
openclaw models status
4) If you want sub-agents to use Ollama by default
Set:
agents: {
defaults: {
subagents: { model: "ollama/qwen3:8b" }
}
}
And if you use an allowlist (agents.defaults.models), make sure that model is included there too.
If you tell me where your Gateway runs (Pi?) and where Ollama runs (WSL2?), I can tell you the exact “best practice” setup (local autodiscovery vs models.providers with a remote baseUrl).
take into account I already have installed ollama and models
Cool — if Ollama + the models are already installed, the remaining work is basically just making OpenClaw see/reach that Ollama server and (optionally) setting Ollama as the default sub-agent model.
1) First: is Ollama on the same machine as the OpenClaw Gateway?
This decides everything:
Case A — Same machine (easy)
OpenClaw will auto-discover Ollama at http://127.0.0.1:11434 if you set OLLAMA_API_KEY (any value):
export OLLAMA_API_KEY="ollama-local"
openclaw gateway restart
openclaw models list
openclaw models status
Case B — Ollama is on WSL2 / another machine (common)
Then 127.0.0.1:11434 on the Gateway host is not your WSL2 Ollama. You must:
- Ensure the Gateway host can reach it:
curl http://<wsl2-or-windows-ip>:11434/api/tags
- Add an explicit provider in OpenClaw config (
models.providers.<name>.baseUrl: "http://<ip>:11434/v1"), because auto-discovery only targets127.0.0.1:11434.
2) If you want sub-agents to use Ollama by default
Add:
agents: {
defaults: {
subagents: { model: "ollama/<your-model-id>" }
}
}
And if you have an allowlist (agents.defaults.models), make sure that same ollama/... model is included or it’ll say “Model not allowed”.
3) Quick “am I done?” commands
Run these and you’ll know immediately:
openclaw models list
openclaw models status
Tell me: Is your Gateway running on the Pi, while Ollama is in WSL2 on a PC? If yes, paste the result of curl http://<PC-IP>:11434/api/tags from the Pi and I’ll give you the exact models.providers block to paste.
pc, unify this prompt windows
Got it — PC (Windows). Here’s the unified “Windows-first” setup for Ollama + OpenClaw.
Step 0 — Decide where the OpenClaw Gateway runs
- If the Gateway runs on the same PC (Windows/WSL2): easiest path (Ollama can stay localhost).
- If the Gateway runs on a Pi/VPS and Ollama is on your PC: you must expose Ollama to the network (LAN/Tailscale) and point OpenClaw at that IP.
I’ll give both.
A) Gateway on the same PC (recommended if you’re testing)
1) Confirm Ollama is reachable locally
PowerShell (or WSL2):
curl http://127.0.0.1:11434/api/tags
2) Enable Ollama in OpenClaw (just an enable flag)
Set OLLAMA_API_KEY in the environment where the gateway process runs.
Easiest: put it in OpenClaw’s global env file:
- WSL2/Linux gateway:
~/.openclaw/.env - Windows native gateway: wherever you run
openclaw gatewayfrom (or set a system env var)
Value can be anything:
OLLAMA_API_KEY=ollama-local
3) Restart + verify
openclaw gateway restart
openclaw models list
openclaw models status
4) (Optional) Make sub-agents use Ollama by default
Add to config:
agents: { defaults: { subagents: { model: "ollama/<your-model-id>" } } }
B) Gateway NOT on the PC (Pi/VPS), but Ollama IS on the PC
You need two things:
1) Expose Ollama so the Gateway can reach it
- Make Ollama listen on a non-localhost interface (LAN or Tailscale)
- Allow inbound port 11434 in Windows firewall
Then from the Gateway host (Pi/VPS), this must work:
curl http://<PC-IP>:11434/api/tags
2) Tell OpenClaw to use that remote Ollama via models.providers
Because Ollama autodiscovery only targets 127.0.0.1:11434.
Example:
models: {
mode: "merge",
providers: {
"ollama-pc": {
baseUrl: "http://<PC-IP>:11434/v1",
apiKey: "ollama-local",
api: "openai-completions",
models: [
{ id: "qwen3:8b", name: "Qwen3 8B (PC Ollama)" }
]
}
}
},
agents: {
defaults: {
models: { "ollama-pc/qwen3:8b": { alias: "qwen8b" } },
subagents: { model: "ollama-pc/qwen3:8b" }
}
}
One question so I don’t steer you wrong
Is your OpenClaw Gateway running on the PC now, or still on a Pi?
If you answer that + paste what curl http://127.0.0.1:11434/api/tags returns on the PC (just the fact it works / doesn’t), I’ll point you to the exact branch and the minimal config you need.
what is the url to autenticate google antigravity oauth if you already set up another main model? in order to use as subagents
There isn’t a single fixed “Antigravity OAuth URL” you bookmark.
OpenClaw’s Antigravity OAuth is a CLI login flow: you run a command on the gateway host, and it prints the exact URL (and/or device code) you must open for that login session.
Do this on the machine running the Gateway
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
- That command will output something like “Open this URL…” (and usually a code). That’s the URL you use.
- After you complete it, verify:
openclaw models status
openclaw models list
Using it for sub-agents
You don’t need to change your “main model” for this. Once you’re logged in:
- sub-agents can use a
google-antigravity/...model if it’s allowed. - If you have an allowlist (
agents.defaults.models), make sure the Antigravity model(s) you want appear there, otherwise you’ll hit “Model … is not allowed”.
If you tell me whether you’re using an allowlist (agents.defaults.models present) and paste the relevant part of your openclaw models status (redacted), I can tell you exactly what to add.
al usar glm como principal y probar mis subagentes de antigravity oauth me sale este mensaje
Buena pregunta: ese “model not allowed” no era fallo del proveedor, era una restricción de política interna al lanzar sessions_spawn desde este agente.
En concreto:
- desde coding hay una lista de modelos permitidos para override en subagentes,
- cuando intenté forzar algunos modelos por parámetro model, el sistema lo bloqueó y siguió con el modelo permitido por defecto.
Por eso luego viste que sí respondían “OK”: el job se ejecutó igual, solo que no siempre con el override que yo pedía.
Si quieres, te puedo dejar la allowlist ajustada para que acepte esos overrides explícitos sin ese warning.
Ese diagnóstico va bien encaminado: no era “fallo de Antigravity”, era que OpenClaw rechazó el override de modelo porque ese modelo no está permitido por tu allowlist.
En OpenClaw, si tienes agents.defaults.models configurado, eso se convierte en la lista de modelos permitidos para:
/model …- cualquier override de sesión
- y también el
model:que pasas asessions_spawn(sub-agents)
Cuando el override no está permitido, el sub-agent se ejecuta igual, pero con su modelo por defecto (por eso ves “OK” aunque no usó el modelo que pedías).
Cómo arreglarlo (lo correcto)
-
Asegúrate de que el modelo que quieres usar existe y está disponible
- En chat:
/model list(o/model) - En CLI:
openclaw models listyopenclaw models status
- En chat:
-
Añade esos modelos a
agents.defaults.models
Ejemplo (ajusta a los IDs reales que te salgan en/model list):
agents: {
defaults: {
models: {
"zai/glm-4.7": { alias: "glm" },
"google-antigravity/gemini-3-pro": { alias: "g3p" },
"google-antigravity/gemini-3-flash": { alias: "g3f" },
// Si lo que querías era Claude, NO es antigravity:
"anthropic/claude-opus-4-5": { alias: "opus" }
},
// opcional: modelo por defecto para sub-agents
subagents: { model: "google-antigravity/gemini-3-pro" }
}
}
Ojo con una confusión común
- Google Antigravity OAuth → normalmente para Gemini (
google-antigravity/*) - Claude → es Anthropic (
anthropic/*) y se autentica por otro flujo (API key o setup-token)
Si me pegas el texto exacto del error “Model … is not allowed” (la línea que te sale) o una captura de /model list, te digo exactamente qué provider/model tienes que añadir al allowlist para que el override funcione.
me refiero a los modelos de claude que tiene antigravity oauth
Ahhh vale — sí existen “Claude” detrás de Antigravity OAuth, pero no son anthropic/.... Son modelos bajo el provider:
google-antigravity/...
Ejemplo que aparece en los docs/tests de OpenClaw:
google-antigravity/claude-opus-4-5-thinking
Por qué te sale “model not allowed”
Porque si tienes agents.defaults.models definido, eso es el allowlist. Entonces aunque estés logueado en Antigravity, un sub-agent no puede usar google-antigravity/claude-... si no está en esa lista.
Pasos para dejarlo funcionando (GLM main + Claude Antigravity en subagents)
- Activar + loguear Antigravity (en la máquina del Gateway)
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
- Confirma el ID exacto del modelo que te ofrece tu instalación
En chat:
/model list
o en CLI:
openclaw models list
openclaw models status
- Añádelo al allowlist
En tuopenclaw.json:
agents: {
defaults: {
models: {
"zai/glm-4.7": { alias: "glm" },
// Pon AQUÍ el exacto que te salga en /model list
"google-antigravity/claude-opus-4-5-thinking": { alias: "ag-opus" }
},
// Opcional: que los subagents usen esto por defecto
subagents: {
model: "google-antigravity/claude-opus-4-5-thinking"
}
}
}
Con eso:
- mantienes GLM como principal
- y los sub-agentes ya pueden correr con Claude (Antigravity OAuth) sin bloquear el override.
Si me pegas lo que te sale en /model list para los google-antigravity/..., te digo cuál poner exactamente (porque los IDs pueden variar y no quiero inventármelos).
el tema es que solo me sale 2-5 flash por algun motivo, pero si hago openclaw onboard con antigravity oauth si que me deja usar opus 4.6 opus 4.5 sonnet 4.5 gemini 3 pro y gemini 3 flash...
Eso casi siempre pasa por una de estas 2 cosas (y ambas encajan perfecto con lo que describes):
1) Tienes un allowlist activo (agents.defaults.models) y te está “recortando” /model list
En OpenClaw, si existe agents.defaults.models, /model solo te muestra (y solo te deja usar) esos modelos.
Entonces aunque Antigravity esté bien logueado, si en tu allowlist solo está …gemini-2.5-flash…, eso es lo único que verás.
Cómo confirmarlo rápido (en chat):
- Ejecuta:
/model status
- Luego:
/model list
Si model status te indica que hay allowlist/aliases configurados, ahí está el “por qué”.
Fix: añade explícitamente los google-antigravity/... que quieres a agents.defaults.models (o temporalmente quita el allowlist para probar).
2) Te logueaste a Antigravity en otro agente (auth profiles son por agente)
El onboarding puede haberte creado/auth en un agente, pero ahora estás chateando con otro (o cambiaste routing).
Como los tokens viven en ~/.openclaw/agents/<agentId>/agent/auth-profiles.json, si estás en otro agentId, no aparecen esos modelos.
/model status te lo revela porque muestra qué agente está activo y qué auth-profiles.json está usando.
Nota importante sobre “Opus 4.6 / 4.5”
En Antigravity, los “Claude” suelen aparecer con IDs tipo:
google-antigravity/claude-opus-4-5-thinking(ejemplo real de docs/tests)
O sea, aunque el UI te lo “nombre” como 4.6/4.5, el model id que OpenClaw lista/permite puede ser distinto (y a veces con -thinking).
Lo mínimo que necesito para decirte exactamente qué tocar
Pégame el output de:
/model status(en el chat donde te falla)- y si puedes, una captura/texto de
/model list
Con eso te digo si es allowlist, agente equivocado, o modelo id distinto (y te paso el bloque exacto para agents.defaults.models).
dice antigravity (5) pero si lo elijo solo se pone el gemini 2-5 flash
Eso suena a que en tu picker “antigravity (5)” es el grupo/proveedor, y al elegirlo OpenClaw te está poniendo el modelo “default” de ese proveedor (en tu caso: gemini-2.5-flash). No estás seleccionando un modelo Claude concreto.
Lo normal cuando “onboard con antigravity” te dejaba ver Opus/Sonnet/etc y ahora no, es por allowlist:
- Si tienes
agents.defaults.modelsdefinido,/modelsolo te deja escoger lo que esté ahí. - Si en tu allowlist solo quedó
google-antigravity/gemini-2.5-flash, aunque Antigravity tenga Claude disponibles, no te los va a mostrar ni permitir, y al “elegir Antigravity” cae al único permitido.
Cómo comprobarlo en 30 segundos (sin adivinar)
- En el chat, ejecuta:
/model status
- Luego intenta forzar directamente el Claude de Antigravity (con un ID conocido):
/model google-antigravity/claude-opus-4-5-thinking
- Si te responde “Model … is not allowed” → 100% es allowlist: tienes que añadir ese model id a
agents.defaults.models. - Si te responde “Unknown model …” → tu gateway ahora mismo no está resolviendo ese modelo (plugin/login/routing/agent distinto). En ese caso: en la máquina del gateway corre:
openclaw plugins enable google-antigravity-auth openclaw models auth login --provider google-antigravity --set-default openclaw models list
Fix típico (cuando es allowlist)
Añade (copiando EXACTAMENTE los IDs que te salgan en /model list o openclaw models list):
agents: {
defaults: {
models: {
"zai/glm-4.7": { alias: "glm" },
"google-antigravity/claude-opus-4-5-thinking": { alias: "ag-opus" },
"google-antigravity/claude-sonnet-4-5-thinking": { alias: "ag-sonnet" },
"google-antigravity/gemini-2.5-flash": { alias: "ag-flash" }
}
}
}
Si me pegas el texto de /model status (o screenshot) te digo exactamente cuál de las dos (allowlist vs “unknown model”) es tu caso y qué línea hay que tocar.
google-antigravity/gemini-3-flash
• google-antigravity/claude-opus-4-6-thinking
• google-antigravity/claude-sonnet-4.5
• google-antigravity/claude-code-4.6
• google-antigravity/gemini-3-pro
aparecen estos al hacer estatus , nisiquiera aparece el 2.5 que luego dice elegir, que raro
Eso sí es raro, pero tiene una explicación bastante probable:
- En tu
/model statusaparecen modelosgoogle-antigravity/...(Gemini 3, Claude Opus/Sonnet/Code). - Si al “elegir Antigravity” te pone Gemini 2.5 Flash, entonces eso NO está viniendo de
google-antigravity, sino de otro provider/alias (normalmentegoogle/...o un atajo tipogemini-flashque apunta a otra cosa).
La forma de salir de la duda y arreglarlo es forzar el modelo por ID completo (sin pasar por el “grupo”):
1) Fuerza Claude Antigravity explícitamente (en el chat)
Prueba exactamente:
/model google-antigravity/claude-opus-4-6-thinking
Luego inmediatamente:
/model status
Ahí debería decirte el Active model real. Si sigue diciendo algo como google/...gemini-2.5-flash, entonces no está aplicando el cambio (por allowlist/otro agente/otro override).
2) Para evitar estos líos: crea aliases “limpios”
En tu config, pon aliases para esos IDs (y así no dependes del selector por proveedor):
agents: {
defaults: {
models: {
"google-antigravity/claude-opus-4-6-thinking": { alias: "ag-opus" },
"google-antigravity/claude-sonnet-4.5": { alias: "ag-sonnet" },
"google-antigravity/claude-code-4.6": { alias: "ag-code" },
"google-antigravity/gemini-3-pro": { alias: "ag-g3p" },
"google-antigravity/gemini-3-flash": { alias: "ag-g3f" }
}
}
}
Luego ya seleccionas con:
/model ag-opus
y para sub-agents puedes pedir “usa ag-opus” (o pasar ese alias como model en sessions_spawn).
3) Si el comando te responde “Model not allowed”
Entonces es 100% allowlist: te falta ese ID dentro de agents.defaults.models.
Pásame el output de /model status justo después de que te “ponga gemini 2.5 flash” (la línea donde dice el modelo activo). Con eso te digo si:
- te está resolviendo al provider equivocado (
googlevsgoogle-antigravity), o - hay un override/allowlist bloqueando el cambio.
pero recuerda que todos ellos deben ser subagentes
Perfecto — entonces la regla es:
- GLM (zai/glm-4.7) = agente principal (orquestador)
- Claude/Gemini via
google-antigravity/*= SOLO sub-agentes
Eso se consigue con dos cosas:
1) Config: dejar GLM como primary y definir el “default” de sub-agents
En tu openclaw.json:
agents: {
defaults: {
model: { primary: "zai/glm-4.7" },
// Sub-agents: modelo por defecto (uno solo)
subagents: {
model: "google-antigravity/gemini-3-flash",
maxConcurrent: 1
},
// IMPORTANT: si tienes allowlist, aquí deben estar TODOS los modelos que quieras usar en subagents
models: {
"zai/glm-4.7": { alias: "glm" },
"google-antigravity/gemini-3-flash": { alias: "ag-g3f" },
"google-antigravity/gemini-3-pro": { alias: "ag-g3p" },
"google-antigravity/claude-opus-4-6-thinking": { alias: "ag-opus" },
"google-antigravity/claude-sonnet-4.5": { alias: "ag-sonnet" },
"google-antigravity/claude-code-4.6": { alias: "ag-code" }
}
}
}
Con esto, aunque el agente principal sea GLM, cualquier sub-agent puede usar esos modelos (porque están permitidos).
2) Uso: pedir sub-agents con modelo explícito (no /model)
Como quieres que “todos ellos” sean subagentes, el patrón es:
- “Spawn un sub-agent con
ag-opuspara UI/UX” - “Luego spawn otro sub-agent con
ag-codepara coding” - “Luego yo (GLM) integro resultados”
Si el override de modelo del sub-agent no está permitido, verás el típico “model not allowed” y entonces el sub-agent corre con el default (subagents.model).
Muy importante
Asegúrate de que Antigravity OAuth está logueado en el gateway host:
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
Si me pegas tu bloque actual agents.defaults.models (solo esa parte, sin secretos), te lo devuelvo ya “limpio” con los 6 IDs exactos que tú listaste para que no te vuelva a bloquear overrides en subagents.
[openclaw] Model "google-antigravity/claude-opus-4-6-thinking" is not allowed. Use /models to list providers, or /models <provider> to list models.
Ese error es 100% allowlist.
Tú ya tienes el provider google-antigravity funcionando (lo ves en status), pero como tienes una lista de modelos permitidos, OpenClaw bloquea cualquier /model … o override de sub-agent que no esté en agents.defaults.models.
Qué hacer
- Lista lo permitido en ese chat
En Discord:
/models
/models google-antigravity
(/models es alias de /model.)
- Añade esos modelos a tu allowlist
Enopenclaw.json(bajoagents.defaults.models) mete exactamente los IDs que te salen en status:
agents: {
defaults: {
model: { primary: "zai/glm-4.7" },
models: {
"zai/glm-4.7": { alias: "glm" },
"google-antigravity/gemini-3-flash": { alias: "ag-g3f" },
"google-antigravity/gemini-3-pro": { alias: "ag-g3p" },
"google-antigravity/claude-opus-4-6-thinking": { alias: "ag-opus" },
"google-antigravity/claude-sonnet-4.5": { alias: "ag-sonnet" },
"google-antigravity/claude-code-4.6": { alias: "ag-code" }
},
// opcional: modelo por defecto para sub-agents
subagents: { model: "ag-g3f" }
}
}
- Reinicia el gateway (o espera hot-reload si lo tienes)
openclaw gateway restart
“Pero yo quiero que solo se usen como sub-agents”
Se puede en la práctica dejando GLM como primary y usando sub-agents con override (ag-opus, ag-sonnet, etc.).
Lo que no hay hoy (hasta donde llega el schema) es una política de “este modelo solo permitido en subagents”; la allowlist es global para el agente. Así que la disciplina es: no uses /model ag-opus en el hilo principal; úsalo solo cuando spawneas subagents.
Si quieres, pégame tu bloque actual agents.defaults.models y te lo dejo “cerrado” (solo GLM + esos 5 antigravity) para que no aparezcan modelos raros como el “2.5 flash” que te estaba saltando antes.
Plugin habilitado y gateway reiniciado.
Situación actual:
- OAuth de Google Antigravity ya existía (lo vimos antes).
- Los modelos gemini-3-pro, claude-opus-4-6-thinking, claude-sonnet-4.5 siguen marcados como “not allowed”.
Esto no es problema de autenticación, sino que tu plan/contrato de Google Antigravity no incluye esos modelos — el único que funciona en tu cuenta es google-antigravity/gemini-3-flash.
Para usar otros modelos (Claude, Gemini Pro), tendrías que revisar tu plan en Google Antigravity. Si quieres, dejo los subagentes configurados solo con gemini-3-flash que sabemos que funciona.
Eso que te dijeron de “tu plan de Antigravity no incluye esos modelos” no cuadra con el error que estás viendo.
En OpenClaw, el mensaje:
Model "..." is not allowed
significa solo una cosa: el modelo está siendo bloqueado por la allowlist interna (agents.defaults.models) del agente activo.
No es un error de proveedor/plan. Cuando es tema de plan/cuota/permisos, normalmente verías un HTTP 403/401/429 o “model not found” al intentar usarlo, no “not allowed”.
Checklist para arreglarlo (rápido)
- En el mismo chat donde falla, ejecuta:
/model status
/models google-antigravity
- Si en
/models google-antigravityno aparecen opus/sonnet/pro → es allowlist, punto.
- En tu
openclaw.json, asegúrate de tener esos IDs EXACTOS dentro de:
agents.defaults.models(y reinicia gateway o espera hot-reload)
Ejemplo con tus IDs:
agents: {
defaults: {
models: {
"zai/glm-4.7": {},
"google-antigravity/gemini-3-pro": {},
"google-antigravity/claude-opus-4-6-thinking": {},
"google-antigravity/claude-sonnet-4.5": {},
"google-antigravity/claude-code-4.6": {},
"google-antigravity/gemini-3-flash": {}
}
}
}
- Si aun así te sale “not allowed”, entonces no estás editando el config que está usando ese gateway/ese agente (muy común con multi-agent o config duplicado). Para confirmarlo en la máquina del gateway:
openclaw config get agents.defaults.models
Nota: “solo como subagentes”
OpenClaw no tiene un “solo permitido en subagents” como política separada; la allowlist aplica al agente. Lo que haces en la práctica es:
- GLM como main (
primary) - subagents con override a
google-antigravity/...(ya permitido)
Si pegas el output de /model status (solo esas líneas) te digo exactamente si estás en el agente/config correcto o si hay un allowlist distinto en juego.
[openclaw] Current: zai/glm-4.7
Default: openai-codex/gpt-5.3-codex
Agent: coding
Auth file: .openclaw\agents\coding\agent\auth-profiles.json
[google-antigravity] endpoint: default auth: google-antigravity:xxxxxxx@gmail.com=OAuth (xxxxxxx@gmail.com) (next, lastGood, expired) (auth-profiles.json: .openclaw\agents\coding\agent\auth-profiles.json)
• google-antigravity/gemini-3-flash (ag-g3f)
• google-antigravity/gemini-3-pro (ag-g3p)
• google-antigravity/claude-opus-4-6-thinking (ag-opus)
• google-antigravity/claude-sonnet-4.5 (ag-sonnet)
• google-antigravity/claude-code-4.6 (ag-code)
[openai-codex] endpoint: default auth: openai-codex:default=OAuth (next, lastGood, exp 10d) (auth-profiles.json: .openclaw\agents\coding\agent\auth-profiles.json)
• openai-codex/gpt-5.3-codex
[zai] endpoint: default auth: zai:default=xxxxxxxxx (next, lastGood) (auth-profiles.json: \emili.openclaw\agents\coding\agent\auth-profiles.json)
• zai/glm-4.7 (glm)
Perfecto: ese /model status demuestra que sí los tienes disponibles y además ya están en la allowlist (porque aparecen listados bajo [google-antigravity] con alias ag-opus/ag-sonnet/ag-code).
Así que, a partir de ese estado, ya NO debería salirte el error “Model … is not allowed” para esos IDs en ese agente (Agent: coding).
Por qué te salió “not allowed” antes entonces
Casi seguro fue una de estas:
- estabas en otro agente (no
coding) o en otra conversación/ruta, con otra allowlist - el gateway aún no había recargado esa allowlist en ese momento (o estabas viendo un estado viejo)
Si vuelve a pasar, lo que manda es el Agent: que te muestra /model status.
“Recuerda que todos ellos deben ser subagentes”
Eso se hace así:
Opción 1 (recomendada): subagente con modelo explícito (usa los alias)
Mantén el main en GLM (Current: zai/glm-4.7) y cuando quieras un especialista, pídeselo en el prompt:
- “Haz UI/UX en un subagente usando ag-opus”
- “Haz coding en un subagente usando ag-code”
- “Investiga X en un subagente usando ag-g3p”
Luego controlas con:
/subagents list
Opción 2: poner un modelo por defecto para subagentes (sin tocar el main)
En config (para ese agente), añade:
agents: {
defaults: {
subagents: { model: "ag-g3f", maxConcurrent: 1 }
}
}
Eso hace que, si no especificas modelo al spawnear, los subagentes usen ag-g3f por defecto, mientras el main sigue en GLM.
Nota importante de tu status
Veo:
Current: zai/glm-4.7Default: openai-codex/gpt-5.3-codex
Eso significa que tu agente “coding” tiene Codex como default configurado, pero en esta sesión lo tienes “pineado” a GLM con /model. Si quieres que GLM sea el default “de fábrica” (sin tener que hacer /model glm cada vez), hay que cambiar el agents...model.primary de ese agente.
Si me dices si quieres Codex default o GLM default para el agente coding, te paso el snippet exacto para dejarlo como quieres.
dice subagents none for this session, sera este el problema?
No — “subagents: none for this session” solo significa que ahora mismo no hay ningún sub‑agent corriendo (lista vacía). No es un error, y no bloquea nada.
Lo importante es: /model no crea subagents. /model solo cambia el modelo de tu sesión actual.
Cómo hacer que esos modelos se usen como sub‑agentes (sin cambiar GLM)
En el chat con tu bot, pídele explícitamente algo así (tal cual):
“Usa un sub‑agent con el modelo
ag-opuspara hacer el UI/UX. No cambies el modelo actual. Cuando termine, integra el resultado y sigue.”
Luego mira:
/subagents list
Ahí ya debería aparecer el sub-agent mientras corre, y cuando termine te llega el “announce” al chat.
Si le pides sub-agent y aun así no aparece ninguno
Entonces hay dos sospechosos:
- el bot no está intentando spawnear subagents (no se lo pediste explícito), o
- tienes una política de tools que bloquea
sessions_spawn.
Si te pasa, dime qué te contesta el bot cuando le pides “usa un sub-agent con ag-opus…”, y lo ajustamos.
contesta esto [openclaw] Entendido. Voy a lanzar un sub-agent con el modelo disponible (google-antigravity/gemini-3-flash) para hacer el test ligero que responda "OK opus".
[openclaw] Test lanzado con el modelo disponible (gemini-3-flash). Esperando resultado para integrar.
Test completado: el sub-agent respondió OK opus correctamente. Seguimos con los subagentes operativos usando el modelo disponible (gemini-3-flash).
Eso confirma que no está usando Opus, está usando gemini-3-flash y “OK opus” es solo el texto que devolvió (o que el main dijo que devolvió). No es prueba de que el sub‑agent corrió con Opus.
Y sí: si tú quieres que “Opus/Sonnet/Pro sean solo subagentes”, entonces tienes que forzar el modelo del subagent (no con /model, sino en el spawn).
Cómo comprobarlo y forzarlo (sin adivinar)
- Activa debug de tools en ese chat:
/verbose on
- Pídele esto (tal cual, importante la parte “NO hagas fallback”):
“Lanza un sub-agent usando model =
google-antigravity/claude-opus-4-6-thinking(aliasag-opus).
No uses gemini-3-flash como fallback.
Si no puedes usar ese modelo, devuélveme el error exacto.”
- En cuanto lo mande, ejecuta:
/subagents list
y luego:
/subagents info <id>
Ahí deberías ver el modelo real que usó.
Si vuelve a “caer” a gemini-3-flash
Entonces pasó una de estas dos:
- El bot no está pasando el override (aunque tú lo pidas). Con
/verbose onlo verás porque aparecerá el tool call desessions_spawny si el campomodelno va, ya sabemos por qué. - El override se intenta pero falla en runtime (403/404/timeout) y el bot decide “usar el que funciona”. En ese caso, tu instrucción de “no fallback” debería hacer que se pare y te muestre el error.
Tu /model status ya demuestra que no es “plan de Google” ni “no existe el modelo”: aparecen listados. Ahora falta verificar si el spawn realmente está usando ese model o si está cayendo por otro motivo.
Haz esos 3 pasos y pégame lo que salga (especialmente lo que muestre /subagents info y cualquier mensaje extra que aparezca con /verbose on).
deberia correr un momento mi openclaw con antigravity oauth opus 4.5 4.6 gemini 3 pro o alguno de los que no detecta y pedirle desde alli que lo arregle? ya que asi yo no tengo problema de que sea una restriccion de mi cuenta
No hace falta montarte otro openclaw onboard solo para “probar que tu cuenta no tiene restricción”. Es overkill y encima te arriesgas a que el wizard te reescriba defaults/allowlists y te mezcle más las cosas.
Lo más limpio es hacer un test directo con el modelo Antigravity que quieres (en el mismo agente) y así descartas “plan/cuenta” en 30s:
Test A (descarta restricción de cuenta)
En el mismo chat donde estás (tu /model status ya mostró Agent: coding), haz:
- Cambia temporalmente el modelo de la sesión al Claude de Antigravity:
/model google-antigravity/claude-opus-4-6-thinking
- Envía un prompt mínimo:
“Responde solo
OK.”
- Si responde OK → tu cuenta sí puede usar ese modelo. El problema es cómo estás spawneando subagents (no estás pasando el override, o se está ignorando).
- Si falla → verás un error real del proveedor (401/403/404/429/timeout). Ahí sí hablaríamos de acceso/rate-limit/model-id.
Luego vuelves al main:
/model zai/glm-4.7
Test B (verifica que de verdad lo usa como sub-agent)
- Activa:
/verbose on
- Pídele explícito:
“Lanza un sub-agent usando el modelo
google-antigravity/claude-opus-4-6-thinkingy que en su respuesta incluya la líneaMODEL_USED: <provider/model>.”
- Mira:
/subagents list
/subagents info <id>
Si aun así “cae” a gemini-3-flash, entonces el main no está pasando el override (y con /verbose on lo vamos a ver claro).
Si quieres, pega aquí lo que te sale en /verbose on cuando “lanza el sub-agent” (la línea del tool call/resultado), y te digo exactamente por qué está eligiendo flash en vez de opus.
vale, lo hice desde openclaw config todo esto mejor, ahora bien, como lo inicio para no perder esa config, desde openclaw onboard?
No — no uses openclaw onboard para “iniciar” si ya dejaste todo bien con openclaw config. onboard es un wizard de configuración y puede re-tocar defaults.
Para arrancar sin perder nada, lo correcto es arrancar/reiniciar el Gateway, que lee tu config de:
- Windows:
C:\Users\<tu-usuario>\.openclaw\openclaw.json(eso es~/.openclaw/openclaw.json)
Si lo corres en primer plano (terminal)
openclaw gateway
# (alias: openclaw gateway run)
Si lo tienes instalado como “servicio” (lo recomendado)
openclaw gateway restart
# o: openclaw gateway start
Si NO lo tienes instalado como servicio aún
openclaw gateway install
openclaw gateway start
Para verificar que está usando TU config
openclaw gateway status
openclaw config get gateway.port
openclaw config get agents.defaults.model
Si ves que gateway status muestra “Config (cli)” vs “Config (service)” distintos, corre:
openclaw doctor
(eso suele arreglar desajustes del servicio apuntando a otra config/instalación).
como ya he cargado los modelos que necesito desde config, ahora necesito que me digas un prompt para decirle a mi openclaw que los configure a todos como subagentes con alias simple
Copia/pega este prompt en tu OpenClaw (en el chat donde está el Agent: coding). Está escrito para que no cambie el main (GLM) y deje todo lo demás “listo para sub‑agents” con aliases cortos.
Prompt (pégalo tal cual)
Quiero un setup “GLM main + subagents specialists”.
Objetivo:
- El modelo principal (main/orquestador) debe quedarse en
zai/glm-4.7. - NO uses
/modelpara cambiar el main salvo que yo lo pida. - Todos estos modelos deben usarse solo como sub-agents cuando yo pida un sub-agent (o cuando tú decidas delegar una tarea):
google-antigravity/claude-opus-4-6-thinkinggoogle-antigravity/claude-sonnet-4.5google-antigravity/claude-code-4.6google-antigravity/gemini-3-progoogle-antigravity/gemini-3-flash
openai-codex/gpt-5.3-codex
Config a aplicar:
- Asegura que estos modelos están permitidos en la allowlist (
agents.defaults.models) y crea aliases simples:
glm→zai/glm-4.7codex→openai-codex/gpt-5.3-codexopus→google-antigravity/claude-opus-4-6-thinkingsonnet→google-antigravity/claude-sonnet-4.5ccode→google-antigravity/claude-code-4.6g3p→google-antigravity/gemini-3-prog3f→google-antigravity/gemini-3-flash
- Configura el default de sub-agents:
agents.defaults.subagents.model = "g3f"agents.defaults.subagents.maxConcurrent = 1
Importante:
- Si
/configestá habilitado (commands.config: true), aplica los cambios con/config set .... - Si
/configNO está habilitado, NO inventes nada: respóndeme con el bloque JSON5 exacto que debo pegar enopenclaw.json(solo la parteagents.defaults) y los comandosopenclaw config set ...equivalentes.
Verificación:
- Al final, muéstrame
/model statusy confirma que el main sigue enzai/glm-4.7y que los aliases anteriores aparecen listados. - Luego ejecuta un sub-agent de prueba con el modelo
opusy que respondaMODEL_USED: <provider/model>.
Si quieres, te doy también la versión “sin riesgo de colisiones” (con prefijos ag-opus/ag-sonnet/...) por si más adelante quieres usar anthropic/claude-opus-* sin confusiones.
actualizalo a todos estos modelso disponibles
[openclaw] Models (ollama) — showing 1-5 of 5 (page 1/1)
- ollama/kimi-k2.5:cloud
- ollama/minimax-m2.1:cloud
- ollama/ministral-3:14b
- ollama/qwen3-coder:480b-cloud
- ollama/qwen3-next:80b-cloud
Models (google-antigravity)
- google-antigravity/claude-opus-4-5-thinking
- google-antigravity/claude-sonnet-4-5
- google-antigravity/gemini-3-flash
- google-antigravity/gemini-3-pro-high
Models (openai-codex) — showing 1-1 of 1 (page 1/1)
- openai-codex/gpt-5.3-codex
[openclaw] Models (zai) — showing 1-1 of 1 (page 1/1)
- zai/glm-4.7
Recuerda que zai glm 4.7 es el principal, todo el resto seran siempre los subagentes
Pega este prompt actualizado (con todos tus modelos reales) para que tu bot los deje con aliases simples y con la regla GLM main / todo lo demás sub‑agents.
Prompt (copy/paste)
Quiero un setup “GLM main + subagents specialists”.
Reglas (MANDATORIO)
- El modelo principal/orquestador SIEMPRE es:
zai/glm-4.7(aliasglm). - Nunca cambies el modelo del main con
/modelsalvo que yo lo pida explícitamente. - Todo el resto de modelos se usan siempre como sub‑agents.
Modelos disponibles (usa EXACTAMENTE estos IDs)
Ollama
ollama/kimi-k2.5:cloudollama/minimax-m2.1:cloud
ollama/ministral-3:14bollama/qwen3-coder:480b-cloudollama/qwen3-next:80b-cloud
Google Antigravity
google-antigravity/claude-opus-4-5-thinkinggoogle-antigravity/claude-sonnet-4-5google-antigravity/gemini-3-flashgoogle-antigravity/gemini-3-pro-high
OpenAI Codex
openai-codex/gpt-5.3-codex
zai/glm-4.7
Objetivo de configuración
- Asegura que existe un allowlist completo en
agents.defaults.modelsque incluya TODOS los modelos anteriores (para evitar “Model not allowed”). - Crea aliases simples (exactos):
-
glm→zai/glm-4.7 -
codex→openai-codex/gpt-5.3-codex -
opus→google-antigravity/claude-opus-4-5-thinking -
sonnet→google-antigravity/claude-sonnet-4-5 -
g3f→google-antigravity/gemini-3-flash -
g3p→google-antigravity/gemini-3-pro-high -
kimi→ollama/kimi-k2.5:cloud -
m2→ollama/minimax-m2.1:cloud -
fast→ollama/ministral-3:14b -
qwen480→ollama/qwen3-coder:480b-cloud -
qwen80→ollama/qwen3-next:80b-cloud
- Configura sub-agents:
agents.defaults.subagents.model = "g3f"agents.defaults.subagents.maxConcurrent = 1
Cómo aplicarlo
- Si
/configestá habilitado (commands.config: true), aplica cambios persistentes con/config set .... - Si
/configNO está habilitado, devuélveme el bloque JSON5 exacto que debo pegar enopenclaw.json(soloagents.defaults) y, si aplica, los comandosopenclaw config set ...equivalentes.
Verificación final
- Muéstrame
/model statusy confirma que el main sigue enzai/glm-4.7. - Lanza un sub-agent de prueba con el modelo
opusy que responda exactamente:
MODEL_USED: <provider/model>
Nota rápida: si tu bot insiste en “no puedo saber el modelo real usado”, pídele que en el sub-agent mencione explícitamente el provider/model en la primera línea de su respuesta (eso nos sirve como prueba práctica).
esto dice el test [openclaw] 🧑🔧 Sub-agent: label test-opus-model-used · task Responde exactamente: MODEL_USED: google-antigravity/claude-opus-4-5-thinking · agent frontend · model google-antigravity/claude-opus-4-5-thinking · timeout 60 · cleanup delete
ahora necesito apagar el verbose
Para apagarlo en ese chat, envía:
/verbose off
(Atajo: /v off)
Si quieres comprobar el estado actual antes/después:
/verbose
glm → zai/glm-4.7
codex → openai-codex/gpt-5.3-codex
opus → google-antigravity/claude-opus-4-5-thinking
sonnet → google-antigravity/claude-sonnet-4-5
g3f → google-antigravity/gemini-3-flash
g3p → google-antigravity/gemini-3-pro-high
kimi → ollama/kimi-k2.5:cloud
m2 → ollama/minimax-m2.1:cloud
fast → ollama/ministral-3:14b
qwen480 → ollama/qwen3-coder:480b-cloud
qwen80 → ollama/qwen3-next:80b-cloud
teniendo en cuenta estas categorias de subagentes , y los modelos disponibles que son los de arriba, reordena con los modelos mas apropiados de mas a menos con fallbacks (GLM 4.7 debe estar siempre al final del fallback)
añade algun otro subagente para areas que pueden cubrir (redes sociales, marketing, chief officer y alguna buena que se te ocurra para tener el openclaw con subagentes mas completo y segmentado)
coding
- Modelo usado: openai-codex/gpt-5.3-codex
frontend
- Modelo usado: google-antigravity/gemini-3-flash
data-analysis
- Modelo usado: google-antigravity/gemini-3-flash
vision
- Modelo usado: google-antigravity/gemini-3-flash
navigation
- Modelo usado: google-antigravity/gemini-3-flash
Vale. Importante primero: OpenClaw no tiene “subagentes por categorías” en config como tal. En config solo puedes definir:
- 1 modelo por defecto para subagents:
agents.defaults.subagents.model - y en cada spawn (cuando pides el sub‑agent) elegir el modelo/alias que quieras.
Lo que sí puedes hacer es darle al GLM una “política de dispatch”: para cada categoría, intenta un modelo; si falla, prueba el siguiente; y GLM siempre al final como último recurso.
Abajo tienes un orden de más apropiado → menos (con fallbacks). Úsalo como “regla” para tu orquestador.
Reglas generales (recomendadas)
- Main/orquestador:
glm(=zai/glm-4.7) siempre. - Default subagent (cuando no especifiques):
g3f(rápido y barato). - Fallbacks aquí = solo si el modelo falla (timeout / 401/403/429 / tool-json roto). No como “elige el mejor para todo”.
Categorías de subagentes (primary → fallbacks → … → glm al final)
1) Coding / implementación (code + refactor + debugging)
codexqwen480sonnetopusg3pm2fastg3fglm(si todo falla)
2) Arquitectura / planificación técnica (decisiones, tradeoffs, PRDs técnicos)
opussonnetg3p
codexqwen80m2g3ffastglm
3) UI/UX + producto (flows, pantallas, copy de UI, heurísticas)
opusg3psonnetkimiqwen80m2g3ffastglm
4) Research / análisis (resúmenes, comparativas, estrategia)
g3popussonnetkimiqwen80m2g3ffastglm
5) Social media / contenido corto (posts, hooks, hilos, captions)
kimig3fg3popussonnet
qwen80m2fastglm
6) Marketing / copy largo (landing, emails, ads, funnels, posicionamiento)
kimiopusg3psonnetqwen80m2g3ffastglm
7) “Chief of Staff / CEO brain” (prioridades, roadmap, decisiones, reuniones)
opusg3psonnetkimim2g3ffastglm
8) Triage / respuestas rápidas (cuando quieres velocidad)
g3ffastm2sonnetg3popusglm
Prompt para que GLM aplique esto (dispatcher “militar”)
Pega esto en tu chat con GLM:
“A partir de ahora, usa subagentes por categoría.
Para cada categoría, usa el modelo primary; si falla (error/timeout/rate-limit/tool-json), reintenta automáticamente con el siguiente fallback.
Manténglmcomo orquestador y como último fallback.
Cuando lances un subagent, incluye en el label la categoría (ej:marketing-copy,coding-impl) y el modelo elegido.
Al devolver el resultado, dime qué modelo se usó realmente.”
Si quieres, te lo convierto en un bloque súper concreto para tu SOUL.md/PROJECT.md (“Dispatch Rules”) para que se mantenga estable y no tengas que repetirlo cada vez.
Perfecto — con tus categorías actuales (coding, frontend, data-analysis, vision, navigation) y tus modelos disponibles (los aliases que definiste), aquí tienes el orden recomendado (mejor → peor) para cada categoría, con glm siempre al final.
Nota: esto no es “config nativa por categoría”; es una tabla de dispatch para que tu GLM la siga al spawnear sub‑agents. Si el modelo elegido falla (timeout/429/403/tool-json), prueba el siguiente.
1) coding (implementación, refactor, debugging)
codex → qwen480 → sonnet → opus → g3p → qwen80 → m2 → fast → g3f → glm
codexprimero (mejor para código).qwen480como “brute force” si quieres local/ollama potente.sonnet/opussi hay mucho diseño + código.glmsiempre último.
2) frontend (UI/UX + componentes + copy UI)
sonnet → opus → g3p → kimi → g3f → qwen80 → m2 → fast → glm
sonnetsuele ser el más “equilibrado” para frontend.opussi quieres más calidad/pensamiento.g3psi quieres buena estructura/planes.kimipara copy/UX writing y propuestas.
3) data-analysis (análisis, métricas, hipótesis, tablas, reporting)
g3p → opus → sonnet → kimi → m2 → g3f → fast → glm
g3parriba para análisis/estructura.opus/sonnetpara reasoning fuerte.m2como alternativa local si va fino.g3fsi solo quieres velocidad.
4) vision (cuando haya imágenes / interpretación visual)
g3p → g3f → opus → sonnet → glm
- Quédate con Gemini arriba para visión (por consistencia multimodal).
- Aquí no metería Ollama a menos que sepas que tu modelo local es vision-capable y tool-capable en OpenClaw.
5) navigation (browser/web tasks, pasos, automatización web)
sonnet → opus → g3p → g3f → codex → glm
- Para navegación con herramientas/browser, normalmente van mejor modelos “fuertes” en tool-calling.
codexlo dejo más abajo: a veces ayuda en scraping/automatización, pero no es “navegación” por defecto.
Nuevos sub‑agentes “completos” (para que tu setup quede redondo)
social (posts cortos, hooks, hilos, captions)
kimi → g3f → g3p → opus → sonnet → glm
marketing (landing, emails, ads, funnels, posicionamiento)
kimi → opus → g3p → sonnet → g3f → glm
chief-of-staff / COO (prioridades, roadmap, planes semanales, SOPs)
opus → g3p → sonnet → kimi → glm
research (comparativas, resúmenes, decisiones informadas)
g3p → opus → sonnet → kimi → g3f → glm
ops/devops (logs, despliegues, docker, scripts)
codex → sonnet → opus → qwen480 → g3p → glm
Prompt corto para que GLM aplique la tabla (dispatcher)
Pégale esto a tu main (GLM):
“A partir de ahora, para cada tarea elige un sub‑agent según la categoría: coding/frontend/data-analysis/vision/navigation/social/marketing/chief-of-staff/research/ops.
Usa el orden de modelos (fallback chain) que te di. Si el modelo falla por error/timeout/rate-limit/tool-json, reintenta con el siguiente. GLM (glm) siempre al final.
En cada sub-agent pon en el label:<categoria>·<alias>y al devolver resultado incluyeMODEL_USED:con el provider/model.”
Si me dices qué entiendes tú por “navigation” (¿browser tool? ¿búsqueda web? ¿pasos manuales?), te lo afino aún más para tu caso.
puedo decirle... "quiero usar el subagente "codex" hasta terminar el resto de la instalacion y que asi se active codex hasta que le diga que hemos terminado?
Sí — pero con una matización importante:
- Puedes decirle “usa Codex como sub‑agent para todo lo técnico hasta nuevo aviso”, y el main (GLM) irá spawneando subagents en
codex. - Lo que no existe como “modo global” automático es “a partir de ahora todo se ejecuta dentro de un subagent y se queda enganchado ahí” (los subagents son runs puntuales). Pero puedes simularlo con una regla persistente en la conversación.
Prompt recomendado (copy/paste)
Pégale esto a tu bot:
Desde ahora y hasta que yo diga “FIN CODEX”, cualquier tarea de instalación/CLI/config/logs/errores la debes ejecutar con un sub‑agent usando el modelo
codex(openai-codex/gpt-5.3-codex).
Manténglmcomo orquestador y solo integra los resultados.
Si Codex falla (timeout/rate-limit), usa el fallbacksonnet, luegoopus, y glm al final.
Antes de lanzar cada subagent, pon en el label:install·codex.
Al devolver el resultado, incluye una primera línea:MODEL_USED: <provider/model>.
Cuando yo diga “FIN CODEX”, vuelves a tu dispatch normal por categorías.
Para comprobar que está cumpliendo
- Activa un rato:
/verbose on
y verás el tool call del subagent con model openai-codex/gpt-5.3-codex.
- Luego lo apagas:
/verbose off
Si quieres algo todavía más “a prueba de fallos”, dile que no ejecute pasos hasta que el sub-agent Codex haya devuelto un plan en bullets, y que tú confirmes.
subagents have "less privileges" than model? cannot they apply changes or install in the own pc?
Sub‑agents don’t have “less privileges because of the model”. Privileges come from your tool policy + sandbox settings, and where the Gateway is running.
What sub‑agents are (in OpenClaw terms)
- A sub‑agent is just an LLM run in a separate session (
agent:<id>:subagent:<uuid>). - By default, sub‑agents:
- can’t use session tools (
sessions_list/sessions_send/...) - can still use normal tools (read/write/exec/browser/etc) unless your config restricts them
- run on the Gateway host (unless you explicitly run tools on a paired node)
- can’t use session tools (
Docs: https://docs.openclaw.ai/tools/subagents
Why it may feel like “less privileges”
One (or more) of these is true in your setup:
- Tool policy restricts sub‑agents
You can restrict sub‑agents separately via:
tools.subagents.tools.allow/tools.subagents.tools.deny(deny wins)
Docs mention this in the config reference: https://docs.openclaw.ai/gateway/configuration
- Sandboxing is on
If your agent is sandboxed (agents.defaults.sandbox/ per-agent sandbox), a sub‑agent may be running with:
workspaceAccess: "ro"or"none"→ can’t write files- limited network → can’t apt/pip/npm install
- no host access → can’t change your PC
- Wrong machine
Even ifexecis allowed, it runs where the Gateway runs.
- If Gateway is on a Pi/VPS, sub‑agents can’t “install on your Windows PC” unless you add a node (paired machine) and run commands on that node.
So: can sub‑agents install/apply changes on your PC?
- Yes, if the Gateway is running on that PC (or you have a paired node for that PC) and
execis allowed and sandbox/tool approvals permit it. - No, if the Gateway is elsewhere and you haven’t set up a node.
Quick way to diagnose
- Run
/model status(you already did) to confirm which Agent is active. - Turn on
/verbose onbriefly, ask for a sub‑agent to run something harmless likepwdorwhoami, and you’ll see whether it even tries to useexec. - If you want, paste your
tools/agents.defaults.sandboxsections (redacted) and I’ll tell you exactly which knob is restricting sub‑agents in your config.
@silk heath esto es extraido de mi openclaw json , pero no veo donde poner my guild id , channel id
},
"discord": {}
},
"gateway": {
"port": xxxxx,
"mode": "local",
"bind": "loopback",
"auth": {
"mode": "token",
"token": "mytokenhere"
},
"tailscale": {
"mode": "off",
"resetOnExit": false
}
},
"skills": {
"install": {
"nodeManager": "npm"
},
"entries": {
"nano-banana-pro": {
Eso va dentro de channels.discord.guilds (y opcionalmente channels.discord.guilds.<guildId>.channels.<channelId>). En tu snippet tienes discord: {} pero todavía no has puesto las reglas del guild/canales.
Dónde van Guild ID y Channel ID (en openclaw.json)
Ejemplo mínimo (allowlist por guild + canal):
{
channels: {
discord: {
enabled: true,
token: "${DISCORD_BOT_TOKEN}", // o pon el token aquí directamente
// IMPORTANTE: si usas allowlist, lo no listado queda bloqueado
groupPolicy: "allowlist",
guilds: {
"TU_GUILD_ID_AQUI": {
requireMention: true, // recomendado en servidores
channels: {
"TU_CHANNEL_ID_AQUI": { allow: true, requireMention: true },
// Puedes permitir más canales:
// "OTRO_CHANNEL_ID": { allow: true, requireMention: false }
}
}
}
}
}
}
Notas clave:
requireMentionno va enchannels.discord.requireMention(ese se ignora). Tiene que ir bajoguildso bajo un canal.- Si
channels.discord.guildsestá presente, usa IDs numéricos (los audits tipochannels status --probesolo verifican IDs, no nombres).
Cómo sacar Guild ID / Channel ID en Discord
- Discord → Settings → Advanced → Developer Mode ON
- Click derecho en el servidor → Copy Server ID
- Click derecho en el canal → Copy Channel ID
Alternativa “no quiero poner IDs ahora”
Puedes abrirlo todo (menos seguro) con:
channels: { discord: { groupPolicy: "open" } }
Pero en un servidor suele ser mejor allowlist + requireMention.
Docs: https://docs.openclaw.ai/channels/discord
Si me dices si quieres permitir todo el guild o solo 2–3 canales, te dejo el bloque exacto para tu caso.
ya lo tengo en discord, pero trato de usar los comandos de mi propio bot y dice You are not authorized to use this command.
Ese mensaje en Discord (“You are not authorized to use this command”) casi siempre significa que el bot sí recibió el comando, pero tu usuario no pasa el chequeo de autorización (allowlists/pairing + commands.useAccessGroups).
Hay 3 cosas típicas a revisar:
1) ¿Qué comando estás usando?
- Si es
/config …: además de estar autorizado, necesitas tener esto en config:
(commands: { config: true }/configestá off por defecto)
2) Asegura que TU usuario está allowlisted (Guild y/o DM)
En Discord, pon tu Discord User ID en:
channels.discord.guilds.<GUILD_ID>.users(para comandos en servidor), y/ochannels.discord.dm.allowFrom(para comandos en DM si usas allowlist)
Ejemplo:
channels: {
discord: {
dm: {
policy: "allowlist",
allowFrom: ["TU_USER_ID"]
},
guilds: {
"TU_GUILD_ID": {
users: ["TU_USER_ID"],
channels: {
"TU_CHANNEL_ID": { allow: true }
}
}
}
}
}
(Para sacar IDs: Discord Developer Mode → right click → Copy ID)
3) Si aun así falla: desactiva el check extra de “access groups” para comandos
Esto suele ser el culpable cuando el bot responde normal pero bloquea comandos:
commands: { useAccessGroups: false }
Luego reinicia:
openclaw gateway restart
Si me dices qué comando exacto te está dando “not authorized” (por ejemplo /model, /config, /subagents) y si lo estás ejecutando en DM o en un canal, te digo cuál de las 3 es la causa y el snippet mínimo exacto para tu caso.
en un canal, es /model list
En canales de Discord, ese “You are not authorized to use this command” casi siempre es porque tu usuario no está allowlisted como “usuario permitido” en ese guild/canal (aunque el bot esté funcionando).
Como estás en un canal (guild), la solución típica es:
1) Asegura que el canal está permitido (allowlist)
En tu openclaw.json:
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
"TU_GUILD_ID": {
channels: {
"TU_CHANNEL_ID": { allow: true }
}
}
}
}
}
2) Allowlist de TU usuario para poder usar comandos en ese canal
Añade tu Discord User ID (no el nombre) a nivel guild o canal:
channels: {
discord: {
guilds: {
"TU_GUILD_ID": {
users: ["TU_USER_ID"], // o dentro del canal:
channels: {
"TU_CHANNEL_ID": {
allow: true,
users: ["TU_USER_ID"]
}
}
}
}
}
}
Luego:
openclaw gateway restart
Cómo sacar IDs
Discord → Settings → Advanced → Developer Mode ON → click derecho:
- Server → Copy Server ID
- Channel → Copy Channel ID
- Tu usuario → Copy User ID
3) Si el comando que falla es /config …
Además necesitas habilitarlo explícitamente:
commands: { config: true }
4) Si sigue bloqueando comandos (caso raro)
Prueba temporalmente:
commands: { useAccessGroups: false }
Dime qué comando exacto te sale “not authorized” en el canal (/model, /subagents, /config, etc.) y si quieres, pégame tu bloque actual channels.discord (redacta el token). Con eso te lo devuelvo ya con tus IDs puestos en el sitio correcto.
cual es el comando para lanzar mejor openclaw si no quiero perder lo que hice en openclaw config
Para no perder nada de lo que hiciste con openclaw config, no tienes que hacer onboard otra vez. Solo tienes que arrancar el Gateway (que lee tu ~/.openclaw/openclaw.json).
Arrancar (foreground)
openclaw gateway
Si lo tienes instalado como servicio (recomendado)
openclaw gateway start
# o si ya estaba corriendo y cambiaste config:
openclaw gateway restart
Si todavía no está instalado como servicio
openclaw gateway install
openclaw gateway start
Y para confirmar que está usando tu config:
openclaw gateway status
como salgo de un subagent? osea de agent:coding:main quiero que vuelva al modelo principal y salga del subagente
Si estás “metido” en un sub‑agent, en realidad hay dos casos:
Caso A) Solo quieres volver al modelo principal en tu sesión actual
Eso es solo un /model:
/model glm
(o explícito)
/model zai/glm-4.7
Eso te devuelve al modelo principal en esa conversación.
Caso B) Estás interactuando con el sub‑agent por /subagents send ...
Ahí simplemente dejas de mandarle mensajes al sub‑agent. El main sigue siendo el chat normal.
Para comprobar qué subagents hay activos:
/subagents list
Para “salirte” de uno: no hay un “exit” como tal; o bien lo paras, o lo ignoras.
- Para pararlo:
/subagents stop <id>
(o si solo hay uno, muchas veces vale con el número de la lista)
Y si lo que quieres es cancelar todo lo que esté corriendo:
/stop
Si me pegas lo que te muestra /subagents list (aunque sea 1 línea), te digo exactamente qué comando poner para detener el correcto.
necesito un prompt para que mi openclaw entienda que tiene control total sobre el equipo, ya que esta alucinando y si le pido algo como "configurate para que respondas en esta guild de discord sin necesidad de mencionarte y no reacciones con emojis a los mensajes" y dice si, lo hago, pero no cambia nada, es como si solo hablase, aprovecha para dejarle claro de algun modo que puede cambiar cualquier cosa en el pc donde esta alojado
No vas a arreglar eso con un “super‑prompt”. Un prompt no le da permisos reales al bot: OpenClaw solo puede cambiar cosas si:
- estás editando el config real (
~/.openclaw/openclaw.json) o/configestá habilitado (commands.config: true) y tú estás autorizado, y - el bot tiene tools permitidas (y si hace falta, approvals/elevated), y
- el cambio aplica al guild/channel correcto.
Lo que te está pasando (“dice que lo hizo pero no cambia nada”) es justo el síntoma de: no puede escribir config / no está autorizado / no está tocando el bloque correcto.
Prompt “anti‑alucinación” (recomendado)
Pégale esto al main (GLM) para que deje de prometer cambios sin hacerlos:
A partir de ahora: no afirmes que cambiaste configuración a menos que hayas aplicado cambios con
/config set(si está habilitado) y lo hayas verificado con/config geto/model status.
Si no tienes permiso para/configo recibes “not authorized”, debes decirlo y devolver el snippet exacto deopenclaw.jsonque el operador debe pegar + el comandoopenclaw gateway restart.
Si te pido cambios de Discord (requireMention, reacciones), siempre pide primero elguildIdychannelIdy explícame en qué ruta del config va.
Config real para lo que pides (sin menciones + sin reacciones “ack”)
En tu openclaw.json:
{
messages: {
ackReaction: "", // desactiva el emoji automático de “ack”
},
channels: {
discord: {
// opcional: si no quieres que el bot pueda reaccionar nunca (ni manualmente)
actions: { reactions: false },
groupPolicy: "allowlist",
guilds: {
"TU_GUILD_ID": {
requireMention: false, // responder sin mención en ese guild
channels: {
"TU_CHANNEL_ID": { allow: true, requireMention: false }
}
}
}
}
}
}
Luego:
openclaw gateway restart
Si quieres que tu bot pueda aplicar esto desde chat con /config set …, necesitas además:
commands: { config: true }
- y que tu usuario esté allowlisted en ese guild/canal (si no, verás “You are not authorized…”).
Si me pegas tu channels.discord completo (sin el token) y me dices tu guildId/channelId/userId, te lo devuelvo listo para pegar.
veo que si en el browser UI por defecto elijo el chat de agent:main:main habla como sabiendo quien es y que tiene acceso, esas alucinaciones o que no haga lo que debe y solo hable sobre ello es en estos casos:
pero si escribia desde whatsapp discord o agent:coding;main o agent:coding:discord:channel:xxxxxxxxxxxxx
Lo que estás viendo es normal y tiene explicación técnica: no es que “alucine” más en WhatsApp/Discord, es que ahí estás en otro agent / otra sesión y (muy probablemente) con otras reglas de permisos / sandbox / comandos.
Por qué en agent:main:main (Control UI) “sí sabe” y en Discord/WhatsApp no
- Sesión distinta ≠ mismos permisos
agent:main:maines la sesión principal del agentmain.agent:coding:discord:channel:...es otro agent (coding) y además una sesión de canal (no “main”).
- Si tienes sandbox en modo
non-main, las sesiones de Discord/WhatsApp pueden quedar aisladas
Si en tu config tienes algo como:
agents: { defaults: { sandbox: { mode: "non-main" } } }
entonces cualquier sesión que no sea la main (por ejemplo un canal de Discord) puede quedar sandboxed y ahí el bot no puede tocar tu host (ni escribir donde crees, ni instalar cosas), aunque “diga que sí”.
- Comandos/config en guild channels requieren autorización
Aunque el bot pueda responder texto,/config set,/model, etc. pueden estar bloqueados si:
commands.configestá apagado, o
- tu user ID no está allowlisted en ese guild/canal, o
commands.useAccessGroupste está filtrando.
Qué hacer (rápido y sin adivinar)
A) Confirma en el canal “problemático” qué agent/sesión estás usando
En el mismo canal de Discord donde falla, ejecuta:
/model status
Mira estas líneas:
Agent: ...Auth file: ...- y el
Current/Default
Si en el canal estás en Agent: coding pero en el UI estás en main, ya encontraste la diferencia.
B) Si quieres “mismos poderes” en Discord que en agent:main:main
Tienes 2 caminos:
Opción 1 (recomendada): Rutea ese Discord channel al agent main
Así Discord usa el mismo workspace/políticas que tu UI “main”.
Se hace con bindings (multi-agent routing). Si quieres, te paso el snippet exacto, pero necesito tu guildId y channelId.
Opción 2 (más peligrosa): dale al agent coding el mismo acceso que el main
Ejemplo típico (ojo: esto aumenta el riesgo en canales públicos):
agents: {
list: [
{
id: "coding",
sandbox: { mode: "off" } // o ajusta workspaceAccess si usas sandbox
}
]
}
Para el ejemplo concreto que diste (sin mention + sin emojis)
Eso no es un prompt, es config:
- Quitar reacciones automáticas:
messages: { ackReaction: "" }
- Responder sin mención en un guild/canal:
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
"TU_GUILD_ID": {
requireMention: false,
channels: {
"TU_CHANNEL_ID": { allow: true, requireMention: false }
}
}
}
}
}
Y luego:
openclaw gateway restart
Si pegas tu bloque agents (y si existe sandbox) + tu bloque channels.discord.guilds (sin token), te digo exactamente cuál de las 3 cosas te está limitando en Discord/WhatsApp y cuál es el cambio mínimo para que deje de “prometer” y realmente aplique cambios.
no se puede desactivar ese sandboxing?
Sí, se puede desactivar.
En OpenClaw el sandbox Docker se controla con:
agents.defaults.sandbox.mode: "off" | "non-main" | "all"
Para desactivarlo completamente ponlo en "off".
Opción 1 (recomendada): por config (persistente)
En tu openclaw.json:
agents: {
defaults: {
sandbox: {
mode: "off"
}
}
}
Luego reinicia el gateway:
openclaw gateway restart
Opción 2: con CLI (más cómodo)
openclaw config set agents.defaults.sandbox.mode "off"
openclaw gateway restart
Y verifica:
openclaw config get agents.defaults.sandbox
Aviso importante (especialmente en Discord/WhatsApp)
Si desactivas sandbox, las sesiones de canales/grupos también pueden acabar con acceso real a tu host (según tu tool policy). Si tu bot está en un guild con más gente, eso puede ser peligroso. Alternativa más segura: dejar mode: "non-main" y rutear solo tu canal/DM “de confianza” al agent que tenga acceso.
es curioso, esto no me habia pasado en otras instalaciones, tiene que ver con la configuracion de subagentes? como puedo perdirle que quiero hablar en agent:main:main tanto por whatsap como por discord?
No es por “subagentes” en sí; es por routing de agente + tipo de chat (DM vs canal/grupo) + sandbox non-main.
1) Por qué agent:main:main “se siente distinto”
agent:main:main es la sesión main (normalmente DMs).
En cambio:
agent:coding:discord:channel:...= canal de Discord → sesión separada por diseño- grupos/canales (Discord guild channels, WhatsApp groups) NO colapsan a
main, para no mezclar contexto/seguridad.
Y si tienes agents.defaults.sandbox.mode: "non-main", entonces todo lo que NO sea main puede quedar sandboxed (menos acceso al host), y ahí el bot “dice que lo hace” pero realmente no puede.
2) “Quiero hablar en agent:main:main desde WhatsApp y Discord”
Esto solo es posible si hablas por DM en ambos:
- WhatsApp DM → normalmente cae en
agent:<agentId>:main(tuagent:main:mainsi el agent esmain) - Discord DM al bot → también cae en
agent:<agentId>:main
En un canal de servidor (guild channel) no vas a conseguir que sea agent:main:main; siempre será agent:...:discord:channel:....
Qué hacer:
- Abre DM con tu bot en Discord (no canal) y manda:
Debe mostrarte/model statusAgent: mainy sesión main. - En WhatsApp, habla en DM y comprueba igual con
/model status.
3) Si tus DMs están yendo al agent coding (y no al main)
Entonces tu config/routing está mandando Discord/WhatsApp a coding. Solución: en config haz que el agent main sea el default o crea un binding para que Discord/WhatsApp vayan a main.
Si me pegas tu bloque agents.list + bindings (sin tokens), te digo exactamente qué línea está ruteando a coding y cómo dejar DMs en main sin romper tu setup.
Como saber el modelo actual que esta corriendo
En el chat, usa:
/model status
Eso te muestra el modelo actual (“Current”), el default y el agente/sesión.
Si solo quieres ver el modelo de forma rápida (sin el detalle), también sirve:
/model
(y te enseña el selector + cuál está activo).
Si yo le pido a mi openclaw con multiples modelos configurados como agentes y en teoria tambien deberian como subagentes (aunque en la carpeta de subagents solo veo un srchivo llamado run) en el de (agents) si que les veo a todos
El caso, si le digo al modelo principal que para hacer una web trabaje en coordinacion con todos los agentes dedicados cada uno a su tarea y que vayan cambiando de uno a otro y cojan entre si lo que van haciendo para aunarlo?
Sí, puedes pedirle al modelo principal que trabaje “en equipo” con varios modelos, pero hay que entender bien qué significa “agentes” vs “sub‑agentes” en OpenClaw y qué limitaciones hay.
1) “Agentes” (agents) vs “sub‑agentes” (subagents)
- Agents (
agents.list): son “cerebros” separados con workspace/sesiones separados. Se usan sobre todo para routing (qué chat va a qué agente). No es un “equipo” automático. - Sub‑agents (
sessions_spawn): son “workers” temporales que el agente principal lanza para tareas concretas. Al terminar, anuncian el resultado de vuelta al chat principal.
Que en la carpeta de subagents solo veas algo como run puede ser normal: los sub‑agents son sesiones efímeras, no una lista de “modelos instalados” en una carpeta.
2) ¿Pueden “cambiar de uno a otro” y “coger entre sí” lo que van haciendo?
Sí, pero no como una mente colmena automática.
El patrón que funciona es:
- El main/orquestador (GLM) define un plan y “contratos” de salida.
- Lanza sub‑agents por especialidad (Codex para código, Opus/Sonnet para UX/arquitectura, etc.).
- Cada sub‑agent devuelve deliverables claros (archivos, listas, snippets).
- El main integra todo en un único resultado (o un único repo/workspace).
Para que “compartan” trabajo de verdad, dales un punto de encuentro:
- un archivo tipo
PROJECT.md/SPEC.md/TODO.mden el workspace - o una carpeta
handoff/donde cada sub‑agent escribe su entrega (handoff/ui.md,handoff/api.md, etc.)
Ojo: si usas agents distintos con workspaces distintos, no “ven” los mismos archivos. Para colaboración real, o los pones en el mismo workspace, o el main copia/pega entre ellos.
3) Prompt listo para usar (equipo de web)
Pega esto al GLM (main). Ajusta nombres si quieres:
Quiero construir una web. Tú eres el orquestador (mantente en
glm).
Trabaja en coordinación con sub‑agentes (NO cambies el modelo del main).Crea una carpeta
handoff/y usa estos sub‑agentes, en este orden (fallback si falla):
- UI/UX:
opus→sonnet→g3p→glm- Frontend implementación:
codex→qwen480→sonnet→glm- Copy/Marketing:
kimi→opus→g3p→glm- QA/Checklist:
sonnet→g3p→glm
Reglas de handoff:
- Cada sub‑agente debe escribir su entrega en
handoff/<area>.md(por ejemplohandoff/ui.md,handoff/frontend.md,handoff/marketing.md,handoff/qa.md).- Cada entrega debe empezar con
MODEL_USED: <provider/model>y luego un resumen + decisiones + próximos pasos.- Cuando todos terminen, integra todo en un único plan y lista de tareas y dime qué archivos se generaron.
4) Para que realmente paralelicen
Si quieres que corran más de uno a la vez, sube:
agents.defaults.subagents.maxConcurrent(por ejemplo 2–3)
Si no, van uno por uno.
Si me dices si estás usando un solo agent (coding) o varios (main, coding, etc.) y si comparten workspace, te digo cuál es la forma más limpia de montar ese “equipo” sin que se pisen ni pierdan contexto.
Cuando en el browser ui se pone a ratos la consola de mensajes como en verde con un triangulo negro que quiere decir?
En el Control UI eso es (casi seguro) el indicador de “compaction” del contexto.
Cuando una sesión se acerca al límite de contexto, OpenClaw hace una auto‑compaction: resume/compacta parte del historial para poder seguir trabajando sin pasarse de la ventana de contexto. El UI lo muestra así:
- Banner/“console” azul:
Compacting context…(está compactando) - Banner verde:
Context compacted(compactación terminada, estado “success”) - El “triangulito” negro que ves suele ser simplemente el icono/marker que acompaña ese estado en tu navegador/UI (no es un warning).
No es un error; es “housekeeping”. Si notas que justo después el agente “olvida” algo, es porque esa compactación reemplaza parte del historial por un resumen.
Si puedes, pega una captura de esa zona (dónde exactamente aparece el triángulo) y te confirmo al 100% si es el banner de compaction u otro elemento (por ejemplo un <details> colapsable en otra parte del UI).
Estos son todos mis subagents : ceo, coding, data analysis, frontend, main, marketing, navigation, ops, social, triage, vision.
Perfecto — lo que listaste (ceo, coding, data analysis, frontend, main, marketing, navigation, ops, social, triage, vision) no son “sub‑agents” en sí, sino agentIds (multi‑agent). Los sub‑agents son las ejecuciones aisladas que se lanzan con sessions_spawn, y pueden correr “bajo” cualquiera de esos agentId si lo permites.
1) Para que el orquestador pueda “spawnear” bajo otros agentIds
Por defecto, sessions_spawn(agentId=...) sólo permite spawnear bajo el mismo agentId. En el agent orquestador (el que recibe Discord/WhatsApp) añade:
agents: {
list: [
{
id: "triage", // o "main"/"ceo", el que uses de orquestador
subagents: {
allowAgents: ["*"], // permite spawnear bajo cualquiera de tus agentIds
},
},
],
}
(Doc: agents.list[].subagents.allowAgents)
2) “handoff/<area>.md” y el tema del workspace (esto decide si se pisan o no)
Cada sub-agent escribe archivos en el workspace del agentId bajo el que corre.
Tienes dos estrategias limpias:
A) Workspace compartido (recomendado si quieres handoff por archivos en un único sitio)
- Configuras todos esos agentes con el mismo
workspace. - Entonces todos escriben a
handoff/*.mden el mismo árbol, sin líos. - Para no pisarse: archivo por agente (
handoff/frontend.md,handoff/marketing.md, etc.) como ya propusiste.
B) Workspaces separados (más aislamiento)
- Cada agentId tiene su workspace (por defecto suele ser
~/.openclaw/workspace-<agentId>). - Cada uno tendría su propio
handoff/…en su workspace, y el orquestador no “ve” esos archivos directamente. - En ese caso, lo robusto es que el sub-agent anuncie el contenido (announce), y el orquestador sea el que escriba el “handoff final” consolidado en su workspace.
Si me dices cuál prefieres (A o B), te doy el snippet exacto para tu caso.
3) Para paralelizar “de verdad” (concurrencia)
Hay dos límites a vigilar:
- Sub-agents:
agents.defaults.subagents.maxConcurrent(lanesubagent) - Concurrencia global de runs:
agents.defaults.maxConcurrent(default 1)
Ejemplo típico:
agents: {
defaults: {
maxConcurrent: 3,
subagents: {
maxConcurrent: 3,
},
},
}
Luego pruebas desde Discord con 2–3 spawns y miras /subagents list para confirmar que están “running” a la vez.
4) Pregunta rápida para darte “la forma más limpia” sin pisarse
¿Ahora mismo tus agentes comparten workspace o cada uno tiene el suyo por defecto?
Si no lo tienes claro, pégame tu bloque agents: { ... } (o al menos agents.defaults.workspace y agents.list[] con id/workspace) y te digo exactamente cómo dejarlo “equipo” con handoffs + paralelismo.
Quiero el A, cada uno tiene un workspace con el nombre del agent en cuestion ahora mismo
Vale — entonces quieres A (workspace compartido).
Ahora mismo cada agentId tiene su workspace propio (tipo workspace-frontend, workspace-marketing, etc.). Para pasar a A, la idea es: todos los agents apuntan al mismo workspace, así cualquier sub‑agent (corra bajo el agentId que sea) puede escribir en handoff/*.md en el mismo sitio.
1) Config: un único workspace para todos
Elige una ruta común (ej: ~/.openclaw/workspace-team) y ponla:
- En
agents.defaults.workspace - Y quita (o iguala) cualquier
agents.list[].workspaceque tengas hoy distinto
Ejemplo (JSON5):
{
agents: {
defaults: {
workspace: "~/.openclaw/workspace-team",
// (opcional) para paralelismo
maxConcurrent: 3,
subagents: { maxConcurrent: 3 },
},
list: [
{ id: "ceo" },
{ id: "coding" },
{ id: "data analysis" },
{ id: "frontend" },
{ id: "main" },
{ id: "marketing" },
{ id: "navigation" },
{ id: "ops" },
{ id: "social" },
{ id: "triage",
subagents: { allowAgents: ["*"] } // para poder spawn a otros agentIds
},
{ id: "vision" },
],
},
}
Notas:
- Si ya tienes
workspacedentro de cada entry, también vale hacer “search/replace” y poner la misma ruta en todos. allowAgents: ["*"]ponlo en el agent que orquesta (el que recibe el chat donde lanzassessions_spawn). Si tu orquestador no estriage, muévelo a ese.
2) Importante: sandbox y escritura de archivos
Si tienes sandbox activado con workspaceAccess: "none" o "ro", los write/edit no van a caer en el workspace real como esperas (o ni siquiera podrán escribir).
Para el flujo de “handoff por archivos” necesitas:
- sandbox off, o
workspaceAccess: "rw"para esos agents/subagents.
Si me pegas tu bloque agents.defaults.sandbox (o me dices si lo tienes en non-main/all), te digo el ajuste mínimo sin abrir demasiado.
3) Reinicia y verifica
Tras cambiar config: reinicia el gateway y prueba:
- lanzar 2 sub‑agents en paralelo y que escriban
handoff/frontend.md/handoff/marketing.md - luego comprueba que ambos archivos aparecen dentro de
~/.openclaw/workspace-team/handoff/
Si me dices qué agentId estás usando como “orquestador” en Discord (por ejemplo si el sessionKey empieza por agent:coding:discord:...), te dejo el snippet exacto (incluyendo allowAgents en el sitio correcto).
Y como hago para que agent:main:main vaya a través de la guild de discord donde ests mi openclaw
No se puede “hacer que un canal de guild use el sessionKey agent:main:main”.
En OpenClaw el sessionKey se decide por el tipo de chat:
- DMs ⇒ colapsan al “main session” del agente:
agent:<agentId>:main(por defectoagent:main:main) - Guild channels ⇒ siempre quedan aislados:
agent:<agentId>:discord:channel:<channelId>
(esto está así por diseño para no mezclar contexto de un servidor/canal con tus DMs).
Fuente: docs Discord + Channel Routing (“Direct chats collapse…; guild channels stay isolated…”).
Lo más cercano a lo que quieres (práctico)
Ruta todo ese canal (o toda la guild) al agentId: "main", para que use el mismo agente/config/workspace, pero aceptar que el sessionKey seguirá siendo agent:main:discord:channel:....
Ejemplos con bindings:
Solo 1 canal → agent main
{
bindings: [
{ match: { channel: "discord", peer: { kind: "channel", id: "1469912067946451089" } }, agentId: "main" },
],
}
Toda la guild → agent main
{
bindings: [
{ match: { channel: "discord", guildId: "TU_GUILD_ID" }, agentId: "main" },
],
}
Si lo que quieres es literalmente “usar agent:main:main desde Discord”
Entonces la única forma es hablar por DM al bot (eso sí cae en agent:main:main). En un canal de servidor no.
Si me pasas tu guildId y el channelId donde lo quieres, te digo cuál de los dos bindings te conviene (canal vs guild) y dónde ponerlo junto con tu allowlist.
@silk heath
How to stop openclaw bot?
If you mean stop the bot completely (stop the Gateway):
- If you started it in a terminal (foreground): press Ctrl+C in that terminal.
- If you installed it as a background service/daemon:
(thenopenclaw gateway status openclaw gateway stopopenclaw gateway statusagain to confirm)
If you only mean stop it from replying on Discord (but keep OpenClaw running), set in config:
{ channels: { discord: { enabled: false } } }
…and restart the gateway.
If you tell me how you launched it (foreground terminal vs openclaw gateway start service vs Docker/PM2), I’ll give the exact command for your setup.
@silk heath how to start then?
To start OpenClaw again (the Gateway):
If you run it in the foreground (good for debugging)
openclaw gateway
Leave that terminal open.
If you installed it as a background service
openclaw gateway start
openclaw gateway status
Restart (common when you changed config)
openclaw gateway restart
If you paste:
openclaw --version
openclaw gateway status
I can tell which mode you’re in and what command is the right one for your machine.
realmente haciendo opneclaw config y seleccionando los modelos de ollama, teniendo ollama instalado (los de la nube y uno local) ya estan configurados y en funcionamiento?
Depende de 2 cosas. “Seleccionarlos en openclaw config” deja la config lista, pero no garantiza que Ollama esté accesible desde el Gateway ni que los modelos estén realmente disponibles.
Qué sí hace openclaw config
- Registra el provider
ollama(apiKey/baseUrl si aplica) y/o la lista de modelos/aliases. - O sea: OpenClaw “sabe” que existen.
Qué tiene que ser cierto para que estén “en funcionamiento”
A) Ollama accesible desde donde corre el Gateway
- Si OpenClaw (Gateway) y Ollama están en la misma máquina, normalmente OK.
- Si uno está en WSL y el otro en Windows, o en otra máquina, entonces necesitas que el Gateway pueda llegar a Ollama por red y quizá configurar
models.providers.ollama.baseUrl.
B) El modelo realmente disponible en Ollama
- Para modelos locales: tienes que haber hecho
ollama pull ...y tenerollama servecorriendo. - Para modelos cloud: mientras tu Ollama los liste y puedas usarlos con
ollama run ..., para OpenClaw es “uno más” (OpenClaw sólo habla con el servidor Ollama).
Cómo verificarlo rápido (sin adivinar)
En la máquina donde corre el Gateway:
- Ver Ollama:
ollama list
- Ver OpenClaw detectando/probando Ollama:
openclaw models status --probe --probe-provider ollama
openclaw models list | rg '^ollama/'
- Prueba real en chat:
- En Discord, haz
/model ollama/<tu-modelo>y pregúntale algo simple, o lanza un sub-agent con ese modelo.
Nota importante
Si al “seleccionar modelos” creaste un models.providers.ollama explícito, se suele desactivar el auto-discovery: si luego añades modelos nuevos en Ollama, no aparecen solos en OpenClaw (tienes que agregarlos también en config).
Si me dices dónde corre el Gateway (Windows nativo / WSL / Linux) y dónde corre Ollama, te digo el baseUrl exacto que deberías poner (cuando no es el default).
parece que esto da error, puedes ayudarme a "despertar" ollama, ya que en openclaw ya lo tenemos preconfigurado? tenia abierto el programa de ollama como tal, no en el terminal sino el programa, igual no deberia,
Sí, tener la app de Ollama abierta puede ser suficiente… pero sólo si el Gateway de OpenClaw puede llegar al servidor HTTP de Ollama (puerto 11434) desde la misma máquina/red donde corre OpenClaw.
“Despertar Ollama” = asegurarte de que Ollama está sirviendo la API.
1) Primero: comprueba si Ollama responde (EN LA MÁQUINA DONDE CORRE EL GATEWAY)
Ejecuta esto en la misma terminal/host donde corre openclaw gateway:
curl http://127.0.0.1:11434/api/tags
- Si responde con JSON → Ollama está “despierto”.
- Si da
connection refused/ timeout → Ollama no está corriendo ahí (o no escucha en ese IP/puerto).
2) Si falla: arráncalo explícitamente
En esa misma máquina:
ollama serve
(En algunos setups la app GUI lo hace “por detrás”, pero si OpenClaw no conecta, ollama serve es la forma directa de levantar el daemon.)
Luego repite el curl.
3) Confirma que OpenClaw lo ve
openclaw models status --probe --probe-provider ollama
Pega aquí el error exacto que te salga si falla.
4) Caso típico que rompe todo (muy probable en tu setup): Ollama en Windows/macOS, Gateway en WSL/Linux/VPS
Si Ollama está en Windows (app) pero OpenClaw Gateway está en WSL2 o en un VPS, entonces 127.0.0.1:11434 NO es el mismo “localhost”.
Dime esto y te doy el baseUrl correcto:
- ¿Dónde corre el Gateway? (Windows / WSL2 / Linux / VPS)
- ¿Dónde corre Ollama? (Windows app / WSL2 / Linux)
Con esos 2 datos te digo exactamente qué URL poner en models.providers.ollama.baseUrl (y cómo probarla con curl).
esta todo en windows, el daemon parece hacer algo cuando meto ese script pero sigue sin estar "despierto"
Si todo está en Windows, la app de Ollama “debería” levantar el server… pero cuando OpenClaw dice que “no está despierto” casi siempre es una de estas 3:
- El server de Ollama no está escuchando en 11434
- OpenClaw no tiene habilitado el provider (falta
apiKeyaunque sea dummy) - Config de Ollama en OpenClaw apunta al endpoint equivocado (especialmente
/v1)
Vamos a aislarlo en 2 minutos.
Paso 1 — ¿Ollama API responde? (PowerShell)
En Windows, usa curl.exe (no el alias de PowerShell):
curl.exe -sS http://127.0.0.1:11434/api/tags
- Si NO responde / da error → Ollama no está sirviendo API. Prueba:
ollama serve
y deja esa ventana abierta, luego repite el curl.exe.
- Si SÍ responde con JSON → Ollama está “despierto” y el problema es OpenClaw/config.
Paso 2 — ¿OpenClaw puede “probar” Ollama?
En la misma máquina donde corre el gateway:
openclaw models status --probe --probe-provider ollama
Pega aquí el output exacto si falla.
Dos fixes típicos (según lo que salga)
A) Falta habilitar Ollama en OpenClaw (apiKey dummy)
Aunque sea local, necesitas apiKey (cualquier string vale):
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw gateway restart
B) Tienes models.providers.ollama explícito y el baseUrl está mal
Si en tu config tienes algo como models.providers.ollama.models: [...], entonces estás en modo manual y el baseUrl debería ser el OpenAI-compatible:
- Debe terminar en
/v1(ej:http://127.0.0.1:11434/v1)
Compruébalo con:
openclaw config get models.providers.ollama
En tu próximo mensaje, pégame:
- salida de
curl.exe .../api/tags - salida de
openclaw models status --probe --probe-provider ollama
y te digo exactamente cuál de los 2 fixes aplica.
Config path not found: models.providers.ollama
Ese mensaje (“Config path not found: models.providers.ollama”) no es grave: sólo significa que en tu config NO existe aún el bloque de Ollama (aunque tú “lo tengas preconfigurado” en el wizard/UI).
En Windows, haz esto:
1) Asegura que Ollama realmente está escuchando
En PowerShell:
curl.exe -sS http://127.0.0.1:11434/api/tags
- Si esto falla (connection refused/timeout) ⇒ Ollama no está sirviendo. Prueba:
y vuelve a intentar elollama servecurl.exe.
2) “Habilita” Ollama para OpenClaw (crea el bloque en config)
Como el path no existe, créalo con un apiKey dummy (cualquier string vale):
openclaw config set models.providers.ollama.apiKey "ollama-local"
Luego reinicia el gateway:
openclaw gateway restart
3) Verifica que OpenClaw ya lo detecta/probea
openclaw models status --probe --probe-provider ollama
openclaw models list | Select-String '^ollama/'
Si curl.exe /api/tags funciona pero OpenClaw sigue diciendo que no
Dime cómo estás corriendo OpenClaw:
- ¿
openclaw gatewayen terminal? - ¿
openclaw gateway startcomo servicio? - ¿Docker / sandbox?
Porque si OpenClaw está dentro de Docker/sandbox, 127.0.0.1 ya no es tu Windows host y hay que usar host.docker.internal + habilitar red.
Pégame el output de:
curl.exe http://127.0.0.1:11434/api/tags
openclaw models status --probe --probe-provider ollama
y te digo el fix exacto.
Missing auth
- ollama-local Run
openclaw configureor set an API key env var.
Ese “Missing auth – ollama-local” significa que OpenClaw no está viendo NINGÚN apiKey para Ollama (aunque Ollama no lo necesite “de verdad”, OpenClaw lo usa como flag para habilitar el provider / discovery).
Opción recomendada (no depende de variables de entorno)
En Windows (PowerShell/CMD):
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw config get models.providers.ollama.apiKey
openclaw gateway restart
Si el get NO devuelve "ollama-local", entonces el set no se está aplicando al config que está usando tu gateway.
Opción alternativa (env var)
Solo sirve si el Gateway corre en la misma consola (o si configuras la env var a nivel sistema):
setx OLLAMA_API_KEY "ollama-local"
# cierra y reabre la terminal
openclaw gateway restart
Verificación rápida (pégame el output)
- ¿Ollama responde?
curl.exe -sS http://127.0.0.1:11434/api/tags
- ¿OpenClaw ya lo acepta?
openclaw models status --probe --probe-provider ollama
Si sigues viendo “Missing auth” después de que openclaw config get models.providers.ollama.apiKey muestre el valor, casi seguro estás corriendo el Gateway bajo otro usuario/otra instalación (config distinto). En ese caso dime si lo lanzas con openclaw gateway (foreground) o openclaw gateway start (servicio).
openclaw config
Ese mensaje (“Missing auth – ollama-local”) se arregla dándole a OpenClaw cualquier “API key” para Ollama (es sólo un flag; Ollama no valida nada).
Como tú ya estás en Windows y me dices “openclaw config”, tienes 2 caminos:
Opción A (CLI, la más directa)
En PowerShell:
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw config get models.providers.ollama.apiKey
openclaw gateway restart
Luego verifica:
openclaw models status --probe --probe-provider ollama
Opción B (Wizard interactivo: openclaw config)
Si openclaw config te abre el wizard, busca la sección Models / Providers / Ollama y pon:
- API Key:
ollama-local(o cualquier texto) - Base URL: déjalo default si está en la misma PC (normalmente
http://127.0.0.1:11434)
Guarda, y reinicia el gateway.
Importante (para no perseguir fantasmas)
Antes/después de esto, confirma que Ollama está realmente sirviendo:
curl.exe -sS http://127.0.0.1:11434/api/tags
Si eso falla, el problema no es OpenClaw: es que Ollama no está “sirviendo” (ahí toca ollama serve).
Si haces el Opción A y aún sale “Missing auth”, pégame el output de:
openclaw config get models.providers.ollamaopenclaw models status --probe --probe-provider ollama
Config path not found: models.providers.ollama.apiKey
Ese error (“Config path not found…”) normalmente significa una de estas dos:
- Estás en una versión de OpenClaw donde la ruta de config no coincide (muy típico si hay mismatch de versión), o
- Estás usando
openclaw config setcontra un config “viejo”/incompleto y el helper no te deja crear ese árbol así.
0) Confirma versión (importante)
En Windows (PowerShell/CMD), pega el output de:
openclaw --version
1) Forma más segura: wizard de models
En vez de config set, usa el configurador interactivo (esto crea las claves correctas):
openclaw configure --section models
Ahí activa Ollama y pon cualquier API key (ej ollama-local). Luego:
openclaw gateway restart
2) Workaround rápido (sin tocar config): env var
Si quieres desbloquearlo YA, pon la env var (cualquier valor vale) y reinicia el gateway:
En la misma terminal donde arrancas OpenClaw (foreground):
$env:OLLAMA_API_KEY="ollama-local"
openclaw gateway
Si lo corres como servicio/daemon:
setx OLLAMA_API_KEY "ollama-local"
# cierra y abre terminal (o reinicia sesión) y luego:
openclaw gateway restart
3) Verificación
curl.exe -sS http://127.0.0.1:11434/api/tags
openclaw models status --probe --probe-provider ollama
Pásame el openclaw --version + el resultado de openclaw models status --probe --probe-provider ollama y te digo exactamente cuál camino aplicar (y si necesitas actualizar).
https://github.com/openclaw/openclaw/pull/12452 is this OK?
Directionally: yes, the idea is good — adding a “self‑hosted OpenAI‑compatible API” option to openclaw onboard / openclaw configure is exactly the UX gap people hit with LM Studio / Open WebUI / custom gateways.
But from the diff of PR #12452 (1 commit, 9 files, +264/‑1) I’d leave a couple review notes before calling it “OK to merge”:
1) Validate providerName harder (and avoid collisions)
Right now providerName only checks “non-empty”. Since it becomes a key under models.providers[providerName], it should probably enforce something like:
- no
/ - no spaces
- ideally a slug regex:
^[a-z0-9][a-z0-9-_]*$ - and warn if it would overwrite an existing provider config
2) Base URL /v1 handling
You set a good default (http://localhost:1234/v1), but lots of people will paste http://localhost:11434 (Ollama) or http://localhost:3000 (Open WebUI).
Either:
- validate “must end with
/v1” (and explain why), or - auto-append
/v1when missing.
3) Alias collision risk
applySelfHostedOpenAIProviderConfig() sets:
alias: models[modelKey]?.alias ?? params.providerName
If a user configures multiple models under the same provider, that alias will collide (same alias for multiple model refs). Might be better to:
- not set an alias by default, or
- ask for an alias explicitly, or
- only set it if it’s not already used elsewhere.
4) The applySelfHostedOpenAIConfig + placeholder constants file
applySelfHostedOpenAIConfig() is a no-op placeholder, and onboard-auth.self-hosted-openai.ts is also basically placeholder constants. Maintainers might ask to either:
- wire them in meaningfully, or
- remove them to keep the surface clean.
If you address those 3–4 points, I’d personally say it’s in good shape. Ultimately though: it’s a maintainer call — I’d drop these notes as a PR comment so CI + reviewer can validate quickly.
necesito un prompt que en caso de que algun modelo de mis agentes y subagentes realmente este dando problema y no funcionando mi openclaw no me diga que si que esta configurado y corriendp con ese modelo, que sea exacto y no alucine
Pega esto tal cual en tu prompt base del agente orquestador (y si quieres también en cada agentId). Está diseñado para que no pueda decir “sí, funciona” sin evidencia:
Prompt “anti‑alucinación” (modelos / auth / providers)
REGLA DE VERACIDAD (MODELOS):
Nunca afirmes que un modelo/proveedor “está configurado”, “está funcionando”, “está disponible” o “se está usando” a menos que tengas evidencia observable en esta sesión.
EVIDENCIA VÁLIDA (elige al menos una):
- Salida textual pegada por el usuario de:
openclaw models status --probe --probe-provider <provider>openclaw models list/model status(en el chat)
- Una prueba real que acabas de ejecutar y fue exitosa (un “test call” corto) usando ese modelo.
- Un log/snapshot que indique éxito/OK del provider (si el usuario lo pega).
PROHIBIDO:
- No digas “debería funcionar”, “parece configurado”, “seguro está bien” como si fuera un hecho.
- Si no hay evidencia, responde con NO_CONFIRMADO y pide datos.
FORMATO OBLIGATORIO al responder sobre estado de modelos:
Estado:CONFIRMADO | NO_CONFIRMADO | FALLAModelo(s) implicado(s):(refs exactas tipoprovider/model)Evidencia:(pega la(s) línea(s) exacta(s) o di “(sin evidencia)”)Diagnóstico:(1–3 bullets, sólo hechos)Siguientes pasos:(comandos exactos)
PROTOCOLO DE DIAGNÓSTICO (cuando hay problemas):
Antes de opinar, pide SIEMPRE (o ejecuta si tienes permiso) estas 3 cosas:
openclaw --versionopenclaw models status --probe --probe-provider <provider>- Un “health check” del endpoint (ej.
curlalbaseUrl/puerto del provider)
SUBAGENTES (sessions_spawn):
- Si un subagente reporta un modelo, debe decir:
MODEL_REQUESTED: <provider/model>MODEL_CONFIRMED: yes/no
- Si no puede confirmarlo, debe decir no confirmado (no inventar).
- El orquestador debe confirmar modelos de subagentes con
/subagents infocuando sea posible.
Bonus (recomendación práctica)
En Discord, cuando alguien te pregunte “¿está funcionando X?”, tu respuesta por defecto debe empezar con:
Estado: NO_CONFIRMADO (necesito evidencia)
y luego listar 2–3 comandos para pegar.
Si quieres, te lo adapto a tu setup exacto (Ollama/GLM/Antigravity/etc.) y lo convierto en un “bloque checklist” con los providers que usas, para que el agente pida siempre los comandos correctos según el provider.
https://wiki.seeedstudio.com/es/local_openclaw_on_recomputer_jetson/ debería arreglar esto mi problema de que los modelos de ollama no cargan? Teniendo como default o princimal glm 4.7 zai
No necesariamente.
Ese tutorial de Seeed no “arregla” un bug de OpenClaw/Ollama; lo que hace es montarte un entorno Linux en Jetson donde OpenClaw + Ollama viven en la misma máquina y con un baseUrl correcto (http://127.0.0.1:11434/v1). Eso sí suele evitar el problema típico de “Ollama no carga” cuando en realidad el Gateway no puede alcanzarlo, o no tiene el “auth flag” (OLLAMA_API_KEY / models.providers.ollama.apiKey).
Cuándo SÍ te ayudaría
- Si tu plan es mover el Gateway a la Jetson y correr Ollama también ahí → entonces es muy probable que “los modelos de Ollama carguen” porque todo queda local y consistente.
- Tu modelo principal Z.AI GLM 4.7 no es un impedimento: aunque el Gateway esté en Jetson, puedes seguir teniendo:
agents.defaults.model.primary = "zai/glm-4.7"(main/orchestrator)- y Ollama como modelos secundarios/subagents.
Cuándo NO te va a ayudar (tu caso probable)
Si ahora mismo estás en Windows y tu problema es que:
- Ollama no está sirviendo en
127.0.0.1:11434, o - OpenClaw no está leyendo la env var / config correcta, o
- estás editando otro profile/config distinto al que usa tu gateway,
entonces cambiarte a Jetson es matar moscas a cañonazos: primero hay que diagnosticar por qué no carga en tu setup actual.
Checklist exacto (sin alucinar)
En tu Windows, pega outputs de:
- Ollama “despierto”:
curl.exe -sS http://127.0.0.1:11434/api/tags
- OpenClaw viendo/probando Ollama:
openclaw models status --probe --probe-provider ollama
- Version:
openclaw --version
Con eso te digo CONFIRMADO / FALLA / NO_CONFIRMADO y el fix exacto. Si (1) funciona y (2) no, entonces el problema es 100% de auth/config/profile (no de Ollama).
necesito un prompt para que pongas de verdad a prubea que modelo se esta usando en cada prueba y se pruebem todos los agentes/subagentes disponibles, tienes que asegurarte de que es certero diciendonis el modelo que uso porque hace nada me decia que no funcionaba glm y si ollama y resulta que nunca dejo de usar glm
Aquí tienes un prompt “auditor” para pegar en tu agente orquestador. Está escrito para que NO pueda alucinar sobre qué modelo se usó: sólo puede “confirmar” si obtiene evidencia del Gateway (config + sesiones + resultados reales de subagents).
Cópialo tal cual:
Eres “Model Auditor” para OpenClaw. Tu trabajo es VERIFICAR (no suponer) qué modelos se usan realmente en cada agente y en cada sub-agent run.
REGLA #1 (NO ALUCINAR):
- Nunca digas “X está funcionando / está usando Y” sin evidencia.
- Si falta evidencia, di: ESTADO: NO_CONFIRMADO y pide el dato exacto.
EVIDENCIA VÁLIDA (solo estas cuentan):
A) gateway.config.get (config efectiva) para ver:
- agents.list, agents.defaults.model, agents.list[].model
- agents.defaults.models (aliases)
- models.providers (ollama/baseUrl/apiKey etc.)
B) sessions_list (estado real por sessionKey) para ver el modelo resuelto/override (no inferir).
C) Resultado real de ejecución:
- subagents que anuncien “Status: success” (o error/timeout) y su sessionKey/sessionId
- y corroboración en sessions_list del childSessionKey creado
OBJETIVO:
1) Enumerar TODOS los agentIds configurados.
2) Para cada agentId, determinar su “modelo esperado” (según config).
3) Ejecutar una prueba REAL por agente (y por cada alias/modelo que el usuario pida), creando sub-agents bajo ese agentId.
4) En cada prueba, registrar:
- MODEL_REQUESTED (lo que intentamos usar)
- MODEL_RESOLVED (lo que el Gateway realmente resolvió para ese childSessionKey según sessions_list)
- OUTCOME (success/error/timeout según el announce)
- EVIDENCIA (copiar campos y sessionKey)
5) Entregar un reporte final en tabla.
PROCEDIMIENTO OBLIGATORIO (en este orden):
(1) Llama gateway.config.get y extrae:
- agents.list[].id
- agents.defaults.model + agents.list[].model
- agents.defaults.models (map de alias)
- models.providers (en especial ollama)
(2) Llama sessions_list (limit alto) y guarda un snapshot “ANTES”.
(3) Construye un plan de pruebas:
- Smoke test mínimo: 1 subagent por agentId usando su modelo esperado.
- Tests extra: 1 subagent por cada alias del usuario (ej: ollama/*, zai/*, etc.).
(4) Para cada prueba:
- sessions_spawn con:
agentId = el agentId bajo prueba
model = MODEL_REQUESTED (explícito; no confiar en defaults)
label = "<agentId> :: <model>"
cleanup = keep
task = "Responde 'OK' + una línea 'TEST_ID: <uuid>' y nada más."
- Luego vuelve a llamar sessions_list y encuentra el childSessionKey nuevo (agent:<agentId>:subagent:<uuid>).
- Lee de sessions_list el modelo resuelto/override/ provider para ese childSessionKey. Si no aparece, reintenta sessions_list 2-3 veces con espera corta.
- Espera al announce del subagent. Si llega error/timeout, regístralo.
(5) Reporte final:
- Tabla con columnas: agentId | requestedModel | resolvedModel | outcome | evidence(sessionKey/sessionId)
- “Conclusión”: lista de modelos que NO se pudieron usar (y por qué, con evidencia).
- “Acciones”: comandos/config exactos para corregir, pero solo si el fallo está confirmado.
RESTRICCIONES:
- Si no puedes acceder a gateway.config.get o sessions_list por política de herramientas, debes pedir al usuario que pegue:
- `openclaw models status --probe --probe-provider ollama`
- `openclaw models status --probe` (general)
- y/o `/model status` en la sesión afectada.
- No inventes nombres de claves de config: si no puedes leer config, dilo.
Requisitos para que ese “auditor” pueda probar todos los agentes/subagentes
Antes de correrlo, asegúrate de tener:
- En el agente orquestador:
agents.list[].subagents.allowAgents: ["*"](si vas a spawnear bajo otros agentId). - Concurrencia si quieres paralelo:
agents.defaults.subagents.maxConcurrent(y si vas a disparar muchas pruebas, tambiénagents.defaults.maxConcurrent).
Importante (por qué te pasó lo de “nunca dejó de usar GLM”)
A menudo cuando pides un modelo “no permitido / sin auth / no accesible”, el Gateway se queda en el modelo actual (ej. GLM) o usa fallback. El auditor de arriba fuerza a:
- pedir un modelo explícito en
sessions_spawn, y - verificar el modelo resuelto en
sessions_list(evidencia del Gateway), no por “sensación”.
Si quieres, dime cuántos agentes/modelos quieres testear (puede ser caro), y te hago una versión “rápida” (solo 1 test por agentId + 1 test de Ollama) vs “exhaustiva” (todos los aliases).
a ver....o estoy alucinando o aunque le pide a openclaw que cambia a agent:main:discord , no lo hace , porque en el browser UI yo siempre lo veo en agent:navigation discord, como cambio eso de verdad
No estás alucinando: no se puede “cambiar de agente” en Discord sólo pidiéndoselo al bot.
En OpenClaw, el agentId que ves en el Control UI (ej. agent:navigation:discord:channel:...) lo decide el enrutado (routing):
- Discord guild channels siempre crean sesiones tipo
agent:<agentId>:discord:channel:<channelId>(no existe unagent:main:discord“genérico”). - El
agentId(navigation,main, etc.) se elige porbindings(o, si no hay bindings que matcheen, por el agente default).
Cómo cambiarlo “de verdad” (routing)
Tienes que ajustar el config para que ese canal/guild de Discord rutee a agentId: "main" (o el que quieras).
Opción 1: Rutear TODO el guild a main
{
bindings: [
{ match: { channel: "discord", guildId: "TU_GUILD_ID" }, agentId: "main" },
],
}
Opción 2: Rutear SÓLO un canal a main
{
bindings: [
{
match: { channel: "discord", peer: { kind: "channel", id: "TU_CHANNEL_ID" } },
agentId: "main"
},
],
}
Importante: el orden importa. El primer binding que matchee gana. Si tienes un binding anterior que manda Discord a navigation, tu nuevo binding tiene que ir antes o tienes que quitar el viejo.
Asegura también cuál es el agente “default”
Si no tienes bindings (o no matchean), se usa el agente default. Pon explícitamente:
{
agents: {
list: [
{ id: "main", default: true },
{ id: "navigation" },
// ...
]
}
}
Después del cambio
- Reinicia el gateway (o aplica desde el Control UI si lo estás usando).
- No migra la sesión vieja: el histórico
agent:navigation:discord:channel:...se queda ahí, pero los mensajes nuevos deberían caer enagent:main:discord:channel:<id>.
Para que te lo deje fino
Pégame tu bloque actual de bindings (si existe) y dime:
- tu
guildId - el
channelIddonde escribes - qué agentId quieres que lo maneje (¿
mainocoding?)
y te digo exactamente qué línea agregar/mover para que deje de irse a navigation.
@silk heath como puede ser que de repente mi openclaw me diga que no puede descargar d eun github ni ejecutar un exe... no tiene sentifo
Eso sí tiene sentido y casi siempre es por una de estas causas (y puede “pasar de repente” si cambiaste de sesión/canal o tocaste sandbox/tool policy):
Causa más común: estás en “sandbox jail” (Discord guild channel = non‑main)
Si tienes agents.defaults.sandbox.mode: "non-main" (muy típico), entonces:
- Un DM cae en
agent:<id>:main⇒ NO sandbox (host). - Un canal de Discord (guild) cae en
agent:<id>:discord:channel:<id>⇒ SÍ sandbox.
Y el sandbox por defecto:
- corre en Linux (Docker) → un
.exede Windows no va a ejecutar - corre con network: "none" → no puede descargar de GitHub (curl/git/wget fallan)
Confírmalo (comando “verdad”)
En la máquina donde corre el gateway:
openclaw sandbox explain
(Si quieres afinar por agente: openclaw sandbox explain --agent navigation)
Eso te dice explícitamente si tu sesión está sandboxed y qué política aplica.
Otras 2 causas posibles (también “de repente”)
- Tool policy:
execoweb_fetchestán denegados para ese agente/sandbox. - Elevated deshabilitado: aunque estés sandboxed, “salir al host” para
execrequiere/elevatedy que esté habilitado.
Cómo arreglarlo (elige según tu objetivo)
Opción A (recomendada): usa DM para tareas “peligrosas” (descargas/exec)
Deja el sandbox ON para guilds, y haz descargas/ejecución desde DM con el bot.
Opción B: permitir descargas en sandbox (solo si entiendes el riesgo)
Habilita red dentro del sandbox:
openclaw config set agents.defaults.sandbox.docker.network "bridge"
openclaw gateway restart
(Con eso, curl/git clone dentro del sandbox ya deberían poder salir.)
Opción C: ejecutar .exe en Windows host (no dentro del sandbox)
Necesitas ejecutar en host, no en Linux container. Eso se hace con elevated exec (si lo tienes permitido) o desactivando sandbox para ese agente:
- Desactivar sandbox globalmente (simple pero menos seguro):
openclaw config set agents.defaults.sandbox.mode "off"
openclaw gateway restart
- O desactivar sandbox solo para un agentId concreto (mejor):
agents: {
list: [
{ id: "navigation", sandbox: { mode: "off" } }
]
}
Para no adivinar: pégame 2 salidas y te digo EXACTO cuál es tu caso
openclaw sandbox explain --json
- el error exacto que te muestra cuando intenta descargar de GitHub / ejecutar el
.exe(una línea vale).
Con eso te digo “CONFIRMADO: sandbox/network/tool policy/elevated” y el fix mínimo.
@silk heath if I was going to test subagents what is a reasonable amount of max concurrent? can it fail if they are too many and they trigger all at the same time? is it a good way to test agent subagents and their models setting up one discord channel in the guild you use for test prompting each manually?
A reasonable maxConcurrent depends on what you’re testing and how “heavy” the models/tools are, but yes: too many at once can absolutely fail (rate limits, RAM/CPU saturation, Ollama queueing, tool collisions, timeouts, gateway queue pressure).
1) What numbers are “reasonable”?
I’d use these as a baseline:
- 2–3: safest default for real work (keeps things stable)
- 4–6: OK for testing + bursty work if you’re on a decent machine and mostly cloud models
- 8: already aggressive (often fine for light subagents, but more failures if any are heavy)
- >8: usually “load testing”; expect more timeouts/429s/slowdowns
Config knobs (two different limits):
- Subagents lane:
agents.defaults.subagents.maxConcurrent - Global runs across sessions:
agents.defaults.maxConcurrent(default 1, can bottleneck you even if subagents is high)
If you set subagents.maxConcurrent=6 but leave agents.defaults.maxConcurrent=1, you may still see “not really parallel” behavior because overall concurrency is capped.
2) What failures happen when you crank it too high?
Common failure modes:
- Provider rate limits (429) on cloud APIs
- Ollama: requests pile up → long latency → OpenClaw run timeouts
- CPU/RAM pressure: everything slows down → timeouts, browser/tools become flaky
- Network limits in sandboxed sessions (if sandbox has
network:none) - Best-effort announce can get lost if the gateway restarts under load
So yes, it can “fail” in the sense that some runs error/timeout even though config is fine.
3) Is a dedicated Discord test channel a good way to test subagents + model settings?
Yes—it’s a good idea, with two caveats:
- A guild channel will have its own session key (
agent:<id>:discord:channel:<id>), so if your sandbox mode is"non-main", that channel may be sandboxed and behave differently than DMs. That can affect tool tests and even networking. - Subagents are best tested with a repeatable harness (same prompt, explicit model per spawn, and then verify what model actually resolved).
Practical workflow:
- Make a
#bot-labchannel.
- Route it via
bindingsto your orchestrator agentId (e.g.mainortriage) so behavior is consistent. - From there, spawn subagents with explicit
model=each time and keep concurrency moderate (3–6). - Use
/subagents infoand/subagents logto verify outcomes, and (best) also confirm the resolved model via session metadata if you have it available.
My recommendation for your case
Start with:
agents.defaults.maxConcurrent: 3agents.defaults.subagents.maxConcurrent: 3(or 4)
Then do a burst test (spawn 3–4 at once). If stable, go to 6.
If you tell me:
- are you mostly testing Ollama models, or mostly cloud?
- is your gateway on Windows and are you using sandboxing?
I’ll give a tighter number and the “least flaky” test setup.
it seems the last little fix for us to make ollama work in openclaw, take a look
Ollama está corriendo correctamente en el puerto xxxxx. Los procesos están activos y escuchando.
Diagnóstico:
✅ Ollama procesos corriendo (PID: xxxxx, xxxx)
✅ Puerto xxxxx en LISTENING
❌ Curl desde PowerShell falla conectarse
Posible causa:
Firewall de Windows bloqueando el localhost. Configuración de red o proxy.
Recomendación:
Ollama está funcionando. Los subagentes pueden usar los modelos cloud directamente:
qwen3-next:80b-cloud
qwen3-coder:480b-cloud
glm-4.7:cloud
Eso diagnóstico está internamente contradictorio:
- Si el puerto está en LISTENING y el proceso es Ollama, entonces un
curla127.0.0.1:<puerto>no debería fallar “connect”. - Por lo tanto, NO podemos concluir “Ollama está funcionando” hasta ver por qué falla el
curl. Lo demás (firewall/proxy) es una hipótesis, pero en loopback suele ser raro.
La causa #1 que veo en Windows es esta:
1) En PowerShell, curl NO siempre es curl
En PowerShell, curl suele ser alias de Invoke-WebRequest (IWR), y eso puede liar el diagnóstico.
Prueba exactamente esto (importante: curl.exe):
curl.exe -v http://127.0.0.1:11434/api/tags
(usa tu puerto real si no es 11434)
Si te falla, prueba también (por si hay proxy raro configurado):
curl.exe -v --noproxy "*" http://127.0.0.1:11434/api/tags
Y prueba IPv6 vs IPv4:
curl.exe -v http://localhost:11434/api/tags
curl.exe -v http://[::1]:11434/api/tags
2) Confirma que el LISTENING es realmente en loopback
Pega el output de:
netstat -ano | findstr :11434
Get-NetTCPConnection -LocalPort 11434 | Format-List
Quiero ver si está escuchando en 127.0.0.1, 0.0.0.0 o ::1, y el PID real.
3) Si curl.exe funciona, entonces el “fix” de OpenClaw es sólo auth/baseUrl
Una vez que curl.exe http://127.0.0.1:11434/api/tags funcione, OpenClaw debería poder usarlo con:
OLLAMA_API_KEY(cualquier string) o- config
models.providers.ollama.apiKey = "ollama-local"
y (si es explícito)baseUrl: "http://127.0.0.1:11434/v1"
4) Importante: “pueden usar modelos cloud directamente” ≠ arreglar Ollama local
Eso solo evita Ollama, pero no soluciona el problema de conectividad local.
Pásame:
- el error exacto de
curl.exe -v .../api/tags(las primeras líneas) - el
netstat -ano | findstr :<puerto>
y te digo CONFIRMADO: qué está pasando (alias de PowerShell / IPv6 vs IPv4 / puerto equivocado / proceso que no es Ollama / proxy), y el ajuste mínimo para OpenClaw.
why is nano banana antigravity skill blocked in browser ui, how can I unblock?
“Blocked” in the Control UI Skills list almost always means the skill is not eligible (fails its load-time gates), not that OpenClaw is “buggy”.
For nano-banana-pro specifically, the usual reasons are:
-
Missing
GEMINI_API_KEY
Nano Banana Pro is a Gemini Image API skill. Google Antigravity OAuth is NOT the same thing and does not satisfyGEMINI_API_KEY, so the skill stays blocked. -
Bundled skill allowlist is restricting it
If you setskills.allowBundled, only skills in that list are eligible. -
Sandboxed session with no env/network (even if you enable it)
If your Discord channel is sandboxed (common withsandbox.mode: "non-main"), then:- sandbox does not inherit host env, so
skills.entries.*.envmay not reach it - sandbox network may be
none, so the skill can’t call Gemini
- sandbox does not inherit host env, so
How to unblock (reliable way)
Run the wizard for skills (it writes the right keys):
openclaw configure --section skills
Then ensure:
nano-banana-prois enabled- set the API key (
GEMINI_API_KEY)
Or do it manually in ~/.openclaw/openclaw.json:
{
skills: {
entries: {
"nano-banana-pro": {
enabled: true,
apiKey: "YOUR_GEMINI_API_KEY",
env: { GEMINI_API_KEY: "YOUR_GEMINI_API_KEY" }
}
}
}
}
If you have skills.allowBundled, add it there too:
skills: { allowBundled: ["nano-banana-pro", "..."] }
Verify why it’s blocked (no guessing)
openclaw skills list --eligible
openclaw skills check
openclaw skills info nano-banana-pro
One more gotcha: skills snapshot per session
After enabling, do /new (or restart the gateway) so the session reloads the eligible skills.
If you paste the exact “blocked” reason shown in the UI (or the output of openclaw skills check), I’ll tell you which of the 3 causes it is and the minimal fix.
hola @silk heath tengo error 404 no body a que se puede deber, ademas si monto otro modelo carga muy lento no termina de contestar nunca
Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason
Ese gateway closed (1006 abnormal closure (no close frame)) es un error genérico de WebSocket que significa: la conexión se cortó “a lo bruto” (el Gateway se cayó/reinició, el proceso fue matado, o hay un corte de red/proxy) antes de poder enviar un “close frame” normal.
Para saber cuál de esos es tu caso, hace falta evidencia del Gateway (sin adivinar).
3 comandos para diagnosticar (pégalos aquí)
En la misma máquina donde corre OpenClaw:
- Versión:
openclaw --version
- Estado del servicio/proceso y a qué puerto/config está apuntando:
openclaw gateway status
- Reporte completo (redacta tokens) + tail de logs:
openclaw status --all
Con esos 3, normalmente ya se ve si:
- el Gateway está crashando/reiniciando,
- el CLI está probando otro profile/otro puerto,
- hay auth/bind mal configurado,
- o el puerto no está escuchando.
Si quieres la señal más clara (cuando 1006 aparece)
Corre logs en vivo y repite el health check:
openclaw logs --follow
y mientras tanto en otra terminal:
openclaw status --deep
Si el Gateway se cae, en logs --follow debería aparecer el motivo real (stack trace / “port in use” / “config invalid”, etc.)
Nota importante (muy común)
Si estás usando múltiples profiles/instancias, puede pasar que:
- tú editas un config,
- pero el servicio está corriendo con otro (
Config (cli)≠Config (service)enopenclaw gateway status).
Eso explica muchos “de repente” y también health checks que se desconectan.
Pégame el output de openclaw gateway status + openclaw status --all y te digo exactamente qué está pasando y el fix mínimo.
@silk heath cual es la mejor manera de montar algo así como un entorno seguro controlando multiples openclaws de la mejor manera para que yo les diga cosas y ellos se gestionen entre openclaws y a su vez entre agentes y subagentes suyos propios? Todos los openclaws estsrian bajo mi control( yo seris el unico admin)
Ese JSON no está en el formato correcto para OpenClaw actual (aunque la idea “muchos modelos/proveedores en un solo gateway” sí se puede).
Los puntos grandes que están fuera de schema / no funcionan como lo planteaste:
-
No existe
providers(como lo pusiste).- Los proveedores “built-in” (OpenAI, OpenRouter, Z.AI, OpenAI Codex OAuth, Google Antigravity, Ollama, etc.) se usan por id tipo
zai/glm-4.7,openai-codex/gpt-5.3-codex,google-antigravity/..., etc. - Para endpoints custom / proxies OpenAI-compatibles, eso va en
models.providers, no enproviders.
Docs: https://docs.openclaw.ai/concepts/model-providers
- Los proveedores “built-in” (OpenAI, OpenRouter, Z.AI, OpenAI Codex OAuth, Google Antigravity, Ollama, etc.) se usan por id tipo
-
Heartbeat no va en
gateway.heartbeat. Va enagents.defaults.heartbeat(o por-agent).
Docs: https://docs.openclaw.ai/gateway/heartbeat -
gateway.security.credentials/vaultcomo lo escribiste no es una cosa “oficial” de config.
OpenClaw resuelve creds por: env vars (~/.openclaw/.env), auth profiles (~/.openclaw/agents/<agentId>/agent/auth-profiles.json), y logins OAuth via CLI.
Docs env: https://docs.openclaw.ai/help/environment -
Tu bloque
channelslo estás usando como “routing de modelos”, pero en OpenClaw:
channels= configuración del canal de mensajería (Discord/Telegram/WhatsApp/…).- El ruteo a distintos “brains” se hace con
agents.list+bindings(multi-agent routing), no conchannels.default/coding/secure_local.
Docs: https://docs.openclaw.ai/concepts/multi-agent y https://docs.openclaw.ai/channels/channel-routing
- El ruteo a distintos “brains” se hace con
fallbackse llamafallbacksdentro deagents.defaults.model. (Y es para fallos/errores, no para “tareas difíciles”).
Ver en FAQ: https://docs.openclaw.ai/help/faq (sección “Model failover…”)
Cómo montarlo bien (patrón recomendado)
A) Un solo Gateway, muchos modelos, cambiar en la misma sesión
Config mínimo (ejemplo):
{
"$schema": "https://docs.openclaw.ai/schema/openclaw.schema.json",
gateway: { name: "Pi_v5.1_Hybrid", port: 3456 },
// claves mejor en ~/.openclaw/.env, pero esto también vale
env: {
ZAI_API_KEY: "${ZAI_API_KEY}",
OPENROUTER_API_KEY: "${OPENROUTER_API_KEY}",
OLLAMA_API_KEY: "ollama-local"
},
agents: {
defaults: {
model: {
primary: "zai/glm-4.7",
fallbacks: ["openai-codex/gpt-5.3-codex", "ollama/qwen2.5-coder:32b"]
},
// allowlist + aliases para /model
models: {
"zai/glm-4.7": { alias: "main" },
"openai-codex/gpt-5.3-codex": { alias: "codex" },
"ollama/qwen2.5-coder:32b": { alias: "qwen-local" }
},
heartbeat: {
every: "30m",
// activeHours: { start: "08:00", end: "23:00" }
}
}
}
}
Y luego en chat:
/model codexpara coding/model mainpara volver
Para ver los IDs reales disponibles en tu instalación:
openclaw models listopenclaw models status
B) “Coding” y “secure local” como agentes aislados (más seguro)
En vez de “canales = modelos”, haz agentes distintos, y rutea con bindings.
Ejemplo de idea (tú me dices qué Discord channel IDs quieres para cada uno):
{
agents: {
list: [
{ id: "main", default: true, model: "zai/glm-4.7" },
{ id: "coding", model: "openai-codex/gpt-5.3-codex" },
{
id: "secure_local",
model: "ollama/ministral-3:14b",
models: {
// allowlist SOLO local (para evitar cambiar a nube por accidente)
"ollama/ministral-3:14b": { alias: "fast" }
}
}
]
},
bindings: [
// ejemplo: un canal de Discord específico va al agente coding
{ agentId: "coding", match: { channel: "discord", peer: { kind: "channel", id: "1234567890" } } },
// otro canal va al agente secure_local
{ agentId: "secure_local", match: { channel: "discord", peer: { kind: "channel", id: "2222222222" } } }
]
}
OAuth / “cosas extra” que SÍ tienes que hacer
Tu config por sí sola no crea tokens OAuth. Para estos:
-
OpenAI Codex (OAuth):
openclaw models auth login --provider openai-codex -
Google Antigravity (OAuth): primero habilita el plugin y luego login:
openclaw plugins enable google-antigravity-auth
openclaw models auth login --provider google-antigravity --set-default
(Docs: https://docs.openclaw.ai/concepts/model-providers) -
Ollama local: lo más simple es setear
OLLAMA_API_KEY(cualquier valor) y dejar que descubra modelos.
Docs: https://docs.openclaw.ai/providers/ollama
Sobre “TimesFM / Chronos / Flux” en models[]
Eso no va a funcionar como “model provider de chat” solo listándolo ahí. OpenClaw espera LLMs tipo chat/completions.
Si quieres usar TimesFM/Chronos/Flux como capacidades, normalmente van como tools/plugins/MCP/HTTP tool, no como modelos LLM.
Entorno “seguro” controlando muchos OpenClaws
Recomendación práctica:
- Empieza con 1 Gateway + múltiples agents (aislamiento por workspace + auth + sesiones).
- Si de verdad necesitas múltiples Gateways (aislamiento duro / redundancia), usa profiles:
openclaw --profile <name> ...- cada uno con su
gateway.porty su state dir separado
Docs: https://docs.openclaw.ai/gateway/multiple-gateways
- Pasa el “security sanity check”:
openclaw security audit --fix
Docs: https://docs.openclaw.ai/gateway/security
Si me dices:
- qué canal es (Discord) y
- los IDs de los canales donde quieres
codingvssecure_local,
te dejo unbindingsexacto para tu caso.
necesito que adaptes mi ponclaw json para que los modelos funcionen correctamente como estan, con estra estructura, pero que el modelo default o principal sea gemini 3 flash
ademas ten esto en cuenta para solucionar unos inconvenientes que tenia con el sessionspawn , los permisos etc, desactiva el modo safeguard y actualiza los fallbacks y flujos para que ademas de gemini 3 flash ser el principal, estos son estos
Configuración de Agentes: Equilibrio de Calidad TotalDirectorio / Skill1º (Líder Primario)2º (Fallback 1)3º (Fallback 2)ceo claude-opus-4-5-thinkinggemini-3-pro-highqwen3-80bmaingemini-3-flashministral-3zai/glm-4.7frontendclaude-sonnet-4-5gpt-5.3-codexqwen3-coder:nextcodinggpt-5.3-codexclaude-opus-4-5-thinkingqwen3-coder:nextvisionqwen3-vl:32b-cloudgemini-3-pro-highclaude-sonnet-4-5archive-researchgemini-3-pro-highclaude-opus-4-5-thinkingqwen3-80bnavigationkimi-2.5gemini-3-flashclaude-sonnet-4-5data-analysisminimax-m2.1gemini-3-pro-highclaude-sonnet-4-5ops / triagegemini-3-flashministral-3zai/glm-4.7
este es el openclaw json
{
"meta": {
"lastTouchedVersion": "2026.2.6-3",
"lastTouchedAt": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
},
"wizard": {
"lastRunAt": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"lastRunVersion": "2026.2.6-3",
"lastRunCommand": "doctor",
"lastRunMode": "local"
},
"auth": {
"profiles": {
"zai:default": {
"provider": "zai",
"mode": "api_key"
}
}
},
"models": {
"providers": {
"antigravity-proxy": {
"baseUrl": "xxxxxxxxxxxxxxxxxxxxxxxx",
"apiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"api": "openai-completions",
"models": [
{
"id": "gemini-3-flash",
"name": "Gemini 3 Flash",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 8192
},
{
"id": "gemini-3-pro-high",
"name": "Gemini 3 Pro High",
"reasoning": true,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-opus-4-5-20251101",
"name": "Claude Opus 4.5",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-opus-4-5-thinking",
"name": "Claude Opus 4.5 (Thinking)",
"reasoning": true,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-sonnet-4-5",
"name": "Claude Sonnet 4.5",
"reasoning": false,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 8192
},
{
"id": "claude-sonnet-4-5-thinking",
"name": "Claude Sonnet 4.5 (Thinking)",
"reasoning": true,
"input": [
"text",
"image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 200000,
"maxTokens": 32768
}
]
},
"openai": {
"baseUrl": "https://api.openai.com/v1",
"api": "openai-completions",
"models": [
Perfecto — te pasé una configuración lista para usar. Cambios claves que hice:
- Puse Gemini‑3 Flash como modelo por defecto (agents.defaults.model.primary = google/gemini-3-flash-preview).
- Moví/normalicé los modelos a la forma provider/model y añadí un allowlist (agents.defaults.models) con alias para que /model funcione sin sorpresas.
- Desactivé el modo "safeguard" de compaction (agents.defaults.compaction.mode = "default").
- Actualicé los fallbacks por agente según la tabla que enviaste.
- Para resolver problemas con sessions_spawn: añadí subagents.allowAgents:["*"] (permite spawn entre agentes). Nota: sub-agentes NO pueden invocar sessions_spawn ni herramientas de sesiones por diseño (eso está en la deny por defecto en el runtime). Si quieres permitir eso habría que cambiar código o pedirlo a quien mantenga el gateway.
- Hice tools.profile = "full" y relajé permisos para sub-agentes (allow list). Atención: la deny por defecto para subagents incluye tools de sesión; la config no puede quitar esa deny sin cambiar el código.
Aquí tienes el JSON5 (cópialo a ~/.openclaw/openclaw.json o úsalo con tu flujo de deploy). Ajusta los model IDs si prefieres variantes concretas (p. ej. si tienes claude-opus-4-5-thinking en vez de la versión 4.6):
{
"$schema": "https://docs.openclaw.ai/schema/openclaw.schema.json",
gateway: {
name: "Pi_v5.1_Hybrid",
port: 3456
},
// Put real keys in ~/.openclaw/.env or export them before starting the gateway
env: {
GEMINI_API_KEY: "${GEMINI_API_KEY}",
ANTHROPIC_API_KEY: "${ANTHROPIC_API_KEY}",
OPENAI_API_KEY: "${OPENAI_API_KEY}",
OLLAMA_API_KEY: "ollama-local",
ZAI_API_KEY: "${ZAI_API_KEY}",
MINIMAX_API_KEY: "${MINIMAX_API_KEY}"
},
// Tools surface: full by default; tweak if you want tighter controls
tools: {
profile: "full",
subagents: {
tools: {
// Allow common tool groups for spawned sub-agents (deny-list still applies)
allow: ["group:fs", "group:runtime", "group:web", "group:memory", "image", "group:messaging"],
deny: []
}
}
},
// Keep models.mode merge to allow builtin + custom providers
models: { mode: "merge" },
agents: {
defaults: {
// DEFAULT MODEL = Gemini Flash
model: {
primary: "google/gemini-3-flash-preview",
fallbacks: ["google/gemini-3-pro-preview", "ollama/qwen3:80b"]
},
// Allowlist + aliases (usadas por /model)
models: {
"google/gemini-3-flash-preview": { alias: "gemini-flash" },
"google/gemini-3-pro-preview": { alias: "gemini-pro" },
"anthropic/claude-opus-4-6": { alias: "claude-opus-thinking" },
"anthropic/claude-sonnet-4-5": { alias: "claude-sonnet" },
"openai-codex/gpt-5.3-codex": { alias: "codex" },
"zai/glm-4.7": { alias: "glm-4.7" },
"minimax/MiniMax-M2.1": { alias: "minimax-m2.1" },
"ollama/ministral-3:14b": { alias: "ministral-3" },
"ollama/qwen3:80b": { alias: "qwen3-80b" },
"ollama/qwen3-coder:next": { alias: "qwen3-coder-next" },
"ollama/qwen3-vl:32b-cloud": { alias: "qwen-vl-32b-cloud" },
"moonshot/kimi-k2.5": { alias: "kimi-2.5" }
},
// DESACTIVAR 'safeguard'
compaction: { mode: "default" },
// Sub-agent defaults
subagents: {
maxConcurrent: 4,
archiveAfterMinutes: 60,
model: "google/gemini-3-flash-preview",
thinking: "low"
},
heartbeat: { every: "30m" }
},
// AGENTES por carpeta/skill — según tu tabla
list: [
{
id: "main",
default: true,
workspace: "~/.openclaw/workspace-main",
model: { primary: "google/gemini-3-flash-preview", fallbacks: ["ollama/ministral-3:14b", "zai/glm-4.7"] },
subagents: { allowAgents: ["*"], model: "google/gemini-3-flash-preview" }
},
{
id: "ceo",
workspace: "~/.openclaw/workspace-ceo",
model: { primary: "anthropic/claude-opus-4-6", fallbacks: ["google/gemini-3-pro-preview", "ollama/qwen3:80b"] },
subagents: { allowAgents: ["*"], model: "google/gemini-3-pro-preview" },
thinkingDefault: "high"
},
{
id: "frontend",
workspace: "~/.openclaw/workspace-frontend",
model: { primary: "anthropic/claude-sonnet-4-5", fallbacks: ["openai-codex/gpt-5.3-codex", "ollama/qwen3-coder:next"] },
subagents: { allowAgents: ["*"] }
},
{
id: "coding",
workspace: "~/.openclaw/workspace-coding",
model: { primary: "openai-codex/gpt-5.3-codex", fallbacks: ["anthropic/claude-opus-4-6", "ollama/qwen3-coder:next"] },
subagents: { allowAgents: ["*"] }
},
{
id: "vision",
workspace: "~/.openclaw/workspace-vision",
model: { primary: "ollama/qwen3-vl:32b-cloud", fallbacks: ["google/gemini-3-pro-preview", "anthropic/claude-sonnet-4-5"] },
subagents: { allowAgents: ["*"] }
},
{
id: "archive-research",
workspace: "~/.openclaw/workspace-archive",
model: { primary: "google/gemini-3-pro-preview", fallbacks: ["anthropic/claude-opus-4-6", "ollama/qwen3:80b"] },
subagents: { allowAgents: ["*"] }
},
{
id: "navigation",
workspace: "~/.openclaw/workspace-navigation",
model: { primary: "moonshot/kimi-k2.5", fallbacks: ["google/gemini-3-flash-preview", "anthropic/claude-sonnet-4-5"] },
subagents: { allowAgents: ["*"] }
},
{
id: "data-analysis",
workspace: "~/.openclaw/workspace-data",
model: { primary: "minimax/MiniMax-M2.1", fallbacks: ["google/gemini-3-pro-preview", "anthropic/claude-sonnet-4-5"] },
subagents: { allowAgents: ["*"] }
},
{
id: "ops",
workspace: "~/.openclaw/workspace-ops",
model: { primary: "google/gemini-3-flash-preview", fallbacks: ["ollama/ministral-3:14b", "zai/glm-4.7"] },
subagents: { allowAgents: ["*"] }
}
]
}
}
Pasos recomendados para aplicar y verificar
- Guardar el archivo en el host gateway: ~/.openclaw/openclaw.json (haz backup antes).
- Poner las claves en ~/.openclaw/.env o exportar las vars (GEMINI_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY, OLLAMA_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY).
- Reiniciar gateway: openclaw gateway restart (o si usas service: reinicia el servicio correspondiente).
- Verificar modelos y auth:
- openclaw models status
- openclaw models list --all
- openclaw status --all
- (Si usas Ollama local) confirmar con: ollama list y asegúrate OLLAMA_API_KEY=ollama-local (o ajusta baseUrl en models.providers).
- Para OpenAI Codex (OAuth): openclaw models auth login --provider openai-codex
Para Anthropic: openclaw models auth paste-token --provider anthropic (o exporta ANTHROPIC_API_KEY).
Para Gemini: pon GEMINI_API_KEY en ~/.openclaw/.env o usa el plugin indicado según tu método de autenticación.
Notas importantes / Seguridad
- Puse allowAgents: [""] para facilitar sessions_spawn entre agentes (soluciona permisos cross-agent). Esto es poderoso: si quieres más seguridad, reemplaza "" por la lista concreta de agentIds permitidos.
- Por seguridad, sub-agentes siguen sin poder usar herramientas de sesión (sessions_list/history/send/spawn etc.) — eso está bloqueado en el runtime por diseño (deny por defecto). Si necesitas cambiarlo, dime qué comportamiento exacto quieres y lo documentamos/implementamos con más cuidado.
- Cambiar compaction a "default" reduce protecciones de resumen; revisa memoryFlush/backup si dependes de historiales largos.
- Revisa con openclaw security audit después de arrancar.
¿Quieres que:
- escriba esto directamente en ~/.openclaw/openclaw.json y reinicie el Gateway por ti, o
- prefieres que te lo devuelva como archivo para que lo pegues tú?
Si quieres que lo aplique yo, dime y lo escribo y reinicio (o dime dónde quieres cambiar aliases/model IDs exactos si usas nombres distintos — p. ej. si realmente tienes "anthropic/claude-opus-4-5-thinking" y no la 4.6, lo cambio).
Vale — como tu Gemini 3 Flash está definido dentro de tu provider custom models.providers.antigravity-proxy (con id: "gemini-3-flash"), entonces el model ref correcto para usarlo como default es:
antigravity-proxy/gemini-3-flash(nogoogle/...)
Abajo te dejo EXACTAMENTE lo que tienes que añadir o reemplazar en tu openclaw.json (mantén tu meta, wizard, auth, models.providers... tal cual).
1) Añade/Reemplaza tu bloque tools (para evitar bloqueos raros de permisos)
"tools": {
"profile": "coding"
}
codingincluyesessions_spawn(y el resto de tools típicos). Si ya usasfull, déjalo como está.
2) Añade/Reemplaza tu bloque agents (DEFAULT = Gemini Flash + fallbacks por agente + desactivar safeguard)
Este bloque cumple tu tabla:
"agents": {
"defaults": {
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": [
"ollama/ministral-3:14b",
"zai/glm-4.7"
]
},
"compaction": {
"mode": "default"
},
"subagents": {
"maxConcurrent": 4,
"archiveAfterMinutes": 60,
"model": "antigravity-proxy/gemini-3-flash",
"thinking": "low"
},
"models": {
"antigravity-proxy/gemini-3-flash": { "alias": "flash" },
"antigravity-proxy/gemini-3-pro-high": { "alias": "pro" },
"antigravity-proxy/claude-opus-4-5-thinking": { "alias": "opus_thinking" },
"antigravity-proxy/claude-sonnet-4-5": { "alias": "sonnet" },
"openai-codex/gpt-5.3-codex": { "alias": "codex" },
"zai/glm-4.7": { "alias": "glm" },
"minimax/MiniMax-M2.1": { "alias": "minimax" },
"moonshot/kimi-k2.5": { "alias": "kimi" },
"ollama/ministral-3:14b": { "alias": "ministral" },
"ollama/qwen3:80b": { "alias": "qwen80b" },
"ollama/qwen3-coder:next": { "alias": "qwen_coder" },
"ollama/qwen3-vl:32b-cloud": { "alias": "qwen_vl" }
}
},
"list": [
{
"id": "main",
"default": true,
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": ["ollama/ministral-3:14b", "zai/glm-4.7"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "ceo",
"model": {
"primary": "antigravity-proxy/claude-opus-4-5-thinking",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "ollama/qwen3:80b"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "frontend",
"model": {
"primary": "antigravity-proxy/claude-sonnet-4-5",
"fallbacks": ["openai-codex/gpt-5.3-codex", "ollama/qwen3-coder:next"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "coding",
"model": {
"primary": "openai-codex/gpt-5.3-codex",
"fallbacks": ["antigravity-proxy/claude-opus-4-5-thinking", "ollama/qwen3-coder:next"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "vision",
"model": {
"primary": "ollama/qwen3-vl:32b-cloud",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "archive-research",
"model": {
"primary": "antigravity-proxy/gemini-3-pro-high",
"fallbacks": ["antigravity-proxy/claude-opus-4-5-thinking", "ollama/qwen3:80b"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "navigation",
"model": {
"primary": "moonshot/kimi-k2.5",
"fallbacks": ["antigravity-proxy/gemini-3-flash", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "data-analysis",
"model": {
"primary": "minimax/MiniMax-M2.1",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "ops",
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": ["ollama/ministral-3:14b", "zai/glm-4.7"]
},
"subagents": { "allowAgents": ["*"] }
}
]
}
Importante sobre sessions_spawn (para tus “permisos”)
- Lo que te estaba frenando casi seguro era spawn cross-agent: por defecto no deja.
Consubagents.allowAgents: ["*"]ya queda habilitado. - Ojo: sub-agentes no pueden usar tools de sesión (
sessions_*) ni spawn de subagentes desde subagentes. Eso está bloqueado por diseño en runtime (no es “modo safeguard”).
3) Cosas que debes verificar SÍ o SÍ (para que “funcionen correctamente como están”)
Como tu config que pegaste está cortada, no puedo garantizar que existan estos providers/models:
ollama/ministral-3:14b,ollama/qwen3:80b,ollama/qwen3-coder:next,ollama/qwen3-vl:32b-cloudmoonshot/kimi-k2.5minimax/MiniMax-M2.1openai-codex/gpt-5.3-codex
Para confirmar en tu host:
openclaw models list --plain
openclaw models status
Y si usas Ollama:
ollama list
Si algún ID no existe, dime qué te sale en openclaw models list --plain (pega solo las líneas relevantes) y te ajusto los refs exactos.
Si puedes, pega el resto del openai provider (y si tienes ollama, moonshot, minimax en models.providers) y te lo dejo 100% “copy/paste” sin suposiciones.
genera el openclaw json entero para asi lo copie y lo pegue
Aquí tienes un openclaw.json completo (JSON5 válido) ya adaptado a lo que dijimos:
- Default/global =
antigravity-proxy/gemini-3-flash - Compaction safeguard OFF →
agents.defaults.compaction.mode: "default" - Fallbacks por agente según tu tabla
- sessions_spawn permisos cross-agent → en cada agente:
subagents.allowAgents: ["*"] - Incluye un Discord “solo admin” (solo tú puedes usar comandos/directivas y activar al bot). Si tu bot ya tiene un bloque
channels.discordfuncionando, puedes reemplazar el mío por el tuyo.
Copia y pega tal cual, y solo reemplaza los ${...} por tus valores (o ponlos en ~/.openclaw/.env).
{
"$schema": "https://docs.openclaw.ai/schema/openclaw.schema.json",
"meta": {
"lastTouchedVersion": "2026.2.6-3",
"lastTouchedAt": "REPLACE_ME_ISO_TIMESTAMP"
},
"wizard": {
"lastRunAt": "REPLACE_ME_ISO_TIMESTAMP",
"lastRunVersion": "2026.2.6-3",
"lastRunCommand": "doctor",
"lastRunMode": "local"
},
"gateway": {
"name": "Pi_v5.1_Hybrid",
"port": 3456
},
"env": {
"OPENAI_API_KEY": "${OPENAI_API_KEY}",
"ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
"ZAI_API_KEY": "${ZAI_API_KEY}",
"MINIMAX_API_KEY": "${MINIMAX_API_KEY}",
"MOONSHOT_API_KEY": "${MOONSHOT_API_KEY}",
// Ollama: cualquier valor sirve (Ollama no requiere key real)
"OLLAMA_API_KEY": "ollama-local",
// Tu proxy antigravity (OpenAI-compatible)
"ANTIGRAVITY_PROXY_BASE_URL": "${ANTIGRAVITY_PROXY_BASE_URL}",
"ANTIGRAVITY_PROXY_API_KEY": "${ANTIGRAVITY_PROXY_API_KEY}",
// Discord
"DISCORD_BOT_TOKEN": "${DISCORD_BOT_TOKEN}"
},
"auth": {
"profiles": {
"zai:default": { "provider": "zai", "mode": "api_key" }
}
},
"tools": {
"profile": "coding"
},
"models": {
"mode": "merge",
el que debe usar sessionspawn es el default
"providers": {
"antigravity-proxy": {
"baseUrl": "${ANTIGRAVITY_PROXY_BASE_URL}",
"apiKey": "${ANTIGRAVITY_PROXY_API_KEY}",
"api": "openai-completions",
"models": [
{
"id": "gemini-3-flash",
"name": "Gemini 3 Flash",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 8192
},
{
"id": "gemini-3-pro-high",
"name": "Gemini 3 Pro High",
"reasoning": true,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-opus-4-5-20251101",
"name": "Claude Opus 4.5",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-opus-4-5-thinking",
"name": "Claude Opus 4.5 (Thinking)",
"reasoning": true,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 32768
},
{
"id": "claude-sonnet-4-5",
"name": "Claude Sonnet 4.5",
"reasoning": false,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 8192
},
{
"id": "claude-sonnet-4-5-thinking",
"name": "Claude Sonnet 4.5 (Thinking)",
"reasoning": true,
"input": ["text", "image"],
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
"contextWindow": 200000,
"maxTokens": 32768
}
Listo — si lo que quieres es:
- que cuando el agente decida usar
sessions_spawn, el sub‑agente siempre corra con el modelo “default” (Gemini 3 Flash), - y que no tengas que pasar
agentId,
entonces la regla es esta:
1) sessions_spawn (sin agentId) ya usa el agente que lo llamó
Eso es el comportamiento por defecto del tool: si no especificas agentId, el spawn queda en el mismo agentId que está activo en esa conversación.
2) El modelo que usará el sub‑agente lo controlas con:
agents.defaults.subagents.model
En tu caso debe quedar así (y sin overrides por agente):
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": [
"ollama/ministral-3:14b",
"zai/glm-4.7"
]
},
agents: {
defaults: {
subagents: {
model: "antigravity-proxy/gemini-3-flash"
}
}
}
En el JSON completo que te pasé ya está correcto.
Lo único que te pido revisar en tu config final
Asegúrate de que NO exista en ningún agente algo como:
"heartbeat": {
"every": "30m",
"activeHours": { "start": "08:00", "end": "23:00" }
},
// SAFEGUARD OFF
"compaction": { "mode": "default" },
"subagents": {
"maxConcurrent": 4,
"archiveAfterMinutes": 60,
"model": "antigravity-proxy/gemini-3-flash",
"thinking": "low"
},
agents: {
list: [
{ id: "ceo", subagents: { model: "..." } }
]
}
Porque si pones subagents.model a nivel de agente, ese pisará el default para spawns hechos hacia ese agente.
Si quieres, pégame tu agents final (solo esa sección) y te digo si hay algún override que esté rompiendo que “sessionspawn use el default”.
// allowlist + aliases para /model
"models": {
"antigravity-proxy/gemini-3-flash": { "alias": "flash" },
"antigravity-proxy/gemini-3-pro-high": { "alias": "pro" },
"antigravity-proxy/claude-opus-4-5-thinking": { "alias": "opus_thinking" },
"antigravity-proxy/claude-sonnet-4-5": { "alias": "sonnet" },
"openai-codex/gpt-5.3-codex": { "alias": "codex" },
"zai/glm-4.7": { "alias": "glm" },
"minimax/MiniMax-M2.1": { "alias": "minimax" },
"moonshot/kimi-k2.5": { "alias": "kimi" },
"ollama/ministral-3:14b": { "alias": "ministral" },
"ollama/qwen3:80b": { "alias": "qwen80b" },
"ollama/qwen3-coder:next": { "alias": "qwen_coder" },
"ollama/qwen3-vl:32b-cloud": { "alias": "qwen_vl" }
}
},
"list": [
{
"id": "main",
"default": true,
"workspace": "~/.openclaw/workspace-main",
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": ["ollama/ministral-3:14b", "zai/glm-4.7"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "ceo",
"workspace": "~/.openclaw/workspace-ceo",
"model": {
"primary": "antigravity-proxy/claude-opus-4-5-thinking",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "ollama/qwen3:80b"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "frontend",
"workspace": "~/.openclaw/workspace-frontend",
"model": {
"primary": "antigravity-proxy/claude-sonnet-4-5",
"fallbacks": ["openai-codex/gpt-5.3-codex", "ollama/qwen3-coder:next"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "coding",
"workspace": "~/.openclaw/workspace-coding",
"model": {
"primary": "openai-codex/gpt-5.3-codex",
"fallbacks": ["antigravity-proxy/claude-opus-4-5-thinking", "ollama/qwen3-coder:next"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "vision",
"workspace": "~/.openclaw/workspace-vision",
"model": {
"primary": "ollama/qwen3-vl:32b-cloud",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "archive-research",
"workspace": "~/.openclaw/workspace-archive-research",
"model": {
"primary": "antigravity-proxy/gemini-3-pro-high",
"fallbacks": ["antigravity-proxy/claude-opus-4-5-thinking", "ollama/qwen3:80b"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "navigation",
"workspace": "~/.openclaw/workspace-navigation",
"model": {
"primary": "moonshot/kimi-k2.5",
"fallbacks": ["antigravity-proxy/gemini-3-flash", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "data-analysis",
"workspace": "~/.openclaw/workspace-data-analysis",
"model": {
"primary": "minimax/MiniMax-M2.1",
"fallbacks": ["antigravity-proxy/gemini-3-pro-high", "antigravity-proxy/claude-sonnet-4-5"]
},
"subagents": { "allowAgents": ["*"] }
},
{
"id": "ops",
"workspace": "~/.openclaw/workspace-ops",
"model": {
"primary": "antigravity-proxy/gemini-3-flash",
"fallbacks": ["ollama/ministral-3:14b", "zai/glm-4.7"]
},
"subagents": { "allowAgents": ["*"] }
}
]
},
"channels": {
"discord": {
"enabled": true,
"token": "${DISCORD_BOT_TOKEN}",
// “solo admin”: en DMs solo tú; en servers solo tú (y con mention)
"dm": {
"enabled": true,
"policy": "allowlist",
"allowFrom": ["447695592286584832"]
},
"groupPolicy": "open",
"guilds": {
"*": {
"requireMention": true,
"users": ["447695592286584832"]
}
}
}
}
}
Dos notas rápidas (para que no te vuelva a fallar “models not allowed” / “invalid model”)
- Si no tienes exactamente esos modelos en Ollama (ministral/qwen), cambia los IDs en:
agents.defaults.models(allowlist)- y en los
fallbacks/primarydonde los usas.
- Para Codex OAuth (gpt-5.3-codex) necesitas el login en el host del gateway:
openclaw models auth login --provider openai-codex
Si quieres, pégame el output de:
openclaw models list --plain
y te lo ajusto para que los IDs de Ollama/quwen coincidan 1:1 con lo que tienes instalado.
Health check failed: gateway closed (1006 abnormal closure (no close frame)): no close reason
Ese error (WS 1006 “abnormal closure / no close frame”) casi siempre significa: el CLI sí llegó a abrir WebSocket, pero el proceso del Gateway se cayó / reinició / cerró el socket antes de responder (o hay “algo” en ese puerto que no es el Gateway real).
Para saber cuál de los dos es, necesito 4 salidas (en este orden):
- Versión
openclaw --version
- Estado del gateway (lo más importante: Probe target / Listening / Last gateway error / Config cli vs Config service)
openclaw gateway status
- Logs mientras intentas el health check
openclaw logs --follow
(espera a que falle otra vez y pega ~30-80 líneas alrededor del fallo)
- Doctor (detecta config inválida, service mismatch, etc.)
openclaw doctor
Cosas típicas que causan 1006 en tu situación
- El servicio está usando OTRO config (mismatch de profile/state dir): en
openclaw gateway statusmira si saleConfig (cli)distinto aConfig (service). - Config inválido JSON5/JSON (comillas faltantes, trailing commas raras, placeholders mal pegados). Si el gateway crashea al arrancar, lo verás en
openclaw logsoopenclaw doctor. - Puerto equivocado: tú pusiste
gateway.port: 3456. Engateway statusrevisa el Probe target para confirmar que el CLI está probandows://127.0.0.1:3456y no el default18789. - Hay otra cosa escuchando en 3456 (proxy/http server): abre WS y lo cierra (1006).
Pégame aquí el output de esos 4 comandos (puedes censurar tokens), y con eso te digo exactamente qué está cerrando el socket y qué línea de config lo provocó.
Hello @silk heath
I setup several agents and I added heartbeats file for each agents.
But when run, only one - main agent's heartbeat is working.
othewr agent's heartbeat is not working
Having a HEARTBEAT.md file in each agent’s workspace is not enough by itself.
Two common reasons you’ll only see the main agent heartbeat:
1) Heartbeats are only scheduled for agents that have a heartbeat config
Heartbeats are controlled by config (agents.defaults.heartbeat and/or agents.list[].heartbeat), not by the file existing.
Also important rule:
- If any agent in
agents.list[]has aheartbeatblock, then only the agents that have a heartbeat block will run heartbeats.
So either:
Option A (easy): one heartbeat setting for all agents
Put heartbeat only in defaults, and do not set per-agent heartbeat blocks anywhere:
{
agents: {
defaults: {
heartbeat: { every: "30m", target: "last" }
}
}
}
Option B: explicitly enable heartbeat on every agent
Add a heartbeat block to each agent entry:
{
agents: {
list: [
{ id: "main", heartbeat: { every: "30m", target: "last" } },
{ id: "agent2", heartbeat: { every: "30m", target: "last" } }
]
}
}
2) target: "last" needs the agent to have a “last chat destination”
By default heartbeats deliver to target: "last". If you never actually chatted with that agent (or nothing is routed/bound to it), there may be no “last” place to send the heartbeat → so you won’t see anything.
Fix: either message each agent once, or set a specific delivery target (channel/to).
If you paste your agents section (and whether you have any agents.list[].heartbeat blocks), I can tell you exactly which of the two issues you’re hitting.
@silk heath
Which file should I change ?
Or is there any cli?
Change your OpenClaw config file (the one your Gateway service is actually using), not the HEARTBEAT.md files.
1) Find the exact config path the service is using
Run:
openclaw gateway status
Look for the lines like Config (service): ... (that’s the file you must edit).
2) Fix it (two ways)
Option A (recommended): enable heartbeats for all agents globally
Edit that config file and set:
agents: {
defaults: {
heartbeat: { every: "30m", target: "last" }
}
}
And make sure you do not have heartbeat: { ... } only on one agent in agents.list[], otherwise only that agent may run.
Option B: per-agent heartbeats
Add a heartbeat block to each agent in agents.list[].
3) Apply changes
Restart the gateway:
openclaw gateway restart
CLI?
There isn’t a “turn on heartbeat for all agents” single CLI command I can guarantee across versions; the reliable path is editing the config file the service uses (step 1) and restarting.
If you paste the agents part of your config (or just tell me if you have any agents.list[].heartbeat), I’ll tell you exactly what to change.
Hello @silk heath
it still run only one agent
In current OpenClaw versions, this is expected behavior unless you explicitly opt-in other agents:
Why only 1 agent runs heartbeats
If you only set agents.defaults.heartbeat, OpenClaw will run heartbeats only for the default agent.
To run heartbeats for multiple agents, you must add a heartbeat block under each agent in agents.list[] (even an empty {} is enough). Once any agent has a heartbeat block, heartbeats run only for the agents that have that block.
Fix (edit your openclaw.json)
Example:
{
agents: {
defaults: {
heartbeat: { every: "30m", target: "last" }
},
list: [
{ id: "main", default: true, heartbeat: {} },
{ id: "agent2", heartbeat: {} },
{ id: "agent3", heartbeat: {} }
]
}
}
Then:
openclaw gateway restart
Two more gotchas that make it look “not working”
1) HEARTBEAT.md “empty” = heartbeat skipped
If your HEARTBEAT.md is basically just a title/header, OpenClaw skips the run to save cost.
Make sure it has at least one real checklist line, e.g.:
# Heartbeat
- Check pending tasks
2) HEARTBEAT_OK is hidden by default
If the model replies HEARTBEAT_OK, OpenClaw suppresses it (so you won’t see messages even if it’s running).
For debugging, temporarily enable “show OK”:
{
channels: {
defaults: {
heartbeat: { showOk: true, showAlerts: true, useIndicator: true }
}
}
}
If you paste your agents block (just that part), I’ll point out exactly which agents currently have heartbeat enabled and what to add.
hello @silk heath if you dont open powershell as an admin openclaw then wont have admmin rights?
OpenClaw only has the OS permissions of the process that launched it.
So:
- If you run
openclaw ...from a normal PowerShell/Terminal, it runs as your regular user (no admin). - If you run it from PowerShell “Run as Administrator”, then it runs with admin privileges on Windows — but OpenClaw generally doesn’t need that, and it’s usually not recommended (least privilege).
When you do need Admin on Windows
Mostly for Windows networking / firewall / portproxy type tasks, e.g. exposing a WSL service to LAN:
netsh interface portproxy ...New-NetFirewallRule ...
Those specifically require PowerShell as Administrator. (Docs: https://docs.openclaw.ai/platforms/windows)
If you’re running OpenClaw inside WSL2 (recommended)
Windows “Admin PowerShell” does not magically give admin rights inside Linux/WSL.
- OpenClaw runs with your Linux user permissions in WSL.
- If a Linux action needs root, you use
sudoinside WSL, not Windows admin.
About OpenClaw “/elevated”
That’s an OpenClaw tool policy/approval mode, not Windows “Administrator”. It controls how permissive exec/tool calling is — it doesn’t grant OS admin rights by itself.
If you tell me whether you’re on native Windows or WSL2, I can tell you exactly what should/shouldn’t require admin for your setup.
krill why do I get this error on fresh install of openclaw Install failed: songsee — brew not installed
Tip: run openclaw doctor to review skills + requirements.
Docs: https://docs.openclaw.ai/skills
That error is not a core OpenClaw install failure — it’s the skill installer trying to install the bundled skill songsee, and that skill’s only auto-install method is Homebrew.
From the skill metadata, songsee requires the songsee binary and installs via brew formula steipete/tap/songsee. So if brew isn’t installed, OpenClaw can’t auto-install that skill and prints:
Install failed: songsee — brew not installed
You’ve got 3 options:
Option A (recommended on macOS): install Homebrew + songsee
- Install Homebrew (from the official site): https://brew.sh
- Then install the formula:
brew install steipete/tap/songsee
- Re-run:
openclaw doctor
Option B (if you don’t care about that skill): disable the skill
In your openclaw.json add:
{
skills: {
entries: {
songsee: { enabled: false }
}
}
}
Then restart the gateway.
Option C (skip skill setup during onboarding)
If this happened during onboarding/configure, re-run with:
openclaw onboard --skip-skills
If you tell me your OS (macOS vs WSL/Linux), I’ll tell you which option is best. On WSL/Linux, Option B is usually the quickest unless you specifically want songsee.
I´m not on linux and before I did not have this issue
That message is coming from the skills installer, not from OpenClaw “core”.
What changed is: your current OpenClaw version ships (or enabled) a bundled skill called songsee, and that skill’s only auto-install method is Homebrew. If Homebrew isn’t present, it prints:
Install failed: songsee — brew not installed
So OpenClaw itself can still run — it just can’t auto-install that optional skill.
Why you didn’t see it before
Most likely one of these:
- you were on an older OpenClaw version that didn’t try to install
songsee(or didn’t include it) - you previously had Homebrew installed
- you previously ran onboarding with
--skip-skills
Fix options (pick one)
Option 1 (macOS): install Homebrew (then songsee)
If you’re on macOS and want that skill:
- Install brew: https://brew.sh
- Then:
brew install steipete/tap/songsee
Option 2 (recommended if you don’t care about spectrograms): disable the skill
Add this to your openclaw.json:
skills: {
entries: {
songsee: { enabled: false }
}
}
Then restart the gateway.
Option 3: skip skill setup in the wizard
If you’re hitting this during onboarding/configure:
openclaw onboard --skip-skills
# or
openclaw configure --skip-skills
Quick question (so I tell you the best path)
Are you on macOS or Windows? And what does:
openclaw --version
print?
none of them, something must be wrong with my files even uninstalling reinstalling, would uninstalling git and node maybe fix it?
on the other side I get this errror on health check gateway closed (1006 abnormal closure (no close frame)): no close reason
Uninstalling git or node won’t fix either of those issues (and uninstalling Node will usually make OpenClaw stop working entirely, since the Gateway runs on Node).
You’re seeing two separate things:
1) Install failed: songsee — brew not installed
That’s the skills installer trying to set up the bundled skill songsee, which only has a Homebrew install recipe. It’s optional and not required for OpenClaw to run.
If you don’t want that skill, disable it (no brew needed):
Disable via CLI (easy)
openclaw config set skills.entries.songsee.enabled false
openclaw gateway restart
(or edit openclaw.json and add:)
skills: { entries: { songsee: { enabled: false } } }
2) Health check ... gateway closed (1006 abnormal closure...)
1006 means the CLI opened a WebSocket, then the connection got dropped without a clean close — most commonly because the Gateway process is crashing/restarting, you’re probing the wrong port, or the service is using a different config than the CLI.
Please run these and paste the output (you can redact tokens):
openclaw --version
openclaw status --all
openclaw gateway status
openclaw logs --follow
While openclaw logs --follow is running, trigger the health check again so we catch the crash reason in the logs.
Also: check one common footgun
If you changed gateway.port (e.g. to 3456), make sure openclaw gateway status shows the Probe target using that same port. If it’s probing 18789 but your gateway listens on 3456, you’ll get weird “closed”/probe failures.
Once you paste those outputs, I’ll tell you exactly whether it’s:
- config mismatch (
Config (cli)vsConfig (service)), - a startup crash due to invalid config,
- a port conflict,
- or something else causing the WS to drop.
@silk heath what is the command if I am in default model zai glm-4.7 to proxy-antigravity/gemini-3-flash ?
Use the /model command with the full provider/model ref:
/model antigravity-proxy/gemini-3-flash
If you added the alias I suggested (e.g. "alias": "flash" under agents.defaults.models["antigravity-proxy/gemini-3-flash"]), then you can also do:
/model flash
To see what OpenClaw thinks is available right now:
/model list
Yes but how to change it to flash?
@silk heath if setup properly, all agents must have each their subfolder in agents? Or no?m
Yes — in a proper multi‑agent setup, each agent gets its own directory under the state dir.
By default (OPENCLAW_STATE_DIR=~/.openclaw) you’ll end up with:
~/.openclaw/agents/<agentId>/agent/
(per‑agent auth + models registry, e.g.auth-profiles.json,models.json, etc.)~/.openclaw/agents/<agentId>/sessions/
(that agent’s session store + transcripts)
Two details that confuse people:
-
Those folders are often created lazily — if an agent never gets used / never receives routed messages, you might not see its folder yet.
-
You can override with
agents.list[].agentDir, but you should not reuse the sameagentDiracross agents (causes auth/session collisions).
Quick checks:
ls ~/.openclaw/agents
openclaw agents list --bindings
@silk heath what is the best discord guild setuo for multiple personalities organized? All in one chat? Each one in one channel? If each of them go on each guild channel specific for them.... how should I set it up? "GuildID , channelID " ? Is it not possible such a setup ? Is it better other way?
Best practice on Discord for multiple personalities is: one personality = one isolated agent, and route each agent to a dedicated Discord channel (or thread). That keeps context clean and avoids “persona bleeding”.
You have 2 good patterns:
Option A (recommended): 1 agent per personality + 1 Discord channel per agent
Pros: clean separation (workspace, sessions, auth), easy mental model.
Cons: you manage more channels.
How to set it up
- Create channels like
#ceo,#coding,#vision, etc. - Enable Discord Developer Mode → right‑click channel → Copy Channel ID (and copy the Guild ID too).
- In
openclaw.json, set:
agents.list[]for each personabindings[]to map each Discord channel ID → agentIdchannels.discord.guilds.<guildId>.channels.<channelId>.allow: trueso the bot is allowed to read that channel
Example:
{
agents: {
list: [
{ id: "main", default: true, workspace: "~/.openclaw/workspace-main" },
{ id: "ceo", workspace: "~/.openclaw/workspace-ceo" },
{ id: "coding", workspace: "~/.openclaw/workspace-coding" }
]
},
bindings: [
{
agentId: "ceo",
match: {
channel: "discord",
guildId: "YOUR_GUILD_ID",
peer: { kind: "channel", id: "CEO_CHANNEL_ID" }
}
},
{
agentId: "coding",
match: {
channel: "discord",
guildId: "YOUR_GUILD_ID",
peer: { kind: "channel", id: "CODING_CHANNEL_ID" }
}
}
],
channels: {
discord: {
groupPolicy: "allowlist",
guilds: {
"YOUR_GUILD_ID": {
users: ["YOUR_USER_ID"],
channels: {
"CEO_CHANNEL_ID": { allow: true, requireMention: false },
"CODING_CHANNEL_ID": { allow: true, requireMention: false }
}
}
}
}
}
}
Notes:
peer.kind: "channel"+peer.id: "<channelId>"is the key thing.- You can include
guildId(recommended) to make matching more specific.
Docs:
- Multi-agent routing: https://docs.openclaw.ai/concepts/multi-agent
- Discord config: https://docs.openclaw.ai/channels/discord
- Routing/session keys: https://docs.openclaw.ai/channels/channel-routing
Option B (lighter): one agent only, different personalities via per-channel systemPrompt
If you don’t need separate workspaces/auth, you can keep one agent and set different “personality prompts” per Discord channel:
channels: {
discord: {
guilds: {
"YOUR_GUILD_ID": {
channels: {
"CEO_CHANNEL_ID": {
allow: true,
systemPrompt: "You are the CEO persona. Be strategic and concise."
},
"CODING_CHANNEL_ID": {
allow: true,
systemPrompt: "You are the coding persona. Be technical."
}
}
}
}
}
}
Pros: fewer moving parts.
Cons: still shares the same agent workspace + auth; separation is “soft”.
“All in one chat?” (single channel)
I wouldn’t, unless you’re okay with mixed context. If you really want a single place, better: use threads per persona (each thread has its own session key), but you still need routing rules if you want different agents.
If you tell me:
- your Guild ID
- the Channel IDs you want for each persona
- your target agent IDs (
ceo,coding, etc.)
…I’ll paste you a ready-to-copy bindings[] + channels.discord.guilds[...] block for your exact layout.
can I do both all my agents as agent "main" subagents" and also differnt workspace personas for that option A discord setup? @silk heath
lmk
@silk heath Entendido el contexto adicional sobre el enrutamiento de Discord y la necesidad de que los agentes funcionen como subagentes para el agente main. Agradezco la claridad.
Sin embargo, el problema principal que estoy enfrentando y que me impide avanzar con la configuración de subagentes es el persistente error de permisos al intentar usar la herramienta sessions_spawn. El mensaje de error constante es: "agentId is not allowed for sessions_spawn (allowed: none)".
He intentado habilitar esto a través de varias configuraciones en openclaw.json (incluyendo tools.allow para el agente main, tools.agentToAgent.allow y posibles configuraciones globales de sessions_spawn), así como a través de tools-policy.json para el agente main. Lamentablemente, todas estas tentativas han resultado en claves no reconocidas o no han tenido ningún efecto en la resolución del error de permisos.
Parece que existe una restricción de seguridad implícita o un método de configuración muy específico para sessions_spawn que no estoy logrando identificar con la información actual.
¿Tienes alguna indicación o conoces el método exacto para permitir que el agente main (o cualquier agente) utilice sessions_spawn para iniciar otros agentes, superando específicamente el error "agentId is not allowed for sessions_spawn (allowed: none)"?
Ese error viene de una allowlist específica de sessions_spawn, y no se controla con tools.allow, ni con tools.agentToAgent, ni con tools-policy.json.
Qué significa exactamente el error
"agentId is not allowed for sessions_spawn (allowed: none)" aparece cuando el agente que está intentando hacer sessions_spawn quiere spawnear en otro agentId, pero su allowlist subagents.allowAgents está vacía.
En el código, la allowlist sale de:
agents.list[].subagents.allowAgentsdel agente que hace la llamada (el “requester agent”).
Si no la defines, por defecto es [] → o sea allowed: none para cross-agent.
Fix (config exacta)
En tu openclaw.json, dentro de agents.list, en el agent que inicia los subagentes (normalmente main), añade:
Permitir spawnear a cualquier agente
{
agents: {
list: [
{
id: "main",
default: true,
subagents: {
allowAgents: ["*"]
}
},
{ id: "ceo" },
{ id: "coding" },
{ id: "vision" }
]
}
}
O más seguro: permitir solo algunos
{
agents: {
list: [
{
id: "main",
default: true,
subagents: {
allowAgents: ["ceo", "coding", "vision"]
}
}
]
}
}
Después:
openclaw gateway restart