feat: FastAPI+SSE API server, JRXML auto-reorder, session integrity fixes

This commit is contained in:
2026-05-22 17:53:59 +08:00
parent 1144a86d02
commit 1e5ce9725b
32 changed files with 9189 additions and 309 deletions
+27 -5
View File
@@ -18,11 +18,11 @@ from backend.logger import get_logger, set_trace_id
from backend.validation import validate_jrxml
from prompts.loader import load_prompt
load_dotenv()
load_dotenv(override=True)
_node_log = get_logger("agent")
MAX_RETRY = int(os.getenv("MAX_RETRY", "3"))
MAX_RETRY = int(os.getenv("MAX_RETRY", "5"))
CONTEXT_MAX_TOKENS = int(os.getenv("CONTEXT_MAX_TOKENS", "6000"))
CONTEXT_KEEP_RECENT = int(os.getenv("CONTEXT_KEEP_RECENT", "4"))
HISTORY_MAX_SNAPSHOTS = int(os.getenv("HISTORY_MAX_SNAPSHOTS", "10"))
@@ -815,6 +815,14 @@ def validate(state: AgentState) -> Dict:
state["error_msg"] = f"JRXML 内容过短({len(jrxml.strip())} 字符),可能为不完整或空内容。"
return state
# 自动规范化 JRXML 元素顺序(符合 XSD sequence 要求)
try:
from backend.jrxml_reorder import normalize_jrxml
jrxml = normalize_jrxml(jrxml)
state["current_jrxml"] = jrxml
except Exception:
pass # 规范化失败不影响后续流程
result = validate_jrxml(jrxml)
state["status"] = "pass" if result.get("valid") else "fail"
state["error_msg"] = result.get("error", "")
@@ -923,6 +931,20 @@ def finalize(state: AgentState) -> Dict:
# 验证未通过:不覆盖 final_jrxml,保留上一次成功的版本
retries = state.get("retry_count", 0)
error_msg = state.get("error_msg", "未知错误")
# 保存失败版本到 jrxml_versions(用户可以选择下载)
if jrxml.strip():
versions = state.get("jrxml_versions", [])
if not isinstance(versions, list):
versions = []
versions.append({
"ts": _now_iso(),
"jrxml": jrxml,
"intent": state.get("intent", ""),
"label": f"失败版本 (第{retries}次重试)",
"status": "fail",
"error_msg": error_msg,
})
state["jrxml_versions"] = versions
# 记录失败上下文,下次用户输入时自动注入
state["pending_failure_context"] = {
"error_msg": error_msg,
@@ -934,8 +956,8 @@ def finalize(state: AgentState) -> Dict:
"role": "assistant",
"content": (
f"❌ 经过 {retries} 次重试后仍无法生成有效的 JRXML。\n"
f"错误: {error_msg}\n"
f"请描述您想要的修改,系统自动加载失败上下文继续修复"
f"错误: {error_msg}\n\n"
f"您可以:\n1. 继续描述修改要求,系统自动重试修复\n2. 点击下载按钮获取当前版本(虽未通过 XSD 验证,但可能可在 Studio 中手动修复"
),
})
return state
@@ -966,4 +988,4 @@ def _extract_jrxml(text: str) -> str:
if xml_start >= 0 and jr_end > xml_start:
return text[xml_start:jr_end + len("</jasperreport>")].strip()
return text
return text