v0.1.4-p3

main
mula.liu 2026-03-19 23:40:59 +08:00
parent 9448d7d4f3
commit f77851d496
2 changed files with 42 additions and 14 deletions

View File

@ -1458,6 +1458,46 @@ async def _wait_for_agent_loop_ready(
return False
async def _record_agent_loop_ready_warning(
bot_id: str,
timeout_seconds: float = 12.0,
poll_interval_seconds: float = 0.5,
) -> None:
try:
agent_loop_ready = await _wait_for_agent_loop_ready(
bot_id,
timeout_seconds=timeout_seconds,
poll_interval_seconds=poll_interval_seconds,
)
if agent_loop_ready:
return
if docker_manager.get_bot_status(bot_id) != "RUNNING":
return
detail = (
"Bot container started, but ready marker was not found in logs within "
f"{int(timeout_seconds)}s. Check bot logs or MCP config if the bot stays unavailable."
)
logger.warning("bot_id=%s agent loop ready marker not found within %ss", bot_id, timeout_seconds)
with Session(engine) as background_session:
if not background_session.get(BotInstance, bot_id):
return
record_activity_event(
background_session,
bot_id,
"bot_warning",
channel="system",
detail=detail,
metadata={
"kind": "agent_loop_ready_timeout",
"marker": _AGENT_LOOP_READY_MARKER,
"timeout_seconds": timeout_seconds,
},
)
background_session.commit()
_invalidate_bot_detail_cache(bot_id)
except Exception:
logger.exception("Failed to record agent loop readiness warning for bot_id=%s", bot_id)
def _sync_workspace_channels(
session: Session,
bot_id: str,
@ -2668,20 +2708,7 @@ async def start_bot(bot_id: str, session: Session = Depends(get_session)):
status_code=500,
detail="Bot container failed shortly after startup. Check bot logs/config.",
)
agent_loop_ready = await _wait_for_agent_loop_ready(bot_id)
if not agent_loop_ready:
docker_manager.stop_bot(bot_id)
bot.docker_status = "STOPPED"
if str(bot.current_state or "").upper() not in {"ERROR"}:
bot.current_state = "IDLE"
bot.updated_at = datetime.utcnow()
session.add(bot)
session.commit()
_invalidate_bot_detail_cache(bot_id)
raise HTTPException(
status_code=500,
detail="Bot启动异常容器已启动但 Agent loop 未正常就绪,请检查 Bot 日志或 MCP 配置。",
)
asyncio.create_task(_record_agent_loop_ready_warning(bot_id))
session.add(bot)
record_activity_event(session, bot_id, "bot_started", channel="system", detail=f"Container started for {bot_id}")
session.commit()

View File

@ -48,6 +48,7 @@ OPERATIONAL_ACTIVITY_EVENT_TYPES = {
"bot_created",
"bot_started",
"bot_stopped",
"bot_warning",
"bot_enabled",
"bot_disabled",
"bot_deactivated",