尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

FluentRead DeepSeek Harness 内嵌方式与代码地图:只追加会话投影、有界工具循环与 30 天阅读问答仓库

FluentRead DeepSeek Harness 内嵌方式与代码地图:只追加会话投影、有界工具循环与 30 天阅读问答仓库 前端AI 应用本地部署【免费下载链接】FluentReadAn open-source browser extension for bilingual translation. 一款开源的浏览器双语翻译插件。项目地址https://gitcode.com/gh_mirrors/fl/FluentRead点击查看免费下载本篇技术指南基于 FluentRead 仓库中的《DeepSeek Harness 内嵌方式与代码地图》范围核查报告docs/reports/harness-embedding-map-20260905.md剖析浏览器双语翻译插件 FluentRead 如何将 DeepSeek Harness 的会话内核能力选择性移植进扩展哪些部分被采纳、哪些模块被明确排除、代码放在哪里、流式显示与 30 天会话存储的真实语义是什么。读完本文你将掌握这套 Harness 阅读学习链路从网页选区、扩展后台、模型网关到本机 IndexedDB 的完整调用骨架并能直接依据仓库内的源码路径与测试用例深入验证每一层实现。适用场景本功能在 FluentRead 中称为AI 翻译卡片 / DeepSeek Harness面向选区阅读学习读懂、拆句、用法、练习四种动作。使用与配置说明见 docs/guide/deepseek-harness.md实现范围验证见 Harness 阅读学习实现报告。核查基线为已提交代码5704bb848347c2dcd2791c1bf702c59f3b8dc5ca其中 Harness 实现与 PR #440 合并提交6b4772981b96d083b00cb37ddd2d6a0f13755895相同不把正在进行的阅读交互修复计为已交付功能。1. 内嵌策略总览选择性移植而非整包嵌入当前实现的核心定位是移植 DeepSeek Harness 会话事件投影的只追加子集加上 FluentRead 自己的浏览器模型与工具循环、流式通信和阅读问答仓库。插件没有把完整 DeepSeek Harness 包嵌入扩展也没有运行一个上游后台服务。目前接入的是选区阅读学习链路全文、悬浮和原划词翻译仍走原来的翻译链路。1.1 实际采用了什么部分实际来源及实现方式本地代码会话事件投影从上游packages/core/session/src/surface.ts适配只追加子集保留三类消息事件、append 标记、连续序号和消息投影src/core/harness/surface.ts单次执行循环FluentRead 独立实现把模型消息、工具结果先记入 ledger再投影给下一次模型调用src/core/harness/loop.ts阅读任务FluentRead 实现读懂、拆句、用法、练习四套提示词配置、模型和工具在后台组装src/services/harness/runtime.ts模型连接复用 AI SDK 与 FluentRead 已保存的服务配置、凭据和网络边界src/services/harness/modelGateway.ts正文流式显示AI SDK 消费真实text-delta通过扩展 runtime port 传到阅读卡runtime.ts、src/features/reading-assistant/client.ts、src/features/reading-assistant/streamPort.ts30 天阅读记录FluentRead 自建会话编排与 IndexedDB 仓库保存选文、授权段落和问答src/services/harness/conversation.ts、src/platform/storage/harnessSessionRepository.ts页面入口与设置FluentRead 的 Vue 组件、原生选区、现有设置导航和 Config 持久化src/features/reading-assistant/ui/ReadingPanel.vue、src/features/selection-translation/ui/SelectionTranslator.vue、src/features/settings/ui/HarnessSettings.vue1.2 哪些模块未引入PR #440 的合并差异没有删除或重命名文件记录因此准确说法是选择性移植、没有引入下列模块而非整包导入后删除。上游能力当前处理与浏览器阅读产品的关系CLI、桌面 Web UI未引入用户仍在网页选区卡片与 FluentRead 设置页中操作host / bridge、Cordis 插件加载器未引入后台组合与消息通信由既有扩展架构负责文件系统、shell、子进程、沙箱、动态代码执行未引入阅读解释不需要本机执行能力远程插件、网页抓取工具未引入模型只能使用本次选区及显式允许的段落快照完整上游 Session 持久化、日志恢复未引入本地只保存产品需要的阅读问答surface replacement、provenance rewrite未移植本地 ledger 仅支持追加不支持上游的历史替换与来源重写语义模型当前只有一个可调用工具read_context。它返回请求开始时捕获的授权段落不会再次访问 DOM也不会抓取页面链接选择当前选区模式时这个工具甚至不提供给模型。读懂、拆句、用法、练习是四种阅读任务不是四个工具也不是确定性语法解析器单词本收藏由用户点击按钮触发模型不能自主写入单词本。1.3 上游版本固定与依赖边界采用的上游参考版本为 DeepSeek Harnessdsh-v0.1.3-alpha.1固定提交d347e703908d0406b7a7ef80e3a0e594d86b2215最初的dsh-v0.1.2-rc.1链接没有作为当前实现的固定来源。直接参考的上游surface.ts的 SHA-256 记录在 docs/guide/deepseek-harness.mdaa75a34df001b33d3b1e4dd5c24a0391d00bc457e0a83f25757d3358b12b684f上游 MIT 许可随包保存在 public/third-party-notices/deepseek-harness-MIT.txt。package.json中没有deepseek-harness或deepseek-harness/*依赖相关运行时依赖是ai、ai-sdk/openai-compatible、ai-sdk/anthropic、ai-sdk/google、zod和已有的dexie。这意味着上游后续升级不会自动进入本插件每次升级都需要逐项审查并同步更新适配代码。2. 会话事件投影内核surface.ts 的只追加子集src/core/harness/surface.ts 是整套内嵌方案中唯一直接来自上游规则的移植子集它回答一个关键问题哪些事件应成为下一次模型请求中的消息、顺序是否有效。它不负责模型联网、UI 展示或数据库保存。从源码结构看该模块定义了三类 surface 消息事件与一个 append 标记事件类型user/message、assistant/message、tool/result另有turn/start、step/start、step/end、assistant/attempt等非 surface 事件每个事件携带单调递增的seq连续序号以及可选的surfaceOp: append标记投影规则foldSurface连续序号校验、非 surface 事件禁止携带surfaceOp、surface 事件必须携带surfaceOp、空助手消息跳过deriveEventMessage对空content返回nullHarnessLedger提供appendUser/appendAssistant/appendToolResult三个追加入口以及eventsSnapshot()/messagesSnapshot()两个快照方法。写入和快照边界均用structuredClone复制数据以保护原始事件不被后续修改污染事件本身以Object.freeze冻结。值得注意的实现细节append返回的是克隆后的副本而不是内部引用——测试 tests/harnessCore.test.ts 中有专门用例 does not expose its stored event through append return values 验证内部事件不会通过返回值泄露。该测试文件还覆盖了 ports upstream surface eligibility and projection rules空助手消息不投影、非 surface 事件不投影、requires contiguous append events and rejects unmarked surface events序号不连续、缺少 append 标记、非 surface 事件携带标记均抛错等行为。3. 有界执行循环loop.ts 的事件先记录后投影src/core/harness/loop.ts 是 FluentRead 独立实现非上游移植以供应商无关的方式串联会话消息、只读工具与最终回答并保持事件先记录后投影的上游顺序。该模块不依赖 AI SDK、浏览器、配置或网络FluentRead 服务层负责把实际模型协议适配为这里的纯类型端口。循环的边界约束对应HarnessLoopInput的默认值与钳制规则模型调用次数maxModelCalls默认 4 次钳制在 16 之间工具调用次数maxTools默认 2 次钳制在 06 之间总超时timeoutMs默认 40 秒钳制在 160 秒之间超时抛阅读助手请求超时取消内部AbortController把调用方信号的中断携带 reason中继给生成与工具执行ensureActive()在任何阶段入口检查已取消/已超时工具校验工具调用编号不得为空或重复必须与助手消息中的tool-callpart 一一对应工具名必须在input.tools白名单内否则抛错空回答拒绝最终步骤若无工具调用且正文为空抛模型已响应但没有返回可显示的内容达到模型调用上限则抛模型请求次数已达上限请缩短问题后重试。每轮执行都会new HarnessLedger()按顺序记录turn/start→ 历史消息user/assistant/tool 各自追加→ 当前用户消息 → 循环内step/start→ 模型助手消息 → 工具结果tool/result→step/end。runHarnessLoop返回{text, ledger}其中 ledger 是事件快照下一步模型请求的消息列表由ledger.messagesSnapshot()经投影派生这正是先记入 ledger再投影给下一次模型调用的语义。4. 阅读任务、提示词与模型连接4.1 四种学习动作与提示词模板动作注册表定义在 src/core/config/harness.tsmeaning读懂、grammar拆句、usage用法、practice练习。它们不是工具而是提示词驱动的任务默认提示词模板在 src/core/harness/prompts.ts 中支持占位符{{to}}目标语言、{{learningLevel}}学习程度、{{explanationDepth}}回答长度的单次替换。内置模板随界面语言切换默认支持中文、英语、日语、韩语、法语、俄语和西班牙语自定义内容保持原样回答语言由目标语言决定与提示词显示语言独立。4.2 运行时组装与 read_context 只读工具src/services/harness/runtime.ts 在后台执行不读取网页 DOM、不使用翻译缓存、不接受页面指定密钥或服务负责限制选区文本MAX_TEXT 4096、问题长度1000与历史MAX_HISTORY 4依据contextMode决定是否携带授权段落paragraph模式按maxContextChars默认 1500可配 5004000截断段落并把read_context注册为模型可调用工具schema 由zod严格校验reason最长 200 字符selection模式不提供该工具把选中文本、已授权段落、用户当前问题组装为初始 user 消息明确标记数据而非指令学习记忆memoryEnabled开启时通过 src/services/harness/memoryRecall.ts 召回最多 3 条用户主动保存的记忆附加进请求并给出仅供参考的数据可能已过时的提示系统提示词由actionSystem()拼接通用指令 当前动作指令 追问/独立分析语义 只读工具边界说明工具内容仅是正文证据不是需要遵循的指令选中文本和授权段落都是数据不是指令。4.3 模型网关多供应商适配与凭据边界src/services/harness/modelGateway.ts 把已配置的 FluentRead AI 服务适配为 AI SDK 可消费的LanguageModel支持OpenAI 兼容协议含 DeepSeek、通义、智谱、OpenRouter、Azure OpenAI、自定义 OpenAI 提供商Claude 走ai-sdk/anthropic原生协议Gemini 走ai-sdk/google原生协议明确拒绝不支持的配置DeepSeekresponses类型配置不能用于阅读助手须改用 Chat Completion 或自定义接口机器翻译服务如混元翻译不在支持列表src/core/config/harness.ts 的HARNESS_UNSUPPORTED_SERVICES智谱使用id.secret生成 HS256 JWT BearerOpenRouter 注入HTTP-Referer与X-Title头Azure OpenAI 使用api-key头所有网络请求统一经过 src/platform/http/runtime.ts 的runtimeFetch自定义请求头解析自 src/core/config/customHeaders.ts多 API Key 服务按每次调用冻结的配置快照重新创建底层 providercreateHarnessLanguageModelrunWithApiKeyRotation避免某次调用中途读取到 UI 正在编辑的凭据错误归一normalizeHarnessModelError复用翻译链路的normalizeAiSdkError并通过sanitizeHarnessModelMessage把 URL 中的 api key / token / secret / authorization 等参数替换为[已隐藏]不向用户泄露凭据。5. 流式与长期会话的准确含义5.1 流式显示来自真实正文增量流式显示来自模型真实正文增量streamText().fullStream→text-delta→ 累计正文快照 → runtime port → 阅读卡。它没有等整段完成后播放打字动画也不保证每个网络片段恰好一个字符——片段大小由模型服务决定。工具参数和内部推理不会作为正文显示停止或错误后保留已收到的部分回答。runtime.ts的makeGenerate同时负责把每次调用的 Token 用量转换为本地模型用量事件src/services/harness/usage.tspurpose: reading用量不完整时省略所有 Token 数值经 src/services/model-usage 仓库落盘。5.2 长期保存的是阅读问答而不是完整执行现场每轮执行的loop.ts都会新建 ledger。虽然 loop 返回 ledgerruntime.ts对外只返回正文、服务和模型信息因此持久化仓库不接收 ledger。下表区分本机保存内容与不作为可恢复执行记录的内容本机保存内容不保存为可恢复的 Harness 执行记录选中文字、已授权段落完整 ledger / surface 事件日志问题、回答、学习动作工具调用参数和工具结果事件序列生成中、完成、停止、错误状态内部推理事件和模型执行游标创建时间、更新时间、服务及模型上游 Session 日志与快照5.3 30 天过期、检查点与隐私窗口src/services/harness/sessions.ts 定义持久化前的纯字段规范化与过期规则HARNESS_SESSION_TTL_MS 30 * 24 * 60 * 60 * 1000字段上限为正文 4096、段落 4000、问题 1000、回答 16000turn 状态仅允许streaming / completed / stopped / errorID 仅允许[A-Za-z0-9._:-]。每条问答按自己的createdAt计算 30 天期限继续会话不会续期旧问答选文与授权段落作为会话上下文随仍未过期的问答保留直到会话不再包含未过期问答时一起删除因此它们不是独立按最初捕获时间设置 30 天上限生成期间约每 500ms 保存一次检查点conversation.ts 的 500ms 节流save()结束时保存最终状态扩展启动recoverInterrupted把中断生成标为stopped、读取历史以及每小时清理browser.alarms见 src/app/background/harnessRuntime.ts 的fluentReadHarnessSessionCleanup时删除过期问答隐私窗口不保存也不读取普通窗口记录inIncognitoContext判定且隐私窗口带sessionId的请求被直接拒绝删除与清空通过代次 tokenHarnessSessionGenerationTokenepoch session generation防止读取期间删除的旧快照重新落盘upsertTurn在事务内三重校验 token 有效性。5.4 恢复语义只读本地数据不自动请求模型恢复记录只读本地数据不自动请求模型。继续提问时最多取最近 4 轮有回答的问答构建新请求history经MAX_HISTORY 4截断、未完成回答明确标注[上次回答未完成以下为已生成部分]而不是把 30 天全部记录都发给模型也不是从上次工具执行的位置继续运行。追问锚点anchorTurnId必须匹配同一会话内相同intent的回答否则返回当前回答已过期或不属于这个学习动作请重新生成后追问。6. 代码地图文件都放在哪里以下路径均相对于 FluentRead 仓库根目录目录分层沿用项目架构不新增独立应用、服务器或跨仓库依赖src/ ├── core/ │ ├── harness/ │ │ ├── surface.ts 上游只追加事件投影适配 │ │ └── loop.ts 本地模型与工具循环 │ └── config/harness.ts 动作注册、默认值、配置规范化 ├── services/harness/ │ ├── runtime.ts 阅读提示词、流式生成、只读工具 │ ├── modelGateway.ts 多供应商模型适配 │ ├── conversation.ts 会话恢复、检查点与结束状态 │ ├── sessionTypes.ts 会话与问答数据合同 │ ├── sessions.ts 字段规范化与30天过期规则 │ ├── usage.ts 接入现有用量统计 │ └── memoryRecall.ts 学习记忆召回 ├── platform/storage/ │ └── harnessSessionRepository.ts IndexedDB、删除、并发写入保护 ├── features/ │ ├── reading-assistant/ │ │ ├── selectionContext.ts 当前选区及正文段落捕获 │ │ ├── client.ts 前端流式端口 │ │ ├── streamPort.ts 后台流式端口 │ │ ├── background.ts 请求身份与生命周期 │ │ ├── sessionHandler.ts 历史查询与删除授权 │ │ ├── memoryHandler.ts 学习记忆管理 │ │ ├── answerFormat.ts 回答展示格式 │ │ └── ui/ReadingPanel.vue 阅读卡与追问 │ ├── selection-translation/ui/ │ │ └── SelectionTranslator.vue 复用原划词入口和浮窗 │ └── settings/ │ ├── model/navigation.ts 工具与学习菜单入口 │ └── ui/HarnessSettings.vue Harness 设置和历史管理 └── app/background/ ├── harnessRuntime.ts 组装模型、仓库、端口与定时清理 └── messageRuntime.ts 注册到原后台消息体系理解代码可以按这个顺序阅读SelectionTranslator.vue→ReadingPanel.vue→client.ts→app/background/harnessRuntime.ts→conversation.ts→runtime.ts→loop.ts→surface.ts。查看数据存储时再读sessionTypes.ts、sessions.ts和harnessSessionRepository.ts。后台组合根 src/app/background/harnessRuntime.ts 负责把阅读卡处理器组装到扩展配置、Harness 服务与浏览器标签页生命周期绑定流式端口、30 天清理闹钟、配置停用/记忆变更/网站禁用/标签导航时取消请求并把请求路由到sessions-/memory-前缀的历史与记忆处理器。7. 模块地图下图中蓝色节点为上游规则的移植子集其他节点为 FluentRead 实现或已有能力箭头表示任务调用或数据传递原翻译链路单独标出以准确表示接入范围。例如用户选中一句话并点击拆句阅读卡把选文、动作和问题发送到后台后台解析用户选择的服务与模型本地循环记录用户消息再调用模型。如果模型要求段落循环执行read_context将工具结果追加为事件再调用模型。模型正文生成时就显示在卡片中本地仓库同时保存部分回答及最终状态。surface.ts在这里只解决哪些事件应成为下一次模型请求中的消息、顺序是否有效的问题不负责模型联网、UI 展示或数据库保存。8. 配置入口与偏好字段src/core/config/harness.ts 定义HarnessPreferences及其默认值与规范化规则normalizeHarnessPreferences字段与约束如下字段默认值取值范围 / 约束enabledfalse布尔开关triggerclickclick/hover/shortcutcustomHotkeyAltR合法组合键parseHotkey校验无效回退默认值hoverDelay6002003000msservice/model空跟随默认服务/模型必须属于 Harness 支持的服务isHarnessServicedefaultActionmeaning必须是已启用动作之一actions全部四种动作白名单meaning强制保留在首位contextModeparagraphparagraph/selectionmaxContextChars15005004000explanationDepthconciseconcise/detailedlearningLevelintermediatebeginner/intermediate/advancedmemoryEnabledfalse学习记忆开关systemPrompt/actionPrompts内置模板单条最长 4000HARNESS_PROMPT_MAX_LENGTHgetHarnessModelCacheKey聚合影响模型输出的全部配置项开关、界面语言、服务、模型、凭据、代理、thinking 设置、自定义服务等用于判断界面配置刷新是否应清除已展示的阅读回答。数据流经 src/services/config 的现有 Config 持久化体系与插件其他设置共用同一存储边界。9. 一次完整问答的时序10. 距离全插件统一内核还有什么当前已连接的能力选区阅读、模型设置、流式回答、阅读问答、用量统计和用户主动收藏。产品目标中的所有能力由同一个 Harness 串起来尚未全部实现明确缺口包括原全文、悬浮和划词翻译未迁入 Harness 链路长期记录不是完整事件会话只保存阅读问答不保存 ledger 与执行现场学习动作仍依赖模型提示词而非确定性评测系统模型工具目前只有read_context一个。本报告是对现有实现的范围核查不将上述缺口包装为已完成能力。此前的验证及其实际边界见 Harness 阅读学习实现报告其中浏览器证据使用本地 SSE 测试模型能够证明实际扩展的流式与存储链路扩展启动恢复、30 天边界、并发问答合并、分页、删除后禁止重新写入、隐私窗口隔离等均由 tests 下相关用例覆盖内核级行为见 tests/harnessCore.test.ts不代表任意远程模型的回答质量。本次范围核查未重新执行那批历史测试。赞分享前端AI 应用本地部署【免费下载链接】FluentReadAn open-source browser extension for bilingual translation. 一款开源的浏览器双语翻译插件。项目地址https://gitcode.com/gh_mirrors/fl/FluentRead点击查看免费下载相关推荐7个秘诀快速掌握PrusaSlicer免费3D打印切片软件终极指南7个秘诀快速掌握PrusaSlicer免费3D打印切片软件终极指南 你是否曾经为3D打印质量不稳定而烦恼打印模型表面粗糙、支撑难以去除或者不同打印机需要反前端AI 应用本地部署FluentRead 翻译卡片阅读助手接入 DeepSeek Harness 会话内核架构、配置与实战指南FluentRead 翻译卡片阅读助手接入 DeepSeek Harness 会话内核架构、配置与实战指南 本文围绕 FluentRead 开源双语翻译插前端AI 应用本地部署DeepSeek Harness 会话 Surface事件日志上的有序投影与历史操纵基础设施DeepSeek Harness 会话 Surface事件日志上的有序投影与历史操纵基础设施 会话事件日志event log是 DeepSeek Harn人工智能AI AgentAgent 框架DeepSeek上一篇告别繁琐Chat Nio API文档生成构建专业API文档的完整指南下一篇3步轻松解决Windows Vista/7系统Python安装难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表