优化jingrow/ai/pagetype/local_ai_agent/__init__.py

This commit is contained in:
jingrow 2025-10-31 20:10:25 +08:00
parent 475a6dfab3
commit f94cee7b54

View File

@ -2,7 +2,6 @@
# License: MIT. See LICENSE
import jingrow
import logging
from jingrow.utils.jinja import render_template
@ -41,13 +40,9 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
- condition 支持 Jinja2 表达式
- 使用本地任务队列避免链式重复触发
"""
logger = logging.getLogger(__name__)
# 兼容多种调用方式:
pg = pg or page
method = event or method or kwargs.get("event")
logger.debug(f"LocalAIAgent.run_agent called: pagetype={getattr(pg,'pagetype',None)}, name={getattr(pg,'name',None)}, method={method}")
# 简化实现:不使用 flags始终尝试匹配
ai_agents = _get_all_local_ai_agents()
@ -70,7 +65,8 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
ma = jingrow.get_module_app(pg_pagetype)
if isinstance(ma, dict) and ma.get("success"):
module_name = ma.get("module")
except Exception:
except Exception as _e:
jingrow.log_error("get_module_app failed", f"pagetype={pg_pagetype}", exc=_e)
module_name = None
agents_by_module = []
if module_name:
@ -78,15 +74,13 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
agents_by_module = ai_agents.get(key, []) or []
# 合并去重
agents_for_pg = {a.get("name"): a for a in agents_by_pagetype + agents_by_module}.values()
logger.debug(
f"LocalAIAgent groups: pagetype_count={len(agents_by_pagetype)}, module_count={len(agents_by_module)}, merged={len(list(agents_for_pg))}"
)
if not agents_for_pg:
logger.debug("No Local Ai Agents matched for this page")
merged_agents = list({a.get("name"): a for a in agents_by_pagetype + agents_by_module}.values())
if not merged_agents:
jingrow.log_error("LocalAIAgent", "No Local Ai Agents matched for this page")
return
# 支持的事件(不依赖 flags
# 支持的事件
event_list = [
"on_update",
"after_insert",
@ -97,7 +91,7 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
"before_update_after_submit",
]
for agent in agents_for_pg:
for agent in merged_agents:
event = method if method in event_list else None
if event and (agent.get("event_type") == event):
@ -106,10 +100,8 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
trigger = True
else:
try:
# 使用统一的 render_template 进行 Jinja2 条件渲染
cond_tpl = str(agent.get("condition") or "").strip()
# 统一从触发记录的 pagetype/name 拉取完整记录,构建渲染上下文
# 统一基上下文(兼容 dict/object
if isinstance(pg, dict):
base_ctx = pg
else:
@ -124,35 +116,22 @@ def run_agent(pg=None, method=None, event=None, page=None, **kwargs):
result = render_template(cond_tpl, {"pg": pg_ctx})
if str(result).strip().lower() in ("true", "1", "yes"):
trigger = True
except Exception:
logger.warning(f"Condition render error, skip agent: agent={agent.get('name')}")
except Exception as _e:
jingrow.log_error("Condition render error, skip agent", f"agent={agent.get('name')}", exc=_e)
trigger = False
if trigger:
logger.info(f"Run Local Ai Agent: agent={agent.get('name')}, event={event}, page={pg_pagetype}:{pg_name}")
enqueue_local_ai_agent(pg, agent.get('name'))
else:
logger.debug(f"Condition not met, skip agent: agent={agent.get('name')}, event={event}")
def _add_agent_to_queue(agent, pg):
"""向后兼容:直接调用入队函数(无本地事务队列)。"""
enqueue_local_ai_agent(pg, agent.get('name'))
def enqueue_local_ai_agent(pg, agent_name):
"""后台实际入队执行 Local Ai Agent。
此函数会读取本地智能体配置调用本地任务创建函数以执行远端/本地智能体
"""
"""后台实际入队执行 Local Ai Agent。"""
try:
# 通过统一 CRUD 获取 Local Ai Agent 详情
items = jingrow.get_list("Local Ai Agent", filters=[["name", "=", agent_name]], fields=["name", "agent_name"], limit=1)
agent = (items or [None])[0]
agent = jingrow.get_pg("Local Ai Agent", agent_name)
if not agent:
return
if not agent:
return
# 无 agent_id 字段,统一使用 name 作为标识
agent_id = agent.get("name")
agent_name_value = agent.get("agent_name")
@ -168,15 +147,10 @@ def enqueue_local_ai_agent(pg, agent_name):
agent_id=str(agent_id),
agent_name=agent_name_value,
inputs=event_inputs,
# 使用统一的执行路由;会在本地队列处理器里转发
route="jingrow/agents/execute",
)
except Exception as e:
jingrow.log_error("Local Ai Agent执行失败", f"agent={agent_name}, error={str(e)}")
def clear_local_ai_agent_cache():
"""清空本地智能体缓存(简化实现:无缓存,函数保留占位)。"""
return None