API-сервер

API-сервер предоставляет Hermes-агент в качестве HTTP-эндпоинта, совместимого с OpenAI. Любой фронтенд, поддерживающий форматирующий OpenAI — Open WebUI, LobeChat, LibreChat, NextChat, ChatBox и многие другие — может подключиться к Hermes-agent и использовать его в качестве бэкенда.

Ваш агент обрабатывает запросы, используя полный набор инструментов (терминал, финансовые операции, веб-поиск, память, навыки) и возвращает итоговый ответ. При полоске индикаторов прогресса инструменты слегка встроены, чтобы фронтенды могли показать, что делает агент.

Быстрый старт

1. Включите API-сервер

Добавьте в ~/.hermes/.env:

API_SERVER_ENABLED=true
API_SERVER_KEY=change-me-local-dev
# Опционально: только если браузер должен напрямую вызывать Hermes
# API_SERVER_CORS_ORIGINS=http://localhost:3000

2. Запустить шлюз

hermes gateway

Вы покажете:

[API Server] API server listening on http://127.0.0.1:8642

3. Подключите фронтенд

Настройте любую совместимость с клиентом OpenAI на http://localhost:8642/v1:

# Тест с curl
curl http://localhost:8642/v1/chat/completions \
  -H "Authorization: Bearer change-me-local-dev" \
  -H "Content-Type: application/json" \
  -d '{"model": "hermes-agent", "messages": [{"role": "user", "content": "Hello!"}]}'

Или подключите Open WebUI, LobeChat или любой другой фронтенд — см. руководство по инициативе Open WebUI для пошаговых инструкций.

Конечные точки

POST /v1/chat/completions

Стандартный формат дополнений чата от OpenAI. Не сохранять состояние — в каждом запросе включается полный диалог через массив messages.

Запрос:

{
  "model": "hermes-agent",
  "messages": [
    {"role": "system", "content": "You are a Python expert."},
    {"role": "user", "content": "Write a fibonacci function"}
  ],
  "stream": false
}

Ответ:

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1710000000,
  "model": "hermes-agent",
  "choices": [{
    "index": 0,
    "message": {"role": "assistant", "content": "Here's a fibonacci function..."},
    "finish_reason": "stop"
  }],
  "usage": {"prompt_tokens": 50, "completion_tokens": 200, "total_tokens": 250}
}

Встроенный ввод изображений: сообщения пользователя могут отправлять content в виде частей массива text и image_url. Поддерживаются как удаленные URL-адреса http(s), так и URL-адрес data:image/...:

{
  "model": "hermes-agent",
  "messages": [
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "What is in this image?"},
        {"type": "image_url", "image_url": {"url": "https://example.com/cat.png", "detail": "high"}}
      ]
    }
  ]
}

Загруженные файлы (file / input_file / file_id) и неизображения data: URL возвращают 400 unsupported_content_type.

Стриминг ("stream": true): Возвращает отправленные сервером события (SSE) с фрагментами ответа токен за токен. Для Завершения чата поток использует стандартные события chat.completion.chunk плюс пользовательское событие Hermes hermes.tool.progress для UX начала работы инструмента. Для потока Responses используются типы событий OpenAI Responses, такие как response.created, response.output_text.delta, response.output_item.added, response.output_item.done и response.completed.

Прогресс инструментов в потоках: - Завершения чата: Hermes отправляет event: hermes.tool.progress для отображения начала работы инструмента без загрязнения сохраненного текста ассистента. - Ответы: Hermes отправляет собственные критерии для получения результатов function_call и function_call_output во время SSE-потока, чтобы клиенты могли в кратчайшие сроки отображать структурированные инструменты пользовательского интерфейса.

POST /v1/ответы

Формат ответов API от OpenAI. Поддерживает состояние диалога на стороне сервера через previous_response_id — сервер хранит всю историю диалога (включая вызовы инструментов и результаты), поэтому контекст многошагового общения сохраняется без управления со стороны клиента.

Запрос:

{
  "model": "hermes-agent",
  "input": "What files are in my project?",
  "instructions": "You are a helpful coding assistant.",
  "store": true
}

Ответ:

{
  "id": "resp_abc123",
  "object": "response",
  "status": "completed",
  "model": "hermes-agent",
  "output": [
    {"type": "function_call", "name": "terminal", "arguments": "{\"command\": \"ls\"}", "call_id": "call_1"},
    {"type": "function_call_output", "call_id": "call_1", "output": "README.md src/ tests/"},
    {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "Your project has..."}]}
  ],
  "usage": {"input_tokens": 50, "output_tokens": 200, "total_tokens": 250}
}

Встроенный ввод изображений: input[].content может сохранять части input_text и input_image. Поддерживаются как удаленные URL-адреса, так и URL-адрес data:image/...:

{
  "model": "hermes-agent",
  "input": [
    {
      "role": "user",
      "content": [
        {"type": "input_text", "text": "Describe this screenshot."},
        {"type": "input_image", "image_url": "data:image/png;base64,iVBORw0K..."}
      ]
    }
  ]
}

Загруженные файлы (input_file / file_id) и неизображения data: URL возвращают 400 unsupported_content_type.

Многошаговый режим с previous_response_id

Цепочка ответов для поддержания полного контекста (включая инструменты вызова) между шагами:

{
  "input": "Now show me the README",
  "previous_response_id": "resp_abc123"
}

Восстановление сервера восстанавливает полный диалог из сохраненной цепочки ответов — все озвучивают вызовы инструментов и результаты. Запросы в цепочке также используют один и тот же сеанс, поэтому многошаговые диалоги как минимум одна запись на панели управления и в истории сеансов.

Именованные диалоги

Используйте параметр conversation вместо идентификационного идентификатора ответа:

{"input": "Hello", "conversation": "my-project"}
{"input": "What's in src/?", "conversation": "my-project"}
{"input": "Run the tests", "conversation": "my-project"}

Сервер автоматически подключается с последним ответом в этом диалоге. Аналогично соединение /title для шлюза сеансов.

GET /v1/responses/{id}

Получить ранее сохраненный ответ по ID.

DELETE /v1/responses/{id}

Удалить сохраненный ответ.

ПОЛУЧИТЬ /v1/модели

Выводит агента как доступную модель. Рекламируемое имя модели по умолчанию соответствует имени профиля (или hermes-agent для профиля по умолчанию). Требуется большинство фронтов для обнаружения моделей.

ПОЛУЧИТЬ /v1/capabilities

Возвращает машиночитаемое описание стабильной поверхности API-сервера для внешнего пользовательского интерфейса, оркестраторов и мостов плагинов.

{
  "object": "hermes.api_server.capabilities",
  "platform": "hermes-agent",
  "model": "hermes-agent",
  "auth": {"type": "bearer", "required": true},
  "features": {
    "chat_completions": true,
    "responses_api": true,
    "run_submission": true,
    "run_status": true,
    "run_events_sse": true,
    "run_stop": true
  }
}

Используйте эту конечную точку при региональных панелях управления, браузерном пользовательском интерфейсе или контрольных панелях, чтобы они могли определить поддержку рабочей версии запуска Hermes, стриминга, отмены и непрерывности сеансов, не полагаясь на внутренние данные Python.

ПОЛУЧИТЬ /здоровье

Проверка работоспособности. Возвращает {"status": "ok"}. Также доступен по адресу GET /v1/health для совместимости с клиентами OpenAI, ожидающими префикса /v1/.

GET /health/detailed

Расширенная проверка работоспособности, в которой также сообщается об активных сеансах, рабочих агентах и использовании ресурсов. Полезно для инструментов Диптихи/наблюдаемости.

Запускает API (альтернатива для стриминга)

В дополнение к серверу /v1/chat/completions и /v1/responses предоставляется Runs API для длительных сеансов, где клиент хочет подписаться на события прогресса вместо самостоятельного управления стримингом.

POST /v1/runs

Создать новый запуск агента. Возвращает run_id, который можно использовать для подписки на развитие событий.

{
  "run_id": "run_abc123",
  "status": "started"
}

Запуски принимают простую формулу input и опциональные session_id, instructions, conversation_history или previous_response_id. Когда указан session_id, Hermes отображает его в состоянии запуска, чтобы внешний пользовательский интерфейс мог связать запуск со своими диалогами ID.

GET /v1/runs/{run_id}

Опрос текущего состояния запуска. Полезно для панелей управления, которым нужен статус без удержания SSE-соединений, или для пользовательского интерфейса, которые переподключаются после навигации.

{
  "object": "hermes.run",
  "run_id": "run_abc123",
  "status": "completed",
  "session_id": "space-session",
  "model": "hermes-agent",
  "output": "Done.",
  "usage": {"input_tokens": 50, "output_tokens": 200, "total_tokens": 250}
}

Статусы выбираются ненадолго после завершения изменения («завершено», «неудачно» или «отменено») для опроса и согласования пользовательского интерфейса.

GET /v1/runs/{run_id}/events

Поток событий, отправленных сервером, с прогрессом вызова инструментов запуска, дельтами токенов и событиями жизненного цикла. Предназначены для панелей управления и крупных клиентов, которые хотят подключиться/отключиться без потери состояния.

POST /v1/runs/{run_id}/stop

Прервать нынешний шаг агента. Эндпоинт мгновенно вызывает {"status": "stopping"}, пока Гермес не запросит активный агент остановиться в ближайшей безопасной зоне отключения.

API заданий (фоновые запланированные задачи)

Сервер обеспечивает легковесный CRUD-интерфейс для управления запланированными/фоновыми запусками агента удаленного клиента. Все эндпоинты защищены одной и той же аутентификацией носителя.

ПОЛУЧИТЬ /api/jobs

Список всех запланированных задач.

POST /api/jobs

Создать новую запланированную задачу. Тело принимает ту же структуру, что и «Гермес Крон» — подсказка, расписание, навыки, переопределение провайдера, цель доставки.

GET /api/jobs/{job_id}

Получить определение одной задачи и состояния последнего запуска.

ПАТЧ /api/jobs/{job_id}

Обновить поля связанных задач (подсказка, расписание и т.д.). Частные обновления объединяются.

DELETE /api/jobs/{job_id}

Удалить задачу. Также отменяется любой выполняемый запуск.

POST /api/jobs/{job_id}/pause

Приостановить задачу без удаления. Временные метки следующего запланированного запуска приостанавливаются до восстановления.

POST /api/jobs/{job_id}/resume

Возобновить ранее возложенную на вас ответственность.

POST /api/jobs/{job_id}/run

Запустить задачу немедленно, вне расписания.

Обработка системного промпта

Когда фронтенд отправляет системное сообщение (Завершения чата) или поле instructions (API ответов), hermes-agent накладывает его поверхность своего основного системного промпта. Ваш агент сохранит все свои инструменты, память и навыки — системный интерфейс фронтенда добавит дополнительные инструкции.

Это означает, что вы можете настраивать поведение каждого фронтенда без потери возможностей: - Системный запрос Open WebUI: «Вы эксперт Python. Всегда включайте подсказки по типам». - Агент по-прежнему имеет терминал, файловые инструменты, веб-поиск, память и т.д.

Аутентификация

Аутентификация токена-носителя через заголовок Authorization:

Authorization: Bearer ***

Настройте ключ через переменное окружение API_SERVER_KEY. Если браузер должен напрямую перейти к Hermes, также установите API_SERVER_CORS_ORIGINS в явном списке разрешенных.:::предупреждение Безопасность API-сервер обеспечивает полный доступ к набору инструментов hermes-agent, ** включая терминала. При привязке к нелокальному адресу, например 0.0.0.0,API_SERVER_KEY обязателен**. Также держите узким API_SERVER_CORS_ORIGINS для контроля доступа браузера.

Адрес привязки по умолчанию (127.0.0.1) предназначен только для локального использования. Доступ к браузеру отключен по умолчанию; Включайте его только для явно доверенных источников.

Конфигурация

Переменные окружения

Переменная По умолчанию Описание
API_SERVER_ENABLED ложь Включить API-сервер
API_SERVER_PORT 8642 Порт HTTP-сервера
API_SERVER_HOST 127.0.0.1 Адрес привязки (только localhost по умолчанию)
API_SERVER_KEY (нет) Токен-носитель для аутентификации
API_SERVER_CORS_ORIGINS (нет) Разделенный запятыми список разрешенных источников браузера
API_SERVER_MODEL_NAME (имя профиля) Имя модели в /v1/models. По умолчанию имя профиля или гермес-агент для профиля по умолчанию.

конфиг.yaml

# Пока не поддерживается — используйте переменные окружения.
# Поддержка config.yaml появится в будущем релизе.

Заголовки безопасности

Все ответы включают заголовки безопасности: - X-Content-Type-Options: nosniff — собственное подменю MIME-типа - Referrer-Policy: no-referrer — собственное утечку реферера

КОРС

API-сервер не включает CORS для браузера по умолчанию.

Для прямого доступа браузера установите явный список разрешенных:

API_SERVER_CORS_ORIGINS=http://localhost:3000,http://127.0.0.1:3000

Когда CORS включен: - Предполетные-ответы включают Access-Control-Max-Age: 600 (кэш на 10 минут) - SSE-стриминг ответов включает CORS-заголовки, чтобы клиенты EventSource в браузере работали корректно. - Idempotency-Key является разрешенным заголовком запроса — клиенты могут отправить его для дедупликации (ответы кэшируются по ключу в течение 5 минут)

Большинство документированных фронтендов, таких как Open WebUI, подключаются сервер-к-серверу и не требуют CORS.

Совместимые фронтенды

Любой фронтенд, поддерживающий форматирование API OpenAI, работает. Протестированные/документированные специалисты:

Фронтенд Звезды Подключение
Открытый веб-интерфейс 126 тыс. Полное руководство
ЛобеЧат 73к Пользовательский эндпоинт-провайдер
ЛибреЧат 34 тыс. Пользовательский эндпоинт в librechat.yaml
Что-нибудьLLM 56 тысяч Общий провайдер OpenAI
СледующийЧат 87 тысяч Переменная окружения BASE_URL
Чат-бокс 39 тысяч Настройка хоста API
Ян 26 тысяч Конфигурация удаленной модели
ВЧ-чат-интерфейс OPENAI_BASE_URL
большой-AGI Пользовательский эндпоинт
OpenAI Python SDK OpenAI(base_url="http://localhost:8642/v1")
локон Прямые HTTP-запросы

Многопользовательская настройка с профилями

Чтобы обеспечить использование индивидуальных изолированных экземпляров Hermes (отдельная конструкция, память, навыки), воспользуйтесь профили:

# Создайте профиль для каждого пользователя
hermes profile create alice
hermes profile create bob

# Настройте API-сервер каждого профиля на другом порту. API_SERVER_* — это
# переменные окружения (не ключи config.yaml), поэтому запишите их в.env каждого профиля:
cat >> ~/.hermes/profiles/alice/.env <<EOF
API_SERVER_ENABLED=true
API_SERVER_PORT=8643
API_SERVER_KEY=alice-secret
EOF

cat >> ~/.hermes/profiles/bob/.env <<EOF
API_SERVER_ENABLED=true
API_SERVER_PORT=8644
API_SERVER_KEY=bob-secret
EOF

# Запустите шлюз каждого профиля
hermes -p alice gateway &
hermes -p bob gateway &

API-сервер каждого профиля автоматически рекламирует имя профиля как идентификатор модели:

В каждом отдельном подключении открывайте разделы WebUI. Выпадающий список моделей показывает «Алису» и «Боба» в качестве моделей, изготовленных по протоколу, который полностью изолированным экземпляром Hermes. См. руководство Open WebUI для подробностей.

Ограничения

Режим прокси

API-сервер, а также серверный сервер для режима прокси-шлюза. Когда другой экземпляр шлюза Hermes настроен с помощью GATEWAY_PROXY_URL, указывающим на этот API-сервер, он перенаправляет все сообщения сюда вместо запуска собственного агента. Это позволяет разделить развертывание — например, Docker-контейнер, обрабатывающий Matrix E2EE, ретранслирует на агенте на хосте.

См. Matrix Proxy Mode для полного управления по настройке.