| name | hermes-agent-self-evolution |
| description | Evolutionary self-improvement for Hermes Agent using DSPy + GEPA to optimize skills, prompts, and code |
| triggers | ["evolve a hermes agent skill","optimize hermes agent prompts with GEPA","run self-evolution on agent skills","improve hermes agent with evolutionary search","generate evaluation data for skill optimization","use DSPy to optimize agent capabilities","run GEPA optimizer on tool descriptions","automate hermes agent improvement"] |
Hermes Agent Self-Evolution
Skill by ara.so — AI Agent Skills collection.
Hermes Agent Self-Evolution is an evolutionary optimization framework for Hermes Agent that uses DSPy + GEPA (Genetic-Pareto Prompt Evolution) to automatically improve agent skills, tool descriptions, system prompts, and code through reflective evolutionary search. No GPU training required — everything operates via API calls with execution trace analysis.
Installation
git clone https://github.com/NousResearch/hermes-agent-self-evolution.git
cd hermes-agent-self-evolution
pip install -e ".[dev]"
export HERMES_AGENT_REPO=~/.hermes/hermes-agent
export OPENAI_API_KEY=your_openai_api_key
Key Commands
Evolving Skills
python -m evolution.skills.evolve_skill \
--skill github-code-review \
--iterations 10 \
--eval-source synthetic
python -m evolution.skills.evolve_skill \
--skill github-code-review \
--iterations 10 \
--eval-source sessiondb
python -m evolution.skills.evolve_skill \
--skill web-scraping \
--iterations 5 \
--hermes-repo /path/to/hermes-agent
python -m evolution.skills.evolve_skill \
--skill data-analysis \
--iterations 8 \
--model gpt-4-turbo
Generating Evaluation Data
python -m evolution.eval.generate_eval_data \
--skill github-code-review \
--num-examples 50 \
--output eval_data/github-code-review.json
python -m evolution.eval.extract_sessions \
--skill web-scraping \
--min-quality 0.7 \
--output eval_data/web-scraping-real.json
Core Concepts
Evolution Pipeline
The optimization process follows this flow:
- Read current artifact (skill file, prompt, tool description)
- Generate evaluation dataset (synthetic or from real sessions)
- GEPA optimization loop:
- Generate candidate variants through mutation
- Execute variants against eval dataset
- Analyze execution traces for failure patterns
- Propose targeted improvements
- Apply constraint gates (tests, size limits, benchmarks)
- Select best variant based on multi-objective criteria
- Create PR against hermes-agent repository
Evaluation Sources
synthetic: LLM-generated scenarios based on skill description
sessiondb: Real usage traces from Claude Code, Copilot, Hermes sessions
benchmark: Predefined test suites (SWE-bench, HumanEval, etc.)
Python API
from evolution.skills.optimizer import SkillOptimizer
from evolution.eval.dataset import EvalDataset
optimizer = SkillOptimizer(
hermes_repo_path="~/.hermes/hermes-agent",
model="gpt-4-turbo",
temperature=0.7
)
eval_dataset = EvalDataset.from_synthetic(
skill_name="github-code-review",
num_examples=30
)
result = optimizer.optimize(
skill_name="github-code-review",
eval_dataset=eval_dataset,
iterations=10,
population_size=8
)
print(f"Original score: {result.baseline_score}")
print(f"Optimized score: {result.best_score}")
print(f"Improvement: {result.improvement_pct}%")
optimized_skill = result.best_variant.content
result.create_pull_request(
title="[Self-Evolution] Optimize github-code-review skill",
branch="evolution/github-code-review"
)
Custom Evaluation Functions
from evolution.eval.metrics import EvalMetric
class TaskSuccessRate(EvalMetric):
"""Custom metric for task completion rate."""
def evaluate(self, prediction, example):
"""Score prediction against ground truth."""
completed_steps = self.count_completed_steps(prediction.trace)
total_steps = len(example.expected_steps)
return {
"score": completed_steps / total_steps,
"metadata": {
"completed": completed_steps,
"total": total_steps
}
}
optimizer = SkillOptimizer(
metrics=[TaskSuccessRate(), "accuracy", "response_quality"]
)
Constraint Gates
from evolution.constraints import ConstraintGate
constraints = [
ConstraintGate.max_size(15_000),
ConstraintGate.test_suite_passes(),
ConstraintGate.no_semantic_drift(threshold=0.85),
ConstraintGate.benchmark_threshold("swe_bench_lite", min_score=0.6)
]
optimizer = SkillOptimizer(constraints=constraints)
Configuration
Create evolution_config.yaml in your project root:
model:
provider: openai
name: gpt-4-turbo
temperature: 0.7
max_tokens: 4096
gepa:
population_size: 8
mutation_rate: 0.3
crossover_rate: 0.5
elite_count: 2
max_generations: 10
evaluation:
default_source: synthetic
num_examples: 30
min_quality_threshold: 0.7
use_execution_traces: true
constraints:
max_skill_size: 15360
max_tool_description: 500
require_test_pass: true
semantic_drift_threshold: 0.85
paths:
hermes_agent: ~/.hermes/hermes-agent
eval_data: ./eval_data
results: ./evolution_results
pull_requests:
[]
Load configuration:
from evolution.config import load_config
config = load_config("evolution_config.yaml")
optimizer = SkillOptimizer.from_config(config)
Common Patterns
Batch Optimization
Optimize multiple skills in sequence:
from evolution.batch import BatchOptimizer
skills = [
"github-code-review",
"web-scraping",
"data-analysis",
"api-integration"
]
batch = BatchOptimizer(
skills=skills,
hermes_repo_path="~/.hermes/hermes-agent",
iterations=10
)
results = batch.run(
eval_source="synthetic",
parallel=True,
max_workers=4
)
batch.generate_report("evolution_results/batch_report.html")
Continuous Evolution Pipeline
Set up automated continuous improvement:
from evolution.continuous import ContinuousPipeline
from datetime import timedelta
pipeline = ContinuousPipeline(
hermes_repo_path="~/.hermes/hermes-agent",
check_interval=timedelta(days=7)
)
pipeline.watch_sessions(
min_sessions=100,
quality_threshold=0.7
)
pipeline.on_trigger(
callback=lambda skill: optimizer.optimize(skill),
create_pr=True
)
pipeline.start()
A/B Testing Variants
Compare multiple evolved variants:
from evolution.testing import ABTest
variants = optimizer.evolve_variants(
skill_name="github-code-review",
num_variants=5,
iterations=10
)
ab_test = ABTest(
baseline=original_skill,
variants=variants,
eval_dataset=eval_dataset
)
results = ab_test.run(num_trials=100)
winner = results.get_winner(confidence=0.95)
print(f"Winner: {winner.variant_id} (p={winner.p_value})")
Real-World Examples
Example 1: Optimize GitHub Code Review Skill
from evolution.skills.optimizer import SkillOptimizer
from evolution.eval.dataset import EvalDataset
optimizer = SkillOptimizer(
hermes_repo_path="~/.hermes/hermes-agent",
model="gpt-4-turbo"
)
eval_dataset = EvalDataset.from_synthetic(
skill_name="github-code-review",
num_examples=40,
scenarios=[
"review PR with security vulnerabilities",
"review PR with performance issues",
"review PR with style violations",
"review PR with breaking changes"
]
)
result = optimizer.optimize(
skill_name="github-code-review",
eval_dataset=eval_dataset,
iterations=15,
constraints=[
"max_size:15000",
"test_suite_passes",
"no_semantic_drift:0.85"
]
)
print(f"Baseline: {result.baseline_score:.2f}")
print(f"Optimized: {result.best_score:.2f}")
print(f"\nKey improvements:")
for improvement in result.improvements:
print(f" - {improvement}")
if result.improvement_pct > 10:
result.create_pull_request(
title="[Self-Evolution] Optimize github-code-review skill (+{:.1f}%)".(
result.improvement_pct
),
branch=
)
Example 2: Use Real Session Data
from evolution.eval.sessions import SessionExtractor
extractor = SessionExtractor(
session_db_path="~/.hermes/sessions.db"
)
real_examples = extractor.extract(
skill_name="web-scraping",
min_quality=0.8,
min_session_length=5,
max_examples=50
)
eval_dataset = EvalDataset.from_sessions(real_examples)
result = optimizer.optimize(
skill_name="web-scraping",
eval_dataset=eval_dataset,
iterations=10
)
Example 3: Multi-Objective Optimization
from evolution.objectives import MultiObjective
objectives = MultiObjective([
("task_success", weight=0.5),
("response_quality", weight=0.3),
("efficiency", weight=0.2)
])
result = optimizer.optimize(
skill_name="data-analysis",
eval_dataset=eval_dataset,
objectives=objectives,
pareto_optimal=True
)
result.plot_pareto_frontier(
x_axis="task_success",
y_axis="efficiency",
output="pareto_analysis.png"
)
Troubleshooting
Optimization Stalls
If evolution isn't improving scores:
optimizer = SkillOptimizer(
mutation_rate=0.5,
temperature=0.9
)
optimizer.enable_trace_analysis(
focus_on_failures=True,
extract_error_patterns=True
)
Constraint Failures
Check which constraints are failing:
result = optimizer.optimize(skill_name="github-code-review")
for variant in result.rejected_variants:
print(f"Variant {variant.id} failed:")
for constraint, passed in variant.constraint_results.items():
if not passed:
print(f" ✗ {constraint}: {variant.constraint_errors[constraint]}")
API Rate Limits
Handle rate limiting gracefully:
from evolution.utils import RateLimiter
optimizer = SkillOptimizer(
rate_limiter=RateLimiter(
max_requests_per_minute=50,
backoff_strategy="exponential"
)
)
Evaluation Dataset Quality
Validate dataset before optimization:
from evolution.eval.validation import DatasetValidator
validator = DatasetValidator()
issues = validator.validate(eval_dataset)
if issues:
print("Dataset issues found:")
for issue in issues:
print(f" - {issue}")
eval_dataset = validator.auto_fix(eval_dataset)
Integration with Hermes Agent
Evolved skills automatically integrate with Hermes Agent:
cd $HERMES_AGENT_REPO
git checkout evolution/github-code-review
hermes --skill github-code-review "Review this PR: https://github.com/..."
hermes-benchmark compare \
--baseline main \
--variant evolution/github-code-review \
--skill github-code-review
Cost Estimation
Typical costs per optimization run:
- Skill optimization (10 iterations, 30 examples): ~$2-5
- Tool description (5 iterations, 20 examples): ~$1-2
- System prompt (15 iterations, 50 examples): ~$5-10
Reduce costs:
optimizer = SkillOptimizer(
model="gpt-3.5-turbo",
cache_predictions=True,
early_stopping=True
)