dimhold.by
← Статьи

Мои часы спрашивают ноутбук за $0 в API, а каждый новый вопрос всё равно стоит 7 центов

watch-ask открыт с августа. Это приложение для Galaxy Watch и небольшой сервер на Node. Я жму кнопку и задаю вопрос голосом. Часы распознают слова прямо на устройстве и отправляют текст на мою машину, где отвечает Claude Code без интерфейса. В README я написал “$0 in API”. Ниже добавил, что на моём сетапе один ответ съел примерно $0,07 лимита подписки и подтянул около 27 тысяч токенов контекста.

Эта фраза взялась из одного ответа. Я посмотрел строку лога, увидел 7 центов, записал и пошёл дальше. Про себя я считал, что это цена холодного старта, а дальше кеш промпта сделает вопросы почти бесплатными. Я этого ни разу не проверял, поэтому на этой неделе проверил.

Как я мерил

Сервер это публичный репозиторий на коммите edc8cae, Node 22.23.1, все 43 его теста проходят. Бэкенд это адаптер claude-cli по умолчанию: он запускает claude -p --output-format json и подаёт вопрос в stdin. Я запускал Claude Code 2.1.292 с моделью claude-opus-5 и режимом прав default.

Часов на этой машине нет. Скрипт спрашивает так же, как приложение на часах: POST /ask?mode=async, потом GET /result/<id> раз в 2000 мс, это POLL_INTERVAL_MS в MainActivity.kt. Сервер пишет в лог только сумму в долларах, а мне нужны были токены. Поэтому в ASK_CLAUDE_BIN я подставил маленькую обёртку, которая запускает настоящий CLI и сохраняет копию конверта, который он отдаёт в JSON. На этой ноде сам CLI работает на другой машине через ssh. Это добавляет 0,29 с к каждому вызову на стороне часов, но не ко времени внутри CLI.

Сумма в долларах это то, что CLI пишет в total_cost_usd. На подписке счёт за неё никто не выставляет, она списывается с лимита. Другого числа для этого лимита у меня нет.

Второй проход и неверный вывод

В первом проходе было 10 вопросов. 5 общих, вроде “What does HTTP status 502 mean?”. Остальные 5 про сам репозиторий, вроде “How many tests does the server have?”. Общие стоили по $0,07, первый $0,096. Потом я прогнал те же 10 ещё раз и общие стоили уже от $0,010 до $0,014.

Тёплая цена вышла в 7 раз ниже числа из README. Я уже наполовину написал эту фразу, когда посмотрел, что именно спрашивал второй проход. Он спрашивал те же вопросы, слово в слово. Кеш совпал со всем промптом, включая вопрос. А я не спрашиваю у часов одно и то же дважды за час.

Значит, нужны были вопросы, которых модель ещё не видела. Я написал 10 новых общих вопросов и задал каждый дважды.

сколько стоит один общий вопрос по подсчёту самого CLI, Claude Opus 5 $0,00 $0,02 $0,04 $0,06 $0,08 $0,10 задан впервые $0,071 те же слова ещё раз $0,011 первый вызов прогона $0,096
Настройка сервера по умолчанию: адаптер CLI со всеми инструментами Claude Code, CLI 2.1.292. Каждая точка это один вызов через сервер, так же, как спрашивают часы.

Все 10 новых вопросов стоили от $0,0702 до $0,0718. Их повторы стоили от $0,0107 до $0,0123. Почему, видно по конверту. Перед каждым общим вопросом идёт около 20 000 токенов контекста. Примерно 13 700 из них каждый раз приходят из кеша. Остальные, от 6317 до 6330 токенов на новый вопрос, записываются в кеш заново. Прочитать их обратно может только точный повтор.

Дорогая часть это запись в кеш. Цену даёт первый вызов. $0,0962 минус 10 959 токенов из кеша по $0,50 за миллион, минус 8 выходных токенов, остаётся $0,0905 за 9052 записанных токена. Это $10 за миллион, вдвое дороже обычного входа Opus 5, который стоит $5 за миллион. В конверте эти токены посчитаны в поле ephemeral_1h_input_tokens, то есть CLI пишет в часовой кеш. Около 6300 токенов записываются так на каждый новый вопрос. Ни один следующий вопрос их не читает.

Почему CLI переписывает 6300 токенов, а не только вопрос, я не знаю. Моя догадка в том, что CLI кладёт часть своего контекста после последней точки кеша, рядом с вопросом. Тогда для каждого вопроса она новая. Если урезать инструменты, перезапись тоже сжимается примерно до 700 токенов. С догадкой это сходится, но саму догадку я не проверял. Так что 7 центов из README это цена каждого нового вопроса.

Откуда 20 000 токенов

Большая часть уходит вместе с инструментами. На этой машине CLI ещё и перечисляет 13 навыков и установленные плагины, так что часть из 20 000 это мой сетап, а не сам Claude Code. Эти две доли я не разделял. Я задал 5 новых общих вопросов напрямую через CLI с тем же системным промптом и --tools "".

контекст одного нового общего вопроса, токены все инструменты (по умолчанию) 20 011, $0,071 Read, Grep, Glob 6 323, $0,011 без инструментов 3 784, $0,009 прочитано из кеша записано в кеш
Медианы по новым общим вопросам после первого вызова. Токен записать в кеш в 20 раз дороже, чем прочитать из него.

Без инструментов контекст сжимается примерно до 3800 токенов, а новый вопрос пишет около 700. После первого вызова это от $0,009 до $0,010. Общему вопросу с часов инструменты не нужны. Вопросу про мой код нужны, поэтому я попробовал набор поуже, --tools "Read,Grep,Glob". Контекст вышел около 6300 токенов, новый общий вопрос стоил от $0,011 до $0,012. 2 вопроса про репозиторий стоили $0,073 и $0,098. Оба ответа были верны.

Сегодня адаптер так не умеет. Он передаёт --allowed-tools из ASK_CLAUDE_ALLOWED_TOOLS. Этот флаг решает только, что можно запускать без спроса. Модели всё равно рассказывают про каждый инструмент, потому что --tools не передаётся никогда. Эту строку я бы и добавил, а по умолчанию дал бы только инструменты для чтения.

Вопросы про код

Все 10 ответов были верны. Я сверил их с кодом. Порт 8787, на неверный токен приходит 401. Через 300 секунд часы сдаются. Тестов 43, по файлам они делятся на 14, 11, 10 и 8. Последний коммит добавляет CITATION.cff. На ответы ушло от 2 до 7 ходов и от $0,05 до $0,21, медиана $0,12.

В 4 вызовах из 10 модель пробовала Bash и режим прав default ей отказал. Она вернулась к чтению файлов и всё равно ответила верно, как и обещает README. Своими глазами я этого раньше не видел.

Опрос сервера добавляет времени на запястье. Общий вопрос занял внутри CLI 2,1 с по медиане. Скрипт получил ответ через 6 с, потому что часы спрашивают только раз в 2 секунды. Адаптер echo, который отвечает мгновенно, каждый раз возвращался за 2,0 с, самое долгое за 2,06 с. Вопрос про код занял по медиане 8,6 с в CLI и 12 с на часах. В README ответ приходит через 15 секунд. Для 7 из этих 10 вопросов это так, остальные 3 заняли от 16 до 18 с. И это ещё без распознавания речи и голоса на настоящих часах.

Чего я не проверял

Сами часы. Я не проверял распознавание, перезапуск сегментов прослушивания, ошибку 11 в начале сессии и голос, который читает ответ вслух. Этот код я только читал. В README у меня было 27 тысяч токенов, а здесь 20 тысяч. Догадываюсь, что дело в другой машине с другим набором навыков и плагинов, но ту машину я не мерил. Я не знаю, как $0,07 по счёту CLI ложатся на недельный лимит. Прогон с паузами 10 и 60 секунд между вопросами я начал и остановил после 2 вызовов. Часовой кеш через такие короткие паузы не остывает. Сколько стоит вопрос после тишины дольше часа, а на прогулке это обычный случай, пока открытый вопрос.

Строку “$0 in API” в README можно оставить, денег там действительно ноль. А фразу под ней надо переписать, чтобы там стояли 7 центов за каждый новый вопрос и то, куда они уходят.