middleware.py 1.5 KB

12345678910111213141516171819202122232425262728293031
  1. """文档传输兼容层;原件解析与渲染仍由 Agent 的沙箱代码完成。"""
  2. from pathlib import PurePosixPath
  3. from langchain.agents.middleware.types import AgentMiddleware
  4. from langchain_core.messages import ToolMessage
  5. def _pdf_read_feedback(request):
  6. call = request.tool_call
  7. if call['name'] != 'read_file':
  8. return None
  9. path = call.get('args', {}).get('file_path', '')
  10. if not isinstance(path, str) or PurePosixPath(path).suffix.lower() != '.pdf':
  11. return None
  12. # 当前 OpenAI 兼容网关不接受框架的 PDF file 内容块。给模型可恢复反馈,
  13. # 不在此处隐式 OCR 或调用旧解析器,也不读取这份原件。
  14. return ToolMessage(content=(
  15. 'PDF 是二进制原件,当前模型接口不能直接接收 PDF 附件。请按 Skill 自己编写 Python,'
  16. '通过 run_python 使用 pypdfium2 取得页数和文本;扫描页渲染为 PNG,再用 read_file 查看 PNG。'
  17. '代码内将 /workspace/ 前缀移除,使用工作区相对路径。'
  18. ), tool_call_id=call['id'], name='read_file', status='error')
  19. class MainFanSandboxMiddleware(AgentMiddleware):
  20. def wrap_tool_call(self, request, handler):
  21. feedback = _pdf_read_feedback(request)
  22. return feedback if feedback is not None else handler(request)
  23. async def awrap_tool_call(self, request, handler):
  24. feedback = _pdf_read_feedback(request)
  25. return feedback if feedback is not None else await handler(request)