fix(platform): apply_llm_config幂等键改为name全局唯一键(实测:模型迁供应商后按vendor_id+vmid查不到→INSERT撞uk_llm_model_name崩);供应商归属不一致不静默迁移,报vendor_conflicts由用户决策
This commit is contained in:
parent
fb3447e56e
commit
e8a5511535
@ -423,8 +423,8 @@ def _f(v, default=0.0):
|
||||
async def _h_apply_llm_config(sor, params, ctx):
|
||||
"""按提取的规格写库:供应商(复用/新建)+ 适配模板 + 模型。
|
||||
|
||||
幂等:供应商按名称复用;模型按 (vendor, vendor_model_id) 复用——
|
||||
已存在则更新,不重复创建。
|
||||
幂等:供应商按名称复用;模型按 name/vendor_model_id 复用(name 全局唯一键)——
|
||||
已存在则更新元数据;供应商归属不一致时不改挂、如实报 vendor_conflicts。
|
||||
|
||||
规格来源(2026-09-05 防编造改造):
|
||||
use_last_extract=true(推荐)→ 取本会话 extract 锚定的规格,
|
||||
@ -557,9 +557,10 @@ async def _h_apply_llm_config(sor, params, ctx):
|
||||
"status": "active"})
|
||||
profile_ids[cap] = pid
|
||||
|
||||
# 3. 模型:按 (vendor, vendor_model_id) 幂等
|
||||
# 3. 模型:按 name/vendor_model_id 幂等(name 全局唯一键)
|
||||
doc_url = (spec.get("doc_url") or "").strip()
|
||||
created, updated, skipped = [], [], []
|
||||
conflicts = [] # 供应商归属冲突(模型已挂别的供应商)——如实报告不静默迁移
|
||||
for m in models:
|
||||
vmid = (m.get("vendor_model_id") or "").strip()
|
||||
if not vmid:
|
||||
@ -582,12 +583,21 @@ async def _h_apply_llm_config(sor, params, ctx):
|
||||
if qid:
|
||||
query_ids.append(qid)
|
||||
query_ids_json = json.dumps(query_ids) if query_ids else ""
|
||||
# 幂等键=name(uk_llm_model_name 全局唯一)。不能按 (vendor_id, vmid) 查:
|
||||
# 模型换挂供应商后(如迁到阿里云百炼),旧查询找不到→INSERT→撞唯一键崩(实测)。
|
||||
recs = await sor.sqlExe(
|
||||
"SELECT id FROM llm_model WHERE vendor_id=${v}$ AND vendor_model_id=${m}$",
|
||||
{"v": vendor_id, "m": vmid})
|
||||
"SELECT id, vendor_id FROM llm_model WHERE name=${m}$ OR vendor_model_id=${m}$",
|
||||
{"m": vmid})
|
||||
await sor.sqlExe("COMMIT", {})
|
||||
if recs:
|
||||
mid = getattr(recs[0], "id", "")
|
||||
cur_vendor = getattr(recs[0], "vendor_id", "") or ""
|
||||
if cur_vendor and cur_vendor != vendor_id:
|
||||
# 供应商归属不一致:治理决策,不静默迁移——只更新元数据并如实报告
|
||||
conflicts.append(
|
||||
"%s: 模型已存在且挂供应商 id=%s,与本次规格供应商(%s)不一致——"
|
||||
"未改供应商归属,仅更新描述/同步模式;如需迁移请明确指示"
|
||||
% (vmid, cur_vendor, vendor_name))
|
||||
await sor.sqlExe(
|
||||
"UPDATE llm_model SET description=${d}$, "
|
||||
"sync_mode=${sm}$, query_profile_ids=${q}$, updated_at=NOW() "
|
||||
@ -615,6 +625,7 @@ async def _h_apply_llm_config(sor, params, ctx):
|
||||
return json.dumps({
|
||||
"vendor": vendor_action, "profiles": profile_ids,
|
||||
"models_created": created, "models_updated": updated, "models_skipped": skipped,
|
||||
"vendor_conflicts": conflicts,
|
||||
"runtime_note": rt_note,
|
||||
"media_audit": audit_note,
|
||||
}, ensure_ascii=False)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user