hermes-atlas-ecosystem-map
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseHermes Atlas Ecosystem Map
Hermes Atlas生态系统图谱
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 installDependencies (only 2):
- — for embeddings and OpenRouter API
openai - — for star count caching and history
redis
bash
git clone https://github.com/ksimback/hermes-ecosystem.git
cd hermes-ecosystem
npm install依赖项(仅2个):
- — 用于嵌入和OpenRouter API
openai - — 用于星标数缓存和历史记录
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 clienthermes-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 , verify:
data/repos.json- 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:
- — Core agent skills
skills - — External tool integrations
tools - — Hermes plugins
plugins - — Hosting/infrastructure templates
deployments - — Multi-skill orchestration
frameworks - — Third-party service connectors
integrations - — Modified Hermes Agent versions
forks - — User interfaces and dashboards
ui - — Datasets and evaluation tools
data - — Academic papers and experiments
research - — Boilerplates and starters
templates - — Everything else
misc
json
{
"categories": {
"skills": [
{
"name": "hermes-skill-example",
"url": "https://github.com/username/hermes-skill-example",
"description": "Skill功能的简要描述",
"tags": ["tag1", "tag2"]
}
]
}
}可用分类:
- — 核心Agent技能
skills - — 外部工具集成
tools - — Hermes插件
plugins - — 托管/基础设施模板
deployments - — 多技能编排框架
frameworks - — 第三方服务连接器
integrations - — 修改后的Hermes Agent版本
forks - — 用户界面和仪表盘
ui - — 数据集和评估工具
data - — 学术论文和实验
research - — 模板和启动项目
templates - — 其他类别
misc
3. Verify the Change
3. 验证更改
bash
undefinedbash
undefinedCheck JSON syntax
检查JSON语法
node -e "require('./data/repos.json')"
node -e "require('./data/repos.json')"
Preview locally
本地预览
open index.html
undefinedopen index.html
undefinedRebuilding the Knowledge Base
重建知识库
After updating files in , rebuild embeddings:
research/bash
undefined更新目录下的文件后,重建嵌入数据:
research/bash
undefinedSet 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)
undefinednode 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)
undefinedTesting the RAG Pipeline
测试RAG流水线
bash
export OPENROUTER_API_KEY=sk-or-v1-...
node scripts/test-rag.jsSample 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.jsonCaching:
- 1hr TTL in Redis
- Falls back to direct GitHub API if cache miss
- Rate limit: 5000/hr with , 60/hr without
GITHUB_TOKEN
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
- 速率限制:使用时5000次/小时,未使用时60次/小时
GITHUB_TOKEN
响应示例:
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:
- Conversation-aware rewrite — expands query using chat history
- Hybrid search — BM25 (keyword) + cosine similarity (semantic)
- MMR re-ranking — maximal marginal relevance to reduce redundancy
- Top-K selection — retrieves 5 most relevant chunks
- 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"}检索流水线:
- 对话感知重写 — 利用聊天历史扩展查询
- 混合搜索 — BM25(关键词)+ 余弦相似度(语义)
- MMR重排序 — 最大边际相关性,减少冗余
- Top-K选择 — 检索5个最相关片段
- LLM生成 — 以Gemma 4 31B为主模型,附带回退链
Configuration
配置
Environment Variables (Vercel)
环境变量(Vercel)
bash
undefinedbash
undefinedRequired
必填
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
undefinedGITHUB_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
undefinedvercel.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 RequestsFix: 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: or
ECONNREFUSEDETIMEDOUTFix: Check format:
REDIS_URLbash
undefined错误: 或
ECONNREFUSEDETIMEDOUT修复: 检查格式:
REDIS_URLbash
undefinedCorrect 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...
undefinedredis://:password@host...
undefinedStars Not Updating
星标数未更新
Error: Cached star counts stale after 1 hour
Fix: Manually bust cache:
bash
undefined问题: 缓存的星标数1小时后仍未更新
修复: 手动清除缓存:
bash
undefinedVia 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 --verboseReview 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 100node -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; // 原100GitHub Rate Limit Exceeded
GitHub速率限制超出
Error:
403 rate limit exceededFix: Add to Vercel env vars:
GITHUB_TOKEN- Go to GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens
- Create token with Public repositories (read-only) permission
- Add to Vercel:
GITHUB_TOKEN=ghp_...
This increases rate limit from 60/hr to 5000/hr.
错误:
403 rate limit exceeded修复: 在Vercel环境变量中添加:
GITHUB_TOKEN- 进入GitHub → 设置 → 开发者设置 → 个人访问令牌 → 细粒度令牌
- 创建具备**公共仓库(只读)**权限的令牌
- 添加至Vercel:
GITHUB_TOKEN=ghp_...
这会将速率限制从60次/小时提升至5000次/小时。
Local Development
本地开发
bash
undefinedbash
undefinedOpen 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
undefinedbash
undefinedDeploy 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)