用 DeepSeek-OCR(OCR1)做光学压缩记忆
31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/16 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add DDDFXYqiming/dsh-ocr1-memory该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · chat
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 18 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(runtime_add_failed · 2026/10/30) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库 package.json 标记 private,未发布到 npm,需从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包@dsh-external/dsh-ocr1-memory(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.19 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 06:57:51
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 83 处,展示前 43 条)
- 写入本地文件lib/index.js:139
mkdirSync(cfg.storeDir, { recursive: true }) - 读取本地文件lib/index.js:475
const rendererReady = cfg.useMockRenderer || existsSync(cfg.renderScript) - 发起网络请求lib/core.js:365
const res = await fetch(`${baseUrl.replace(/ $/, '')}/chat/completions`, { - 发起网络请求lib/core.js:514
const res = await fetch(`${baseUrl.replace(/ $/, '')}/chat/completions`, { - 发起网络请求lib/core.js:550
const res = await fetch(`${rootUrl(baseUrl)}/props`, { - 发起网络请求lib/core.js:568
const res = await fetch(`${baseUrl.replace(/ $/, '')}/embeddings`, { - 发起网络请求lib/core.js:614
const res = await fetch(`${baseUrl.replace(/ $/, '')}/embeddings`, { - 发起网络请求lib/core.js:664
const res = await fetch(`${baseUrl.replace(/ $/, '')}/embeddings`, { - 读取本地文件lib/core.js:849
if (!force && entry.imagePath && entry.tier === tierInfo.name && existsSync(entry.imagePath)) return entry.imagePath - 读取本地文件lib/core.js:868
if (existsSync(cachePath)) { - 读取本地文件lib/core.js:872
if (existsSync(cachedSidecar)) await fs.copyFile(cachedSidecar, outputPath + '.embedding.json') - 读取本地文件lib/core.js:889
if (existsSync(outputSidecar)) await fs.copyFile(outputSidecar, cachePath + '.embedding.json') - 读取本地文件lib/core.js:907
if (existsSync(embeddingPath)) { - 读取本地文件lib/core.js:1055
const stale = entry.tier !== target.name || !entry.imagePath?.includes(`__${target.name}.`) || !entry.imagePath || !existsSync(entry.imagePath) - 读取本地文件lib/context.js:40
if (!existsSync(manifestPath)) return '' - 读取本地文件lib/context.js:41
const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) - 读取本地文件lib/context.js:92
if (!existsSync(manifestPath)) return [] - 读取本地文件lib/context.js:93
const parsed = JSON.parse(readFileSync(manifestPath, 'utf8')) - 发起网络请求lib/ocr-server.js:68
const res = await fetch(healthUrl(baseUrl), { signal: requestSignal(signal, timeoutMs) }) - 执行外部命令固定命令lib/ocr-server.js:83
const killer = spawn('taskkill', ['/PID', String(numericPid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' }) - 读取本地文件lib/memory-system.js:273
if (existsSync(p)) { - 写入本地文件lib/memory-system.js:357
copyFileSync(join(dir, 'pending', safeName), archived) - 删除本地文件lib/memory-system.js:358
rmSync(join(dir, 'pending', safeName), { force: true }) - 写入本地文件lib/memory-system.js:371
writeFileSync(join(dir, history), old, 'utf8') - 读取本地文件lib/memory-system.js:423
files = readdirSync(join(dir, '.history')).filter((file) => parseHistoryName(type, topic, file)).sort() - 读取本地文件lib/memory-system.js:427
const raw = readFileSync(join(dir, '.history', source), 'utf8') - 读取本地文件lib/memory-system.js:510
for (const entry of readdirSync(memoryDir, { withFileTypes: true })) { - 写入本地文件lib/memory-system.js:670
try { writeFileSync(join(dir, history), oldContent, 'utf8') } catch { } - 读取本地文件lib/automation.js:32
state = JSON.parse(readFileSync(path, 'utf8')) || {} - 写入本地文件lib/automation.js:37
writeFileSync(path, JSON.stringify({ totalTurns, updatedAt: new Date().toISOString() }, null, 2), 'utf8') - 执行外部命令固定命令lib/governance.js:90
branch = execFileSync("git", ["branch", "--show-current"], { - 写入本地文件lib/governance.js:112
mkdirSync(root, { recursive: true }); - 写入本地文件lib/governance.js:113
mkdirSync(join(root, "sops"), { recursive: true }); - 写入本地文件lib/governance.js:114
mkdirSync(join(root, PENDING_DIR), { recursive: true }); - 写入本地文件lib/governance.js:115
mkdirSync(join(root, ARCHIVE_DIR), { recursive: true }); - 写入本地文件lib/governance.js:116
mkdirSync(join(root, HISTORY_DIR), { recursive: true }); - 读取本地文件lib/governance.js:124
if (!existsSync(p)) writeFileSync(p, content, "utf8"); - 写入本地文件lib/governance.js:124
if (!existsSync(p)) writeFileSync(p, content, "utf8"); - 读取本地文件lib/governance.js:137
return readFileSync(join(root, "index.txt"), "utf8"); - 读取本地文件lib/governance.js:153
const text = readFileSync(join(root, "facts.md"), "utf8"); - 读取本地文件lib/governance.js:168
return readdirSync(join(root, "sops")) - 读取本地文件lib/governance.js:179
return readdirSync(join(root, PENDING_DIR)) - 读取本地文件lib/governance.js:189
return JSON.parse(readFileSync(join(root, META_FILE), "utf8"));
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 光学压缩记忆
README
由 DeepSeek 最新模型翻译生成@dsh-external/dsh-ocr1-memory
一个 DSH 光学记忆插件,思路来自 DeepSeek-OCR 论文(Contexts Optical Compression,OCR1)。文本记忆按段落渲染成带 SoM 编号的图像,旧记忆按年龄降低分辨率。检索默认依据文本与 OCR 证据,配置了光学定位器的话,可以再由模型挑出相关段,最后确定性地返回原始 verbatim 文本。
把记忆渲染成图像,用的是论文里对长上下文做光学压缩的思路,这一步到底省了多少,ocr1_mem_metrics 会给出文本 token、视觉 token 和压缩比的实测数字,省不省一目了然。
能力
| 工具 | 作用 |
| ocr1_mem_status | 查看存储、渲染与 OCR 配置状态 |
| ocr1_mem_store | 分段、渲染并保存记忆 |
| ocr1_mem_update | 更新记忆并重置为最新层级 |
| ocr1_mem_retrieve | 检索、OCR 读回、active recall |
| ocr1_mem_list | 列出记忆条目与命中次数 |
| ocr1_mem_metrics | 查看文本/视觉 token 与压缩比 |
| ocr1_mem_calibrate | 校准文本 token 基线 |
展开完整文档(README 剩余 1 节)
@dsh-external/dsh-ocr1-memory 一个 DSH 光学记忆插件,思路来自 DeepSeek-OCR 论文(Contexts Optical Compression,OCR1)。文本记忆按段落渲染成带 SoM 编号的图像,旧记忆按年龄降低分辨率。检索默认依据文本与 OCR 证据,配置了光学定位器的话,可以再由模型挑出相关段,最后确定性地返回原始 verbatim 文本。 把记忆渲染成图像,用的是论文里对长上下文做光学压缩的思路,这一步到底省了多少,ocr1_mem_metrics 会给出文本 token、视觉 token 和压缩比的实测数字,省不省一目了然。 能力 | 工具 | 作用 | | ocr1_mem_status | 查看存储、渲染与 OCR 配置状态 | | ocr1_mem_store | 分段、渲染并保存记忆 | | ocr1_mem_update | 更新记忆并重置为最新层级 | | ocr1_mem_retrieve | 检索、OCR 读回、active recall | | ocr1_mem_list | 列出记忆条目与命中次数 | | ocr1_mem_metrics | 查看文本/视觉 token 与压缩比 | | ocr1_mem_calibrate | 校准文本 token 基线 | | ocr1_mem_forget | 删除记忆及其光学产物 | | ocr1_mem_render_test | 渲染管线自测 | | ocr1_mem_embed_test | 视觉 embedding 自测 | | memory_read / memory_retrieve | 读取 L1/L2/L3,并优先走 OCR1 光学召回 | | memory_write / memory_update | 带 evidence 的治理写入,自动同步 OCR1 SoM | | memory_search / memory_promote | 全文检索与跨 namespace 提升 | | memory_pending / memory_accept | 审阅自动蒸馏候选并确认入库 | | memory_maintain / memory_stats | 去重、L1 压缩、统计与光学状态 | | memory_index / memory_archive / memory_rollback | 重建索引、归档与历史恢复 | | memory_expand / memory_activate | 展开 DSH 溯源事件、激活记忆治理 | 工作方式 1. 文本按空行和长度切成段落,再渲染为 SoM 图像。 2. 记忆图像的分辨率随年龄在 vivid → normal → fuzzy 三级之间衰减。哪次检索命中了低清记忆,active recall 会先把它恢复成高清。 3. 配置光学定位器后,由模型输出 K 位 0/1 标签,插件按阈值和 Top-K 规则选出段落。 4. Fetch 阶段只从持久化原文取回选中的段,返回的就是原文本身,没有替代文本。 5. 视觉 embedding 和命中热度衰减是可选能力。每轮 context 注入默认开启,index 模式注入 L1 与光学元数据,要保留正文快照就选 contextMode: snapshot。 6. 治理工具和 OCR1 store 用的是同一个插件实例。每轮默认只注入 L1 与光学元数据,详细正文按需 Fetch,历史 context 快照靠 contextMode: snapshot 保留。 7. tools/result 里先失败后成功的序列会在 turn/end 生成 pending。到了维护周期或阈值就自动维护并提醒,正式记忆仍由带 evidence 的治理写入确认。 配置 在 profile 的 cordis.patch.yml 里覆盖需要的选项。 - id: dsh-ocr1-memory config: storeDir: '' memoryDir: '~/.dsh/memory' maxIndexLines: 30 autoNamespace: true autoPending: true maintainEveryTurns: 20 maintenanceBatchSize: 8 # 每次维护最多处理的光学条目数 reflectPendingThreshold: 5 reflectSopsThreshold: 40 OCR / llama-server ocrBaseUrl: '' ocrApiKey: '' ocrModel: 'deepseek-ai/DeepSeek-OCR' requireOcr: false # true = OCR 不可用时失败,不静默走文本降级 autoStartOcrServer: false ocrServerPath: '' # 也可使用 OCR_SERVER_PATH 或 PATH 中的 llama-server ocrModelDir: '' ocrServerPort: 18080 Optical locator opticalLocatorEnabled: false opticalLocatorBaseUrl: '' opticalLocatorModel: 'deepseek-ocr-memory' opticalLocatorThreshold: 0.4 opticalLocatorTopK: 5 opticalLocatorStrict: true opticalLocatorAutoStart: false opticalLocatorServerPath: '' opticalLocatorModelDir: '' opticalLocatorServerPort: 18081 opticalLocatorModelFile: 'deepseek-ocr-locator-q8_0.gguf' opticalLocatorMmprojFile: 'mmproj-locator-q8_0.gguf' Context / retrieval dynamicDecayEnabled: false autoInjectContext: true contextMode: 'index' # snapshot 可保留正文快照 contextMaxEntries: 5 contextMaxChars: 4000 sharedStore: false embeddingRetrieval: false ocrMaxEntriesPerRetrieve: 5 想让插件自己管一个真实的 CPU llama-server,把 autoStartOcrServer 设为 true,同时提供 ocrServerPath 和 ocrModelDir。ocrBaseUrl 里写了显式端口的话,健康检查和启动都以它为准。Embedding 默认不参与主检索,复用同一个服务时把 ocrEmbeddingBaseUrl 留空即可。训练后的 Locator 可以通过 opticalLocatorAutoStart 在独立 endpoint 自动启动,模型目录也可以交给 OPTICAL_LOCATOR_MODEL_DIR 提供。 环境变量回退(仅在对应 Config 字段留空时生效,Config 永远优先;面向源码直跑/脚本场景,profile 部署建议全部走 cordis.yml):OCR_SERVER_PATH(ocr/embedding/locator 的 serverPath 默认)、OCR_MODEL_DIR / OCR_EMBEDDING_MODEL_DIR(模型目录)、OPTICAL_LOCATOR_MODEL_DIR(locator 模型目录)、PYTHON(渲染器直调时的 python 可执行文件)。 高级选项见 docs/IMPLEMENTATION.md。 安装 dsh plugin --profile web add github:DDDFXYqiming/dsh-ocr1-memory OCR 后端 插件通过 OpenAI 兼容接口与后端通信(llama.cpp 官方文档列出了 /v1/chat/completions、/v1/embeddings 和多模态输入能力)。 - /v1/chat/completions 负责 OCR 读回和光学定位。 - /v1/embeddings 提供可选的多模态视觉 embedding。 配好 ocrBaseUrl 就能用上 OCR。requireOcr: false 时后端不可用会保留文本检索路径,requireOcr: true 时则直接报告 OCR 错误。autoStartOcrServer 开启后,插件按 endpoint 去重启动 llama-server,只清理自己启动的进程。后端启动、CPU-only 配置、模型格式和平台注意事项见 docs/DEPLOYMENT.md。 文档 | 文档 | 内容 | | WORKFLOW | 工作流程图 | | IMPLEMENTATION | 架构与实现说明 | | DEPLOYMENT | 后端部署与验证 | | STATUS | 当前实现状态 | | BENCHMARK | 与 dsh-memory 的隔离对比 | | EXPLORATION | 研究与实测记录 | | TEST_SPEC / TEST_REPORT | 测试说明与报告 | | PAPER_MAPPING | 论文原生机制与插件工程扩展的逐项边界 | 当前 npm test 为 88/88 通过(无后端时真实后端用例会跳过)。 本地工具路径 迁移脚本默认使用当前用户主目录下的 .dsh/memory 与 .dsh/ocr1-memory,可通过 OLD_MEMORY_ROOT 和 OCR1_STORE_DIR 覆盖。精选迁移还支持 OLD_MEMORY_NAMESPACE,默认使用当前系统用户名。渲染脚本位置从迁移脚本自身目录解析,与启动命令时的工作目录无关。 scripts/build.sh 默认只检查构建。只有显式提供 DSH_PROFILE_NODE_MODULES 时,才尝试修复对应 profile 的插件链接。 参考资料 - DeepSeek-OCR · 论文 - OCR-Memory - AgentOCR
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
DDDFXYqiming/dsh-ocr1-memory
用 DeepSeek-OCR(OCR1)做光学压缩记忆
相关插件 · 对话 / 记忆
上下文中枢oceanbase/powercontext
上下文跟着工作走 —— 跨会话、跨智能体、跨人。
★ 1,487已汉化DSH
73
智能体记忆库plastic-labs/honcho
Honcho 是记忆基础设施,用来构建有状态的智能体。这些智能体能理解不断变化的人、智能体、群组、项目和想法。
★ 7,894已汉化DSH
71.7
长程智能体控制面loopx-project/loopx
给 Agent 一个目标,让工作持续向前。
★ 6,358已汉化DSH
71.3
智能体上下文数据库volcengine/OpenViking
给 AI 智能体用的上下文数据库
★ 41,379已汉化DSH
71.3
长效机器人团队Fei2411/DS-Bot
DS Bot 是一个基于 DeepSeek Harness简称 dsh的 bot 插件,插件将 dsh 改造为 bot…
★ 5,084已汉化DSH
71.1
可携带记忆层EverMind-AI/EverOS
为什么选择 EverOS
★ 13,778已汉化DSH
71.1