pipeline-sdlc/wwwroot/api/cockpit_model_options.dspy

60 lines
2.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# cockpit_model_options.dspy - Returns active models with capabilities for dropdown
# Used by cockpit model selector
# 下拉值 = llm.id(唯一主键);显示 = llm.name。不同供应商可有相同 model_id
# (API 模型名),只有 llm.id 唯一,避免同名供应商在下拉里被合并/解析漂移。
# org_id 多租户隔离:非系统级机构只看到本机构的模型(不含系统级兜底)
# selected 标记 = 当前项目的已设模型(sd_projects.default_model,产线通用、跨会话持久);
# 项目未设模型时回退个人全局选择(default_llm_id)。前端 UiCode 按 selected 恢复选中项,
# 不再每次重建都回退第一项。
dbname = get_module_dbname('pipeline-sdlc')
uid = await get_user()
org_id = (await get_userorgid()) or ''
session_id = (params_kw or {}).get('session_id', '') or ''
async with DBPools().sqlorContext(dbname) as sor:
sql = "SELECT id, name, provider, model_id, capabilities FROM llm WHERE status='active'"
params = {}
if org_id and org_id != '0':
sql += " AND org_id=${org}$"
params['org'] = org_id
sql += " ORDER BY name"
recs = await sor.sqlExe(sql, params)
# 项目级模型(优先级最高):按会话解析当前项目 → sd_projects.default_model。
# session_id 为空/无会话记录时自动回退全局设置,与消息链路的项目解析同一函数,不漂移。
project_model = ''
try:
from pipeline_service.workspace import get_session_project_id
_pid = await get_session_project_id(sor, uid or '', session_id)
if _pid:
_p = await sor.sqlExe(
"SELECT default_model FROM sd_projects WHERE id=${p}$", {"p": _pid})
await sor.sqlExe("COMMIT", {})
if _p:
project_model = getattr(_p[0], 'default_model', '') or ''
except Exception as e:
debug(f'cockpit_model_options project_model error: {e}')
# 个人之前选择的默认模型(项目未设模型时的回退选中项)
current_llm_id = ''
if uid:
_s = await sor.sqlExe(
"SELECT default_llm_id FROM pipeline_agent_settings WHERE user_id=${u}$", {"u": uid})
if _s:
current_llm_id = getattr(_s[0], 'default_llm_id', '') or ''
rows = []
for r in recs:
rows.append({
'value': r.id,
'text': f"{r.name} ({r.provider})",
'provider': r.provider,
'model_id': r.id, # 下拉值:llm.id(唯一,区分同名不同供应商)
'model_id_text': r.name, # 下拉显示:llm.name
'capabilities': r.capabilities or 'text',
'selected': (r.name == project_model) if project_model else (r.id == current_llm_id),
})
return rows