Перейти к содержанию

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), чтобы предотвратить бесконечные циклы вызовов инструментов и контролировать расходы.