feat: 文件入库 — docx/xlsx/pdf/csv 经 mcp-py 解析 → RAG
入库从纯文本升级为多文件类型:解析(mcp-py 算法层)与切块/embedding 解耦。 上传文件 → Gateway 按类型路由 → mcp-py parse_document 解析为文本 → kb_ingest。 - mcp-py: parsers.py(docx=python-docx / xlsx=openpyxl / pdf=pypdf / csv / txt→文本); parse_document 工具做真(base64 文件→文本,线程池跑 CPU 密集解析);pyproject 加依赖 - gateway: POST /api/v1/kb/ingest_file(multipart);parseFile 文本类直读、office/pdf→mcp-py - nats-server.conf: max_payload 8MB(容纳 base64 文件经工具调用;大文件应走对象存储) - frontend: KbView 加文件上传(accept docx/xlsx/pdf/csv...);api.ingestFile - 验证: 全模块 build✓ + e2e PASS; live——4 类文件上传→mcp-py 解析→入库→检索命中: docx(营收报告)/xlsx(销量表行)/pdf(Q2计划)/csv(城市人口) 全部正确 - 边界: 扫描件/版面 OCR(MinerU/PaddleOCR)推迟;大文件 base64 走 NATS 受 max_payload 限,生产应走对象存储(MinIO) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -98,9 +98,18 @@ class McpGateway:
|
||||
return f"[run_code] Docker 隔离执行(桩) stdout={result.get('stdout','')!r}"
|
||||
|
||||
async def _parse_document(self, args: dict) -> str:
|
||||
path = str(args.get("path", ""))
|
||||
result = await self.parser.parse(path) # MinerU / PaddleOCR(桩)
|
||||
return f"[parse_document] MinerU 解析(桩) path={result.get('path','')!r} blocks={len(result.get('blocks', []))}"
|
||||
"""文件 → 纯文本。content_b64=文件内容(base64),filename 决定解析器。"""
|
||||
import base64
|
||||
|
||||
from . import parsers
|
||||
|
||||
filename = str(args.get("filename", ""))
|
||||
content_b64 = str(args.get("content_b64", ""))
|
||||
if not content_b64:
|
||||
return str(args.get("text", ""))
|
||||
data = base64.b64decode(content_b64)
|
||||
# 解析是 CPU 密集,丢到线程池避免阻塞事件循环。
|
||||
return await asyncio.to_thread(parsers.parse, filename, data)
|
||||
|
||||
async def _secure_sandbox(self, args: dict) -> str:
|
||||
code = str(args.get("code", ""))
|
||||
|
||||
Reference in New Issue
Block a user