{
  "version": 1,
  "measuredOn": "2026-10-02",
  "methodology": {
    "summary": "12 realistic messages to an AI assistant / coding agent were written in English, then translated faithfully into each language and into Simplified Chinese (zh-Hans) as Dragon mode would output it. Every message was tokenized separately and the totals were compared: pctChange = (zh - source) / source * 100. Negative means Chinese uses fewer tokens.",
    "corpus": {
      "file": "apps/web/scripts/token-corpus.json",
      "messagesPerLanguage": 12,
      "englishWordsPerMessage": {
        "min": 23,
        "max": 33
      },
      "domainMix": "4 coding requests with English identifiers, 2 writing help, 2 analysis, 2 everyday, 1 CI/devops, 1 personal finance explanation",
      "conventions": "Code identifiers, file paths and product names stay in Latin script in every language (as Dragon mode will keep them). Each language uses its own natural conventions for numerals and common technical loanwords."
    },
    "script": "apps/web/scripts/measure-tokens.py",
    "tokenizers": {
      "o200k_base": "OpenAI o200k_base (GPT-4o, GPT-4.1, GPT-5 family)",
      "cl100k_base": "OpenAI cl100k_base (GPT-4, GPT-3.5-turbo)",
      "library": "tiktoken 0.14.0"
    },
    "claudeIncluded": false,
    "claudeNote": "Claude (Anthropic) token counts are NOT included: no ANTHROPIC_API_KEY was available when this file was generated. Re-run the script with ANTHROPIC_API_KEY and ANTHROPIC_COUNT_MODEL set to add them.",
    "caveats": [
      "Small corpus (12 messages per language); treat results as indicative, not as a benchmark.",
      "Translations were written by hand for this measurement; a different translator or Dragon mode's live model output may be longer or shorter, especially for zh-Hans.",
      "Results depend on the domain mix: messages full of code identifiers save less, because identifiers stay in Latin script and cost the same in every language.",
      "Only OpenAI's open tokenizers are measured; other models (Claude, Gemini, Llama, Qwen) use different tokenizers and will give different numbers.",
      "Only input tokens are measured. Model replies are not part of this comparison.",
      "For English, Chinese costs MORE tokens; Dragon mode is not a token saver for English speakers."
    ],
    "guardrail": "Every public claim compares zh-Hans against the user's OWN language, never against English."
  },
  "target": {
    "code": "zh-Hans",
    "name": "Simplified Chinese"
  },
  "languages": [
    {
      "code": "el",
      "name": "Greek",
      "nativeName": "Ελληνικά",
      "messages": 12,
      "chars": 2183,
      "zhChars": 763,
      "wordsPerMessage": 28.2,
      "tokens": {
        "o200k_base": {
          "source": 755,
          "zh": 456,
          "ratioZhToSource": 0.604,
          "pctChange": -39.6,
          "perMessagePctChange": {
            "min": -50.0,
            "median": -39.1,
            "max": -30.0
          }
        },
        "cl100k_base": {
          "source": 1707,
          "zh": 599,
          "ratioZhToSource": 0.351,
          "pctChange": -64.9,
          "perMessagePctChange": {
            "min": -70.6,
            "median": -65.6,
            "max": -55.7
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 40% fewer tokens than Greek (o200k_base)"
    },
    {
      "code": "de",
      "name": "German",
      "nativeName": "Deutsch",
      "messages": 12,
      "chars": 2227,
      "zhChars": 763,
      "wordsPerMessage": 26.5,
      "tokens": {
        "o200k_base": {
          "source": 523,
          "zh": 456,
          "ratioZhToSource": 0.872,
          "pctChange": -12.8,
          "perMessagePctChange": {
            "min": -27.1,
            "median": -14.8,
            "max": 13.9
          }
        },
        "cl100k_base": {
          "source": 604,
          "zh": 599,
          "ratioZhToSource": 0.992,
          "pctChange": -0.8,
          "perMessagePctChange": {
            "min": -22.4,
            "median": -2.1,
            "max": 57.5
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 13% fewer tokens than German (o200k_base)"
    },
    {
      "code": "fr",
      "name": "French",
      "nativeName": "Français",
      "messages": 12,
      "chars": 2196,
      "zhChars": 763,
      "wordsPerMessage": 29.0,
      "tokens": {
        "o200k_base": {
          "source": 496,
          "zh": 456,
          "ratioZhToSource": 0.919,
          "pctChange": -8.1,
          "perMessagePctChange": {
            "min": -17.1,
            "median": -10.4,
            "max": 5.1
          }
        },
        "cl100k_base": {
          "source": 575,
          "zh": 599,
          "ratioZhToSource": 1.042,
          "pctChange": 4.2,
          "perMessagePctChange": {
            "min": -16.1,
            "median": 3.3,
            "max": 37.0
          }
        }
      },
      "chineseSavesTokens": false,
      "verdict": "Chinese uses 8% fewer tokens than French (o200k_base)"
    },
    {
      "code": "es",
      "name": "Spanish",
      "nativeName": "Español",
      "messages": 12,
      "chars": 2091,
      "zhChars": 763,
      "wordsPerMessage": 28.9,
      "tokens": {
        "o200k_base": {
          "source": 479,
          "zh": 456,
          "ratioZhToSource": 0.952,
          "pctChange": -4.8,
          "perMessagePctChange": {
            "min": -18.4,
            "median": -5.6,
            "max": 10.8
          }
        },
        "cl100k_base": {
          "source": 545,
          "zh": 599,
          "ratioZhToSource": 1.099,
          "pctChange": 9.9,
          "perMessagePctChange": {
            "min": -13.5,
            "median": 10.6,
            "max": 46.5
          }
        }
      },
      "chineseSavesTokens": false,
      "verdict": "Chinese uses 5% fewer tokens than Spanish (o200k_base)"
    },
    {
      "code": "it",
      "name": "Italian",
      "nativeName": "Italiano",
      "messages": 12,
      "chars": 2136,
      "zhChars": 763,
      "wordsPerMessage": 28.0,
      "tokens": {
        "o200k_base": {
          "source": 539,
          "zh": 456,
          "ratioZhToSource": 0.846,
          "pctChange": -15.4,
          "perMessagePctChange": {
            "min": -31.2,
            "median": -15.6,
            "max": 2.6
          }
        },
        "cl100k_base": {
          "source": 590,
          "zh": 599,
          "ratioZhToSource": 1.015,
          "pctChange": 1.5,
          "perMessagePctChange": {
            "min": -20.0,
            "median": -1.1,
            "max": 37.0
          }
        }
      },
      "chineseSavesTokens": false,
      "verdict": "Chinese uses 15% fewer tokens than Italian (o200k_base)"
    },
    {
      "code": "pt",
      "name": "Portuguese (Brazilian)",
      "nativeName": "Português",
      "messages": 12,
      "chars": 2101,
      "zhChars": 763,
      "wordsPerMessage": 28.8,
      "tokens": {
        "o200k_base": {
          "source": 476,
          "zh": 456,
          "ratioZhToSource": 0.958,
          "pctChange": -4.2,
          "perMessagePctChange": {
            "min": -17.6,
            "median": -4.0,
            "max": 21.2
          }
        },
        "cl100k_base": {
          "source": 543,
          "zh": 599,
          "ratioZhToSource": 1.103,
          "pctChange": 10.3,
          "perMessagePctChange": {
            "min": -16.7,
            "median": 12.8,
            "max": 53.7
          }
        }
      },
      "chineseSavesTokens": false,
      "verdict": "Chinese uses 4% fewer tokens than Portuguese (Brazilian) (o200k_base)"
    },
    {
      "code": "ru",
      "name": "Russian",
      "nativeName": "Русский",
      "messages": 12,
      "chars": 2010,
      "zhChars": 763,
      "wordsPerMessage": 23.6,
      "tokens": {
        "o200k_base": {
          "source": 521,
          "zh": 456,
          "ratioZhToSource": 0.875,
          "pctChange": -12.5,
          "perMessagePctChange": {
            "min": -26.2,
            "median": -13.6,
            "max": 2.5
          }
        },
        "cl100k_base": {
          "source": 851,
          "zh": 599,
          "ratioZhToSource": 0.704,
          "pctChange": -29.6,
          "perMessagePctChange": {
            "min": -37.2,
            "median": -30.5,
            "max": -11.3
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 12% fewer tokens than Russian (o200k_base)"
    },
    {
      "code": "uk",
      "name": "Ukrainian",
      "nativeName": "Українська",
      "messages": 12,
      "chars": 1921,
      "zhChars": 763,
      "wordsPerMessage": 23.4,
      "tokens": {
        "o200k_base": {
          "source": 644,
          "zh": 456,
          "ratioZhToSource": 0.708,
          "pctChange": -29.2,
          "perMessagePctChange": {
            "min": -40.0,
            "median": -29.1,
            "max": -18.6
          }
        },
        "cl100k_base": {
          "source": 1069,
          "zh": 599,
          "ratioZhToSource": 0.56,
          "pctChange": -44.0,
          "perMessagePctChange": {
            "min": -51.1,
            "median": -45.8,
            "max": -28.6
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 29% fewer tokens than Ukrainian (o200k_base)"
    },
    {
      "code": "pl",
      "name": "Polish",
      "nativeName": "Polski",
      "messages": 12,
      "chars": 2046,
      "zhChars": 763,
      "wordsPerMessage": 24.2,
      "tokens": {
        "o200k_base": {
          "source": 633,
          "zh": 456,
          "ratioZhToSource": 0.72,
          "pctChange": -28.0,
          "perMessagePctChange": {
            "min": -41.1,
            "median": -27.7,
            "max": -16.3
          }
        },
        "cl100k_base": {
          "source": 724,
          "zh": 599,
          "ratioZhToSource": 0.827,
          "pctChange": -17.3,
          "perMessagePctChange": {
            "min": -29.7,
            "median": -17.9,
            "max": -1.6
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 28% fewer tokens than Polish (o200k_base)"
    },
    {
      "code": "tr",
      "name": "Turkish",
      "nativeName": "Türkçe",
      "messages": 12,
      "chars": 1978,
      "zhChars": 763,
      "wordsPerMessage": 22.4,
      "tokens": {
        "o200k_base": {
          "source": 547,
          "zh": 456,
          "ratioZhToSource": 0.834,
          "pctChange": -16.6,
          "perMessagePctChange": {
            "min": -28.8,
            "median": -16.1,
            "max": -4.4
          }
        },
        "cl100k_base": {
          "source": 709,
          "zh": 599,
          "ratioZhToSource": 0.845,
          "pctChange": -15.5,
          "perMessagePctChange": {
            "min": -37.5,
            "median": -14.1,
            "max": 5.0
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 17% fewer tokens than Turkish (o200k_base)"
    },
    {
      "code": "ar",
      "name": "Arabic",
      "nativeName": "العربية",
      "messages": 12,
      "chars": 1583,
      "zhChars": 763,
      "wordsPerMessage": 22.5,
      "tokens": {
        "o200k_base": {
          "source": 493,
          "zh": 456,
          "ratioZhToSource": 0.925,
          "pctChange": -7.5,
          "perMessagePctChange": {
            "min": -19.2,
            "median": -9.9,
            "max": 4.9
          }
        },
        "cl100k_base": {
          "source": 1038,
          "zh": 599,
          "ratioZhToSource": 0.577,
          "pctChange": -42.3,
          "perMessagePctChange": {
            "min": -52.6,
            "median": -42.8,
            "max": -27.6
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 8% fewer tokens than Arabic (o200k_base)"
    },
    {
      "code": "he",
      "name": "Hebrew",
      "nativeName": "עברית",
      "messages": 12,
      "chars": 1585,
      "zhChars": 763,
      "wordsPerMessage": 22.6,
      "tokens": {
        "o200k_base": {
          "source": 574,
          "zh": 456,
          "ratioZhToSource": 0.794,
          "pctChange": -20.6,
          "perMessagePctChange": {
            "min": -27.9,
            "median": -20.9,
            "max": -8.3
          }
        },
        "cl100k_base": {
          "source": 1355,
          "zh": 599,
          "ratioZhToSource": 0.442,
          "pctChange": -55.8,
          "perMessagePctChange": {
            "min": -63.1,
            "median": -57.8,
            "max": -42.7
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 21% fewer tokens than Hebrew (o200k_base)"
    },
    {
      "code": "hi",
      "name": "Hindi",
      "nativeName": "हिन्दी",
      "messages": 12,
      "chars": 1938,
      "zhChars": 763,
      "wordsPerMessage": 30.8,
      "tokens": {
        "o200k_base": {
          "source": 609,
          "zh": 456,
          "ratioZhToSource": 0.749,
          "pctChange": -25.1,
          "perMessagePctChange": {
            "min": -36.5,
            "median": -23.0,
            "max": -14.6
          }
        },
        "cl100k_base": {
          "source": 1734,
          "zh": 599,
          "ratioZhToSource": 0.345,
          "pctChange": -65.5,
          "perMessagePctChange": {
            "min": -71.2,
            "median": -65.3,
            "max": -59.0
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 25% fewer tokens than Hindi (o200k_base)"
    },
    {
      "code": "ja",
      "name": "Japanese",
      "nativeName": "日本語",
      "messages": 12,
      "chars": 1030,
      "zhChars": 763,
      "wordsPerMessage": null,
      "tokens": {
        "o200k_base": {
          "source": 642,
          "zh": 456,
          "ratioZhToSource": 0.71,
          "pctChange": -29.0,
          "perMessagePctChange": {
            "min": -39.7,
            "median": -30.1,
            "max": -18.0
          }
        },
        "cl100k_base": {
          "source": 857,
          "zh": 599,
          "ratioZhToSource": 0.699,
          "pctChange": -30.1,
          "perMessagePctChange": {
            "min": -45.8,
            "median": -28.1,
            "max": -8.3
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 29% fewer tokens than Japanese (o200k_base)"
    },
    {
      "code": "ko",
      "name": "Korean",
      "nativeName": "한국어",
      "messages": 12,
      "chars": 1077,
      "zhChars": 763,
      "wordsPerMessage": 20.5,
      "tokens": {
        "o200k_base": {
          "source": 581,
          "zh": 456,
          "ratioZhToSource": 0.785,
          "pctChange": -21.5,
          "perMessagePctChange": {
            "min": -31.2,
            "median": -22.5,
            "max": -4.7
          }
        },
        "cl100k_base": {
          "source": 879,
          "zh": 599,
          "ratioZhToSource": 0.681,
          "pctChange": -31.9,
          "perMessagePctChange": {
            "min": -42.7,
            "median": -33.8,
            "max": -12.7
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 22% fewer tokens than Korean (o200k_base)"
    },
    {
      "code": "vi",
      "name": "Vietnamese",
      "nativeName": "Tiếng Việt",
      "messages": 12,
      "chars": 1959,
      "zhChars": 763,
      "wordsPerMessage": 34.0,
      "tokens": {
        "o200k_base": {
          "source": 533,
          "zh": 456,
          "ratioZhToSource": 0.856,
          "pctChange": -14.4,
          "perMessagePctChange": {
            "min": -30.0,
            "median": -16.9,
            "max": 2.9
          }
        },
        "cl100k_base": {
          "source": 859,
          "zh": 599,
          "ratioZhToSource": 0.697,
          "pctChange": -30.3,
          "perMessagePctChange": {
            "min": -44.4,
            "median": -32.0,
            "max": -11.1
          }
        }
      },
      "chineseSavesTokens": true,
      "verdict": "Chinese uses 14% fewer tokens than Vietnamese (o200k_base)"
    },
    {
      "code": "en",
      "name": "English",
      "nativeName": "English",
      "messages": 12,
      "chars": 1953,
      "zhChars": 763,
      "wordsPerMessage": 27.9,
      "tokens": {
        "o200k_base": {
          "source": 405,
          "zh": 456,
          "ratioZhToSource": 1.126,
          "pctChange": 12.6,
          "perMessagePctChange": {
            "min": -2.8,
            "median": 10.7,
            "max": 28.1
          }
        },
        "cl100k_base": {
          "source": 407,
          "zh": 599,
          "ratioZhToSource": 1.472,
          "pctChange": 47.2,
          "perMessagePctChange": {
            "min": 12.5,
            "median": 48.5,
            "max": 96.9
          }
        }
      },
      "chineseSavesTokens": false,
      "verdict": "Chinese uses 13% MORE tokens than English (o200k_base) - no saving"
    }
  ]
}
