fix(agent): purge les api_base LLM obsoletes (Mistral/Cohere /v2)
FlowDeck CI / lint (push) Successful in 53s
FlowDeck CI / test (push) Successful in 5m46s
FlowDeck CI / docker (push) Successful in 48s

Un api_base stocke (ex. https://api.mistral.ai/v2) ecrasait l'URL par defaut corrigee et faisait echouer le test de connexion. Desormais: normalisation a l'ecriture (une base egale au defaut n'est pas stockee), possibilite de vider le champ (api_base='' vs None), et migration 14 qui efface les bases obsoletes/redondantes dans user_llm_keys et llm_config.

Tests de non-regression ajoutes.
This commit is contained in:
2026-09-14 23:04:39 -04:00
parent a0db4d6e65
commit 88e4ae1db8
4 changed files with 123 additions and 6 deletions
+41
View File
@@ -547,3 +547,44 @@ def _migration_v511_wiki_v512_templates(conn: sqlite3.Connection) -> None:
conn.execute(
"CREATE INDEX IF NOT EXISTS idx_pgt_creator ON page_global_templates(created_by)"
)
@register(14, "v5.13.0: fix stale LLM provider api_base values")
def _migration_fix_llm_api_bases(conn: sqlite3.Connection) -> None:
"""Clear `api_base` values that freeze a provider URL to a wrong/default value.
The Agent "Test connection" uses the per-user (or global) stored `api_base`
when present, so an old/incorrect value (e.g. Mistral `…/v2`, Cohere
`…/v2`, Google native `/v1beta`) keeps failing even after `PROVIDERS` is
corrected. Two kinds of rows are reset to the provider default:
* known-wrong legacy bases from earlier releases;
* a stored base identical to the current provider default (a no-op
override that would block future default changes).
"""
from app.services.llm_client import PROVIDERS
legacy: dict[str, set[str]] = {
"mistral": {"https://api.mistral.ai/v2"},
"cohere": {"https://api.cohere.com/v2", "https://api.cohere.com/v1",
"https://api.cohere.ai/v2"},
"google": {"https://generativelanguage.googleapis.com/v1beta"},
"perplexity": {"https://api.perplexity.ai/v1"},
"chutes": {"https://api.chutes.ai/v1"},
"sensenova": {"https://token.sensenova.cn/v1"},
"ltx": {"https://api.ltx.io/v1"},
"memtensor": {"https://memos.memtensor.cn/api/openmem/v1"},
}
for provider, (base, _) in PROVIDERS.items():
if base:
legacy.setdefault(provider, set()).update({base, base.rstrip("/")})
for provider, bases in legacy.items():
variants = {b for b in bases if b}
variants |= {b.rstrip("/") for b in bases if b}
for table in ("user_llm_keys", "llm_config"):
for value in variants:
conn.execute(
f"UPDATE {table} SET api_base='' WHERE provider=? AND api_base=?",
(provider, value),
)