Привет! Меня зовут Андрей, я фронтенд-разработчик в Cloud.ru. Я работаю с LLM API каждый день. И каждый день отправляю в контекст структурированные данные: списки товаров, логи, пользователей, метрики. Все это — JSON. И все это — деньги.

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

Потом я попробовал TOON. Вот что из этого вышло.

Проблема: JSON — щедрый формат

Возьмем типичный кейс. Вы строите RAG-систему или ИИ-ассистента, который анализирует данные. В промпт подтягивается список из 50 записей. Вот как выглядит одна запись в JSON:


{"id": 2001, "timestamp": "2025-11-18T08:14:23Z", "level": "error", "service": "auth-api", "ip": "172.16.4.21", "message": "Auth failed for user", "code": "AUTH_401"}

Теперь умножьте на 50. Каждая запись повторяет 7 ключей: "id", "timestamp", "level", "service", "ip", "message", "code". Плюс кавычки вокруг каждого ключа и строкового значения. Плюс фигурные скобки. Плюс запятые. На 50 записях это ~350 лишних повторений ключей и сотни символов синтаксического мусора. Модели все это токенизируют. Вы за все это платите.

Решение: TOON за 30 секунд

TOON (Token-Oriented Object Notation) — формат, который кодирует те же данные с той же структурой, но без повторений. Ключи объявляются один раз в заголовке, дальше — только значения:

logs[3]{id,timestamp,level,service,ip,message,code}:

 2001,2025-11-18T08:14:23Z,error,auth-api,172.16.4.21,Auth failed for user,AUTH_401

 2002,2025-11-18T08:14:24Z,warn,payment,172.16.4.22,Timeout on payment gateway,PAY_TIMEOUT

 2003,2025-11-18T08:14:25Z,info,user-svc,172.16.4.23,User profile updated,USR_200

Заголовок logs[3]{id,timestamp,level,service,ip,message,code}: говорит: массив из трех элементов, поля — такие-то. Все. Дальше строки с данными через запятую. Никаких кавычек вокруг ключей, никаких {} на каждый объект, никакого дублирования.

Для обычных объектов — синтаксис как в YAML:

name: Alice

age: 30

role: admin

settings:

  theme: dark

  lang: ru

Конвертация JSON -> TOON -> JSON — без потерь, 1:1. Это не другая модель данных, это другая запись той же модели.

Считаем токены: реальный тест

Я взял датасет из 50 лог-записей (7 полей каждая) и прогнал через токенизатор. Вот код:

Python:

import json

import toon_format  # pip install toon-format

import tiktoken

enc = tiktoken.encoding_for_model("gpt-4o")

with open("logs.json") as f:

    data = json.load(f)

json_str = json.dumps(data, indent=2)

json_compact = json.dumps(data)

toon_str = toon_format.encode(data)

print(f"JSON (formatted):  {len(enc.encode(json_str))} токенов")

print(f"JSON (compact):    {len(enc.encode(json_compact))} токенов")

print(f"TOON:              {len(enc.encode(toon_str))} токенов")

TypeScript:

import { encode as toToon } from "@toon-format/toon";

import { encode as tokenize } from "gpt-3-encoder";

import fs from "fs";

const data = JSON.parse(fs.readFileSync("./logs.json", "utf8"));

const jsonFormatted = JSON.stringify(data, null, 2);

const jsonCompact = JSON.stringify(data);

const toonStr = toToon(data);

console.log(JSON (formatted):  ${tokenize(jsonFormatted).length} токенов);

console.log(JSON (compact):    ${tokenize(jsonCompact).length} токенов);

console.log(TOON:              ${tokenize(toonStr).length} токенов);

Результат на реальных данных (из бенчмарков TOON):

Формат

Токены

Экономия vs JSON

JSON (formatted)

379

JSON (compact)

236

-37.7%

TOON

150

-60.4%

60% экономии. На одном промпте. Не гипотетически — замерено токенизатором.

Считаем деньги: сколько вы переплачиваете

Теперь самое интересное. Актуальные цены API (апрель 2026):

Модель

Input (за 1 млн токенов)

Output (за 1 млн токенов)

GPT-4o

$2.50

$10.00

GPT-4.1

$2.00

$8.00

Claude Sonnet 4.6

$3.00

$15.00

Claude Opus 4.6

$5.00

$25.00

Допустим, вы делаете 10 000 запросов в день, в каждом — массив из 100 объектов (типичный RAG/аналитика). Считаем для GPT-4o:

JSON

TOON

Разница

Токенов на запрос

~3,200

~1,850

-42%

Токенов в день

32 млн

18.5 млн

-13.5 млн

Стоимость в день

$80

$46.25

-$33.75

В месяц

$2,400

$1,387

-$1,013

В год

$28,800

$16,650

-$12,150

На Claude Opus 4.6 (input $5/1 млн) экономия еще ощутимее:

JSON

TOON

Разница

В месяц

$4,800

$2,775

-$2,025

В год

$57,600

$33,300

-$24,300

$12 000-24 000 в год — только на input-токенах, только на одном эндпоинте. Если у вас несколько пайплайнов — умножайте.

Интеграция: 5 минут, 4 строки кода

Вам не нужно переписывать архитектуру. TOON подключается как прослойка перед отправкой в API:

Python + OpenAI:

import openai

import json

import toon_format

def analyze_with_llm(data: list[dict]) -> str:

    toon_str = toon_format.encode({"records": data})  # JSON -> TOON

    response = openai.chat.completions.create(

model="gpt-4o",

messages=[{

"role": "user",

"content": f"Проанализируй эти данные и найди аномалии:\n\n{toon_str}"

        }]

)

return response.choices[0].message.content

TypeScript + Anthropic:

import Anthropic from "@anthropic-ai/sdk";

import { encode as toToon } from "@toon-format/toon";

async function analyzeData(records: any[]) {

const toonData = toToon({ records });

const response = await anthropic.messages.create({

model: "claude-sonnet-4-6-20250514",

max_tokens: 1024,

messages: [{

role: "user",

content: Проанализируй эти данные и найди аномалии:\n\n${toonData}

    }]

  });

return response.content[0].text;

}

Одна строка toon_format.encode() — и вы экономите 40-60% токенов. Модель отвечает в обычном формате, ничего на выходе менять не нужно.

Большое сравнение: TOON vs все остальные

Ни один формат не идеален для всех случаев. Вот честная таблица:

Критерий

JSON

JSON compact

YAML

CSV

TOON

TRON

Токены (табличные данные)

100%

~63%

~72%

~38%

~40%

~55%

Токены (вложенные данные)

100%

~78%

~85%

н/п

~67%

~75%

Точность LLM

75.0%

73.7%

74.5%

~72%

76.4%

Вложенные структуры

отлично

отлично

хорошо

нет

средне

хорошо

Совместимость с пайплайнами

везде

везде

широко

широко

нужен SDK

JSON-совместим

Знакомство LLM (training data)

огромное

огромное

большое

большое

минимальное

минимальное

Lossless round-trip с JSON

да

да

с нюансами

нет

да

да

Ключевые выводы

  • TOON vs CSV: CSV компактнее на ~5-6% для плоских таблиц, но не поддерживает вложенность и типы. TOON добавляет минимальный overhead, но модель точнее парсит данные.

  • TOON vs YAML: TOON экономит 48% токенов на табличных данных. YAML лучше на конфигах с глубокой вложенностью.

  • TOON vs JSON compact: даже минифицированный JSON проигрывает TOON 35% на таблицах. На вложенных — разрыв меньше (~15%).

  • TOON vs TRON: TRON — JSON-совместимый (можно парсить обычным JSON-парсером). TOON компактнее, но требует отдельный парсер. Выбирайте TRON, если не хотите менять тулчейн.

Когда TOON — правильный выбор (и когда нет)

Используйте TOON, когда:

  • Массивы однородных объектов — списки пользователей, товаров, логов, метрик. Экономия 40-60%.

  • RAG-пайплайны — в контекст подтягиваются десятки документов с одинаковой структурой.

  • Batch-обработка — тысячи запросов в день, каждый процент экономии = реальные деньги.

  • Длинные контексты — когда данные не влезают в контекстное окно, а уменьшить их объем — критично.

НЕ используйте TOON, когда:

  • Глубоко вложенные структуры (4+ уровней). Точность LLM падает до 43% на nested-данных. JSON надежнее.

  • Данные идут не в LLM, а в обычный сервис. TOON — формат для промптов, не для REST API и баз данных.

  • Плоская таблица без вложенности. CSV на 5-6% компактнее и не требует SDK.

  • Нужна JSON Schema валидация. TOON — другой синтаксис, существующие валидаторы не подойдут.

Экосистема: что уже работает

Язык

Пакет

Статус

TypeScript

@toon-format/toon

Основная реализация

Python

toon-format / python-toon

Стабильно

Go

toon-format/go-toon

В разработке

Rust

toon-format/toon-rs

В разработке

.NET

toon-format/toon-dotnet

В разработке

CLI

npx @toon-format/cli

Работает

Быстрый старт:

# TypeScript

npm install @toon-format/toon

# Python

pip install toon-format

# Конвертация файла через CLI

npx @toon-format/cli data.json -o data.toon

npx @toon-format/cli data.toon -o data.json  # и обратно

Спецификация открыта, ABNF-грамматика задокументирована, тестовые фикстуры доступны: toon-format/spec.

Итог

TOON — не замена JSON. JSON останется стандартом для API, конфигов и хранения. Но если вы передаете структурированные данные в LLM — вы буквально выбрасываете деньги на синтаксический мусор.

Четыре строки кода. Пять минут интеграции. Минус 40-60% токенов. Минус $12 000-24 000 в год на средней нагрузке. Попробуйте на одном эндпоинте. Замерьте. Посчитайте. Ваш бюджет на API скажет спасибо. Или хотя бы перестанет тихо всхлипывать по ночам.


Если было полезно — я пишу о фронтенде, ИИ и подобных практических штуках в блоге и Telegram-канале. Заходите, буду рад.


Ссылки:

Комментарии (15)


  1. x89377
    08.04.2026 17:07

    cloud.ru ? Серьёзно ?


  1. arch1lochus
    08.04.2026 17:07

    неясно, для чего вообще фронтенд-разработчику на постоянной основе скармливать в LLM большие объемы логов, пользовательских данных (oops!). У разрабов Cloud.ru KPI на трату токенов? :)


    1. whoisfedos Автор
      08.04.2026 17:07

      У меня есть еще и внутренние проекты в компании и личные петы


  1. ramiil
    08.04.2026 17:07

    Ну, для начала надо минимизировать json, что удалит лишние токены на табы/пробелы.


    1. starfair
      08.04.2026 17:07

      Грамотно написанный агент и так это сделает в фоновом режиме. Но как верно написано, такого рода мнимизация не избавит от дублирования описания полей, в регулярных структурах. Правда, сомнительно мне, что таковые часто встречаются в промптах, разве что в весьма специфичных .


    1. whoisfedos Автор
      08.04.2026 17:07

      мы все равно сталкиваемся с дополнительным этапом трансформации, лишних символов конечно станет меньше


  1. SunRiseX64
    08.04.2026 17:07

    Что-то я не понял зачем использовать toon, если то же самое можно записать в формате csv с первой заголовочной строкой


    1. bsv2070
      08.04.2026 17:07

      Там написано: csv вложенность не умеет.


  1. alterbred
    08.04.2026 17:07

    почему-то вспомнились Fortran, пачки перфокарт и проблемы изменений в данных...


  1. n7nexus
    08.04.2026 17:07

    Какое-то переизобретение csv


  1. cry_san
    08.04.2026 17:07

    По факту - обычный csv


  1. Politura
    08.04.2026 17:07

    Используйте TOON, когда:

    • Массивы однородных объектов — списки пользователей, товаров, логов, метрик. Экономия 40-60%.

    ...

    НЕ используйте TOON, когда:

    • Плоская таблица без вложенности. CSV на 5-6% компактнее и не требует SDK.

    А в чем разница-то?

    `` logs[3]{id,timestamp,level,service,ip,message,code}: 2001,2025-11-18T08:14:23Z,error,auth-api,172.16.4.21,Auth failed for user,AUTH_401 2002,2025-11-18T08:14:24Z,warn,payment,172.16.4.22,Timeout on payment gateway,PAY_TIMEOUT 2003,2025-11-18T08:14:25Z,info,user-svc,172.16.4.23,User profile updated,USR_200 ``

    Это как-раз и есть CSV - Comma Separated Values. Только в заголовок фигурные скобочки зафигачили, да счетчик записей, вот и все отличие.


    1. Gromilo
      08.04.2026 17:07

      Видимо пример не очень удачный. Потому что TOON должен уметь всё то же самое, что и JSON, а значит вложенные объекты. У CSV с этим плохо.

      Но я тоже не понимаю, как это должно выглядеть


  1. vagon333
    08.04.2026 17:07

    @whoisfedos,
    Прежде всего, благодарю за отличную идею, спернул в свои реализации.

    Далее вопросы по использованию:

    1. Нужно ли в промпте инструктировать, что данные в формате TOON?

    2. Есть ли смысл запрашивать ответ в формате TOON, как сейчас есть возможность запрашивать результаты в JSON формате и тем самым получать структурированные данные в ответе, что дает возможность передавать дальше по цепочке без парсинга.


    1. whoisfedos Автор
      08.04.2026 17:07

      1. Я думаю, что не все модели натасканы на информацию об этом формате, поэтому наверное лишний раз надо нейронке подсветить

      2. За output токены мы тоже платим, а следовательно чем меньше символов на выходе => тем дешевле. Если строить весь пайплайн на формате toon, то есть смысл явно указывать нейронке чтобы отдавала toon формат. Если конечная конечный потребитель все таки принимает только json, то можно сделать просто хук в конце для нейронки (или даже просто скрипт) чтобы форматировалось все в json