LLM providers

Point BusyBro's brain at Anthropic (the default), an OpenAI-compatible endpoint, or a local model — bring your own API key (value-blind, stored in the Vault by name), override the base URL, and keep your memory across providers.

BusyBro's brain runs on Anthropic's Claude by default — but you can point it at a different LLM provider, bring your own API key, or even route it through a self-hosted or local model. This page covers the three provider options, how the API key stays value-blind in the Vault, the base-URL override and its SSRF policy, what changes about BusyBro's capabilities on each provider, and why your memory stays intact when you switch.

You configure all of this in the dashboard under Settings → BusyBro → Settings → Provider (the "Provider connector"). Changing the provider is admin-only and confirmed — it affects every BusyBro surface (the dashboard chat, the @busybrobot Telegram bot, and MCP) at once.

The provider options

BusyBrobrainAnthropic adapterOpenAI-compatibleOpenAI-compatibleClaude (api.anthropic.com)hosted /v1 endpointlocal model via tunnelpick adapter

Anthropic (the default)

BusyBro talks directly to Anthropic's Claude using the native Messages wire format. This is the default and is byte-identical to how BusyBro has always behaved — leave everything in the connector at its defaults and nothing changes.

The model is a closed picker: Opus (most capable), Sonnet (balanced — the default), or Haiku (fastest and cheapest). This is the only provider that gets Anthropic prompt-caching (see below) and BusyBro's full set of tools.

OpenAI-compatible

Point BusyBro at any public endpoint that speaks an OpenAI-shaped /v1 chat-completions API — a hosted provider, an aggregator like OpenRouter, vLLM, LM Studio's /v1, or a LiteLLM proxy. The model is free-text: type whatever model id your endpoint serves (gpt-4o, gemini-2.5-pro, llama3.1, and so on).

BusyBro's adapter translates the brain's own request and response shapes to and from the OpenAI format — you don't need to do anything beyond setting the base URL, the model id, and the API key.

Local (Ollama)

A genuinely-local model also runs through the OpenAI-compatible provider, with one important caveat about reachability (see Local models). When BusyBro detects an Ollama endpoint, it uses Ollama's native /api/chat rather than the /v1 compatibility path — the /v1 path drops tool-call deltas when streaming, so the native API is required for BusyBro's tools to work.

API key — value-blind, stored in the Vault by name

BusyBro never asks you to paste an API key into the connector. Instead you choose the name of a secret you've stored in the dashboard Settings → Environment → Secrets tab. The key's value is write-only in the Secrets tab — it is encrypted at rest, resolved on the server only at request time, and is never shown, stored, or echoed anywhere in the connector or in any read of BusyBro's settings.

Connector(stores a NAME)Vault Secrets tab(encrypted value)Brain, server-side(resolved at runtime)references by namedecrypts once

To rotate a key, you have two options:

  • Update the secret's value in the Secrets tab — the name stays the same, so the connector needs no change; or
  • Point the provider at a different secret name in the connector.

As of dashboard build 439 / busybro build 50, this applies to Anthropic too — the connector is symmetric across every provider. For Anthropic, leaving the API-key field unset means BusyBro uses the platform default: the built-in api.anthropic.com host with the server's ANTHROPIC_API_KEY, which is byte-identical to the behaviour before this change. Setting a Vault secret name routes Anthropic through your own key instead.

The key value comes from you, never from BusyBro. Even the free-text chat brain can only list secret names — it can never create, change, or read a secret's value.

Base URL override and SSRF policy

The Base URL field is an optional override that applies to every provider, including Anthropic:

  • Unset — each provider uses its built-in default. For Anthropic that's api.anthropic.com; an OpenAI-compatible provider requires a base URL.
  • Set — BusyBro dials your endpoint instead. For Anthropic, this lets you route through an Anthropic-Messages-format gateway while keeping the native wire format.

A base URL must be a public https:// URL. The server validates it against an SSRF policy and rejects anything that targets a local or internal host — http://, localhost, loopback addresses, private ranges (10.x, 192.168.x, 172.16–31.x), CGNAT, link-local and cloud-metadata addresses, and .local / .internal hostnames. A rejected URL is coerced to empty, so BusyBro falls back to the provider's default host rather than dialing a forbidden target. This guard applies to the Anthropic base URL just like any other.

Capabilities by provider

BusyBro tiers the tools it offers by provider, because tool-selection accuracy degrades sharply once a model is shown a large tool surface — and a wrong pick on a destructive tool is dangerous.

ProviderCapability tierWhat BusyBro can do
AnthropicfrontierThe full tool surface — every read and write across the dashboard, RBAC-scoped to your role, plus multi-step delegation (run_task).
OpenAI-compatible / localrestrictedA small, read-only safe core — live status and diagnostics, device and service-group listings, traffic summaries, project grounding, and memory recall. No writes, no destructive actions, and run_task delegation is frontier-only.

These tiers are a filter on what the model even sees — they never grant anything. Your role's permissions, the admin and confirm gates, and ownership checks all still apply on top, on every provider. So a non-Anthropic model is limited to safe diagnostics, and even a tool it somehow names outside that set is refused.

Your memory is portable across providers

Switching the chat provider preserves everything BusyBro remembers — both your personal memory and the team memory.

That's because memory is decoupled from the chat model. The embedder BusyBro uses for recall is fixed at gte-small (384 dimensions) regardless of which provider answers your messages. A fact you taught BusyBro on Anthropic is recalled exactly the same way after you switch to an OpenAI-compatible or local provider.

Prompt caching

Anthropic supports prompt-caching: BusyBro's large static instruction-and-docs prefix is cached, so each turn is cheaper. BusyBro keeps the native Anthropic wire format and prompt-cache even when you set a custom key or base URL for Anthropic — an Anthropic gateway that speaks the Messages format still benefits.

Non-Anthropic adapters do not get Anthropic prompt-caching. On an OpenAI-compatible or local provider, the static prefix is re-read at full price every turn, which means higher cost per response. This is a cost trade-off only — it has no effect on correctness or on your memory.

Local models

A "local" model means one your cloud brain can reach over the public internet — BusyBro runs as a cloud function and cannot dial your laptop's localhost. To use a model running on your own machine, expose it through a public tunnel (for example cloudflared or ngrok) and put that tunnel's https:// URL in the Base URL field.

Two common setups:

  • Ollama — tunnel it and point the base URL at the tunnel. BusyBro uses Ollama's native /api/chat automatically.
  • LM Studio / LiteLLM — both can front a local model with an Anthropic-Messages-format endpoint. Set Anthropic as the provider with that tunnel as the base URL, and BusyBro keeps its native wire format (and prompt-cache) end to end.

Keep in mind that a tunnel to a laptop is only up while your machine is awake and the tunnel is running — if it goes down, BusyBro will fail on every turn across all surfaces until it's reachable again.

Where this lives

The connector is in the dashboard at Settings → BusyBro → Settings → Provider. The same configuration is reachable over MCP via the get_busybro_settings / set_busybro_settings tools (admin + confirm), so an external agent sees and edits the identical settings. See What it can do for how BusyBro's permissions keep it safe, and In the dashboard for the chat panel itself.