feat: LLM 机构隔离——机构没配 llm 时角色/PM/QC 冒泡问题暂停
- _check_org_llm 检测机构 llm 配置(严格本机构隔离,不含系统级兜底) - role_agent_run/pm_review_run/qc_review_run 在 LLM 调用前检测,机构没配 llm 则 raise_problem(need_info) 冒泡问题暂停,等机构配置模型后恢复
This commit is contained in:
parent
2eb70a3480
commit
0af4faff21
@ -162,6 +162,23 @@ async def _resolve_llm_context(sor, project_id, role, model_name=None):
|
||||
return model_name, org_id
|
||||
|
||||
|
||||
async def _check_org_llm(sor, org_id):
|
||||
"""检测机构是否配置了 LLM 模型(严格本机构隔离,不含系统级兜底)。
|
||||
|
||||
返回 (missing: bool, available_names: list)。org_id 为空或 '0'(系统级)时不过滤,
|
||||
视为已配置(系统级模型对超管可用)。机构没配 llm 时角色/pm/qc 应冒泡问题暂停。
|
||||
"""
|
||||
if not org_id or org_id == '0':
|
||||
return False, []
|
||||
try:
|
||||
recs = await sor.sqlExe(
|
||||
"SELECT name FROM llm WHERE org_id=${org}$ AND status='active'", {"org": org_id})
|
||||
names = [getattr(r, "name", "") or "" for r in (recs or [])]
|
||||
return (len(names) == 0), names
|
||||
except Exception:
|
||||
return False, []
|
||||
|
||||
|
||||
def _get_db():
|
||||
from sqlor.dbpools import DBPools
|
||||
db = DBPools()
|
||||
@ -1158,6 +1175,19 @@ async def role_agent_run(project_id, role, agent_id=None, model_name=None):
|
||||
task_id = task.id
|
||||
title = getattr(task, "title", "") or ""
|
||||
params_str = getattr(task, "params", "{}") or "{}"
|
||||
# 机构 llm 检测:机构没配 llm → 冒泡问题暂停(LLM 都调不了,不能硬跑)
|
||||
llm_missing, _names = await _check_org_llm(sor, org_id)
|
||||
if llm_missing:
|
||||
from .communication import raise_problem
|
||||
qid = await raise_problem(
|
||||
"need_info",
|
||||
f"机构(org_id={org_id})未配置 LLM 模型,角色 agent 无法调用模型。"
|
||||
f"请在「模型管理」为该机构配置可用模型后重试。",
|
||||
role, tenant_id=project_id, task_id=task_id,
|
||||
first_handler_role="agent.main_agent", suspend_task=True,
|
||||
)
|
||||
logger.warning(f"role_agent_run: org llm missing, task={task_id} org={org_id}")
|
||||
return {"status": "need_info", "task_id": task_id, "question_id": qid}
|
||||
workspace_dir = await _get_workspace_dir(sor, project_id)
|
||||
|
||||
try:
|
||||
@ -1564,6 +1594,19 @@ async def pm_review_run(project_id, agent_id=None, model_name=None):
|
||||
task_id = task.id
|
||||
title = getattr(task, "title", "") or ""
|
||||
task_role = _normalize_role(getattr(task, "role", "") or "")
|
||||
# 机构 llm 检测:机构没配 llm → 冒泡问题暂停
|
||||
llm_missing, _names = await _check_org_llm(sor, org_id)
|
||||
if llm_missing:
|
||||
from .communication import raise_problem
|
||||
qid = await raise_problem(
|
||||
"need_info",
|
||||
f"机构(org_id={org_id})未配置 LLM 模型,PM 审核无法调用模型。"
|
||||
f"请在「模型管理」为该机构配置可用模型后重试。",
|
||||
"agent.pm", tenant_id=project_id, task_id=task_id,
|
||||
first_handler_role="agent.main_agent", suspend_task=True,
|
||||
)
|
||||
logger.warning(f"pm_review_run: org llm missing, task={task_id} org={org_id}")
|
||||
return {"status": "need_info", "task_id": task_id, "question_id": qid}
|
||||
workspace_dir = await _get_workspace_dir(sor, project_id)
|
||||
|
||||
try:
|
||||
@ -1805,6 +1848,19 @@ async def qc_review_run(project_id, agent_id=None, model_name=None):
|
||||
task_id = task.id
|
||||
title = getattr(task, "title", "") or ""
|
||||
task_role = _normalize_role(getattr(task, "role", "") or "")
|
||||
# 机构 llm 检测:机构没配 llm → 冒泡问题暂停
|
||||
llm_missing, _names = await _check_org_llm(sor, org_id)
|
||||
if llm_missing:
|
||||
from .communication import raise_problem
|
||||
qid = await raise_problem(
|
||||
"need_info",
|
||||
f"机构(org_id={org_id})未配置 LLM 模型,QC 检查无法调用模型。"
|
||||
f"请在「模型管理」为该机构配置可用模型后重试。",
|
||||
"agent.qc", tenant_id=project_id, task_id=task_id,
|
||||
first_handler_role="agent.main_agent", suspend_task=True,
|
||||
)
|
||||
logger.warning(f"qc_review_run: org llm missing, task={task_id} org={org_id}")
|
||||
return {"status": "need_info", "task_id": task_id, "question_id": qid}
|
||||
workspace_dir = await _get_workspace_dir(sor, project_id)
|
||||
|
||||
try:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user