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

Проверка токенов перед задачей

Требуется Bee 1.0.0-beta.16 или новее. Для примеров нужна сборка с bee token estimate. Справку можно проверить командой bee token estimate --help.

Перед началом задачи выберите инструкции, запрос и фрагменты исходников, которые вам уже известны как необходимые. bee token estimate читает только явно выбранные файлы и перенаправленный stdin. Команда работает офлайн без инициализации, базы данных, вызова провайдера или скачивания данных кодировки во время запуска. Она не выполняет задачу, не обнаруживает её контекст и не предсказывает работу агента.

  1. Выберите известный контекст, включая обязательные инструкции. Для ревью это могут быть запрос на проверку и нужные фрагменты исходников и тестов. Подготовьте альтернативные выборки явно.
  2. Оцените каждую выборку с одинаковой кодировкой и допущениями. Проверьте и число, и достаточность контекста для задачи.
  3. Выберите контекст и выполните задачу отдельно. Меньшее число само по себе не доказывает качество или экономию токенов: удаление нужных сведений может привести к дополнительной работе.
  4. После выполнения изучите явно выбранный поддерживаемый журнал сеанса существующей командой измеренного использования. Храните записанные наблюдения отдельно от предварительно выделенного бюджета.

Следующая подготовка для Bash/zsh создаёт синтетический текст и пустой отдельный профиль Bee вне рабочего дерева. pwd -P определяет физический каталог; на macOS сам /tmp — символическая ссылка, поэтому нужен физический корень под /private/tmp.

Окно терминала
demo_dir="$(mktemp -d "${TMPDIR:-/tmp}/bee-token-demo.XXXXXX")"
demo_dir="$(cd "$demo_dir" && pwd -P)"
mkdir "$demo_dir/profile"
printf 'Hello world!\n' > "$demo_dir/prompt.txt"
printf 'Review the tests.\n' > "$demo_dir/context.txt"
chmod 444 "$demo_dir/prompt.txt" "$demo_dir/context.txt"
Окно терминала
BEE_HOME="$demo_dir/profile" bee token estimate --root "$demo_dir" --file prompt.txt --json

Файл содержит 13 байт UTF-8 и 13 единиц UTF-16, включая перевод строки. Эвристика по умолчанию utf16-ceil-div4@1 даёт input.estimatedTokensPerCall: 4. Она округляет utf16Units / 4 вверх для каждого входа, затем складывает результаты. Это оценка, а не подсчёт токенизатором и не верхняя граница. Поэтому два входа по одной единице дают два, хотя объединённый текст дал бы один.

2. Выберите перенаправленный stdin и кодировку

Заголовок раздела «2. Выберите перенаправленный stdin и кодировку»
Окно терминала
printf 'Hello world!' | BEE_HOME="$demo_dir/profile" bee token estimate --stdin --encoding o200k_base --json

Здесь нет завершающего перевода строки: 12 байт, 12 единиц UTF-16 и 3 токена при o200k_base. Stdin читается только с --stdin и должен быть перенаправлен. При выборе только stdin корневой каталог не открывается. Один --stdin можно сочетать с повторяющимися --file.

Окно терминала
BEE_HOME="$demo_dir/profile" bee token estimate --root "$demo_dir" \
--file prompt.txt --file context.txt --encoding cl100k_base \
--calls 3 --output-budget 2000 --json

Файлы дают 3 и 4 токена: 7 на вызов. --calls 3 означает три независимых вызова с одним и тем же выбранным входом каждый раз. Это не симуляция роста беседы, повторных попыток, инструментов или сжатия. --output-budget 2000 — выделенный вами бюджет на вызов, включая запланированную долю рассуждения; он не прогнозирует вывод и не ограничивает генерацию.

Поле сценария Значение
inputEstimatedTokens 21 = 3 × 7
outputAllocatedTokens 6000 = 3 × 2000
totalAllocatedTokens 6021 = 3 × (7 + 2000)
Окно терминала
BEE_HOME="$demo_dir/profile" bee token estimate --root "$demo_dir" \
--file prompt.txt --file context.txt --encoding cl100k_base \
--calls 3 --output-budget 2000 --limit 0 --json

contributors пуст, но итоги входа и сценария выше не меняются. projection содержит returned: 0, omitted: 2, omittedEstimatedTokens: 7. --limit ограничивает видимые строки вкладов, а не выбор входов или подсчёт. Используйте запись с пробелом --limit 0; --limit=0 не принимается.

Окно терминала
BEE_HOME="$demo_dir/profile" bee token estimate --root "$demo_dir" \
--file prompt.txt --encoding cl100k_base \
--calls 3 --output-budget 2000 --json

При той же кодировке, числе вызовов и бюджете вывода выбор только prompt.txt даёт 3 токена на вызов, 9 входных токенов сценария и общий бюджет 6009. Сравнение измеряет изменённую выборку: из неё исключена инструкция проверить тесты. Решите, допустим ли такой пропуск для реальной задачи. Меньшее число не доказывает равноценность работы или достигнутую экономию.

Окно терминала
printf '' | BEE_HOME="$demo_dir/profile" bee token estimate --stdin --output-budget 0 --json

Пустой текст допустим: число входных токенов равно нулю, а явно нулевой бюджет вывода даёт общий бюджет ноль. В примерах 1 и 2 --output-budget отсутствует, поэтому outputBudgetPerCall, outputAllocatedTokens и totalAllocatedTokens остаются null. Неизвестное — не ноль. Даже явный нулевой бюджет не устанавливает реальный расход будущей задачи.

--encoding принимает heuristic (по умолчанию), o200k_base и cl100k_base. Явные кодировки используют поставляемые в пакете Microsoft.ML.Tokenizers и соответствующие данные кодировки версии 2.0.0. Они точно считают обычный текст в рамках выбранной реализации. Строки, похожие на специальные маркеры, например <|endoftext|>, остаются буквальным текстом. Если данных кодировки нет, возвращается encoding_unavailable; скрытого перехода к эвристике нет.

Нет сопоставления с моделью по умолчанию или утверждения о совместимости с провайдером. Точный подсчёт выбранного текста не охватывает полный запрос: структура сообщений, скрытое обрамление и невыбранные определения системы/инструментов находятся вне области подсчёта. Каждый вход считается отдельно, затем числа складываются. Чтобы измерить собранный текст с разделителями, передайте его целиком одним файлом или входом stdin.

Каждый результат — один компактный JSON-документ с завершающим переводом строки, даже без --json. Успешная оценка содержит schemaVersion: 1, status: complete, scope: selected_text_only. estimator указывает метод и версии; input содержит точные размеры в байтах/единицах и число токенов на вызов.

Порядковые номера вкладов следуют исходному порядку опций file/stdin, начиная с 1. Строки сортируются по убыванию токенов, затем единиц UTF-16, затем по порядковому номеру. projection учитывает скрытые строки. По умолчанию --limit равен 20, диапазон — 0–64. Для --calls значение по умолчанию — 1, диапазон — 1–1000000; необязательный --output-budget допускает 0–1000000000. Числа записываются десятичными цифрами ASCII без знака.

Список unknown сохраняет неизвестными реальный будущий вывод и рассуждение, будущие результаты инструментов и ходы, рост беседы и сжатие, невыбранные систему/инструменты/обрамление, поведение кэша и использование/начисления провайдера. money остаётся null: цены не рассчитываются. Из этих чисел нельзя вывести объём кэшированных токенов или фактический расход провайдера.

Файлы выбираются относительными путями с / внутри физического абсолютного --root; если корень не задан, используется текущий каталог. Сканирования каталога нет. Выход за корень, ссылки в корневом или файловом пути, жёсткие ссылки, повторный выбор одного физического файла и нерегулярные файлы, например FIFO, отклоняются. Выберите обычную копию внутри разрешённого физического корня; не обходите границу символической ссылкой. Распространённые имена чувствительных файлов отклоняются, но это не универсальный детектор секретов.

Вход должен быть обычным текстом в строго корректном UTF-8. UTF-8 BOM считается как U+FEFF; CRLF и завершающие переводы строк сохраняются. Нет обрезки, нормализации или декодирования с заменой повреждённых байтов. Некорректный UTF-8, BOM UTF-16/32 и текст с NUL отклоняются. Отчёт не выводит содержимое, имена файлов, пути или хеши приватного входа; команда не сохраняет выборку. Повторные проверки файлов выполняются по возможности: snapshot: checked_unchanged_not_atomic не гарантирует атомарный снимок.

Ограничение Поведение
64 выбранных входа, включая stdin Только явный выбор
256 КиБ (262144 байта) на вход; всего 1 МиБ (1048576 байт) Превышение отклоняется, а не обрезается
32 КиБ (32768 байт) JSON с завершающим переводом строки Слишком большой вывод даёт output_limit, а не обрезанный JSON
Работа точной кодировки По всем входам сумма квадратов длин естественных предтокенных фрагментов в байтах UTF-8 должна быть ≤67108864; один фрагмент — максимум 8192 байта

Длинный непрерывный текст может превысить лимит работы точного режима, оставаясь в пределах исходного объёма байтов. Тогда вся оценка завершается с tokenization_limit и итогами null; разбиения, обрезки или перехода к другому методу нет. Для кодировок также действует тайм-аут 250 мс на операцию regex (encoding_timeout). 10-секундный срок принятия использует кооперативную отмену; блокирующие синхронные операции файловой системы или вывода не позволяют гарантировать завершение ровно за десять секунд.

Выход Значение и следующий шаг
0 Полная оценка или справка; всё равно проверьте область, неизвестные значения и пропуски
4 Неверные аргументы (invalid_usage); проверьте написание, диапазоны, выбор и повторяющиеся флаги
5 Отклонённый вход, ошибка выполнения или вывода; изучите errorCode и необязательный errorInputOrdinal

Например, stdin_not_redirected требует конвейера или перенаправления, missing — существующего выбранного файла, invalid_unicode/invalid_text — корректного простого UTF-8, а file_byte_limit/total_byte_limit — меньшей явной выборки. Отказ по пути/ссылке означает несоответствие границе физических файлов. Ошибка входа/выполнения имеет status: incomplete, ошибка аргументов — status: invalid. В обоих случаях estimator, input, projection, scenario равны null, а список вкладов пуст. Частичный итог входа не публикуется. Ошибка записи вывода может оставить неполный префикс в потоке; код 5 не является пригодным успешным JSON-результатом.

Выполните задачу, затем изучите записанный расход

Заголовок раздела «Выполните задачу, затем изучите записанный расход»

Когда задача действительно выполнена, используйте поддерживаемый локальный журнал и его точный native thread UUID с существующей командой:

Окно терминала
bee budget --measured --harness codex \
--session 11111111-1111-4111-8111-111111111111 \
--log /absolute/physical/path/to/rollout.jsonl --json

Замените пример UUID и пути точными значениями нужного потока и журнала. Все три селектора обязательны; Bee не ищет последний сеанс автоматически. Руководство по размеру контекста содержит синтетический пример журнала и объясняет записанные счётчики, оценочные базы истории и неполные данные. Разделяйте потоки response и history; не складывайте их и не выводите начисления, полноту записи, экономию кэша или причинность из сравнения предварительных оценок.

Для проверки контекста и кандидатов в дубликаты перейдите к размеру контекста; для синтаксиса — к справочнику команд.