- 新增会商全流程诊断日志:新表 roundtable_diagnostics + 仓储 + admin API (/api/roundtable-diagnostics) + 管理员诊断页(会商页右上角设置按钮入口), 覆盖第一/二/三步及后台执行器/进程内网关各处报错与关键事件,支持按 范围/阶段/级别/事件/关键词筛选 + 分页。诊断写入全程 best-effort,绝不打断会商。 - 修复后台挂起「执行完第一个席位后永久卡死」:进程内网关每轮 agent run 改为 idle(无活动)超时(默认 20min)——只要还在持续产出 token/工具事件就一直等, 仅当连续无任何输出才判卡死并取消+报错+落 seat_turn_timeout 诊断;慢但活着的 生成绝不打断。可经 ROUNDTABLE_SEAT_IDLE_TIMEOUT_SECONDS 调整。 - 一并提交进行中的会商 seat-skill 注入 / 业务链条编辑器相关改动。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
"""前台(实时会商)诊断日志助手。
|
|
|
|
后台挂起路径用 ``DiagnosticsRecorder``(绑定作业上下文);前台 multi_agent 路由用本助手
|
|
从 ``request`` 取 store + 当前用户,best-effort 落一条 ``scope="foreground"`` 的诊断事件。
|
|
任何异常静默吞掉——诊断日志绝不能反过来打断会商。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import Any
|
|
|
|
from fastapi import Request
|
|
|
|
from deerflow.persistence.roundtable_diagnostics import record_diagnostic
|
|
from deerflow.runtime.user_context import get_effective_user_id
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def _resolve_user_id(request: Request) -> str | None:
|
|
try:
|
|
user = getattr(request.state, "user", None)
|
|
if user is not None:
|
|
return str(user.id)
|
|
return get_effective_user_id()
|
|
except Exception: # noqa: BLE001
|
|
return None
|
|
|
|
|
|
async def record_foreground_diag(
|
|
request: Request,
|
|
*,
|
|
stage: str,
|
|
level: str,
|
|
event: str,
|
|
message: str | None = None,
|
|
detail: Any = None,
|
|
thread_id: str | None = None,
|
|
draft_id: str | None = None,
|
|
task_id: str | None = None,
|
|
agent_id: str | None = None,
|
|
agent_name: str | None = None,
|
|
) -> None:
|
|
"""从 request 落一条前台诊断事件(best-effort)。"""
|
|
try:
|
|
store = getattr(request.app.state, "roundtable_diagnostic_store", None)
|
|
await record_diagnostic(
|
|
store,
|
|
scope="foreground",
|
|
stage=stage,
|
|
level=level,
|
|
event=event,
|
|
message=message,
|
|
detail=detail,
|
|
draft_id=draft_id,
|
|
task_id=task_id,
|
|
user_id=_resolve_user_id(request),
|
|
agent_id=agent_id,
|
|
agent_name=agent_name,
|
|
)
|
|
except Exception: # noqa: BLE001 — 诊断日志绝不打断会商
|
|
logger.debug("foreground roundtable diag failed", exc_info=True)
|