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:
ymq 2026-08-22 11:36:27 +08:00
parent 2eb70a3480
commit 0af4faff21

View File

@ -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: