logo
1
0
WeChat Login

Hermes Agent API Service

基于 Hermes Agent 构建的 API 服务,提供定制化环境(skills, MCP)的能力。

项目概述

用户通过指定 workspace-id 克隆新的工作目录,执行 Hermes Agent 操作并返回结果。支持:

  • 异步任务执行(提交任务 → 获取 task_id → 查询结果)
  • 实时进度推送(SSE / WebSocket)
  • WebSocket 双向通信(取消任务、发送消息)
  • Workspace 文件管理(上传、下载、列表)
  • 任务自动清理(基于时间和数量)

技术栈

  • Python 3.11+
  • FastAPI (Web 框架)
  • Hermes Agent (AI Agent 引擎)
  • SQLite (任务存储)
  • SSE (实时进度推送)

项目结构

hermes-agent-api/ ├── app/ │ ├── api/ │ │ ├── tasks.py # 任务管理 API │ │ ├── files.py # 文件管理 API │ │ └── ws.py # WebSocket API │ ├── models.py # 数据模型 │ ├── config.py # 配置管理 │ ├── hooks.py # Hook 管理器 │ ├── output_parser.py # 输出解析器 │ ├── hermes_process.py # Hermes Agent 进程管理器 │ ├── workspace_manager.py # Workspace 管理器 │ ├── task_manager.py # 任务管理器 │ ├── task_storage.py # 任务存储 (SQLite) │ ├── cleanup_service.py # 任务清理服务 │ ├── ws/ │ │ └── manager.py # WebSocket 连接管理器 │ └── main.py # 主应用入口 ├── tests/ # 测试代码 ├── workspaces/ # Workspace 目录 ├── tasks/ # 任务数据库 ├── logs/ # 日志 ├── pyproject.toml # 项目配置 ├── requirements.txt # Python 依赖 ├── Dockerfile # Docker 镜像 └── docker-compose.yml # Docker 编排

快速开始

0. 配置认证(可选)

认证默认是禁用的。要启用 API Key 认证:

# 编辑 .env 文件 nano .env # 启用认证并设置 API Key AUTH_ENABLED=true API_KEY=your-secure-api-key-here

启用后,客户端需要通过以下方式之一提供 API Key:

  • HTTP Header: X-API-Key: your-secure-api-key-here
  • Query 参数: ?api_key=your-secure-api-key-here
  • Authorization Bearer: Authorization: Bearer your-secure-api-key-here

WebSocket 连接需要通过 query 参数提供 API Key:

ws://localhost:8000/ws/task/task_abc123?api_key=your-secure-api-key-here

1. 安装依赖

# 创建虚拟环境 python3 -m venv venv source venv/bin/activate # 安装依赖 pip install -r requirements.txt # 安装 Hermes Agent pip install git+https://github.com/NousResearch/hermes-agent.git

2. 配置环境变量

# 复制环境变量示例文件 cp .env.example .env # 编辑 .env 文件,配置必要的环境变量 # 如:OPENAI_API_KEY, ANTHROPIC_API_KEY 等

3. 启动服务

# 开发模式(自动重载) python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 # 生产模式 python -m uvicorn app.main:app --host 0.0.0.0 --port 8000

4. 访问 API 文档

启动后访问:

API 端点

任务管理

方法端点描述
POST/api/v1/tasks提交任务
GET/api/v1/tasks/{task_id}查询任务状态
DELETE/api/v1/tasks/{task_id}取消任务
GET/api/v1/tasks列出任务
GET/api/v1/tasks/{task_id}/streamSSE 实时进度

WebSocket 实时通信

端点描述
WS /ws/task/{task_id}双向通信(发送消息、取消任务)
WS /ws/task/{task_id}/stream任务进度流式推送

文件管理

方法端点描述
GET/api/v1/workspaces/{workspace_id}/files列出目录
POST/api/v1/workspaces/{workspace_id}/files/upload上传文件
GET/api/v1/workspaces/{workspace_id}/files/download下载文件
POST/api/v1/workspaces/{workspace_id}/directories创建目录
DELETE/api/v1/workspaces/{workspace_id}/files删除文件

健康检查

方法端点描述
GET/health健康检查
GET/health/detailed详细健康检查

使用示例

1. 提交任务

curl -X POST http://localhost:8000/api/v1/tasks \ -H "Content-Type: application/json" \ -d '{ "workspace_id": "proj-123", "message": "分析这个代码库并生成报告", "model": "anthropic/claude-sonnet-4" }'

响应:

{ "task_id": "task_abc123", "status": "pending", "created_at": "2026-04-29T10:00:00Z", "estimated_duration": 300 }

2. 查询任务状态

curl http://localhost:8000/api/v1/tasks/task_abc123

响应:

{ "task_id": "task_abc123", "workspace_id": "proj-123", "status": "running", "created_at": "2026-04-29T10:00:00Z", "started_at": "2026-04-29T10:00:05Z", "progress": { "current_step": "分析代码结构", "percentage": 60 } }

3. SSE 实时进度

curl -N http://localhost:8000/api/v1/tasks/task_abc123/stream

SSE 事件流:

event: task_started data: {"task_id": "task_abc123", "timestamp": "2026-04-29T10:00:05Z"} event: progress data: {"step": "分析代码结构", "percentage": 20} event: message data: {"content": "我发现了 50 个 Python 文件..."} event: task_completed data: {"task_id": "task_abc123", "result": "..."}

4. WebSocket 双向通信

# 使用 websocat 或 wscat 工具 # 安装: npm install -g wscat # 连接 WebSocket wscat -c ws://localhost:8000/ws/task/task_abc123 # 发送消息 > {"type": "user_message", "content": "继续分析"} # 发送 ping > {"type": "ping", "timestamp": 1234567890} # 取消任务 > {"type": "cancel_task"}

JavaScript 客户端示例:

const ws = new WebSocket('ws://localhost:8000/ws/task/task_abc123'); ws.onopen = () => { console.log('WebSocket connected'); // 发送消息 ws.send(JSON.stringify({ type: 'user_message', content: '请继续分析' })); }; ws.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Received:', data); if (data.type === 'task_cancelling') { console.log('Task is being cancelled'); } }; ws.onclose = () => { console.log('WebSocket disconnected'); };

5. WebSocket 进度流

# 连接进度流 WebSocket wscat -c ws://localhost:8000/ws/task/task_abc123/stream # 接收进度更新 < {"type": "stream_started", "task_id": "task_abc123"} # 发送取消请求 > {"type": "cancel"} # 接收确认 < {"type": "cancelled", "task_id": "task_abc123"}

Docker 部署

0. 配置说明

优化后的 Docker 配置包含:

  • 多阶段构建: 减小镜像大小
  • 非 root 用户: 增强安全性
  • 健康检查: 自动检测服务状态
  • .dockerignore: 排除不必要的文件

1. 使用 Docker Compose(生产)

# 构建并启动服务 docker-compose up -d # 查看日志 docker-compose logs -f api # 停止服务 docker-compose down

2. 使用 Docker Compose(开发)

开发环境启用热重载:

# 使用 override 文件 docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d # 查看日志 docker-compose logs -f api

3. 手动构建 Docker 镜像

# 构建镜像 docker build -t hermes-agent-api . # 运行容器 docker run -d \ -p 8000:8000 \ -v $(pwd)/workspaces:/app/workspaces \ -v $(pwd)/tasks:/app/tasks \ -v $(pwd)/logs:/app/logs \ --name hermes-agent-api \ hermes-agent-api

配置说明

详见 .env.example 文件。

关键配置项:

  • HERMES_HOME: Hermes Agent 工作目录
  • TASK_DB_PATH: 任务数据库路径
  • MAX_CONCURRENT_TASKS: 最大并发任务数
  • TASK_CLEANUP_*: 任务清理相关配置

开发指南

代码格式化

项目使用 blackisort 进行代码格式化。

# 安装开发依赖 pip install black isort # 格式化代码 black app/ tests/ --line-length 120 isort app/ tests/ --profile black

运行测试

# 安装开发依赖 pip install -e ".[dev]" # 运行测试 pytest tests/ -v # 运行测试并生成覆盖率报告 pytest tests/ --cov=app --cov-report=html

代码格式化

# 使用 black 格式化代码 black app/ tests/ # 使用 isort 排序 import 语句 isort app/ tests/

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

联系方式

如有问题或建议,请提交 Issue。

About

HERMES AGENT 远程服务API.

Language
Python98.9%
Dockerfile1%
Shell0.1%