Skip to main content

Точно измерить расход токенов через Bifrost

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

Способ подходит для режима Community и OpenAI-совместимой модели. Встроенный показатель Veai удобен для контроля текущего чата, а Bifrost позволяет задать точный интервал времени.

Расход токенов в текущем чате Veai

Встроенный счётчик Veai показывает расход текущего чата.

Что подготовить

Перед началом понадобятся:

  • установленный и запущенный Docker;
  • API-ключ OpenAI;
  • Veai в режиме Community;
  • модель OpenAI, которую вы будете использовать для задачи.

Настоящий ключ OpenAI вводите только в Bifrost. Не добавляйте его в настройки Veai, файлы проекта, команды или сообщения чата.

Bifrost учитывает только запросы, которые прошли через него. Вызовы с тем же ключом, отправленные напрямую в OpenAI, в локальную статистику не попадут.

1. Запустите Bifrost

Откройте терминал и загрузите образ:

docker pull maximhq/bifrost

Запустите контейнер и подключите постоянный том для настроек и журналов:

docker run --name bifrost -p 8080:8080 -v bifrost-data:/app/data maximhq/bifrost

Откройте http://localhost:8080 в браузере. Если контейнер уже создан и остановлен, запустите его командой:

docker start bifrost

Подробности установки приведены в официальной инструкции Bifrost.

2. Добавьте ключ OpenAI в Bifrost

  1. В интерфейсе Bifrost откройте Models | Model Providers.
  2. Нажмите Add New Provider и выберите OpenAI.
  3. Нажмите Add Key, задайте понятное имя и вставьте API-ключ OpenAI.
  4. Разрешите модель, которую будете использовать, и сохраните настройки.

Названия полей и параметры провайдера описаны в документации OpenAI provider.

3. Подключите Bifrost к Veai

Откройте настройки Veai и переключитесь на Community.

Настройки OpenAI-совместимого провайдера в Community

Нажмите кнопку + рядом со списком провайдеров.

Добавление OpenAI-совместимого провайдера

Введите понятное имя нового провайдера и нажмите OK.

Имя нового OpenAI-совместимого провайдера

Укажите:

  • URL: http://localhost:8080/v1 (адрес Bifrost);
  • API-ключ: виртуальный ключ Bifrost, если в Bifrost включена авторизация;
  • модель: идентификатор вида openai/<model>, например openai/gpt-4o-mini.

Если авторизация Bifrost отключена, поле API-ключа в Veai можно оставить пустым. Если Veai требует значение, сначала включите авторизацию в Bifrost и создайте отдельный виртуальный ключ. Настоящий ключ OpenAI в Veai не вставляйте.

Нажмите Get a list of models, дождитесь загрузки моделей и выберите нужную модель. Перед измерением ещё раз проверьте выбранную модель.

Нажмите Save, настройки закроются.

Создайте новый чат и отправьте короткий безопасный запрос. Если Veai отвечает, подключение работает.

4. Подготовьте чистый замер

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

Чтобы измерить одну задачу точнее:

  1. Используйте для Veai отдельный виртуальный ключ Bifrost и отдельный ключ OpenAI.

  2. Остановите другие клиенты и не запускайте параллельные чаты через этот ключ.

  3. Создайте новый чат Veai.

  4. Перед отправкой задачи запишите текущее время UTC в формате RFC3339:

    START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    echo "$START_TIME"
  5. Выполните задачу и дождитесь завершения всех действий агента и субагентов.

  6. Сразу после завершения запишите конечное время:

    END_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    echo "$END_TIME"

Не перезапускайте контейнер и не удаляйте том bifrost-data до получения статистики.

5. Получите статистику за интервал

Получите доступные значения фильтров из Bifrost:

curl --silent --show-error "http://localhost:8080/api/logs/filterdata"

В объекте selected_keys найдите ключ по имени и скопируйте его id.

Выберите id ключа OpenAI, который добавили для замера:

KEY_ID="<OPENAI_KEY_ID>"

Метод и поля ответа описаны в справочнике доступных фильтров.

Запросите агрегированную статистику только по этому ключу и интервалу:

curl --silent --show-error --get \
"http://localhost:8080/api/logs/dashboard" \
--data-urlencode "selected_key_ids=$KEY_ID" \
--data-urlencode "start_time=$START_TIME" \
--data-urlencode "end_time=$END_TIME"

В ответе смотрите overview.stats.total_tokens. Разбивка содержит prompt_tokens, completion_tokens и total_tokens. Для проверки отдельных запросов используйте тот же фильтр с журналом:

curl --silent --show-error --get \
"http://localhost:8080/api/logs" \
--data-urlencode "selected_key_ids=$KEY_ID" \
--data-urlencode "start_time=$START_TIME" \
--data-urlencode "end_time=$END_TIME"

Параметры обоих методов описаны в справочнике Bifrost:

Если Management API защищён, добавьте выданный Bifrost bearer-токен во все запросы /api/logs/*:

BIFROST_MANAGEMENT_TOKEN="<BIFROST_MANAGEMENT_TOKEN>"

curl --silent --show-error --get \
"http://localhost:8080/api/logs/dashboard" \
--header "Authorization: Bearer $BIFROST_MANAGEMENT_TOKEN" \
--data-urlencode "selected_key_ids=$KEY_ID" \
--data-urlencode "start_time=$START_TIME" \
--data-urlencode "end_time=$END_TIME"

Не подставляйте в этот заголовок настоящий ключ OpenAI.

6. Проверьте результат

Замер готов, если:

  • журнал содержит запросы Veai между $START_TIME и $END_TIME;
  • записи относятся к нужному selected_key_ids;
  • агрегат показывает входные, выходные и общие токены;
  • в интервале нет запросов от других чатов или клиентов.

Если в журнале есть лишние запросы, повторите задачу с отдельным ключом и более узким интервалом. Если записей нет, проверьте URL в Veai и убедитесь, что запросы действительно проходят через Bifrost.

Ограничения измерения

Bifrost измеряет фактические запросы к модели, прошедшие через шлюз. Одна задача агента может состоять из нескольких запросов, включая вызовы инструментов и работу субагентов. Поэтому итог за интервал обычно больше числа токенов, видимых в одном сообщении.

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

Связанные страницы: