fix: 一键同步模型接口同步修复并携带上游 base_url,防止 sub2api 账号 base_url 被清空或置为默认值
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user