Back to Nanobot

Troubleshooting

docs/troubleshooting.md

0.3.016.9 KB
Original Source

Troubleshooting

Use this page to isolate where a failure lives. Start with the smallest surface that proves the most: local CLI first, then gateway, then WebUI or chat apps.

Fast Diagnosis Order

Run these in order:

bash
nanobot --version
nanobot status
nanobot agent -m "Hello!"

Then, only if the CLI works:

bash
nanobot gateway

This separates failures into layers:

LayerWhat it proves
nanobot --versionInstall and shell command discovery
nanobot statusConfig path, workspace path, active model, and provider summary
nanobot agent -m "Hello!"Config loading, provider/model access, workspace writes, and agent loop
nanobot gatewayChannel startup, cron system jobs, heartbeat, WebUI/WebSocket, and health endpoint

If nanobot agent -m "Hello!" fails, fix that before debugging WebUI, Telegram, Discord, Docker, systemd, or any chat app.

How to Read nanobot status

nanobot status does not call a model. It only checks whether nanobot can find the selected config, selected workspace, active model or preset, and provider setup summary.

The output has this shape:

text
nanobot Status

Config: /path/to/config.json ✓
Workspace: /path/to/workspace ✓
Model: provider/model-name (preset: primary)
Provider A: not set
Provider B: ✓
Local Provider: ✓ http://localhost:11434/v1
OAuth Provider: ✓ (OAuth)

Read it like this:

LineGood signWhat to do if it looks wrong
ConfigIt points to the config file you meant to use and shows .Run nanobot onboard, or pass --config to nanobot agent, gateway, or serve when testing a non-default instance.
WorkspaceIt points to the workspace you meant to use and shows .Run nanobot onboard, create the folder, fix permissions, or pass --workspace on commands that support it.
ModelIt shows the active model or the preset name you expect.Set agents.defaults.modelPreset to the intended preset, or check /model if you changed models during a chat session.
Provider rowsThe provider used by the active preset shows , an OAuth marker, or a local URL.Configure only the active provider first. It is normal for unused providers to say not set.

If nanobot status looks right but nanobot agent -m "Hello!" fails, the install and config paths are probably fine. Continue with Provider and Model Problems.

Installation Problems

Use the same Python command for install checks and module fallback. On macOS/Linux that may be python3; on Windows it may be python or py.

SymptomCheck
python: command not foundTry python3 --version on macOS/Linux or py --version on Windows. Then replace python in docs commands with the command that worked.
curl: command not foundThe macOS/Linux one-command installer could not download the script. Install curl, or use a manual isolated install such as uv tool install nanobot-ai or pipx install nanobot-ai.
irm is not recognizedPowerShell could not run the download helper. Use manual install: uv tool install nanobot-ai, pipx install nanobot-ai, or py -m pip install nanobot-ai inside an environment you control.
Could not download raw.githubusercontent.comYour network, proxy, or firewall blocked the installer script download. Use manual install from PyPI, or configure your proxy and rerun the command.
nanobot: command not foundUse the module form, for example python -m nanobot ..., python3 -m nanobot ..., or py -m nanobot .... Reinstall with the same Python command, or add that Python's scripts directory to PATH.
No module named nanobotYou are running a different Python than the one used for installation. Run python -m pip show nanobot-ai, python3 -m pip show nanobot-ai, or py -m pip show nanobot-ai, matching the command that installed nanobot.
pip is not availableWhen the installer uses a virtual environment, it tries python -m ensurepip --upgrade. If that fails, install pip for that Python, or use a Python installer/distribution that includes pip.
externally-managed-environmentYour system Python blocks global pip installs. Use the one-command installer, uv tool install nanobot-ai, pipx install nanobot-ai, or create a virtual environment; do not add --break-system-packages for nanobot.
Installer chose the wrong PythonSet PYTHON before running the installer, such as `curl -fsSL https://raw.githubusercontent.com/HKUDS/nanobot/main/scripts/install.sh
Editable source install does not updateFrom the repo root, run python -m pip install -e . again with the Python command used for development, then check python -m nanobot --version or nanobot --version.
WebUI build tools missingThey are only needed for WebUI development. Packaged installs already include the WebUI bundle.

Config Problems

Default config path:

text
~/.nanobot/config.json

Default workspace path:

text
~/.nanobot/workspace/

nanobot status reads the default config unless you pass explicit paths. Use the same --config and --workspace across status checks and runtime commands when debugging multiple instances:

bash
nanobot status --config ./bot-a/config.json --workspace ./bot-a/workspace
nanobot agent --config ./bot-a/config.json --workspace ./bot-a/workspace -m "Hello"
nanobot gateway --config ./bot-a/config.json --workspace ./bot-a/workspace

Common config mistakes:

SymptomCheck
JSON parse errorValidate commas, braces, and quotes. Most docs examples are partial snippets to merge.
Unknown or missing providerUse provider registry names such as openrouter, anthropic, openai, ollama, vllm, lm_studio, or define a custom OpenAI-compatible provider key under providers and reference that exact key from the active preset.
snake_case vs camelCase confusionBoth are accepted, but docs use camelCase because nanobot writes config with aliases such as apiKey, modelPresets, intervalS.
Environment variable error${VAR_NAME} references are resolved at startup. Set the variable before running nanobot.
Edited config but behavior did not changeRestart nanobot gateway; long-running processes read config at startup.

To refresh missing defaults without overwriting existing settings, run:

bash
nanobot onboard --refresh

For an interactive choice between resetting and refreshing, run nanobot onboard and choose the option that keeps current values and merges missing defaults.

Provider and Model Problems

First prove the provider in the CLI:

bash
nanobot agent -m "Hello!"

Then compare your config against providers.md.

If you need a known-good snippet instead of diagnosis, use provider-cookbook.md.

SymptomLikely cause
401, unauthorized, invalid API keyKey is missing, expired, pasted with whitespace, or under the wrong provider key.
Model not foundThe model ID belongs to a different provider or gateway.
Provider cannot be inferredPin modelPresets.<name>.provider in the active preset instead of using "auto". For legacy direct configs, pin agents.defaults.provider.
Local model connection refusedOllama, vLLM, LM Studio, or another local server is not running, or apiBase points to the wrong port.
Bedrock validation errorCheck AWS region, credentials, model access, model ID, and whether the model supports Converse.
OAuth provider failsRun the matching login command: openai-codex, xai-grok, or github-copilot, normally with --set-main.
Codex OAuth needs a proxySet providers.openaiCodex.proxy before running the login command. The proxy applies to login, token refresh, and Codex API requests.
Codex login runs on a remote/headless machineOpen the printed URL in a local browser, then paste the final http://localhost:1455/auth/callback?... URL back into the terminal.
Codex login runs in DockerStart the container with docker run -it so the OAuth flow has an interactive terminal.
Codex says a model is not supported with a ChatGPT accountUse provider openai_codex with a Codex model such as openai-codex/gpt-5.6-sol. Do not use the direct-API openai/... prefix with Codex OAuth.
Config says providers.openai_codex conflicts with the built-in providerUnder providers, keep only the canonical openaiCodex settings key and remove a duplicate openai_codex key. A model preset's provider value remains openai_codex.
xAI OAuth needs a proxySet providers.xaiGrok.proxy before login. It applies to OAuth discovery, token exchange/refresh, and Grok subscription requests.
xAI login runs on a remote/headless machineIn the WebUI, finish sign-in in your local browser; if the loopback redirect cannot reach the server, copy the final URL from the address bar into the WebUI dialog. From the CLI, run nanobot provider login xai-grok interactively, open the printed URL elsewhere, and paste the final callback URL or authorization code when prompted.
xAI returns 403 or subscription access deniedConfirm the signed-in account has an eligible X Premium / Grok subscription, then run nanobot provider login xai-grok again. This provider does not use an xAI API key or X Developer OAuth.
xAI returns 400 invalid-argumentRead the bounded Response body appended to the provider error. Hosted x_search is sent only when xAI's model catalog advertises supportsBackendSearch; the model ID grok-4.5 itself is valid.
xAI model or X Search stops working after an upstream releaseThe integration follows Grok Build's public OAuth/proxy client contract. Update nanobot if xAI changes that contract.

Langfuse Problems

Langfuse tracing is optional and controlled by environment variables.

SymptomCheck
LANGFUSE_SECRET_KEY is set but langfuse is not installedInstall langfuse in the same Python environment that runs nanobot, then restart the process.
No traces appearSet LANGFUSE_SECRET_KEY, LANGFUSE_PUBLIC_KEY, and LANGFUSE_BASE_URL before starting nanobot.
Wrong Langfuse project or regionCheck that the key pair and LANGFUSE_BASE_URL come from the same Langfuse project/region.
Only some providers traceLangfuse tracing applies to OpenAI-compatible provider calls; native providers may not use that client path.

See configuration.md#langfuse-observability for setup commands.

Gateway Problems

nanobot gateway is required for WebUI, chat apps, heartbeat, Dream, and long-running channel connections.

Default ports:

SurfaceDefault
Gateway health endpointhttp://127.0.0.1:18790/health
WebUI/WebSocket channelhttp://127.0.0.1:8765
OpenAI-compatible API (nanobot serve)http://127.0.0.1:8900

Common gateway checks:

bash
nanobot gateway --verbose
SymptomCheck
Port already in useChange gateway.port, channels.websocket.port, or the --port CLI flag for the relevant command.
WebUI opened on 18790 but shows nothing usefulOpen 8765; 18790 is the health endpoint.
Config changes ignoredRestart the gateway.
Startup pauses at Installing optional featureAn enabled channel is missing its Python dependencies. See Slow Optional Channel Dependency Installation.
Heartbeat never runsKeep the gateway running, add tasks under <workspace>/HEARTBEAT.md -> ## Active Tasks, and make sure gateway.heartbeat.enabled is true.
Cron jobs disappeared after switching workspacesCron jobs are workspace-scoped at <workspace>/cron/jobs.json; check you are using the intended workspace.

Slow Optional Channel Dependency Installation

Before loading enabled channels, the gateway checks the dependencies declared by their channel manifests. The CLI and WebUI normally install these dependencies when a channel is enabled. Installation during startup is a recovery path for an enabled config whose Python environment no longer has the required packages, for example after manually editing the config, upgrading nanobot, or recreating an isolated uv tool/pipx environment. The gateway waits for the install so an enabled channel is not silently skipped; later starts skip the installation once the dependencies are present.

If access to PyPI is slow in your region, configure pip to use a trusted package index. The installer honors the standard PIP_INDEX_URL environment variable, including when nanobot itself was installed with uv tool:

bash
PIP_INDEX_URL=https://your-trusted-mirror.example/simple nanobot gateway

For the systemd user service created by nanobot gateway install-service, add a drop-in:

bash
systemctl --user edit nanobot-gateway.service
ini
[Service]
Environment="PIP_INDEX_URL=https://your-trusted-mirror.example/simple"

Then reload and restart the service:

bash
systemctl --user daemon-reload
systemctl --user restart nanobot-gateway.service

For a system-level or custom service, use sudo systemctl edit <unit> instead. Prefer an HTTPS index operated by an organization you trust, and do not put index credentials in commands or logs.

WebUI Problems

The packaged WebUI is served by the WebSocket channel.

Minimal config:

json
{
  "channels": {
    "websocket": {
      "enabled": true
    }
  }
}

Then run:

bash
nanobot gateway

Open:

text
http://127.0.0.1:8765

If accessing from another device, bind the WebSocket channel to 0.0.0.0 and set token or tokenIssueSecret. The WebSocket channel refuses public binds without a token or token issue secret.

See webui.md#lan-access for LAN setup and ../webui/README.md for frontend development.

Chat App Problems

Before debugging a chat app:

bash
nanobot agent -m "Hello!"
nanobot channels status
nanobot gateway

Then check:

SymptomCheck
Bot never repliesGateway is not running, the channel is not enabled, or the bot/app token is wrong.
Unknown sender ignoredConfigure allowFrom, pairing, or the channel-specific allow list.
Telegram shows a saved configuration but cannot complete a live checkThe token is saved. Confirm the gateway can reach api.telegram.org, or open Settings → Channels → Telegram → Advanced → Network proxy and enter an HTTP or SOCKS proxy.
Telegram rejects the tokenCopy the current token from BotFather or regenerate it.
Telegram receives no messagesConfirm the channel is enabled, the gateway is running, and the sender is paired or listed in allowFrom.
Discord replies missingEnable Message Content intent and invite the bot with the required permissions.
WhatsApp or WeChat login expiredRe-run nanobot channels login whatsapp or nanobot channels login weixin.
Chat app works but WebUI does notThe provider and gateway are likely fine; debug the WebSocket channel separately.

See chat-apps.md for channel-specific setup.

Tool and Workspace Problems

SymptomCheck
File access deniedCheck tools.restrictToWorkspace and whether the target path is inside the active workspace.
Shell commands fail in DockerSandbox settings may need Linux capabilities; see deployment.md.
Web fetch blockedSSRF protection blocks unsafe targets; use tools.ssrfWhitelist only for trusted private networks.
MCP tools missingCheck tools.mcpServers, server startup command, environment variables, and tool allow list.
Generated artifacts are missingCheck the active workspace and channel media directory.

Memory and Session Problems

SymptomCheck
Conversation context seems wrongConfirm the active workspace and session. WebUI chats and chat app threads may use different sessions.
Memory does not update immediatelyDream consolidation is periodic; recent turns still live in session history.
Old sessions appear after moving configSession files are stored under <workspace>/sessions/; verify the workspace path.
You want one shared session across devicesSet agents.defaults.unifiedSession intentionally; otherwise keep separate sessions.

Collect Useful Evidence

When opening an issue or asking for help, include:

  • install method and nanobot --version;
  • operating system and Python version;
  • the command you ran;
  • relevant nanobot status output;
  • sanitized config snippets, especially provider, model, channel, and tool settings;
  • gateway logs from nanobot gateway --verbose;
  • whether nanobot agent -m "Hello!" works.

Never paste real API keys, bot tokens, OAuth tokens, or private chat IDs into public issues.

If you find a docs mistake, outdated command, or confusing step, please open an issue: https://github.com/HKUDS/nanobot/issues.