🌐 English · All languages
Réduisez votre facture Claude de 59 à 70 % en rendant le contexte volumineux sous forme de pages PNG denses — le même contenu, pour une fraction des tokens.
Les modèles facturent le texte au token, mais une image est facturée selon ses dimensions — pas selon la quantité de texte qu'elle contient.
Fait partie de la famille OmniRoute
| métrique | résultat | preuve |
|---|---|---|
| Réduction de facture de bout en bout | 59–70 % | trace de production, 13 709 requêtes |
| Tokens par bloc converti | 10× moins (28 080 caractères : 14 040 → 1 460 tokens) | billing sweep |
| Précision de la formule de facturation | résidu nul sur 22 sondages count_tokens, 2 modèles × 2 paliers |
benchmarks/billing-sweep/results/ |
| Précision de lecture exacte, config de production | 30/30 (100 %) sur Claude Fable 5 | density frontier |
| Confabulations silencieuses sur ~300 sondages de lecture | 0 — chaque échec s'abstient en ILEGIVEL |
benchmarks/density-frontier/results/ |
Tableau de bord des modèles (peut-il lire des rendus denses ? n=30 par bras, notation déterministe) :
| modèle | lecture | verdict |
|---|---|---|
| Claude Fable 5 | 100 % exact | ✅ cible de production |
| Claude Opus 4.8 | 77–87 % à 4× la taille de glyphe | |
| GPT-5.5 | 0/60 — et gonfle ses réponses ~40× en essayant | ❌ bloqué par le portail, avec preuve |
| Gemini 2.5-flash | 0/26 — et confabule au lieu de s'abstenir | ❌ bloqué (test partiel, limité par le quota) |
L'avantage est spécifique à Fable aujourd'hui — les autres encodeurs de vision ne résolvent pas encore les glyphes denses. Le harnais de benchmark retteste n'importe quel nouveau modèle en une seule commande.
Chaque session d'agent de longue durée traîne le même poids mort à chaque requête : le prompt système, la documentation des outils et l'ancien historique — refacturés au token, à chaque tour. OmniGlyph est un proxy local qui réécrit ces parties volumineuses en pages PNG denses avant qu'elles ne quittent votre machine :
- Mathématiques de facturation exactes, pas d'heuristiques — il calcule la formule réelle de tokens-image du fournisseur (mesurée à résidu nul) et ne convertit que lorsque le calcul est gagnant.
- Fail-closed par conception — les modèles incapables de lire des rendus denses sont bloqués par un portail, avec preuves de benchmark. Aucune perte de qualité silencieuse.
- Privé et local d'abord — la réécriture se fait sur
127.0.0.1; rien d'autre n'est envoyé où que ce soit. - Reproductible — chaque chiffre ci-dessus a une preuve dans
benchmarks/*/results/, ré-exécutable en une commande.
npx omniglyph # proxy on 127.0.0.1:47821
ANTHROPIC_BASE_URL=http://127.0.0.1:47821 claude # point Claude Code at itFonctionne dans les deux cas :
- Clé API (paiement au token) : votre facture baisse de 59 à 70 % de bout en bout.
- Session d'abonnement : vous ne payez pas moins, mais les limites d'utilisation sont comptées en tokens — vos limites s'étirent donc ~2 à 3×.
Tableau de bord sur http://127.0.0.1:47821/ : tokens économisés, chaque conversion texte→image côte à côte, interrupteur d'urgence, puces de modèles en direct. Les réponses sont diffusées normalement — seule la requête est compressée, jamais la sortie du modèle.
Start the proxy in one terminal, then point the client at it.
Claude Code CLI (macOS/Linux):
npx omniglyph
ANTHROPIC_BASE_URL=http://127.0.0.1:47821 claudeClaude Code CLI (Windows PowerShell):
npx omniglyph
$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:47821"
claudeClaude Desktop uses the same ANTHROPIC_BASE_URL environment variable for its bundled Claude Code runtime — start omniglyph first, then launch Claude Desktop from an environment where ANTHROPIC_BASE_URL is set to http://127.0.0.1:47821.
Un tableau de bord local complet est fourni dans le package — hors ligne, fichier unique, aucune requête externe. Six pages, mises à jour en direct via SSE au fil des requêtes :
- Vue d'ensemble — poste de contrôle : % d'économies, $ économisés, latence p95, cache hits, erreurs, flux en direct.
- Live Flow — le pipeline sous forme de graphe de nœuds : client → gate → renderer / passthrough → API, avec une particule par requête réelle.
- Télémétrie — un odomètre tokens/$ et une chronologie des requêtes en direct ; cliquez sur n'importe quelle requête pour voir exactement quelles parties sont devenues des images et lire le texte source derrière chaque page.
- Benchmarks — les reçus du harnais rendus à partir de
benchmarks/*/results/, une ligne par expérience modèle·configuration, et lancez les benchmarks depuis l'interface : les dry-runs à$0diffusent leur sortie en direct ; les runs réels restent verrouillés derrière votre clé API plus une confirmation explicite du coût. - Sessions / Historique — les sessions ayant économisé le plus de tokens et chaque événement sur disque.
| Live Flow | Benchmarks |
|---|---|
![]() |
![]() |
bulky request block ──► profitability gate ──► reflow + render (1-bit 5×8 atlas)
(exact billing math) ──► 1568×728 PNG pages ──► splice back, cache-friendly
- La facturation est calculée exactement, avant conversion : Anthropic facture
⌈w/28⌉ × ⌈h/28⌉ + 4tokens par image (patchs de 28 px — mesuré à résidu nul). Une page complète transporte 28 080 caractères pour 1 460 tokens ≈ 19 caractères/token, contre ~2 caractères/token pour du texte dense. Le portail ne convertit que lorsque le calcul est gagnant. - Ce qui est converti : le prompt système statique + la documentation des outils, l'ancien historique réduit, les sorties d'outils volumineuses.
- Ce qui n'est jamais converti : vos messages, les tours récents, la sortie du modèle, le texte peu dense, les valeurs exactes en octets (hashes/identifiants voyagent en texte à côté), et tout modèle ayant échoué au benchmark de lecture.
Tout ce que le proxy fait par requête est aussi disponible sous forme d'API documentée et importable :
import { renderTextToImages, transformAnthropicMessages } from "omniglyph";
// Render any text to dense 1-bit PNG pages
const { pages } = await renderTextToImages(bigToolOutput, { reflow: true });
// pages[i].png: Uint8Array · pages[i].width × pages[i].height
// Or run the full request transform yourself — gate, billing math and all
const { body, applied, reason } = await transformAnthropicMessages({
body: requestBytes, // the raw /v1/messages JSON body
model: "claude-fable-5",
});options.keepSharp(block) épingle des blocs en tant que texte ; options.emitRecoverable renvoie les originaux des blocs transformés en image. Les mathématiques de facturation exactes sont aussi exportées à la racine du paquet (anthropicImageTokens, resolveAnthropicVisionTier, openAIVisionTokens) — c'est ce que consomme OmniRoute. Runtime pur JS (Node et edge/Workers). Surface complète : src/core/index.ts.
Vous n'utilisez pas Claude Code ? Rendez le contexte sous forme de pages PNG localement et collez-les dans Cursor, ChatGPT ou n'importe quel chat acceptant l'envoi d'images. Aucun proxy, aucune clé API, aucun compte à configurer :
npx omniglyph export --include "*.ts" src/ # render a folder to image pages
cat big.log | npx omniglyph export --stdin # …or pipe any text throughVous obtenez un dossier unique contenant tout ce qu'il faut déposer dans le chat :
OmniGlyph-export-<hash>/
page-001.png … the rendered image pages — attach these
factsheet.txt verbatim precision tokens (paths, SHAs, ids, numbers)
prompt.txt a paste-ready instruction that points the model at the pages
manifest.json metadata + the text-vs-image token report (% saved)
--git rend votre diff non commité, --diff <ref> une plage de commits, --open révèle le dossier (macOS). Tout s'exécute sur votre machine — le chemin d'export ne démarre jamais le proxy et n'appelle jamais de modèle. Lancez omniglyph export --help pour connaître toutes les options.
- C'est avec perte. Le rappel exact en octets à partir d'images est intrinsèquement peu fiable. Mesures d'atténuation mises en place : les identifiants exacts voyagent en texte à côté de l'image, et la configuration de production mesurée n'a produit zéro confabulation silencieuse — les lectures échouées s'abstiennent.
- Seul Fable 5 est approuvé aujourd'hui, avec preuves. GPT-5.5 et Gemini 2.5-flash ne peuvent mesurablement pas lire les rendus denses ; Opus 4.8 a besoin de glyphes 4× plus grands. Le portail applique cela.
- Nous avons trouvé et évité un piège de facturation : le palier d'image haute résolution facture 3,3× plus par page, mais l'encodeur de vision ne reçoit pas la résolution supplémentaire — les pages plus grandes se lisent moins bien. Mesuré, documenté dans docs/benchmarks/BENCHMARKS.md, non activé.
- Les prix changent ; la métrique durable est la réduction de tokens, que le proxy consigne par requête face à un contrefactuel
count_tokensgratuit.
Je l'ai activé en cours de session et ma consommation a explosé — pourquoi ? Une session lancée sans OmniGlyph a tout son préfixe mis en cache par Anthropic sous forme de texte au tarif de lecture de 0,1× ; la première requête imagée repaierait tout cela comme une nouvelle écriture de cache à 1,25× en un seul prompt. Le proxy s'en protège : une session qu'il n'a jamais imagée injecte ce coût unique dans le gate de rentabilité et ne bascule vers les images que si cela reste gagnant — sinon la session reste en texte et les économies commencent à votre prochaine session.
Le 59–70 % est-il de bout en bout, ou seulement sur les requêtes touchées ? De bout en bout — la facture entière. La plupart des outils de compression ne rapportent des économies que sur la tranche qu'ils ont touchée, ce qui enjolive le chiffre. Notre dénominateur est chaque requête : les petites que le portail a correctement laissées intactes, toutes les écritures et lectures de cache, et tous les tokens de sortie (que le proxy ne compresse jamais). Le chiffre « compressé uniquement » est plus élevé et cité séparément, jamais comme titre.
Comment l'économie est-elle mesurée ?
Les deux côtés de la même requête, au même moment. Pour chaque POST /v1/messages, le proxy déclenche un sondage count_tokens gratuit sur le corps original non compressé (le contrefactuel) en parallèle de l'envoi réel, et lit le bloc d'utilisation réellement facturé par le fournisseur dans la réponse — les deux atterrissent dans la même ligne d'événement. La tarification du cache est appliquée identiquement des deux côtés, si bien que la remise de cache s'annule et ne peut pas être comptée deux fois comme « économie ». La formule se trouve dans src/core/baseline.ts ; redérivez-la depuis votre propre journal d'événements.
Pourquoi une erreur de lecture serait-elle une confabulation plutôt qu'une simple erreur ? Parce que la vision des modèles n'est pas de l'OCR : la page devient des plongements de patchs, jamais des caractères discrets, donc il n'existe pas de confiance par glyphe pouvant échouer bruyamment — quand les pixels sous-déterminent un glyphe, l'a priori linguistique comble le vide avec quelque chose de plausible. C'est exactement ce mécanisme qui rend OmniGlyph fail-closed à ce sujet : les valeurs exactes en octets voyagent toujours en texte à côté de l'image, les modèles qui lisent mal sont bloqués par le portail, et la configuration de production mesurée n'a produit zéro confabulation silencieuse sur ~300 sondages de lecture — les lectures échouées s'abstiennent.
Qu'en est-il du travail exact en octets (hashes, identifiants, secrets) ? Les tours récents et les identifiants exacts restent en texte par conception. Pour les charges de travail entièrement exactes en octets, dirigez-les vers un modèle hors liste blanche (par exemple un sous-agent sur un autre modèle Claude) — tout ce qui est hors liste blanche passe intact, octet pour octet.
DeepSeek-OCR n'a-t-il pas réglé la question de savoir si cela fonctionne ? Il a prouvé que le canal fonctionne — avec une paire encodeur/décodeur entraînée pour cette tâche. Le scepticisme date d'une époque où aucun modèle de production standard ne pouvait lire des rendus denses ; ce n'est plus le cas, et le tableau de bord des modèles ci-dessus montre précisément qui les lit aujourd'hui, preuves à l'appui. Le harnais de benchmark reteste n'importe quel nouveau modèle en une seule commande — le portail suit les données, pas le battage médiatique.
Puis-je l'utiliser sans Claude Code — Cursor, ChatGPT, un simple pipe ?
Oui, de deux façons. En tant que proxy, il fonctionne avec tout client qui permet de définir l'URL de base de l'API (ANTHROPIC_BASE_URL, ou l'URL de base d'OpenAI) — Claude Code, vos propres scripts, tout ce qui parle HTTP. Et pour les outils qui ne peuvent pas passer par un proxy, l'Export hors ligne ci-dessus rend le contexte sous forme de pages PNG que vous collez à la main — omniglyph export --stdin lit même directement depuis un pipe Unix.
Comment transforme-t-il concrètement le texte en image ? Il refait la mise en page (reflow) du texte et le peint avec un atlas de glyphes 1-bit de 5×8 pixels sur des pages PNG denses de 1568×728 — un bit par pixel, sans anticrénelage, si bien que le modèle facture la page selon ses dimensions, et non selon le nombre de caractères qu'elle contient. Fonctionnement ci-dessus détaille le pipeline ; la doc des benchmarks donne la géométrie et explique pourquoi plus dense n'est pas toujours moins cher.
pnpm install && pnpm test # full suite
node benchmarks/billing-sweep/run.mjs --dry-run # billing predictions, $0
pnpm exec tsx benchmarks/density-frontier/run.ts --dry-run # cost table, $0
# with keys: ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY (or --via-cli for a Claude Code subscription)Méthodologie complète et chaque tableau de résultats : docs/benchmarks/BENCHMARKS.md. Preuves brutes par réponse : benchmarks/*/results/*.jsonl.
OmniGlyph est aussi livré comme moteur de compression natif au sein d'OmniRoute — la passerelle IA gratuite. Il y fonctionne comme moteur omniglyph (mode autonome ou empilé avec les autres moteurs), avec des portails fail-closed et une comptabilité de tokens consciente des images.
| couche | technologie |
|---|---|
| Langage | TypeScript (strict), ESM |
| Runtime | Node ≥18 · Cloudflare Workers (wrangler.toml) |
| Rendu | atlas de glyphes 1-bit maison (dérivé de Spleen/Unifont, licences dans assets/) → PNG |
| Tests | Vitest — TDD, plus des garde-fous d'intégrité de docs et de rebranding |
| Benchmarks | harnais benchmarks/ (billing-sweep, density-frontier) avec preuves JSONL |
| chemin | contenu |
|---|---|
src/ |
le proxy : pipeline de transformation, facturation exacte par fournisseur, moteur de rendu, hôtes (Node + Cloudflare Workers) |
benchmarks/ |
les harnais qui ont produit chaque chiffre ci-dessus — ré-exécutables |
docs/ |
BENCHMARKS · ARCHITECTURE · ROADMAP |
- 🐛 Issues — bugs et demandes de fonctionnalités
- 🔒 SECURITY.md — signalements de vulnérabilités
- 🤝 CONTRIBUTING.md — TDD strict + mesure avant affirmation
- 📜 CHANGELOG.md · CODE_OF_CONDUCT.md
OmniGlyph repose sur les épaules d'un projet en particulier — cette section est notre remerciement permanent.
| Projet | Comment il a façonné OmniGlyph |
|---|---|
| pxpipe · teamchong | La découverte sur laquelle repose tout ce projet. pxpipe a prouvé, preuves à l'appui, que le canal de vision d'un LLM de production peut transporter un contexte textuel dense pour une fraction du coût en tokens — et que la conversion doit être décidée requête par requête par un calcul de facturation exact, jamais au feeling. Le rendu 1-bit dense, le portail de rentabilité, le contrefactuel count_tokens, la liste blanche de modèles fail-closed, et la culture documentaire « mesurer avant d'affirmer » ont tous été inaugurés là-bas. OmniGlyph descend directement de cette base de code (MIT — la ligne de copyright d'origine reste dans notre LICENSE). |
| Spleen · Frederic Cambus | La famille de police bitmap 5×8 dont dérive notre atlas de glyphes 1-bit dense (licence dans assets/). |
| GNU Unifont · Unifoundry | Couverture des glyphes au-delà de la portée de Spleen dans le même atlas (licence dans assets/). |
Si vous trouvez OmniGlyph utile, allez aussi mettre une étoile au projet d'origine — la découverte était la leur. 🙏
MIT — voir LICENSE.





