项目快照:NousResearch/hermes-agent,约 231,350 个 Star,46,004 个 Fork;最新推送时间 2026-08-16T13:38:39Z。本文基于仓库公开资料撰写。

项目地址:https://github.com/NousResearch/hermes-agent · https://hermes-agent.nousresearch.com

hermes-agent 从代码、运行环境到实践流程的项目封面
hermes-agent 的项目能力与实践流程示意。

项目速览(TL;DR)

hermes-agent 是 Nous Research 使用 Python 开发的自我改进型智能代理(AI agent)项目,仓库描述为 “The agent that grows with you”。根据仓库元信息,项目默认分支为 main,许可证为 MIT,当前资料记录的 Star 数为 231350,Fork 数为 46004。

项目的核心设计不是只提供一次性问答,而是把工具调用、技能生成、记忆维护、跨会话检索、定时任务、消息平台接入和可替换模型提供商组合到同一个代理运行时中。README 还明确说明,它可以运行在本地终端、云端虚拟机、GPU 集群以及部分无服务器基础设施上;实际部署方式、模型提供商配置和平台接入细节应以官方文档为准。

  • 实现语言:Python;仓库同时包含 Web、TUI、桌面应用相关工作区。
  • 主要交互入口:命令行终端、Telegram、Discord、Slack、WhatsApp、Signal。
  • 核心机制:工具调用、记忆与会话搜索、技能创建与改进、子代理并行、定时调度。
  • 运行后端:本地、Docker、SSH、Singularity、Modal、Daytona、Vercel Sandbox。
  • 许可证:MIT;版权与分发条件以仓库中的 LICENSE 为准。
“The self-improving AI agent built by Nous Research.”
来源:README

定位与目标用户

本项目定位为可持续运行的工具型智能代理,而不是只在单个聊天窗口中生成文本的模型客户端。它把代理的工作环境、对话历史、技能文件、定时任务和外部消息渠道视为长期运行系统的一部分,因此使用者需要同时关注模型调用、权限边界、状态持久化和运行维护。

从 README 列出的能力看,项目面向需要把自然语言任务转化为多步骤工具流程的个人用户、研究人员和工程团队。目标用户还应具备配置模型服务商、管理 API 凭据、维护云端或本地运行环境的能力;资料没有给出面向非技术用户的安装向导、托管服务条款或服务等级承诺。

  • 需要从终端持续操作文件、命令和其他工具,并希望获得流式工具输出的使用者。
  • 需要把代理放在服务器或容器中长期运行,再通过消息平台远程交互的使用者。
  • 需要让代理根据历史任务沉淀技能、搜索过去会话并保留跨会话上下文的研究或自动化团队。
  • 需要批量生成代理轨迹(trajectory)或压缩轨迹用于训练工具调用模型的研究人员。

核心功能

项目的能力集中在“代理如何完成任务并保留经验”这一链路上。以下功能均来自 README;具体命令名称、配置字段和各平台的权限要求,资料没有完整展开,部署前应查阅官方文档。

终端界面与交互控制

Hermes Agent 提供终端用户界面(Terminal User Interface,TUI),包括多行编辑、斜杠命令自动补全、会话历史、打断并重定向当前任务,以及流式工具输出。输入是用户在终端提交的自然语言或命令式操作,代理在调用工具时持续输出过程信息,最终返回任务结果;README 没有给出 TUI 的完整命令清单和键位映射。

这种交互方式适合需要在代理执行过程中修正目标的场景。例如,用户可以在长任务仍在运行时中断并重新指定方向。该能力依赖项目自身的 CLI/TUI 实现,pyproject.tomlprompt_toolkit==3.0.52 标记为交互式 CLI 的直接依赖。

多平台消息网关

README 将 Telegram、Discord、Slack、WhatsApp、Signal 和 CLI 统一描述为单一网关进程的交互入口。消息从平台进入网关后,代理可以在云端虚拟机或其他终端后端执行任务,再将结果返回原平台;语音备忘录转写和跨平台会话连续性也被列为能力。

该机制的关键输入是平台消息、语音备忘录或 CLI 指令,输出是对应渠道上的文本或工具执行结果。资料没有提供各平台所需的令牌字段、回调地址、权限范围、转写服务和消息大小限制,因此不能据此编写具体平台的配置样例。

记忆、会话搜索与用户建模

项目将记忆维护设计为代理工作流的一部分:代理可以整理记忆,周期性地受到提示以持久化知识,并在复杂任务后创建技能。过去的会话通过 SQLite FTS5 进行全文搜索,再结合大语言模型摘要帮助跨会话回忆;README 还提到 Honcho dialectic user modeling,用于形成关于用户的持续模型。

从机制上看,输入是当前任务、历史会话和代理在任务过程中产生的经验,输出是可被后续任务检索或复用的记忆、摘要和技能。FTS5、会话存储、摘要模型和技能文件共同构成这一闭环;资料没有说明数据库文件的默认路径、保留周期、删除接口或索引维护命令,运维时不能把这些细节视为已确定行为。

技能创建与自我改进

README 描述的技能(skills)可以在复杂任务后由代理自主创建,并在使用过程中继续改进,同时兼容 agentskills.io 开放标准。技能的触发条件是代理完成复杂任务或后续再次使用相关能力,输入是任务经验和已有技能内容,输出是可复用、可更新的技能描述或执行逻辑。

技能会改变代理未来的行为,因此应当把技能文件视为可执行或半可执行的配置资产进行审查。资料没有提供技能目录、文件格式、审核钩子和回滚命令;在生产环境启用自动创建前,应先确认官方文档中的隔离和审批机制。

定时任务与无人值守自动化

项目内置 cron 调度器(cron scheduler),支持以自然语言描述每日报告、夜间备份和每周审计等任务,并把结果投递到相应平台。输入是任务描述、调度时间和投递渠道,调度器负责在指定时间触发代理,代理完成工具调用后由网关发送结果。

pyproject.tomlcroniter==6.0.0 标记为内置 cron 或间隔任务所需依赖。资料没有提供调度任务的持久化格式、时区默认值、失败重试规则、并发策略和任务删除命令,因此不应根据常见 cron 实现推断这些行为。

子代理、脚本化工具调用与研究能力

代理可以生成相互隔离的子代理来并行处理多个工作流,也可以编写调用工具的 Python 脚本,通过 RPC 将多个步骤压缩为较少的上下文交互。子代理的输入是被拆分后的子任务,输出是各工作流的结果,再由上层代理汇总;脚本化路径的输入是工具调用参数和流程逻辑,输出是 RPC 返回值或最终任务结果。

README 还列出批量轨迹生成和轨迹压缩功能,目标是为下一代工具调用模型准备训练数据。资料没有给出批处理命令、轨迹数据格式、并行数量、资源消耗或质量指标,不能据此推导吞吐量和训练收益。

系统架构与关键模块

从仓库资料可以确认,系统由代理核心、工具与技能、消息网关、调度器、会话记忆、终端后端以及多个前端工作区组成。源码文件清单并未完整提供,因此下面只描述资料明确支持的模块边界,不虚构未展示的类名、接口签名或目录结构。

代理核心与模型提供商

项目允许使用 Nous Portal、OpenRouter、OpenAI、自有端点及 README 所称的其他提供商,并通过 hermes model 切换模型。该设计把模型访问抽象为提供商层,切换模型不要求修改代理业务代码;不过资料没有列出每个提供商的配置键、认证方式和可用模型名称。

pyproject.tomlopenai==2.24.0 列为核心依赖,说明 OpenAI SDK 属于直接依赖之一,但不能据此断定所有提供商都使用相同请求协议。项目同时声明其核心依赖采用精确版本固定,更新时需要同步更新 uv.lock,以保持依赖解析一致。

工具、执行环境与终端后端

工具调用可以落到本地终端、Docker、SSH、Singularity、Modal、Daytona 和 Vercel Sandbox 等后端。后端决定命令或脚本运行的位置,以及环境是否具备持久化能力;README 特别说明 Daytona 和 Modal 可提供休眠后按需唤醒的持久化环境。

本地后端适合开发和受控测试,Docker、SSH、Singularity 适合将执行边界与宿主环境分离,Modal、Daytona 和 Vercel Sandbox 则用于资料中列出的云端或无服务器运行模式。这里的适用性是根据本文作者的经验判断;仓库没有给出各后端的权限矩阵、网络模型和资源上限。

网关、调度与状态

网关进程承接多个消息平台,调度器负责定时触发,记忆系统负责会话搜索和知识持久化。三者共同构成“接收任务—执行工具—保存经验—再次投递”的运行链路,CLI 则提供直接的终端入口。

Docker Compose 注释表明,容器内至少涉及主 Hermes 进程、dashboard 和按配置运行的 profile gateway;s6-overlay 的监督机制用于管理这些服务。资料没有展示服务名、健康检查定义和内部通信端口,部署脚本不应自行假设这些字段。

依赖与运行环境

运行环境存在明确的 Python 和 Node.js 版本边界,安装前应先满足这些约束。Python 依赖由 pyproject.toml 管理,Node 依赖由根目录 package.json 的工作区配置管理。

类别 资料中的要求 用途 来源
Python >=3.11,<3.14 项目声明的 Python 版本范围 pyproject.toml
核心 SDK openai==2.24.0 模型调用相关的直接依赖 pyproject.toml
CLI 交互 prompt_toolkit==3.0.52 交互式命令行界面 pyproject.toml
调度器 croniter==6.0.0 cron 与间隔任务调度 pyproject.toml
Node.js >=22.22.0 Node 工作区和相关前端组件的运行边界 package.json
npm <11.10.0 || >=11.17.0 Node 包管理器版本边界 package.json
工作区 apps/*ui-tuiui-tui/packages/*webtests-js Node.js workspace 的包范围 package.json

Python 核心依赖包括 httpx[socks]==0.28.1rich==14.3.3tenacity==9.1.4pyyaml==6.0.3ruamel.yaml==0.18.17jinja2==3.1.6 等,完整列表应直接检查仓库文件。提供商专用依赖并不全部放在核心依赖中,资料明确举例包括 anthropicfirecrawl-pyexa-pyfal-clientedge-ttsparallel-web,并说明这类依赖会在用户选择对应后端时由 tools/lazy_deps.py 延迟安装。

快速开始

资料给出了 Linux、macOS、WSL2 和 Termux 的安装入口,但当前提供的 README 片段在 curl URL 处被截断,因此不能补写一个未经资料确认的完整安装命令。下面给出仓库资料中可核查的 Docker Compose 运行路径,以及根目录脚本声明的 CLI 验证命令。

环境准备

本地 Python 环境需要符合 >=3.11,<3.14,Node.js 需要符合 >=22.22.0,npm 需要满足根目录 package.json 的版本表达式。Dockerfile 使用 Debian 13.4 运行阶段,并从 Node 26 镜像阶段复制 Node 与 npm;这属于仓库容器构建定义,不代表宿主机必须使用同一发行版。

最小运行示例:Compose 路径

以下命令来自 docker-compose.yml 顶部的使用说明,作用是将宿主用户和组 ID 传入 Compose,再以后台方式启动服务。它不包含模型密钥,因此不会把敏感凭据写入示例;模型提供商的认证配置字段未在资料中提供。

Bash
HERMES_UID=$(id -u) HERMES_GID=$(id -g) docker compose up -d

HERMES_UIDHERMES_GID 用于让容器内创建的文件归属于宿主机指定用户,避免宿主目录出现无法读写的文件。Compose 注释说明,s6-overlay 阶段钩子会根据这两个值调整容器内 hermes 用户和组。

最小运行示例:命令帮助验证

根目录 package.jsonpostinstall 文本明确提示使用 python run_agent.py --help 查看代理帮助信息。该命令适合作为本地安装后的基本验证,不会主动执行远程目标、发送消息或提交高风险任务。

Bash
python run_agent.py --help

根目录还声明了 npm run install:rootnpm run install:webnpm run install:tuinpm run install:desktop 等脚本。若只验证根工作区的 Node 依赖,可执行下列资料中真实存在的脚本;这一步不能替代 Python 依赖安装。

Bash
npm run install:root

上述三步的边界需要明确:Compose 启动依赖容器构建或镜像流程,根 npm 脚本只覆盖 Node 工作区,而 Python 运行依赖仍应按官方 README 和文档提供的安装流程处理。当前资料未提供完整 curl 安装地址、初始化向导和模型配置命令,建议以最新 README 为准。

配置说明

仓库资料能够确认的配置主要来自 pyproject.tomlpackage.jsonDockerfiledocker-compose.yml。下表只列出文件中出现的字段或环境变量;“未提供”表示资料没有给出默认值,不应理解为系统一定使用空值。

字段名 类型 默认值 作用
requires-python 版本约束字符串 >=3.11,<3.14 限制 Python 解释器范围
engines.node 版本约束字符串 >=22.22.0 限制 Node.js 版本
engines.npm 版本约束字符串 <11.10.0 || >=11.17.0 限制 npm 版本
HERMES_UID 整数环境变量 未提供;示例使用 id -u 映射容器内用户的 UID
HERMES_GID 整数环境变量 未提供;示例使用 id -g 映射容器内用户的 GID
PYTHONUNBUFFERED 字符串环境变量 1 让 Python 日志立即输出
PYTHONDONTWRITEBYTECODE 字符串环境变量 1 运行时不写入 Python 字节码文件
PLAYWRIGHT_BROWSERS_PATH 路径环境变量 /opt/hermes/.playwright 将 Playwright 浏览器放在数据卷覆盖范围之外
dashboard 绑定地址 地址 127.0.0.1 Compose 注释所述的默认绑定地址

模型服务商、API 密钥、消息平台令牌和数据库路径不在给定资料中。敏感参数应使用本地环境变量、受控密钥存储或官方文档指定的配置文件,不应将真实密钥提交到 Git 仓库、镜像层或聊天记录中。

进阶用法

进阶能力的价值在于把一次性代理调用转化为可重复的自动化流程,但它也会扩大状态和权限边界。启用前应分别验证模型调用、工具执行、技能写入、消息投递和定时触发,而不是把所有能力一次性放入生产环境。

模型提供商切换

README 明确给出 hermes model 作为模型切换入口,并列出 Nous Portal、OpenRouter、OpenAI 和自有端点。切换的输入是提供商或模型选择,输出是后续代理调用使用的新模型;资料强调无需修改代码,但未给出完整交互示例和认证字段。

Bash
hermes model

执行前请准备对应提供商的凭据,并确认组织策略允许把输入、工具参数和历史会话发送给该服务。具体密钥字段使用 <你的-API-KEY> 这类占位符时,应在本地替换为真实值,不要把替换后的命令复制到公开日志或文章中。

多终端后端选择

在本地调试工具行为时,可优先选择本地或 Docker 后端;需要通过远程主机工作时,README 列出了 SSH;需要隔离计算环境时,可评估 Singularity、Modal、Daytona 和 Vercel Sandbox。这里的场景建议是根据本文作者的经验判断,仓库资料没有提供正式选型矩阵。

每个后端都应单独核对文件挂载、网络访问、凭据传递、进程生命周期和数据持久化。README 只明确指出 Daytona 和 Modal 支持服务器端持久化并可在空闲时休眠,不能据此推断其他后端拥有相同的生命周期行为。

定时报告与消息投递

定时器适用于报告、备份和审计等无人值守任务。任务触发后,代理按自然语言描述调用工具,再由内置投递机制发送到目标平台;任务内容、执行身份和投递渠道应分别设置最小权限。

资料没有提供创建 cron 任务的具体 CLI 命令,因此不写入未经核查的命令行参数。需要建立此类任务时,应查阅官方文档,重点确认时区、错误处理、重复触发和投递失败后的行为。

可观测性与运维

项目的运行维护重点是进程监督、日志及时输出、数据卷权限和服务边界。Dockerfile 设置 PYTHONUNBUFFERED=1,Compose 注释则说明 s6-overlay 负责监督主 Hermes 进程、dashboard 和各 profile gateway。

  • 日志:Python 标准输出不缓冲,有利于容器日志及时出现;资料没有给出日志格式、级别和集中采集方案。
  • 进程:s6-overlay 的 /init 作为 PID 1,负责监督服务并处理子进程回收;容器内可能产生 MCP stdio 子进程、git、bun 等进程。
  • 文件权限:通过 HERMES_UIDHERMES_GID 让容器写入的文件与宿主用户匹配。
  • 运行状态:资料没有提供健康检查、指标名称、告警规则、备份恢复流程或 SLA。
  • 升级:Python 依赖采用精确版本固定,依赖升级需要修改版本并重新生成 uv.lock

Dockerfile 还专门构建固定版本的 SQLite 共享库,并启用了 FTS3、FTS4、FTS5、RTREE 等编译选项。该信息说明会话全文搜索和 SQLite 运行时是容器构建关注点,但不能从资料推导数据库容量、搜索延迟或并发指标。

安全与合规边界

Hermes Agent 能够调用终端、远程后端、消息平台、网络相关工具和自动化任务,因此安全边界取决于模型、工具、运行环境和凭据共同形成的权限集合。该项目应只在获得授权的本地、测试或组织环境中使用,不应把代理连接到未授权目标或不属于使用者的账号、主机和数据。

授权与隔离要求

  • 为本地文件、SSH 主机、Docker 容器和云端沙箱分别建立明确的授权范围,避免让同一凭据覆盖无关环境。
  • 将 API 密钥、消息平台令牌和远程登录凭据放在受控配置中;资料未提供统一密钥管理模块,因此不能宣称项目会自动完成密钥隔离。
  • 对自动创建或自我改进的技能执行人工审查,尤其是涉及命令执行、网络访问、文件删除和外部投递的技能。
  • 将跨会话记忆和 Honcho 用户建模视为隐私数据处理范围,明确收集目的、保存周期、访问权限和删除流程。
  • 定时备份、报告和审计任务应使用专用账号,并在授权环境中验证误触发、重复触发和投递对象。

docker-compose.yml 的注释指出 dashboard 默认绑定到 127.0.0.1。这可以减少直接暴露到外部网络的风险,但资料没有给出完整网络配置、认证机制或反向代理策略,因此不能把该绑定地址视为完整的生产安全方案。

许可证与商用条款

仓库使用 MIT License,版权信息为 Copyright(c)2025 Nous Research。MIT 文本授予获得软件者使用、复制、修改、合并、发布、分发、再许可和销售软件副本的许可,但分发时必须保留版权声明和许可声明。

许可证同时明确软件按“现状”提供,不承担适销性、特定用途适用性和不侵权等保证,作者或版权持有人不对因使用软件产生的索赔、损害或其他责任负责。由此可确认,MIT 文本本身允许商用,但具体商用仍需遵守第三方模型服务、消息平台、依赖包和部署环境的各自条款;相关条款不在给定资料中,需分别核查。

分发修改版或包含 substantial portions 的副本时,应保留仓库要求的版权和许可文本。其他专利、商标、数据合规、模型输出责任和托管服务条款,资料没有提供,须以仓库 LICENSE、相关依赖许可证和实际服务协议为准。

局限性与已知限制

当前资料足以说明项目能力边界,但不足以支持完整的生产部署承诺。下面列出的限制来自资料缺口或已明确的工程约束,不把未知内容包装成项目缺陷。

  • 给定 README 的快速安装 URL 被截断,无法从当前片段核实完整安装命令。
  • 没有提供模型提供商的完整配置字段、密钥变量、模型清单和错误码。
  • 没有提供 Telegram、Discord、Slack、WhatsApp、Signal 的逐平台配置、权限和限流说明。
  • 没有提供会话数据库默认路径、记忆删除机制、数据保留策略和跨平台同步实现细节。
  • 没有提供技能文件的完整格式、审核流程、版本控制方式和回滚命令。
  • 没有 Benchmark、并发上限、延迟、成本、可用性或 SLA 数据,不能据此比较性能。
  • Python 版本上限为 <3.14;项目注释说明该限制与 Rust 后端依赖在 Python 3.14 下缺少对应 wheel 有关。
  • Node.js 工作区要求 Node >=22.22.0,npm 还存在明确的排除版本区间。

如果应用场景要求强审计、确定性执行、严格数据驻留或固定响应时间,应先验证项目是否满足这些要求,而不能仅依据“自我改进”或“运行在哪里”的功能描述作出结论。

适合谁

以下信号同时出现时,Hermes Agent 的设计方向与需求较匹配。判断依据是 README、项目配置和部署文件中已公开的能力,而非性能承诺。

  1. 团队需要在 CLI 与多个消息平台之间保持同一代理会话,并且能够维护至少一个长期运行的网关进程。
  2. 任务包含多步工具调用、远程终端操作、定时报告或周期性审计,需要代理在无人值守时工作。
  3. 团队愿意承担 Python、Node.js、容器、模型提供商密钥和数据持久化的运维责任。
  4. 研究工作需要批量生成或压缩代理轨迹,并且能够自行验证训练数据的隐私和授权来源。
  5. 使用者希望在 Nous Portal、OpenRouter、OpenAI 或自有端点之间切换,而不修改代理业务代码。

不适合谁

以下任一信号都表示需要谨慎评估,或先采用权限更小、状态更少的工具。这里不构造未在资料中出现的替代产品结论,只说明项目能力与需求之间的边界。

  1. 组织禁止代理访问终端、远程主机、外部网络或第三方消息平台,而业务又不允许建立隔离执行环境。
  2. 项目要求由供应商提供明确 SLA、性能指标、审计报表或数据驻留保证,但当前仓库资料没有这些承诺。
  3. 团队只能运行 Python 3.10 或 Python 3.14 及以上版本,无法满足项目声明的 >=3.11,<3.14 约束。
  4. 系统必须采用 Node.js 20.x 或 npm 被项目声明排除的版本,且无法调整前端构建环境。
  5. 数据包含高度敏感的长期用户画像或跨会话记忆,但组织没有为此建立保存、删除、访问和审计制度。

常见问题与排查(FAQ / Troubleshooting)

排查应先核对版本、安装路径和运行模式,再检查模型与工具权限。当前资料没有给出完整错误码,因此以下问题只覆盖能够由仓库文件直接验证的边界。

为什么 Python 3.14 不能直接作为项目环境

pyproject.tomlrequires-python 声明为 >=3.11,<3.14。项目注释说明,Python 3.14 下部分 Rust 后端依赖可能没有对应 wheel,安装工具会退回源码构建;应使用符合约束的 Python 版本,或等待项目提高上限。

为什么 npm 安装时提示版本不符合

package.json 要求 Node.js >=22.22.0,npm 必须满足 <11.10.0 || >=11.17.0。请先检查宿主机版本是否落入该表达式,不能仅根据 Node.js 的版本判断 npm 是否兼容。

Compose 生成的文件为什么在宿主机上不可读写

Compose 使用说明要求设置 HERMES_UID=$(id -u)HERMES_GID=$(id -g)。这两个值用于调整容器内用户和组映射;若未按说明传入,文件属主可能与宿主机当前用户不一致,具体行为仍应结合实际 Compose 文件和挂载配置确认。

为什么容器日志没有立即显示

Dockerfile 显式设置 PYTHONUNBUFFERED=1,用于关闭 Python 输出缓冲。若仍看不到日志,应先确认容器是否启动、s6-overlay 是否正常运行以及目标服务是否由监督器拉起;资料没有提供具体日志查看命令和服务名称。

为什么不能直接照抄模型或平台配置

当前资料只列出提供商名称和模型切换入口,没有给出 API 密钥变量、端点字段和平台令牌字段。应以官方文档中的 provider integration 页面为准,使用 <你的-API-KEY> 等占位符替换本地秘密,不要从未提供的字段名进行猜测。

如何处理依赖升级

项目注释要求升级直接依赖后重新生成 uv.lock,并强调精确版本固定用于减少未经审查的传递依赖变化。升级前应在隔离环境中验证核心会话、提供商后端、工具调用和消息投递;资料没有提供自动化升级流程或兼容性矩阵。

项目地址与资源

下列链接均来自仓库资料或其 README 中出现的项目、组织和集成资源。模型服务商、第三方平台和开放标准的实际使用条件,应分别阅读对应页面的最新说明。

结论

Hermes Agent 的工程重点是把模型、工具、长期记忆、技能演化、消息网关和多种执行后端放入一个可部署的代理系统。它适合有能力管理运行环境和数据边界的团队,而不是无需配置、无需审计的黑盒服务。

评估项目时,建议先用受控本地环境验证 CLI 和模型调用,再单独验证容器后端、记忆策略、技能写入、定时任务及消息平台投递。对于生产部署,版本约束、凭据管理、状态备份、权限隔离和 LICENSE 义务应与功能验证同等优先。