Перейти к содержимому

Руководство по интеграции

Версия документа: для gateway 4.1.0

Аудитория: инженерные и платформенные команды, интегрирующие HiveTrace Gateway в производственную среду.

Документ описывает контракт между клиентским приложением и gateway: формат запросов и ответов, модель обработки ошибок, особенности потоковой передачи. Руководство предназначено для практического внедрения и эксплуатации интеграции.


HiveTrace Gateway представляет собой OpenAI-совместимый HTTP-прокси, который размещается между клиентским приложением и LLM-провайдером (OpenAI, Anthropic OpenAI-compat, LiteLLM, vLLM, Ollama в OpenAI-режиме и др.). Для каждого запроса выполняется следующая последовательность:

  1. Принимается gateway как обычный OpenAI-вызов.
  2. Регистрируется в HiveTrace до отправки в LLM.
  3. Проксируется в апстрим.
  4. Регистрируется в HiveTrace после получения ответа.

При соответствующей политике HiveTrace может отклонить запрос или заменить ответ модели на заранее определенное сообщение. Это возможно только при синхронном режиме доставки данных на анализ в мониторинг hivetrace.

┌────────────┐ ┌──────────────────┐ ┌────────────┐
│ Client │────▶│ HiveTrace │────▶│ Upstream │
│ │ │ Gateway :4100 │ │ (LiteLLM, │
│ │◀────│ │◀────│ vLLM, …) │
└────────────┘ └────────┬─────────┘ └────────────┘
┌──────────────┐
│ HiveTrace │
│ Monitoring │
└──────────────┘

API соответствует OpenAI Chat Completions, Embeddings и Models: формат тела запроса, форма ответа, SSE-стриминг и envelope ошибок идентичны OpenAI. Тело запроса при форвардинге в апстрим не модифицируется (исключение: stream: true принудительно переписывается в false при app_mode=sync, см. раздел 6.3.2).

Дополнительные значения (application_id, user_id, session_id), необходмые для аналитики мониторинга, в gateway передаются через HTTP-заголовки. В апстрим они не пробрасываются и на ответ модели не влияют. Полный список — раздел 4.

Заголовок X-HiveTrace-Api-Key обязателен для всех запросов к gateway. В OpenAI SDK задается через default_headers — пример в разделе 5.1.

Контракт API доступен в формате OpenAPI 3.1:

  • Снапшот: openapi.json.
  • На запущенном экземпляре gateway: GET /openapi.json, Swagger UI на /docs, ReDoc на /redoc.

Gateway предоставляет единую точку входа (по умолчанию :4100) и реализует три OpenAI-совместимых эндпоинта:

МетодПутьНазначениеПайплайн HiveTrace
POST/v1/chat/completionsChat completion. Для асинхронного режима мониторинга поддерживается stream: true.Полный (pre-call + post-call + логирование ошибок)
POST/v1/embeddingsEmbeddings.Не применяется — прозрачное проксирование
GET/v1/modelsСписок моделей апстрима.Не применяется — прозрачное проксирование

Для chat/completions доступен полный контур проверок политиками HiveTrace.


Gateway использует двухуровневую модель авторизации:

Клиент передает заголовок X-HiveTrace-Api-Key: <gateway-key>обязательный ключ доступа к gateway. Без него любой запрос ко всем эндпоинтам (/v1/chat/completions, /v1/embeddings, /v1/models) отклоняется со статусом 401 invalid_request_error. Этим же ключом gateway аутентифицируется в HiveTrace при исходящих вызовах, поэтому переключение клиентского ключа автоматически переключает идентичность gateway в HiveTrace — серверный токен в env не используется и был удалён.

Клиент передает заголовок Authorization: Bearer <key>. Gateway не валидирует и не сохраняет этот токен; он передается в апстрим без изменений. Это означает следующее:

  • <key> должен быть действительным ключом апстрима (например, OpenAI API key для прямого обращения к OpenAI или ключ LiteLLM).

Идентификация приложения выполняется по заголовку X-Application-Id (см. п4). Это позволяет одному экземпляру gateway обслуживать несколько приложений с различными политиками HiveTrace без изменения инфраструктурной конфигурации.


Колонка «Источник» обозначает, относится ли заголовок к стандарту OpenAI (проксируется в апстрим без интерпретации gateway) или является расширением gateway (обрабатывается gateway, в апстрим не пробрасывается).

ЗаголовокИсточникОбязательностьНазначение
Authorization: Bearer <key>OpenAIдля апстримаКлюч апстрима. Передаётся в апстрим без изменений и валидации.
Content-Type: application/jsonOpenAIдля non-stream запросовСтандартный для OpenAI API.
Accept: text/event-streamOpenAIдля stream-запросовСтандартный для OpenAI streaming.
X-HiveTrace-Api-KeyGatewayдаКлюч доступа к gateway. Также используется как Bearer в исходящих вызовах gateway → HiveTrace. Отсутствие или пустое значение → 401.
X-Application-IdGatewayнетUUID приложения в HiveTrace. Определяет per-app политику. При отсутствии — fallback на ENV HIVETRACE_APPLICATION_ID.
X-User-IdGatewayнетИдентификатор конечного пользователя для аудита.
X-Session-IdGatewayнетИдентификатор пользовательской сессии.
X-Attached-FilesGatewayнетJSON-массив дескрипторов вложений для отдельной аудит-копии в HiveTrace. Формат — раздел 5.3.2.

Тело запроса соответствует payload OpenAI Chat Completions / Embeddings. Специфичных для gateway полей в теле нет.

Минимальный запрос:

Окно терминала
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: 11111111-2222-3333-4444-555555555555" \
-d '{
"model": "gpt-5",
"messages": [{"role": "user", "content": "Привет!"}]
}'

С идентификацией пользователя и сессии:

Окно терминала
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: 11111111-…" \
-H "X-User-Id: alice@company.com" \
-H "X-Session-Id: session-2025-04-28-abc" \
-d '{ "model": "gpt-5", "messages": [...] }'

Streaming:

Окно терминала
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{ "model": "gpt-5", "stream": true, "messages": [...] }'

Передача файлов поддерживается двумя стратегиями. Они решают разные задачи и могут использоваться по отдельности или одновременно.

СтратегияФайл попадает в LLMФайл попадает в HiveTrace (audit)Изменения в OpenAI-клиенте
5.3.1. Стандарт OpenAI (multimodal)ДаНетНе требуются
5.3.2. Заголовок X-Attached-FilesНетДаОдин дополнительный заголовок
5.3.3. Обе стратегии в одном запросеДаДаОдин дополнительный заголовок

5.3.1. Стратегия 1 — стандарт OpenAI (multimodal messages[].content)

Заголовок раздела «5.3.1. Стратегия 1 — стандарт OpenAI (multimodal messages[].content)»

Файлы передаются стандартным OpenAI-способом — массивом частей в messages[].content. Gateway не интерпретирует эти части и форвардит тело запроса в апстрим без изменений.

Окно терминала
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: <APPLICATION_ID>" \
-d '{
"model": "gpt-5",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Что на изображении?"},
{"type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORw0KG..."}}
]
}]
}'

Поведение:

  • LLM. Получает запрос в стандартном OpenAI multimodal формате. Обработка image_url, file и прочих нетекстовых частей зависит от модели и апстрима.
  • HiveTrace. В запись user_prompt записывается только текстовая часть (type: "text"). Содержимое image_url, file и прочих нетекстовых частей в HiveTrace не сохраняется.
  • Изменения в клиенте. Не требуются. Любой OpenAI-клиент или SDK с поддержкой multimodal работает без изменений.

Применимо, когда требуется обработка файла моделью без сохранения аудит-копии файла в HiveTrace.

Файлы передаются в заголовке X-Attached-Files как JSON-массив дескрипторов. Gateway не пробрасывает заголовок в апстрим; вместо этого он скачивает / декодирует файлы и прикрепляет их к аудит-записи user_prompt в HiveTrace.

Передача через base64 (для локальных файлов):

Окно терминала
B64=$(base64 -i ./test111.txt | tr -d '\n')
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: <APPLICATION_ID>" \
-H "X-User-Id: alice@company.com" \
-H "X-Attached-Files: [{\"name\":\"test111.txt\",\"content_base64\":\"$B64\",\"type\":\"text/plain\"}]" \
-d '{ "model": "gpt-5", "messages": [{"role":"user","content":"Сообщение пользователя"}] }'

Передача через URL (gateway скачивает файл по HTTP/HTTPS):

Окно терминала
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: <APPLICATION_ID>" \
-H "X-User-Id: alice@company.com" \
-H 'X-Attached-Files: [{"url":"https://files.company.example/contract.pdf","name":"contract.pdf","type":"application/pdf"}]' \
-d '{ "model": "gpt-5", "messages": [{"role":"user","content":"Сообщение пользователя"}] }'

Формат дескриптора (X-Attached-Files — JSON-массив, элементы содержат либо url, либо content_base64):

ПолеТипОписание
urlstringHTTP/HTTPS URL файла. Поддерживается также data: URI с inline base64.
content_base64stringBase64-кодированное содержимое файла. Альтернатива url.
namestringИмя файла. Используется при сохранении в HiveTrace; при отсутствии выводится из URL.
typestringMIME-тип файла. При отсутствии определяется по расширению или Content-Type ответа при скачивании.

Алиас заголовка: X-AttachedFiles.

Поведение:

  • LLM. Тело запроса в апстрим уходит без изменений; X-Attached-Files в апстрим не пробрасывается. Если в messages[].content нет inline-данных файла — модель его не получает.
  • HiveTrace. В запись user_prompt дополнительно прикрепляется аудит-копия файла, привязанная к analysis_id запроса.
  • Изменения в клиенте. Один дополнительный заголовок. Тело запроса остаётся стандартным OpenAI-payload.

Дополнительные возможности по сравнению со стратегией 1:

  • Аудит-копия файла сохраняется в HiveTrace независимо от того, передаётся ли файл модели.
  • Поддерживается передача по URL — gateway сам скачивает файл; клиенту не нужно загружать содержимое в payload запроса.
  • Содержимое файла попадает в HiveTrace целиком, а не только текстовая часть запроса.

Если требуется одновременно (а) подать файл в LLM и (б) сохранить его аудит-копию в HiveTrace, обе стратегии применяются в одном запросе. messages[].content обеспечивает доставку в модель, X-Attached-Files — аудит-копию в HiveTrace.

Окно терминала
B64=$(base64 -i ./contract.pdf | tr -d '\n')
curl -X POST http://gateway:4100/v1/chat/completions \
-H "Authorization: Bearer <upstream-key>" \
-H "X-HiveTrace-Api-Key: <gateway-key>" \
-H "Content-Type: application/json" \
-H "X-Application-Id: <APPLICATION_ID>" \
-H "X-User-Id: alice@company.com" \
-H "X-Attached-Files: [{\"name\":\"contract.pdf\",\"content_base64\":\"$B64\",\"type\":\"application/pdf\"}]" \
-d "{
\"model\": \"gpt-5\",
\"messages\": [{
\"role\": \"user\",
\"content\": [
{\"type\": \"text\", \"text\": \"Сделай выжимку документа.\"},
{\"type\": \"file\", \"file\": {\"filename\": \"contract.pdf\", \"file_data\": \"data:application/pdf;base64,$B64\"}}
]
}]
}"

В этом случае:

  1. messages[].content пропускается в апстрим без изменений; модель получает файл по стандартному OpenAI-протоколу.
  2. X-Attached-Files обрабатывается gateway параллельно: файл декодируется и прикрепляется к user_prompt в HiveTrace.
  3. Ответ модели регистрируется в HiveTrace стандартным post-call вызовом.

Применимо для compliance-сценариев, где требуется и обработка файла моделью, и аудит исходного содержимого в HiveTrace.

5.3.4. Обработка ошибок при работе с вложениями

Заголовок раздела «5.3.4. Обработка ошибок при работе с вложениями»

Сбой скачивания или декодирования файла (HTTP >=400, таймаут, размер превышает HIVETRACE_FILES_MAX_BYTES, ошибка декодирования base64) не приводит к отказу клиенту. Gateway изолирует такие сбои:

  • Проблемный файл не попадает в HiveTrace. В логи gateway пишется предупреждение с диагностикой (Attachment download failed: url=… status=404 и т. п.).
  • Остальные файлы в X-Attached-Files обрабатываются независимо.
  • Тело запроса передаётся в апстрим без изменений.
  • Клиент получает обычный ответ модели с HTTP-статусом, соответствующим ответу апстрима.
ПараметрДефолтENV
Максимальный размер одного файла20 MiBHIVETRACE_FILES_MAX_BYTES
Параллельных скачиваний4HIVETRACE_FILES_MAX_CONCURRENCY
Таймаут скачивания одного файла60 сHIVETRACE_FILES_TIMEOUT

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

Gateway не накладывает собственный лимит на размер тела запроса. Контроль выполняется на стороне апстрима.


Тело ответа и HTTP-статус полностью соответствуют ответу апстрима. Тип содержимого: application/json. Структура соответствует стандартному формату OpenAI:

{
"id": "chatcmpl-…",
"object": "chat.completion",
"created": 1234567890,
"model": "gpt-5",
"choices": [
{
"index": 0,
"message": { "role": "assistant", "content": "..." },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 23, "completion_tokens": 45, "total_tokens": 68 }
}

Content-Type: text/event-stream. Тело ответа представляет собой последовательность SSE-кадров:

data: {"id":"…","object":"chat.completion.chunk","choices":[{"delta":{"content":"При"}}]}
data: {"id":"…","object":"chat.completion.chunk","choices":[{"delta":{"content":"вет!"},"finish_reason":"stop"}]}
data: [DONE]

Между обычными data:-кадрами могут передаваться comment-кадры для поддержания соединения:

: keepalive

Streaming ответ может формироваться для пользователя при работающем мониторинге только в асинхронном режиме.

Возможна только при app_mode=sync в per-app политике (Redis). Если mode=async либо политика не настроена, описанное в этом разделе поведение к запросу не применяется.

Запрос не был передан в апстрим. Gateway возвращает синтезированный chat.completion с диагностическим блоком metadata.hivetrace:

{
"id": "hivetrace-guardrails-<uuid>",
"object": "chat.completion",
"created": 1717171717,
"model": "<запрошенная или 'unknown'>",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "<фраза из политики приложения>"
},
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0 },
"metadata": {
"hivetrace": {
"response_replaced": true,
"response_replacement": {
"stage": "pre_call",
"type": "<guardrails|custom_policy|dataclean>",
"request_id": "<metadata.request_id из тела запроса или сгенерированный UUID>"
},
"prepared_response": { "...": "контекст вердикта от HiveTrace" }
}
}
}

Клиент может определить факт замены по наличию metadata.hivetrace.response_replaced == true либо по префиксу id (hivetrace-…).

В режиме sync gateway принудительно отключает stream: true (заменяя его на stream: false) еще до обращения к HiveTrace. Причина заключается в том, что подмена SSE-ответа после начала передачи клиенту технически невозможна. Поэтому в sync-режиме клиент всегда получает non-streaming ответ, даже если в body.stream было указано true.


Все ошибки, возвращаемые клиенту, имеют следующую форму:

{"error": {"message": "...", "type": "...", "code": <int>}}

Если апстрим уже возвращает ошибку в формате OpenAI ({"error": {...}}), gateway передает ее без дополнительной обертки, сохраняя исходные поля провайдера (type, param, code).

Поле type используется для различения источников ошибок:

  • invalid_request_error — клиентская ошибка, отклонённая gateway или апстримом.
  • upstream_error — апстрим вернул >=400, а тело ответа не соответствовало OpenAI-совместимому формату.
  • gateway_error — gateway не смог успешно обратиться к апстриму. Всегда code: 502.
  • rate_limit_error, authentication_error и др. — нативные значения от OpenAI-совместимых апстримов, передаваемые без изменения.
СтатусИсточникУсловиеТип в error.type
400gatewayНевалидный JSON в теле запросаinvalid_request_error
400апстримБизнес-валидация (отсутствует messages, превышен context window, и т.п.)invalid_request_error (passthrough)
401gatewayОтсутствует или пустой заголовок X-HiveTrace-Api-Keyinvalid_request_error
401апстримAuthorization: Bearer отвергнут апстримомinvalid_request_error (passthrough)
403апстримАвторизация прошла, но действие запрещено (например, organization without quota)passthrough
404апстримУказанная модель не существуетinvalid_request_error (passthrough)
413апстрим / проксиТело слишком большоеupstream_error
422апстримPayload не прошел валидацию (strict-mode схемы)passthrough
429апстримRate limitrate_limit_error (passthrough)
500апстримВнутренняя ошибка апстримаupstream_error
502gatewayСетевая ошибка между gateway и апстримом (DNS, refused, TLS). Также — httpx.ReadTimeout ДО первого байта на non-streaming запросе.gateway_error
503апстримАпстрим недоступен (maintenance, перегруз)upstream_error
504(только в SSE error-кадрах)mid-stream httpx.TimeoutExceptionupstream_error

СлойПараметрДефолтКто контролирует
Gateway → апстрим (один HTTP-вызов)GATEWAY_UPSTREAM_TIMEOUT120 сgateway
Gateway → HiveTrace (/process_request/, /process_response/)HIVETRACE_TIMEOUT60 сgateway
Gateway → URL вложения (скачивание)HIVETRACE_FILES_TIMEOUT60 сgateway
Gateway → клиент: SSE keepaliveGATEWAY_STREAM_HEARTBEAT_SECONDS60 сgateway

9.1. Минимальный набор переменных окружения

Заголовок раздела «9.1. Минимальный набор переменных окружения»
Окно терминала
# Апстрим
UPSTREAM_URL=http://litellm:4000
# HiveTrace
HIVETRACE_URL=https://hivetrace.example.com/api
HIVETRACE_APPLICATION_ID=<default app uuid>
# Redis (для per-app политик; опционально, если блокировки не требуются)
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_DB=0
REDIS_USER=""
REDIS_PASSWORD="admin"
REDIS_SSL=False

Если HIVETRACE_URL не задан, gateway форвардит запросы в апстрим без отправки телеметрии в HiveTrace. При импорте модуля в stderr выводится предупреждение HiveTrace is effectively disabled.

Контракт X-HiveTrace-Api-Key сохраняется: ключ остается обязательным для клиентских запросов, однако при отсутствии подключения к HiveTrace фактически не используется. Этот режим предназначен для отладки и устойчивой обработки ошибок конфигурации; в развертывании параметр HIVETRACE_URL должен быть задан явно.

Если Redis не сконфигурирован, per-app политики блокировки недоступны; pre-call и post-call телеметрия в HiveTrace отправляется в режиме async по умолчанию.