ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hermes WebUI 高级聊天配置实战:会话召回预填、智能标题与 Gateway 后端桥接

Hermes WebUI 高级聊天配置实战:会话召回预填、智能标题与 Gateway 后端桥接 Hermes WebUI 高级聊天配置实战会话召回预填、智能标题与 Gateway 后端桥接【免费下载链接】hermes-webuiHermes WebUI: The best way to use Hermes Agent from the web or from your phone!项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui本文基于 Hermes WebUI 官方文档 docs/advanced-chat-setup.md深入讲解自托管部署的三个进阶聊天能力会话召回预填Session recall prefill、会话标题生成Session title generation与 Gateway 后端浏览器聊天Gateway-backed browser chat。三者均为可选特性默认部署进程内聊天、无预填开箱即用读完本文你将掌握每个特性的完整配置参数、行为边界以及它们在 api/streaming.py 和 api/gateway_chat.py 中的源码级实现原理。设计立场默认即可用进阶才配置文档开宗明义绝大多数用户既不需要预填也不需要标题模型之外的定制默认行为就是进程内运行时处理浏览器聊天、不做任何 prefill。只有满足以下场景时才需要阅读本文的进阶配置你的部署已经为 Joplin、Obsidian、Notion、llm-wiki 等第三方笔记源写了本地召回/路由脚本希望浏览器聊天也知道持久化上下文在哪你想控制或关闭 LLM 自动标题生成你已在本地运行 Hermes Gateway/API Server希望浏览器发起的对话复用与消息面messaging surfaces相同的运行时与工具路径。会话召回预填Session recall prefill核心概念router 风格而非全文倾倒WebUI 可以为新发起的、来源于浏览器的 agent 回合附加临时ephemeral预填消息。文档明确推荐 router 风格的紧凑预填例如“Joplin 里有持久化的项目上下文在回答依赖细节的问题之前先使用可用的笔记/搜索工具。”而不是把整个笔记语料库塞进每个新的浏览器会话。预填的职责是把 agent 指向检索具体的事实应由 notes/search 工具在需要时按需提供。配置方式一静态 JSON 文件默认保留静态预填通过prefill_messages_file配置项或HERMES_PREFILL_MESSAGES_FILE环境变量指定一个 JSON 文件。从源码 api/streaming.py 的_load_prefill_messages_file可以看到文件不存在时返回status: error并附带prefill file not foundJSON 解析失败时返回脱敏redacted的错误信息不会把异常原文直接暴露给浏览器。配置方式二动态召回脚本需显式开启动态召回使用 WebUI 专属的脚本钩子二选一配置文件方式YAMLwebui_prefill_messages_script: - python3 - /path/to/notes_recall.py webui_prefill_messages_script_timeout: 5环境变量方式HERMES_WEBUI_PREFILL_MESSAGES_SCRIPTpython3 /path/to/notes_recall.py \ HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT_TIMEOUT5 \ ./ctl.sh restart脚本钩子的解析逻辑在 api/streaming.py 的_load_prefill_messages_script中优先读取环境变量HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT回落到配置项webui_prefill_messages_script脚本命令既支持 YAML 列表形式也支持单行命令字符串如python3 /path/to/notes_recall.py。超时值由_prefill_script_timeoutapi/streaming.py解析超时或异常时分别返回prefill script timed out或脱敏后的错误文本。脚本输出的三种合法格式文档规定脚本可以打印OpenAI 风格的消息 JSON 列表[{role: ..., content: ...}]带messages列表的 JSON 对象纯文本——会被包装成一条user预填消息。第三种设计值得注意动态召回文本由此成为普通上下文而不是额外的 system 指令。如果钩子必须提供系统级指导应显式输出带role: system条目的 JSON 消息。源码中_messages_from_prefill_script_outputapi/streaming.py负责这一归一化过程。输出上限与预算降级链这是文档中最容易被忽视、但最影响生产稳定性的部分。源码给出两个硬常量api/streaming.py_PREFILL_SCRIPT_OUTPUT_LIMIT 262_144 # 脚本输出上限 256 KiB解析前 _PREFILL_CONTEXT_DEFAULT_MAX_CHARS 12_000 # 预填上下文默认预算 12,000 字符预算由webui_prefill_context_max_chars或HERMES_WEBUI_PREFILL_CONTEXT_MAX_CHARS控制默认 12,000 字符设为0则禁用预算限制。当动态脚本输出超预算时的降级链在_load_webui_prefill_context中实现api/streaming.py优先尝试静态回退如果同时配置了紧凑的静态 prefill 文件prefill_messages_file/HERMES_PREFILL_MESSAGES_FILE直接回落到该文件无静态回退时WebUI 注入一条简短的检索指令retrieval instruction而不是把超尺寸的笔记/正文随每个新浏览器回合发送无论哪条路径最终都经过_apply_prefill_context_budgetapi/streaming.py做预算校验超预算内容会被压缩为带预算元数据的摘要状态。相关行为由测试 tests/test_webui_prefill_context.py 覆盖笔记源场景另见 tests/test_webui_notes_sources.py。浏览器只看到状态看不到正文隐私边界由_public_prefill_context_statusapi/streaming.py保证浏览器只收到一个紧凑的状态事件字段仅包含status、source、label、message_count和脱敏后的error绝不含预填消息正文。会话标题生成Session title generation标题的三段生命周期Hermes WebUI 的标题生成分三阶段临时标题从第一条用户消息派生首次精化第一条回复之后调用 LLM 生成更好的标题自适应刷新长会话期间周期性刷新已生成的标题。结构化消息的标题清洗规则对于同时包含文本与原生图片的结构化消息标题生成直接使用用户文本不做扁平化、不修改存储消息。文档还精确界定了清洗范围标题比较与标题模型输入会去除内部的[Workspace::v1: ...]前缀以及由空行分隔的一个尾部[Attached files: ...]或[Attached files for this steer: ...]后缀对结构化内容该清洗只作用于提供标题内容的第一个文本部分字面遗留的[Workspace: ...]文本以及后续的文本部分保持原样初始生成、显式重新生成、自适应刷新三条路径共用这套标题专属清洗。这些规则保证了内部元数据不会让一个含图片的回合被误判为“手动命名过”从而绕过后台生成。图片-only 或纯元数据内容不会提供标题文本已有人工标题的保护机制依然生效且该清洗不重写转录记录或原生图片部分。临时标题逻辑与保护策略分别对应测试 tests/test_early_session_title.py 与 tests/test_3230_preserve_manual_session_title.py。auxiliary.title_generation.enabled总开关后台生成要求同时具备用户文本和实质性 assistant 回复。自动标题生成的 LLM 调用受当前 Hermes profile 的auxiliary.title_generation.enabled设置控制默认trueauxiliary: title_generation: enabled: false设为false时的三项行为文档明确列出临时首条消息标题保留原位永远不会被自动 LLM 调用或本地回退覆盖周期性自适应刷新被跳过显式“重新生成标题”操作返回title_generation_disabled响应而不是调用标题模型。auto_title_refresh_every 的职责边界WebUI 的auto_title_refresh_every设置是独立于auxiliary 开关的另一个控制项只负责已生成标题的周期性刷新它在 auxiliary 标志关闭时不会重新启用自动生成。两个控制项的正交关系是配置时最容易踩坑的地方关掉auxiliary.title_generation.enabled后即使auto_title_refresh_every有值系统也只会刷新、不会新生成。Gateway 后端浏览器聊天Gateway-backed browser chat默认路径与桥接动机默认情况下浏览器聊天走 WebUI 的进程内 legacy 运行时。进阶自托管部署可以显式选择把新的浏览器回合路由到一个正在运行的 Hermes Gateway API Server同时保持现有 WebUI 的/api/chat/start与/api/chat/stream浏览器契约不变。桥接实现位于 api/gateway_chat.py模块 docstring 明确其为 “Default-off Hermes Gateway bridge for browser-originated chat turns”——默认关闭符合文档“多数用户无需配置”的立场。最小启用配置HERMES_WEBUI_CHAT_BACKENDgateway \ HERMES_WEBUI_GATEWAY_BASE_URLhttp://127.0.0.1:8642 \ HERMES_WEBUI_GATEWAY_API_KEY... \ ./ctl.sh restart审批卡片Runs API 显式开启Gateway 后端的审批提示需要再多一个显式开启项因为它走 Gateway runs API 路径HERMES_WEBUI_CHAT_BACKENDgateway \ HERMES_WEBUI_GATEWAY_BASE_URLhttp://127.0.0.1:8642 \ HERMES_WEBUI_GATEWAY_API_KEY... \ HERMES_WEBUI_GATEWAY_USE_RUNS_APItrue \ ./ctl.sh restart适用条件所连接的 gateway 已 advertise 审批支持且你希望工具审批卡片出现在 WebUI 中。如果不加HERMES_WEBUI_GATEWAY_USE_RUNS_APItruegateway 聊天停留在 legacy chat-completions 传输层具备审批能力的命令可能停留在 agent 内 pending而 WebUI 看不到审批卡片。相关行为由 tests/test_gateway_approval_runs_api.py 与 tests/test_gateway_approval_legacy_path.py 分别覆盖两条传输路径。YOLO 模式下的客户端侧兼容行为当 Gateway 后端的浏览器会话启用 YOLO 时WebUI 会批准该会话中所有已 parked 的审批Runs API 提示按其精确的run_id与 mirror token 中继本地/无 run 的等待者全部释放之后只要 WebUI 会话标志仍处于激活状态就会自动应答后续的 Runs API 审批请求。文档对时序给出了精确约束该标志只在所有当前 parked 的远端中继都成功后才提交一个与这次未确认 drain 竞争的后续提示会保持可见而不是被投机性地自动批准该 handoff 与本地审批准入共享在 drain 快照之后到达的本地等待者会等待同一个会话 handoff若 YOLO 已提交则立即释放而不是被 parked 在已激活的会话后面这是客户端管理的兼容行为当前 Runs API 没有 session-YOLO 开关因此请求会短暂触及审批边界后才由 WebUI 应答Agent 自有的策略如不受限的 computer-use 模式不受影响。该场景的回归保障见 tests/test_gateway_yolo_webui_compat.py。严格的后端值解析与密钥回退源码 api/gateway_chat.py 展示了文档所说的“刻意严格”_WEBUI_CHAT_BACKEND_ENV HERMES_WEBUI_CHAT_BACKEND _WEBUI_GATEWAY_BASE_URL_ENV HERMES_WEBUI_GATEWAY_BASE_URL _WEBUI_GATEWAY_API_KEY_ENV HERMES_WEBUI_GATEWAY_API_KEY _WEBUI_GATEWAY_USE_RUNS_API_ENV HERMES_WEBUI_GATEWAY_USE_RUNS_API _GATEWAY_CHAT_BACKENDS {gateway, api_server, api-server}由此可以确认文档描述的语义只有gateway、api_server、api-server三个值能启用桥接1或true这类泛化 truthy 值会被直接忽略避免现有部署意外改变执行归属execution ownership。密钥与错误处理方面HERMES_WEBUI_GATEWAY_API_KEY缺省时回退到API_SERVER_KEY若存在Gateway 返回 HTTP 401 时WebUI 报告gateway_auth_error明确指向 WebUI↔Gateway 密钥不匹配而不是显示 Gateway 泛化的 provider 风格 “Invalid API key” 正文见 api/gateway_chat.py 附近的诊断文案SSE 读取超时预算由HERMES_WEBUI_GATEWAY_READ_TIMEOUT控制默认 600 秒api/gateway_chat.py——读超时是终止性的且会响应 Stop半开连接不再钉死 worker 十分钟。运维诊断脱敏的 gateway_chat 块/api/health/agent端点包含一个脱敏的gateway_chat块api/agent_health.py让运维人员在不暴露密钥值的前提下确认 gateway 模式、base URL 与 API key 是否存在。需要注意文档的限定该字段目前是纯运维诊断载荷并未在浏览器 UI 中渲染为用户可见的健康横幅。适用边界与当前限制文档对桥接的定位非常克制它最适合已经在本机运行 Hermes Gateway/API Server、并希望浏览器聊天复用同一运行时/工具路径的运维者。附件、取消、审批与 clarify 提示目前仍走 WebUI 的兼容性路径在 runtime-adapter 迁移完成之前可能与某些消息面行为不完全一致——配置时应以此为预期并在变更后跑一遍相关测试目录tests/test_webui_gateway_chat_backend.py 是桥接行为的主回归入口。相关源码与测试索引主题关键文件说明预填解析与预算api/streaming.py输出上限、默认预算、脚本/文件加载与降级链预填回归测试tests/test_webui_prefill_context.py预填上下文行为验证Gateway 桥接api/gateway_chat.py环境变量解析、后端白名单、读取超时预算Gateway 桥接测试tests/test_webui_gateway_chat_backend.py后端模式开关与回退行为YOLO 兼容tests/test_gateway_yolo_webui_compat.py会话级 YOLO 审批 handoff健康诊断api/agent_health.py脱敏gateway_chat诊断块标题保护tests/test_3230_preserve_manual_session_title.py人工标题不被自动覆盖配置入口与运行命令以仓库根目录的 ctl.sh 为准修改环境变量后执行./ctl.sh restart使配置生效。【免费下载链接】hermes-webuiHermes WebUI: The best way to use Hermes Agent from the web or from your phone!项目地址: https://gitcode.com/GitHub_Trending/he/hermes-webui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表