fix(agent): v4.15.5 - test de connexion provider ne fuit plus le modele global
FlowDeck CI / test (push) Failing after 11s
FlowDeck CI / docker (push) Skipped

- LLMClient : default_model scope par provider — tester nvidia alors que deepseek est le provider actif ne lui envoie plus 'deepseek-v4-flash' (cause du 404 'model not found' de NVIDIA)
- presets NVIDIA actualises (anciens modeles retires de la plateforme / premium)
- test de regression ajoute (46 passed)
This commit is contained in:
2026-09-06 16:02:29 -04:00
parent e4d17eb96c
commit 65559e5069
5 changed files with 49 additions and 5 deletions
+16
View File
@@ -1,5 +1,21 @@
# Changelog — FlowDeck
## v4.15.5 (2026-09-06) — Correctif test de connexion provider (nvidia)
### Corrections
- **Test de connexion multi-provider** : le modèle configuré globalement (ex. `deepseek-v4-flash`)
n'est plus envoyé lorsqu'on teste un **autre** provider (ex. nvidia) — c'était la cause d'un
HTTP 404 « model not found ». Chaque provider utilise désormais son modèle par défaut tant que
le modèle global ne le concerne pas.
- **Presets NVIDIA actualisés** : les anciens modèles (`nvidia/llama-3.1-70b-instruct`,
`nvidia/nemotron-4-340b-instruct`) étaient retirés de la plateforme ou soumis à abonnement ;
liste remplacée par des modèles disponibles (`nvidia/nemotron-3-super-120b-a12b`,
`meta/llama-3.1-70b-instruct`, `deepseek-ai/deepseek-v4-pro`, `z-ai/glm-5.2`, …).
> Note : un 404 persistant après cette correction vient de NVIDIA lui-même (code
> « Function … : Not found for account ») — cause fréquente : le droit « Public API Endpoints »
> pas activé sur le compte/clé pour le modèle choisi.
## v4.15.4 (2026-09-06) — Correctifs listes agent (@ et /)
### Corrections
+1 -1
View File
@@ -1 +1 @@
4.15.4
4.15.5
+1 -1
View File
@@ -60,7 +60,7 @@ async def lifespan(_app: FastAPI):
app = FastAPI(
title="FlowDeck",
version="4.15.4",
version="4.15.5",
docs_url="/docs" if settings.log_level == "DEBUG" else None,
redoc_url=None,
lifespan=lifespan,
+10 -3
View File
@@ -34,7 +34,7 @@ PROVIDERS = {
"google": ("https://generativelanguage.googleapis.com/v1beta", "gemini-2.0-pro"),
"deepseek": ("https://api.deepseek.com/v1", "deepseek-chat"),
"qwencloud": ("https://dashscope.aliyuncs.com/compatible-mode/v1", "qwen-max"),
"nvidia": ("https://integrate.api.nvidia.com/v1", "nvidia/llama-3.1-70b-instruct"),
"nvidia": ("https://integrate.api.nvidia.com/v1", "nvidia/nemotron-3-super-120b-a12b"),
"openrouter": ("https://openrouter.ai/api/v1", "meta-llama/llama-3.3-70b-instruct"),
"ollama": ("http://localhost:11434/v1", "llama3.1"),
"offline": (None, None),
@@ -47,7 +47,9 @@ PROVIDER_MODELS: dict[str, list[str]] = {
"google": ["gemini-2.0-pro", "gemini-2.0-flash", "gemini-1.5-pro", "gemini-1.5-flash"],
"deepseek": ["deepseek-chat", "deepseek-reasoner"],
"qwencloud": ["qwen-max", "qwen-plus", "qwen-turbo", "qwen-long"],
"nvidia": ["nvidia/llama-3.1-70b-instruct", "nvidia/nemotron-4-340b-instruct"],
"nvidia": ["nvidia/nemotron-3-super-120b-a12b", "nvidia/nemotron-3-nano-30b-a3b",
"meta/llama-3.1-70b-instruct", "nvidia/llama-3.3-nemotron-super-49b-v1.5",
"deepseek-ai/deepseek-v4-pro", "z-ai/glm-5.2"],
"openrouter": ["meta-llama/llama-3.3-70b-instruct", "anthropic/claude-3.5-sonnet",
"openai/gpt-4o", "mistralai/mistral-large"],
"ollama": ["llama3.1", "llama3", "mistral", "qwen2.5", "gemma2", "mixtral"],
@@ -98,7 +100,12 @@ class LLMClient:
self.api_base = api_base if api_base is not None else cfg["api_base"]
base, model = PROVIDERS.get(self.provider, (None, None))
self.api_base = self.api_base or base
self.default_model = cfg["model"] or model or "gpt-4o"
# Le modèle global configuré n'est valable que pour le provider global :
# tester un autre provider (ex. nvidia alors que deepseek est actif) ne doit
# PAS lui envoyer le modèle du provider actif (sinon « model not found »).
cfg_provider = (cfg.get("provider") or "offline").lower()
global_model = (cfg.get("model") or "") if self.provider == cfg_provider else ""
self.default_model = global_model or model or "gpt-4o"
# ── Public API ──
+21
View File
@@ -695,6 +695,27 @@ def test_router_patch_providers_requires_admin(client):
assert r.status_code == 403
def test_llm_client_default_model_provider_scoped(client):
# Le modèle global ne doit pas fuir vers un autre provider testé (ex. nvidia
# alors que deepseek est actif) sinon le provider reçoit un modèle inconnu
# (« model not found », HTTP 404).
from app.services.llm_config import set_llm_config
from app.services.llm_client import LLMClient
set_llm_config(provider="deepseek", model="deepseek-v4-flash",
api_key="sk-global", api_base="https://api.deepseek.com/v1")
llm = LLMClient(provider="nvidia", api_key="nvapi-xxx")
assert llm.provider == "nvidia"
assert llm.default_model == "nvidia/nemotron-3-super-120b-a12b"
assert llm.default_model != "deepseek-v4-flash"
# le provider global conserve bien son modèle
llm2 = LLMClient()
assert llm2.provider == "deepseek"
assert llm2.default_model == "deepseek-v4-flash"
def test_router_providers_test_offline(client):
r = client.post("/api/agent/providers/test", json={"provider": "offline"})
assert r.status_code == 200