feat: FastAPI+SSE API server, JRXML auto-reorder, session integrity fixes
This commit is contained in:
+27
-5
@@ -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
|
||||
Reference in New Issue
Block a user