pipeline_core/wwwroot/api/agent_model_options.dspy

62 lines
2.9 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.

# 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