fix: 一键同步模型接口同步修复并携带上游 base_url,防止 sub2api 账号 base_url 被清空或置为默认值

This commit is contained in:
liumangmang
2026-07-02 16:56:45 +08:00
parent 59be00bd11
commit 4645460ff9
2 changed files with 94 additions and 26 deletions
+41 -10
View File
@@ -1330,6 +1330,7 @@ def sync_website_accounts_upstream_models(
if aid not in candidates:
candidates[aid] = {
"account_id": aid,
"upstream_id": key.upstream_id,
"db_key": key
}
@@ -1340,6 +1341,9 @@ def sync_website_accounts_upstream_models(
items=[]
)
upstream_ids = {cand["upstream_id"] for cand in candidates.values()}
upstreams_map = {up.id: up for up in db.query(Upstream).filter(Upstream.id.in_(upstream_ids)).all()}
items = []
for aid, cand in candidates.items():
@@ -1372,29 +1376,56 @@ def sync_website_accounts_upstream_models(
))
continue
# 开始同步该账号的模型
upstream = upstreams_map.get(cand["upstream_id"])
upstream_base_url = upstream.base_url if upstream else None
if not upstream_base_url or not upstream_base_url.strip():
items.append(SyncUpstreamModelsItem(
account_id=aid,
account_name=acc_name,
model_count=0,
models=[],
status="failed",
message="上游 base_url 为空,跳过处理避免继续写坏账号"
))
continue
# 1. 先安全修复 base_url (不依赖同步模型结果)
try:
c.update_account(aid, {"credentials": {"base_url": upstream_base_url}})
except Exception as e:
items.append(SyncUpstreamModelsItem(
account_id=aid,
account_name=acc_name,
model_count=0,
models=[],
status="failed",
message=f"修复 Base URL 失败: {e}"
))
continue
# 2. 调用 sub2api 同步模型
try:
raw_models = c.sync_account_upstream_models(aid)
# 过滤空、去重、排序
valid_models = sorted(list(set(m.strip() for m in raw_models if m and m.strip())))
if not valid_models:
# 如果返回空模型,保守处理为失败,不清空已有的模型白名单配置
items.append(SyncUpstreamModelsItem(
account_id=aid,
account_name=acc_name,
model_count=0,
models=[],
status="failed",
message="上游同步返回模型列表为空"
message="已修复 Base URL,但上游同步返回模型列表为空"
))
continue
# 构造 model_mapping
model_mapping = {m: m for m in valid_models}
# 直接发送增量字段进行更新,依赖远端的 JSONB merge 逻辑,避免覆盖/丢失敏感 credentials
c.update_account(aid, {"credentials": {"model_mapping": model_mapping}})
# 3. 模型同步成功后,写回 base_url 和 model_mapping
c.update_account(aid, {"credentials": {
"base_url": upstream_base_url,
"model_mapping": {m: m for m in valid_models}
}})
items.append(SyncUpstreamModelsItem(
account_id=aid,
@@ -1402,7 +1433,7 @@ def sync_website_accounts_upstream_models(
model_count=len(valid_models),
models=valid_models,
status="success",
message=f"成功同步 {len(valid_models)} 个模型"
message=f"已修复 Base URL 并同步 {len(valid_models)} 个模型"
))
except Exception as e:
items.append(SyncUpstreamModelsItem(
@@ -1411,7 +1442,7 @@ def sync_website_accounts_upstream_models(
model_count=0,
models=[],
status="failed",
message=f"同步/保存上游模型失败: {e}"
message=f"已修复 Base URL,但模型同步失败: {e}"
))
success_count = sum(1 for item in items if item.status == "success")