【Hermes Agent进阶】开发自定义技能
前言
声明:本文仅介绍一款开源的开发工具和效率工具,旨在帮助开发者提高工作效率。文章内容仅供学习和研究使用,请勿将此工具用于任何商业营销、群发推广或违反平台规定的用途。
在之前的文章中,我们介绍了Hermes Agent的技能系统和如何使用内置技能。今天我们来深入学习如何开发自己的技能。
开发自定义技能不仅能满足你的特定需求,还可以分享给社区,让更多人受益。好的技能能大幅提高Hermes Agent的效率和能力。
什么是技能?
技能(Skill)是Hermes Agent保存的可复用知识和工作流程。它是一个结构化的文档,包含:
- 元数据:名称、描述、标签、版本、作者
- 触发条件:什么情况下应该加载这个技能
- 具体步骤:详细的操作指南
- 注意事项:常见陷阱和解决方案
- 验证方法:如何确认任务完成
- 相关资源:文档、链接、工具
技能存储在~/.hermes/skills/目录下,每个技能是一个独立的文件夹,包含SKILL.md文件和可能的辅助文件。
技能文件结构
基本结构
skill-name/
├── SKILL.md # 技能主文件(必需)
├── references/ # 参考文档(可选)
│ └── api-docs.md
├── templates/ # 模板文件(可选)
│ └── config.yaml
├── scripts/ # 脚本文件(可选)
│ └── setup.sh
└── assets/ # 资源文件(可选)
└── logo.png
SKILL.md 格式
SKILL.md文件包含两部分:
- YAML Frontmatter:元数据
- Markdown内容:技能说明和步骤
示例:
yaml
---
name: fastapi-project-starter
description: 快速创建FastAPI项目的模板和最佳实践
version: 1.0.0
author: Your Name
license: MIT
category: software-development
tags:
- fastapi
- web-development
- python
- best-practices
dependencies:
- python 3.9+
- pip
prerequisites:
- 基本的Python知识
- 了解FastAPI基础
estimated_time: 30 minutes
difficulty: intermediate
metadata:
hermes:
tags: [fastapi, web, python]
homepage: https://github.com/yourusername/skill
related_skills: [test-driven-development, docker]
---
# FastAPI Project Starter
## 何时加载此技能
当你需要:
- 创建新的FastAPI项目
- 重构现有FastAPI应用
- 添加新功能到FastAPI项目
- 学习FastAPI最佳实践
## 项目结构
fastapi-project/
├── app/
│ ├── init .py
│ ├── main.py
│ ├── config.py
│ ├── models/
│ ├── schemas/
│ ├── api/
│ └── utils/
├── tests/
├── Dockerfile
├── requirements.txt
├── .env.example
└── README.md
## 快速开始
### 1. 创建项目结构
使用以下命令创建标准的项目结构:
```bash
# 创建目录
mkdir -p app/{models,schemas,api,utils} tests
# 创建__init__.py文件
touch app/__init__.py app/models/__init__.py app/schemas/__init__.py app/api/__init__.py app/utils/__init__.py tests/__init__.py
2. 安装依赖
bash
pip install fastapi uvicorn sqlalchemy alembic pydantic python-jose[cryptography] passlib[bcrypt] python-multipart
3. 配置环境
创建.env文件:
env
DATABASE_URL=postgresql://user:password@localhost/dbname
SECRET_KEY=your-secret-key
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
核心功能实现
数据库配置
app/db/base.py:
python
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
app/db/session.py:
python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.config import settings
engine = create_engine(settings.DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
配置管理
app/config.py:
python
from pydantic import BaseSettings
from typing import Optional
class Settings(BaseSettings):
DATABASE_URL: str
SECRET_KEY: str
ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
class Config:
env_file = ".env"
settings = Settings()
API路由示例
app/api/users.py:
python
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.schemas.user import UserCreate, UserResponse
router = APIRouter(prefix="/users", tags=["users"])
@router.post("/", response_model=UserResponse)
def create_user(user: UserCreate, db: Session = Depends(get_db)):
# 实现用户创建逻辑
pass
主应用入口
app/main.py:
python
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from app.api import users, auth
app = FastAPI(
title="My FastAPI App",
description="A FastAPI application with best practices",
version="1.0.0"
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(users.router)
app.include_router(auth.router)
@app.get("/")
async def root():
return {"message": "Welcome to the API"}
测试
配置pytest
tests/conftest.py:
python
import pytest
from fastapi.testclient import TestClient
from app.main import app
@pytest.fixture
def client():
return TestClient(app)
@pytest.fixture
def db():
# 创建测试数据库
pass
编写测试
tests/test_users.py:
python
def test_create_user(client):
response = client.post(
"/users/",
json={
"email": "test@example.com",
"username": "testuser",
"password": "testpass123"
}
)
assert response.status_code == 200
data = response.json()
assert data["email"] == "test@example.com"
运行测试:
bash
pytest tests/ -v
Docker容器化
Dockerfile
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
docker-compose.yml
yaml
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: dbname
ports:
- "5432:5432"
app:
build: .
ports:
- "8000:8000"
depends_on:
- postgres
environment:
- DATABASE_URL=postgresql://user:password@postgres/dbname
常见问题和解决方案
问题1:数据库连接失败
原因:数据库服务未启动或配置错误
解决方案:
- 检查PostgreSQL服务是否运行
- 验证
.env文件中的连接字符串 - 使用
docker-compose up -d启动数据库
问题2:CORS错误
原因:前端和后端域名不同
解决方案:
- 在
app/main.py中添加CORS中间件 - 配置正确的
allow_origins
问题3:测试失败
原因:测试数据库未配置或数据冲突
解决方案:
- 使用测试数据库(与生产数据库分离)
- 在每次测试前清理数据
- 使用pytest fixtures管理测试数据
验证清单
完成项目后,检查以下内容:
- 所有依赖已安装
- 数据库连接正常
- API端点响应正确
- 测试全部通过
- Docker容器可以成功构建和运行
- API文档(/docs)可以访问
- 环境变量正确配置
- 日志正常输出
- 错误处理完善
- CORS配置正确
相关资源
- FastAPI官方文档:https://fastapi.tiangolo.com/
- SQLAlchemy文档:https://docs.sqlalchemy.org/
- Pydantic文档:https://pydantic-docs.helpmanual.io/
- Docker文档:https://docs.docker.com/
扩展建议
- 添加认证和授权(JWT)
- 实现文件上传
- 添加WebSocket支持
- 集成Celery异步任务
- 添加监控和日志(Prometheus + Grafana)
- 实现API版本控制
更新日志
v1.0.0 (2024-01-01)
- 初始版本
- 基础项目结构
- 核心功能实现
- Docker配置
- 测试框架
贡献指南
如果你想改进这个技能:
- Fork这个技能
- 创建你的特性分支
- 提交你的修改
- 推送到分支
- 创建Pull Request
许可证
MIT License
## 开发一个好技能的要素
### 1. 明确的使用场景
技能应该解决一个明确的问题或需求:
**好的技能:**
- "快速创建FastAPI项目"
- "配置PostgreSQL数据库"
- "设置Git工作流"
**不好的技能:**
- "做所有事情"(太宽泛)
- "编程帮助"(太模糊)
### 2. 具体的步骤
每个步骤都应该具体、可执行:
**好的描述:**
```bash
# 安装依赖
pip install fastapi uvicorn
# 创建项目结构
mkdir -p app/{models,schemas,api}
touch app/__init__.py
不好的描述:
安装必要的包
创建文件夹
3. 完整的上下文
提供足够的背景信息:
- 为什么这样做
- 这样做的好处
- 替代方案
- 适用场景
4. 错误处理
包含常见问题和解决方案:
- 可能的错误
- 错误原因
- 解决方案
- 预防措施
5. 验证方法
提供检查清单或测试方法:
- 如何验证安装成功
- 如何测试功能
- 常见问题检查
6. 版本控制
记录变更历史:
- 版本号
- 变更日期
- 变更内容
实战:开发一个Python项目初始化技能
让我们从头开发一个实用的技能:python-project-starter
步骤1:规划技能
目标:快速创建符合Python最佳实践的项目结构
功能:
- 创建标准目录结构
- 生成必要的配置文件
- 设置虚拟环境
- 初始化Git仓库
- 配置常用工具(pytest, black, mypy等)
步骤2:创建技能目录
bash
mkdir -p ~/.hermes/skills/python-project-starter/{references,templates,scripts}
cd ~/.hermes/skills/python-project-starter
步骤3:编写SKILL.md
yaml
---
name: python-project-starter
description: 快速创建符合Python最佳实践的项目结构,包含测试、代码格式化、类型检查等工具
version: 1.0.0
author: Your Name
license: MIT
category: software-development
tags:
- python
- project-setup
- best-practices
- development
estimated_time: 15 minutes
difficulty: beginner
metadata:
hermes:
tags: [python, setup, best-practices]
---
# Python Project Starter
## 何时加载此技能
当你需要:
- 创建新的Python项目
- 设置Python开发环境
- 应用Python最佳实践
- 配置代码质量工具
## 项目结构
project-name/
├── src/
│ └── project_name/
│ ├── init .py
│ └── main.py
├── tests/
│ ├── init .py
│ └── test_main.py
├── docs/
├── scripts/
├── .gitignore
├── README.md
├── pyproject.toml
├── requirements.txt
├── requirements-dev.txt
├── setup.py
└── .github/
└── workflows/
└── ci.yml
## 快速开始
### 1. 创建项目
```bash
# 创建项目目录
mkdir my-project
cd my-project
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# 或 .venv\Scripts\activate # Windows
2. 创建目录结构
bash
mkdir -p src/my_project tests docs scripts .github/workflows
# 创建__init__.py文件
touch src/__init__.py src/my_project/__init__.py tests/__init__.py
3. 生成配置文件
创建pyproject.toml:
toml
[build-system]
requires = ["setuptools>=45", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-project"
version = "0.1.0"
description = "My awesome Python project"
authors = [{name = "Your Name", email = "you@example.com"}]
requires-python = ">=3.9"
dependencies = []
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=22.0.0",
"mypy>=0.950",
"isort>=5.10.0",
"flake8>=4.0.0",
"coverage>=6.0",
]
[tool.black]
line-length = 100
target-version = ['py39']
[tool.isort]
profile = "black"
line_length = 100
[tool.mypy]
python_version = "3.9"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
创建.gitignore:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual environments
.venv/
venv/
ENV/
env/
# Testing
.pytest_cache/
.coverage
htmlcov/
# IDEs
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
4. 安装开发依赖
bash
pip install -e ".[dev]"
5. 初始化Git
bash
git init
git add .
git commit -m "Initial commit: project setup"
代码质量工具
Black - 代码格式化
bash
# 格式化代码
black .
# 检查格式
black --check .
isort - import排序
bash
# 排序imports
isort .
# 检查imports
isort --check-only .
mypy - 类型检查
bash
# 类型检查
mypy src/
flake8 - 代码检查
bash
# 代码检查
flake8 src/
pytest - 测试
bash
# 运行测试
pytest
# 运行测试并显示覆盖率
pytest --cov=src --cov-report=html
CI/CD配置
创建.github/workflows/ci.yml:
yaml
name: CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.9, 3.10, 3.11]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e ".[dev]"
- name: Lint with flake8
run: |
flake8 src/ --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 src/ --count --exit-zero --max-complexity=10 --max-line-length=100 --statistics
- name: Check formatting with black
run: black --check .
- name: Check imports with isort
run: isort --check-only .
- name: Type check with mypy
run: mypy src/
- name: Test with pytest
run: |
pytest --cov=src --cov-report=xml
- name: Upload coverage
uses: codecov/codecov-action@v3
常见问题
Q: 如何选择项目结构?
A: 推荐使用src/布局,因为它:
- 避免导入测试代码
- 更容易打包
- 符合Python社区标准
Q: 需要所有工具吗?
A: 不需要。根据项目需求选择:
- 必需:pytest(测试)
- 强烈推荐:black(格式化)、mypy(类型检查)
- 可选:isort(import排序)、flake8(代码检查)
Q: 如何添加新的依赖?
A: 添加到pyproject.toml的dependencies部分:
toml
[project]
dependencies = [
"requests>=2.28.0",
"numpy>=1.23.0",
]
然后更新虚拟环境:
bash
pip install -e .
验证清单
项目创建完成后,检查:
- 虚拟环境已创建并激活
- 目录结构正确
- 所有配置文件已创建
- 开发依赖已安装
- Git仓库已初始化
- 可以运行测试
- 代码格式化工具正常工作
- 类型检查正常工作
- CI/CD配置正确
扩展建议
- 添加Docker支持
- 配置pre-commit hooks
- 集成文档生成(Sphinx)
- 添加性能测试
- 配置日志系统
- 添加监控和追踪
相关资源
-
Python官方文档:https://docs.python.org/
-
pytest文档:https://docs.pytest.org/
-
Black文档:https://black.readthedocs.io/
-
mypy文档:https://mypy.readthedocs.io/
-
GitHub Actions文档:https://docs.github.com/en/actions
步骤4:创建辅助文件
创建
scripts/init_project.sh:bash#!/bin/bash set -e PROJECT_NAME=${1:-"my-project"} # 创建项目目录 mkdir -p "$PROJECT_NAME" cd "$PROJECT_NAME" # 创建虚拟环境 python -m venv .venv echo "Virtual environment created" # 创建目录结构 mkdir -p src/"$PROJECT_NAME" tests docs scripts .github/workflows touch src/__init__.py src/"$PROJECT_NAME"/__init__.py tests/__init__.py echo "Directory structure created" # 复制配置文件(这里需要实现) # ... echo "Project '$PROJECT_NAME' initialized successfully!" echo "Don't forget to activate the virtual environment:" echo " source .venv/bin/activate"
步骤5:测试技能
在Hermes Agent中加载技能:
/skill python-project-starter
然后尝试创建项目:
你: 使用python-project-starter技能创建一个新项目,叫做awesome-app
技能测试和调试
1. 本地测试
在加载技能后,尝试各种场景:
你: 测试python-project-starter技能的功能
Hermes Agent会按照技能中的步骤执行。
2. 边缘情况
测试各种边界情况:
你: 在不同的目录下创建项目
你: 项目名称包含特殊字符
3. 错误处理
验证常见错误的处理:
你: 不提供项目名称会怎样?
你: 项目目录已存在会怎样?
4. 性能测试
测试技能的执行效率:
你: 创建项目需要多长时间?
发布技能到社区
1. 准备发布
确保技能:
- 完整的文档
- 经过充分测试
- 有清晰的许可证
- 包含贡献指南
- 版本号正确
2. 发布到Hermes技能市场
bash
hermes skills publish ~/.hermes/skills/python-project-starter
3. 发布到GitHub
bash
cd ~/.hermes/skills/python-project-starter
git init
git add .
git commit -m "Initial release: v1.0.0"
git tag v1.0.0
git remote add origin https://github.com/yourusername/python-project-starter-skill.git
git push origin main --tags
4. 在社区分享
- 在Hermes社区发帖
- 在CSDN写教程
- 在GitHub分享
- 在技术社区交流
技能版本管理
语义化版本
使用Semantic Versioning(语义化版本):
MAJOR.MINOR.PATCH- MAJOR:不兼容的API变更
- MINOR:向后兼容的新功能
- PATCH:向后兼容的bug修复
版本更新示例
v1.0.0 → v1.1.0:
- 添加新功能
- 保持向后兼容
v1.1.0 → v2.0.0:
- 重大变更
- 破坏性改动
v1.1.0 → v1.1.1:
- 修复bug
- 无功能变更
更新技能时
- 更新版本号
- 添加变更日志
- 测试新版本
- 发布新版本
技能维护
定期更新
- 修复发现的bug
- 添加新功能
- 更新依赖
- 改进文档
收集反馈
- 关注用户反馈
- 记录常见问题
- 改进用户体验
社区贡献
- 审查PR
- 回答问题
- 指导新贡献者
高级技巧
1. 技能链
一个技能可以引用另一个技能:
yaml
related_skills: [test-driven-development, docker]
2. 条件执行
根据条件执行不同步骤:
如果使用Python 3.11+,使用新的特性
否则,使用兼容的方法
3. 模板变量
在技能中使用变量:
bash
PROJECT_NAME={{project_name}}
VENV_NAME={{project_name}}-env
4. 交互式确认
重要操作前请求确认:
是否继续创建项目?[y/N]
总结
开发自定义技能是Hermes Agent生态的重要组成部分:
技能的价值:
- ✅ 积累专业知识
- ✅ 提高工作效率
- ✅ 分享最佳实践
- ✅ 促进社区发展
好的技能特征:
- ✅ 明确的使用场景
- ✅ 具体的执行步骤
- ✅ 完整的上下文
- ✅ 错误处理和解决方案
- ✅ 验证方法
- ✅ 良好的文档
开发流程:
- 规划技能目标和功能
- 创建技能目录和文件
- 编写详细的SKILL.md
- 创建辅助文件和脚本
- 充分测试各种场景
- 发布到社区
- 持续维护和改进
通过开发自定义技能,你不仅能提高自己的效率,还能帮助更多人,共同推动Hermes Agent生态的发展!
如果你有好的技能想法,不妨动手开发,分享到社区。有问题欢迎评论区讨论!
相关链接:
- 上一篇文章:从零开发一个完整的Web应用
- 下一篇文章:与CI/CD工作流结合
- 技能市场:
hermes skills browse - 贡献指南:https://hermes-agent.nousresearch.com/docs/contributing/