Hermes — это не просто CLI-инструмент. Вы можете импортировать AIAgent напрямую и использовать его программу в своих скриптах Python, веб-приложениях или процессах автоматизации. Это руководство покажет вам, как это сделать.
Вы также можете зафиксировать его в своем requirements.txt:
hermes-agent @ git+https://github.com/NousResearch/hermes-agent.git
```:::совет
При использовании Hermes в качестве библиотеки требуются те же переменные окружения, что и для CLI. Как минимум установите `OPENROUTER_API_KEY` (или `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` при прямом доступе к провайдеру).</div>
---
## Базовое использование
Самый простой способ использовать Hermes — метод `chat()`: передайте сообщение, введите текст в ответ:
```python
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)
chat() обрабатывает полный цикл диалога внутри себя — инструменты вызова, повторные попытки и всё остальное — и возвращает только итоговый текстовый ответ.:::предупреждение
Всегда устанавливайте quiet_mode=True при встраивании Гермеса в свой код. Без этого агент будет выводить CLI-спиннеры, индикаторы прогресса и другой терминальный вывод, который засорит вывод вашего приложения.
Полный контроль над диалогом
Для большего контроля над диалогом используйте run_conversation() напрямую. Он возвращает словарь с полным ответом, характерными и метаданными выражениями:
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'])}")
(Переданный task_id сохраняется в экземпляре агента для запуска машины, но не возвращается в словарь результата.)
Вы также можете передать пользовательское системное сообщение, которое переопределяет эфемерный системный запрос для этого вызова:
result=agent.run_conversation(user_message="Explain quicksort",system_message="You are a computer science tutor. Use simple analogies.",)
Инструменты для настройки
Управляйте тем, к каким наборам инструментов имеет доступ агент, с помощью enabled_toolsets или disabled_toolsets:
# Включить только веб-инструменты (просмотр, поиск)agent=AIAgent(model="anthropic/claude-sonnet-4",enabled_toolsets=["web"],quiet_mode=True,)# Включить всё, кроме доступа к терминалуagent=AIAgent(model="anthropic/claude-sonnet-4",disabled_toolsets=["terminal"],quiet_mode=True,)```:::советИспользуйте`enabled_toolsets`,когдавамнуженограниченныйагент(например,тольковеб-поискдляисследовательскогобота).Используйте`disabled_toolsets`,когдавамнужнывсевозможности,нотребуютсяконкретныеконкретныевопросы(например,отсутствиедоступактерминалувокружающейсреде).</div>---## Многошаговые диалогиПодождитесостояниедиалогавтечениенесколькихшагов,переведяисториюсообщенийобратно:```pythonagent=AIAgent(model="anthropic/claude-sonnet-4",quiet_mode=True,)# Первый шагresult1=agent.run_conversation("My name is Alice")history=result1["messages"]# Второй шаг — агент помнит контекстresult2=agent.run_conversation("What's my name?",conversation_history=history,)print(result2["final_response"])# "Ваше имя — Алиса."
Параметр conversation_history принимает список messages для достижения результата. Агент копирует его внутренне, поэтому ваш исходный список никогда не меняется.
Сохранение траекторий
Включите сохранение траекторий для захвата диалогов в формате ShareGPT — полезно для генерации обучающихся данных или отладок:
agent=AIAgent(model="anthropic/claude-sonnet-4",save_trajectories=True,quiet_mode=True,)agent.chat("Write a Python function to sort a list")# Сохраняется в trajectory_samples.jsonl в формате ShareGPT
Каждое воздушное окно включается в виде отдельных строк JSONL, что позволяет автоматически собирать наборы данных при запуске.
Пользовательские системные промпты
Используйте ephemeral_system_prompt, чтобы задать пользовательский системный запрос, который управляет поведением агента, но не сохраняется в файлах траекторий (сохраняя ваши обучающие данные чистыми):
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)
Это идеально подходит для создания специализированных агентов — ревьюера кода, написания документации, SQL-ассистента — все они используют одни и те же базовые инструменты.
Пакетная обработка
Для параллельного выполнения мероприятий Hermes включает batch_runner.py. Это управление конкурентными экземплярами AIAgent с логической изоляцией ресурсов:
Каждый получает запрос на свой собственный «task_id» и изолированную среду. Если вам нужна логика пакетной обработки устройства, вы можете создать ее с помощью AIAgent напрямую:
importconcurrent.futuresfromrun_agentimportAIAgentprompts=["Explain recursion","What is a hash table?","How does garbage collection work?",]defprocess_prompt(prompt):# Создаём новый агент для каждой задачи для потокобезопасностиagent=AIAgent(model="anthropic/claude-sonnet-4",quiet_mode=True,skip_memory=True,)returnagent.chat(prompt)withconcurrent.futures.ThreadPoolExecutor(max_workers=3)asexecutor:results=list(executor.map(process_prompt,prompts))forprompt,resultinzip(prompts,results):print(f"Q: {prompt}\nA: {result}\n")```:::предупреждениеВсегдасоздавайте**новыйэкземпляр`AIAgent`**длякаждогопотокаилизадачи.Состояниеагентапоподдержкетехнологий(историядиалога,инструментысеансов,счетчикиитераций),которыенеявляютсяпотокобезопаснымидлясовместногоиспользования.</div>---## Примеры принятия### FastAPI-эндпоинт```pythonfromfastapiimportFastAPIfrompydanticimportBaseModelfromrun_agentimportAIAgentapp=FastAPI()classChatRequest(BaseModel):message:strmodel:str="anthropic/claude-sonnet-4"@app.post("/chat")asyncdefchat(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}
#!/usr/bin/env python3"""Шаг CI: автоматическое ревью diff PR."""importsubprocessfromrun_agentimportAIAgentdiff=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)
Ключевые параметры конструктора
Параметр
Тип
По умолчанию
Описание
модель
ул
"антропный/claude-opus-4.6"
Модель в формате OpenRouter
тихий_режим
бул
Ложь
Подавлять вывод CLI
enabled_toolsets
Список[стр]
Нет
Белый список наборов инструментов
disabled_toolsets
Список[стр]
Нет
Чёрный список наборов инструментов
save_trajectories
бул
Ложь
Сохранять диалоги в JSONL
ephemeral_system_prompt
ул
Нет
Пользовательский системный промпт (не сохраняется в траекториях)
max_iterations
интервал
90
Максимальное количество итераций вызова инструментов для диалога
skip_context_files
бул
Ложь
Пропустить загрузку файлов AGENTS.md
skip_memory
бул
Ложь
Отключить чтение/запись постоянной памяти
api_key
ул
Нет
Ключ API (использует переменные окружения, если не задано)
base_url
ул
Нет
Пользовательский URL-адрес конечной точки API
платформа
ул
Нет
Подсказка платформы (discord, telegram и т.д.)
Важные замечания:::совет
Установите skip_context_files=True, если вы не хотите, чтобы файлы AGENTS.md из рабочего каталога загружались в системный запрос.
Установите skip_memory=True, чтобы предотвратить чтение или запись постоянной памяти агентом — рекомендуется для конечных точек API без сохранения состояния.
Параметр «платформа» (например, «discord», «telegram») включает подсказки формирования, специфичные для платформы, чтобы агент адаптировал свой стиль вывода.::::::предупреждение
Потокобезопасность: создайте один экземпляр AIAgent в потоке или задаче. Никогда не воспользуйтесь ни одним примером конкурентных вызовов.
Очистка ресурсов: Агент автоматически очищает ресурсы (сессии терминала, экземпляра браузера) после завершения диалога. Если вы работаете в долгоживущем процессе, убедитесь, что каждый диалог завершается нормально.
Лимиты итераций: Значение по умолчанию max_iterations=90 является щедрым. Для простых случаев вопросов-ответов рассмотрите возможность его использования (например, max_iterations=10), чтобы предотвратить бесконечные циклы вызовов инструментов и контролировать затраты.