Local & self-hosted models
AI for API testing that never leaves your machine.
Bandura runs its AI features against a local LLM. It talks to any OpenAI-compatible
/chat/completions endpoint,
and a local runtime is just another one of those. Point it at
Ollama or LM Studio on localhost and
the chat, flow generation, and the ai-action node all run on your own
hardware. No API key. No prompt, request payload, or response body sent to anyone.
v1.0.0-rc.8 is out now on Windows and Linux. v1.0.0 final, and signed macOS builds, in August 2026.
Why this is the blocker
A useful prompt about an API contains the API.
"Why is this flow failing?" is only answerable if the model can see the request: the host, the headers, the bearer token that was captured two steps ago, and the response body that came back. That is exactly the payload a lot of teams are not allowed to hand to a third party.
It's a data-flow, not a feature
An AI assistant that ships your traffic to a vendor is a transfer your security
review has to approve, document, and re-approve. Pointed at
localhost, there is nothing to approve: the prompt is a local
function call.
The transfer is the thing a reviewer will ask about, so it is written down: every request the app can make, and when.
Some answers are just "no"
Regulated data, customer PII in a staging response, an API under NDA, a disconnected network. In those rooms local-first isn't a preference, it's the precondition. And "we'll redact it first" is not a workflow anyone keeps up.
No credit meter in the middle
Bandura never resells inference. You bring the endpoint; on a local model the marginal cost of a question is your own electricity, so nobody has to ration debugging by budget.
Half the intelligence needs no model at all
Importing, drift detection and self-healing, OpenAPI export, and the local mock server are deterministic code paths. They never call a model, local or otherwise, so they work with the AI switched off entirely.
What runs on your model
All three AI surfaces, not a cut-down offline mode.
Switching the provider changes where the tokens are generated. It does not change which features you get.
The agentic chat
The sidebar chat doesn't just talk about your flows. It calls tools to list them, read them, run one, and check it against your OpenAPI spec, then reasons from what actually came back. Creating or editing a file goes through an in-chat approve/discard gate first. How the chat works →
Flow generation
A sentence in, a runnable .aether flow out. The YAML is
schema-validated before it touches disk, so a model that misunderstands the
format fails loudly instead of leaving you a broken file.
Generating flows →
The ai-action node
A model inside the flow itself: summarise a response, classify a payload, draft the next request's body. It runs in the desktop app, the CLI, and the MCP server alike. Node reference →
Setup
How to connect Bandura to Ollama, start to finish.
Two fields and a button. No account on either side of it.
-
ollama pull llama3.1Ollama serves an OpenAI-compatible API on port
11434while it's running. Pull whichever tool-capable model your hardware is happy with. -
Settings → AI provider → OpenAI-compatibleOpen Settings with ⌘, (Ctrl+, on Windows and Linux), then set Base URL to
http://localhost:11434/v1and Model to the tag you pulled. The model field is free text with suggestions, not a list somebody else curated. -
Leave the API key empty → Test connectionA local runtime needs no key. Test connection sends one tiny message and reports exactly what came back, so a wrong port or an un-pulled model surfaces in a second rather than halfway through a run. If it doesn't come back clean, every failure mode has a named cause.
LM Studio is identical with a different port: start its local server,
load a model, and use http://localhost:1234/v1. Full walkthrough,
including model-choice notes:
Run a local model with Ollama →
Headless
The same endpoint in the CLI, CI, and MCP.
The CLI and the MCP server have no Settings view, so they read the environment. A base URL on its own is enough to select the OpenAI-compatible adapter; there is no provider flag to remember.
# A base URL on its own selects the OpenAI-compatible adapter.
export BANDURA_AI_BASE_URL=http://localhost:11434/v1
export BANDURA_AI_MODEL=llama3.1
bandura run "flows/**/*.aether" # ai-action nodes now call localhost
No key variable is needed for a local endpoint. The full variable list, including
the OPENAI_* fallbacks (so a shell that is already configured needs
nothing new), is in
Connect an AI provider.
CI with no third-party AI in the pipeline
On a self-hosted runner, the model can be served on the same host as the job. The
suite then runs ai-action nodes with no external AI API involved at
all. If nothing is configured, only those nodes fail while the rest of the suite
runs normally.
The trade-off
A 7B model on a laptop is not a frontier model.
Anthropic remains the default and the best-tested path. Here is what actually changes when you move the work onto your own hardware, so you can decide before you install anything.
Tool use is the dividing line
The chat acts by calling tools. A model without reliable tool-calling will hold a conversation and never run anything. That is the single capability to check before blaming the setup, and the app names the failure rather than shrugging. Provider troubleshooting →
Generation fails more, breaks less
Generated flows are schema-validated before they are written, so a weaker model usually loses to the validator rather than producing a file that looks fine and fails at run time. Expect more retries than a frontier model needs.
Model output is never a test result
ai-action output isn't deterministic, locally or hosted. Keep
pass/fail in assertion nodes with concrete
expressions, and let the model do the parts that don't decide whether the build
is green.
Questions, answered straight
FAQ
Which local models work for API testing?
Any model your runtime serves over an OpenAI-compatible /chat/completions endpoint. The model id is a free-text field, not a fixed list. What matters more than size is tool-calling: the chat sidebar works by calling tools (list flows, read a flow, run it, check drift), so a model without reliable tool support will talk but not act. Tool-capable tags such as llama3.1 or qwen2.5-coder are the ones to reach for. Flow generation is schema-validated before anything is written, so a weaker model tends to fail validation rather than write a broken file.
Do I need an API key for Ollama or LM Studio?
No. A local runtime authenticates with nothing, so the key field stays empty and Bandura sends no Authorization header. You need two fields: the base URL (http://localhost:11434/v1 for Ollama, http://localhost:1234/v1 for LM Studio) and the model id, because a local endpoint has no default model to fall back on.
Does anything still leave my machine when the model is local?
Nothing from the AI features: prompts, flow contents, captured tokens, and response bodies all go to your localhost endpoint and nowhere else. Bandura sends no telemetry, and the licence check is offline against a public key compiled into the app. Two things are still true and worth stating. The app asks our public releases list once a day whether a newer version exists, which carries no information about you, your machine, or your flows, downloads nothing without you pressing the button, and is one switch in Settings away from off. And your flows' own requests go where you addressed them: point one at a staging API over the internet and that call is made.
Can I point Bandura at something other than Ollama or LM Studio?
Yes, and there are two seams rather than one. The OpenAI-compatible adapter targets the wire format instead of the vendor, so anything serving OpenAI-style /chat/completions works: a self-hosted inference server, a company-internal gateway, or a hosted endpoint such as OpenAI, Groq, OpenRouter, or Together. You give it a base URL, a model id, and a key if it wants one. Separately, Anthropic and Gemini have native adapters, because neither speaks the OpenAI wire format closely enough for a base-URL swap to work.
Can CI run ai-action nodes against a local model?
Yes. The CLI and the MCP server read the environment instead of Settings, so BANDURA_AI_BASE_URL plus BANDURA_AI_MODEL is the whole configuration. On a self-hosted runner the model can be served on the same host as the job, which means an ai-action suite runs with no third-party AI API in the pipeline at all. With nothing configured, only ai-action nodes fail; every other node type runs unaffected.
How do I switch back to a hosted model later?
One dropdown, with three entries: Anthropic and Gemini have native adapters, and OpenAI-compatible covers everything else including your local endpoint. Keys are held per provider in your operating system's keychain (macOS Keychain, Windows DPAPI, libsecret on Linux), so moving between a local endpoint and a hosted one does not make you paste a key twice, and no key is ever written into settings.json or your workspace.
What does my security team need to see?
The /security/ page, which is written for a reviewer rather than a buyer: the complete list of what crosses the network and when, where flows, credentials and run history sit on disk, how the desktop app is sandboxed, and the answers most vendor questionnaires ask in the order they ask them. Pointing the model at localhost removes the data transfer that review usually turns on, but it does not remove the review.
Keep reading
The rest of the local-first story.
Tests as files in your repo
Plain-YAML flows, reviewed in pull requests, cloned instead of imported. That is the reason a model can read them at all.
An agent that runs your tests
A local MCP server gives Claude Code or Cursor fourteen tools over stdio, on your machine, with no vendor relay in the middle.
The same nodes, headless
ai-action nodes resolve their provider from the environment, so a
pipeline can point them at a model served on the runner itself.
Coming from Postman?
Collections, environments, and pm.* scripts import, and the AI stops
being billed in credits.
Everything else that stays put
A hosted model is the one feature that can call out. That page names the file holding every other piece of your data.
Weighing Insomnia or Bruno?
Both comparisons are written the same way as this page, and both concede the rows those tools win: Insomnia, Bruno.
v1.0.0-rc.8 is out now. v1.0.0 final in August 2026
Your model, your machine, your payloads.
Four things stand between you and a first answer: install it, pull a tool-capable model, paste a base URL, press Test connection. Windows and Linux builds are up now; on a Mac, leave an address and you get the signed build the day it is notarized.
Reading ahead of installing? The Ollama walkthrough covers model choice, and the security page is the one to forward to whoever signs this off.