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