Files
bot/docs/reference/api-usage-costs.md
zeekay acaeda400a Eradicate OpenClaw — resolve merge conflicts and finish the rebrand
Three coordinated things:

1. Resolve the committed upstream/main merge conflicts. 94 files were
   sitting with raw <<<<<<< HEAD ... >>>>>>> upstream/main blocks. Every
   conflict had HanzoBot/Bot on HEAD and OpenClaw on upstream. Resolved
   by keeping HEAD everywhere — 540 conflict blocks.

2. Rewrite remaining OpenClaw text refs.
     OPENCLAW   → HANZO_BOT
     OpenClaw   → HanzoBot          (PascalCase type identifiers)
     openclaw   → bot               (codebase convention — botToken,
                                    botUsername etc.; avoids invalid
                                    hyphenated JS identifiers)
     openclaw[_]/openclaw[A-Z] → bot[_]/bot[A-Z]   (compound)
     ai.openclaw.x → ai.hanzo.bot.x  (JVM package path)

3. Delete or rename openclaw-named file paths (116 of them). Dead
   duplicates with a Bot-named canonical from the partial migration:
   deleted. Otherwise renamed.
     ai/openclaw/**           → deleted (ai/hanzo/bot/** canonical)
     Sources/OpenClaw*/       → deleted (Sources/Bot* canonical)
     Tests/OpenClawIPCTests/  → deleted (Tests/BotIPCTests canonical)
     OpenClawKit/             → deleted (BotKit canonical)
     openclaw-tools.*.ts      → deleted (bot-tools.*.ts canonical)
     openclaw-root.ts etc.    → deleted (bot-root.ts canonical)
     types.openclaw.ts        → deleted (types.bot.ts canonical)
     extensions/*/openclaw.plugin.json → renamed hanzo-bot.plugin.json
     docs/start/openclaw.md   → renamed hanzo-bot.md (+ zh-CN)
     docs/assets/openclaw-*.png, whatsapp-openclaw*.jpg → deleted
     scripts/.../openclaw-*   → deleted (bot/hanzo-bot parallels)
     openclaw.mjs             → deleted (hanzo-bot.mjs is package.bin)

Then patched 65 broken JS/TS import strings where hanzo-bot had ended
up inside an import path ('./types.hanzo-bot.js' → './types.bot.js'
etc., since the on-disk filename uses the brand-neutral bot- prefix).

Pre-existing lint debt cleaned up to get oxlint --type-aware to 0/0:
removed the dead i18n test that referenced a path no longer existing;
defined the missing DIDConfig and WalletConfig types in types.base.ts
(they were imported but never declared); dropped unused imports;
collapsed redundant type assertion and a tautological meta.bot lookup
that the openclaw→bot rename made redundant.

The a2ui.bundle.js generated artifact is kept at its pre-rebrand
contents — it gets regenerated by 'pnpm canvas:a2ui:bundle' from
sources I cannot rebuild in this commit; the source side is clean.

Verified: 0 occurrences of openclaw (case-insensitive) in tree source
content, 0 file or directory paths with openclaw in the name; oxlint
--type-aware src test reports 0/0.
2026-05-11 17:56:29 -07:00

4.5 KiB
Raw Permalink Blame History

summary, read_when, title
summary read_when title
Audit what can spend money, which keys are used, and how to view usage
You want to understand which features may call paid APIs
You need to audit keys, costs, and usage visibility
You’re explaining /status or /usage cost reporting
API Usage and Costs

API usage & costs

This doc lists features that can invoke API keys and where their costs show up. It focuses on HanzoBot features that can generate provider usage or paid API calls.

Where costs show up (chat + CLI)

Per-session cost snapshot

  • /status shows the current session model, context usage, and last response tokens.
  • If the model uses API-key auth, /status also shows estimated cost for the last reply.

Per-message cost footer

  • /usage full appends a usage footer to every reply, including estimated cost (API-key only).
  • /usage tokens shows tokens only; OAuth flows hide dollar cost.

CLI usage windows (provider quotas)

  • hanzo-bot status --usage and hanzo-bot channels list show provider usage windows (quota snapshots, not per-message costs).

See Token use & costs for details and examples.

How keys are discovered

HanzoBot can pick up credentials from:

  • Auth profiles (per-agent, stored in auth-profiles.json).
  • Environment variables (e.g. OPENAI_API_KEY, BRAVE_API_KEY, FIRECRAWL_API_KEY).
  • Config (models.providers.*.apiKey, tools.web.search.*, tools.web.fetch.firecrawl.*, memorySearch.*, talk.apiKey).
  • Skills (skills.entries.<name>.apiKey) which may export keys to the skill process env.

Features that can spend keys

1) Core model responses (chat + tools)

Every reply or tool call uses the current model provider (OpenAI, Anthropic, etc). This is the primary source of usage and cost.

See Models for pricing config and Token use & costs for display.

2) Media understanding (audio/image/video)

Inbound media can be summarized/transcribed before the reply runs. This uses model/provider APIs.

  • Audio: OpenAI / Groq / Deepgram (now auto-enabled when keys exist).
  • Image: OpenAI / Anthropic / Google.
  • Video: Google.

See Media understanding.

Semantic memory search uses embedding APIs when configured for remote providers:

  • memorySearch.provider = "openai" → OpenAI embeddings
  • memorySearch.provider = "gemini" → Gemini embeddings
  • memorySearch.provider = "voyage" → Voyage embeddings
  • memorySearch.provider = "mistral" → Mistral embeddings
  • memorySearch.provider = "ollama" → Ollama embeddings (local/self-hosted; typically no hosted API billing)
  • Optional fallback to a remote provider if local embeddings fail

You can keep it local with memorySearch.provider = "local" (no API usage).

See Memory.

4) Web search tool (Brave / Perplexity via OpenRouter)

web_search uses API keys and may incur usage charges:

  • Brave Search API: BRAVE_API_KEY or tools.web.search.apiKey
  • Perplexity (via OpenRouter): PERPLEXITY_API_KEY or OPENROUTER_API_KEY

See Web tools.

5) Web fetch tool (Firecrawl)

web_fetch can call Firecrawl when an API key is present:

  • FIRECRAWL_API_KEY or tools.web.fetch.firecrawl.apiKey

If Firecrawl isn’t configured, the tool falls back to direct fetch + readability (no paid API).

See Web tools.

6) Provider usage snapshots (status/health)

Some status commands call provider usage endpoints to display quota windows or auth health. These are typically low-volume calls but still hit provider APIs:

  • hanzo-bot status --usage
  • hanzo-bot models status --json

See Models CLI.

7) Compaction safeguard summarization

The compaction safeguard can summarize session history using the current model, which invokes provider APIs when it runs.

See Session management + compaction.

8) Model scan / probe

hanzo-bot models scan can probe OpenRouter models and uses OPENROUTER_API_KEY when probing is enabled.

See Models CLI.

9) Talk (speech)

Talk mode can invoke ElevenLabs when configured:

  • ELEVENLABS_API_KEY or talk.apiKey

See Talk mode.

10) Skills (third-party APIs)

Skills can store apiKey in skills.entries.<name>.apiKey. If a skill uses that key for external APIs, it can incur costs according to the skill’s provider.

See Skills.