Bruno API Client | Blog & News

How to Connect Local AI Models to Bruno AI: Ollama and LM Studio

Written by Ganesh Patil | Sep 25, 2026

 

A good chunk of API testing is repetitive. Writing the same status-code assertion for the twentieth endpoint, documenting a request you already understand, or squinting at a 401 to work out which header is wrong. That is the kind of manual work an AI assistant removes well and Bruno v4 ships one. What makes it interesting is that it does not require a cloud provider at all. You can point it at a model running on your own laptop through Ollama or LM Studio, and no request, header, or response ever leaves your machine.

This guide covers what local models are, why you would choose one, how to run them with Ollama and LM Studio, and exactly how to wire them into Bruno. If you want the background on how AI was designed into Bruno in the first place — the bring-your-own-key model and the redaction layer then read Introducing AI in Bruno: Your Key, Your Provider, Your Data Stays Put first.

AI in Bruno is completely optional

The entire feature sits behind a single switch in Preferences and is off by default on a fresh install. While it is off, no context is built, no key is read, and no request goes out. If you never turn it on, Bruno behaves exactly as it always has. Nothing in this guide is required to use Bruno.

Table of Contents

What Are Local / Open Models?

When you use a hosted assistant, your prompt travels over the internet to a provider's servers, a model you cannot inspect generates a reply, and the reply comes back. You are renting access to weights someone else owns.

An open-weight model is one whose trained parameters are published for download as families such as Llama, Qwen, Mistral, Gemma, and DeepSeek. Because you can download the weights, you can run the model on your own hardware. That is what "running a local model" means: a program on your laptop loads a multi-gigabyte file into memory and generates text on your own CPU or GPU.

Ollama and LM Studio are the two most popular tools for doing this. Both handle the download, the memory management, and  crucially for Bruno both expose a small local web server that speaks the OpenAI API format. That shared format is the bridge: as far as Bruno is concerned, a model running on localhost looks the same as one running in a data centre.

Where the request goes

Hosted provider

Bruno ▶ the internet ▶ Provider's model

Local model

Bruno ▶ localhost:11434 ▶ Model on your machine

With a local model the traffic never leaves your loopback interface. Unplug the network and it still works.

Benefits of Using Local Models

Nothing leaves your machine

The strongest argument. For regulated industries, air-gapped environments, or anyone who cannot send production traffic shapes to a third party, this turns AI assistance from a compliance conversation into a non-issue.

No per-token cost

You pay in electricity and disk space, not per request. That matters most for inline autocomplete, which can fire on every keystroke and would otherwise quietly run up a bill.

Works offline

On a plane, behind a restrictive corporate proxy, or during an outage at your provider, the assistant keeps working because it is a process on your own computer.

No rate limits or lock-in

Swap models freely, pin a version that works, and keep using it. Nobody deprecates your model out from under you or throttles you mid-session.

The honest trade-offs

Local models are genuinely useful for this workload, but it is worth setting expectations before you spend an hour on setup:

  • Quality is lower than frontier hosted models. A 7B model running on a laptop will not match Claude Opus or GPT-5 at complex reasoning. For generating a test assertion or a docstring, it is usually fine. For "explain this gnarly distributed failure", it is not.
  • Speed depends entirely on your hardware. On an Apple Silicon Mac or a machine with a decent GPU, a 7B model is fast. On an older laptop running CPU-only, expect to wait.
  • They eat RAM. A loaded model occupies memory for as long as it is running, alongside Bruno and everything else you have open.
  • Setup is on you. No support ticket when a model misbehaves, you swap it for a different one.

A practical middle ground: use a small fast local model for inline autocomplete, and a hosted model for the chat sidebar when you need real reasoning. Bruno lets you configure both at once and pick per surface.

Picking a Model for Your Hardware

Model names carry a parameter count as 7b means seven billion parameters. Bigger is smarter and slower. Nearly every model you download is quantized, which compresses the weights to roughly half the size at a small quality cost. The default quantization in both Ollama and LM Studio (Q4) is the right choice for almost everyone.

Use this as a rough guide. The memory column means unified memory on Apple Silicon, or VRAM on a discrete GPU:

Model size Download size (Q4) Comfortable memory Good for
3B ~2 GB 8 GB Autocomplete only. Fast, limited reasoning.
7B – 8B ~4–5 GB 16 GB The sweet spot. Tests, docs, scripts, autocomplete.
13B – 14B ~8–9 GB 24 GB Noticeably better chat answers.
32B ~20 GB 36–48 GB Strong results, too slow for autocomplete.
70B ~40 GB 64 GB+ Workstations only.

For API work specifically, a code-tuned 7B model is the best starting point for something from the Qwen Coder or DeepSeek Coder families. They were trained heavily on code, so they produce cleaner JavaScript for Bruno's test and script editors than a general chat model of the same size.

Rule of thumb: if the download size is larger than about two-thirds of your free memory, pick the next size down. A model that does not fit spills to disk and becomes unusably slow rather than simply failing.

Running Local Models with Ollama

Ollama is the lighter of the two. It runs as a background service with a command-line interface, and it starts an OpenAI-compatible server automatically and there is no "start server" button to find.

Step 1:  Install Ollama

Download the installer for macOS, Windows, or Linux from ollama.com/download. On Linux you can use the install script:

curl -fsSL https://ollama.com/install.sh | sh

Confirm it is running:

ollama --version

Step 2: Pull a model that fits your machine

Pick one line based on the hardware table above:

# 8 GB machine — small and quick, best for autocomplete
ollama pull qwen2.5-coder:3b

# 16 GB machine — recommended default for API work
ollama pull qwen2.5-coder:7b

# general-purpose alternative at the same size
ollama pull llama3.1:8b

# 24 GB or more — better reasoning in the chat sidebar
ollama pull qwen2.5-coder:14b

Verify the download and note the exact name in the first column because you will need it in Bruno:

ollama list

NAME                     ID              SIZE      MODIFIED
qwen2.5-coder:7b         2b0496514337    4.7 GB    2 minutes ago

Step 3: Confirm the OpenAI-compatible endpoint

Ollama listens on port 11434 and exposes an OpenAI-compatible API under /v1. Test it before touching Bruno — if this fails, Bruno will fail too:

curl http://localhost:11434/v1/models

A JSON list of your installed models means you are ready. Keep these two values handy:

Field Value for Ollama
Base URL http://localhost:11434/v1
Model ID Exactly as shown by ollama list, tag included for example qwen2.5-coder:7b

Ollama does not require authentication for local connections. Bruno's API key field is optional for custom endpoints — leave it empty, or put in any placeholder such as ollama if you prefer not to leave it blank.

Running Local Models with LM Studio

LM Studio is the graphical alternative. If you would rather browse models with a search box, see download sizes before committing, and start a server with a toggle, this is the better fit. It also shows you live logs of every request Bruno sends, which is genuinely useful when debugging the connection.

Step 1: Install LM Studio

Download the desktop app for macOS, Windows, or Linux from lmstudio.ai and install it like any other application.

Step 2: Download a model

1

Open the Discover tab (the magnifying glass in the left sidebar).

2

Search for a model  qwen2.5-coder-7b-instruct is a good default for API work.

3

Check the quantization list. LM Studio flags which variants fit your machine and pick a Q4 build unless you have memory to spare.

4

Click Download and wait for it to finish.

Step 3: Start the local server

This is the step people miss. Unlike Ollama, LM Studio does not serve an API until you switch the server on.

1

Open the Explore tab (in older builds this is called Local Server).

2

Select the model you downloaded from the loader at the top.

3

Toggle the server to Running. The panel shows the address it is listening on, normally http://localhost:1234.

4

Copy the model identifier shown next to the loaded model. LM Studio uses this exact string as the model ID.

Verify from a terminal:

curl http://localhost:1234/v1/models
Field Value for LM Studio
Base URL http://localhost:1234/v1
Model ID The identifier in the server panel — for example qwen2.5-coder-7b-instruct

Ollama or LM Studio?

Choose Ollama if

  • You are comfortable in a terminal
  • You want it running in the background always
  • You want the lightest possible footprint
  • You may script or automate model pulls

Choose LM Studio if

  • You prefer a graphical interface
  • You want to browse and compare models
  • You want request logs while debugging
  • You like to tune context length and GPU offload visually

Both expose the same OpenAI-compatible API, so Bruno treats them identically. Only the port and the model ID differ.

How to Integrate a Local Model with Bruno

Bruno also supports hosted providers

If you would rather use a frontier model, OpenAI (GPT-4o, GPT-5) and Anthropic (Claude Opus 4.7, Sonnet 4.6, Haiku 4.5) are first-class providers. You paste an API key and pick a model. Local endpoints and hosted providers can be configured side by side.

Docs: Bruno AI introduction · Configuration · Usage

Requirements: Bruno v4.0.0 or later. AI features are currently in Beta.

Make sure Ollama is installed, or the LM Studio server is toggled on, before you start. Bruno will try to reach the endpoint as soon as you save it.

Step 1: Turn on AI features

1

Open Preferences from the bottom-left corner of Bruno.

2

Click the AI tab. It has three sections: Configuration, Autocomplete, and Security.

3

Toggle AI Features on at the top of Configuration.

Step 2: Add your local model as an OpenAI-compatible endpoint

This is the key step. Local models do not go under the OpenAI or Anthropic rows — they go under OpenAI-Compatible Endpoints.

1

Under Providers, find OpenAI-Compatible Endpoints and click + Add endpoint.

2

Fill in the three fields:

  • Name - a label for you, such as lm-studio (local)
  • Base URL - http://localhost:11434/v1 for Ollama, or http://localhost:1234/v1 for LM Studio
  • API Key - optional for local servers. Leave it empty or use a placeholder.
3

Under Models, add the model ID exactly as your tool reports it — llama-3.2:3b for Ollama, llama-3.2-3b-instruct for LM Studio. You can add a friendly label alongside it.

4

Click Save. The model now appears in the picker next to the built-in providers.

The two most common mistakes: forgetting the /v1 suffix on the base URL, and dropping the tag from the model ID (writing qwen2.5-coder instead of qwen2.5-coder:7b). Both produce a connection or model-not-found error.

Step 3: Pick a default model and configure autocomplete

Set your local model as the default, then open the Autocomplete section. Trigger mode matters more with a local model than a hosted one, because every suggestion costs you real compute:

Mode Behaviour With a local model
Aggressive Suggests on every keystroke Only on a fast GPU with a 3B model
Debounced (default) Suggests after you pause typing Recommended. Good balance.
Manual Only when you press ⌘ \ Best on modest hardware

The keymap is the same regardless of provider: Tab accepts the full suggestion, ⌘ → accepts one word, Esc dismisses, and ⌘ \ triggers manually.

Step 4: Leave the security defaults alone

Bruno redacts sensitive data before building any prompt: Authorization and other credential headers, body keys like password and *_token, secret environment variables, and response bodies (which are sent as a type-only shape, so "sk-abc123" becomes "<string>"). All four rules are on by default.

With a local model you could argue the redaction is redundant, since the data is not leaving your machine anyway. Leave it on regardless. It costs you nothing in quality and the model still sees key names, structure, and types, which is all it needs to write a correct assertion and it means the day you switch that default to a hosted model, you are not suddenly leaking production tokens.

If your organisation is on the Ultimate Edition, License Administrators can centrally govern which providers and models are permitted via AI Policy is worth checking before you roll local endpoints out to a team.

Using It: Tests, Docs, Scripts, and Debugging

Once the endpoint is saved, every AI surface in Bruno works the same way it would with a hosted provider. Generated output always arrives as a proposal you review — click Apply to insert it or Back to discard. Nothing is written to your files without your click.

Generate tests

Open the Tests tab on a request, folder, or collection, click the AI icon, and describe what to assert.

"Check the status is 200 and the response contains a user id"

Generate documentation

Open the Docs tab, click the AI icon, and describe the endpoint or workflow.

"Creates a new user and returns the created user object"

Generate scripts

Open the Script tab, click the AI icon, and describe the pre-request or post-response logic you need.

"Set the Authorization header using the token from the response body"

Debug with the chat sidebar

Click the AI icon in the top sidebar. The chat knows your open request, active environment, and last response shape.

"Why is this request returning 401?"

Getting better results from a smaller model

A 7B model rewards specific prompts far more than a frontier model does. Vague instructions produce vague output. A few habits that help:

  • Name the fields. "Assert that data.user.id is a number and data.user.email is a string" beats "write tests for this".
  • Send the request first. With a response in hand, the assistant sees the actual shape and picks correct property paths instead of guessing.
  • Ask for one thing at a time. Small models drift when asked to generate tests, docs, and a script in one go.
  • Use a code-tuned model for code surfaces. The difference between a general 7B chat model and a 7B coder model is very visible in the Tests and Script tabs.
  • Reroll rather than fight. Regenerating is cheap when inference is free.

Troubleshooting

Symptom Likely cause and fix
Connection refused The server is not running. For LM Studio, check the Developer tab toggle. Confirm with curl http://localhost:11434/v1/models.
404 on requests The /v1 suffix is missing from the Base URL.
Model not found The ID does not match. Compare against ollama list or the LM Studio server panel, including the tag.
Very slow responses The model is too large for your memory and is spilling to disk. Drop to a smaller size or a lower quantization.
Autocomplete lags while typing Switch the trigger mode to Debounced or Manual, or assign a smaller model to autocomplete.
Output is malformed or rambling Expected from very small models. Move to a 7B code-tuned model and make the prompt more specific.
Nothing happens at all The master AI Features toggle is still off, or you are on a Bruno build older than v4.0.0.

Wrap Up

The setup is short: install Ollama or LM Studio, pull a model that fits your memory, then add it in Bruno under Preferences → AI → OpenAI-Compatible Endpoints with a base URL of http://localhost:11434/v1 or http://localhost:1234/v1. Ten minutes, most of it download time.

What you get is an assistant that writes your repetitive assertions and docstrings without a subscription, without a rate limit, and without a single byte crossing your network boundary. For teams where sending API traffic to a third-party model was never going to clear review, that difference is the whole point.

And if you decide it is not for you, the toggle goes back off and Bruno is exactly the API client it was before.

Continue reading