panda
bb6cc6e241
feat: add Java JRXML-to-PNG rendering pipeline with pixel-level SSIM comparison
...
- lib/java/: Java renderer (JrxmlRenderer) using JasperReports 6.21.0
- JrxmlDebug for diagnostics, JrxmlGen for format reference
- download_jars.sh for one-time dependency setup
- agent/nodes.py: _render_jrxml_to_png() and _compute_pixel_similarity()
- Pixel comparison integrates into validate node (SSIM < 0.4 fails)
- Pixel fidelity context injected into correct_jrxml for targeted fixes
- tests/test_pixel_comparison.py: 15 unit tests (render, SSIM, integration)
- .gitignore: exclude lib/java/*.jar, lib/java/*.class, tmp/
- CLAUDE.md: v11 changelog documenting the rendering pipeline
- All non-LLM tests pass (97/97)
2026-05-23 15:09:55 +08:00
panda
1210b926c3
fix: MAX_RETRY 5 + rolling continuation + namespace-aware JRXML extraction
...
- MAX_RETRY: 3→5 (graph.py:35, nodes.py:25) with env override
- Rolling continuation: _generate_with_continuation() auto-detects
truncated JRXML and sends anchor-based continuation, max 3 rounds
- JRXML extraction: regex/end-tag now namespace-prefix aware
(ns0:jasperReport, ns:jasperReport, etc.)
- All 5 generation nodes refactored to use continuation helper
- Tests updated: scenario1 accepts ns-prefixed root, max_retry
verifies graph termination
- stop_reason capture + WARNING log on max_tokens truncation
- Correction prompt now injects OCR context + layout schema
2026-05-23 10:58:46 +08:00
panda
93ad5e8876
fix: address audit findings — session_id validation, streaming reset, state isolation
...
- Replace truncated 12-char UUID with full 32-char UUID (128-bit entropy)
- Add validate_session_id() regex check to prevent path traversal
- Add _check_session_id() guard on all 6 API endpoints
- Change _step_counter from module global to contextvars.ContextVar
- Filter None values from node_state before merging into agent_state
- Log save_session failures instead of silently swallowing them
- Add finishStreaming() in catch/finally blocks to prevent UI lockup
- Fix broken multiline docstring in chat() endpoint
2026-05-23 09:08:53 +08:00
panda
1952d75f13
test: add unit/integration/E2E test suites, fix create_session bug, update docs
...
- Unit tests: test_session.py (27), test_error_kb.py (24), test_agent.py hardened
- Integration tests: test_api_integration.py (25) with FastAPI TestClient
- E2E tests: main-flows.spec.ts (8) with Playwright + API mocking
- Bug fix: backend/session.py create_session() missing session_id parameter
- Config: frontend/playwright.config.ts, npm run test:e2e
- Docs: update CLAUDE.md v9, .gitignore for test artifacts/eval reports
2026-05-23 08:38:29 +08:00
panda
1e5ce9725b
feat: FastAPI+SSE API server, JRXML auto-reorder, session integrity fixes
2026-05-22 17:53:59 +08:00
panda
aa1d8a6c52
fix: logging KeyError with reserved 'filename' key, pytest return-not-none warnings
...
- api_server.py: rename 'filename' to 'file_name' in upload_file log extra
dict to avoid collision with Python logging's reserved LogRecord attribute
- test_e2e_ocr.py: replace return statements with assert in test functions
to fix PytestReturnNotNoneWarning
2026-05-21 22:28:07 +08:00
panda
43a0542a11
feat: layered precise generation for A4 report images
...
3-phase pipeline to solve LLM prompt overflow from too many OCR elements:
Phase 1 (generate_skeleton): compressed layout schema → skeleton JRXML
Phase 2 (refine_layout): sampled coordinates → pixel-level position tuning
Phase 3 (map_fields): OCR field names → replace $F{field_N} placeholders
Only triggered when layout_schema.total_rows > 0 on initial_generation intent.
Text requests and all other intents are unaffected (zero behavior change).
2026-05-21 08:34:32 +08:00
panda
9bb011e429
feat: v4 multimodal chat input, multi-format support, and annotation detection
...
- Replace st.chat_input with st-multimodal-chatinput (Ctrl+V paste, drag-drop, file button)
- Extract _process_uploaded_file() shared handler (eliminates ~70 duplicated lines)
- Add XLSX (openpyxl), XLS (xlrd), DOC (olefile) parsers to file_parser.py
- Add backend/annotation_detector.py: circle detection (HoughCircles) + arrow detection (HoughLinesP clustering) + OCR correlation + LLM context formatting
- Add annotation_result field to AgentState with session persistence
- Wire annotation detection into process_input and _format_ocr_context
- Add 11 new tests: 7 annotation detector + 4 multi-format parser
- Update all docs: CLAUDE.md, README.md, CODE_GUIDE.md, ROADMAP.md
2026-05-20 23:43:16 +08:00
panda
c9f003e1b7
feat: 新增 OCR 单据字段精确提取模块
...
- 新增 backend/ocr_extractor.py: 两阶段提取流水线 (文档分析 + 字段提取)
- 四种提取策略: 精确KV匹配/模糊KV匹配/正则模式/表格结构匹配
- agent/state.py: 新增 ocr_extraction_result 和 uploaded_file_path 字段
- agent/nodes.py: process_input() 中自动触发 OCR 提取钩子
- app.py: 文件上传时保留图片路径, 总结卡片中展示提取结果
- .env.example: 新增 OCR_USE_GPU / OCR_CONFIDENCE_THRESHOLD 配置项
- tests/test_ocr_extraction.py: 48 个单元测试全部通过
2026-05-20 08:06:55 +08:00
panda
e113374682
feat: Streamlit多轮对话界面 + 集成测试
...
app.py:
侧边栏:会话管理(创建/切换/删除)、快捷操作(预览/撤销/重置)、
配置信息、JRXML下载
主区域:多轮聊天、8种意图差异化展示(JRXML代码/咨询回答/
错误解释/成功提示)
URL参数:?session_id= 会话分享
tests/:
test_validation.py: 验证服务6个单元测试(健康检查/空内容/
无效XML/缺少尺寸/有效JRXML/字段引用)
test_agent.py: 5个集成验收场景(简单生成/自动修正/
多轮修改/上下文感知修改/最大重试处理)
2026-05-14 23:21:22 +08:00