hermes-atlas-ecosystem-map

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Hermes Atlas Ecosystem Map

Hermes Atlas生态系统图谱

Skill by ara.so — Hermes Skills collection.
ara.so开发的Skill — 属于Hermes Skills集合。

What is Hermes Atlas?

什么是Hermes Atlas?

Hermes Atlas is a community-curated directory of the Hermes Agent ecosystem—mapping every tool, skill, integration, and deployment template built for Hermes Agent by Nous Research. It features:
  • Quality-filtered repository catalog (80+ projects across 12 categories)
  • Live GitHub star counts with 30-day sparklines
  • RAG-powered chatbot ("Ask the Atlas") grounded in 27 research files
  • Hybrid search/filter with trending badges
  • Zero-framework frontend (vanilla HTML/CSS/JS)
  • Serverless API (Vercel functions + Redis cache)
Hermes Atlas是由社区维护的Hermes Agent生态系统目录——收录了Nous Research为Hermes Agent开发的所有工具、Skill、集成和部署模板。它具备以下特性:
  • 经过质量筛选的仓库目录(涵盖12个分类的80+个项目)
  • 带30天趋势图的GitHub实时星标数
  • 基于RAG的聊天机器人(“Ask the Atlas”),依托27份研究文件构建知识库
  • 混合搜索/筛选功能,附带热门标识
  • 无框架前端(原生HTML/CSS/JS)
  • Serverless API(Vercel函数 + Redis缓存)

Installation

安装

bash
git clone https://github.com/ksimback/hermes-ecosystem.git
cd hermes-ecosystem
npm install
Dependencies (only 2):
  • openai
    — for embeddings and OpenRouter API
  • redis
    — for star count caching and history
bash
git clone https://github.com/ksimback/hermes-ecosystem.git
cd hermes-ecosystem
npm install
依赖项(仅2个):
  • openai
    — 用于嵌入和OpenRouter API
  • redis
    — 用于星标数缓存和历史记录

Key Files

关键文件

hermes-ecosystem/
├── index.html                 # Main map UI (single-page app)
├── data/
│   ├── repos.json            # Single source of truth (84 repos)
│   └── chunks.json           # Pre-computed embeddings (283 chunks, 7MB)
├── api/
│   ├── stars.js              # Live star counts (1hr cache)
│   ├── stars-history.js      # 30-day sparkline data
│   └── chat.js               # RAG chatbot with streaming
├── scripts/
│   ├── build-chunks.js       # Rebuild embeddings from research/
│   └── test-rag.js           # RAG quality tests (27 test cases)
├── research/                  # 27 knowledge base files
└── lib/redis.js              # Shared Redis client
hermes-ecosystem/
├── index.html                 # 主图谱UI(单页应用)
├── data/
│   ├── repos.json            # 唯一数据源(84个仓库)
│   └── chunks.json           # 预计算的嵌入数据(283个片段,7MB)
├── api/
│   ├── stars.js              # 实时星标数(1小时缓存)
│   ├── stars-history.js      # 30天趋势图数据
│   └── chat.js               # 支持流式输出的RAG聊天机器人
├── scripts/
│   ├── build-chunks.js       # 从research/目录重建嵌入数据
│   └── test-rag.js           # RAG质量测试(27个测试用例)
├── research/                  # 27个知识库文件
└── lib/redis.js              # 共享Redis客户端

Adding a New Project

添加新项目

1. Quality Filter Criteria

1. 质量筛选标准

Before adding to
data/repos.json
, verify:
  • Built for Hermes Agent (not generic AI tools)
  • Created after July 22, 2025 (Hermes Agent launch)
  • Shows genuine effort (not personal pet projects)
  • Passes security review (check for credential leaks, malicious code)
添加到
data/repos.json
之前,请验证:
  • 专为Hermes Agent构建(非通用AI工具)
  • 创建于2025年7月22日之后(Hermes Agent发布日期)
  • 体现真实开发投入(非个人小项目)
  • 通过安全审核(检查是否存在凭证泄露、恶意代码)

2. Add to repos.json

2. 添加至repos.json

json
{
  "categories": {
    "skills": [
      {
        "name": "hermes-skill-example",
        "url": "https://github.com/username/hermes-skill-example",
        "description": "Brief description of what the skill does",
        "tags": ["tag1", "tag2"]
      }
    ]
  }
}
Available categories:
  • skills
    — Core agent skills
  • tools
    — External tool integrations
  • plugins
    — Hermes plugins
  • deployments
    — Hosting/infrastructure templates
  • frameworks
    — Multi-skill orchestration
  • integrations
    — Third-party service connectors
  • forks
    — Modified Hermes Agent versions
  • ui
    — User interfaces and dashboards
  • data
    — Datasets and evaluation tools
  • research
    — Academic papers and experiments
  • templates
    — Boilerplates and starters
  • misc
    — Everything else
json
{
  "categories": {
    "skills": [
      {
        "name": "hermes-skill-example",
        "url": "https://github.com/username/hermes-skill-example",
        "description": "Skill功能的简要描述",
        "tags": ["tag1", "tag2"]
      }
    ]
  }
}
可用分类:
  • skills
    — 核心Agent技能
  • tools
    — 外部工具集成
  • plugins
    — Hermes插件
  • deployments
    — 托管/基础设施模板
  • frameworks
    — 多技能编排框架
  • integrations
    — 第三方服务连接器
  • forks
    — 修改后的Hermes Agent版本
  • ui
    — 用户界面和仪表盘
  • data
    — 数据集和评估工具
  • research
    — 学术论文和实验
  • templates
    — 模板和启动项目
  • misc
    — 其他类别

3. Verify the Change

3. 验证更改

bash
undefined
bash
undefined

Check JSON syntax

检查JSON语法

node -e "require('./data/repos.json')"
node -e "require('./data/repos.json')"

Preview locally

本地预览

open index.html
undefined
open index.html
undefined

Rebuilding the Knowledge Base

重建知识库

After updating files in
research/
, rebuild embeddings:
bash
undefined
更新
research/
目录下的文件后,重建嵌入数据:
bash
undefined

Set API key

设置API密钥

export OPENROUTER_API_KEY=sk-or-v1-...
export OPENROUTER_API_KEY=sk-or-v1-...

Rebuild chunks.json (splits + embeds)

重建chunks.json(拆分+嵌入)

node scripts/build-chunks.js
node scripts/build-chunks.js

Test RAG quality

测试RAG质量

node scripts/test-rag.js

**build-chunks.js** does:
1. Reads all `.md` files in `research/`
2. Splits into 500-char chunks with 100-char overlap
3. Embeds each chunk using OpenAI `text-embedding-3-small`
4. Writes to `data/chunks.json` (static file, committed to repo)

**Output:**
Processing research/agent-architecture.md... Processing research/hermes-skills.md... ... ✅ Built 283 chunks (7.2 MB)
undefined
node scripts/test-rag.js

**build-chunks.js的功能:**
1. 读取`research/`目录下所有`.md`文件
2. 将文件拆分为500字符片段,重叠100字符
3. 使用OpenAI `text-embedding-3-small`为每个片段生成嵌入
4. 写入`data/chunks.json`(静态文件,提交至仓库)

**输出示例:**
Processing research/agent-architecture.md... Processing research/hermes-skills.md... ... ✅ Built 283 chunks (7.2 MB)
undefined

Testing the RAG Pipeline

测试RAG流水线

bash
export OPENROUTER_API_KEY=sk-or-v1-...
node scripts/test-rag.js
Sample test:
javascript
// scripts/test-rag.js excerpt
const tests = [
  {
    query: "How do I create a custom Hermes skill?",
    expectedKeywords: ["skill.md", "yaml", "frontmatter", "triggers"]
  },
  {
    query: "What's the difference between a skill and a tool?",
    expectedKeywords: ["skill", "tool", "integration", "plugin"]
  }
];
Output:
Test 1/27: How do I create a custom Hermes skill?
✅ Found 4/4 keywords in context
...
27/27 passed (100%)
bash
export OPENROUTER_API_KEY=sk-or-v1-...
node scripts/test-rag.js
测试示例:
javascript
// scripts/test-rag.js片段
const tests = [
  {
    query: "How do I create a custom Hermes skill?",
    expectedKeywords: ["skill.md", "yaml", "frontmatter", "triggers"]
  },
  {
    query: "What's the difference between a skill and a tool?",
    expectedKeywords: ["skill", "tool", "integration", "plugin"]
  }
];
输出示例:
Test 1/27: How do I create a custom Hermes skill?
✅ Found 4/4 keywords in context
...
27/27 passed (100%)

API Endpoints

API端点

GET /api/stars

GET /api/stars

Returns live star counts for all repos in
repos.json
.
Caching:
  • 1hr TTL in Redis
  • Falls back to direct GitHub API if cache miss
  • Rate limit: 5000/hr with
    GITHUB_TOKEN
    , 60/hr without
Response:
json
{
  "username/repo": 142,
  "anotheruser/hermes-skill": 89
}
Usage in frontend:
javascript
const response = await fetch('/api/stars');
const stars = await response.json();
document.querySelector('[data-repo="username/repo"]').textContent = stars['username/repo'];
返回
repos.json
中所有仓库的实时星标数。
缓存机制:
  • Redis中1小时TTL
  • 缓存未命中时回退到直接调用GitHub API
  • 速率限制:使用
    GITHUB_TOKEN
    时5000次/小时,未使用时60次/小时
响应示例:
json
{
  "username/repo": 142,
  "anotheruser/hermes-skill": 89
}
前端使用示例:
javascript
const response = await fetch('/api/stars');
const stars = await response.json();
document.querySelector('[data-repo="username/repo"]').textContent = stars['username/repo'];

GET /api/stars-history?repos=user/repo1,user/repo2

GET /api/stars-history?repos=user/repo1,user/repo2

Returns 30-day star count history for sparklines.
Response:
json
{
  "user/repo1": [120, 122, 125, 128, 130, ...],
  "user/repo2": [45, 47, 49, 51, 53, ...]
}
返回指定仓库的30天星标数历史数据,用于生成趋势图。
响应示例:
json
{
  "user/repo1": [120, 122, 125, 128, 130, ...],
  "user/repo2": [45, 47, 49, 51, 53, ...]
}

POST /api/chat

POST /api/chat

RAG chatbot endpoint with streaming support.
Request:
json
{
  "message": "How do I deploy Hermes Agent?",
  "conversationHistory": [
    {"role": "user", "content": "What is Hermes Agent?"},
    {"role": "assistant", "content": "Hermes Agent is..."}
  ]
}
Response (streaming):
data: {"type":"context","chunks":[{"text":"...","file":"deployment.md"}]}
data: {"type":"token","content":"To deploy"}
data: {"type":"token","content":" Hermes Agent"}
data: {"type":"done"}
Retrieval pipeline:
  1. Conversation-aware rewrite — expands query using chat history
  2. Hybrid search — BM25 (keyword) + cosine similarity (semantic)
  3. MMR re-ranking — maximal marginal relevance to reduce redundancy
  4. Top-K selection — retrieves 5 most relevant chunks
  5. LLM generation — Gemma 4 31B with fallback chain
支持流式输出的RAG聊天机器人端点。
请求示例:
json
{
  "message": "How do I deploy Hermes Agent?",
  "conversationHistory": [
    {"role": "user", "content": "What is Hermes Agent?"},
    {"role": "assistant", "content": "Hermes Agent is..."}
  ]
}
响应示例(流式输出):
data: {"type":"context","chunks":[{"text":"...","file":"deployment.md"}]}
data: {"type":"token","content":"To deploy"}
data: {"type":"token","content":" Hermes Agent"}
data: {"type":"done"}
检索流水线:
  1. 对话感知重写 — 利用聊天历史扩展查询
  2. 混合搜索 — BM25(关键词)+ 余弦相似度(语义)
  3. MMR重排序 — 最大边际相关性,减少冗余
  4. Top-K选择 — 检索5个最相关片段
  5. LLM生成 — 以Gemma 4 31B为主模型,附带回退链

Configuration

配置

Environment Variables (Vercel)

环境变量(Vercel)

bash
undefined
bash
undefined

Required

必填

OPENROUTER_API_KEY=sk-or-v1-... REDIS_URL=redis://default:password@host:port
OPENROUTER_API_KEY=sk-or-v1-... REDIS_URL=redis://default:password@host:port

Optional

可选

GITHUB_TOKEN=ghp_... # Fine-grained PAT (public read-only) OPENROUTER_MODEL=google/gemma-4-31b-it:free # Primary LLM OPENROUTER_FALLBACK_MODELS=google/gemma-4-26b-it:free,google/gemini-3-flash-1.5
undefined
GITHUB_TOKEN=ghp_... # 细粒度PAT(公共仓库只读) OPENROUTER_MODEL=google/gemma-4-31b-it:free # 主LLM OPENROUTER_FALLBACK_MODELS=google/gemma-4-26b-it:free,google/gemini-3-flash-1.5
undefined

vercel.json Configuration

vercel.json配置

json
{
  "functions": {
    "api/**/*.js": {
      "maxDuration": 30
    }
  },
  "crons": [
    {
      "path": "/api/stars-daily-snapshot",
      "schedule": "0 0 * * *"
    }
  ]
}
json
{
  "functions": {
    "api/**/*.js": {
      "maxDuration": 30
    }
  },
  "crons": [
    {
      "path": "/api/stars-daily-snapshot",
      "schedule": "0 0 * * *"
    }
  ]
}

Common Patterns

常见模式

Adding Multiple Projects at Once

批量添加多个项目

javascript
// scripts/batch-add.js (create this if needed)
const fs = require('fs');
const repos = require('../data/repos.json');

const newProjects = [
  { name: "hermes-skill-web-search", url: "https://github.com/...", category: "skills" },
  { name: "hermes-tool-calendar", url: "https://github.com/...", category: "tools" }
];

newProjects.forEach(proj => {
  repos.categories[proj.category].push({
    name: proj.name,
    url: proj.url,
    description: "",  // Fill in manually
    tags: []
  });
});

fs.writeFileSync('./data/repos.json', JSON.stringify(repos, null, 2));
javascript
// scripts/batch-add.js(按需创建)
const fs = require('fs');
const repos = require('../data/repos.json');

const newProjects = [
  { name: "hermes-skill-web-search", url: "https://github.com/...", category: "skills" },
  { name: "hermes-tool-calendar", url: "https://github.com/...", category: "tools" }
];

newProjects.forEach(proj => {
  repos.categories[proj.category].push({
    name: proj.name,
    url: proj.url,
    description: "",  // 手动填写
    tags: []
  });
});

fs.writeFileSync('./data/repos.json', JSON.stringify(repos, null, 2));

Security Review Checklist

安全审核清单

javascript
// scripts/security-check.js (conceptual)
const checks = [
  {
    name: "No hardcoded credentials",
    test: (code) => !/api[_-]?key\s*=\s*["'][^"']+["']/i.test(code)
  },
  {
    name: "No eval() usage",
    test: (code) => !/eval\(/.test(code)
  },
  {
    name: "Dependencies up to date",
    test: async (repo) => {
      // Check package.json for known vulnerable versions
    }
  }
];
javascript
// scripts/security-check.js(概念示例)
const checks = [
  {
    name: "无硬编码凭证",
    test: (code) => !/api[_-]?key\s*=\s*["'][^"']+["']/i.test(code)
  },
  {
    name: "无eval()使用",
    test: (code) => !/eval\(/.test(code)
  },
  {
    name: "依赖项已更新",
    test: async (repo) => {
      // 检查package.json是否存在已知漏洞版本
    }
  }
];

Custom Sparkline Rendering

自定义趋势图渲染

javascript
// From index.html (adapted for skill documentation)
function renderSparkline(history) {
  const max = Math.max(...history);
  const min = Math.min(...history);
  const range = max - min || 1;
  
  const points = history.map((val, i) => {
    const x = (i / (history.length - 1)) * 100;
    const y = 100 - ((val - min) / range) * 100;
    return `${x},${y}`;
  }).join(' ');
  
  return `<svg viewBox="0 0 100 100"><polyline points="${points}" /></svg>`;
}
javascript
// 来自index.html(适配Skill文档)
function renderSparkline(history) {
  const max = Math.max(...history);
  const min = Math.min(...history);
  const range = max - min || 1;
  
  const points = history.map((val, i) => {
    const x = (i / (history.length - 1)) * 100;
    const y = 100 - ((val - min) / range) * 100;
    return `${x},${y}`;
  }).join(' ');
  
  return `<svg viewBox="0 0 100 100"><polyline points="${points}" /></svg>`;
}

Troubleshooting

故障排除

Embeddings Build Fails

嵌入数据构建失败

Error:
Error: 429 Too Many Requests
Fix: Add rate limiting to build-chunks.js:
javascript
async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

for (const chunk of chunks) {
  const embedding = await getEmbedding(chunk.text);
  chunk.embedding = embedding;
  await sleep(100); // 10 req/sec max
}
错误:
Error: 429 Too Many Requests
修复: 在build-chunks.js中添加速率限制:
javascript
async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

for (const chunk of chunks) {
  const embedding = await getEmbedding(chunk.text);
  chunk.embedding = embedding;
  await sleep(100); // 最大10请求/秒
}

Redis Connection Timeout

Redis连接超时

Error:
ECONNREFUSED
or
ETIMEDOUT
Fix: Check
REDIS_URL
format:
bash
undefined
错误:
ECONNREFUSED
ETIMEDOUT
修复: 检查
REDIS_URL
格式:
bash
undefined

Correct format

正确格式

redis://default:password@host.region.cloud.redislabs.com:12345
redis://default:password@host.region.cloud.redislabs.com:12345

Common mistake (missing default user)

常见错误(缺少默认用户)

redis://:password@host...
undefined
redis://:password@host...
undefined

Stars Not Updating

星标数未更新

Error: Cached star counts stale after 1 hour
Fix: Manually bust cache:
bash
undefined
问题: 缓存的星标数1小时后仍未更新
修复: 手动清除缓存:
bash
undefined

Via Redis CLI

通过Redis CLI

redis-cli -u $REDIS_URL
DEL stars:cache

Or programmatically:
```javascript
// api/stars.js — force refresh
if (req.query.refresh === 'true') {
  await redis.del('stars:cache');
}
redis-cli -u $REDIS_URL
DEL stars:cache

或通过代码实现:
```javascript
// api/stars.js — 强制刷新
if (req.query.refresh === 'true') {
  await redis.del('stars:cache');
}

RAG Returns Irrelevant Results

RAG返回无关结果

Symptom: Chatbot answers unrelated to Hermes Agent
Fix: Check chunk quality:
bash
node scripts/test-rag.js --verbose
症状: 聊天机器人回答与Hermes Agent无关
修复: 检查片段质量:
bash
node scripts/test-rag.js --verbose

Review chunks.json for short/low-quality chunks

查看chunks.json中的短片段/低质量片段

node -e " const chunks = require('./data/chunks.json'); const short = chunks.filter(c => c.text.length < 200); console.log('Short chunks:', short.length); "

Increase chunk size in `build-chunks.js`:
```javascript
const CHUNK_SIZE = 800;  // was 500
const OVERLAP = 150;     // was 100
node -e " const chunks = require('./data/chunks.json'); const short = chunks.filter(c => c.text.length < 200); console.log('Short chunks:', short.length); "

在`build-chunks.js`中增大片段大小:
```javascript
const CHUNK_SIZE = 800;  // 原500
const OVERLAP = 150;     // 原100

GitHub Rate Limit Exceeded

GitHub速率限制超出

Error:
403 rate limit exceeded
Fix: Add
GITHUB_TOKEN
to Vercel env vars:
  1. Go to GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens
  2. Create token with Public repositories (read-only) permission
  3. Add to Vercel:
    GITHUB_TOKEN=ghp_...
This increases rate limit from 60/hr to 5000/hr.
错误:
403 rate limit exceeded
修复: 在Vercel环境变量中添加
GITHUB_TOKEN
  1. 进入GitHub → 设置 → 开发者设置 → 个人访问令牌 → 细粒度令牌
  2. 创建具备**公共仓库(只读)**权限的令牌
  3. 添加至Vercel:
    GITHUB_TOKEN=ghp_...
这会将速率限制从60次/小时提升至5000次/小时。

Local Development

本地开发

bash
undefined
bash
undefined

Open the map in a browser (API endpoints won't work locally)

在浏览器中打开图谱(API端点无法在本地运行)

open index.html
open index.html

Test API endpoints locally (requires env vars)

本地测试API端点(需要环境变量)

export OPENROUTER_API_KEY=... export REDIS_URL=... vercel dev

**Note:** The frontend is pure static HTML—no build step required. API endpoints only run on Vercel or with `vercel dev`.
export OPENROUTER_API_KEY=... export REDIS_URL=... vercel dev

**注意:** 前端为纯静态HTML——无需构建步骤。API端点仅能在Vercel或通过`vercel dev`运行。

Deployment

部署

bash
undefined
bash
undefined

Deploy to Vercel

部署至Vercel

vercel --prod
vercel --prod

Set environment variables

设置环境变量

vercel env add OPENROUTER_API_KEY vercel env add REDIS_URL vercel env add GITHUB_TOKEN

The daily cron job (`/api/stars-daily-snapshot`) automatically runs at midnight UTC to populate sparkline history.

---

**Live site:** [hermesatlas.com](https://hermesatlas.com)  
**Repository:** [github.com/ksimback/hermes-ecosystem](https://github.com/ksimback/hermes-ecosystem)
vercel env add OPENROUTER_API_KEY vercel env add REDIS_URL vercel env add GITHUB_TOKEN

每日定时任务(`/api/stars-daily-snapshot`)会在UTC时间午夜自动运行,填充趋势图历史数据。

---

**在线站点:** [hermesatlas.com](https://hermesatlas.com)  
**仓库地址:** [github.com/ksimback/hermes-ecosystem](https://github.com/ksimback/hermes-ecosystem)