文档

文档

Hermes Agent

Hermes Agent 可以把任意端点接成自定义提供商:运行 hermes model,或在 config.yaml 里写几行。对一个自己运行的智能体来说,这几行配置只是其中简短的一部分:本页还会说明每种协议下由哪一端放置缓存断点、定时任务和辅助任务会给一天增加多少费用,以及 402 会让一轮对话怎样。

在 ~/.hermes/config.yaml 里写一个命名提供商——api https://api.kunavo.com,transport anthropic_messages,用 provider: custom:kunavo 选中——就能让 Hermes Agent 通过 Messages 协议跑在 Claude 上,在这种协议下它会自己发送缓存标记和输出上限。

~/.hermes/config.yaml
# ~/.hermes/config.yaml
providers:
  kunavo:
    api: https://api.kunavo.com        # origin — the Anthropic SDK adds /v1/messages
    key_env: KUNAVO_API_KEY            # the variable's NAME; the key goes in ~/.hermes/.env
    transport: anthropic_messages
    models:
      claude-sonnet-5:
        context_length: 1000000
        prompt_caching: true
      claude-haiku-4-5:
        context_length: 200000
        prompt_caching: true

model:
  default: claude-sonnet-5
  provider: custom:kunavo
在这种协议下,api 填的是源站地址——https://api.kunavo.com,不带 /v1。Hermes 在这种传输方式下使用的 Anthropic SDK 会自己追加 /v1/messages,而 Hermes 的文档说,Hermes 在把 URL 交给该 SDK 之前会去掉末尾的 /v1,所以无论如何,填源站地址都是对的。下文的 OpenAI 兼容协议才需要保留这个后缀。
transport: anthropic_messages 值得手动写上。Hermes 能根据 URL 检测协议,但它的文档里写明的规则只有一条:路径以 /anthropic 结尾,而这个基础 URL 并不是这样。
prompt_caching: true 让这个条目下该模型的缓存标记成为明确设置,context_length 则是模型目录里的窗口大小——Claude Sonnet 5 为 1,000,000 个 token,全程同一费率。Hermes 默认在窗口用到一半时才压缩,对这么大的窗口来说太晚了;下文的费用一节会给出把它提前的设置。
还没有密钥?创建 Kunavo 账户,创建一个密钥(以 sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 Hermes Agent 设置页面。

分步操作

  1. 在 /app/keys 创建密钥并复制——它只会显示一次。
  2. 把它存到 Hermes 保存机密的地方:hermes config set KUNAVO_API_KEY sk-kn-... 会把它写入 ~/.hermes/.env。配置块里的 key_env 一行只写这个变量的名字;密钥本身不会进入 config.yaml。
  3. 把配置块加到 ~/.hermes/config.yaml——用 hermes config edit 可以打开它。如果里面已经有 model: 一节,只替换其中的 default 和 provider,其余保持不变。
  4. 也可以让向导来写:在终端里(不要在聊天会话中)运行 hermes model,选择 Custom endpoint (self-hosted / VLLM / etc.),然后依次回答它的提问——API 基础 URL、密钥、模型名称、API 模式和上下文长度。
  5. 启动 hermes 并查看启动横幅:那里会显示模型及其上下文窗口,两者都应与配置块一致。
  6. 发送两条消息,然后打开 /usage 查看这两轮的用量。要在会话中更换模型,使用 /model custom:kunavo:claude-opus-5-5。

已于 2026年10月5日 对照 Hermes Agent 的 AI 提供商页面 检查。第三方设置会发生变化;如果这里的字段名称不再与你看到的内容一致,应以该页面为准,而不是本页。

调试客户端前先验证

一个请求即可确定故障来自端点、密钥还是配置文件。如果返回 JSON,则相同的基础 URL 和密钥可以在 Hermes Agent 中使用。

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/messages \
  -H "Authorization: Bearer sk-kn-..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-5","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

字段中应填写哪个模型 ID

每个文本模型都可通过模型 ID 访问——实时列表见 GET /v1/models,包含价格的目录见模型页面。费率单位为每 1M token 的美元,格式为输入 / 输出。

模型 IDKunavo 输入 / 输出它在 Hermes Agent 中的位置
claude-sonnet-5$1.40 / $7.00主模型——对话、工具循环和委派出去的工作
claude-opus-5-5$2.80 / $14.00更长或更难的任务再上一档;把它加到 models 下,用 /model 切换
claude-haiku-4-5$0.70 / $3.50辅助任务和定时任务——压缩、标题、cron.model
claude-fable-5$7.00 / $35.00最高一档——让智能体持续使用它之前,先用下表算一算一天的费用
计费方式是从预付余额中按 token 扣费,无月费——参见 计费。对于重复上下文——这正是编辑器或聊天客户端发送内容的大部分——提示缓存对账单的影响大于模型选择。

OpenAI 兼容协议

同一个密钥通过 /v1/chat/completions 还能调用其他所有模型系列,这时用 Hermes 文档里最短的写法就够了——一个带 provider: custom 和 base_url 的 model: 块,hermes model 询问的也正是这些:

~/.hermes/config.yaml
# ~/.hermes/config.yaml — the bare form, for an OpenAI-compatible endpoint
model:
  default: gpt-6-sol
  provider: custom
  base_url: https://api.kunavo.com/v1    # this wire keeps /v1
  key_env: KUNAVO_API_KEY
  context_length: 1050000

这里的基础 URL 保留 /v1,Hermes 的文档在本地服务器示例中用的就是这种写法;context_length 则把窗口固定下来,Hermes 不必再去检测。想同时保留两种协议的配置,就给这一种单独建一个命名条目——transport: chat_completions——再用 /model custom:<name>:<model> 切换。

跑 Claude 请优先用 Anthropic 协议。Hermes 的文档说,自定义的 OpenAI 兼容端点不会从它那里得到输出上限,于是生效的是服务端的默认值——而在 /v1/chat/completions 上,Kunavo 给没有指定上限的 Claude 请求 4,096 个输出 token,较长的回复或较大的工具调用会因此被截断。在 Anthropic 协议下,Hermes 会自己带上 max_tokens。如果确实要在这里跑 Claude,按文档的做法,可以用命名条目的 extra_body 给每个 chat-completions 请求加上 max_tokens 这样的字段。在这种协议下,Claude 的思考控制参数同样不会被转发。

两种协议下的提示缓存

在 Anthropic 协议下,缓存标记由 Hermes 自己附加。对于自定义提供商,它的模型配置页面记载了上面配置块里用到的开关——模型上的 prompt_caching: true——并说明布局取决于传输方式:anthropic_messages 用原生块,OpenAI 兼容协议用封装(envelope)布局。Kunavo 的 /v1/messages 会原样转发请求体,自己不添加任何断点,所以在这种协议下,标记要么来自 Hermes,要么就没有。

缓存能保留多久,是 Hermes 的文档对自定义端点没有说明的部分。prompt_caching.cache_ttl——5m、1h 或 auto——的说明针对的是通过原生 Anthropic API、OpenRouter 和 Nous Portal 使用 Claude 的情况,对其他端点只字未提。Kunavo 会转发收到的任何一种标记,并按同一费率对写入计费,所以答案要从你自己的用量里读:停顿十分钟之后的一轮如果仍然显示缓存读取,说明它用的是一小时的缓存条目。

在 OpenAI 兼容协议下,只要提示词长到可以缓存,Kunavo 就会自己为 Claude 模型放置断点——在系统提示词、工具定义和对话末尾——无论客户端是否发送标记。GPT 模型则由其厂商隐式缓存。

不管断点由哪一端放置,账单的算法都一样。在 Claude Sonnet 5 上,缓存读取是每 1M token $0.14,而新输入是 $1.40;缓存写入是 $1.75——这是 Claude 在输入价之上的写入溢价,条目要求一小时有效期时也按这同一费率收取。一个条目保留五分钟,每次读取都会给它续期,所以智能体要付多少,与其说取决于模型,不如说取决于它的下一个请求能否在这个窗口内到达。每个模型的缓存费率见提示缓存页面。

Hermes 有一种行为比任何费率都更费钱:它的文档指出,在会话中途切换模型、自动回退或轮换凭据都会重置提示缓存,于是下一条消息要按完整的输入价格把整个对话重新读一遍。长会话开始之前就把模型选好。

常驻智能体一天要花多少

在 Hermes 上,没人输入时仍在计费的,是你排定的那些任务,再加上每次对话都会触发的辅助任务。它的cron 文档说,每次定时运行都会开启一个全新的会话,所以每触发一次,都要为整个提示词计费——指令、工具 schema、附带的技能。这个提示词有多大取决于你的配置,所以下表是一个明说的假设:每次运行 20,000 个 token,每 30 分钟运行一次,即每天 48 次。请把这两个数换成你自己的。

任务所用模型每 1M token 的输入费率每天 48 次运行
claude-haiku-4-5$0.70$0.67
claude-sonnet-5$1.40$1.34
claude-opus-5-5$2.80$2.69
claude-fable-5$7.00$6.72

有三项设置能改变这个数字,都出自 Hermes 自己的文档。定时任务跑在为该任务单独指定的模型上,没有指定就用 cron.model,再没有才用主模型——所以设置 hermes config set cron.model claude-haiku-4-5 就能让所有没有单独指定模型的任务离开贵的那一档。任务脚本如果输出 {"wakeAgent": false},这一次触发就跳过模型;no-agent 任务则从不调用模型。至于辅助任务——压缩、标题、视觉——都跑在主模型上,除非用 auxiliary 把它们路由到别处:

~/.hermes/config.yaml
# ~/.hermes/config.yaml — what decides the cost of an unattended day
compression:
  threshold_tokens: 256000         # compact here, not at half of a 1M window

auxiliary:
  compression:
    provider: kunavo               # the named entry above
    model: claude-haiku-4-5        # summaries on the cheapest tier
  title_generation:
    provider: kunavo
    model: claude-haiku-4-5

窗口很大时,要紧的是 threshold_tokens。压缩默认在上下文长度用到一半时开始,而 Hermes 的文档给出的办法正是用这项设置,为单次调用的费用设一个固定的上限。

智能体真正在干活的那些小时是账单的另一半,这一半由缓存说了算。以连续 100 个请求为例,每个请求都重新发送 100,000 个 token 的上下文,外加 2,000 个新 token,并返回 800 个 token 的输出。在 Claude Sonnet 5 上,上下文从缓存读取时约为 $2.31;每个请求都把它当作新输入计费时约为 $14.84。同样的工作,同样的模型:差别只在于断点有没有放,以及请求之间的间隔是否不到五分钟。

再给一个量级,这是实测而非假设:在运行常驻智能体的 Kunavo 账户中,活跃日的花费中位数是 $12.67,第 90 百分位的一天约为 $163。这些是截至 2026年10月5日 实际计费的金额,按各自当天生效的费率计算。这组账户数量不多,所以请把它看作范围有多宽,而不是对你的智能体的预测。

余额用完时

Kunavo 是预付费的:每次调用都从钱包里扣,而一个在你睡觉时干活的智能体,也会在你睡觉时把钱包花空。钱包付不起的请求会被拒绝,返回 HTTP 402 和错误码 insufficient_balance,两种协议都一样,并且不为它收取任何费用。拒绝会在钱包归零之前就出现:每个请求都要先预留它在最坏情况下的费用,也就是提示词加上它被允许生成的最长回复,所以智能体要求的输出上限越大,它的调用就越早开始被退回。错误信息会用 balance_usd 和 needed_usd 说明还差多少。

Hermes Agent 应对提供商故障的办法是回退链:config.yaml 里的 fallback_providers,用 hermes fallback 管理,逐轮尝试。它的文档列出了会让主模型触发回退的情况——速率限制、服务器错误、认证失败和 404——并把 HTTP 402 列在会让辅助任务沿自己的回退链往下走的容量类错误之中;至于没有配置回退时,一轮对话遇到 402 会怎样,文档没有说。请按最直白的理解来做打算——这一轮会失败,定时任务也一样——并记住,真发生回退的那一轮要从冷的提示缓存开始。

有两项设置能让无人值守的智能体不落到这种境地,它们各管各的事:

  • 自动充值,在充值与账单页面里。保存一次银行卡,再设三个数:余额低于多少时充值、每次充多少,以及月度上限。此后,只要某次调用让余额跌破阈值,钱包就会在几秒内自动补上。钱包仍然不够时到达的请求,会等这笔扣款完成后照常得到处理,而不是被拒绝。扣不了款(银行卡被拒、月度上限已到)时,或者单个请求要预留的金额超过充值后的钱包余额时,仍会返回 402。它需要银行卡或 Link——Alipay、WeChat Pay、Pix 等本地支付方式无法自动扣款。
  • 密钥的月度上限,在API 密钥页面里。给智能体单独一个密钥,并设定这个密钥在一个自然月里最多能花多少。超过这个数之后,它的调用会被拒绝并返回 402,不收取任何费用,而你的其他密钥照常可用。失控的循环需要的正是这样一个上限,而钱包给不了,因为所有密钥用的是同一个钱包。

把充值阈值设在单个请求的预留金额之上,充值金额则按你的智能体一天的花费来定,而不是按最低额:最小充值额是 $10,而上文常驻智能体的日花费中位数是 $12.67。自动充值的各项限制见计费页面,完整的错误响应体见错误码页面。

常见问题

如何给 Hermes Agent 添加自定义端点?

在终端里(不要在聊天会话中)运行 hermes model,选择 "Custom endpoint (self-hosted / VLLM / etc.)":它会依次询问 API 基础 URL、API 密钥和模型名称,再询问 API 模式和上下文长度,然后把结果保存到 ~/.hermes/config.yaml。也可以手写——要么只写一节 model:,其中包含 provider: custom 和 base_url;要么在 providers: 下写一个带 api、key_env 和 transport 的命名条目,再用 provider: custom:<name> 选中它。会话里的 /model 命令只能在已有的提供商之间切换。

Hermes Agent 的基础 URL 要不要带 /v1?

取决于传输方式。OpenAI 兼容端点(transport 为 chat_completions)的基础 URL 要保留后缀,Hermes 的提供商页面在本地服务器示例中用的就是这种写法——对 Kunavo 来说是 https://api.kunavo.com/v1。Anthropic 兼容端点(transport 为 anthropic_messages)则填源站地址——https://api.kunavo.com——因为 Anthropic SDK 会自己追加 /v1/messages。Hermes 的 Microsoft Foundry 指南说,Hermes 在把 URL 交给该 SDK 之前会去掉末尾的 /v1,所以无论如何,填源站地址都是对的。

通过自定义端点,Hermes Agent 的提示缓存还能生效吗?

能。Hermes 的文档为自定义提供商条目提供了按模型设置的 prompt_caching: true,并说明标记的布局取决于所配置的传输方式:anthropic_messages 用原生块,OpenAI 兼容协议用封装(envelope)布局。为每个 Claude 模型 ID 都声明这一项,行为就是明确的,而不是交给自动检测。在 Kunavo 的 OpenAI 兼容端点上,网关还会自行为 Claude 模型放置断点,所以即使客户端不发送任何标记,chat-completions 的接法也会缓存。

context_length 在 Hermes Agent 里起什么作用?

它是 Hermes 为该模型假定的总上下文窗口——输入和输出合计——Hermes 用它来决定何时压缩历史。写在 model: 下时,它是一个固定值,优先于 Hermes 原本会检测到的任何结果;写在 providers.<name>.models.<id> 下时,只对该提供商上的这个模型生效。对窗口非常大的模型,控制成本靠的是另一项设置:compression.threshold_tokens 让压缩在一个绝对的 token 数上开始,而不是等到窗口的一半。

全天运行 Hermes Agent 要花多少钱?

算三样。定时任务:每次 cron 运行都会开启一个全新的会话,并为整个提示词计费——按假设的每次 20,000 个 token、每天 48 次计算,以 Kunavo 的输入费率,在 Claude Sonnet 5 上每天约 $1.34,在 Claude Haiku 4.5 上约 $0.67。辅助任务:压缩、标题和视觉都跑在主模型上,除非用 auxiliary 设置把它们路由到别处。还有对话本身:各轮之间间隔不到五分钟时,大部分是缓存读取;停顿更久、切换模型或发生回退之后,则要把全部内容重新读一遍。

API 余额用完时,Hermes Agent 会怎样?

Kunavo 会以 HTTP 402 拒绝该请求,并且不为它收取任何费用。Hermes 应对提供商故障的办法是回退链——config.yaml 里的 fallback_providers,逐轮尝试——而发生回退的那一轮,在另一个提供商上要从冷的提示缓存开始。如果没有配置回退,就按这一轮(或这个定时任务)直接失败来做打算。Kunavo 这边有两项设置能让智能体不走到这一步:自动充值会在钱包余额偏低时从已保存的银行卡扣款,于是本来会被拒绝的请求照常得到处理;给智能体自己的密钥设一个月度上限,则能限制失控循环最多能花多少钱。