Default local providers to chat completions
Force chat-completions transport by default for local and broad OpenAI-compatible chat providers whose Responses API implementations are often missing or unstable.\n\nCovers LM Studio, llama.cpp, Ollama, Ollama Cloud, oMLX, vLLM, and Other OpenAI compatible while leaving embedding provider defaults untouched. Updates provider-default regression coverage for the new chat-only defaults.
Alessandro committed
Jul 7, 2026 at 17:01 UTC
7aba42d46eb29f1095070299a8d3067fd7e14a45
2 files changed
+39
conf/model_providers.yaml
+8
@@ -84,6 +84,7 @@ chat:
84
endpoint_url: "/v1/models"
85
default_base: "http://host.docker.internal:1234"
86
kwargs:
87
+ a0_api_mode: chat
88
api_base: "http://host.docker.internal:1234/v1"
89
api_key: "lm-studio"
90
llama_cpp:
@@ -93,6 +94,7 @@ chat:
94
endpoint_url: "/v1/models"
95
default_base: "http://host.docker.internal:8080"
96
kwargs:
97
+ a0_api_mode: chat
98
api_base: "http://host.docker.internal:8080/v1"
99
api_key: "llama-cpp"
100
mistral:
@@ -120,6 +122,7 @@ chat:
122
format: "ollama"
123
default_base: "http://host.docker.internal:11434"
124
kwargs:
125
+ a0_api_mode: chat
126
api_base: "http://host.docker.internal:11434"
127
omlx:
128
name: oMLX
@@ -128,6 +131,7 @@ chat:
131
endpoint_url: "/v1/models"
132
default_base: "http://host.docker.internal:8000"
133
kwargs:
134
+ a0_api_mode: chat
135
api_base: "http://host.docker.internal:8000/v1"
136
api_key: "omlx"
137
ollama_cloud:
@@ -136,6 +140,7 @@ chat:
140
models_list:
141
endpoint_url: "/models"
142
kwargs:
143
+ a0_api_mode: chat
144
api_base: https://ollama.com/v1
145
openai:
146
name: OpenAI
@@ -184,6 +189,7 @@ chat:
189
endpoint_url: "/v1/models"
190
default_base: "http://host.docker.internal:8000"
191
kwargs:
192
+ a0_api_mode: chat
193
api_base: "http://host.docker.internal:8000/v1"
194
api_key: "vllm"
195
xai:
@@ -208,6 +214,8 @@ chat:
214
other:
215
name: Other OpenAI compatible
216
litellm_provider: openai
217
+ kwargs:
218
+ a0_api_mode: chat
219
220
embedding:
221
huggingface:
tests/test_model_config_api_keys.py
+31
@@ -265,6 +265,7 @@ def test_ollama_cloud_provider_config_requires_key_and_base_url():
265
ollama_cloud = provider_config["chat"]["ollama_cloud"]
266
267
assert ollama_cloud["name"] == "Ollama Cloud"
268
+ assert ollama_cloud["kwargs"]["a0_api_mode"] == "chat"
269
assert ollama_cloud["kwargs"]["api_base"] == "https://ollama.com/v1"
270
assert ollama_cloud["models_list"]["endpoint_url"] == "/models"
271
assert "api_key_mode" not in ollama_cloud
@@ -298,6 +299,36 @@ def test_direct_venice_chat_provider_defaults_to_chat_completions(monkeypatch):
299
assert custom.kwargs["a0_api_mode"] == "responses"
300
301
302
+def test_local_chat_providers_default_to_chat_completions():
303
+ import yaml
304
+
305
+ provider_path = PROJECT_ROOT / "conf/model_providers.yaml"
306
+ provider_config = yaml.safe_load(provider_path.read_text(encoding="utf-8"))
307
+
308
+ chat_completions_default_providers = (
309
+ "lm_studio",
310
+ "llama_cpp",
311
+ "ollama",
312
+ "ollama_cloud",
313
+ "omlx",
314
+ "other",
315
+ "vllm",
316
+ )
317
+ local_embedding_providers = (
318
+ "lm_studio",
319
+ "llama_cpp",
320
+ "ollama",
321
+ "omlx",
322
+ "vllm",
323
+ )
324
+
325
+ for provider in chat_completions_default_providers:
326
+ assert provider_config["chat"][provider]["kwargs"]["a0_api_mode"] == "chat"
327
+
328
+ for provider in local_embedding_providers:
329
+ assert "a0_api_mode" not in provider_config["embedding"][provider]["kwargs"]
330
+
331
+
332
def test_missing_api_key_banner_does_not_include_auto_modal_metadata(monkeypatch):
333
from plugins._model_config.helpers import model_config
334