The short answer:
If you are running Qwen through Ollama, you already have an OpenAI-compatible endpoint at http://localhost:11434/v1. Point any OpenAI SDK or tool at that base URL, use a placeholder API key, and use your local model name. The same pattern works with llama.cpp’s server and other runtimes. The hard part is not the protocol—it is deciding how far you want to expose the endpoint and how you will keep it under control.
Who This Is For
This guide is for developers who already have a local Qwen model running (usually via Ollama) and now want their own code, scripts, or tools to call it the same way they would call a hosted OpenAI API. You do not need to build a custom server from scratch.
Why OpenAI Compatibility Matters
Most modern tools, agents, and SDKs already speak the OpenAI Chat Completions shape:
POST /v1/chat/completions
A messages array
A model field
Optional streaming, tools, and other familiar parameters
When a local runtime exposes the same surface, you can swap the base URL and keep almost everything else the same. That is the practical value: less glue code and fewer one-off integrations.
The Easiest Path: Ollama
Ollama serves an OpenAI-compatible API by default.
Base URL
text
http://localhost:11434/v1Default binding
Ollama listens on 127.0.0.1:11434 (loopback only) unless you change it. That is the safe default for a single machine.
1. Confirm the server is up
Bash
curl http://localhost:11434/v1/modelsYou should see a list of models Ollama knows about. If the connection is refused, start the server (ollama serve or ensure the background service is running) and make sure you have pulled at least one model.
2. Test chat completions with curl
Bash
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5:7b",
"messages": [
{"role": "user", "content": "Reply with a short greeting."}
]
}'Replace the model name with whatever tag you actually pulled.

3. Use the official OpenAI Python client
Python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # required by the client library; ignored by Ollama
)
response = client.chat.completions.create(
model="qwen2.5:7b",
messages=[
{"role": "user", "content": "Explain quantization in one sentence."}
],
)
print(response.choices[0].message.content)The same pattern works in JavaScript and other official OpenAI SDKs: set the base URL, supply any non-empty API key, and use your local model name.
4. Point existing tools at the local endpoint
Many applications that support “OpenAI-compatible” providers only need two settings:
Base URL: http://localhost:11434/v1
API key: any string (often ollama or local)
After that, select the model name that matches what you have pulled.
Alternative: llama.cpp Server
If you prefer to run the model directly with llama.cpp, its server also exposes an OpenAI-compatible surface (commonly on port 8080).
Typical pattern:
Bash
./llama-server -m /path/to/your-qwen.gguf --port 8080 --host 127.0.0.1Then:
text
Base URL: http://localhost:8080/v1The client code looks almost identical; only the port and the way you load the model change. Use this path when you need finer control over quantization, context, threads, or offloading than Ollama’s defaults provide.
What Works Well (and What Does Not)
Usually reliable
Chat completions
Streaming
Basic multi-turn conversation
Listing models via /v1/models
Many tool/function-calling flows (support varies by model and runtime version)
Often incomplete or different
Every OpenAI feature under the sun (logprobs, certain response formats, etc.)
Perfect parity with hosted model behavior and safety systems
Automatic handling of very large concurrent loads (that is a serving-problem, not an API-shape problem)
Treat the local endpoint as “OpenAI-shaped enough for most application code,” not as a byte-for-byte replica of the hosted API.
Binding, Exposure, and Basic Safety
By default Ollama binds to localhost. That is intentional. Only processes on the same machine can reach it.
If you change the host to listen on 0.0.0.0 or a LAN address so other machines can connect, you are now running a network service. At minimum consider:
Binding only to the interfaces you actually need
Putting a reverse proxy in front with TLS if the traffic leaves the machine
Adding authentication (API key, network policy, or both)
Restricting which models are loaded and how much concurrency you allow
Monitoring resource use so one client cannot starve the machine
A local development endpoint and a shared team endpoint are different threat models. Do not treat them as the same configuration.

A Minimal Integration Checklist
Confirm the model runs interactively (ollama run ... or equivalent).
Confirm /v1/models responds.
Send a single chat completion with curl.
Switch one existing script or tool to the local base URL.
Verify streaming if your application needs it.
Decide whether the endpoint stays on localhost or needs controlled network access.
Document the exact model tag and any non-default settings you rely on.
Common Failure Modes
Symptom | Likely cause | What to check |
|---|---|---|
Connection refused | Server not running or wrong port | ollama serve, port 11434 |
Model not found | Tag name mismatch | ollama list and exact model string |
Client demands an API key | SDK requires the field | Pass any non-empty string |
Slow or timed-out responses | Model too large for hardware / long context | Size, quant, context length |
Works on curl, fails in app | Wrong base URL path (/v1 missing) | Use .../v1 not just the root |
Connecting Back to the Series
You now have the full basic loop for the Local Model Lab track:
Choose a model size and quantization that fit
Run it with Ollama (or another runtime)
Understand CPU versus GPU trade-offs
Expose a stable OpenAI-compatible endpoint your own code can call
Later articles move into measurement, practical limits, and the next set of workflows (evaluation, small internal tools, and honest comparisons). The endpoint you just exposed is the bridge between “the model runs” and “the model is useful inside real software.”
Make it run. Make it useful.
No comments yet — be the first to share a thought.