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

Встроенный счётчик 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
- В интерфейсе Bifrost откройте
Models | Model Providers. - Нажмите
Add New Providerи выберитеOpenAI. - Нажмите
Add Key, задайте понятное имя и вставьте API-ключ OpenAI. - Разрешите модель, которую будете использовать, и сохраните настройки.
Названия полей и параметры провайдера описаны в документации OpenAI provider.
3. Подключите Bifrost к Veai
Откройте настройки Veai и переключитесь на Community.

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

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

Укажите:
- 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 в заданном интервале. Фоновые задачи, параллельные чаты и другие клиенты также попадут в статистику.
Чтобы измерить одну задачу точнее:
-
Используйте для Veai отдельный виртуальный ключ Bifrost и отдельный ключ OpenAI.
-
Остановите другие клиенты и не запускайте параллельные чаты через этот ключ.
-
Создайте новый чат Veai.
-
Перед отправкой задачи запишите текущее время UTC в формате RFC3339:
START_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")echo "$START_TIME" -
Выполните задачу и дождитесь завершения всех действий агента и субагентов.
-
Сразу после завершения запишите конечное время:
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, и не прогнозирует расход следующей задачи.
Связанные страницы: