62 lines
2.9 KiB
Plaintext
62 lines
2.9 KiB
Plaintext
# agent_model_options.dspy - 返回 active 模型列表(供 AgentIO 模型选择下拉)
|
||
# llm 表是 pipeline 库的通用配置,产线无关
|
||
# org_id 多租户隔离:非系统级机构只看到本机构的模型(不含系统级兜底)
|
||
# 下拉值 = llm.id(唯一主键);显示 = llm.name。不同供应商可有相同 model_id
|
||
# (API 模型名),但 name 必须唯一,用 id 做值才能区分供应商、避免解析漂移。
|
||
# 前端 agent_input.js 读 valueField:'model_id' / textField:'model_id_text',
|
||
# 故这里 model_id 字段放 llm.id、model_id_text 放 llm.name(字段名是历史遗留)。
|
||
# selected 标记 = 当前项目的已设模型(sd_projects.default_model,产线通用、跨会话持久);
|
||
# 项目未设模型时回退个人全局选择(default_llm_id)。前端 UiCode 按 selected 恢复选中项,
|
||
# 不再每次重建都回退第一项。
|
||
|
||
dbname = get_module_dbname('pipeline_core')
|
||
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'agent_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
|