从diff到内容级对比:Open Terminal文件比对功能深度解析,文本/PDF/Office/电子书全覆盖
【免费下载链接】open-terminalA computer you can curl ⚡项目地址: https://gitcode.com/gh_mirrors/ope/open-terminal
Open Terminal 是一款"可以用 curl 访问的计算机"——为 AI Agent 和自动化工具提供命令执行与文件管理的自托管终端。它的文件比对功能(POST /files/compare)允许你在不改动任何原始文件的前提下,对比两个文件的差异:不仅支持代码和纯文本的逐行 diff,还能深入 PDF、Word、Excel、PowerPoint 乃至 EPUB 电子书的内部文本做内容级对比,并返回带行号、词级高亮的结构化结果 📄。
为什么需要文件比对功能:不止是代码 diff
传统diff命令只认字节和文本,遇到 PDF 或 Word 文档就束手无策。Open Terminal 的文件比对把"对比"从命令行扩展到了内容层面:
- 📄 对文档类文件,先提取可读文本再对比,而不是盲目比较二进制
- 🔍 结果不只是"有差异",而是给出新增行数、删除行数、上下文行号和词级变更高亮
- 🔒 全程只读:对比过程绝不修改原始文件
相关特性在 CHANGELOG.md 中有明确记录。
支持的文件类型清单:从文本到电子书
对比引擎按 MIME 类型或扩展名自动选择提取器,完整映射表见 open_terminal/utils/documents.py:
| 类别 | 格式 | 对比内容 |
|---|---|---|
| 纯文本 | 任意可解码文本(UTF-8/16/32) | 全文逐行 |
.pdf | 每页提取文本 | |
| Word | .docx | 正文、表格;含修订插入,不含页眉脚/批注 |
| Excel | .xlsx.xls.ods | 各工作表的单元格值 |
| PPT | .pptx.odp | 每页幻灯片的文本 |
| 电子书 | .epub | 按书脊顺序拼接的章节正文 |
| 其他 | .rtf.odt.eml | 富文本正文、ODT 段落、邮件头与正文 |
💡 对于文档类文件,对比附带清晰的注意事项(notices),明确告知"格式、图片、公式、附件不参与对比",避免你对结果产生误解。
对比原理:行级 diff + 词级高亮
核心实现在 open_terminal/utils/file_compare.py,分两层工作:
- 行级匹配:基于
difflib.SequenceMatcher对两版文本的行序列做分组比对,输出与 git diff 风格一致的 hunk,例如@@ -3,4 +3,5 @@,每行标记为context/added/removed,并带上新旧行号 - 词级高亮:对配对的一删一行,进一步在行内做分词级比对,标出具体哪些词被修改了(
segments字段);超过 4096 字符的超长行自动跳过行内匹配,防止性能爆炸
最终返回 JSON 包含additions、deletions统计和全部hunks,前端或 AI Agent 拿到即可直接渲染出高亮差异视图。
如何调用文件比对 API
端点定义在 open_terminal/main.py,请求体只需三个字段:
POST /files/compare { "original": "docs/report_draft.pdf", "revised": "docs/report_final.pdf", "ignore_whitespace": true }original/revised:两个文件路径,相对路径会基于当前终端会话的工作目录解析ignore_whitespace:忽略空格与制表符差异,适合对比格式调整过的文本- 鉴权:携带你的
OPEN_TERMINAL_API_KEY即可,服务启动后完整交互式文档见http://localhost:8000/docs
边界限制:文件大小、超时与错误提示
对比引擎在 file_compare.py 中设定了明确的护栏:
| 限制项 | 阈值 | 触达后的行为 |
|---|---|---|
| 单文件大小 | 50 MiB | 直接拒绝,不做部分对比 |
| 提取文本 | 200 万字符 / 5 万行 | 拒绝并提示,绝不截断 |
| 对比时长 | 60 秒 | 返回 408,建议换小文件 |
| 客户端断开 | 实时检测 | 立即终止并返回 499 |
加密 PDF、无文本层的扫描页 PDF、无法解析的 EPUB 章节都会被明确报告,而不是静默产出错误结果 ⚠️。
安全设计:只读比对与多用户隔离
- 路径安全:两个路径都会先解析再做双重权限校验(包括
realpath防符号链接逃逸),越界访问返回 403,文件不存在返回 404 - 用户隔离:多用户模式下,对比子进程会以对应 Linux 用户的身份运行(通过
sudo -n -u或 setuid 方式),每个用户只能对比自己工作区内的文件,详见 open_terminal/utils/user_isolation.py
核心源码导读
想深入理解实现,建议按以下顺序阅读:
- 提取层:open_terminal/utils/documents.py —— 12 种格式的文本提取器
- 对比层:open_terminal/utils/file_compare.py —— diff 算法、行内高亮与子进程编排
- 接口层:open_terminal/main.py ——
/files/compare端点 - 部署参考:README.md 与 Dockerfile(默认镜像内置 LibreOffice,适合文档场景)
总结:Open Terminal 的文件比对功能用一次 API 调用,就把"两个文件哪里不一样"这个问题从文本扩展到了 PDF、Office 全家桶和电子书,且只读、限时、限大小、可多用户隔离——这正是给 AI Agent 装上一双"能读文档的眼睛"🔍。
【免费下载链接】open-terminalA computer you can curl ⚡项目地址: https://gitcode.com/gh_mirrors/ope/open-terminal
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考