enterprise-artifact-search
基于多跳证据的企事业单位资料精准搜索与结构化提取。
基于GLM-OCR模型在AIPC上实现无API密钥的本地图像文字识别。
openclaw skills install @violet17/local-image-ocr-aipc命令、参数、文件名以原文为准
模型: ggml-org/GLM-OCR-GGUF (Q8_0, HuggingFace / hf-mirror)
推理引擎: llama-server (llama.cpp Vulkan 预编译版本,HTTP API)
SKILL_VERSION: 1.0.0
<OCR_DIR>\ ← 自动选择的磁盘或用户指定路径(例如 C:\image-ocr 或 D:\image-ocr)
├── llama.cpp\ ← llama-server.exe 及相关二进制文件
└── models\
└── GLM-OCR-GGUF\
├── GLM-OCR-Q8_0.gguf ← 主模型 (~950 MB)
└── mmproj-GLM-OCR-Q8_0.gguf ← 视觉投影层 (~484 MB,必需)Python 辅助脚本(位于此 SKILL.md 旁边):
| 文件 | 用途 |
|---|---|
_ocr_cfg.py | 共享辅助函数:通过环境变量或 .ocr_dir 配置文件解析 OCR_DIR |
preflight_workdir.py | 定位或创建 OCR 工作目录(写入 .ocr_dir 配置文件) |
preflight_llama.py | 检查 llama.cpp 版本 |
preflight_models.py | 检查模型文件是否存在 |
install_llama.py | 下载并解压 llama.cpp Vulkan 二进制文件 |
check_disk.py | 检查可用磁盘空间 |
download_models_hf.py | 通过 HuggingFace Hub 下载模型 |
download_models_modelscope.py | 通过 ModelScope 下载模型 |
verify_models.py | 验证下载的模型文件大小 |
ocr_run.py | 通过 llama-server HTTP API 对图像运行 GLM-OCR 推理 |
⚠️ 安装前注意事项 — 安全与合规说明
此技能将在您的系统上执行以下操作。请在授予自主执行权限前仔细审查。
操作 来源 风险等级 下载并解压 llama-server.exe及相关二进制文件github.com/ggml-org/llama.cpp发布页中等 — 执行下载的二进制文件 下载模型文件(总计约 1.5 GB) HuggingFace( huggingface.co)或 ModelScope(modelscope.cn)低 — 大文件下载 自动安装 Miniforge(若未检测到 Python) github.com/conda-forge/miniforge中等 — 静默安装 Python 至 %USERPROFILE%\miniforge3创建目录并在磁盘上写入文件 仅限本地文件系统 低 凭证信息:GLM-OCR 模型(
ggml-org/GLM-OCR-GGUF)为公开可获取,无需身份验证。若您使用私有或受保护的 HuggingFace 模型,可能需要在运行下载命令前设置$env:HUGGINGFACE_TOKEN—— 此技能不会自动请求或存储任何令牌。信任来源:请在继续前确认信任以下地址:
https://github.com/ggml-org/llama.cpp/releaseshttps://huggingface.co/ggml-org/GLM-OCR-GGUFhttps://github.com/conda-forge/miniforge(仅当触发 Miniforge 自动安装时)若您更倾向于手动控制每一步而非授予自主执行权限,请逐行运行 SKILL.md 中的 PowerShell 命令。
依赖项:模型文件通过 Python 的
huggingface_hub(hf download)或modelscope下载。若未安装 Python,第 2 步将自动安装 Miniforge(无需管理员权限)。
<OCR_DIR> 是经过预检后确定的绝对工作目录路径。执行流程(不可跳过步骤):
预检:检查工作目录 + llama.cpp + 模型文件 → 状态值
步骤 1:检查 Python(PYTHON_OK/MISSING) → PYTHON_OK
安装 / 更新 llama.cpp(仅当缺失时) → LLAMA_OK
步骤 2:下载模型(仅当缺失时) → MODEL_OK
步骤 3:通过 Python 调用 llama-server.exe HTTP API 运行推理 → 返回结果进度提示:每个步骤开始前会进行公告,例如:🔍 预检:正在检查环境…
如果 AI 助手使用的终端是 bash.exe(而非 PowerShell 或 CMD),通过 $env:OCR_DIR(PowerShell)或 set OCR_DIR=(CMD)设置的环境变量将无法被从 bash 启动的 Python 脚本识别。这是导致“找不到 llama.cpp / 模型”错误的最常见原因。
所有脚本均使用 _ocr_cfg.py,该文件按以下顺序解析 OCR_DIR:
OCR_DIR —— 仅在 bash 中正确 export 后生效.ocr_dir 配置文件** —— 由 preflight_workdir.py 自动创建于脚本所在目录**只要 preflight_workdir.py 曾经运行过一次(无论从哪个 shell),后续所有脚本都将自动找到 OCR 目录**,无需手动设置环境变量。
# 切换至脚本所在目录 —— 此操作会生成 .ocr_dir 配置文件
cd /path/to/local-image-ocr-aipc
python preflight_workdir.py # 写入 .ocr_dir,其余脚本将自动使用
python preflight_llama.py # 无需手动设置 OCR_DIR 即可正常运行
python ocr_run.py "C:\path\to\image.png"| 终端类型 | 是否需要 export OCR_DIR=...? | preflight_workdir.py 运行后是否可用? |
|---|---|---|
| PowerShell / CMD | 否(自动解析) | ✅ 是 |
| Git Bash | 否(读取 .ocr_dir 文件) | ✅ 是 |
| WSL bash | 否(读取 .ocr_dir 文件) | ✅ 是 |
注意:若在 WSL 中运行,
subprocess.Popen不支持creationflags。脚本已自动处理(当sys.platform != "win32"时,_CREATE_NO_WINDOW设为0)。
See [preflight_workdir.py](preflight_workdir.py)。
运行命令:python preflight_workdir.py
成功条件:输出中包含一行 OCR_DIR=。该操作还会生成一个 .ocr_dir 配置文件,使后续脚本可自动定位目录(无需设置环境变量)。请记录路径,并在后续步骤中将 <OCR_DIR> 替换为实际路径。
See [preflight_llama.py](preflight_llama.py)。
运行命令:python preflight_llama.py
See [preflight_models.py](preflight_models.py)。
运行命令:python preflight_models.py
| 输出 | 操作 |
|---|---|
两者均为 READY | ✅ 跳转至第 3 步 |
LLAMA_STATUS=MISSING/OUTDATED | ⬇️ 执行第 1 步 |
MODEL_STATUS=MISSING | ⬇️ 执行第 2 步 |
提示:✅ 环境检查完成。请按需执行相应步骤。
🐍 第 1a 步:检查 Python 是否可用…
注意:此步骤需要已存在的 Python 环境来运行脚本。请使用以下代码片段查找 Python 路径,记录为
PYTHON_EXE,并在后续所有步骤中使用该 Python。
选项 A — PowerShell(Windows 默认)
# 最小化 PowerShell 脚本用于定位 Python;后续所有步骤均通过 Python 执行
$customPythonExe = "" # 可选:手动指定路径,例如 "C:\Python311\python.exe"
$found = $null
if ($customPythonExe -and (Test-Path $customPythonExe)) { $found = $customPythonExe }
if (-not $found) {
foreach ($cmd in @("python","python3","py")) {
if (Get-Command $cmd -ErrorAction SilentlyContinue) { $found = (Get-Command $cmd).Source; break }
}
}
if (-not $found) {
foreach ($p in @(
"$env:USERPROFILE\miniforge3\python.exe","$env:USERPROFILE\miniconda3\python.exe",
"$env:USERPROFILE\anaconda3\python.exe")) {
if (Test-Path $p) { $found = $p; break }
}
}
if ($found) { $env:PYTHON_EXE = $found; Write-Host "PYTHON_STATUS=OK"; Write-Host "PYTHON_EXE=$found" }
else { Write-Host "PYTHON_STATUS=MISSING" }选项 B — Bash / Git Bash / WSL(当 PowerShell 不可用时的备用方案)
# 通过 bash 查找 Python;设置 PYTHON_EXE 供后续步骤使用
CUSTOM_PYTHON_EXE="" # 可选:例如 "/c/Python311/python.exe"
found=""
if [ -n "$CUSTOM_PYTHON_EXE" ] && [ -x "$CUSTOM_PYTHON_EXE" ]; then
found="$CUSTOM_PYTHON_EXE"
fi
if [ -z "$found" ]; then
for cmd in python python3 py; do
if command -v "$cmd" >/dev/null 2>&1; then
found=$(command -v "$cmd")
break
fi
done
fi
if [ -z "$found" ]; then
for p in \
"$USERPROFILE/miniforge3/python.exe" \
"$USERPROFILE/miniconda3/python.exe" \
"$USERPROFILE/anaconda3/python.exe" \
"$HOME/miniforge3/bin/python" \
"$HOME/miniconda3/bin/python" \
"$HOME/anaconda3/bin/python"; do
if [ -x "$p" ]; then found="$p"; break; fi
done
fi
if [ -n "$found" ]; then
export PYTHON_EXE="$found"
echo "PYTHON_STATUS=OK"
echo "PYTHON_EXE=$found"
else
echo "PYTHON_STATUS=MISSING"
fi**如果未找到 Python(PYTHON_STATUS=MISSING)**,请安装 Miniforge:
需用户确认:Miniforge 将静默安装至
%USERPROFILE%\miniforge3。安装内容包括 Python 运行时及 conda/pip 工具链。无需管理员权限。
来源:
github.com/conda-forge/miniforge。请在继续前获得用户确认。
选项 A — PowerShell
# 使用 PowerShell 下载并静默安装 Miniforge(无法通过 Python 启动——此处必须使用 PowerShell)
$mf = "$env:TEMP\Miniforge3-Windows-x86_64.exe"
Invoke-WebRequest -Uri "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Windows-x86_64.exe" -OutFile $mf
Start-Process $mf -ArgumentList "/S /D=$env:USERPROFILE\miniforge3" -Wait
Remove-Item $mf
$env:PYTHON_EXE = "$env:USERPROFILE\miniforge3\python.exe"
& $env:PYTHON_EXE --version
Write-Host "PYTHON_STATUS=OK"选项 B — Bash / Git Bash / WSL(当 PowerShell 不可用时的备用方案)
# 使用 curl + bash 下载并静默安装 Miniforge
MF_URL="https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh"
# 在 Windows/Git Bash 中请使用 Windows 安装包:
# MF_URL="https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Windows-x86_64.exe"
MF_INSTALLER="/tmp/Miniforge3-install.sh"
curl -fsSL "$MF_URL" -o "$MF_INSTALLER"
bash "$MF_INSTALLER" -b -p "$HOME/miniforge3"
rm -f "$MF_INSTALLER"
export PYTHON_EXE="$HOME/miniforge3/bin/python"
"$PYTHON_EXE" --version
echo "PYTHON_STATUS=OK"| 输出 | 操作 |
|---|---|
PYTHON_STATUS=OK | ✅ 继续执行第 1b 步(如需则安装 llama.cpp) |
PYTHON_STATUS=MISSING → Miniforge 已安装 | ✅ 继续执行第 1b 步 |
| Miniforge 下载失败 | ⛔ 检查网络连接,或手动安装 Python |
提示:✅ Python 已准备就绪。正在检查 llama.cpp…
⬇️ 第 1b 步:安装/更新 llama.cpp Vulkan…(仅当
LLAMA_STATUS=MISSING/OUTDATED时执行)
需用户确认:在继续前,请告知用户:
- 将从
github.com/ggml-org/llama.cpp/releases下载一个 ZIP 包(约 50–100 MB)- 解压至
<OCR_DIR>\llama.cpp\目录,原 ZIP 文件将被删除llama-server.exe将被保存到磁盘,并由ocr_run.py启动为本地 HTTP 服务请在运行下载命令前向用户确认。
查看 [install_llama.py](install_llama.py)。若存在新版本,请修改顶部的 TAG 变量。
运行命令:python install_llama.py
| 输出 | 操作 |
|---|---|
LLAMA_INSTALL=DONE | ✅ 继续执行第 2 步以下载模型 |
| 下载失败 | ⛔ 检查网络连接,或手动从浏览器下载并解压至 <OCR_DIR>\llama.cpp\ |
提示:✅ llama.cpp 已安装。继续执行第 2 步以下载模型。
📦 第二步:下载 GLM-OCR 模型…(仅当
MODEL_STATUS=MISSING时执行)
注意:模型通过 Python 的
hf download(huggingface_hub)或modelscope下载。请确保 Python 已正确安装(第1步中
PYTHON_STATUS=OK)。将使用$env:PYTHON_EXE执行。
MODEL_STATUS=MISSING 时必读)向用户展示以下信息,然后询问是否继续:
📥 首次模型下载约 1.5 GB
(GLM-OCR-Q8_0.gguf ~950 MB + mmproj ~484 MB)。
预估下载时间:
• 100 Mbps 网络:约 2 分钟
• 50 Mbps 网络:约 4 分钟
• 10 Mbps 网络:约 20 分钟
下载支持断点续传 —— 若中断,重新运行此步骤将自动从断点处继续。
✅ 准备就绪 —— 开始自动下载
📂 我希望手动下载 —— 跳过自动下载参考 [check_disk.py](check_disk.py)。
执行命令:python check_disk.py
| 输出结果 | 操作 |
|---|---|
DISK_STATUS=OK | ✅ 继续下载模型 |
DISK_STATUS=LOW | ⚠️ 提示用户释放空间后继续 |
选项 A:使用 huggingface_hub Python API(推荐)
参考 [download_models_hf.py](download_models_hf.py)。若需使用中国镜像,请取消注释文件中的 HF_ENDPOINT 行。
执行命令:python download_models_hf.py
选项 B:使用 ModelScope(适用于中国用户)
参考 [download_models_modelscope.py](download_models_modelscope.py)。
执行命令:python download_models_modelscope.py
验证下载结果
参考 [verify_models.py](verify_models.py)。
执行命令:python verify_models.py
| 输出结果 | 操作 |
|---|---|
MODEL_DOWNLOAD=DONE | ✅ 继续进入第三步 |
| 超时或反复失败 | ⚠️ 引导用户前往“手动下载备用方案”部分,或切换选项 A/B 后重试 |
提示信息:✅ 模型下载完成。
若自动下载多次失败,请引导用户手动下载并放置到正确目录:
⚠️ 自动下载失败。请手动下载以下两个文件:
1. GLM-OCR-Q8_0.gguf (~950 MB)
HuggingFace: https://huggingface.co/ggml-org/GLM-OCR-GGUF/resolve/main/GLM-OCR-Q8_0.gguf
HF镜像站: https://hf-mirror.com/ggml-org/GLM-OCR-GGUF/resolve/main/GLM-OCR-Q8_0.gguf
ModelScope: https://modelscope.cn/models/ggml-org/GLM-OCR-GGUF/resolve/master/GLM-OCR-Q8_0.gguf
2. mmproj-GLM-OCR-Q8_0.gguf (~484 MB)
HuggingFace: https://huggingface.co/ggml-org/GLM-OCR-GGUF/resolve/main/mmproj-GLM-OCR-Q8_0.gguf
HF镜像站: https://hf-mirror.com/ggml-org/GLM-OCR-GGUF/resolve/main/mmproj-GLM-OCR-Q8_0.gguf
ModelScope: https://modelscope.cn/models/ggml-org/GLM-OCR-GGUF/resolve/master/mmproj-GLM-OCR-Q8_0.gguf
下载完成后,请将两个文件放入以下目录:
<OCR_DIR>\models\GLM-OCR-GGUF\
然后重新运行验证命令,确认文件完整无误后,再进入第三步。🔍 第三步:处理 GLM-OCR 识别结果…
| 情况 | 操作 |
|---|---|
用户消息中包含本地文件路径(如 C:\Users\...\xxx.png) | ⬇️ 情况 A:从消息中提取路径,编写并运行 Python 脚本 |
| 用户通过界面上传图片,OpenClaw 提供临时路径 | ⬇️ 情况 B:从上下文中获取临时路径,编写并运行 Python 脚本 |
| 以上均不满足 | ⛔ 请用户提供本地文件路径或上传图片 |
步骤 1 — 设置图像路径:打开 [ocr_run.py](ocr_run.py),将 IMG_PATH 设置为从用户消息中提取的文件路径。也可通过命令行参数传入路径。
步骤 2 — 运行推理:
python ocr_run.py "<从用户消息中提取的文件路径>"成功标准:标准输出中包含识别出的文本内容。
OpenClaw 将上传的图片保存在临时路径中。请从上下文获取该路径。
步骤 1 — 设置图像路径:打开 [ocr_run.py](ocr_run.py),将 IMG_PATH 设置为 OpenClaw 提供的临时路径。也可通过命令行参数传入。
步骤 2 — 运行推理:
python ocr_run.py "<OpenClaw 提供的临时图像路径>"成功标准:标准输出中包含识别出的文本内容。
获取识别文本后,根据用户意图进行处理:
| 场景 | 处理方式 |
|---|---|
| 通用文本提取 | 原样输出识别内容,保留原始排版 |
| 发票 / 收据 | 从文本中提取结构化字段;输出为 JSON + 可读格式 |
| 表格内容 | 将识别结果重新格式化为 Markdown 表格 |
| 名片信息 | 提取姓名、职位、公司、电话、邮箱、地址;输出为 JSON |
| 身份证 / 证书类文档 | 按原文布局输出结构化内容 |
| 屏幕截图 / 文档 | 按段落组织输出 |
| 用户自定义需求 | 根据用户说明的要求进行处理 |
完成提示:
✅ 识别完成!
如需重新处理、更改输出格式或导出为文件,请告知我。| 情况 | 处理方式 |
|---|---|
ERROR: File not found | 文件路径不存在 —— 请用户确认路径是否正确 |
| 输出为空或混乱 | 图像质量过低 —— 请用户重新拍摄或扫描 |
| 图像模糊 / 分辨率过低 | 请用户重新拍摄或放大后再尝试 |
| 未检测到文字 | 通知用户当前图像中无可识别的文字内容 |
| 错误 | 原因 | 解决方案 |
|---|---|---|
PYTHON_STATUS=MISSING | 未安装 Python | 步骤 1 会自动安装 Miniforge;确认同意后重试 |
llama-server 未找到 | llama-server.exe 路径设置不正确 | 确认 <OCR_DIR>\llama.cpp\llama-server.exe 文件是否存在 |
| 服务器无法启动 | 二进制版本错误、Vulkan 错误或端口冲突 | 重新运行步骤 1 以重新安装最新版 llama.cpp;检查 Vulkan 驱动 |
ggml_vulkan: no devices found | 未安装 Vulkan 驱动 | 更新 GPU 驱动 |
error: unable to open model | 模型路径错误 | 重新运行预检模型检查以验证路径 |
MODEL_DOWNLOAD= 无输出 | 下载中断 | 切换选项 A / B,或配置代理 |
| 输出乱码 / 无内容 | 图像质量过低 | 提高图像质量 |
| VRAM 不足 / 崩溃 | GPU 内存不足 | 降低 -ngl 值,或使用 --device none |
已收录 1 个 Skill