fix(agent): purge les api_base LLM obsoletes (Mistral/Cohere /v2)
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:
@@ -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),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user