Library
On this page
Hermes — это не только CLI-инструмент. Вы можете импортировать AIAgent напрямую и использовать его программно в своих Python-скриптах, веб-приложениях или пайплайнах автоматизации. Это руководство покажет вам, как это сделать.
Installation¶
Установите Hermes напрямую из репозитория: [code] pip install git+https://github.com/NousResearch/hermes-agent.git
[/code] Или с помощью uv: [code] uv pip install git+https://github.com/NousResearch/hermes-agent.git
[/code]
Вы также можете зафиксировать его в своём requirements.txt:
[code]
hermes-agent @ git+https://github.com/NousResearch/hermes-agent.git
[/code]
tip
При использовании Hermes как библиотеки требуются те же переменные окружения, что и для CLI. Как минимум установите OPENROUTER_API_KEY (или OPENAI_API_KEY / ANTHROPIC_API_KEY при прямом доступе к провайдеру).
Basic Usage¶
Самый простой способ использовать Hermes — метод chat(): передайте сообщение и получите строку в ответ:
[code]
from run_agent import AIAgent
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
response = agent.chat("What is the capital of France?")
print(response)
[/code]
chat() обрабатывает весь цикл диалога внутренне — вызовы инструментов, повторные попытки и всё остальное — и возвращает только итоговый текстовый ответ.
warning
Всегда устанавливайте quiet_mode=True при встраивании Hermes в ваш собственный код. Без этого агент будет выводить CLI-спиннеры, индикаторы прогресса и другой терминальный вывод, который засорит вывод вашего приложения.
Full Conversation Control¶
Для более полного контроля над диалогом используйте run_conversation() напрямую. Он возвращает словарь с полным ответом, историей сообщений и метаданными:
[code]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
result = agent.run_conversation(
user_message="Search for recent Python 3.13 features",
task_id="my-task-1",
)
print(result["final_response"])
print(f"Messages exchanged: {len(result['messages'])}")
[/code]
Возвращаемый словарь содержит:
* final_response — Итоговый текстовый ответ агента
* messages — Полная история сообщений (системное, пользователь, ассистент, вызовы инструментов)
* task_id — Идентификатор задачи, используемый для изоляции ВМ
Вы также можете передать собственное системное сообщение, которое переопределяет эфемерный системный промпт для данного вызова:
[code]
result = agent.run_conversation(
user_message="Explain quicksort",
system_message="You are a computer science tutor. Use simple analogies.",
)
[/code]
Configuring Tools¶
Управляйте тем, какие наборы инструментов доступны агенту, с помощью enabled_toolsets или disabled_toolsets:
[code]
# Only enable web tools (browsing, search)
agent = AIAgent(
model="anthropic/claude-sonnet-4",
enabled_toolsets=["web"],
quiet_mode=True,
)
# Enable everything except terminal access
agent = AIAgent(
model="anthropic/claude-sonnet-4",
disabled_toolsets=["terminal"],
quiet_mode=True,
)
[/code]
tip
Используйте enabled_toolsets, когда вам нужен минимальный, ограниченный агент (например, только веб-поиск для исследовательского бота). Используйте disabled_toolsets, когда вам нужно большинство возможностей, но требуется ограничить конкретные (например, без доступа к терминалу в общей среде).
Multi-turn Conversations¶
Поддерживайте состояние диалога на протяжении нескольких шагов, передавая историю сообщений обратно:
[code]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
# First turn
result1 = agent.run_conversation("My name is Alice")
history = result1["messages"]
# Second turn — agent remembers the context
result2 = agent.run_conversation(
"What's my name?",
conversation_history=history,
)
print(result2["final_response"]) # "Your name is Alice."
[/code]
Параметр conversation_history принимает список messages из предыдущего результата. Агент копирует его внутренне, поэтому ваш исходный список никогда не изменяется.
Saving Trajectories¶
Включите сохранение траекторий для захвата диалогов в формате ShareGPT — полезно для генерации обучающих данных или отладки:
[code]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
save_trajectories=True,
quiet_mode=True,
)
agent.chat("Write a Python function to sort a list")
# Saves to trajectory_samples.jsonl in ShareGPT format
[/code] Каждый диалог добавляется в виде отдельной JSONL-строки, что упрощает сбор наборов данных из автоматических запусков.
Custom System Prompts¶
Используйте ephemeral_system_prompt, чтобы задать собственный системный промпт, который направляет поведение агента, но не сохраняется в файлы траекторий (поддерживая чистоту обучающих данных):
[code]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
ephemeral_system_prompt="You are a SQL expert. Only answer database questions.",
quiet_mode=True,
)
response = agent.chat("How do I write a JOIN query?")
print(response)
[/code] Это идеально подходит для создания специализированных агентов — ревьюера кода, документатора, SQL-ассистента — все с использованием одного и того же базового инструментария.
Batch Processing¶
Для параллельной обработки множества промптов Hermes включает batch_runner.py. Он управляет одновременными экземплярами AIAgent с надлежащей изоляцией ресурсов:
[code]
python batch_runner.py --input prompts.jsonl --output results.jsonl
[/code]
Каждый промпт получает собственный task_id и изолированное окружение. Если вам нужна собственная пакетная логика, вы можете построить её с использованием AIAgent напрямую:
[code]
import concurrent.futures
from run_agent import AIAgent
prompts = [
"Explain recursion",
"What is a hash table?",
"How does garbage collection work?",
]
def process_prompt(prompt):
# Create a fresh agent per task for thread safety
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_memory=True,
)
return agent.chat(prompt)
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(process_prompt, prompts))
for prompt, result in zip(prompts, results):
print(f"Q: {prompt}\nA: {result}\n")
[/code]
warning
Всегда создавайте новый экземпляр AIAgent для каждого потока или задачи. Агент поддерживает внутреннее состояние (история диалога, сессии инструментов, счётчики итераций), которое не является потокобезопасным для совместного использования.
Integration Examples¶
FastAPI Endpoint¶
[code]
from fastapi import FastAPI
from pydantic import BaseModel
from run_agent import AIAgent
app = FastAPI()
class ChatRequest(BaseModel):
message: str
model: str = "anthropic/claude-sonnet-4"
@app.post("/chat")
async def chat(request: ChatRequest):
agent = AIAgent(
model=request.model,
quiet_mode=True,
skip_context_files=True,
skip_memory=True,
)
response = agent.chat(request.message)
return {"response": response}
[/code]
Discord Bot¶
[code]
import discord
from run_agent import AIAgent
client = discord.Client(intents=discord.Intents.default())
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith("!hermes "):
query = message.content[8:]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_context_files=True,
skip_memory=True,
platform="discord",
)
response = agent.chat(query)
await message.channel.send(response[:2000])
client.run("YOUR_DISCORD_TOKEN")
[/code]
CI/CD Pipeline Step¶
[code]
#!/usr/bin/env python3
"""CI step: auto-review a PR diff."""
import subprocess
from run_agent import AIAgent
diff = subprocess.check_output(["git", "diff", "main...HEAD"]).decode()
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_context_files=True,
skip_memory=True,
disabled_toolsets=["terminal", "browser"],
)
review = agent.chat(
f"Review this PR diff for bugs, security issues, and style problems:\n\n{diff}"
)
print(review)
[/code]
Key Constructor Parameters¶
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
model |
str |
"anthropic/claude-opus-4.6" |
Модель в формате OpenRouter |
quiet_mode |
bool |
False |
Подавлять вывод CLI |
enabled_toolsets |
List[str] |
None |
Разрешить конкретные наборы инструментов |
disabled_toolsets |
List[str] |
None |
Запретить конкретные наборы инструментов |
save_trajectories |
bool |
False |
Сохранять диалоги в JSONL |
ephemeral_system_prompt |
str |
None |
Собственный системный промпт (не сохраняется в траекториях) |
max_iterations |
int |
90 |
Максимальное количество итераций вызова инструментов на диалог |
skip_context_files |
bool |
False |
Пропустить загрузку файлов AGENTS.md |
skip_memory |
bool |
False |
Отключить чтение/запись постоянной памяти |
api_key |
str |
None |
API-ключ (использует переменные окружения, если не указан) |
base_url |
str |
None |
Пользовательский URL API-эндпоинта |
platform |
str |
None |
Подсказка платформы ("discord", "telegram" и т.д.) |
| * * * | |||
| ## Important Notes | |||
| tip | |||
* Установите skip_context_files=True, если вы не хотите, чтобы файлы AGENTS.md из рабочей директории загружались в системный промпт. |
|||
* Установите skip_memory=True, чтобы предотвратить чтение или запись агентом постоянной памяти — рекомендуется для stateless API-эндпоинтов. |
|||
* Параметр platform (например, "discord", "telegram") добавляет подсказки форматирования для конкретной платформы, чтобы агент адаптировал стиль вывода. |
warning
* Потокобезопасность: Создавайте один экземпляр AIAgent на поток или задачу. Никогда не используйте один экземпляр в конкурентных вызовах.
* Очистка ресурсов: Агент автоматически очищает ресурсы (терминальные сессии, экземпляры браузера) после завершения диалога. Если вы работаете в долгоживущем процессе, убедитесь, что каждый диалог завершается нормально.
* Лимиты итераций: Значение max_iterations=90 по умолчанию является щедрым. Для простых сценариев вопросов-ответов рассмотрите возможность его снижения (например, max_iterations=10), чтобы предотвратить бесконечные циклы вызовов инструментов и контролировать расходы.