# set_agent_model.dspy — 保存个人选择的默认模型 # 2026-09-04 收敛:模型存在性/机构归属校验统一走模型治理模块 # pipeline_llm.selection.resolve_model_name(不再各模块自查表)。 # llm_id 兼容模型 id / vendor_model_id / 注册名,解析成功后按模型 id 持久化。 dbname = get_module_dbname('pipeline-sdlc') uid = await get_user() llm_id = (params_kw or {}).get('llm_id', '') if not uid: return json.dumps({"success": False, "error": "请先登录"}, ensure_ascii=False) if not llm_id: return json.dumps({"success": False, "error": "缺少 llm_id"}, ensure_ascii=False) org_id = await get_userorgid() or '0' # 统一解析:解析得到注册名即代表存在且属于本机构(系统级不过滤) # capabilities='chat':个人默认模型是会话 agent 用的,只接受对话能力(t2t/i2t/m2t) name = await llm_resolve_model_name(llm_id, org_id=org_id, capabilities='chat') if not name: return json.dumps({"success": False, "error": "模型不存在、不属于本机构或不是对话模型(t2t/i2t/m2t)"}, ensure_ascii=False) # 反查模型 id 持久化(个人默认选择按 id 存,与下拉 value 一致) _model_id = llm_id async with DBPools().sqlorContext(dbname) as sor: _r = await sor.sqlExe( "SELECT id FROM llm_model WHERE status='active' " "AND (id=${m}$ OR vendor_model_id=${m}$ OR name=${m}$) LIMIT 1", {"m": llm_id}) await sor.sqlExe("COMMIT", {}) if _r: _model_id = getattr(_r[0], 'id', '') or llm_id # upsert 到 pipeline_agent_settings(user_id 唯一键) await sor.sqlExe( "UPDATE pipeline_agent_settings SET default_llm_id=${lid}$ WHERE user_id=${uid}$", {"lid": _model_id, "uid": uid}) exists = await sor.sqlExe( "SELECT 1 FROM pipeline_agent_settings WHERE user_id=${uid}$", {"uid": uid}) if not exists: await sor.C('pipeline_agent_settings', { 'id': getID(), 'user_id': uid, 'default_llm_id': _model_id, }) return json.dumps({"success": True, "llm_id": _model_id, "name": name}, ensure_ascii=False)