104 lines
4.1 KiB
Python
104 lines
4.1 KiB
Python
from fastapi import APIRouter, HTTPException, Request
|
|
from typing import Dict, Any
|
|
import json
|
|
import logging
|
|
|
|
from jingrow.ai.pagetype.local_ai_agent.local_ai_agent import create_agent_job, validate_agent_execution
|
|
from jingrow.utils.jingrow_api import get_agent_detail
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
@router.post("/jingrow/agents/execute")
|
|
async def execute_agent(request: Request, request_data: Dict[str, Any]):
|
|
"""
|
|
异步执行智能体(参考 Jingrow 的触发逻辑)
|
|
当智能体状态为待执行时,入队执行
|
|
"""
|
|
try:
|
|
agent_id = request_data.get('agent_id')
|
|
agent_name = request_data.get('agent_name')
|
|
|
|
if not agent_id:
|
|
raise HTTPException(status_code=400, detail="agent_id is required")
|
|
|
|
logger.info(f"Executing agent: {agent_id}, name: {agent_name}")
|
|
|
|
# 获取用户的 session cookie
|
|
session_cookie = request.cookies.get('sid')
|
|
if not session_cookie:
|
|
logger.warning("No session cookie found, using system authentication")
|
|
|
|
# 使用 AgentService 创建任务
|
|
job_id = create_agent_job(agent_id, agent_name, session_cookie, "jingrow/agents/execute")
|
|
|
|
logger.info(f"Agent {agent_id} queued for execution")
|
|
|
|
return {
|
|
"success": True,
|
|
"message": "Agent execution queued successfully",
|
|
"agent_id": agent_id,
|
|
"job_id": job_id,
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to execute agent {agent_id}: {str(e)}")
|
|
raise HTTPException(status_code=500, detail=str(e))
|
|
|
|
@router.post("/jingrow/agents/execute_scheduled_agent")
|
|
async def execute_scheduled_agent(request: Request, request_data: Dict[str, Any]):
|
|
"""
|
|
定时任务统一入口,执行指定的智能体
|
|
解析并执行 jingrow/agents/execute_scheduled_agent:agent_id 格式的路由
|
|
参考 Jingrow 的 execute_scheduled_agents 函数实现
|
|
"""
|
|
try:
|
|
# 从请求数据中获取方法名,格式为: jingrow/agents/execute_scheduled_agent:agent_id
|
|
method = request_data.get('method', '')
|
|
|
|
if not method:
|
|
raise HTTPException(status_code=400, detail="method is required")
|
|
|
|
# 解析方法名,提取 agent_id
|
|
if not method.startswith('jingrow/agents/execute_scheduled_agent:'):
|
|
raise HTTPException(status_code=400, detail="Invalid method format, expected: jingrow/agents/execute_scheduled_agent:agent_id")
|
|
|
|
agent_id = method.split(':', 1)[1] if ':' in method else ''
|
|
|
|
if not agent_id:
|
|
raise HTTPException(status_code=400, detail="agent_id is required in method")
|
|
|
|
logger.info(f"Executing scheduled agent: {agent_id}")
|
|
|
|
# 获取用户的 session cookie
|
|
session_cookie = request.cookies.get('sid')
|
|
if not session_cookie:
|
|
logger.warning("No session cookie found for scheduled agent execution, using system authentication")
|
|
|
|
# 根据 agent_id 获取 agent_name
|
|
agent_name = None
|
|
try:
|
|
agent_detail = get_agent_detail(agent_id, session_cookie)
|
|
if agent_detail:
|
|
agent_name = agent_detail.get('agent_name')
|
|
logger.info(f"Found agent_name: {agent_name} for agent_id: {agent_id}")
|
|
except Exception as e:
|
|
logger.warning(f"Failed to get agent_name for {agent_id}: {e}")
|
|
|
|
# 使用 AgentService 创建任务
|
|
job_id = create_agent_job(agent_id, agent_name, session_cookie, "jingrow/agents/execute_scheduled_agent", method)
|
|
|
|
logger.info(f"Scheduled agent {agent_id} queued for execution")
|
|
|
|
return {
|
|
"success": True,
|
|
"message": "Scheduled agent execution queued successfully",
|
|
"agent_id": agent_id,
|
|
"agent_name": agent_name,
|
|
"job_id": job_id,
|
|
"method": method
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to execute scheduled agent: {str(e)}")
|
|
raise HTTPException(status_code=500, detail=str(e)) |