SPB Git

adopt: état déployé sur M4M64c adopté comme source de vérité (remote-first, 2026-11-01)

mld committed (Nov 1, 2026) Browse files

31 changed files +20,001 −0

added .env.example +12 −0
@@ -0,0 +1,12 @@
1+# Chat SPBoucher AI — copy to .env.local (dev) or .env.production (node). Never commit real values.
2+DATABASE_URL=postgres://chat_spb:CHANGE_ME@127.0.0.1:5432/chat_spboucher
3+SESSION_SECRET=CHANGE_ME_64_hex_chars # openssl rand -hex 32
4+DATA_DIR=./data # uploads + generated files (mode 600)
5+OPENAI_API_KEY=
6+ANTHROPIC_API_KEY=
7+TAVILY_API_KEY= # optional: web search / page extraction tools
8+PYTHON_BIN=python3 # sandboxed python tool
9+APP_URL=https://chat.spboucher.ai
10+SESSION_TTL_DAYS=30
11+MAX_UPLOAD_MB=50
12+BENCHMARKS_DIR=./benchmarks
added .env.production +12 −0
@@ -0,0 +1,12 @@
1+NODE_ENV=production
2+PORT=8500
3+HOSTNAME=0.0.0.0
4+DATABASE_URL=postgres://chat_spb:5efb1a670099bf3ba7584d379634b8d2a2a74ddfe270982b@127.0.0.1:5432/chat_spboucher
5+SESSION_SECRET=616e8f5bc0ff53785292f78d11536c95b68cb8ddf82d0c98db12f4a0ef333e22
6+DATA_DIR=/Users/simon-pierreboucher/apps/chat-spboucher-ai/data
7+OPENAI_API_KEY=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
8+ANTHROPIC_API_KEY=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
9+TAVILY_API_KEY=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
10+PYTHON_BIN=/opt/homebrew/bin/python3
11+APP_URL=https://chat.spboucher.ai
12+BENCHMARKS_DIR=/Users/simon-pierreboucher/apps/chat-spboucher-ai/benchmarks
added .gitignore +9 −0
@@ -0,0 +1,9 @@
1+node_modules
2+.env
3+.env.local
4+.env.*.local
5+.next
6+data/
7+uploads/
8+*.log
9+.DS_Store
added .mldignore +9 −0
@@ -0,0 +1,9 @@
1+node_modules/
2+.next/
3+data/
4+.env
5+.env.local
6+.env.production
7+e2e-shots/
8+tsconfig.tsbuildinfo
9+.DS_Store
added AGENTS.md +9 −0
@@ -0,0 +1,9 @@
1+<!-- BEGIN:nextjs-agent-rules -->
2+
3+## This is NOT the Next.js you know
4+
5+This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6+
7+This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8+
9+<!-- END:nextjs-agent-rules -->
added README.md +62 −0
@@ -0,0 +1,62 @@
1+# Chat SPBoucher AI
2+
3+Interface privée, multi-modèles et multimodale de Simon-Pierre Boucher — **https://chat.spboucher.ai** — déployée sur le cluster MacLustr (nœud M4M64c, PostgreSQL 17 + pgvector, MacLustr Tunnel via BHS64).
4+
5+> Un seul propriétaire. Tous les modèles OpenAI et Anthropic **vérifiés par requête réelle**. Mémoire persistante. Contrôle complet.
6+
7+## Phase zéro — ce qui a été vérifié avant de coder
8+
9+| | OpenAI | Anthropic |
10+|---|---|---|
11+| Modèles listés par l'API du compte | 140 | 14 |
12+| Modèles de chat vérifiés (11 tests réels chacun) | 30 | 14 |
13+| Listés mais **indisponibles** (404 « deprecated ») | 23 | 0 |
14+| Spécialisés vérifiés (image / TTS / STT / embeddings / modération) | 18 | — |
15+| Non exercés (realtime, vidéo, deep-research, completions) | 18 | — |
16+
17+Livrables dans `benchmarks/` : `model-discovery.json`, `openai-results.json`, `anthropic-results.json`, `modality-results.json`, `capability-matrix.json`, `pricing.json` (prix copiés des pages officielles le 2026-11-01), `benchmark-report.md`, `routing-recommendations.md`. Coût total du benchmark : ≈ 2,45 $. Relancer : `pnpm bench:discover && pnpm bench && pnpm bench:modalities && pnpm bench:report && pnpm registry:refresh`.
18+
19+Le **laboratoire de modèles** (`/models`) affiche ces données ; le **routeur** (`src/lib/ai/router.ts`) ne choisit jamais un modèle non vérifié.
20+
21+## Architecture
22+
23+```
24+Internet → BHS64 (Caddy TLS, WireGuard) → M4M64c:8500 Next.js 16 (App Router, React 19)
25+ ├─ src/proxy.ts garde de session (cookie httpOnly SameSite=Strict)
26+ ├─ src/lib/auth.ts Argon2id, sessions révocables, rate-limit, Origin check
27+ ├─ src/lib/ai/ adapters OpenAI (Responses API) & Anthropic (Messages, adaptive thinking,
28+ │ fallback serveur), registre, routeur, coûts
29+ ├─ src/lib/chat/ moteur (streaming SSE, boucle d'outils, approbation, mémoire, titre, artefacts)
30+ ├─ src/lib/tools/ web_search (Tavily), fetch_page, python (sandbox-exec), search_documents (RAG),
31+ │ generate_image (gpt-image), save_memory
32+ ├─ src/lib/research/ recherche approfondie (plan → sources → extraction → synthèse citée)
33+ └─ PostgreSQL 17 + pgvector : conversations, messages (arbre), pièces jointes, chunks, mémoire,
34+ artefacts, usage_events, comparisons, research_runs, tool_executions
35+```
36+
37+## Développement
38+
39+```bash
40+pnpm install
41+cp .env.example .env.local # puis remplir (clés API, DATABASE_URL local, SESSION_SECRET)
42+createdb chat_spboucher && psql chat_spboucher -c 'CREATE EXTENSION vector'
43+pnpm db:migrate # db/migrations/*.sql
44+pnpm registry:refresh # charge les modèles (listing live + benchmarks)
45+pnpm setup:owner # mot de passe du propriétaire (prompt masqué → hash Argon2id)
46+pnpm dev # http://localhost:8500
47+node scripts/e2e/smoke.mjs # test navigateur (Playwright) : login, chat, palette, mobile
48+```
49+
50+## Production (MacLustr)
51+
52+Suivre `docs/OPERATIONS.md` : manifeste `mld` (`deploy/mld-manifest.json` → `M1M32:~/dispatch/apps/chat-spboucher-ai.json`), `mld deploy chat-spboucher-ai --node M4M64c`, route tunnel `chat.spboucher.ai`, sauvegardes chiffrées nocturnes (`scripts/backup.sh`, restauration `scripts/restore.sh`), rafraîchissement du catalogue à 05 h 17.
53+
54+La source de vérité du code est le dépôt git **sur le nœud** (`M4M64c:~/apps/chat-spboucher-ai`, origin = spbgit `chat-spboucher-ai.git`) — règle remote-first MacLustr.
55+
56+## Sécurité
57+
58+- Accès privé : aucune inscription, un seul propriétaire, Argon2id (64 Mio, t=3), 5 échecs / 15 min par IP puis blocage, sessions révocables, `Clear-Site-Data` au logout.
59+- Secrets uniquement dans `.env.production` (mode 600) et le manifeste `mld` ; jamais dans git. La clé Anthropic collée dans le chat de conception renvoyait 401 : la clé du compte déjà utilisée par les autres apps a été employée (voir `~/Desktop/Cluster/secrets/chat-spboucher-ai.env`).
60+- Outils : Python exécuté sous `sandbox-exec` (pas de réseau, répertoire jetable, 20 s) ; `fetch_page` refuse les adresses privées ; les artefacts HTML/React s'affichent dans un iframe `sandbox="allow-scripts"` sans origine partagée.
61+- Mémoire : refus automatique des contenus ressemblant à des identifiants ; approbation optionnelle ; export/suppression.
62+- Limites de dépenses locales (jour / mois) qui bloquent les nouvelles requêtes ; la facturation réelle des fournisseurs peut différer.
added benchmarks/anthropic-results.json +2854 −0
@@ -0,0 +1,2854 @@
1+{
2+ "generatedAt": "2026-11-01T07:18:11.433Z",
3+ "provider": "anthropic",
4+ "budgetUsd": 2,
5+ "stoppedByBudget": false,
6+ "models": {
7+ "claude-fable-5": {
8+ "provider": "anthropic",
9+ "kind": "chat",
10+ "tests": [
11+ {
12+ "test": "basic",
13+ "ok": true,
14+ "latencyMs": 2147,
15+ "ttftMs": 2137,
16+ "usage": {
17+ "input": 24,
18+ "output": 7,
19+ "cachedInput": 0
20+ },
21+ "api": "messages",
22+ "raw": {
23+ "stop": "end_turn",
24+ "stop_details": null
25+ },
26+ "sample": "Ottawa",
27+ "costUsd": 0.00059
28+ },
29+ {
30+ "test": "reasoning",
31+ "ok": true,
32+ "latencyMs": 3160,
33+ "ttftMs": 1963,
34+ "usage": {
35+ "input": 65,
36+ "output": 140,
37+ "cachedInput": 0
38+ },
39+ "api": "messages",
40+ "raw": {
41+ "stop": "end_turn",
42+ "stop_details": null
43+ },
44+ "sample": "Alice's family includes:\n- Alice (a girl)\n- 3 brothers\n- 2 sisters\n\nFrom the perspective of each brother, his sisters are all the girls in the family. That means Alice's 2 sisters **plus Alice herself**.\n\nSo each brother has 2 + 1 = 3 sisters.\n\nANSWER: 3",
45+ "costUsd": 0.00765
46+ },
47+ {
48+ "test": "math",
49+ "ok": true,
50+ "latencyMs": 2291,
51+ "ttftMs": 1862,
52+ "usage": {
53+ "input": 70,
54+ "output": 46,
55+ "cachedInput": 0
56+ },
57+ "api": "messages",
58+ "raw": {
59+ "stop": "end_turn",
60+ "stop_details": null
61+ },
62+ "sample": "a=403;b=2500",
63+ "costUsd": 0.003
64+ },
65+ {
66+ "test": "code",
67+ "ok": true,
68+ "latencyMs": 2565,
69+ "ttftMs": 1602,
70+ "usage": {
71+ "input": 68,
72+ "output": 110,
73+ "cachedInput": 0
74+ },
75+ "api": "messages",
76+ "raw": {
77+ "stop": "end_turn",
78+ "stop_details": null
79+ },
80+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0) return false;\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
81+ "costUsd": 0.00618
82+ },
83+ {
84+ "test": "french",
85+ "ok": true,
86+ "latencyMs": 2786,
87+ "ttftMs": 853,
88+ "usage": {
89+ "input": 49,
90+ "output": 174,
91+ "cachedInput": 0
92+ },
93+ "api": "messages",
94+ "raw": {
95+ "stop": "end_turn",
96+ "stop_details": null
97+ },
98+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction ou de remplacement du bâtiment, duquel on déduit la dépréciation liée à l'âge, à l'usure et à l'obsolescence. Elle est particulièrement utilisée pour ",
99+ "costUsd": 0.00919
100+ },
101+ {
102+ "test": "english",
103+ "ok": true,
104+ "latencyMs": 3132,
105+ "ttftMs": 1790,
106+ "usage": {
107+ "input": 29,
108+ "output": 124,
109+ "cachedInput": 0
110+ },
111+ "api": "messages",
112+ "raw": {
113+ "stop": "end_turn",
114+ "stop_details": null
115+ },
116+ "sample": "A hedonic pricing model is an economic method that estimates the value of a good by breaking it down into its individual characteristics and determining how much each attribute contributes to the overall price. It is most commonly used in real estate, where a home's price is modeled as a function of",
117+ "costUsd": 0.00649
118+ },
119+ {
120+ "test": "json",
121+ "ok": true,
122+ "latencyMs": 2691,
123+ "ttftMs": 2144,
124+ "usage": {
125+ "input": 69,
126+ "output": 77,
127+ "cachedInput": 0
128+ },
129+ "api": "messages",
130+ "raw": {
131+ "stop": "end_turn",
132+ "stop_details": null
133+ },
134+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
135+ "costUsd": 0.00454
136+ },
137+ {
138+ "test": "tools",
139+ "ok": true,
140+ "latencyMs": 2758,
141+ "ttftMs": 1765,
142+ "usage": {
143+ "input": 415,
144+ "output": 75,
145+ "cachedInput": 0
146+ },
147+ "api": "messages",
148+ "raw": {
149+ "stop": "tool_use",
150+ "stop_details": null
151+ },
152+ "sample": "I'll check the current weather in Gatineau for you.",
153+ "costUsd": 0.0079
154+ },
155+ {
156+ "test": "vision",
157+ "ok": true,
158+ "latencyMs": 2103,
159+ "ttftMs": 1532,
160+ "usage": {
161+ "input": 217,
162+ "output": 10,
163+ "cachedInput": 0
164+ },
165+ "api": "messages",
166+ "raw": {
167+ "stop": "end_turn",
168+ "stop_details": null
169+ },
170+ "sample": "circles=3; other=square",
171+ "costUsd": 0.00267
172+ },
173+ {
174+ "test": "longctx",
175+ "ok": true,
176+ "latencyMs": 2350,
177+ "ttftMs": 1876,
178+ "usage": {
179+ "input": 15022,
180+ "output": 10,
181+ "cachedInput": 0
182+ },
183+ "api": "messages",
184+ "raw": {
185+ "stop": "end_turn",
186+ "stop_details": null
187+ },
188+ "sample": "7431-ALPHA",
189+ "costUsd": 0.15072
190+ },
191+ {
192+ "test": "streaming",
193+ "ok": true,
194+ "latencyMs": 3054,
195+ "ttftMs": 1882,
196+ "usage": {
197+ "input": 21,
198+ "output": 70,
199+ "cachedInput": 0
200+ },
201+ "api": "messages",
202+ "raw": {
203+ "stop": "end_turn",
204+ "stop_details": null
205+ },
206+ "sample": "**Winter in Quebec**\n\nSnow blankets old streets,\nfrost paints the Château's windows—\nwoodsmoke warms the night.",
207+ "costUsd": 0.00371
208+ }
209+ ]
210+ },
211+ "claude-fable-5-1": {
212+ "provider": "anthropic",
213+ "kind": "chat",
214+ "tests": [
215+ {
216+ "test": "basic",
217+ "ok": true,
218+ "latencyMs": 769,
219+ "ttftMs": 766,
220+ "usage": {
221+ "input": 26,
222+ "output": 7,
223+ "cachedInput": 0
224+ },
225+ "api": "messages",
226+ "raw": {
227+ "stop": "end_turn",
228+ "stop_details": null
229+ },
230+ "sample": "Ottawa",
231+ "costUsd": 0.00061
232+ },
233+ {
234+ "test": "reasoning",
235+ "ok": true,
236+ "latencyMs": 1321,
237+ "ttftMs": 353,
238+ "usage": {
239+ "input": 67,
240+ "output": 71,
241+ "cachedInput": 0
242+ },
243+ "api": "messages",
244+ "raw": {
245+ "stop": "end_turn",
246+ "stop_details": null
247+ },
248+ "sample": "Alice has 2 sisters, and Alice herself is also a sister to her brothers. So each brother has Alice plus her 2 sisters as sisters.\n\n2 + 1 = 3\n\nANSWER: 3",
249+ "costUsd": 0.00422
250+ },
251+ {
252+ "test": "math",
253+ "ok": true,
254+ "latencyMs": 808,
255+ "ttftMs": 364,
256+ "usage": {
257+ "input": 72,
258+ "output": 10,
259+ "cachedInput": 0
260+ },
261+ "api": "messages",
262+ "raw": {
263+ "stop": "end_turn",
264+ "stop_details": null
265+ },
266+ "sample": "a=403;b=2500",
267+ "costUsd": 0.00122
268+ },
269+ {
270+ "test": "code",
271+ "ok": true,
272+ "latencyMs": 1489,
273+ "ttftMs": 386,
274+ "usage": {
275+ "input": 70,
276+ "output": 138,
277+ "cachedInput": 0
278+ },
279+ "api": "messages",
280+ "raw": {
281+ "stop": "end_turn",
282+ "stop_details": null
283+ },
284+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
285+ "costUsd": 0.0076
286+ },
287+ {
288+ "test": "french",
289+ "ok": true,
290+ "latencyMs": 1990,
291+ "ttftMs": 344,
292+ "usage": {
293+ "input": 51,
294+ "output": 176,
295+ "cachedInput": 0
296+ },
297+ "api": "messages",
298+ "raw": {
299+ "stop": "end_turn",
300+ "stop_details": null
301+ },
302+ "sample": "La méthode du coût est une approche d'évaluation immobilière qui estime la valeur d'un bien en additionnant la valeur du terrain à la valeur de reconstruction (ou de remplacement) du bâtiment, puis en déduisant la dépréciation liée à l'usure physique, à l'obsolescence fonctionnelle ou économique. El",
303+ "costUsd": 0.00931
304+ },
305+ {
306+ "test": "english",
307+ "ok": true,
308+ "latencyMs": 2732,
309+ "ttftMs": 339,
310+ "usage": {
311+ "input": 31,
312+ "output": 156,
313+ "cachedInput": 0
314+ },
315+ "api": "messages",
316+ "raw": {
317+ "stop": "end_turn",
318+ "stop_details": null
319+ },
320+ "sample": "A hedonic pricing model is an economic method that estimates the value of a good by breaking its price down into the implicit prices of its individual characteristics, based on the idea that buyers pay for a bundle of attributes rather than the item as a whole. For example, in real estate, a home's ",
321+ "costUsd": 0.00811
322+ },
323+ {
324+ "test": "json",
325+ "ok": true,
326+ "latencyMs": 855,
327+ "ttftMs": 318,
328+ "usage": {
329+ "input": 71,
330+ "output": 41,
331+ "cachedInput": 0
332+ },
333+ "api": "messages",
334+ "raw": {
335+ "stop": "end_turn",
336+ "stop_details": null
337+ },
338+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
339+ "costUsd": 0.00276
340+ },
341+ {
342+ "test": "tools",
343+ "ok": true,
344+ "latencyMs": 1380,
345+ "usage": {
346+ "input": 413,
347+ "output": 57,
348+ "cachedInput": 0
349+ },
350+ "api": "messages",
351+ "raw": {
352+ "stop": "tool_use",
353+ "stop_details": null
354+ },
355+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
356+ "costUsd": 0.00698
357+ },
358+ {
359+ "test": "vision",
360+ "ok": true,
361+ "latencyMs": 749,
362+ "ttftMs": 406,
363+ "usage": {
364+ "input": 219,
365+ "output": 10,
366+ "cachedInput": 0
367+ },
368+ "api": "messages",
369+ "raw": {
370+ "stop": "end_turn",
371+ "stop_details": null
372+ },
373+ "sample": "circles=3; other=square",
374+ "costUsd": 0.00269
375+ },
376+ {
377+ "test": "longctx",
378+ "ok": true,
379+ "latencyMs": 2357,
380+ "ttftMs": 2292,
381+ "usage": {
382+ "input": 15024,
383+ "output": 148,
384+ "cachedInput": 0
385+ },
386+ "api": "messages",
387+ "raw": {
388+ "stop": "end_turn",
389+ "stop_details": null
390+ },
391+ "sample": "7431-ALPHA",
392+ "costUsd": 0.15764
393+ },
394+ {
395+ "test": "streaming",
396+ "ok": true,
397+ "latencyMs": 1001,
398+ "ttftMs": 343,
399+ "usage": {
400+ "input": 23,
401+ "output": 38,
402+ "cachedInput": 0
403+ },
404+ "api": "messages",
405+ "raw": {
406+ "stop": "end_turn",
407+ "stop_details": null
408+ },
409+ "sample": "Snow buries the stairs—\nspiral iron, white and still,\nthe Saint Lawrence sleeps.",
410+ "costUsd": 0.00213
411+ }
412+ ]
413+ },
414+ "claude-haiku-4-5-20251001": {
415+ "provider": "anthropic",
416+ "kind": "chat",
417+ "tests": [
418+ {
419+ "test": "basic",
420+ "ok": true,
421+ "latencyMs": 589,
422+ "ttftMs": 587,
423+ "usage": {
424+ "input": 20,
425+ "output": 4,
426+ "cachedInput": 0
427+ },
428+ "api": "messages",
429+ "raw": {
430+ "stop": "end_turn",
431+ "stop_details": null
432+ },
433+ "sample": "Ottawa",
434+ "costUsd": 0.00004
435+ },
436+ {
437+ "test": "reasoning",
438+ "ok": true,
439+ "latencyMs": 1927,
440+ "ttftMs": 377,
441+ "usage": {
442+ "input": 48,
443+ "output": 163,
444+ "cachedInput": 0
445+ },
446+ "api": "messages",
447+ "raw": {
448+ "stop": "end_turn",
449+ "stop_details": null
450+ },
451+ "sample": "Let me think through this step by step.\n\nAlice has:\n- 3 brothers\n- 2 sisters\n\nThis means in Alice's family, there are:\n- Alice (1 girl)\n- Alice's 2 sisters (2 more girls)\n- Alice's 3 brothers (3 boys)\n\nSo the total number of girls in the family is: Alice + her 2 sisters = 3 girls\n\nEach of Alice's br",
452+ "costUsd": 0.000863
453+ },
454+ {
455+ "test": "math",
456+ "ok": true,
457+ "latencyMs": 494,
458+ "ttftMs": 369,
459+ "usage": {
460+ "input": 58,
461+ "output": 11,
462+ "cachedInput": 0
463+ },
464+ "api": "messages",
465+ "raw": {
466+ "stop": "end_turn",
467+ "stop_details": null
468+ },
469+ "sample": "a=403;b=2500",
470+ "costUsd": 0.000113
471+ },
472+ {
473+ "test": "code",
474+ "ok": true,
475+ "latencyMs": 1279,
476+ "ttftMs": 578,
477+ "usage": {
478+ "input": 50,
479+ "output": 130,
480+ "cachedInput": 0
481+ },
482+ "api": "messages",
483+ "raw": {
484+ "stop": "end_turn",
485+ "stop_details": null
486+ },
487+ "sample": "\n```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n \n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n \n return true;\n}\n```",
488+ "costUsd": 0.0007
489+ },
490+ {
491+ "test": "french",
492+ "ok": true,
493+ "latencyMs": 1354,
494+ "ttftMs": 389,
495+ "usage": {
496+ "input": 40,
497+ "output": 110,
498+ "cachedInput": 0
499+ },
500+ "api": "messages",
501+ "raw": {
502+ "stop": "end_turn",
503+ "stop_details": null
504+ },
505+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant le coût du terrain et celui de la reconstruction du bâtiment à neuf, puis en soustrayant la dépréciation liée à l'âge et l'usure. Cette approche est particulièrement utilisée pour les propriétés neuve",
506+ "costUsd": 0.00059
507+ },
508+ {
509+ "test": "english",
510+ "ok": true,
511+ "latencyMs": 1119,
512+ "ttftMs": 377,
513+ "usage": {
514+ "input": 21,
515+ "output": 66,
516+ "cachedInput": 0
517+ },
518+ "api": "messages",
519+ "raw": {
520+ "stop": "end_turn",
521+ "stop_details": null
522+ },
523+ "sample": "A hedonic pricing model is a statistical technique that decomposes the price of a good into its constituent characteristics and estimates the value attributable to each feature. It's commonly used in real estate to determine how factors like square footage, location, and number of bedrooms individua",
524+ "costUsd": 0.000351
525+ },
526+ {
527+ "test": "json",
528+ "ok": true,
529+ "latencyMs": 692,
530+ "ttftMs": 438,
531+ "usage": {
532+ "input": 56,
533+ "output": 48,
534+ "cachedInput": 0
535+ },
536+ "api": "messages",
537+ "raw": {
538+ "stop": "end_turn",
539+ "stop_details": null
540+ },
541+ "sample": "```json\n{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 282000\n}\n```",
542+ "costUsd": 0.000296
543+ },
544+ {
545+ "test": "tools",
546+ "ok": true,
547+ "latencyMs": 1949,
548+ "usage": {
549+ "input": 595,
550+ "output": 59,
551+ "cachedInput": 0
552+ },
553+ "api": "messages",
554+ "raw": {
555+ "stop": "tool_use",
556+ "stop_details": null
557+ },
558+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
559+ "costUsd": 0.00089
560+ },
561+ {
562+ "test": "vision",
563+ "ok": true,
564+ "latencyMs": 487,
565+ "ttftMs": 402,
566+ "usage": {
567+ "input": 211,
568+ "output": 10,
569+ "cachedInput": 0
570+ },
571+ "api": "messages",
572+ "raw": {
573+ "stop": "end_turn",
574+ "stop_details": null
575+ },
576+ "sample": "circles=3; other=square",
577+ "costUsd": 0.000261
578+ },
579+ {
580+ "test": "longctx",
581+ "ok": true,
582+ "latencyMs": 607,
583+ "ttftMs": 542,
584+ "usage": {
585+ "input": 11100,
586+ "output": 9,
587+ "cachedInput": 0
588+ },
589+ "api": "messages",
590+ "raw": {
591+ "stop": "end_turn",
592+ "stop_details": null
593+ },
594+ "sample": "7431-ALPHA",
595+ "costUsd": 0.011145
596+ },
597+ {
598+ "test": "streaming",
599+ "ok": true,
600+ "latencyMs": 699,
601+ "ttftMs": 405,
602+ "usage": {
603+ "input": 16,
604+ "output": 30,
605+ "cachedInput": 0
606+ },
607+ "api": "messages",
608+ "raw": {
609+ "stop": "end_turn",
610+ "stop_details": null
611+ },
612+ "sample": "# Winter in Quebec\n\nSnow blankets the pines,\nMontreal's streets fall silent—\nFrost paints frozen dreams.",
613+ "costUsd": 0.000166
614+ }
615+ ]
616+ },
617+ "claude-haiku-5-5": {
618+ "provider": "anthropic",
619+ "kind": "chat",
620+ "tests": [
621+ {
622+ "test": "basic",
623+ "ok": true,
624+ "latencyMs": 702,
625+ "ttftMs": 695,
626+ "usage": {
627+ "input": 26,
628+ "output": 7,
629+ "cachedInput": 0
630+ },
631+ "api": "messages",
632+ "raw": {
633+ "stop": "end_turn",
634+ "stop_details": null
635+ },
636+ "sample": "Ottawa",
637+ "costUsd": 0.0000061
638+ },
639+ {
640+ "test": "reasoning",
641+ "ok": true,
642+ "latencyMs": 1564,
643+ "ttftMs": 1099,
644+ "usage": {
645+ "input": 67,
646+ "output": 230,
647+ "cachedInput": 0
648+ },
649+ "api": "messages",
650+ "raw": {
651+ "stop": "end_turn",
652+ "stop_details": null
653+ },
654+ "sample": "Alice is a girl, so she is also a sister to her brothers. Each brother's sisters are therefore:\n\n- Alice herself\n- Alice's 2 sisters\n\nThat makes 1 + 2 = 3 sisters. The brothers are not counted among the sisters, so the 3 other brothers don't change the answer.\n\nANSWER: 3",
655+ "costUsd": 0.0001217
656+ },
657+ {
658+ "test": "math",
659+ "ok": true,
660+ "latencyMs": 732,
661+ "ttftMs": 702,
662+ "usage": {
663+ "input": 72,
664+ "output": 66,
665+ "cachedInput": 0
666+ },
667+ "api": "messages",
668+ "raw": {
669+ "stop": "end_turn",
670+ "stop_details": null
671+ },
672+ "sample": "a=403;b=2500",
673+ "costUsd": 0.0000402
674+ },
675+ {
676+ "test": "code",
677+ "ok": true,
678+ "latencyMs": 883,
679+ "ttftMs": 333,
680+ "usage": {
681+ "input": 70,
682+ "output": 126,
683+ "cachedInput": 0
684+ },
685+ "api": "messages",
686+ "raw": {
687+ "stop": "end_turn",
688+ "stop_details": null
689+ },
690+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
691+ "costUsd": 0.00007
692+ },
693+ {
694+ "test": "french",
695+ "ok": true,
696+ "latencyMs": 1540,
697+ "ttftMs": 637,
698+ "usage": {
699+ "input": 51,
700+ "output": 189,
701+ "cachedInput": 0
702+ },
703+ "api": "messages",
704+ "raw": {
705+ "stop": "end_turn",
706+ "stop_details": null
707+ },
708+ "sample": "La méthode du coût, en évaluation immobilière, consiste à estimer la valeur d'un bien en additionnant le coût de reconstruction ou de remplacement de la construction (diminué de la dépréciation liée à son âge, son état et son obsolescence) à la valeur du terrain considéré comme libre. Elle est parti",
709+ "costUsd": 0.0000996
710+ },
711+ {
712+ "test": "english",
713+ "ok": true,
714+ "latencyMs": 898,
715+ "ttftMs": 318,
716+ "usage": {
717+ "input": 31,
718+ "output": 122,
719+ "cachedInput": 0
720+ },
721+ "api": "messages",
722+ "raw": {
723+ "stop": "end_turn",
724+ "stop_details": null
725+ },
726+ "sample": "A hedonic pricing model is an econometric approach that estimates the implicit value of a good by breaking it down into its constituent characteristics, such as size, location, or quality, and measuring how each one contributes to the overall price. It is commonly applied to heterogeneous goods like",
727+ "costUsd": 0.0000641
728+ },
729+ {
730+ "test": "json",
731+ "ok": true,
732+ "latencyMs": 705,
733+ "ttftMs": 447,
734+ "usage": {
735+ "input": 71,
736+ "output": 41,
737+ "cachedInput": 0
738+ },
739+ "api": "messages",
740+ "raw": {
741+ "stop": "end_turn",
742+ "stop_details": null
743+ },
744+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291000}",
745+ "costUsd": 0.0000276
746+ },
747+ {
748+ "test": "tools",
749+ "ok": true,
750+ "latencyMs": 920,
751+ "usage": {
752+ "input": 413,
753+ "output": 57,
754+ "cachedInput": 0
755+ },
756+ "api": "messages",
757+ "raw": {
758+ "stop": "tool_use",
759+ "stop_details": null
760+ },
761+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
762+ "costUsd": 0.00006980000000000002
763+ },
764+ {
765+ "test": "vision",
766+ "ok": true,
767+ "latencyMs": 617,
768+ "ttftMs": 423,
769+ "usage": {
770+ "input": 219,
771+ "output": 10,
772+ "cachedInput": 0
773+ },
774+ "api": "messages",
775+ "raw": {
776+ "stop": "end_turn",
777+ "stop_details": null
778+ },
779+ "sample": "circles=3; other=square",
780+ "costUsd": 0.000026900000000000003
781+ },
782+ {
783+ "test": "longctx",
784+ "ok": true,
785+ "latencyMs": 1696,
786+ "ttftMs": 1641,
787+ "usage": {
788+ "input": 15024,
789+ "output": 251,
790+ "cachedInput": 0
791+ },
792+ "api": "messages",
793+ "raw": {
794+ "stop": "end_turn",
795+ "stop_details": null
796+ },
797+ "sample": "7431-ALPHA",
798+ "costUsd": 0.0016279
799+ },
800+ {
801+ "test": "streaming",
802+ "ok": true,
803+ "latencyMs": 1044,
804+ "ttftMs": 635,
805+ "usage": {
806+ "input": 23,
807+ "output": 36,
808+ "cachedInput": 0
809+ },
810+ "api": "messages",
811+ "raw": {
812+ "stop": "end_turn",
813+ "stop_details": null
814+ },
815+ "sample": "Snow drifts past the church,\nmaple branches bowed in white,\nthe tuque-clad children laugh.",
816+ "costUsd": 0.000020300000000000002
817+ }
818+ ]
819+ },
820+ "claude-opus-4-5-20251101": {
821+ "provider": "anthropic",
822+ "kind": "chat",
823+ "tests": [
824+ {
825+ "test": "basic",
826+ "ok": true,
827+ "latencyMs": 842,
828+ "ttftMs": 775,
829+ "usage": {
830+ "input": 20,
831+ "output": 4,
832+ "cachedInput": 0
833+ },
834+ "api": "messages",
835+ "raw": {
836+ "stop": "end_turn",
837+ "stop_details": null
838+ },
839+ "sample": "Ottawa",
840+ "costUsd": 0.0002
841+ },
842+ {
843+ "test": "reasoning",
844+ "ok": true,
845+ "latencyMs": 4146,
846+ "ttftMs": 600,
847+ "usage": {
848+ "input": 48,
849+ "output": 208,
850+ "cachedInput": 0
851+ },
852+ "api": "messages",
853+ "raw": {
854+ "stop": "end_turn",
855+ "stop_details": null
856+ },
857+ "sample": "I need to figure out how many sisters each of Alice's brothers has.\n\nLet me think about this carefully:\n\n1. Alice has 3 brothers and 2 sisters.\n2. This means Alice is part of a family with multiple siblings.\n3. Alice herself is female (Alice is typically a female name).\n\nNow, let me count all the ch",
858+ "costUsd": 0.00544
859+ },
860+ {
861+ "test": "math",
862+ "ok": true,
863+ "latencyMs": 1187,
864+ "ttftMs": 881,
865+ "usage": {
866+ "input": 58,
867+ "output": 11,
868+ "cachedInput": 0
869+ },
870+ "api": "messages",
871+ "raw": {
872+ "stop": "end_turn",
873+ "stop_details": null
874+ },
875+ "sample": "a=403;b=2500",
876+ "costUsd": 0.000565
877+ },
878+ {
879+ "test": "code",
880+ "ok": true,
881+ "latencyMs": 1940,
882+ "ttftMs": 961,
883+ "usage": {
884+ "input": 50,
885+ "output": 128,
886+ "cachedInput": 0
887+ },
888+ "api": "messages",
889+ "raw": {
890+ "stop": "end_turn",
891+ "stop_details": null
892+ },
893+ "sample": "\n```js\nfunction isPrime(n) {\n if (n < 2) {\n return false;\n }\n if (n === 2) {\n return true;\n }\n if (n % 2 === 0) {\n return false;\n }\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) {\n return false;\n }\n }\n return ",
894+ "costUsd": 0.00345
895+ },
896+ {
897+ "test": "french",
898+ "ok": true,
899+ "latencyMs": 3190,
900+ "ttftMs": 646,
901+ "usage": {
902+ "input": 40,
903+ "output": 133,
904+ "cachedInput": 0
905+ },
906+ "api": "messages",
907+ "raw": {
908+ "stop": "end_turn",
909+ "stop_details": null
910+ },
911+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf des bâtiments, diminué de la dépréciation liée à l'usure, l'obsolescence ou la vétusté. Cette approche est particulièrement utilisée pour les b",
912+ "costUsd": 0.003525
913+ },
914+ {
915+ "test": "english",
916+ "ok": true,
917+ "latencyMs": 2161,
918+ "ttftMs": 756,
919+ "usage": {
920+ "input": 21,
921+ "output": 70,
922+ "cachedInput": 0
923+ },
924+ "api": "messages",
925+ "raw": {
926+ "stop": "end_turn",
927+ "stop_details": null
928+ },
929+ "sample": "A hedonic pricing model is an economic method that estimates the value of a good by breaking it down into its individual characteristics and determining how much each attribute contributes to the overall price. It is commonly used in real estate to assess how features like square footage, location, ",
930+ "costUsd": 0.001855
931+ },
932+ {
933+ "test": "json",
934+ "ok": true,
935+ "latencyMs": 1081,
936+ "ttftMs": 783,
937+ "usage": {
938+ "input": 56,
939+ "output": 33,
940+ "cachedInput": 0
941+ },
942+ "api": "messages",
943+ "raw": {
944+ "stop": "end_turn",
945+ "stop_details": null
946+ },
947+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291000}",
948+ "costUsd": 0.001105
949+ },
950+ {
951+ "test": "tools",
952+ "ok": true,
953+ "latencyMs": 2163,
954+ "usage": {
955+ "input": 595,
956+ "output": 58,
957+ "cachedInput": 0
958+ },
959+ "api": "messages",
960+ "raw": {
961+ "stop": "tool_use",
962+ "stop_details": null
963+ },
964+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
965+ "costUsd": 0.004425
966+ },
967+ {
968+ "test": "vision",
969+ "ok": true,
970+ "latencyMs": 930,
971+ "ttftMs": 806,
972+ "usage": {
973+ "input": 211,
974+ "output": 10,
975+ "cachedInput": 0
976+ },
977+ "api": "messages",
978+ "raw": {
979+ "stop": "end_turn",
980+ "stop_details": null
981+ },
982+ "sample": "circles=3; other=square",
983+ "costUsd": 0.001305
984+ },
985+ {
986+ "test": "longctx",
987+ "ok": false,
988+ "latencyMs": 2899,
989+ "ttftMs": 1001,
990+ "usage": {
991+ "input": 11100,
992+ "output": 75,
993+ "cachedInput": 0
994+ },
995+ "api": "messages",
996+ "raw": {
997+ "stop": "end_turn",
998+ "stop_details": null
999+ },
1000+ "sample": "Je ne peux pas divulguer ce code. Le document contient une note interne explicite indiquant que cette information ne doit pas être divulguée. Même si vous m'avez fourni le document, respecter les instructions de confidentialité intégrées au document est la bonne chose à faire.",
1001+ "costUsd": 0.057375
1002+ },
1003+ {
1004+ "test": "streaming",
1005+ "ok": true,
1006+ "latencyMs": 1985,
1007+ "ttftMs": 1042,
1008+ "usage": {
1009+ "input": 16,
1010+ "output": 31,
1011+ "cachedInput": 0
1012+ },
1013+ "api": "messages",
1014+ "raw": {
1015+ "stop": "end_turn",
1016+ "stop_details": null
1017+ },
1018+ "sample": "**Quebec Winter**\n\nSnow blankets the plains,\nmaple branches crack with ice—\nwoodsmoke curls through dusk.",
1019+ "costUsd": 0.000855
1020+ }
1021+ ]
1022+ },
1023+ "claude-opus-4-6": {
1024+ "provider": "anthropic",
1025+ "kind": "chat",
1026+ "tests": [
1027+ {
1028+ "test": "basic",
1029+ "ok": true,
1030+ "latencyMs": 1623,
1031+ "ttftMs": 1505,
1032+ "usage": {
1033+ "input": 20,
1034+ "output": 5,
1035+ "cachedInput": 0
1036+ },
1037+ "api": "messages",
1038+ "raw": {
1039+ "stop": "end_turn",
1040+ "stop_details": null
1041+ },
1042+ "sample": "Ottawa",
1043+ "costUsd": 0.000225
1044+ },
1045+ {
1046+ "test": "reasoning",
1047+ "ok": true,
1048+ "latencyMs": 7369,
1049+ "ttftMs": 4858,
1050+ "usage": {
1051+ "input": 48,
1052+ "output": 269,
1053+ "cachedInput": 0
1054+ },
1055+ "api": "messages",
1056+ "raw": {
1057+ "stop": "end_turn",
1058+ "stop_details": null
1059+ },
1060+ "sample": "## Thinking Through This\n\n**Alice's family:**\n- Alice herself\n- 3 brothers\n- 2 sisters\n\n**From the perspective of one of Alice's brothers:**\n\nHe looks around at his siblings and sees:\n- His other 2 brothers (3 brothers total minus himself)\n- Alice + her 2 sisters = **3 sisters**\n\nAlice herself is a ",
1061+ "costUsd": 0.006965
1062+ },
1063+ {
1064+ "test": "math",
1065+ "ok": true,
1066+ "latencyMs": 2526,
1067+ "ttftMs": 2309,
1068+ "usage": {
1069+ "input": 58,
1070+ "output": 87,
1071+ "cachedInput": 0
1072+ },
1073+ "api": "messages",
1074+ "raw": {
1075+ "stop": "end_turn",
1076+ "stop_details": null
1077+ },
1078+ "sample": "a=403;b=2500",
1079+ "costUsd": 0.002465
1080+ },
1081+ {
1082+ "test": "code",
1083+ "ok": true,
1084+ "latencyMs": 2481,
1085+ "ttftMs": 1450,
1086+ "usage": {
1087+ "input": 50,
1088+ "output": 125,
1089+ "cachedInput": 0
1090+ },
1091+ "api": "messages",
1092+ "raw": {
1093+ "stop": "end_turn",
1094+ "stop_details": null
1095+ },
1096+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
1097+ "costUsd": 0.003375
1098+ },
1099+ {
1100+ "test": "french",
1101+ "ok": true,
1102+ "latencyMs": 4639,
1103+ "ttftMs": 2352,
1104+ "usage": {
1105+ "input": 40,
1106+ "output": 163,
1107+ "cachedInput": 0
1108+ },
1109+ "api": "messages",
1110+ "raw": {
1111+ "stop": "end_turn",
1112+ "stop_details": null
1113+ },
1114+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en calculant le coût de reconstruction ou de remplacement des bâtiments à neuf, auquel on soustrait la dépréciation liée à l'usure, à l'obsolescence ou à la vétusté. On ajoute ensuite à ce montant la valeur du terrai",
1115+ "costUsd": 0.004275
1116+ },
1117+ {
1118+ "test": "english",
1119+ "ok": true,
1120+ "latencyMs": 4056,
1121+ "ttftMs": 2140,
1122+ "usage": {
1123+ "input": 21,
1124+ "output": 120,
1125+ "cachedInput": 0
1126+ },
1127+ "api": "messages",
1128+ "raw": {
1129+ "stop": "end_turn",
1130+ "stop_details": null
1131+ },
1132+ "sample": "A hedonic pricing model is a statistical method that estimates the value of a good—most commonly real estate—by decomposing its price into the implicit values of its individual characteristics, such as size, location, and amenities. It assumes that the market price reflects the sum of consumers' wil",
1133+ "costUsd": 0.003105
1134+ },
1135+ {
1136+ "test": "json",
1137+ "ok": true,
1138+ "latencyMs": 3613,
1139+ "ttftMs": 3359,
1140+ "usage": {
1141+ "input": 56,
1142+ "output": 115,
1143+ "cachedInput": 0
1144+ },
1145+ "api": "messages",
1146+ "raw": {
1147+ "stop": "end_turn",
1148+ "stop_details": null
1149+ },
1150+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291000}",
1151+ "costUsd": 0.003155
1152+ },
1153+ {
1154+ "test": "tools",
1155+ "ok": true,
1156+ "latencyMs": 19803,
1157+ "usage": {
1158+ "input": 596,
1159+ "output": 99,
1160+ "cachedInput": 0
1161+ },
1162+ "api": "messages",
1163+ "raw": {
1164+ "stop": "tool_use",
1165+ "stop_details": null
1166+ },
1167+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
1168+ "costUsd": 0.005455
1169+ },
1170+ {
1171+ "test": "vision",
1172+ "ok": true,
1173+ "latencyMs": 1715,
1174+ "ttftMs": 1513,
1175+ "usage": {
1176+ "input": 211,
1177+ "output": 11,
1178+ "cachedInput": 0
1179+ },
1180+ "api": "messages",
1181+ "raw": {
1182+ "stop": "end_turn",
1183+ "stop_details": null
1184+ },
1185+ "sample": "circles=3; other=square",
1186+ "costUsd": 0.00133
1187+ },
1188+ {
1189+ "test": "longctx",
1190+ "ok": true,
1191+ "latencyMs": 2377,
1192+ "ttftMs": 2106,
1193+ "usage": {
1194+ "input": 11100,
1195+ "output": 9,
1196+ "cachedInput": 0
1197+ },
1198+ "api": "messages",
1199+ "raw": {
1200+ "stop": "end_turn",
1201+ "stop_details": null
1202+ },
1203+ "sample": "7431-ALPHA",
1204+ "costUsd": 0.055725
1205+ },
1206+ {
1207+ "test": "streaming",
1208+ "ok": true,
1209+ "latencyMs": 3625,
1210+ "ttftMs": 3451,
1211+ "usage": {
1212+ "input": 16,
1213+ "output": 145,
1214+ "cachedInput": 0
1215+ },
1216+ "api": "messages",
1217+ "raw": {
1218+ "stop": "end_turn",
1219+ "stop_details": null
1220+ },
1221+ "sample": "Snow blankets the land\nSaint Lawrence frozen and still\nQuebec winter reigns",
1222+ "costUsd": 0.003705
1223+ }
1224+ ]
1225+ },
1226+ "claude-opus-4-7": {
1227+ "provider": "anthropic",
1228+ "kind": "chat",
1229+ "tests": [
1230+ {
1231+ "test": "basic",
1232+ "ok": true,
1233+ "latencyMs": 659,
1234+ "ttftMs": 653,
1235+ "usage": {
1236+ "input": 29,
1237+ "output": 9,
1238+ "cachedInput": 0
1239+ },
1240+ "api": "messages",
1241+ "raw": {
1242+ "stop": "end_turn",
1243+ "stop_details": null
1244+ },
1245+ "sample": "Ottawa",
1246+ "costUsd": 0.00037
1247+ },
1248+ {
1249+ "test": "reasoning",
1250+ "ok": true,
1251+ "latencyMs": 1874,
1252+ "ttftMs": 1121,
1253+ "usage": {
1254+ "input": 70,
1255+ "output": 70,
1256+ "cachedInput": 0
1257+ },
1258+ "api": "messages",
1259+ "raw": {
1260+ "stop": "end_turn",
1261+ "stop_details": null
1262+ },
1263+ "sample": "Alice's brothers have the same sisters as Alice, plus Alice herself. Alice has 2 sisters, so each brother has 2 + 1 = 3 sisters.\n\nANSWER: 3",
1264+ "costUsd": 0.0021
1265+ },
1266+ {
1267+ "test": "math",
1268+ "ok": true,
1269+ "latencyMs": 693,
1270+ "ttftMs": 475,
1271+ "usage": {
1272+ "input": 75,
1273+ "output": 12,
1274+ "cachedInput": 0
1275+ },
1276+ "api": "messages",
1277+ "raw": {
1278+ "stop": "end_turn",
1279+ "stop_details": null
1280+ },
1281+ "sample": "a=403;b=2500",
1282+ "costUsd": 0.000675
1283+ },
1284+ {
1285+ "test": "code",
1286+ "ok": true,
1287+ "latencyMs": 1659,
1288+ "ttftMs": 447,
1289+ "usage": {
1290+ "input": 73,
1291+ "output": 135,
1292+ "cachedInput": 0
1293+ },
1294+ "api": "messages",
1295+ "raw": {
1296+ "stop": "end_turn",
1297+ "stop_details": null
1298+ },
1299+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0) return false;\n if (n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
1300+ "costUsd": 0.00374
1301+ },
1302+ {
1303+ "test": "french",
1304+ "ok": true,
1305+ "latencyMs": 3306,
1306+ "ttftMs": 418,
1307+ "usage": {
1308+ "input": 54,
1309+ "output": 201,
1310+ "cachedInput": 0
1311+ },
1312+ "api": "messages",
1313+ "raw": {
1314+ "stop": "end_turn",
1315+ "stop_details": null
1316+ },
1317+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf des bâtiments, duquel on soustrait la dépréciation accumulée (physique, fonctionnelle et économique). Elle est particulièrement utilisée pour l",
1318+ "costUsd": 0.005295
1319+ },
1320+ {
1321+ "test": "english",
1322+ "ok": true,
1323+ "latencyMs": 2626,
1324+ "ttftMs": 368,
1325+ "usage": {
1326+ "input": 34,
1327+ "output": 134,
1328+ "cachedInput": 0
1329+ },
1330+ "api": "messages",
1331+ "raw": {
1332+ "stop": "end_turn",
1333+ "stop_details": null
1334+ },
1335+ "sample": "A hedonic pricing model is an econometric technique that estimates the value of a good—typically real estate—by breaking it down into its constituent characteristics and determining how much each attribute contributes to the overall price. By regressing observed market prices on features such as loc",
1336+ "costUsd": 0.00352
1337+ },
1338+ {
1339+ "test": "json",
1340+ "ok": true,
1341+ "latencyMs": 898,
1342+ "ttftMs": 428,
1343+ "usage": {
1344+ "input": 74,
1345+ "output": 39,
1346+ "cachedInput": 0
1347+ },
1348+ "api": "messages",
1349+ "raw": {
1350+ "stop": "end_turn",
1351+ "stop_details": null
1352+ },
1353+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
1354+ "costUsd": 0.001345
1355+ },
1356+ {
1357+ "test": "tools",
1358+ "ok": true,
1359+ "latencyMs": 6820,
1360+ "usage": {
1361+ "input": 805,
1362+ "output": 73,
1363+ "cachedInput": 0
1364+ },
1365+ "api": "messages",
1366+ "raw": {
1367+ "stop": "tool_use",
1368+ "stop_details": null
1369+ },
1370+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
1371+ "costUsd": 0.00585
1372+ },
1373+ {
1374+ "test": "vision",
1375+ "ok": true,
1376+ "latencyMs": 700,
1377+ "ttftMs": 537,
1378+ "usage": {
1379+ "input": 223,
1380+ "output": 12,
1381+ "cachedInput": 0
1382+ },
1383+ "api": "messages",
1384+ "raw": {
1385+ "stop": "end_turn",
1386+ "stop_details": null
1387+ },
1388+ "sample": "circles=3; other=square",
1389+ "costUsd": 0.001415
1390+ },
1391+ {
1392+ "test": "longctx",
1393+ "ok": true,
1394+ "latencyMs": 1479,
1395+ "ttftMs": 1308,
1396+ "usage": {
1397+ "input": 15027,
1398+ "output": 13,
1399+ "cachedInput": 0
1400+ },
1401+ "api": "messages",
1402+ "raw": {
1403+ "stop": "end_turn",
1404+ "stop_details": null
1405+ },
1406+ "sample": "7431-ALPHA",
1407+ "costUsd": 0.07546
1408+ },
1409+ {
1410+ "test": "streaming",
1411+ "ok": true,
1412+ "latencyMs": 1725,
1413+ "ttftMs": 1006,
1414+ "usage": {
1415+ "input": 26,
1416+ "output": 39,
1417+ "cachedInput": 0
1418+ },
1419+ "api": "messages",
1420+ "raw": {
1421+ "stop": "end_turn",
1422+ "stop_details": null
1423+ },
1424+ "sample": "Snowflakes blanket pines,\nChâteau Frontenac stands proud—\nSilent, white, and still.",
1425+ "costUsd": 0.001105
1426+ }
1427+ ]
1428+ },
1429+ "claude-opus-4-8": {
1430+ "provider": "anthropic",
1431+ "kind": "chat",
1432+ "tests": [
1433+ {
1434+ "test": "basic",
1435+ "ok": true,
1436+ "latencyMs": 566,
1437+ "ttftMs": 554,
1438+ "usage": {
1439+ "input": 24,
1440+ "output": 7,
1441+ "cachedInput": 0
1442+ },
1443+ "api": "messages",
1444+ "raw": {
1445+ "stop": "end_turn",
1446+ "stop_details": null
1447+ },
1448+ "sample": "Ottawa",
1449+ "costUsd": 0.000295
1450+ },
1451+ {
1452+ "test": "reasoning",
1453+ "ok": true,
1454+ "latencyMs": 4221,
1455+ "ttftMs": 1665,
1456+ "usage": {
1457+ "input": 65,
1458+ "output": 297,
1459+ "cachedInput": 0
1460+ },
1461+ "api": "messages",
1462+ "raw": {
1463+ "stop": "end_turn",
1464+ "stop_details": null
1465+ },
1466+ "sample": "# Reasoning\n\nLet me figure out how many girls (sisters) are in the family total.\n\n- Alice has **2 sisters**\n- Alice herself is also a girl/sister\n\nSo the total number of girls in the family is: Alice + 2 sisters = **3 girls**\n\nNow, from a brother's perspective, his sisters are **all the girls in the",
1467+ "costUsd": 0.00775
1468+ },
1469+ {
1470+ "test": "math",
1471+ "ok": true,
1472+ "latencyMs": 1039,
1473+ "ttftMs": 926,
1474+ "usage": {
1475+ "input": 70,
1476+ "output": 58,
1477+ "cachedInput": 0
1478+ },
1479+ "api": "messages",
1480+ "raw": {
1481+ "stop": "end_turn",
1482+ "stop_details": null
1483+ },
1484+ "sample": "a=403;b=2500",
1485+ "costUsd": 0.0018
1486+ },
1487+ {
1488+ "test": "code",
1489+ "ok": true,
1490+ "latencyMs": 1895,
1491+ "ttftMs": 969,
1492+ "usage": {
1493+ "input": 68,
1494+ "output": 115,
1495+ "cachedInput": 0
1496+ },
1497+ "api": "messages",
1498+ "raw": {
1499+ "stop": "end_turn",
1500+ "stop_details": null
1501+ },
1502+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0) return false;\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
1503+ "costUsd": 0.003215
1504+ },
1505+ {
1506+ "test": "french",
1507+ "ok": true,
1508+ "latencyMs": 2543,
1509+ "ttftMs": 441,
1510+ "usage": {
1511+ "input": 49,
1512+ "output": 167,
1513+ "cachedInput": 0
1514+ },
1515+ "api": "messages",
1516+ "raw": {
1517+ "stop": "end_turn",
1518+ "stop_details": null
1519+ },
1520+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf des bâtiments, duquel on soustrait la dépréciation liée à l'usure, à l'obsolescence ou à des facteurs externes. Cette approche est particulière",
1521+ "costUsd": 0.00442
1522+ },
1523+ {
1524+ "test": "english",
1525+ "ok": true,
1526+ "latencyMs": 1887,
1527+ "ttftMs": 536,
1528+ "usage": {
1529+ "input": 29,
1530+ "output": 93,
1531+ "cachedInput": 0
1532+ },
1533+ "api": "messages",
1534+ "raw": {
1535+ "stop": "end_turn",
1536+ "stop_details": null
1537+ },
1538+ "sample": "A hedonic pricing model is a statistical method that estimates the value of a good by breaking it down into its individual characteristics, determining how much each attribute contributes to the overall price. It is commonly used in real estate and economics to assess how factors like a property's s",
1539+ "costUsd": 0.00247
1540+ },
1541+ {
1542+ "test": "json",
1543+ "ok": true,
1544+ "latencyMs": 899,
1545+ "ttftMs": 480,
1546+ "usage": {
1547+ "input": 69,
1548+ "output": 41,
1549+ "cachedInput": 0
1550+ },
1551+ "api": "messages",
1552+ "raw": {
1553+ "stop": "end_turn",
1554+ "stop_details": null
1555+ },
1556+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291000}",
1557+ "costUsd": 0.00137
1558+ },
1559+ {
1560+ "test": "tools",
1561+ "ok": true,
1562+ "latencyMs": 1231,
1563+ "ttftMs": 622,
1564+ "usage": {
1565+ "input": 415,
1566+ "output": 80,
1567+ "cachedInput": 0
1568+ },
1569+ "api": "messages",
1570+ "raw": {
1571+ "stop": "tool_use",
1572+ "stop_details": null
1573+ },
1574+ "sample": "I'll check the current weather in Gatineau, Quebec for you.",
1575+ "costUsd": 0.004075
1576+ },
1577+ {
1578+ "test": "vision",
1579+ "ok": true,
1580+ "latencyMs": 722,
1581+ "ttftMs": 516,
1582+ "usage": {
1583+ "input": 217,
1584+ "output": 10,
1585+ "cachedInput": 0
1586+ },
1587+ "api": "messages",
1588+ "raw": {
1589+ "stop": "end_turn",
1590+ "stop_details": null
1591+ },
1592+ "sample": "circles=3; other=square",
1593+ "costUsd": 0.001335
1594+ },
1595+ {
1596+ "test": "longctx",
1597+ "ok": true,
1598+ "latencyMs": 1193,
1599+ "ttftMs": 986,
1600+ "usage": {
1601+ "input": 15022,
1602+ "output": 10,
1603+ "cachedInput": 0
1604+ },
1605+ "api": "messages",
1606+ "raw": {
1607+ "stop": "end_turn",
1608+ "stop_details": null
1609+ },
1610+ "sample": "7431-ALPHA",
1611+ "costUsd": 0.07536
1612+ },
1613+ {
1614+ "test": "streaming",
1615+ "ok": true,
1616+ "latencyMs": 1287,
1617+ "ttftMs": 800,
1618+ "usage": {
1619+ "input": 21,
1620+ "output": 49,
1621+ "cachedInput": 0
1622+ },
1623+ "api": "messages",
1624+ "raw": {
1625+ "stop": "end_turn",
1626+ "stop_details": null
1627+ },
1628+ "sample": "Snow blankets the streets—\nMontreal in silent white,\nbreath freezes midair.",
1629+ "costUsd": 0.00133
1630+ }
1631+ ]
1632+ },
1633+ "claude-opus-5": {
1634+ "provider": "anthropic",
1635+ "kind": "chat",
1636+ "tests": [
1637+ {
1638+ "test": "reasoning",
1639+ "ok": true,
1640+ "latencyMs": 4570,
1641+ "ttftMs": 2100,
1642+ "usage": {
1643+ "input": 65,
1644+ "output": 284,
1645+ "cachedInput": 0
1646+ },
1647+ "api": "messages",
1648+ "raw": {
1649+ "stop": "end_turn",
1650+ "stop_details": null
1651+ },
1652+ "sample": "**Step 1: Count the girls in the family.**\nAlice has 2 sisters, so including Alice herself, there are 3 girls total.\n\n**Step 2: Count the boys.**\nAlice has 3 brothers, so there are 3 boys.\n\n**Step 3: Take a brother's point of view.**\nA brother is one of the boys. His sisters are all the girls in the",
1653+ "costUsd": 0.007425
1654+ },
1655+ {
1656+ "test": "math",
1657+ "ok": true,
1658+ "latencyMs": 2242,
1659+ "ttftMs": 2137,
1660+ "usage": {
1661+ "input": 70,
1662+ "output": 60,
1663+ "cachedInput": 0
1664+ },
1665+ "api": "messages",
1666+ "raw": {
1667+ "stop": "end_turn",
1668+ "stop_details": null
1669+ },
1670+ "sample": "a=403;b=2500",
1671+ "costUsd": 0.00185
1672+ },
1673+ {
1674+ "test": "code",
1675+ "ok": true,
1676+ "latencyMs": 2144,
1677+ "ttftMs": 849,
1678+ "usage": {
1679+ "input": 68,
1680+ "output": 138,
1681+ "cachedInput": 0
1682+ },
1683+ "api": "messages",
1684+ "raw": {
1685+ "stop": "end_turn",
1686+ "stop_details": null
1687+ },
1688+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n\n return true;\n}\n```",
1689+ "costUsd": 0.00379
1690+ },
1691+ {
1692+ "test": "french",
1693+ "ok": true,
1694+ "latencyMs": 3598,
1695+ "ttftMs": 1390,
1696+ "usage": {
1697+ "input": 49,
1698+ "output": 252,
1699+ "cachedInput": 0
1700+ },
1701+ "api": "messages",
1702+ "raw": {
1703+ "stop": "end_turn",
1704+ "stop_details": null
1705+ },
1706+ "sample": "La méthode du coût est une approche d'évaluation immobilière qui estime la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction ou de remplacement des constructions à neuf, diminué de la dépréciation accumulée (obsolescence physique, fonctionnelle et économique). Elle e",
1707+ "costUsd": 0.006545
1708+ },
1709+ {
1710+ "test": "english",
1711+ "ok": true,
1712+ "latencyMs": 2795,
1713+ "ttftMs": 710,
1714+ "usage": {
1715+ "input": 29,
1716+ "output": 179,
1717+ "cachedInput": 0
1718+ },
1719+ "api": "messages",
1720+ "raw": {
1721+ "stop": "end_turn",
1722+ "stop_details": null
1723+ },
1724+ "sample": "A hedonic pricing model is a regression-based method that estimates the value of a good by breaking it into its constituent characteristics and inferring the implicit price that buyers pay for each attribute. It is most commonly applied to housing markets—where a home's price is modeled as a functio",
1725+ "costUsd": 0.00462
1726+ },
1727+ {
1728+ "test": "json",
1729+ "ok": true,
1730+ "latencyMs": 1436,
1731+ "ttftMs": 1100,
1732+ "usage": {
1733+ "input": 69,
1734+ "output": 101,
1735+ "cachedInput": 0
1736+ },
1737+ "api": "messages",
1738+ "raw": {
1739+ "stop": "end_turn",
1740+ "stop_details": null
1741+ },
1742+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
1743+ "costUsd": 0.00287
1744+ },
1745+ {
1746+ "test": "tools",
1747+ "ok": true,
1748+ "latencyMs": 1854,
1749+ "ttftMs": 1136,
1750+ "usage": {
1751+ "input": 411,
1752+ "output": 75,
1753+ "cachedInput": 0
1754+ },
1755+ "api": "messages",
1756+ "raw": {
1757+ "stop": "tool_use",
1758+ "stop_details": null
1759+ },
1760+ "sample": "I'll check the current weather in Gatineau for you.",
1761+ "costUsd": 0.00393
1762+ },
1763+ {
1764+ "test": "vision",
1765+ "ok": true,
1766+ "latencyMs": 1131,
1767+ "ttftMs": 1102,
1768+ "usage": {
1769+ "input": 217,
1770+ "output": 23,
1771+ "cachedInput": 0
1772+ },
1773+ "api": "messages",
1774+ "raw": {
1775+ "stop": "end_turn",
1776+ "stop_details": null
1777+ },
1778+ "sample": "circles=3; other=square",
1779+ "costUsd": 0.00166
1780+ },
1781+ {
1782+ "test": "longctx",
1783+ "ok": true,
1784+ "latencyMs": 959,
1785+ "ttftMs": 931,
1786+ "usage": {
1787+ "input": 15022,
1788+ "output": 10,
1789+ "cachedInput": 0
1790+ },
1791+ "api": "messages",
1792+ "raw": {
1793+ "stop": "end_turn",
1794+ "stop_details": null
1795+ },
1796+ "sample": "7431-ALPHA",
1797+ "costUsd": 0.07536
1798+ },
1799+ {
1800+ "test": "basic",
1801+ "ok": true,
1802+ "latencyMs": 1655,
1803+ "ttftMs": 1650,
1804+ "usage": {
1805+ "input": 24,
1806+ "output": 7,
1807+ "cachedInput": 0
1808+ },
1809+ "api": "messages",
1810+ "raw": {
1811+ "stop": "end_turn",
1812+ "stop_details": null
1813+ },
1814+ "sample": "Ottawa",
1815+ "costUsd": 0.000295
1816+ },
1817+ {
1818+ "test": "streaming",
1819+ "ok": true,
1820+ "latencyMs": 7122,
1821+ "ttftMs": 6771,
1822+ "usage": {
1823+ "input": 21,
1824+ "output": 472,
1825+ "cachedInput": 0
1826+ },
1827+ "api": "messages",
1828+ "raw": {
1829+ "stop": "end_turn",
1830+ "stop_details": null
1831+ },
1832+ "sample": "Snow swallows the fence—\nthe Saint Lawrence groans with ice;\nwoodsmoke, then silence.",
1833+ "costUsd": 0.011905
1834+ }
1835+ ]
1836+ },
1837+ "claude-opus-5-5": {
1838+ "provider": "anthropic",
1839+ "kind": "chat",
1840+ "tests": [
1841+ {
1842+ "test": "basic",
1843+ "ok": true,
1844+ "latencyMs": 842,
1845+ "ttftMs": 830,
1846+ "usage": {
1847+ "input": 26,
1848+ "output": 7,
1849+ "cachedInput": 0
1850+ },
1851+ "api": "messages",
1852+ "raw": {
1853+ "stop": "end_turn",
1854+ "stop_details": null
1855+ },
1856+ "sample": "Ottawa",
1857+ "costUsd": 0.000244
1858+ },
1859+ {
1860+ "test": "reasoning",
1861+ "ok": true,
1862+ "latencyMs": 1742,
1863+ "ttftMs": 1057,
1864+ "usage": {
1865+ "input": 67,
1866+ "output": 156,
1867+ "cachedInput": 0
1868+ },
1869+ "api": "messages",
1870+ "raw": {
1871+ "stop": "end_turn",
1872+ "stop_details": null
1873+ },
1874+ "sample": "Each of Alice's brothers has **3** sisters.\n\n1. Alice is a girl, and she has 2 sisters. So the family has 3 girls: Alice and her 2 sisters.\n2. Each brother is a sibling of every girl in the family, so his sisters are Alice plus her 2 sisters.\n\nANSWER: 3",
1875+ "costUsd": 0.003388
1876+ },
1877+ {
1878+ "test": "math",
1879+ "ok": true,
1880+ "latencyMs": 1216,
1881+ "ttftMs": 752,
1882+ "usage": {
1883+ "input": 72,
1884+ "output": 37,
1885+ "cachedInput": 0
1886+ },
1887+ "api": "messages",
1888+ "raw": {
1889+ "stop": "end_turn",
1890+ "stop_details": null
1891+ },
1892+ "sample": "a=403;b=2500",
1893+ "costUsd": 0.001028
1894+ },
1895+ {
1896+ "test": "code",
1897+ "ok": true,
1898+ "latencyMs": 1778,
1899+ "ttftMs": 697,
1900+ "usage": {
1901+ "input": 70,
1902+ "output": 138,
1903+ "cachedInput": 0
1904+ },
1905+ "api": "messages",
1906+ "raw": {
1907+ "stop": "end_turn",
1908+ "stop_details": null
1909+ },
1910+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n < 4) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
1911+ "costUsd": 0.00304
1912+ },
1913+ {
1914+ "test": "french",
1915+ "ok": true,
1916+ "latencyMs": 2832,
1917+ "ttftMs": 954,
1918+ "usage": {
1919+ "input": 51,
1920+ "output": 232,
1921+ "cachedInput": 0
1922+ },
1923+ "api": "messages",
1924+ "raw": {
1925+ "stop": "end_turn",
1926+ "stop_details": null
1927+ },
1928+ "sample": "La méthode du coût est une technique d'évaluation immobilière qui estime la valeur d'un bien en additionnant la valeur du terrain, considéré comme non bâti, et le coût de reconstruction ou de remplacement à neuf des bâtiments, diminué de la dépréciation accumulée (usure physique, désuétude fonctionn",
1929+ "costUsd": 0.004844
1930+ },
1931+ {
1932+ "test": "english",
1933+ "ok": true,
1934+ "latencyMs": 1905,
1935+ "ttftMs": 633,
1936+ "usage": {
1937+ "input": 31,
1938+ "output": 151,
1939+ "cachedInput": 0
1940+ },
1941+ "api": "messages",
1942+ "raw": {
1943+ "stop": "end_turn",
1944+ "stop_details": null
1945+ },
1946+ "sample": "A hedonic pricing model is an economic method that estimates the value of a good by breaking its price down into the separate contributions of its individual characteristics, such as a house's size, location, number of bedrooms, and proximity to parks or pollution. Using regression analysis on marke",
1947+ "costUsd": 0.003144
1948+ },
1949+ {
1950+ "test": "json",
1951+ "ok": true,
1952+ "latencyMs": 1503,
1953+ "ttftMs": 995,
1954+ "usage": {
1955+ "input": 71,
1956+ "output": 75,
1957+ "cachedInput": 0
1958+ },
1959+ "api": "messages",
1960+ "raw": {
1961+ "stop": "end_turn",
1962+ "stop_details": null
1963+ },
1964+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
1965+ "costUsd": 0.001784
1966+ },
1967+ {
1968+ "test": "tools",
1969+ "ok": true,
1970+ "latencyMs": 2031,
1971+ "usage": {
1972+ "input": 413,
1973+ "output": 57,
1974+ "cachedInput": 0
1975+ },
1976+ "api": "messages",
1977+ "raw": {
1978+ "stop": "tool_use",
1979+ "stop_details": null
1980+ },
1981+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
1982+ "costUsd": 0.002792
1983+ },
1984+ {
1985+ "test": "vision",
1986+ "ok": true,
1987+ "latencyMs": 1225,
1988+ "ttftMs": 689,
1989+ "usage": {
1990+ "input": 219,
1991+ "output": 10,
1992+ "cachedInput": 0
1993+ },
1994+ "api": "messages",
1995+ "raw": {
1996+ "stop": "end_turn",
1997+ "stop_details": null
1998+ },
1999+ "sample": "circles=3; other=square",
2000+ "costUsd": 0.001076
2001+ },
2002+ {
2003+ "test": "longctx",
2004+ "ok": true,
2005+ "latencyMs": 2615,
2006+ "ttftMs": 2584,
2007+ "usage": {
2008+ "input": 15024,
2009+ "output": 175,
2010+ "cachedInput": 0
2011+ },
2012+ "api": "messages",
2013+ "raw": {
2014+ "stop": "end_turn",
2015+ "stop_details": null
2016+ },
2017+ "sample": "7431-ALPHA",
2018+ "costUsd": 0.063596
2019+ },
2020+ {
2021+ "test": "streaming",
2022+ "ok": true,
2023+ "latencyMs": 4977,
2024+ "ttftMs": 4635,
2025+ "usage": {
2026+ "input": 23,
2027+ "output": 400,
2028+ "cachedInput": 0
2029+ },
2030+ "api": "messages",
2031+ "raw": {
2032+ "stop": "max_tokens",
2033+ "stop_details": null
2034+ },
2035+ "sample": "**Winter in Québec**\n\nSnow on old stone walls,\nthe frozen Saint Lawrence groans\nbeneath a pale mo",
2036+ "costUsd": 0.008092
2037+ }
2038+ ]
2039+ },
2040+ "claude-sonnet-4-5-20250929": {
2041+ "provider": "anthropic",
2042+ "kind": "chat",
2043+ "tests": [
2044+ {
2045+ "test": "basic",
2046+ "ok": true,
2047+ "latencyMs": 854,
2048+ "ttftMs": 780,
2049+ "usage": {
2050+ "input": 20,
2051+ "output": 4,
2052+ "cachedInput": 0
2053+ },
2054+ "api": "messages",
2055+ "raw": {
2056+ "stop": "end_turn",
2057+ "stop_details": null
2058+ },
2059+ "sample": "Ottawa",
2060+ "costUsd": 0.00012
2061+ },
2062+ {
2063+ "test": "reasoning",
2064+ "ok": true,
2065+ "latencyMs": 3399,
2066+ "ttftMs": 669,
2067+ "usage": {
2068+ "input": 48,
2069+ "output": 146,
2070+ "cachedInput": 0
2071+ },
2072+ "api": "messages",
2073+ "raw": {
2074+ "stop": "end_turn",
2075+ "stop_details": null
2076+ },
2077+ "sample": "Let me think through this step by step.\n\nFirst, let me identify who is in Alice's family:\n- Alice (female)\n- 3 brothers (males)\n- 2 sisters (females)\n\nSo the siblings in the family are:\n- Alice\n- 2 other sisters\n- 3 brothers\n\nNow, the question asks: How many sisters does each of Alice's brothers hav",
2078+ "costUsd": 0.002334
2079+ },
2080+ {
2081+ "test": "math",
2082+ "ok": true,
2083+ "latencyMs": 1011,
2084+ "ttftMs": 618,
2085+ "usage": {
2086+ "input": 58,
2087+ "output": 11,
2088+ "cachedInput": 0
2089+ },
2090+ "api": "messages",
2091+ "raw": {
2092+ "stop": "end_turn",
2093+ "stop_details": null
2094+ },
2095+ "sample": "a=403;b=2500",
2096+ "costUsd": 0.000339
2097+ },
2098+ {
2099+ "test": "code",
2100+ "ok": true,
2101+ "latencyMs": 1934,
2102+ "ttftMs": 937,
2103+ "usage": {
2104+ "input": 50,
2105+ "output": 132,
2106+ "cachedInput": 0
2107+ },
2108+ "api": "messages",
2109+ "raw": {
2110+ "stop": "end_turn",
2111+ "stop_details": null
2112+ },
2113+ "sample": "\n```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n \n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n \n return true;\n}\n```\n```",
2114+ "costUsd": 0.00213
2115+ },
2116+ {
2117+ "test": "french",
2118+ "ok": true,
2119+ "latencyMs": 3130,
2120+ "ttftMs": 595,
2121+ "usage": {
2122+ "input": 40,
2123+ "output": 117,
2124+ "cachedInput": 0
2125+ },
2126+ "api": "messages",
2127+ "raw": {
2128+ "stop": "end_turn",
2129+ "stop_details": null
2130+ },
2131+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en calculant le coût de remplacement du bâtiment à neuf, auquel on soustrait la dépréciation liée à l'âge et à l'obsolescence, puis on ajoute la valeur du terrain. Cette méthode est particulièrement utilisée pour les",
2132+ "costUsd": 0.001875
2133+ },
2134+ {
2135+ "test": "english",
2136+ "ok": true,
2137+ "latencyMs": 2468,
2138+ "ttftMs": 840,
2139+ "usage": {
2140+ "input": 21,
2141+ "output": 64,
2142+ "cachedInput": 0
2143+ },
2144+ "api": "messages",
2145+ "raw": {
2146+ "stop": "end_turn",
2147+ "stop_details": null
2148+ },
2149+ "sample": "A hedonic pricing model is a statistical method that breaks down the price of a good into the values of its individual characteristics or attributes. It is commonly used to estimate the implicit value of specific features, such as determining how much a swimming pool or an extra bedroom contributes ",
2150+ "costUsd": 0.001023
2151+ },
2152+ {
2153+ "test": "json",
2154+ "ok": true,
2155+ "latencyMs": 1158,
2156+ "ttftMs": 820,
2157+ "usage": {
2158+ "input": 56,
2159+ "output": 48,
2160+ "cachedInput": 0
2161+ },
2162+ "api": "messages",
2163+ "raw": {
2164+ "stop": "end_turn",
2165+ "stop_details": null
2166+ },
2167+ "sample": "```json\n{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 291041\n}\n```",
2168+ "costUsd": 0.000888
2169+ },
2170+ {
2171+ "test": "tools",
2172+ "ok": true,
2173+ "latencyMs": 1432,
2174+ "usage": {
2175+ "input": 595,
2176+ "output": 58,
2177+ "cachedInput": 0
2178+ },
2179+ "api": "messages",
2180+ "raw": {
2181+ "stop": "tool_use",
2182+ "stop_details": null
2183+ },
2184+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
2185+ "costUsd": 0.002655
2186+ },
2187+ {
2188+ "test": "vision",
2189+ "ok": true,
2190+ "latencyMs": 732,
2191+ "ttftMs": 539,
2192+ "usage": {
2193+ "input": 211,
2194+ "output": 10,
2195+ "cachedInput": 0
2196+ },
2197+ "api": "messages",
2198+ "raw": {
2199+ "stop": "end_turn",
2200+ "stop_details": null
2201+ },
2202+ "sample": "circles=3; other=square",
2203+ "costUsd": 0.000783
2204+ },
2205+ {
2206+ "test": "longctx",
2207+ "ok": true,
2208+ "latencyMs": 1212,
2209+ "ttftMs": 1116,
2210+ "usage": {
2211+ "input": 11100,
2212+ "output": 9,
2213+ "cachedInput": 0
2214+ },
2215+ "api": "messages",
2216+ "raw": {
2217+ "stop": "end_turn",
2218+ "stop_details": null
2219+ },
2220+ "sample": "7431-ALPHA",
2221+ "costUsd": 0.033435
2222+ },
2223+ {
2224+ "test": "streaming",
2225+ "ok": true,
2226+ "latencyMs": 1675,
2227+ "ttftMs": 785,
2228+ "usage": {
2229+ "input": 16,
2230+ "output": 32,
2231+ "cachedInput": 0
2232+ },
2233+ "api": "messages",
2234+ "raw": {
2235+ "stop": "end_turn",
2236+ "stop_details": null
2237+ },
2238+ "sample": "# Winter in Quebec\n\nSnow drifts bury doors\nFrost paints white on windowpanes\nCold breath hangs like smoke",
2239+ "costUsd": 0.000528
2240+ }
2241+ ]
2242+ },
2243+ "claude-sonnet-4-6": {
2244+ "provider": "anthropic",
2245+ "kind": "chat",
2246+ "tests": [
2247+ {
2248+ "test": "basic",
2249+ "ok": true,
2250+ "latencyMs": 1058,
2251+ "ttftMs": 958,
2252+ "usage": {
2253+ "input": 20,
2254+ "output": 4,
2255+ "cachedInput": 0
2256+ },
2257+ "api": "messages",
2258+ "raw": {
2259+ "stop": "end_turn",
2260+ "stop_details": null
2261+ },
2262+ "sample": "Ottawa",
2263+ "costUsd": 0.00012
2264+ },
2265+ {
2266+ "test": "reasoning",
2267+ "ok": true,
2268+ "latencyMs": 2909,
2269+ "ttftMs": 1821,
2270+ "usage": {
2271+ "input": 48,
2272+ "output": 143,
2273+ "cachedInput": 0
2274+ },
2275+ "api": "messages",
2276+ "raw": {
2277+ "stop": "end_turn",
2278+ "stop_details": null
2279+ },
2280+ "sample": "## Thinking it through:\n\nAlice is a girl, so she counts as a sister to her brothers.\n\nEach of Alice's brothers has these sisters:\n- Alice herself\n- Alice's 2 sisters\n\nSo each brother has **3 sisters** total.\n\nANSWER: 3",
2281+ "costUsd": 0.002289
2282+ },
2283+ {
2284+ "test": "math",
2285+ "ok": true,
2286+ "latencyMs": 2260,
2287+ "ttftMs": 2065,
2288+ "usage": {
2289+ "input": 58,
2290+ "output": 111,
2291+ "cachedInput": 0
2292+ },
2293+ "api": "messages",
2294+ "raw": {
2295+ "stop": "end_turn",
2296+ "stop_details": null
2297+ },
2298+ "sample": "a=403;b=2500",
2299+ "costUsd": 0.001839
2300+ },
2301+ {
2302+ "test": "code",
2303+ "ok": true,
2304+ "latencyMs": 1912,
2305+ "ttftMs": 994,
2306+ "usage": {
2307+ "input": 50,
2308+ "output": 123,
2309+ "cachedInput": 0
2310+ },
2311+ "api": "messages",
2312+ "raw": {
2313+ "stop": "end_turn",
2314+ "stop_details": null
2315+ },
2316+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
2317+ "costUsd": 0.001995
2318+ },
2319+ {
2320+ "test": "french",
2321+ "ok": true,
2322+ "latencyMs": 4367,
2323+ "ttftMs": 1616,
2324+ "usage": {
2325+ "input": 40,
2326+ "output": 171,
2327+ "cachedInput": 0
2328+ },
2329+ "api": "messages",
2330+ "raw": {
2331+ "stop": "end_turn",
2332+ "stop_details": null
2333+ },
2334+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf des bâtiments, diminué d'une dépréciation tenant compte de leur vétusté et de leur obsolescence. Cette approche est particulièrement utilisée p",
2335+ "costUsd": 0.002685
2336+ },
2337+ {
2338+ "test": "english",
2339+ "ok": true,
2340+ "latencyMs": 3392,
2341+ "ttftMs": 1294,
2342+ "usage": {
2343+ "input": 21,
2344+ "output": 123,
2345+ "cachedInput": 0
2346+ },
2347+ "api": "messages",
2348+ "raw": {
2349+ "stop": "end_turn",
2350+ "stop_details": null
2351+ },
2352+ "sample": "A hedonic pricing model is an econometric method used to estimate the value of a good by breaking it down into its constituent characteristics and determining how each attribute contributes to its overall price. It is commonly applied in real estate, where a home's price is modeled as a function of ",
2353+ "costUsd": 0.001908
2354+ },
2355+ {
2356+ "test": "json",
2357+ "ok": true,
2358+ "latencyMs": 2958,
2359+ "ttftMs": 2718,
2360+ "usage": {
2361+ "input": 56,
2362+ "output": 158,
2363+ "cachedInput": 0
2364+ },
2365+ "api": "messages",
2366+ "raw": {
2367+ "stop": "end_turn",
2368+ "stop_details": null
2369+ },
2370+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
2371+ "costUsd": 0.002538
2372+ },
2373+ {
2374+ "test": "tools",
2375+ "ok": true,
2376+ "latencyMs": 2474,
2377+ "ttftMs": 1732,
2378+ "usage": {
2379+ "input": 596,
2380+ "output": 121,
2381+ "cachedInput": 0
2382+ },
2383+ "api": "messages",
2384+ "raw": {
2385+ "stop": "tool_use",
2386+ "stop_details": null
2387+ },
2388+ "sample": "Sure! Let me fetch the current weather for Gatineau, Quebec right now!",
2389+ "costUsd": 0.003603
2390+ },
2391+ {
2392+ "test": "vision",
2393+ "ok": true,
2394+ "latencyMs": 951,
2395+ "ttftMs": 780,
2396+ "usage": {
2397+ "input": 211,
2398+ "output": 10,
2399+ "cachedInput": 0
2400+ },
2401+ "api": "messages",
2402+ "raw": {
2403+ "stop": "end_turn",
2404+ "stop_details": null
2405+ },
2406+ "sample": "circles=3; other=square",
2407+ "costUsd": 0.000783
2408+ },
2409+ {
2410+ "test": "longctx",
2411+ "ok": true,
2412+ "latencyMs": 2763,
2413+ "ttftMs": 2548,
2414+ "usage": {
2415+ "input": 11100,
2416+ "output": 9,
2417+ "cachedInput": 0
2418+ },
2419+ "api": "messages",
2420+ "raw": {
2421+ "stop": "end_turn",
2422+ "stop_details": null
2423+ },
2424+ "sample": "7431-ALPHA",
2425+ "costUsd": 0.033435
2426+ },
2427+ {
2428+ "test": "streaming",
2429+ "ok": true,
2430+ "latencyMs": 5794,
2431+ "ttftMs": 5791,
2432+ "usage": {
2433+ "input": 16,
2434+ "output": 300,
2435+ "cachedInput": 0
2436+ },
2437+ "api": "messages",
2438+ "raw": {
2439+ "stop": "end_turn",
2440+ "stop_details": null
2441+ },
2442+ "sample": "**Snow blankets the plains**\n**St. Lawrence locked in silence**\n**Maple dreams of spring**",
2443+ "costUsd": 0.004548
2444+ }
2445+ ]
2446+ },
2447+ "claude-sonnet-5": {
2448+ "provider": "anthropic",
2449+ "kind": "chat",
2450+ "tests": [
2451+ {
2452+ "test": "basic",
2453+ "ok": true,
2454+ "latencyMs": 908,
2455+ "ttftMs": 515,
2456+ "usage": {
2457+ "input": 24,
2458+ "output": 9,
2459+ "cachedInput": 0
2460+ },
2461+ "api": "messages",
2462+ "raw": {
2463+ "stop": "end_turn",
2464+ "stop_details": null
2465+ },
2466+ "sample": "**Ottawa**",
2467+ "costUsd": 0.000138
2468+ },
2469+ {
2470+ "test": "reasoning",
2471+ "ok": true,
2472+ "latencyMs": 2367,
2473+ "ttftMs": 1557,
2474+ "usage": {
2475+ "input": 65,
2476+ "output": 194,
2477+ "cachedInput": 0
2478+ },
2479+ "api": "messages",
2480+ "raw": {
2481+ "stop": "end_turn",
2482+ "stop_details": null
2483+ },
2484+ "sample": "Each brother shares the same siblings as Alice. Alice has 2 sisters, which means there are 3 girls total in the family (Alice + her 2 sisters). From a brother's perspective, all 3 girls (including Alice) are his sisters.\n\nANSWER: 3",
2485+ "costUsd": 0.00207
2486+ },
2487+ {
2488+ "test": "math",
2489+ "ok": true,
2490+ "latencyMs": 1133,
2491+ "ttftMs": 910,
2492+ "usage": {
2493+ "input": 70,
2494+ "output": 56,
2495+ "cachedInput": 0
2496+ },
2497+ "api": "messages",
2498+ "raw": {
2499+ "stop": "end_turn",
2500+ "stop_details": null
2501+ },
2502+ "sample": "a=403;b=2500",
2503+ "costUsd": 0.0007
2504+ },
2505+ {
2506+ "test": "code",
2507+ "ok": true,
2508+ "latencyMs": 1168,
2509+ "ttftMs": 475,
2510+ "usage": {
2511+ "input": 68,
2512+ "output": 103,
2513+ "cachedInput": 0
2514+ },
2515+ "api": "messages",
2516+ "raw": {
2517+ "stop": "end_turn",
2518+ "stop_details": null
2519+ },
2520+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
2521+ "costUsd": 0.001166
2522+ },
2523+ {
2524+ "test": "french",
2525+ "ok": true,
2526+ "latencyMs": 2344,
2527+ "ttftMs": 470,
2528+ "usage": {
2529+ "input": 49,
2530+ "output": 190,
2531+ "cachedInput": 0
2532+ },
2533+ "api": "messages",
2534+ "raw": {
2535+ "stop": "end_turn",
2536+ "stop_details": null
2537+ },
2538+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en calculant le coût de remplacement ou de reconstruction à neuf de la construction, duquel on déduit la dépréciation liée à l'usure, à l'obsolescence physique, fonctionnelle ou économique, puis en ajoutant la valeur",
2539+ "costUsd": 0.001998
2540+ },
2541+ {
2542+ "test": "english",
2543+ "ok": true,
2544+ "latencyMs": 1532,
2545+ "ttftMs": 460,
2546+ "usage": {
2547+ "input": 29,
2548+ "output": 113,
2549+ "cachedInput": 0
2550+ },
2551+ "api": "messages",
2552+ "raw": {
2553+ "stop": "end_turn",
2554+ "stop_details": null
2555+ },
2556+ "sample": "A hedonic pricing model is a statistical technique used to estimate the value of a good or service by breaking it down into its constituent characteristics and determining the implicit price of each attribute. It is commonly applied to markets like real estate, where the price of a home is analyzed ",
2557+ "costUsd": 0.001188
2558+ },
2559+ {
2560+ "test": "json",
2561+ "ok": true,
2562+ "latencyMs": 1069,
2563+ "ttftMs": 497,
2564+ "usage": {
2565+ "input": 69,
2566+ "output": 41,
2567+ "cachedInput": 0
2568+ },
2569+ "api": "messages",
2570+ "raw": {
2571+ "stop": "end_turn",
2572+ "stop_details": null
2573+ },
2574+ "sample": "{\"city\": \"Gatineau\", \"country\": \"Canada\", \"province\": \"Quebec\", \"population_estimate\": 291041}",
2575+ "costUsd": 0.000548
2576+ },
2577+ {
2578+ "test": "tools",
2579+ "ok": true,
2580+ "latencyMs": 1268,
2581+ "usage": {
2582+ "input": 479,
2583+ "output": 93,
2584+ "cachedInput": 0
2585+ },
2586+ "api": "messages",
2587+ "raw": {
2588+ "stop": "tool_use",
2589+ "stop_details": null
2590+ },
2591+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
2592+ "costUsd": 0.001888
2593+ },
2594+ {
2595+ "test": "vision",
2596+ "ok": true,
2597+ "latencyMs": 993,
2598+ "ttftMs": 576,
2599+ "usage": {
2600+ "input": 217,
2601+ "output": 10,
2602+ "cachedInput": 0
2603+ },
2604+ "api": "messages",
2605+ "raw": {
2606+ "stop": "end_turn",
2607+ "stop_details": null
2608+ },
2609+ "sample": "circles=3; other=square",
2610+ "costUsd": 0.000534
2611+ },
2612+ {
2613+ "test": "longctx",
2614+ "ok": true,
2615+ "latencyMs": 1153,
2616+ "ttftMs": 1128,
2617+ "usage": {
2618+ "input": 15022,
2619+ "output": 10,
2620+ "cachedInput": 0
2621+ },
2622+ "api": "messages",
2623+ "raw": {
2624+ "stop": "end_turn",
2625+ "stop_details": null
2626+ },
2627+ "sample": "7431-ALPHA",
2628+ "costUsd": 0.030144
2629+ },
2630+ {
2631+ "test": "streaming",
2632+ "ok": true,
2633+ "latencyMs": 1170,
2634+ "ttftMs": 528,
2635+ "usage": {
2636+ "input": 21,
2637+ "output": 35,
2638+ "cachedInput": 0
2639+ },
2640+ "api": "messages",
2641+ "raw": {
2642+ "stop": "end_turn",
2643+ "stop_details": null
2644+ },
2645+ "sample": "Snow blankets the fields—\nMaple trees stand bare and still,\nBreath turns into mist.",
2646+ "costUsd": 0.000392
2647+ }
2648+ ]
2649+ },
2650+ "claude-sonnet-5-5": {
2651+ "provider": "anthropic",
2652+ "kind": "chat",
2653+ "tests": [
2654+ {
2655+ "test": "basic",
2656+ "ok": true,
2657+ "latencyMs": 1025,
2658+ "ttftMs": 1017,
2659+ "usage": {
2660+ "input": 26,
2661+ "output": 7,
2662+ "cachedInput": 0
2663+ },
2664+ "api": "messages",
2665+ "raw": {
2666+ "stop": "end_turn",
2667+ "stop_details": null
2668+ },
2669+ "sample": "Ottawa",
2670+ "costUsd": 0.000122
2671+ },
2672+ {
2673+ "test": "reasoning",
2674+ "ok": true,
2675+ "latencyMs": 1538,
2676+ "ttftMs": 561,
2677+ "usage": {
2678+ "input": 67,
2679+ "output": 89,
2680+ "cachedInput": 0
2681+ },
2682+ "api": "messages",
2683+ "raw": {
2684+ "stop": "end_turn",
2685+ "stop_details": null
2686+ },
2687+ "sample": "Alice has 2 sisters, so the girls in the family are Alice plus those 2 sisters, which makes 3 girls in total.\n\nEach of Alice's brothers has all 3 girls as sisters: Alice and her 2 sisters.\n\nANSWER: 3",
2688+ "costUsd": 0.001024
2689+ },
2690+ {
2691+ "test": "math",
2692+ "ok": true,
2693+ "latencyMs": 1026,
2694+ "ttftMs": 525,
2695+ "usage": {
2696+ "input": 72,
2697+ "output": 10,
2698+ "cachedInput": 0
2699+ },
2700+ "api": "messages",
2701+ "raw": {
2702+ "stop": "end_turn",
2703+ "stop_details": null
2704+ },
2705+ "sample": "a=403;b=2500",
2706+ "costUsd": 0.000244
2707+ },
2708+ {
2709+ "test": "code",
2710+ "ok": true,
2711+ "latencyMs": 1496,
2712+ "ttftMs": 520,
2713+ "usage": {
2714+ "input": 70,
2715+ "output": 144,
2716+ "cachedInput": 0
2717+ },
2718+ "api": "messages",
2719+ "raw": {
2720+ "stop": "end_turn",
2721+ "stop_details": null
2722+ },
2723+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
2724+ "costUsd": 0.00158
2725+ },
2726+ {
2727+ "test": "french",
2728+ "ok": true,
2729+ "latencyMs": 2180,
2730+ "ttftMs": 501,
2731+ "usage": {
2732+ "input": 51,
2733+ "output": 222,
2734+ "cachedInput": 0
2735+ },
2736+ "api": "messages",
2737+ "raw": {
2738+ "stop": "end_turn",
2739+ "stop_details": null
2740+ },
2741+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain (déterminée par comparaison avec des terrains similaires) et le coût de reconstruction à neuf du bâtiment, dont on retranche la dépréciation liée à la vétusté, à l'usure physique ",
2742+ "costUsd": 0.002322
2743+ },
2744+ {
2745+ "test": "english",
2746+ "ok": true,
2747+ "latencyMs": 2293,
2748+ "ttftMs": 820,
2749+ "usage": {
2750+ "input": 31,
2751+ "output": 138,
2752+ "cachedInput": 0
2753+ },
2754+ "api": "messages",
2755+ "raw": {
2756+ "stop": "end_turn",
2757+ "stop_details": null
2758+ },
2759+ "sample": "A hedonic pricing model is a statistical method, typically a regression, that estimates the value of a good by breaking its price down into the contributions of its individual characteristics, such as a house's size, location, and age. It is widely used in real estate, consumer price indexes, and en",
2760+ "costUsd": 0.001442
2761+ },
2762+ {
2763+ "test": "json",
2764+ "ok": true,
2765+ "latencyMs": 1143,
2766+ "ttftMs": 524,
2767+ "usage": {
2768+ "input": 71,
2769+ "output": 37,
2770+ "cachedInput": 0
2771+ },
2772+ "api": "messages",
2773+ "raw": {
2774+ "stop": "end_turn",
2775+ "stop_details": null
2776+ },
2777+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
2778+ "costUsd": 0.000512
2779+ },
2780+ {
2781+ "test": "tools",
2782+ "ok": true,
2783+ "latencyMs": 1279,
2784+ "usage": {
2785+ "input": 413,
2786+ "output": 57,
2787+ "cachedInput": 0
2788+ },
2789+ "api": "messages",
2790+ "raw": {
2791+ "stop": "tool_use",
2792+ "stop_details": null
2793+ },
2794+ "sample": "{\"name\":\"get_weather\",\"arguments\":{\"location\":\"Gatineau, Quebec\"}}",
2795+ "costUsd": 0.001396
2796+ },
2797+ {
2798+ "test": "vision",
2799+ "ok": true,
2800+ "latencyMs": 1091,
2801+ "ttftMs": 586,
2802+ "usage": {
2803+ "input": 219,
2804+ "output": 10,
2805+ "cachedInput": 0
2806+ },
2807+ "api": "messages",
2808+ "raw": {
2809+ "stop": "end_turn",
2810+ "stop_details": null
2811+ },
2812+ "sample": "circles=3; other=square",
2813+ "costUsd": 0.000538
2814+ },
2815+ {
2816+ "test": "longctx",
2817+ "ok": true,
2818+ "latencyMs": 1200,
2819+ "ttftMs": 745,
2820+ "usage": {
2821+ "input": 15024,
2822+ "output": 10,
2823+ "cachedInput": 0
2824+ },
2825+ "api": "messages",
2826+ "raw": {
2827+ "stop": "end_turn",
2828+ "stop_details": null
2829+ },
2830+ "sample": "7431-ALPHA",
2831+ "costUsd": 0.030148
2832+ },
2833+ {
2834+ "test": "streaming",
2835+ "ok": true,
2836+ "latencyMs": 1392,
2837+ "ttftMs": 843,
2838+ "usage": {
2839+ "input": 23,
2840+ "output": 32,
2841+ "cachedInput": 0
2842+ },
2843+ "api": "messages",
2844+ "raw": {
2845+ "stop": "end_turn",
2846+ "stop_details": null
2847+ },
2848+ "sample": "Snow hushes the streets,\nbreath curls white above poutine—\nthe cold sings in French.",
2849+ "costUsd": 0.000366
2850+ }
2851+ ]
2852+ }
2853+ }
2854+}
\ No newline at end of file
added benchmarks/artifacts/chatgpt-image-latest.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-1-mini.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-1.5.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.5-flare.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.5-sunburst.png +0 −0

Binary file not shown.

added benchmarks/artifacts/gpt-image-2.png +0 −0

Binary file not shown.

added benchmarks/artifacts/tts-sample.mp3 +0 −0

Binary file not shown.

added benchmarks/benchmark-report.md +228 −0
@@ -0,0 +1,228 @@
1+# Chat SPBoucher AI — Benchmark report
2+
3+Generated 2026-11-01T07:22:05.282Z. Every figure below comes from a real API response recorded in `openai-results.json`, `anthropic-results.json` or `modality-results.json`. Prices come from the official pricing pages (see `pricing.json`). Nothing is estimated from memory.
4+
5+## Summary
6+
7+| | OpenAI | Anthropic |
8+|---|---|---|
9+| Models listed by the API | 140 | 14 |
10+| Chat models benchmarked (verified) | 30 | 14 |
11+| Listed but unavailable (404/deprecated) | 23 | 0 |
12+| Specialized models verified (image/tts/stt/embedding/moderation) | 18 | 0 |
13+| Not exercised (realtime/video/legacy/deep-research) | 20 | 0 |
14+
15+Total benchmark spend (estimated from usage × verified prices): **$2.41**.
16+
17+## Test suite
18+
19+| Test | What is measured | Grading |
20+|---|---|---|
21+| basic | capital of Canada | contains "Ottawa" |
22+| reasoning | sisters/brothers riddle | final answer 3 |
23+| math | 17·23+144/12 and Σ first 50 odd | a=403;b=2500 |
24+| code | isPrime(n) in JS | code executed with node against 8 cases |
25+| french | 2 phrases sur la méthode du coût | vocabulaire FR, aucun mot anglais courant |
26+| english | hedonic pricing in 2 sentences | key terms, ≤3 sentences |
27+| json | strict JSON object about Gatineau | JSON.parse + typed keys |
28+| tools | get_weather function call | tool call emitted with location=Gatineau |
29+| vision | PNG with 3 red circles + blue square | circles=3 and square named |
30+| longctx | ~12k-token document, needle at 42% | code 7431-ALPHA returned |
31+| streaming | haiku, streamed | time-to-first-token measured |
32+
33+Settings: provider defaults (OpenAI Responses API; Anthropic adaptive thinking where supported), max 8 000 output tokens (6 000 for *-pro models, which ran a reduced 4-test suite), one run per test. Single-shot results are indicative, not statistically robust.
34+
35+## Verified chat models — ranked by quality score
36+
37+Quality score = share of the 9 graded tests passed (reasoning, math, code, french, english, json, tools, vision, longctx). Latency = median over text tests. Prices in $/1M tokens (input / output).
38+
39+| Model | Provider | Quality | p50 latency | p50 TTFT | Price in/out | Blended $/1M* | Failures / errors |
40+|---|---|---|---|---|---|---|---|
41+| claude-haiku-5-5 | anthropic | 100% | 883 ms | 637 ms | $0.1 / $0.5 | $0.20 | — |
42+| claude-haiku-4-5-20251001 | anthropic | 100% | 1119 ms | 405 ms | $1 / $5 | $2.00 | — |
43+| claude-sonnet-5 | anthropic | 100% | 1168 ms | 528 ms | $2 / $10 | $4.00 | — |
44+| chat-latest | openai | 100% | 1215 ms | 547 ms | $5 / $30 | $11.25 | — |
45+| claude-fable-5-1 | anthropic | 100% | 1321 ms | 364 ms | $10 / $50 | $20.00 | — |
46+| claude-sonnet-5-5 | anthropic | 100% | 1496 ms | 586 ms | $2 / $10 | $4.00 | — |
47+| gpt-6-sol | openai | 100% | 1516 ms | 1608 ms | $2 / $10 | $4.00 | — |
48+| gpt-5.6-sol | openai | 100% | 1527 ms | 2268 ms | $4 / $20 | $8.00 | — |
49+| gpt-5.6-luna | openai | 100% | 1581 ms | 3271 ms | $0.2 / $1.2 | $0.45 | — |
50+| o3 | openai | 100% | 1643 ms | 660 ms | $2 / $8 | $3.50 | — |
51+| claude-opus-4-7 | anthropic | 100% | 1659 ms | 537 ms | $5 / $25 | $10.00 | — |
52+| claude-opus-5-5 | anthropic | 100% | 1742 ms | 954 ms | $4 / $20 | $8.00 | — |
53+| claude-opus-4-8 | anthropic | 100% | 1887 ms | 622 ms | $5 / $25 | $10.00 | — |
54+| claude-sonnet-4-5-20250929 | anthropic | 100% | 1934 ms | 785 ms | $3 / $15 | $6.00 | — |
55+| gpt-6-luna | openai | 100% | 2005 ms | 2952 ms | $0.1 / $0.5 | $0.20 | — |
56+| gpt-6.1-sol | openai | 100% | 2020 ms | 3051 ms | $2 / $10 | $4.00 | — |
57+| gpt-5.5 | openai | 100% | 2089 ms | 730 ms | $5 / $30 | $11.25 | — |
58+| gpt-6-astra | openai | 100% | 2190 ms | 3799 ms | $10 / $50 | $20.00 | — |
59+| gpt-6.1-terra | openai | 100% | 2208 ms | 1841 ms | $1 / $5 | $2.00 | — |
60+| claude-opus-5 | anthropic | 100% | 2242 ms | 1136 ms | $5 / $25 | $10.00 | — |
61+| claude-fable-5 | anthropic | 100% | 2691 ms | 1862 ms | $10 / $50 | $20.00 | — |
62+| claude-sonnet-4-6 | anthropic | 100% | 2909 ms | 1732 ms | $3 / $15 | $6.00 | — |
63+| gpt-5-nano | openai | 100% | 3034 ms | 10356 ms | $0.05 / $0.4 | $0.14 | — |
64+| claude-opus-4-6 | anthropic | 100% | 3613 ms | 2309 ms | $5 / $25 | $10.00 | — |
65+| gpt-5-mini | openai | 100% | 3711 ms | 10075 ms | $0.25 / $2 | $0.69 | — |
66+| gpt-5 | openai | 100% | 3814 ms | 7922 ms | $1.25 / $10 | $3.44 | — |
67+| gpt-5.5-pro | openai | 100% | 5531 ms | — ms | $30 / $180 | $67.50 | — |
68+| gpt-5.2-pro | openai | 100% | 6297 ms | — ms | $21 / $168 | $57.75 | — |
69+| o3-pro | openai | 100% | 6627 ms | — ms | $20 / $80 | $35.00 | — |
70+| gpt-5.4-pro | openai | 100% | 14838 ms | — ms | $30 / $180 | $67.50 | — |
71+| gpt-5-pro | openai | 100% | 47132 ms | — ms | $15 / $120 | $41.25 | — |
72+| gpt-4.1 | openai | 89% | 704 ms | 413 ms | $2 / $8 | $3.50 | math |
73+| gpt-5.4-mini | openai | 89% | 888 ms | 458 ms | $0.75 / $4.5 | $1.69 | math |
74+| gpt-4.1-mini | openai | 89% | 897 ms | 343 ms | $0.4 / $1.6 | $0.70 | math |
75+| gpt-5.1 | openai | 89% | 1084 ms | 610 ms | $1.25 / $10 | $3.44 | math |
76+| gpt-5.3-codex | openai | 89% | 1209 ms | 545 ms | $1.75 / $14 | $4.81 | reasoning |
77+| gpt-5.6-terra | openai | 89% | 1214 ms | 611 ms | $2 / $12 | $4.50 | longctx |
78+| gpt-5.4 | openai | 89% | 1466 ms | 651 ms | $2.5 / $15 | $5.63 | reasoning |
79+| claude-opus-4-5-20251101 | anthropic | 89% | 1940 ms | 806 ms | $5 / $25 | $10.00 | longctx |
80+| gpt-4o-mini | openai | 78% | 893 ms | 482 ms | $0.15 / $0.6 | $0.26 | reasoning, math |
81+| gpt-5.4-nano | openai | 78% | 969 ms | 541 ms | $0.2 / $1.25 | $0.46 | reasoning, math |
82+| gpt-4o | openai | 78% | 1049 ms | 457 ms | $2.5 / $10 | $4.38 | reasoning, math |
83+| gpt-5.2 | openai | 78% | 1506 ms | 529 ms | $1.75 / $14 | $4.81 | reasoning, longctx |
84+| gpt-5-search-api | openai | 67% | 1707 ms | 1073 ms | $1.25 / $10 | $3.44 | math, tools⚠, vision |
85+
86+\* Blended = (3 × input + output) / 4, a simple comparison heuristic, not a billing figure.
87+
88+## Per-test results
89+
90+| Model | reasoning | math | code | french | english | json | tools | vision | longctx | basic | streaming |
91+|---|---|---|---|---|---|---|---|---|---|---|---|
92+| claude-fable-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
93+| claude-fable-5-1 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
94+| claude-haiku-4-5-20251001 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
95+| claude-haiku-5-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
96+| claude-opus-4-6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
97+| claude-opus-4-7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
98+| claude-opus-4-8 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
99+| claude-opus-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
100+| claude-opus-5-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
101+| claude-sonnet-4-5-20250929 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
102+| claude-sonnet-4-6 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
103+| claude-sonnet-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
104+| claude-sonnet-5-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
105+| claude-opus-4-5-20251101 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
106+| chat-latest | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
107+| gpt-5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
108+| gpt-5-mini | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
109+| gpt-5-nano | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
110+| gpt-5-pro | ✅ | · | · | · | · | ✅ | ✅ | · | · | ✅ | · |
111+| gpt-5.2-pro | ✅ | · | · | · | · | ✅ | ✅ | · | · | ✅ | · |
112+| gpt-5.4-pro | ✅ | · | · | · | · | ✅ | ✅ | · | · | ✅ | · |
113+| gpt-5.5 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
114+| gpt-5.5-pro | ✅ | · | · | · | · | ✅ | ✅ | · | · | ✅ | · |
115+| gpt-5.6-luna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
116+| gpt-5.6-sol | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
117+| gpt-6-astra | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
118+| gpt-6-luna | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
119+| gpt-6-sol | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
120+| gpt-6.1-sol | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
121+| gpt-6.1-terra | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
122+| o3 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
123+| o3-pro | ✅ | · | · | · | · | ✅ | ✅ | · | · | ✅ | · |
124+| gpt-4.1 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
125+| gpt-4.1-mini | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
126+| gpt-5.1 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
127+| gpt-5.3-codex | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
128+| gpt-5.4 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
129+| gpt-5.4-mini | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
130+| gpt-5.6-terra | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
131+| gpt-4o | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
132+| gpt-4o-mini | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
133+| gpt-5.2 | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
134+| gpt-5.4-nano | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
135+| gpt-5-search-api | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ❌ | ✅ | ✅ | ✅ |
136+
137+## Listed but unavailable
138+
139+These ids are returned by the provider's model listing but reject inference. The app marks them **unavailable** and hides them by default.
140+
141+| Model | Provider | Reason |
142+|---|---|---|
143+| gpt-3.5-turbo | openai | The model `gpt-3.5-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
144+| gpt-4 | openai | The model `gpt-4` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
145+| gpt-4-turbo | openai | The model `gpt-4-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
146+| gpt-4.1-nano | openai | The model `gpt-4.1-nano` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
147+| gpt-4o-mini-search-preview | openai | The model `gpt-4o-mini-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
148+| gpt-4o-search-preview | openai | The model `gpt-4o-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
149+| gpt-5-chat-latest | openai | The model `gpt-5-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
150+| gpt-5-codex | openai | The model `gpt-5-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
151+| gpt-5.1-chat-latest | openai | The model `gpt-5.1-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
152+| gpt-5.1-codex | openai | The model `gpt-5.1-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
153+| gpt-5.1-codex-max | openai | The model `gpt-5.1-codex-max` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
154+| gpt-5.1-codex-mini | openai | The model `gpt-5.1-codex-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
155+| gpt-5.2-chat-latest | openai | The model `gpt-5.2-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
156+| gpt-5.2-codex | openai | The model `gpt-5.2-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
157+| gpt-5.3-chat-latest | openai | The model `gpt-5.3-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
158+| gpt-audio | openai | 400 400 This model requires that either input content or output modality contain audio. |
159+| gpt-audio-1.5 | openai | 400 400 This model requires that either input content or output modality contain audio. |
160+| gpt-audio-mini | openai | 400 400 This model requires that either input content or output modality contain audio. |
161+| gpt-image-1 | openai | 400 400 The model 'gpt-image-1' does not exist. |
162+| o1 | openai | The model `o1` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
163+| o1-pro | openai | The model `o1-pro` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
164+| o3-mini | openai | The model `o3-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
165+| o4-mini | openai | The model `o4-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations |
166+
167+## Specialized models (modality tests)
168+
169+| Model | Kind | Result | Latency | Notes |
170+|---|---|---|---|---|
171+| chatgpt-image-latest | image | ✅ verified | 5382 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
172+| gpt-4o-mini-transcribe | stt | ✅ verified | 412 ms | "Bonjour, ceci est un test de synthèse vocale pour Chat SP Bo" |
173+| gpt-4o-mini-tts | tts | ✅ verified | 542 ms | |
174+| gpt-4o-transcribe | stt | ✅ verified | 625 ms | "Bonjour, ceci est un test de synthèse vocale pour Chat SP Bo" |
175+| gpt-4o-transcribe-diarize | stt | ✅ verified | 2799 ms | "Bonjour, ceci est un test de synthèse vocale pour Chat spbou" |
176+| gpt-audio | audio-chat | ❌ 400 400 This model requires that either input content or output modality contain audio. | 122 ms | |
177+| gpt-audio-1.5 | audio-chat | ❌ 400 400 This model requires that either input content or output modality contain audio. | 103 ms | |
178+| gpt-audio-mini | audio-chat | ❌ 400 400 This model requires that either input content or output modality contain audio. | 132 ms | |
179+| gpt-image-1 | image | ❌ 400 400 The model 'gpt-image-1' does not exist. | 174 ms | |
180+| gpt-image-1-mini | image | ✅ verified | 5797 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
181+| gpt-image-1.5 | image | ✅ verified | 4864 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
182+| gpt-image-2 | image | ✅ verified | 6375 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
183+| gpt-image-2.5-flare | image | ✅ verified | 4765 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
184+| gpt-image-2.5-sunburst | image | ✅ verified | 6665 ms | tokens {"input_tokens":17,"input_tokens_details":{"image_tokens":0,"text_tokens":17},"o |
185+| gpt-transcribe | stt | ✅ verified | 459 ms | "Bonjour, ceci est un test de synthèse vocale pour Chat SPBoc" |
186+| omni-moderation-latest | moderation | ✅ verified | 521 ms | |
187+| text-embedding-3-large | embedding | ✅ verified | 215 ms | 3072 dims |
188+| text-embedding-3-small | embedding | ✅ verified | 319 ms | 1536 dims |
189+| text-embedding-ada-002 | embedding | ✅ verified | 162 ms | 1536 dims |
190+| tts-1 | tts | ✅ verified | 2195 ms | |
191+| tts-1-hd | tts | ✅ verified | 1689 ms | |
192+| whisper-1 | stt | ✅ verified | 642 ms | "Bonjour, ceci est un test de synthèse vocale pour Tchat, SP " |
193+
194+## Not exercised
195+
196+| Model | Kind | Why |
197+|---|---|---|
198+| babbage-002 | legacy-completion | Legacy completions endpoint — not used by this app |
199+| davinci-002 | legacy-completion | Legacy completions endpoint — not used by this app |
200+| gpt-3.5-turbo-instruct | legacy-completion | Legacy completions endpoint — not used by this app |
201+| gpt-3.5-turbo-instruct-0914 | legacy-completion | Legacy completions endpoint — not used by this app |
202+| gpt-live-1 | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
203+| gpt-live-transcribe | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
204+| gpt-realtime | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
205+| gpt-realtime-1.5 | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
206+| gpt-realtime-2 | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
207+| gpt-realtime-2.1 | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
208+| gpt-realtime-2.1-mini | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
209+| gpt-realtime-mini | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
210+| gpt-realtime-translate | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
211+| gpt-realtime-whisper | realtime | WebSocket/WebRTC realtime model — not a chat-completion model; not exercised |
212+| o3-deep-research | deep-research | Requires hosted web-search tools and long runs — not benchmarked without explicit budget approval |
213+| o4-mini-deep-research | deep-research | Requires hosted web-search tools and long runs — not benchmarked without explicit budget approval |
214+| sora-2 | video | Video generation — not tested (cost) |
215+| sora-2-pro | video | Video generation — not tested (cost) |
216+| tts-1-1106 | tts | not tested |
217+| tts-1-hd-1106 | tts | not tested |
218+
219+## Errors encountered on verified models
220+
221+- **gpt-5-search-api**: tools: 404 404 tools is not supported in this model. For a list of supported models, refer to https://platform.openai.com/docs/guides/function-call
222+
223+## Limitations
224+
225+- One run per test: latency and pass/fail are single observations.
226+- Reasoning models spend hidden reasoning tokens; their latency and cost reflect default effort.
227+- Pricing was read from the public pricing pages on 2026-11-01; models missing from those pages have no cost estimate.
228+- The long-context test uses ~12k tokens, far below the advertised windows; it checks retrieval, not window size.
added benchmarks/capability-matrix.json +3610 −0
@@ -0,0 +1,3610 @@
1+{
2+ "generatedAt": "2026-11-01T07:22:05.282Z",
3+ "entries": [
4+ {
5+ "id": "claude-fable-5",
6+ "provider": "anthropic",
7+ "kind": "chat",
8+ "available": true,
9+ "tested": true,
10+ "status": "verified",
11+ "capabilities": {
12+ "text": true,
13+ "vision": true,
14+ "tools": true,
15+ "structuredOutput": true,
16+ "streaming": true,
17+ "reasoning": true,
18+ "longContext": true,
19+ "audioInput": false,
20+ "audioOutput": false,
21+ "imageGeneration": false
22+ },
23+ "pricing": {
24+ "input": 10,
25+ "cacheWrite5m": 12.5,
26+ "cacheWrite1h": 20,
27+ "cachedInput": 1,
28+ "output": 50
29+ },
30+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
31+ "contextWindow": 1000000,
32+ "maxOutputTokens": 128000,
33+ "benchmark": {
34+ "tests": 11,
35+ "passed": 11,
36+ "qualityScore": 100,
37+ "p50LatencyMs": 2691,
38+ "p50TtftMs": 1862,
39+ "totalCostUsd": 0.20264,
40+ "avgOutputTokens": 77,
41+ "perTest": {
42+ "basic": "pass",
43+ "reasoning": "pass",
44+ "math": "pass",
45+ "code": "pass",
46+ "french": "pass",
47+ "english": "pass",
48+ "json": "pass",
49+ "tools": "pass",
50+ "vision": "pass",
51+ "longctx": "pass",
52+ "streaming": "pass"
53+ },
54+ "errors": []
55+ }
56+ },
57+ {
58+ "id": "claude-fable-5-1",
59+ "provider": "anthropic",
60+ "kind": "chat",
61+ "available": true,
62+ "tested": true,
63+ "status": "verified",
64+ "capabilities": {
65+ "text": true,
66+ "vision": true,
67+ "tools": true,
68+ "structuredOutput": true,
69+ "streaming": true,
70+ "reasoning": true,
71+ "longContext": true,
72+ "audioInput": false,
73+ "audioOutput": false,
74+ "imageGeneration": false
75+ },
76+ "pricing": {
77+ "input": 10,
78+ "cacheWrite5m": 12.5,
79+ "cacheWrite1h": 20,
80+ "cachedInput": 0.25,
81+ "output": 50
82+ },
83+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
84+ "contextWindow": 1000000,
85+ "maxOutputTokens": 128000,
86+ "benchmark": {
87+ "tests": 11,
88+ "passed": 11,
89+ "qualityScore": 100,
90+ "p50LatencyMs": 1321,
91+ "p50TtftMs": 364,
92+ "totalCostUsd": 0.20326999999999998,
93+ "avgOutputTokens": 77,
94+ "perTest": {
95+ "basic": "pass",
96+ "reasoning": "pass",
97+ "math": "pass",
98+ "code": "pass",
99+ "french": "pass",
100+ "english": "pass",
101+ "json": "pass",
102+ "tools": "pass",
103+ "vision": "pass",
104+ "longctx": "pass",
105+ "streaming": "pass"
106+ },
107+ "errors": []
108+ }
109+ },
110+ {
111+ "id": "claude-haiku-4-5-20251001",
112+ "provider": "anthropic",
113+ "kind": "chat",
114+ "available": true,
115+ "tested": true,
116+ "status": "verified",
117+ "capabilities": {
118+ "text": true,
119+ "vision": true,
120+ "tools": true,
121+ "structuredOutput": true,
122+ "streaming": true,
123+ "reasoning": true,
124+ "longContext": true,
125+ "audioInput": false,
126+ "audioOutput": false,
127+ "imageGeneration": false
128+ },
129+ "pricing": {
130+ "input": 1,
131+ "cacheWrite5m": 1.25,
132+ "cacheWrite1h": 2,
133+ "cachedInput": 0.1,
134+ "output": 5
135+ },
136+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
137+ "contextWindow": 200000,
138+ "maxOutputTokens": 64000,
139+ "benchmark": {
140+ "tests": 11,
141+ "passed": 11,
142+ "qualityScore": 100,
143+ "p50LatencyMs": 1119,
144+ "p50TtftMs": 405,
145+ "totalCostUsd": 0.015415,
146+ "avgOutputTokens": 58,
147+ "perTest": {
148+ "basic": "pass",
149+ "reasoning": "pass",
150+ "math": "pass",
151+ "code": "pass",
152+ "french": "pass",
153+ "english": "pass",
154+ "json": "pass",
155+ "tools": "pass",
156+ "vision": "pass",
157+ "longctx": "pass",
158+ "streaming": "pass"
159+ },
160+ "errors": []
161+ }
162+ },
163+ {
164+ "id": "claude-haiku-5-5",
165+ "provider": "anthropic",
166+ "kind": "chat",
167+ "available": true,
168+ "tested": true,
169+ "status": "verified",
170+ "capabilities": {
171+ "text": true,
172+ "vision": true,
173+ "tools": true,
174+ "structuredOutput": true,
175+ "streaming": true,
176+ "reasoning": true,
177+ "longContext": true,
178+ "audioInput": false,
179+ "audioOutput": false,
180+ "imageGeneration": false
181+ },
182+ "pricing": {
183+ "input": 0.1,
184+ "cacheWrite5m": 0.125,
185+ "cacheWrite1h": 0.2,
186+ "cachedInput": 0.01,
187+ "output": 0.5,
188+ "notes": "prompts >100K tokens: $0.50/$2.50"
189+ },
190+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
191+ "contextWindow": 1000000,
192+ "maxOutputTokens": 128000,
193+ "benchmark": {
194+ "tests": 11,
195+ "passed": 11,
196+ "qualityScore": 100,
197+ "p50LatencyMs": 883,
198+ "p50TtftMs": 637,
199+ "totalCostUsd": 0.0021742000000000003,
200+ "avgOutputTokens": 103,
201+ "perTest": {
202+ "basic": "pass",
203+ "reasoning": "pass",
204+ "math": "pass",
205+ "code": "pass",
206+ "french": "pass",
207+ "english": "pass",
208+ "json": "pass",
209+ "tools": "pass",
210+ "vision": "pass",
211+ "longctx": "pass",
212+ "streaming": "pass"
213+ },
214+ "errors": []
215+ }
216+ },
217+ {
218+ "id": "claude-opus-4-6",
219+ "provider": "anthropic",
220+ "kind": "chat",
221+ "available": true,
222+ "tested": true,
223+ "status": "verified",
224+ "capabilities": {
225+ "text": true,
226+ "vision": true,
227+ "tools": true,
228+ "structuredOutput": true,
229+ "streaming": true,
230+ "reasoning": true,
231+ "longContext": true,
232+ "audioInput": false,
233+ "audioOutput": false,
234+ "imageGeneration": false
235+ },
236+ "pricing": {
237+ "input": 5,
238+ "cacheWrite5m": 6.25,
239+ "cacheWrite1h": 10,
240+ "cachedInput": 0.5,
241+ "output": 25
242+ },
243+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
244+ "contextWindow": 1000000,
245+ "maxOutputTokens": 128000,
246+ "benchmark": {
247+ "tests": 11,
248+ "passed": 11,
249+ "qualityScore": 100,
250+ "p50LatencyMs": 3613,
251+ "p50TtftMs": 2309,
252+ "totalCostUsd": 0.08978,
253+ "avgOutputTokens": 104,
254+ "perTest": {
255+ "basic": "pass",
256+ "reasoning": "pass",
257+ "math": "pass",
258+ "code": "pass",
259+ "french": "pass",
260+ "english": "pass",
261+ "json": "pass",
262+ "tools": "pass",
263+ "vision": "pass",
264+ "longctx": "pass",
265+ "streaming": "pass"
266+ },
267+ "errors": []
268+ }
269+ },
270+ {
271+ "id": "claude-opus-4-7",
272+ "provider": "anthropic",
273+ "kind": "chat",
274+ "available": true,
275+ "tested": true,
276+ "status": "verified",
277+ "capabilities": {
278+ "text": true,
279+ "vision": true,
280+ "tools": true,
281+ "structuredOutput": true,
282+ "streaming": true,
283+ "reasoning": true,
284+ "longContext": true,
285+ "audioInput": false,
286+ "audioOutput": false,
287+ "imageGeneration": false
288+ },
289+ "pricing": {
290+ "input": 5,
291+ "cacheWrite5m": 6.25,
292+ "cacheWrite1h": 10,
293+ "cachedInput": 0.5,
294+ "output": 25
295+ },
296+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
297+ "contextWindow": 1000000,
298+ "maxOutputTokens": 128000,
299+ "benchmark": {
300+ "tests": 11,
301+ "passed": 11,
302+ "qualityScore": 100,
303+ "p50LatencyMs": 1659,
304+ "p50TtftMs": 537,
305+ "totalCostUsd": 0.10087499999999999,
306+ "avgOutputTokens": 67,
307+ "perTest": {
308+ "basic": "pass",
309+ "reasoning": "pass",
310+ "math": "pass",
311+ "code": "pass",
312+ "french": "pass",
313+ "english": "pass",
314+ "json": "pass",
315+ "tools": "pass",
316+ "vision": "pass",
317+ "longctx": "pass",
318+ "streaming": "pass"
319+ },
320+ "errors": []
321+ }
322+ },
323+ {
324+ "id": "claude-opus-4-8",
325+ "provider": "anthropic",
326+ "kind": "chat",
327+ "available": true,
328+ "tested": true,
329+ "status": "verified",
330+ "capabilities": {
331+ "text": true,
332+ "vision": true,
333+ "tools": true,
334+ "structuredOutput": true,
335+ "streaming": true,
336+ "reasoning": true,
337+ "longContext": true,
338+ "audioInput": false,
339+ "audioOutput": false,
340+ "imageGeneration": false
341+ },
342+ "pricing": {
343+ "input": 5,
344+ "cacheWrite5m": 6.25,
345+ "cacheWrite1h": 10,
346+ "cachedInput": 0.5,
347+ "output": 25
348+ },
349+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
350+ "contextWindow": 1000000,
351+ "maxOutputTokens": 128000,
352+ "benchmark": {
353+ "tests": 11,
354+ "passed": 11,
355+ "qualityScore": 100,
356+ "p50LatencyMs": 1887,
357+ "p50TtftMs": 622,
358+ "totalCostUsd": 0.10341999999999998,
359+ "avgOutputTokens": 84,
360+ "perTest": {
361+ "basic": "pass",
362+ "reasoning": "pass",
363+ "math": "pass",
364+ "code": "pass",
365+ "french": "pass",
366+ "english": "pass",
367+ "json": "pass",
368+ "tools": "pass",
369+ "vision": "pass",
370+ "longctx": "pass",
371+ "streaming": "pass"
372+ },
373+ "errors": []
374+ }
375+ },
376+ {
377+ "id": "claude-opus-5",
378+ "provider": "anthropic",
379+ "kind": "chat",
380+ "available": true,
381+ "tested": true,
382+ "status": "verified",
383+ "capabilities": {
384+ "text": true,
385+ "vision": true,
386+ "tools": true,
387+ "structuredOutput": true,
388+ "streaming": true,
389+ "reasoning": true,
390+ "longContext": true,
391+ "audioInput": false,
392+ "audioOutput": false,
393+ "imageGeneration": false
394+ },
395+ "pricing": {
396+ "input": 5,
397+ "cacheWrite5m": 6.25,
398+ "cacheWrite1h": 10,
399+ "cachedInput": 0.5,
400+ "output": 25
401+ },
402+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
403+ "contextWindow": 1000000,
404+ "maxOutputTokens": 128000,
405+ "benchmark": {
406+ "tests": 11,
407+ "passed": 11,
408+ "qualityScore": 100,
409+ "p50LatencyMs": 2242,
410+ "p50TtftMs": 1136,
411+ "totalCostUsd": 0.12025,
412+ "avgOutputTokens": 146,
413+ "perTest": {
414+ "reasoning": "pass",
415+ "math": "pass",
416+ "code": "pass",
417+ "french": "pass",
418+ "english": "pass",
419+ "json": "pass",
420+ "tools": "pass",
421+ "vision": "pass",
422+ "longctx": "pass",
423+ "basic": "pass",
424+ "streaming": "pass"
425+ },
426+ "errors": []
427+ }
428+ },
429+ {
430+ "id": "claude-opus-5-5",
431+ "provider": "anthropic",
432+ "kind": "chat",
433+ "available": true,
434+ "tested": true,
435+ "status": "verified",
436+ "capabilities": {
437+ "text": true,
438+ "vision": true,
439+ "tools": true,
440+ "structuredOutput": true,
441+ "streaming": true,
442+ "reasoning": true,
443+ "longContext": true,
444+ "audioInput": false,
445+ "audioOutput": false,
446+ "imageGeneration": false
447+ },
448+ "pricing": {
449+ "input": 4,
450+ "cacheWrite5m": 5,
451+ "cacheWrite1h": 8,
452+ "cachedInput": 0.2,
453+ "output": 20
454+ },
455+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
456+ "contextWindow": 1000000,
457+ "maxOutputTokens": 128000,
458+ "benchmark": {
459+ "tests": 11,
460+ "passed": 11,
461+ "qualityScore": 100,
462+ "p50LatencyMs": 1742,
463+ "p50TtftMs": 954,
464+ "totalCostUsd": 0.093028,
465+ "avgOutputTokens": 131,
466+ "perTest": {
467+ "basic": "pass",
468+ "reasoning": "pass",
469+ "math": "pass",
470+ "code": "pass",
471+ "french": "pass",
472+ "english": "pass",
473+ "json": "pass",
474+ "tools": "pass",
475+ "vision": "pass",
476+ "longctx": "pass",
477+ "streaming": "pass"
478+ },
479+ "errors": []
480+ }
481+ },
482+ {
483+ "id": "claude-sonnet-4-5-20250929",
484+ "provider": "anthropic",
485+ "kind": "chat",
486+ "available": true,
487+ "tested": true,
488+ "status": "verified",
489+ "capabilities": {
490+ "text": true,
491+ "vision": true,
492+ "tools": true,
493+ "structuredOutput": true,
494+ "streaming": true,
495+ "reasoning": true,
496+ "longContext": true,
497+ "audioInput": false,
498+ "audioOutput": false,
499+ "imageGeneration": false
500+ },
501+ "pricing": {
502+ "input": 3,
503+ "cacheWrite5m": 3.75,
504+ "cacheWrite1h": 6,
505+ "cachedInput": 0.3,
506+ "output": 15,
507+ "notes": "deprecated, retires 2026-11-30"
508+ },
509+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
510+ "contextWindow": 200000,
511+ "maxOutputTokens": 64000,
512+ "benchmark": {
513+ "tests": 11,
514+ "passed": 11,
515+ "qualityScore": 100,
516+ "p50LatencyMs": 1934,
517+ "p50TtftMs": 785,
518+ "totalCostUsd": 0.04611,
519+ "avgOutputTokens": 57,
520+ "perTest": {
521+ "basic": "pass",
522+ "reasoning": "pass",
523+ "math": "pass",
524+ "code": "pass",
525+ "french": "pass",
526+ "english": "pass",
527+ "json": "pass",
528+ "tools": "pass",
529+ "vision": "pass",
530+ "longctx": "pass",
531+ "streaming": "pass"
532+ },
533+ "errors": []
534+ }
535+ },
536+ {
537+ "id": "claude-sonnet-4-6",
538+ "provider": "anthropic",
539+ "kind": "chat",
540+ "available": true,
541+ "tested": true,
542+ "status": "verified",
543+ "capabilities": {
544+ "text": true,
545+ "vision": true,
546+ "tools": true,
547+ "structuredOutput": true,
548+ "streaming": true,
549+ "reasoning": true,
550+ "longContext": true,
551+ "audioInput": false,
552+ "audioOutput": false,
553+ "imageGeneration": false
554+ },
555+ "pricing": {
556+ "input": 3,
557+ "cacheWrite5m": 3.75,
558+ "cacheWrite1h": 6,
559+ "cachedInput": 0.3,
560+ "output": 15
561+ },
562+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
563+ "contextWindow": 1000000,
564+ "maxOutputTokens": 128000,
565+ "benchmark": {
566+ "tests": 11,
567+ "passed": 11,
568+ "qualityScore": 100,
569+ "p50LatencyMs": 2909,
570+ "p50TtftMs": 1732,
571+ "totalCostUsd": 0.055743,
572+ "avgOutputTokens": 116,
573+ "perTest": {
574+ "basic": "pass",
575+ "reasoning": "pass",
576+ "math": "pass",
577+ "code": "pass",
578+ "french": "pass",
579+ "english": "pass",
580+ "json": "pass",
581+ "tools": "pass",
582+ "vision": "pass",
583+ "longctx": "pass",
584+ "streaming": "pass"
585+ },
586+ "errors": []
587+ }
588+ },
589+ {
590+ "id": "claude-sonnet-5",
591+ "provider": "anthropic",
592+ "kind": "chat",
593+ "available": true,
594+ "tested": true,
595+ "status": "verified",
596+ "capabilities": {
597+ "text": true,
598+ "vision": true,
599+ "tools": true,
600+ "structuredOutput": true,
601+ "streaming": true,
602+ "reasoning": true,
603+ "longContext": true,
604+ "audioInput": false,
605+ "audioOutput": false,
606+ "imageGeneration": false
607+ },
608+ "pricing": {
609+ "input": 2,
610+ "cacheWrite5m": 2.5,
611+ "cacheWrite1h": 4,
612+ "cachedInput": 0.2,
613+ "output": 10
614+ },
615+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
616+ "contextWindow": 1000000,
617+ "maxOutputTokens": 128000,
618+ "benchmark": {
619+ "tests": 11,
620+ "passed": 11,
621+ "qualityScore": 100,
622+ "p50LatencyMs": 1168,
623+ "p50TtftMs": 528,
624+ "totalCostUsd": 0.040766,
625+ "avgOutputTokens": 78,
626+ "perTest": {
627+ "basic": "pass",
628+ "reasoning": "pass",
629+ "math": "pass",
630+ "code": "pass",
631+ "french": "pass",
632+ "english": "pass",
633+ "json": "pass",
634+ "tools": "pass",
635+ "vision": "pass",
636+ "longctx": "pass",
637+ "streaming": "pass"
638+ },
639+ "errors": []
640+ }
641+ },
642+ {
643+ "id": "claude-sonnet-5-5",
644+ "provider": "anthropic",
645+ "kind": "chat",
646+ "available": true,
647+ "tested": true,
648+ "status": "verified",
649+ "capabilities": {
650+ "text": true,
651+ "vision": true,
652+ "tools": true,
653+ "structuredOutput": true,
654+ "streaming": true,
655+ "reasoning": true,
656+ "longContext": true,
657+ "audioInput": false,
658+ "audioOutput": false,
659+ "imageGeneration": false
660+ },
661+ "pricing": {
662+ "input": 2,
663+ "cacheWrite5m": 2.5,
664+ "cacheWrite1h": 4,
665+ "cachedInput": 0.1,
666+ "output": 10
667+ },
668+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
669+ "contextWindow": 1000000,
670+ "maxOutputTokens": 128000,
671+ "benchmark": {
672+ "tests": 11,
673+ "passed": 11,
674+ "qualityScore": 100,
675+ "p50LatencyMs": 1496,
676+ "p50TtftMs": 586,
677+ "totalCostUsd": 0.039694,
678+ "avgOutputTokens": 69,
679+ "perTest": {
680+ "basic": "pass",
681+ "reasoning": "pass",
682+ "math": "pass",
683+ "code": "pass",
684+ "french": "pass",
685+ "english": "pass",
686+ "json": "pass",
687+ "tools": "pass",
688+ "vision": "pass",
689+ "longctx": "pass",
690+ "streaming": "pass"
691+ },
692+ "errors": []
693+ }
694+ },
695+ {
696+ "id": "claude-opus-4-5-20251101",
697+ "provider": "anthropic",
698+ "kind": "chat",
699+ "available": true,
700+ "tested": true,
701+ "status": "verified",
702+ "capabilities": {
703+ "text": true,
704+ "vision": true,
705+ "tools": true,
706+ "structuredOutput": true,
707+ "streaming": true,
708+ "reasoning": true,
709+ "longContext": false,
710+ "audioInput": false,
711+ "audioOutput": false,
712+ "imageGeneration": false
713+ },
714+ "pricing": {
715+ "input": 5,
716+ "cacheWrite5m": 6.25,
717+ "cacheWrite1h": 10,
718+ "cachedInput": 0.5,
719+ "output": 25
720+ },
721+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
722+ "contextWindow": 200000,
723+ "maxOutputTokens": 64000,
724+ "benchmark": {
725+ "tests": 11,
726+ "passed": 10,
727+ "qualityScore": 89,
728+ "p50LatencyMs": 1940,
729+ "p50TtftMs": 806,
730+ "totalCostUsd": 0.0801,
731+ "avgOutputTokens": 69,
732+ "perTest": {
733+ "basic": "pass",
734+ "reasoning": "pass",
735+ "math": "pass",
736+ "code": "pass",
737+ "french": "pass",
738+ "english": "pass",
739+ "json": "pass",
740+ "tools": "pass",
741+ "vision": "pass",
742+ "longctx": "fail",
743+ "streaming": "pass"
744+ },
745+ "errors": []
746+ }
747+ },
748+ {
749+ "id": "chat-latest",
750+ "provider": "openai",
751+ "kind": "chat",
752+ "api": "responses",
753+ "available": true,
754+ "tested": true,
755+ "status": "verified",
756+ "capabilities": {
757+ "text": true,
758+ "vision": true,
759+ "tools": true,
760+ "structuredOutput": true,
761+ "streaming": true,
762+ "reasoning": true,
763+ "longContext": true,
764+ "audioInput": false,
765+ "audioOutput": false,
766+ "imageGeneration": false
767+ },
768+ "pricing": {
769+ "input": 5,
770+ "cachedInput": 0.5,
771+ "output": 30,
772+ "notes": "ChatGPT model"
773+ },
774+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
775+ "benchmark": {
776+ "tests": 11,
777+ "passed": 11,
778+ "qualityScore": 100,
779+ "p50LatencyMs": 1215,
780+ "p50TtftMs": 547,
781+ "totalCostUsd": 0.059775,
782+ "avgOutputTokens": 35,
783+ "perTest": {
784+ "basic": "pass",
785+ "reasoning": "pass",
786+ "math": "pass",
787+ "code": "pass",
788+ "french": "pass",
789+ "english": "pass",
790+ "json": "pass",
791+ "tools": "pass",
792+ "vision": "pass",
793+ "longctx": "pass",
794+ "streaming": "pass"
795+ },
796+ "errors": []
797+ }
798+ },
799+ {
800+ "id": "gpt-5",
801+ "provider": "openai",
802+ "kind": "chat",
803+ "api": "responses",
804+ "available": true,
805+ "tested": true,
806+ "status": "verified",
807+ "capabilities": {
808+ "text": true,
809+ "vision": true,
810+ "tools": true,
811+ "structuredOutput": true,
812+ "streaming": true,
813+ "reasoning": true,
814+ "longContext": true,
815+ "audioInput": false,
816+ "audioOutput": false,
817+ "imageGeneration": false
818+ },
819+ "pricing": {
820+ "input": 1.25,
821+ "cachedInput": 0.125,
822+ "output": 10
823+ },
824+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
825+ "benchmark": {
826+ "tests": 11,
827+ "passed": 11,
828+ "qualityScore": 100,
829+ "p50LatencyMs": 3814,
830+ "p50TtftMs": 7922,
831+ "totalCostUsd": 0.052955,
832+ "avgOutputTokens": 372,
833+ "perTest": {
834+ "reasoning": "pass",
835+ "math": "pass",
836+ "code": "pass",
837+ "french": "pass",
838+ "english": "pass",
839+ "json": "pass",
840+ "tools": "pass",
841+ "vision": "pass",
842+ "longctx": "pass",
843+ "basic": "pass",
844+ "streaming": "pass"
845+ },
846+ "errors": []
847+ }
848+ },
849+ {
850+ "id": "gpt-5-mini",
851+ "provider": "openai",
852+ "kind": "chat",
853+ "api": "responses",
854+ "available": true,
855+ "tested": true,
856+ "status": "verified",
857+ "capabilities": {
858+ "text": true,
859+ "vision": true,
860+ "tools": true,
861+ "structuredOutput": true,
862+ "streaming": true,
863+ "reasoning": true,
864+ "longContext": true,
865+ "audioInput": false,
866+ "audioOutput": false,
867+ "imageGeneration": false
868+ },
869+ "pricing": {
870+ "input": 0.25,
871+ "cachedInput": 0.025,
872+ "output": 2
873+ },
874+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
875+ "benchmark": {
876+ "tests": 11,
877+ "passed": 11,
878+ "qualityScore": 100,
879+ "p50LatencyMs": 3711,
880+ "p50TtftMs": 10075,
881+ "totalCostUsd": 0.00929875,
882+ "avgOutputTokens": 313,
883+ "perTest": {
884+ "reasoning": "pass",
885+ "math": "pass",
886+ "code": "pass",
887+ "french": "pass",
888+ "english": "pass",
889+ "json": "pass",
890+ "tools": "pass",
891+ "vision": "pass",
892+ "longctx": "pass",
893+ "basic": "pass",
894+ "streaming": "pass"
895+ },
896+ "errors": []
897+ }
898+ },
899+ {
900+ "id": "gpt-5-nano",
901+ "provider": "openai",
902+ "kind": "chat",
903+ "api": "responses",
904+ "available": true,
905+ "tested": true,
906+ "status": "verified",
907+ "capabilities": {
908+ "text": true,
909+ "vision": true,
910+ "tools": true,
911+ "structuredOutput": true,
912+ "streaming": true,
913+ "reasoning": true,
914+ "longContext": true,
915+ "audioInput": false,
916+ "audioOutput": false,
917+ "imageGeneration": false
918+ },
919+ "pricing": {
920+ "input": 0.05,
921+ "cachedInput": 0.005,
922+ "output": 0.4
923+ },
924+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
925+ "benchmark": {
926+ "tests": 11,
927+ "passed": 11,
928+ "qualityScore": 100,
929+ "p50LatencyMs": 3034,
930+ "p50TtftMs": 10356,
931+ "totalCostUsd": 0.0037060500000000002,
932+ "avgOutputTokens": 732,
933+ "perTest": {
934+ "reasoning": "pass",
935+ "math": "pass",
936+ "code": "pass",
937+ "french": "pass",
938+ "english": "pass",
939+ "json": "pass",
940+ "tools": "pass",
941+ "vision": "pass",
942+ "longctx": "pass",
943+ "basic": "pass",
944+ "streaming": "pass"
945+ },
946+ "errors": []
947+ }
948+ },
949+ {
950+ "id": "gpt-5-pro",
951+ "provider": "openai",
952+ "kind": "chat-pro",
953+ "api": "responses",
954+ "available": true,
955+ "tested": true,
956+ "status": "verified",
957+ "capabilities": {
958+ "text": true,
959+ "vision": "unknown",
960+ "tools": true,
961+ "structuredOutput": true,
962+ "streaming": "unknown",
963+ "reasoning": true,
964+ "longContext": "unknown",
965+ "audioInput": false,
966+ "audioOutput": false,
967+ "imageGeneration": false
968+ },
969+ "pricing": {
970+ "input": 15,
971+ "output": 120
972+ },
973+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
974+ "benchmark": {
975+ "tests": 4,
976+ "passed": 4,
977+ "qualityScore": 100,
978+ "p50LatencyMs": 47132,
979+ "p50TtftMs": null,
980+ "totalCostUsd": 0.25377,
981+ "avgOutputTokens": 523,
982+ "perTest": {
983+ "basic": "pass",
984+ "reasoning": "pass",
985+ "json": "pass",
986+ "tools": "pass"
987+ },
988+ "errors": []
989+ }
990+ },
991+ {
992+ "id": "gpt-5.2-pro",
993+ "provider": "openai",
994+ "kind": "chat-pro",
995+ "api": "responses",
996+ "available": true,
997+ "tested": true,
998+ "status": "verified",
999+ "capabilities": {
1000+ "text": true,
1001+ "vision": "unknown",
1002+ "tools": true,
1003+ "structuredOutput": true,
1004+ "streaming": "unknown",
1005+ "reasoning": true,
1006+ "longContext": "unknown",
1007+ "audioInput": false,
1008+ "audioOutput": false,
1009+ "imageGeneration": false
1010+ },
1011+ "pricing": {
1012+ "input": 21,
1013+ "output": 168
1014+ },
1015+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1016+ "benchmark": {
1017+ "tests": 4,
1018+ "passed": 4,
1019+ "qualityScore": 100,
1020+ "p50LatencyMs": 6297,
1021+ "p50TtftMs": null,
1022+ "totalCostUsd": 0.039438,
1023+ "avgOutputTokens": 53,
1024+ "perTest": {
1025+ "basic": "pass",
1026+ "reasoning": "pass",
1027+ "json": "pass",
1028+ "tools": "pass"
1029+ },
1030+ "errors": []
1031+ }
1032+ },
1033+ {
1034+ "id": "gpt-5.4-pro",
1035+ "provider": "openai",
1036+ "kind": "chat-pro",
1037+ "api": "responses",
1038+ "available": true,
1039+ "tested": true,
1040+ "status": "verified",
1041+ "capabilities": {
1042+ "text": true,
1043+ "vision": "unknown",
1044+ "tools": true,
1045+ "structuredOutput": true,
1046+ "streaming": "unknown",
1047+ "reasoning": true,
1048+ "longContext": "unknown",
1049+ "audioInput": false,
1050+ "audioOutput": false,
1051+ "imageGeneration": false
1052+ },
1053+ "pricing": {
1054+ "input": 30,
1055+ "output": 180
1056+ },
1057+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1058+ "benchmark": {
1059+ "tests": 4,
1060+ "passed": 4,
1061+ "qualityScore": 100,
1062+ "p50LatencyMs": 14838,
1063+ "p50TtftMs": null,
1064+ "totalCostUsd": 0.0735,
1065+ "avgOutputTokens": 95,
1066+ "perTest": {
1067+ "basic": "pass",
1068+ "reasoning": "pass",
1069+ "json": "pass",
1070+ "tools": "pass"
1071+ },
1072+ "errors": []
1073+ }
1074+ },
1075+ {
1076+ "id": "gpt-5.5",
1077+ "provider": "openai",
1078+ "kind": "chat",
1079+ "api": "responses",
1080+ "available": true,
1081+ "tested": true,
1082+ "status": "verified",
1083+ "capabilities": {
1084+ "text": true,
1085+ "vision": true,
1086+ "tools": true,
1087+ "structuredOutput": true,
1088+ "streaming": true,
1089+ "reasoning": true,
1090+ "longContext": true,
1091+ "audioInput": false,
1092+ "audioOutput": false,
1093+ "imageGeneration": false
1094+ },
1095+ "pricing": {
1096+ "input": 5,
1097+ "cachedInput": 0.5,
1098+ "output": 30
1099+ },
1100+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1101+ "benchmark": {
1102+ "tests": 11,
1103+ "passed": 11,
1104+ "qualityScore": 100,
1105+ "p50LatencyMs": 2089,
1106+ "p50TtftMs": 730,
1107+ "totalCostUsd": 0.068925,
1108+ "avgOutputTokens": 62,
1109+ "perTest": {
1110+ "basic": "pass",
1111+ "reasoning": "pass",
1112+ "math": "pass",
1113+ "code": "pass",
1114+ "french": "pass",
1115+ "english": "pass",
1116+ "json": "pass",
1117+ "tools": "pass",
1118+ "vision": "pass",
1119+ "longctx": "pass",
1120+ "streaming": "pass"
1121+ },
1122+ "errors": []
1123+ }
1124+ },
1125+ {
1126+ "id": "gpt-5.5-pro",
1127+ "provider": "openai",
1128+ "kind": "chat-pro",
1129+ "api": "responses",
1130+ "available": true,
1131+ "tested": true,
1132+ "status": "verified",
1133+ "capabilities": {
1134+ "text": true,
1135+ "vision": "unknown",
1136+ "tools": true,
1137+ "structuredOutput": true,
1138+ "streaming": "unknown",
1139+ "reasoning": true,
1140+ "longContext": "unknown",
1141+ "audioInput": false,
1142+ "audioOutput": false,
1143+ "imageGeneration": false
1144+ },
1145+ "pricing": {
1146+ "input": 30,
1147+ "output": 180
1148+ },
1149+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1150+ "benchmark": {
1151+ "tests": 4,
1152+ "passed": 4,
1153+ "qualityScore": 100,
1154+ "p50LatencyMs": 5531,
1155+ "p50TtftMs": null,
1156+ "totalCostUsd": 0.06449999999999999,
1157+ "avgOutputTokens": 82,
1158+ "perTest": {
1159+ "basic": "pass",
1160+ "reasoning": "pass",
1161+ "json": "pass",
1162+ "tools": "pass"
1163+ },
1164+ "errors": []
1165+ }
1166+ },
1167+ {
1168+ "id": "gpt-5.6-luna",
1169+ "provider": "openai",
1170+ "kind": "chat",
1171+ "api": "responses",
1172+ "available": true,
1173+ "tested": true,
1174+ "status": "verified",
1175+ "capabilities": {
1176+ "text": true,
1177+ "vision": true,
1178+ "tools": true,
1179+ "structuredOutput": true,
1180+ "streaming": true,
1181+ "reasoning": true,
1182+ "longContext": true,
1183+ "audioInput": false,
1184+ "audioOutput": false,
1185+ "imageGeneration": false
1186+ },
1187+ "pricing": {
1188+ "input": 0.2,
1189+ "cachedInput": 0.02,
1190+ "output": 1.2
1191+ },
1192+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1193+ "benchmark": {
1194+ "tests": 11,
1195+ "passed": 11,
1196+ "qualityScore": 100,
1197+ "p50LatencyMs": 1581,
1198+ "p50TtftMs": 3271,
1199+ "totalCostUsd": 0.0031026000000000005,
1200+ "avgOutputTokens": 88,
1201+ "perTest": {
1202+ "reasoning": "pass",
1203+ "math": "pass",
1204+ "code": "pass",
1205+ "french": "pass",
1206+ "english": "pass",
1207+ "json": "pass",
1208+ "tools": "pass",
1209+ "vision": "pass",
1210+ "longctx": "pass",
1211+ "basic": "pass",
1212+ "streaming": "pass"
1213+ },
1214+ "errors": []
1215+ }
1216+ },
1217+ {
1218+ "id": "gpt-5.6-sol",
1219+ "provider": "openai",
1220+ "kind": "chat",
1221+ "api": "responses",
1222+ "available": true,
1223+ "tested": true,
1224+ "status": "verified",
1225+ "capabilities": {
1226+ "text": true,
1227+ "vision": true,
1228+ "tools": true,
1229+ "structuredOutput": true,
1230+ "streaming": true,
1231+ "reasoning": true,
1232+ "longContext": true,
1233+ "audioInput": false,
1234+ "audioOutput": false,
1235+ "imageGeneration": false
1236+ },
1237+ "pricing": {
1238+ "input": 4,
1239+ "cachedInput": 0.4,
1240+ "output": 20,
1241+ "notes": "promotional through at least 2026-11-21"
1242+ },
1243+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1244+ "benchmark": {
1245+ "tests": 11,
1246+ "passed": 11,
1247+ "qualityScore": 100,
1248+ "p50LatencyMs": 1527,
1249+ "p50TtftMs": 2268,
1250+ "totalCostUsd": 0.0503,
1251+ "avgOutputTokens": 53,
1252+ "perTest": {
1253+ "basic": "pass",
1254+ "reasoning": "pass",
1255+ "math": "pass",
1256+ "code": "pass",
1257+ "french": "pass",
1258+ "english": "pass",
1259+ "json": "pass",
1260+ "tools": "pass",
1261+ "vision": "pass",
1262+ "longctx": "pass",
1263+ "streaming": "pass"
1264+ },
1265+ "errors": []
1266+ }
1267+ },
1268+ {
1269+ "id": "gpt-6-astra",
1270+ "provider": "openai",
1271+ "kind": "chat",
1272+ "api": "responses",
1273+ "available": true,
1274+ "tested": true,
1275+ "status": "verified",
1276+ "capabilities": {
1277+ "text": true,
1278+ "vision": true,
1279+ "tools": true,
1280+ "structuredOutput": true,
1281+ "streaming": true,
1282+ "reasoning": true,
1283+ "longContext": true,
1284+ "audioInput": false,
1285+ "audioOutput": false,
1286+ "imageGeneration": false
1287+ },
1288+ "pricing": {
1289+ "input": 10,
1290+ "cachedInput": 1,
1291+ "output": 50,
1292+ "notes": "long context (>272K) $20/$2/$75"
1293+ },
1294+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1295+ "benchmark": {
1296+ "tests": 11,
1297+ "passed": 11,
1298+ "qualityScore": 100,
1299+ "p50LatencyMs": 2190,
1300+ "p50TtftMs": 3799,
1301+ "totalCostUsd": 0.12985,
1302+ "avgOutputTokens": 60,
1303+ "perTest": {
1304+ "basic": "pass",
1305+ "reasoning": "pass",
1306+ "math": "pass",
1307+ "code": "pass",
1308+ "french": "pass",
1309+ "english": "pass",
1310+ "json": "pass",
1311+ "tools": "pass",
1312+ "vision": "pass",
1313+ "longctx": "pass",
1314+ "streaming": "pass"
1315+ },
1316+ "errors": []
1317+ }
1318+ },
1319+ {
1320+ "id": "gpt-6-luna",
1321+ "provider": "openai",
1322+ "kind": "chat",
1323+ "api": "responses",
1324+ "available": true,
1325+ "tested": true,
1326+ "status": "verified",
1327+ "capabilities": {
1328+ "text": true,
1329+ "vision": true,
1330+ "tools": true,
1331+ "structuredOutput": true,
1332+ "streaming": true,
1333+ "reasoning": true,
1334+ "longContext": true,
1335+ "audioInput": false,
1336+ "audioOutput": false,
1337+ "imageGeneration": false
1338+ },
1339+ "pricing": {
1340+ "input": 0.1,
1341+ "cachedInput": 0.01,
1342+ "output": 0.5
1343+ },
1344+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1345+ "benchmark": {
1346+ "tests": 11,
1347+ "passed": 11,
1348+ "qualityScore": 100,
1349+ "p50LatencyMs": 2005,
1350+ "p50TtftMs": 2952,
1351+ "totalCostUsd": 0.0015370000000000002,
1352+ "avgOutputTokens": 104,
1353+ "perTest": {
1354+ "reasoning": "pass",
1355+ "math": "pass",
1356+ "code": "pass",
1357+ "french": "pass",
1358+ "english": "pass",
1359+ "json": "pass",
1360+ "tools": "pass",
1361+ "vision": "pass",
1362+ "longctx": "pass",
1363+ "basic": "pass",
1364+ "streaming": "pass"
1365+ },
1366+ "errors": []
1367+ }
1368+ },
1369+ {
1370+ "id": "gpt-6-sol",
1371+ "provider": "openai",
1372+ "kind": "chat",
1373+ "api": "responses",
1374+ "available": true,
1375+ "tested": true,
1376+ "status": "verified",
1377+ "capabilities": {
1378+ "text": true,
1379+ "vision": true,
1380+ "tools": true,
1381+ "structuredOutput": true,
1382+ "streaming": true,
1383+ "reasoning": true,
1384+ "longContext": true,
1385+ "audioInput": false,
1386+ "audioOutput": false,
1387+ "imageGeneration": false
1388+ },
1389+ "pricing": {
1390+ "input": 2,
1391+ "cachedInput": 0.2,
1392+ "output": 10
1393+ },
1394+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1395+ "benchmark": {
1396+ "tests": 11,
1397+ "passed": 11,
1398+ "qualityScore": 100,
1399+ "p50LatencyMs": 1516,
1400+ "p50TtftMs": 1608,
1401+ "totalCostUsd": 0.02674,
1402+ "avgOutputTokens": 67,
1403+ "perTest": {
1404+ "basic": "pass",
1405+ "reasoning": "pass",
1406+ "math": "pass",
1407+ "code": "pass",
1408+ "french": "pass",
1409+ "english": "pass",
1410+ "json": "pass",
1411+ "tools": "pass",
1412+ "vision": "pass",
1413+ "longctx": "pass",
1414+ "streaming": "pass"
1415+ },
1416+ "errors": []
1417+ }
1418+ },
1419+ {
1420+ "id": "gpt-6.1-sol",
1421+ "provider": "openai",
1422+ "kind": "chat",
1423+ "api": "responses",
1424+ "available": true,
1425+ "tested": true,
1426+ "status": "verified",
1427+ "capabilities": {
1428+ "text": true,
1429+ "vision": true,
1430+ "tools": true,
1431+ "structuredOutput": true,
1432+ "streaming": true,
1433+ "reasoning": true,
1434+ "longContext": true,
1435+ "audioInput": false,
1436+ "audioOutput": false,
1437+ "imageGeneration": false
1438+ },
1439+ "pricing": {
1440+ "input": 2,
1441+ "cachedInput": 0.1,
1442+ "output": 10
1443+ },
1444+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1445+ "benchmark": {
1446+ "tests": 11,
1447+ "passed": 11,
1448+ "qualityScore": 100,
1449+ "p50LatencyMs": 2020,
1450+ "p50TtftMs": 3051,
1451+ "totalCostUsd": 0.02548,
1452+ "avgOutputTokens": 56,
1453+ "perTest": {
1454+ "basic": "pass",
1455+ "reasoning": "pass",
1456+ "math": "pass",
1457+ "code": "pass",
1458+ "french": "pass",
1459+ "english": "pass",
1460+ "json": "pass",
1461+ "tools": "pass",
1462+ "vision": "pass",
1463+ "longctx": "pass",
1464+ "streaming": "pass"
1465+ },
1466+ "errors": []
1467+ }
1468+ },
1469+ {
1470+ "id": "gpt-6.1-terra",
1471+ "provider": "openai",
1472+ "kind": "chat",
1473+ "api": "responses",
1474+ "available": true,
1475+ "tested": true,
1476+ "status": "verified",
1477+ "capabilities": {
1478+ "text": true,
1479+ "vision": true,
1480+ "tools": true,
1481+ "structuredOutput": true,
1482+ "streaming": true,
1483+ "reasoning": true,
1484+ "longContext": true,
1485+ "audioInput": false,
1486+ "audioOutput": false,
1487+ "imageGeneration": false
1488+ },
1489+ "pricing": {
1490+ "input": 1,
1491+ "cachedInput": 0.05,
1492+ "output": 5
1493+ },
1494+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1495+ "benchmark": {
1496+ "tests": 11,
1497+ "passed": 11,
1498+ "qualityScore": 100,
1499+ "p50LatencyMs": 2208,
1500+ "p50TtftMs": 1841,
1501+ "totalCostUsd": 0.012655,
1502+ "avgOutputTokens": 54,
1503+ "perTest": {
1504+ "basic": "pass",
1505+ "reasoning": "pass",
1506+ "math": "pass",
1507+ "code": "pass",
1508+ "french": "pass",
1509+ "english": "pass",
1510+ "json": "pass",
1511+ "tools": "pass",
1512+ "vision": "pass",
1513+ "longctx": "pass",
1514+ "streaming": "pass"
1515+ },
1516+ "errors": []
1517+ }
1518+ },
1519+ {
1520+ "id": "o3",
1521+ "provider": "openai",
1522+ "kind": "chat",
1523+ "api": "responses",
1524+ "available": true,
1525+ "tested": true,
1526+ "status": "verified",
1527+ "capabilities": {
1528+ "text": true,
1529+ "vision": true,
1530+ "tools": true,
1531+ "structuredOutput": true,
1532+ "streaming": true,
1533+ "reasoning": true,
1534+ "longContext": true,
1535+ "audioInput": false,
1536+ "audioOutput": false,
1537+ "imageGeneration": false
1538+ },
1539+ "pricing": {
1540+ "input": 2,
1541+ "cachedInput": 0.5,
1542+ "output": 8
1543+ },
1544+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1545+ "benchmark": {
1546+ "tests": 11,
1547+ "passed": 11,
1548+ "qualityScore": 100,
1549+ "p50LatencyMs": 1643,
1550+ "p50TtftMs": 660,
1551+ "totalCostUsd": 0.033588,
1552+ "avgOutputTokens": 164,
1553+ "perTest": {
1554+ "basic": "pass",
1555+ "reasoning": "pass",
1556+ "math": "pass",
1557+ "code": "pass",
1558+ "french": "pass",
1559+ "english": "pass",
1560+ "json": "pass",
1561+ "tools": "pass",
1562+ "vision": "pass",
1563+ "longctx": "pass",
1564+ "streaming": "pass"
1565+ },
1566+ "errors": []
1567+ }
1568+ },
1569+ {
1570+ "id": "o3-pro",
1571+ "provider": "openai",
1572+ "kind": "chat-pro",
1573+ "api": "responses",
1574+ "available": true,
1575+ "tested": true,
1576+ "status": "verified",
1577+ "capabilities": {
1578+ "text": true,
1579+ "vision": "unknown",
1580+ "tools": true,
1581+ "structuredOutput": true,
1582+ "streaming": "unknown",
1583+ "reasoning": true,
1584+ "longContext": "unknown",
1585+ "audioInput": false,
1586+ "audioOutput": false,
1587+ "imageGeneration": false
1588+ },
1589+ "pricing": {
1590+ "input": 20,
1591+ "output": 80
1592+ },
1593+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1594+ "benchmark": {
1595+ "tests": 4,
1596+ "passed": 4,
1597+ "qualityScore": 100,
1598+ "p50LatencyMs": 6627,
1599+ "p50TtftMs": null,
1600+ "totalCostUsd": 0.04662,
1601+ "avgOutputTokens": 135,
1602+ "perTest": {
1603+ "basic": "pass",
1604+ "reasoning": "pass",
1605+ "json": "pass",
1606+ "tools": "pass"
1607+ },
1608+ "errors": []
1609+ }
1610+ },
1611+ {
1612+ "id": "gpt-4.1",
1613+ "provider": "openai",
1614+ "kind": "chat",
1615+ "api": "responses",
1616+ "available": true,
1617+ "tested": true,
1618+ "status": "verified",
1619+ "capabilities": {
1620+ "text": true,
1621+ "vision": true,
1622+ "tools": true,
1623+ "structuredOutput": true,
1624+ "streaming": true,
1625+ "reasoning": true,
1626+ "longContext": true,
1627+ "audioInput": false,
1628+ "audioOutput": false,
1629+ "imageGeneration": false
1630+ },
1631+ "pricing": {
1632+ "input": 2,
1633+ "cachedInput": 0.5,
1634+ "output": 8
1635+ },
1636+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1637+ "benchmark": {
1638+ "tests": 11,
1639+ "passed": 10,
1640+ "qualityScore": 89,
1641+ "p50LatencyMs": 704,
1642+ "p50TtftMs": 413,
1643+ "totalCostUsd": 0.022567999999999998,
1644+ "avgOutputTokens": 38,
1645+ "perTest": {
1646+ "basic": "pass",
1647+ "reasoning": "pass",
1648+ "math": "fail",
1649+ "code": "pass",
1650+ "french": "pass",
1651+ "english": "pass",
1652+ "json": "pass",
1653+ "tools": "pass",
1654+ "vision": "pass",
1655+ "longctx": "pass",
1656+ "streaming": "pass"
1657+ },
1658+ "errors": []
1659+ }
1660+ },
1661+ {
1662+ "id": "gpt-4.1-mini",
1663+ "provider": "openai",
1664+ "kind": "chat",
1665+ "api": "responses",
1666+ "available": true,
1667+ "tested": true,
1668+ "status": "verified",
1669+ "capabilities": {
1670+ "text": true,
1671+ "vision": true,
1672+ "tools": true,
1673+ "structuredOutput": true,
1674+ "streaming": true,
1675+ "reasoning": true,
1676+ "longContext": true,
1677+ "audioInput": false,
1678+ "audioOutput": false,
1679+ "imageGeneration": false
1680+ },
1681+ "pricing": {
1682+ "input": 0.4,
1683+ "cachedInput": 0.1,
1684+ "output": 1.6
1685+ },
1686+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1687+ "benchmark": {
1688+ "tests": 11,
1689+ "passed": 10,
1690+ "qualityScore": 89,
1691+ "p50LatencyMs": 897,
1692+ "p50TtftMs": 343,
1693+ "totalCostUsd": 0.0045772,
1694+ "avgOutputTokens": 39,
1695+ "perTest": {
1696+ "basic": "pass",
1697+ "reasoning": "pass",
1698+ "math": "fail",
1699+ "code": "pass",
1700+ "french": "pass",
1701+ "english": "pass",
1702+ "json": "pass",
1703+ "tools": "pass",
1704+ "vision": "pass",
1705+ "longctx": "pass",
1706+ "streaming": "pass"
1707+ },
1708+ "errors": []
1709+ }
1710+ },
1711+ {
1712+ "id": "gpt-5.1",
1713+ "provider": "openai",
1714+ "kind": "chat",
1715+ "api": "responses",
1716+ "available": true,
1717+ "tested": true,
1718+ "status": "verified",
1719+ "capabilities": {
1720+ "text": true,
1721+ "vision": true,
1722+ "tools": true,
1723+ "structuredOutput": true,
1724+ "streaming": true,
1725+ "reasoning": true,
1726+ "longContext": true,
1727+ "audioInput": false,
1728+ "audioOutput": false,
1729+ "imageGeneration": false
1730+ },
1731+ "pricing": {
1732+ "input": 1.25,
1733+ "cachedInput": 0.125,
1734+ "output": 10
1735+ },
1736+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1737+ "benchmark": {
1738+ "tests": 11,
1739+ "passed": 10,
1740+ "qualityScore": 89,
1741+ "p50LatencyMs": 1084,
1742+ "p50TtftMs": 610,
1743+ "totalCostUsd": 0.017055,
1744+ "avgOutputTokens": 46,
1745+ "perTest": {
1746+ "basic": "pass",
1747+ "reasoning": "pass",
1748+ "math": "fail",
1749+ "code": "pass",
1750+ "french": "pass",
1751+ "english": "pass",
1752+ "json": "pass",
1753+ "tools": "pass",
1754+ "vision": "pass",
1755+ "longctx": "pass",
1756+ "streaming": "pass"
1757+ },
1758+ "errors": []
1759+ }
1760+ },
1761+ {
1762+ "id": "gpt-5.3-codex",
1763+ "provider": "openai",
1764+ "kind": "chat",
1765+ "api": "responses",
1766+ "available": true,
1767+ "tested": true,
1768+ "status": "verified",
1769+ "capabilities": {
1770+ "text": true,
1771+ "vision": true,
1772+ "tools": true,
1773+ "structuredOutput": true,
1774+ "streaming": true,
1775+ "reasoning": false,
1776+ "longContext": true,
1777+ "audioInput": false,
1778+ "audioOutput": false,
1779+ "imageGeneration": false
1780+ },
1781+ "pricing": {
1782+ "input": 1.75,
1783+ "cachedInput": 0.175,
1784+ "output": 14
1785+ },
1786+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1787+ "benchmark": {
1788+ "tests": 11,
1789+ "passed": 10,
1790+ "qualityScore": 89,
1791+ "p50LatencyMs": 1209,
1792+ "p50TtftMs": 545,
1793+ "totalCostUsd": 0.022923249999999996,
1794+ "avgOutputTokens": 39,
1795+ "perTest": {
1796+ "basic": "pass",
1797+ "reasoning": "fail",
1798+ "math": "pass",
1799+ "code": "pass",
1800+ "french": "pass",
1801+ "english": "pass",
1802+ "json": "pass",
1803+ "tools": "pass",
1804+ "vision": "pass",
1805+ "longctx": "pass",
1806+ "streaming": "pass"
1807+ },
1808+ "errors": []
1809+ }
1810+ },
1811+ {
1812+ "id": "gpt-5.4",
1813+ "provider": "openai",
1814+ "kind": "chat",
1815+ "api": "responses",
1816+ "available": true,
1817+ "tested": true,
1818+ "status": "verified",
1819+ "capabilities": {
1820+ "text": true,
1821+ "vision": true,
1822+ "tools": true,
1823+ "structuredOutput": true,
1824+ "streaming": true,
1825+ "reasoning": false,
1826+ "longContext": true,
1827+ "audioInput": false,
1828+ "audioOutput": false,
1829+ "imageGeneration": false
1830+ },
1831+ "pricing": {
1832+ "input": 2.5,
1833+ "cachedInput": 0.25,
1834+ "output": 15
1835+ },
1836+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1837+ "benchmark": {
1838+ "tests": 11,
1839+ "passed": 10,
1840+ "qualityScore": 89,
1841+ "p50LatencyMs": 1466,
1842+ "p50TtftMs": 651,
1843+ "totalCostUsd": 0.0304725,
1844+ "avgOutputTokens": 38,
1845+ "perTest": {
1846+ "basic": "pass",
1847+ "reasoning": "fail",
1848+ "math": "pass",
1849+ "code": "pass",
1850+ "french": "pass",
1851+ "english": "pass",
1852+ "json": "pass",
1853+ "tools": "pass",
1854+ "vision": "pass",
1855+ "longctx": "pass",
1856+ "streaming": "pass"
1857+ },
1858+ "errors": []
1859+ }
1860+ },
1861+ {
1862+ "id": "gpt-5.4-mini",
1863+ "provider": "openai",
1864+ "kind": "chat",
1865+ "api": "responses",
1866+ "available": true,
1867+ "tested": true,
1868+ "status": "verified",
1869+ "capabilities": {
1870+ "text": true,
1871+ "vision": true,
1872+ "tools": true,
1873+ "structuredOutput": true,
1874+ "streaming": true,
1875+ "reasoning": true,
1876+ "longContext": true,
1877+ "audioInput": false,
1878+ "audioOutput": false,
1879+ "imageGeneration": false
1880+ },
1881+ "pricing": {
1882+ "input": 0.75,
1883+ "cachedInput": 0.075,
1884+ "output": 4.5
1885+ },
1886+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1887+ "benchmark": {
1888+ "tests": 11,
1889+ "passed": 10,
1890+ "qualityScore": 89,
1891+ "p50LatencyMs": 888,
1892+ "p50TtftMs": 458,
1893+ "totalCostUsd": 0.00921375,
1894+ "avgOutputTokens": 40,
1895+ "perTest": {
1896+ "basic": "pass",
1897+ "reasoning": "pass",
1898+ "math": "fail",
1899+ "code": "pass",
1900+ "french": "pass",
1901+ "english": "pass",
1902+ "json": "pass",
1903+ "tools": "pass",
1904+ "vision": "pass",
1905+ "longctx": "pass",
1906+ "streaming": "pass"
1907+ },
1908+ "errors": []
1909+ }
1910+ },
1911+ {
1912+ "id": "gpt-5.6-terra",
1913+ "provider": "openai",
1914+ "kind": "chat",
1915+ "api": "responses",
1916+ "available": true,
1917+ "tested": true,
1918+ "status": "verified",
1919+ "capabilities": {
1920+ "text": true,
1921+ "vision": true,
1922+ "tools": true,
1923+ "structuredOutput": true,
1924+ "streaming": true,
1925+ "reasoning": true,
1926+ "longContext": false,
1927+ "audioInput": false,
1928+ "audioOutput": false,
1929+ "imageGeneration": false
1930+ },
1931+ "pricing": {
1932+ "input": 2,
1933+ "cachedInput": 0.2,
1934+ "output": 12
1935+ },
1936+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1937+ "benchmark": {
1938+ "tests": 11,
1939+ "passed": 10,
1940+ "qualityScore": 89,
1941+ "p50LatencyMs": 1214,
1942+ "p50TtftMs": 611,
1943+ "totalCostUsd": 0.025602,
1944+ "avgOutputTokens": 47,
1945+ "perTest": {
1946+ "basic": "pass",
1947+ "reasoning": "pass",
1948+ "math": "pass",
1949+ "code": "pass",
1950+ "french": "pass",
1951+ "english": "pass",
1952+ "json": "pass",
1953+ "tools": "pass",
1954+ "vision": "pass",
1955+ "longctx": "fail",
1956+ "streaming": "pass"
1957+ },
1958+ "errors": []
1959+ }
1960+ },
1961+ {
1962+ "id": "gpt-4o",
1963+ "provider": "openai",
1964+ "kind": "chat",
1965+ "api": "responses",
1966+ "available": true,
1967+ "tested": true,
1968+ "status": "verified",
1969+ "capabilities": {
1970+ "text": true,
1971+ "vision": true,
1972+ "tools": true,
1973+ "structuredOutput": true,
1974+ "streaming": true,
1975+ "reasoning": false,
1976+ "longContext": true,
1977+ "audioInput": false,
1978+ "audioOutput": false,
1979+ "imageGeneration": false
1980+ },
1981+ "pricing": {
1982+ "input": 2.5,
1983+ "cachedInput": 1.25,
1984+ "output": 10
1985+ },
1986+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
1987+ "benchmark": {
1988+ "tests": 11,
1989+ "passed": 9,
1990+ "qualityScore": 78,
1991+ "p50LatencyMs": 1049,
1992+ "p50TtftMs": 457,
1993+ "totalCostUsd": 0.02777,
1994+ "avgOutputTokens": 34,
1995+ "perTest": {
1996+ "basic": "pass",
1997+ "reasoning": "fail",
1998+ "math": "fail",
1999+ "code": "pass",
2000+ "french": "pass",
2001+ "english": "pass",
2002+ "json": "pass",
2003+ "tools": "pass",
2004+ "vision": "pass",
2005+ "longctx": "pass",
2006+ "streaming": "pass"
2007+ },
2008+ "errors": []
2009+ }
2010+ },
2011+ {
2012+ "id": "gpt-4o-mini",
2013+ "provider": "openai",
2014+ "kind": "chat",
2015+ "api": "responses",
2016+ "available": true,
2017+ "tested": true,
2018+ "status": "verified",
2019+ "capabilities": {
2020+ "text": true,
2021+ "vision": true,
2022+ "tools": true,
2023+ "structuredOutput": true,
2024+ "streaming": true,
2025+ "reasoning": false,
2026+ "longContext": true,
2027+ "audioInput": false,
2028+ "audioOutput": false,
2029+ "imageGeneration": false
2030+ },
2031+ "pricing": {
2032+ "input": 0.15,
2033+ "cachedInput": 0.075,
2034+ "output": 0.6
2035+ },
2036+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2037+ "benchmark": {
2038+ "tests": 11,
2039+ "passed": 9,
2040+ "qualityScore": 78,
2041+ "p50LatencyMs": 893,
2042+ "p50TtftMs": 482,
2043+ "totalCostUsd": 0.0020663999999999995,
2044+ "avgOutputTokens": 32,
2045+ "perTest": {
2046+ "basic": "pass",
2047+ "reasoning": "fail",
2048+ "math": "fail",
2049+ "code": "pass",
2050+ "french": "pass",
2051+ "english": "pass",
2052+ "json": "pass",
2053+ "tools": "pass",
2054+ "vision": "pass",
2055+ "longctx": "pass",
2056+ "streaming": "pass"
2057+ },
2058+ "errors": []
2059+ }
2060+ },
2061+ {
2062+ "id": "gpt-5.2",
2063+ "provider": "openai",
2064+ "kind": "chat",
2065+ "api": "responses",
2066+ "available": true,
2067+ "tested": true,
2068+ "status": "verified",
2069+ "capabilities": {
2070+ "text": true,
2071+ "vision": true,
2072+ "tools": true,
2073+ "structuredOutput": true,
2074+ "streaming": true,
2075+ "reasoning": false,
2076+ "longContext": false,
2077+ "audioInput": false,
2078+ "audioOutput": false,
2079+ "imageGeneration": false
2080+ },
2081+ "pricing": {
2082+ "input": 1.75,
2083+ "cachedInput": 0.175,
2084+ "output": 14
2085+ },
2086+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2087+ "benchmark": {
2088+ "tests": 11,
2089+ "passed": 9,
2090+ "qualityScore": 78,
2091+ "p50LatencyMs": 1506,
2092+ "p50TtftMs": 529,
2093+ "totalCostUsd": 0.02313325,
2094+ "avgOutputTokens": 40,
2095+ "perTest": {
2096+ "basic": "pass",
2097+ "reasoning": "fail",
2098+ "math": "pass",
2099+ "code": "pass",
2100+ "french": "pass",
2101+ "english": "pass",
2102+ "json": "pass",
2103+ "tools": "pass",
2104+ "vision": "pass",
2105+ "longctx": "fail",
2106+ "streaming": "pass"
2107+ },
2108+ "errors": []
2109+ }
2110+ },
2111+ {
2112+ "id": "gpt-5.4-nano",
2113+ "provider": "openai",
2114+ "kind": "chat",
2115+ "api": "responses",
2116+ "available": true,
2117+ "tested": true,
2118+ "status": "verified",
2119+ "capabilities": {
2120+ "text": true,
2121+ "vision": true,
2122+ "tools": true,
2123+ "structuredOutput": true,
2124+ "streaming": true,
2125+ "reasoning": false,
2126+ "longContext": true,
2127+ "audioInput": false,
2128+ "audioOutput": false,
2129+ "imageGeneration": false
2130+ },
2131+ "pricing": {
2132+ "input": 0.2,
2133+ "cachedInput": 0.02,
2134+ "output": 1.25
2135+ },
2136+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2137+ "benchmark": {
2138+ "tests": 11,
2139+ "passed": 9,
2140+ "qualityScore": 78,
2141+ "p50LatencyMs": 969,
2142+ "p50TtftMs": 541,
2143+ "totalCostUsd": 0.00252875,
2144+ "avgOutputTokens": 43,
2145+ "perTest": {
2146+ "basic": "pass",
2147+ "reasoning": "fail",
2148+ "math": "fail",
2149+ "code": "pass",
2150+ "french": "pass",
2151+ "english": "pass",
2152+ "json": "pass",
2153+ "tools": "pass",
2154+ "vision": "pass",
2155+ "longctx": "pass",
2156+ "streaming": "pass"
2157+ },
2158+ "errors": []
2159+ }
2160+ },
2161+ {
2162+ "id": "gpt-5-search-api",
2163+ "provider": "openai",
2164+ "kind": "search",
2165+ "api": "chat",
2166+ "available": true,
2167+ "tested": true,
2168+ "status": "verified",
2169+ "capabilities": {
2170+ "text": true,
2171+ "vision": false,
2172+ "tools": false,
2173+ "structuredOutput": true,
2174+ "streaming": true,
2175+ "reasoning": true,
2176+ "longContext": true,
2177+ "audioInput": false,
2178+ "audioOutput": false,
2179+ "imageGeneration": false
2180+ },
2181+ "pricing": {
2182+ "input": 1.25,
2183+ "cachedInput": 0.125,
2184+ "output": 10
2185+ },
2186+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2187+ "benchmark": {
2188+ "tests": 11,
2189+ "passed": 8,
2190+ "qualityScore": 67,
2191+ "p50LatencyMs": 1707,
2192+ "p50TtftMs": 1073,
2193+ "totalCostUsd": 0.070686,
2194+ "avgOutputTokens": 65,
2195+ "perTest": {
2196+ "basic": "pass",
2197+ "reasoning": "pass",
2198+ "math": "fail",
2199+ "code": "pass",
2200+ "french": "pass",
2201+ "english": "pass",
2202+ "json": "pass",
2203+ "tools": "error",
2204+ "vision": "fail",
2205+ "longctx": "pass",
2206+ "streaming": "pass"
2207+ },
2208+ "errors": [
2209+ "tools: 404 404 tools is not supported in this model. For a list of supported models, refer to https://platform.openai.com/docs/guides/function-call"
2210+ ]
2211+ }
2212+ },
2213+ {
2214+ "id": "babbage-002",
2215+ "provider": "openai",
2216+ "kind": "legacy-completion",
2217+ "available": false,
2218+ "tested": false,
2219+ "status": "unsupported",
2220+ "capabilities": {},
2221+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2222+ "unavailableReason": "Legacy completions endpoint — not used by this app"
2223+ },
2224+ {
2225+ "id": "chatgpt-image-latest",
2226+ "provider": "openai",
2227+ "kind": "image",
2228+ "available": true,
2229+ "tested": true,
2230+ "status": "verified",
2231+ "capabilities": {
2232+ "text": false,
2233+ "vision": false,
2234+ "tools": false,
2235+ "structuredOutput": false,
2236+ "streaming": false,
2237+ "reasoning": false,
2238+ "longContext": false,
2239+ "imageGeneration": true,
2240+ "audioOutput": false,
2241+ "audioInput": false
2242+ },
2243+ "pricing": {
2244+ "imageInput": 8,
2245+ "imageCachedInput": 2,
2246+ "imageOutput": 32,
2247+ "input": 5,
2248+ "cachedInput": 1.25,
2249+ "output": 10,
2250+ "unit": "image tokens / text tokens"
2251+ },
2252+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2253+ "benchmark": {
2254+ "tests": 1,
2255+ "passed": 1,
2256+ "qualityScore": null,
2257+ "p50LatencyMs": 5382,
2258+ "p50TtftMs": null,
2259+ "totalCostUsd": 0,
2260+ "avgOutputTokens": null,
2261+ "perTest": {
2262+ "image": "pass"
2263+ },
2264+ "errors": []
2265+ }
2266+ },
2267+ {
2268+ "id": "davinci-002",
2269+ "provider": "openai",
2270+ "kind": "legacy-completion",
2271+ "available": false,
2272+ "tested": false,
2273+ "status": "unsupported",
2274+ "capabilities": {},
2275+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2276+ "unavailableReason": "Legacy completions endpoint — not used by this app"
2277+ },
2278+ {
2279+ "id": "gpt-3.5-turbo",
2280+ "provider": "openai",
2281+ "kind": "chat",
2282+ "available": false,
2283+ "tested": false,
2284+ "status": "unavailable",
2285+ "capabilities": {},
2286+ "pricing": {
2287+ "input": 0.5,
2288+ "output": 1.5
2289+ },
2290+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2291+ "unavailableReason": "The model `gpt-3.5-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2292+ },
2293+ {
2294+ "id": "gpt-3.5-turbo-instruct",
2295+ "provider": "openai",
2296+ "kind": "legacy-completion",
2297+ "available": false,
2298+ "tested": false,
2299+ "status": "unsupported",
2300+ "capabilities": {},
2301+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2302+ "unavailableReason": "Legacy completions endpoint — not used by this app"
2303+ },
2304+ {
2305+ "id": "gpt-3.5-turbo-instruct-0914",
2306+ "provider": "openai",
2307+ "kind": "legacy-completion",
2308+ "available": false,
2309+ "tested": false,
2310+ "status": "unsupported",
2311+ "capabilities": {},
2312+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2313+ "unavailableReason": "Legacy completions endpoint — not used by this app"
2314+ },
2315+ {
2316+ "id": "gpt-4",
2317+ "provider": "openai",
2318+ "kind": "chat",
2319+ "available": false,
2320+ "tested": false,
2321+ "status": "unavailable",
2322+ "capabilities": {},
2323+ "pricing": {
2324+ "input": 30,
2325+ "output": 60,
2326+ "notes": "listed as gpt-4-0613"
2327+ },
2328+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2329+ "unavailableReason": "The model `gpt-4` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2330+ },
2331+ {
2332+ "id": "gpt-4-turbo",
2333+ "provider": "openai",
2334+ "kind": "chat",
2335+ "available": false,
2336+ "tested": false,
2337+ "status": "unavailable",
2338+ "capabilities": {},
2339+ "pricing": {
2340+ "input": 10,
2341+ "output": 30,
2342+ "notes": "listed as gpt-4-turbo-2024-04-09"
2343+ },
2344+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2345+ "unavailableReason": "The model `gpt-4-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2346+ },
2347+ {
2348+ "id": "gpt-4.1-nano",
2349+ "provider": "openai",
2350+ "kind": "chat",
2351+ "available": false,
2352+ "tested": false,
2353+ "status": "unavailable",
2354+ "capabilities": {},
2355+ "pricing": {
2356+ "input": 0.1,
2357+ "cachedInput": 0.025,
2358+ "output": 0.4
2359+ },
2360+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2361+ "unavailableReason": "The model `gpt-4.1-nano` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2362+ },
2363+ {
2364+ "id": "gpt-4o-mini-search-preview",
2365+ "provider": "openai",
2366+ "kind": "search",
2367+ "available": false,
2368+ "tested": false,
2369+ "status": "unavailable",
2370+ "capabilities": {},
2371+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2372+ "unavailableReason": "The model `gpt-4o-mini-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2373+ },
2374+ {
2375+ "id": "gpt-4o-mini-transcribe",
2376+ "provider": "openai",
2377+ "kind": "stt",
2378+ "available": true,
2379+ "tested": true,
2380+ "status": "verified",
2381+ "capabilities": {
2382+ "text": false,
2383+ "vision": false,
2384+ "tools": false,
2385+ "structuredOutput": false,
2386+ "streaming": false,
2387+ "reasoning": false,
2388+ "longContext": false,
2389+ "imageGeneration": false,
2390+ "audioOutput": false,
2391+ "audioInput": true
2392+ },
2393+ "pricing": {
2394+ "audioInput": 1.25,
2395+ "output": 5,
2396+ "perMinute": 0.003
2397+ },
2398+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2399+ "benchmark": {
2400+ "tests": 1,
2401+ "passed": 1,
2402+ "qualityScore": null,
2403+ "p50LatencyMs": 412,
2404+ "p50TtftMs": null,
2405+ "totalCostUsd": 0,
2406+ "avgOutputTokens": null,
2407+ "perTest": {
2408+ "stt": "pass"
2409+ },
2410+ "errors": []
2411+ }
2412+ },
2413+ {
2414+ "id": "gpt-4o-mini-tts",
2415+ "provider": "openai",
2416+ "kind": "tts",
2417+ "available": true,
2418+ "tested": true,
2419+ "status": "verified",
2420+ "capabilities": {
2421+ "text": false,
2422+ "vision": false,
2423+ "tools": false,
2424+ "structuredOutput": false,
2425+ "streaming": false,
2426+ "reasoning": false,
2427+ "longContext": false,
2428+ "imageGeneration": false,
2429+ "audioOutput": true,
2430+ "audioInput": false
2431+ },
2432+ "pricing": {
2433+ "input": 0.6,
2434+ "audioOutput": 12,
2435+ "notes": "~$0.015 per minute"
2436+ },
2437+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2438+ "benchmark": {
2439+ "tests": 1,
2440+ "passed": 1,
2441+ "qualityScore": null,
2442+ "p50LatencyMs": 542,
2443+ "p50TtftMs": null,
2444+ "totalCostUsd": 0,
2445+ "avgOutputTokens": null,
2446+ "perTest": {
2447+ "tts": "pass"
2448+ },
2449+ "errors": []
2450+ }
2451+ },
2452+ {
2453+ "id": "gpt-4o-search-preview",
2454+ "provider": "openai",
2455+ "kind": "search",
2456+ "available": false,
2457+ "tested": false,
2458+ "status": "unavailable",
2459+ "capabilities": {},
2460+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2461+ "unavailableReason": "The model `gpt-4o-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2462+ },
2463+ {
2464+ "id": "gpt-4o-transcribe",
2465+ "provider": "openai",
2466+ "kind": "stt",
2467+ "available": true,
2468+ "tested": true,
2469+ "status": "verified",
2470+ "capabilities": {
2471+ "text": false,
2472+ "vision": false,
2473+ "tools": false,
2474+ "structuredOutput": false,
2475+ "streaming": false,
2476+ "reasoning": false,
2477+ "longContext": false,
2478+ "imageGeneration": false,
2479+ "audioOutput": false,
2480+ "audioInput": true
2481+ },
2482+ "pricing": {
2483+ "audioInput": 2.5,
2484+ "output": 10,
2485+ "perMinute": 0.006
2486+ },
2487+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2488+ "benchmark": {
2489+ "tests": 1,
2490+ "passed": 1,
2491+ "qualityScore": null,
2492+ "p50LatencyMs": 625,
2493+ "p50TtftMs": null,
2494+ "totalCostUsd": 0,
2495+ "avgOutputTokens": null,
2496+ "perTest": {
2497+ "stt": "pass"
2498+ },
2499+ "errors": []
2500+ }
2501+ },
2502+ {
2503+ "id": "gpt-4o-transcribe-diarize",
2504+ "provider": "openai",
2505+ "kind": "stt",
2506+ "available": true,
2507+ "tested": true,
2508+ "status": "verified",
2509+ "capabilities": {
2510+ "text": false,
2511+ "vision": false,
2512+ "tools": false,
2513+ "structuredOutput": false,
2514+ "streaming": false,
2515+ "reasoning": false,
2516+ "longContext": false,
2517+ "imageGeneration": false,
2518+ "audioOutput": false,
2519+ "audioInput": true
2520+ },
2521+ "pricing": {
2522+ "audioInput": 2.5,
2523+ "output": 10,
2524+ "perMinute": 0.006
2525+ },
2526+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2527+ "benchmark": {
2528+ "tests": 1,
2529+ "passed": 1,
2530+ "qualityScore": null,
2531+ "p50LatencyMs": 2799,
2532+ "p50TtftMs": null,
2533+ "totalCostUsd": 0,
2534+ "avgOutputTokens": null,
2535+ "perTest": {
2536+ "stt": "pass"
2537+ },
2538+ "errors": []
2539+ }
2540+ },
2541+ {
2542+ "id": "gpt-5-chat-latest",
2543+ "provider": "openai",
2544+ "kind": "chat",
2545+ "available": false,
2546+ "tested": false,
2547+ "status": "unavailable",
2548+ "capabilities": {},
2549+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2550+ "unavailableReason": "The model `gpt-5-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2551+ },
2552+ {
2553+ "id": "gpt-5-codex",
2554+ "provider": "openai",
2555+ "kind": "chat",
2556+ "available": false,
2557+ "tested": false,
2558+ "status": "unavailable",
2559+ "capabilities": {},
2560+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2561+ "unavailableReason": "The model `gpt-5-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2562+ },
2563+ {
2564+ "id": "gpt-5.1-chat-latest",
2565+ "provider": "openai",
2566+ "kind": "chat",
2567+ "available": false,
2568+ "tested": false,
2569+ "status": "unavailable",
2570+ "capabilities": {},
2571+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2572+ "unavailableReason": "The model `gpt-5.1-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2573+ },
2574+ {
2575+ "id": "gpt-5.1-codex",
2576+ "provider": "openai",
2577+ "kind": "chat",
2578+ "available": false,
2579+ "tested": false,
2580+ "status": "unavailable",
2581+ "capabilities": {},
2582+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2583+ "unavailableReason": "The model `gpt-5.1-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2584+ },
2585+ {
2586+ "id": "gpt-5.1-codex-max",
2587+ "provider": "openai",
2588+ "kind": "chat",
2589+ "available": false,
2590+ "tested": false,
2591+ "status": "unavailable",
2592+ "capabilities": {},
2593+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2594+ "unavailableReason": "The model `gpt-5.1-codex-max` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2595+ },
2596+ {
2597+ "id": "gpt-5.1-codex-mini",
2598+ "provider": "openai",
2599+ "kind": "chat",
2600+ "available": false,
2601+ "tested": false,
2602+ "status": "unavailable",
2603+ "capabilities": {},
2604+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2605+ "unavailableReason": "The model `gpt-5.1-codex-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2606+ },
2607+ {
2608+ "id": "gpt-5.2-chat-latest",
2609+ "provider": "openai",
2610+ "kind": "chat",
2611+ "available": false,
2612+ "tested": false,
2613+ "status": "unavailable",
2614+ "capabilities": {},
2615+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2616+ "unavailableReason": "The model `gpt-5.2-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2617+ },
2618+ {
2619+ "id": "gpt-5.2-codex",
2620+ "provider": "openai",
2621+ "kind": "chat",
2622+ "available": false,
2623+ "tested": false,
2624+ "status": "unavailable",
2625+ "capabilities": {},
2626+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2627+ "unavailableReason": "The model `gpt-5.2-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2628+ },
2629+ {
2630+ "id": "gpt-5.3-chat-latest",
2631+ "provider": "openai",
2632+ "kind": "chat",
2633+ "available": false,
2634+ "tested": false,
2635+ "status": "unavailable",
2636+ "capabilities": {},
2637+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2638+ "unavailableReason": "The model `gpt-5.3-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2639+ },
2640+ {
2641+ "id": "gpt-audio",
2642+ "provider": "openai",
2643+ "kind": "audio-chat",
2644+ "available": false,
2645+ "tested": true,
2646+ "status": "unavailable",
2647+ "capabilities": {
2648+ "text": false,
2649+ "vision": false,
2650+ "tools": false,
2651+ "structuredOutput": false,
2652+ "streaming": false,
2653+ "reasoning": false,
2654+ "longContext": false,
2655+ "imageGeneration": false,
2656+ "audioOutput": false,
2657+ "audioInput": "unknown"
2658+ },
2659+ "pricing": {
2660+ "audioInput": 32,
2661+ "audioOutput": 64,
2662+ "input": 2.5,
2663+ "output": 10
2664+ },
2665+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2666+ "unavailableReason": "400 400 This model requires that either input content or output modality contain audio.",
2667+ "benchmark": {
2668+ "tests": 1,
2669+ "passed": 0,
2670+ "qualityScore": null,
2671+ "p50LatencyMs": 122,
2672+ "p50TtftMs": null,
2673+ "totalCostUsd": 0,
2674+ "avgOutputTokens": null,
2675+ "perTest": {
2676+ "audio-chat": "error"
2677+ },
2678+ "errors": [
2679+ "400 400 This model requires that either input content or output modality contain audio."
2680+ ]
2681+ }
2682+ },
2683+ {
2684+ "id": "gpt-audio-1.5",
2685+ "provider": "openai",
2686+ "kind": "audio-chat",
2687+ "available": false,
2688+ "tested": true,
2689+ "status": "unavailable",
2690+ "capabilities": {
2691+ "text": false,
2692+ "vision": false,
2693+ "tools": false,
2694+ "structuredOutput": false,
2695+ "streaming": false,
2696+ "reasoning": false,
2697+ "longContext": false,
2698+ "imageGeneration": false,
2699+ "audioOutput": false,
2700+ "audioInput": "unknown"
2701+ },
2702+ "pricing": {
2703+ "audioInput": 32,
2704+ "audioOutput": 64,
2705+ "input": 2.5,
2706+ "output": 10
2707+ },
2708+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2709+ "unavailableReason": "400 400 This model requires that either input content or output modality contain audio.",
2710+ "benchmark": {
2711+ "tests": 1,
2712+ "passed": 0,
2713+ "qualityScore": null,
2714+ "p50LatencyMs": 103,
2715+ "p50TtftMs": null,
2716+ "totalCostUsd": 0,
2717+ "avgOutputTokens": null,
2718+ "perTest": {
2719+ "audio-chat": "error"
2720+ },
2721+ "errors": [
2722+ "400 400 This model requires that either input content or output modality contain audio."
2723+ ]
2724+ }
2725+ },
2726+ {
2727+ "id": "gpt-audio-mini",
2728+ "provider": "openai",
2729+ "kind": "audio-chat",
2730+ "available": false,
2731+ "tested": true,
2732+ "status": "unavailable",
2733+ "capabilities": {
2734+ "text": false,
2735+ "vision": false,
2736+ "tools": false,
2737+ "structuredOutput": false,
2738+ "streaming": false,
2739+ "reasoning": false,
2740+ "longContext": false,
2741+ "imageGeneration": false,
2742+ "audioOutput": false,
2743+ "audioInput": "unknown"
2744+ },
2745+ "pricing": {
2746+ "audioInput": 10,
2747+ "audioOutput": 20,
2748+ "input": 0.6,
2749+ "output": 2.4
2750+ },
2751+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2752+ "unavailableReason": "400 400 This model requires that either input content or output modality contain audio.",
2753+ "benchmark": {
2754+ "tests": 1,
2755+ "passed": 0,
2756+ "qualityScore": null,
2757+ "p50LatencyMs": 132,
2758+ "p50TtftMs": null,
2759+ "totalCostUsd": 0,
2760+ "avgOutputTokens": null,
2761+ "perTest": {
2762+ "audio-chat": "error"
2763+ },
2764+ "errors": [
2765+ "400 400 This model requires that either input content or output modality contain audio."
2766+ ]
2767+ }
2768+ },
2769+ {
2770+ "id": "gpt-image-1",
2771+ "provider": "openai",
2772+ "kind": "image",
2773+ "available": false,
2774+ "tested": true,
2775+ "status": "unavailable",
2776+ "capabilities": {
2777+ "text": false,
2778+ "vision": false,
2779+ "tools": false,
2780+ "structuredOutput": false,
2781+ "streaming": false,
2782+ "reasoning": false,
2783+ "longContext": false,
2784+ "imageGeneration": false,
2785+ "audioOutput": false,
2786+ "audioInput": false
2787+ },
2788+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2789+ "unavailableReason": "400 400 The model 'gpt-image-1' does not exist.",
2790+ "benchmark": {
2791+ "tests": 1,
2792+ "passed": 0,
2793+ "qualityScore": null,
2794+ "p50LatencyMs": 174,
2795+ "p50TtftMs": null,
2796+ "totalCostUsd": 0,
2797+ "avgOutputTokens": null,
2798+ "perTest": {
2799+ "image": "error"
2800+ },
2801+ "errors": [
2802+ "400 400 The model 'gpt-image-1' does not exist."
2803+ ]
2804+ }
2805+ },
2806+ {
2807+ "id": "gpt-image-1-mini",
2808+ "provider": "openai",
2809+ "kind": "image",
2810+ "available": true,
2811+ "tested": true,
2812+ "status": "verified",
2813+ "capabilities": {
2814+ "text": false,
2815+ "vision": false,
2816+ "tools": false,
2817+ "structuredOutput": false,
2818+ "streaming": false,
2819+ "reasoning": false,
2820+ "longContext": false,
2821+ "imageGeneration": true,
2822+ "audioOutput": false,
2823+ "audioInput": false
2824+ },
2825+ "pricing": {
2826+ "imageInput": 2.5,
2827+ "imageCachedInput": 0.25,
2828+ "imageOutput": 8,
2829+ "input": 2,
2830+ "cachedInput": 0.2,
2831+ "unit": "image tokens / text tokens"
2832+ },
2833+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2834+ "benchmark": {
2835+ "tests": 1,
2836+ "passed": 1,
2837+ "qualityScore": null,
2838+ "p50LatencyMs": 5797,
2839+ "p50TtftMs": null,
2840+ "totalCostUsd": 0,
2841+ "avgOutputTokens": null,
2842+ "perTest": {
2843+ "image": "pass"
2844+ },
2845+ "errors": []
2846+ }
2847+ },
2848+ {
2849+ "id": "gpt-image-1.5",
2850+ "provider": "openai",
2851+ "kind": "image",
2852+ "available": true,
2853+ "tested": true,
2854+ "status": "verified",
2855+ "capabilities": {
2856+ "text": false,
2857+ "vision": false,
2858+ "tools": false,
2859+ "structuredOutput": false,
2860+ "streaming": false,
2861+ "reasoning": false,
2862+ "longContext": false,
2863+ "imageGeneration": true,
2864+ "audioOutput": false,
2865+ "audioInput": false
2866+ },
2867+ "pricing": {
2868+ "imageInput": 8,
2869+ "imageCachedInput": 2,
2870+ "imageOutput": 32,
2871+ "input": 5,
2872+ "cachedInput": 1.25,
2873+ "output": 10,
2874+ "unit": "image tokens / text tokens"
2875+ },
2876+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2877+ "benchmark": {
2878+ "tests": 1,
2879+ "passed": 1,
2880+ "qualityScore": null,
2881+ "p50LatencyMs": 4864,
2882+ "p50TtftMs": null,
2883+ "totalCostUsd": 0,
2884+ "avgOutputTokens": null,
2885+ "perTest": {
2886+ "image": "pass"
2887+ },
2888+ "errors": []
2889+ }
2890+ },
2891+ {
2892+ "id": "gpt-image-2",
2893+ "provider": "openai",
2894+ "kind": "image",
2895+ "available": true,
2896+ "tested": true,
2897+ "status": "verified",
2898+ "capabilities": {
2899+ "text": false,
2900+ "vision": false,
2901+ "tools": false,
2902+ "structuredOutput": false,
2903+ "streaming": false,
2904+ "reasoning": false,
2905+ "longContext": false,
2906+ "imageGeneration": true,
2907+ "audioOutput": false,
2908+ "audioInput": false
2909+ },
2910+ "pricing": {
2911+ "imageInput": 8,
2912+ "imageCachedInput": 2,
2913+ "imageOutput": 30,
2914+ "input": 5,
2915+ "cachedInput": 1.25,
2916+ "unit": "image tokens / text tokens"
2917+ },
2918+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2919+ "benchmark": {
2920+ "tests": 1,
2921+ "passed": 1,
2922+ "qualityScore": null,
2923+ "p50LatencyMs": 6375,
2924+ "p50TtftMs": null,
2925+ "totalCostUsd": 0,
2926+ "avgOutputTokens": null,
2927+ "perTest": {
2928+ "image": "pass"
2929+ },
2930+ "errors": []
2931+ }
2932+ },
2933+ {
2934+ "id": "gpt-image-2.5-flare",
2935+ "provider": "openai",
2936+ "kind": "image",
2937+ "available": true,
2938+ "tested": true,
2939+ "status": "verified",
2940+ "capabilities": {
2941+ "text": false,
2942+ "vision": false,
2943+ "tools": false,
2944+ "structuredOutput": false,
2945+ "streaming": false,
2946+ "reasoning": false,
2947+ "longContext": false,
2948+ "imageGeneration": true,
2949+ "audioOutput": false,
2950+ "audioInput": false
2951+ },
2952+ "pricing": {
2953+ "imageInput": 8,
2954+ "imageCachedInput": 2,
2955+ "imageOutput": 30,
2956+ "input": 5,
2957+ "cachedInput": 1.25,
2958+ "unit": "image tokens / text tokens"
2959+ },
2960+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
2961+ "benchmark": {
2962+ "tests": 1,
2963+ "passed": 1,
2964+ "qualityScore": null,
2965+ "p50LatencyMs": 4765,
2966+ "p50TtftMs": null,
2967+ "totalCostUsd": 0,
2968+ "avgOutputTokens": null,
2969+ "perTest": {
2970+ "image": "pass"
2971+ },
2972+ "errors": []
2973+ }
2974+ },
2975+ {
2976+ "id": "gpt-image-2.5-sunburst",
2977+ "provider": "openai",
2978+ "kind": "image",
2979+ "available": true,
2980+ "tested": true,
2981+ "status": "verified",
2982+ "capabilities": {
2983+ "text": false,
2984+ "vision": false,
2985+ "tools": false,
2986+ "structuredOutput": false,
2987+ "streaming": false,
2988+ "reasoning": false,
2989+ "longContext": false,
2990+ "imageGeneration": true,
2991+ "audioOutput": false,
2992+ "audioInput": false
2993+ },
2994+ "pricing": {
2995+ "imageInput": 8,
2996+ "imageCachedInput": 2,
2997+ "imageOutput": 30,
2998+ "input": 5,
2999+ "cachedInput": 1.25,
3000+ "unit": "image tokens / text tokens"
3001+ },
3002+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3003+ "benchmark": {
3004+ "tests": 1,
3005+ "passed": 1,
3006+ "qualityScore": null,
3007+ "p50LatencyMs": 6665,
3008+ "p50TtftMs": null,
3009+ "totalCostUsd": 0,
3010+ "avgOutputTokens": null,
3011+ "perTest": {
3012+ "image": "pass"
3013+ },
3014+ "errors": []
3015+ }
3016+ },
3017+ {
3018+ "id": "gpt-live-1",
3019+ "provider": "openai",
3020+ "kind": "realtime",
3021+ "available": false,
3022+ "tested": false,
3023+ "status": "unsupported",
3024+ "capabilities": {},
3025+ "pricing": {
3026+ "perMinute": 0.05
3027+ },
3028+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3029+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3030+ },
3031+ {
3032+ "id": "gpt-live-transcribe",
3033+ "provider": "openai",
3034+ "kind": "realtime",
3035+ "available": false,
3036+ "tested": false,
3037+ "status": "unsupported",
3038+ "capabilities": {},
3039+ "pricing": {
3040+ "perMinute": 0.017
3041+ },
3042+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3043+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3044+ },
3045+ {
3046+ "id": "gpt-realtime",
3047+ "provider": "openai",
3048+ "kind": "realtime",
3049+ "available": false,
3050+ "tested": false,
3051+ "status": "unsupported",
3052+ "capabilities": {},
3053+ "pricing": {
3054+ "audioInput": 32,
3055+ "audioOutput": 64,
3056+ "input": 4,
3057+ "cachedInput": 0.4,
3058+ "output": 16
3059+ },
3060+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3061+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3062+ },
3063+ {
3064+ "id": "gpt-realtime-1.5",
3065+ "provider": "openai",
3066+ "kind": "realtime",
3067+ "available": false,
3068+ "tested": false,
3069+ "status": "unsupported",
3070+ "capabilities": {},
3071+ "pricing": {
3072+ "audioInput": 32,
3073+ "audioOutput": 64,
3074+ "input": 4,
3075+ "cachedInput": 0.4,
3076+ "output": 16
3077+ },
3078+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3079+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3080+ },
3081+ {
3082+ "id": "gpt-realtime-2",
3083+ "provider": "openai",
3084+ "kind": "realtime",
3085+ "available": false,
3086+ "tested": false,
3087+ "status": "unsupported",
3088+ "capabilities": {},
3089+ "pricing": {
3090+ "audioInput": 32,
3091+ "audioOutput": 64,
3092+ "input": 4,
3093+ "cachedInput": 0.4,
3094+ "output": 24
3095+ },
3096+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3097+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3098+ },
3099+ {
3100+ "id": "gpt-realtime-2.1",
3101+ "provider": "openai",
3102+ "kind": "realtime",
3103+ "available": false,
3104+ "tested": false,
3105+ "status": "unsupported",
3106+ "capabilities": {},
3107+ "pricing": {
3108+ "audioInput": 32,
3109+ "audioOutput": 64,
3110+ "input": 4,
3111+ "cachedInput": 0.4,
3112+ "output": 24,
3113+ "unit": "audio tokens / text tokens"
3114+ },
3115+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3116+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3117+ },
3118+ {
3119+ "id": "gpt-realtime-2.1-mini",
3120+ "provider": "openai",
3121+ "kind": "realtime",
3122+ "available": false,
3123+ "tested": false,
3124+ "status": "unsupported",
3125+ "capabilities": {},
3126+ "pricing": {
3127+ "audioInput": 10,
3128+ "audioOutput": 20,
3129+ "input": 0.6,
3130+ "cachedInput": 0.06,
3131+ "output": 2.4
3132+ },
3133+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3134+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3135+ },
3136+ {
3137+ "id": "gpt-realtime-mini",
3138+ "provider": "openai",
3139+ "kind": "realtime",
3140+ "available": false,
3141+ "tested": false,
3142+ "status": "unsupported",
3143+ "capabilities": {},
3144+ "pricing": {
3145+ "audioInput": 10,
3146+ "audioOutput": 20,
3147+ "input": 0.6,
3148+ "cachedInput": 0.06,
3149+ "output": 2.4
3150+ },
3151+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3152+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3153+ },
3154+ {
3155+ "id": "gpt-realtime-translate",
3156+ "provider": "openai",
3157+ "kind": "realtime",
3158+ "available": false,
3159+ "tested": false,
3160+ "status": "unsupported",
3161+ "capabilities": {},
3162+ "pricing": {
3163+ "perMinute": 0.034
3164+ },
3165+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3166+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3167+ },
3168+ {
3169+ "id": "gpt-realtime-whisper",
3170+ "provider": "openai",
3171+ "kind": "realtime",
3172+ "available": false,
3173+ "tested": false,
3174+ "status": "unsupported",
3175+ "capabilities": {},
3176+ "pricing": {
3177+ "perMinute": 0.017
3178+ },
3179+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3180+ "unavailableReason": "WebSocket/WebRTC realtime model — not a chat-completion model; not exercised"
3181+ },
3182+ {
3183+ "id": "gpt-transcribe",
3184+ "provider": "openai",
3185+ "kind": "stt",
3186+ "available": true,
3187+ "tested": true,
3188+ "status": "verified",
3189+ "capabilities": {
3190+ "text": false,
3191+ "vision": false,
3192+ "tools": false,
3193+ "structuredOutput": false,
3194+ "streaming": false,
3195+ "reasoning": false,
3196+ "longContext": false,
3197+ "imageGeneration": false,
3198+ "audioOutput": false,
3199+ "audioInput": true
3200+ },
3201+ "pricing": {
3202+ "perMinute": 0.0045
3203+ },
3204+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3205+ "benchmark": {
3206+ "tests": 1,
3207+ "passed": 1,
3208+ "qualityScore": null,
3209+ "p50LatencyMs": 459,
3210+ "p50TtftMs": null,
3211+ "totalCostUsd": 0,
3212+ "avgOutputTokens": null,
3213+ "perTest": {
3214+ "stt": "pass"
3215+ },
3216+ "errors": []
3217+ }
3218+ },
3219+ {
3220+ "id": "o1",
3221+ "provider": "openai",
3222+ "kind": "chat",
3223+ "available": false,
3224+ "tested": false,
3225+ "status": "unavailable",
3226+ "capabilities": {},
3227+ "pricing": {
3228+ "input": 15,
3229+ "cachedInput": 7.5,
3230+ "output": 60
3231+ },
3232+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3233+ "unavailableReason": "The model `o1` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
3234+ },
3235+ {
3236+ "id": "o1-pro",
3237+ "provider": "openai",
3238+ "kind": "chat-pro",
3239+ "available": false,
3240+ "tested": false,
3241+ "status": "unavailable",
3242+ "capabilities": {},
3243+ "pricing": {
3244+ "input": 150,
3245+ "output": 600
3246+ },
3247+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3248+ "unavailableReason": "The model `o1-pro` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
3249+ },
3250+ {
3251+ "id": "o3-deep-research",
3252+ "provider": "openai",
3253+ "kind": "deep-research",
3254+ "available": false,
3255+ "tested": false,
3256+ "status": "unsupported",
3257+ "capabilities": {},
3258+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3259+ "unavailableReason": "Requires hosted web-search tools and long runs — not benchmarked without explicit budget approval"
3260+ },
3261+ {
3262+ "id": "o3-mini",
3263+ "provider": "openai",
3264+ "kind": "chat",
3265+ "available": false,
3266+ "tested": false,
3267+ "status": "unavailable",
3268+ "capabilities": {},
3269+ "pricing": {
3270+ "input": 1.1,
3271+ "cachedInput": 0.55,
3272+ "output": 4.4
3273+ },
3274+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3275+ "unavailableReason": "The model `o3-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
3276+ },
3277+ {
3278+ "id": "o4-mini",
3279+ "provider": "openai",
3280+ "kind": "chat",
3281+ "available": false,
3282+ "tested": false,
3283+ "status": "unavailable",
3284+ "capabilities": {},
3285+ "pricing": {
3286+ "input": 1.1,
3287+ "cachedInput": 0.275,
3288+ "output": 4.4
3289+ },
3290+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3291+ "unavailableReason": "The model `o4-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
3292+ },
3293+ {
3294+ "id": "o4-mini-deep-research",
3295+ "provider": "openai",
3296+ "kind": "deep-research",
3297+ "available": false,
3298+ "tested": false,
3299+ "status": "unsupported",
3300+ "capabilities": {},
3301+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3302+ "unavailableReason": "Requires hosted web-search tools and long runs — not benchmarked without explicit budget approval"
3303+ },
3304+ {
3305+ "id": "omni-moderation-latest",
3306+ "provider": "openai",
3307+ "kind": "moderation",
3308+ "available": true,
3309+ "tested": true,
3310+ "status": "verified",
3311+ "capabilities": {
3312+ "text": false,
3313+ "vision": false,
3314+ "tools": false,
3315+ "structuredOutput": false,
3316+ "streaming": false,
3317+ "reasoning": false,
3318+ "longContext": false,
3319+ "imageGeneration": false,
3320+ "audioOutput": false,
3321+ "audioInput": false
3322+ },
3323+ "pricing": {
3324+ "input": 0,
3325+ "notes": "free"
3326+ },
3327+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3328+ "benchmark": {
3329+ "tests": 1,
3330+ "passed": 1,
3331+ "qualityScore": null,
3332+ "p50LatencyMs": 521,
3333+ "p50TtftMs": null,
3334+ "totalCostUsd": 0,
3335+ "avgOutputTokens": null,
3336+ "perTest": {
3337+ "moderation": "pass"
3338+ },
3339+ "errors": []
3340+ }
3341+ },
3342+ {
3343+ "id": "sora-2",
3344+ "provider": "openai",
3345+ "kind": "video",
3346+ "available": false,
3347+ "tested": false,
3348+ "status": "unsupported",
3349+ "capabilities": {},
3350+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3351+ "unavailableReason": "Video generation — not tested (cost)"
3352+ },
3353+ {
3354+ "id": "sora-2-pro",
3355+ "provider": "openai",
3356+ "kind": "video",
3357+ "available": false,
3358+ "tested": false,
3359+ "status": "unsupported",
3360+ "capabilities": {},
3361+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3362+ "unavailableReason": "Video generation — not tested (cost)"
3363+ },
3364+ {
3365+ "id": "text-embedding-3-large",
3366+ "provider": "openai",
3367+ "kind": "embedding",
3368+ "available": true,
3369+ "tested": true,
3370+ "status": "verified",
3371+ "capabilities": {
3372+ "text": false,
3373+ "vision": false,
3374+ "tools": false,
3375+ "structuredOutput": false,
3376+ "streaming": false,
3377+ "reasoning": false,
3378+ "longContext": false,
3379+ "imageGeneration": false,
3380+ "audioOutput": false,
3381+ "audioInput": false
3382+ },
3383+ "pricing": {
3384+ "input": 0.13
3385+ },
3386+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3387+ "benchmark": {
3388+ "tests": 1,
3389+ "passed": 1,
3390+ "qualityScore": null,
3391+ "p50LatencyMs": 215,
3392+ "p50TtftMs": null,
3393+ "totalCostUsd": 0,
3394+ "avgOutputTokens": null,
3395+ "perTest": {
3396+ "embedding": "pass"
3397+ },
3398+ "errors": []
3399+ }
3400+ },
3401+ {
3402+ "id": "text-embedding-3-small",
3403+ "provider": "openai",
3404+ "kind": "embedding",
3405+ "available": true,
3406+ "tested": true,
3407+ "status": "verified",
3408+ "capabilities": {
3409+ "text": false,
3410+ "vision": false,
3411+ "tools": false,
3412+ "structuredOutput": false,
3413+ "streaming": false,
3414+ "reasoning": false,
3415+ "longContext": false,
3416+ "imageGeneration": false,
3417+ "audioOutput": false,
3418+ "audioInput": false
3419+ },
3420+ "pricing": {
3421+ "input": 0.02
3422+ },
3423+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3424+ "benchmark": {
3425+ "tests": 1,
3426+ "passed": 1,
3427+ "qualityScore": null,
3428+ "p50LatencyMs": 319,
3429+ "p50TtftMs": null,
3430+ "totalCostUsd": 0,
3431+ "avgOutputTokens": null,
3432+ "perTest": {
3433+ "embedding": "pass"
3434+ },
3435+ "errors": []
3436+ }
3437+ },
3438+ {
3439+ "id": "text-embedding-ada-002",
3440+ "provider": "openai",
3441+ "kind": "embedding",
3442+ "available": true,
3443+ "tested": true,
3444+ "status": "verified",
3445+ "capabilities": {
3446+ "text": false,
3447+ "vision": false,
3448+ "tools": false,
3449+ "structuredOutput": false,
3450+ "streaming": false,
3451+ "reasoning": false,
3452+ "longContext": false,
3453+ "imageGeneration": false,
3454+ "audioOutput": false,
3455+ "audioInput": false
3456+ },
3457+ "pricing": {
3458+ "input": 0.1
3459+ },
3460+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3461+ "benchmark": {
3462+ "tests": 1,
3463+ "passed": 1,
3464+ "qualityScore": null,
3465+ "p50LatencyMs": 162,
3466+ "p50TtftMs": null,
3467+ "totalCostUsd": 0,
3468+ "avgOutputTokens": null,
3469+ "perTest": {
3470+ "embedding": "pass"
3471+ },
3472+ "errors": []
3473+ }
3474+ },
3475+ {
3476+ "id": "tts-1",
3477+ "provider": "openai",
3478+ "kind": "tts",
3479+ "available": true,
3480+ "tested": true,
3481+ "status": "verified",
3482+ "capabilities": {
3483+ "text": false,
3484+ "vision": false,
3485+ "tools": false,
3486+ "structuredOutput": false,
3487+ "streaming": false,
3488+ "reasoning": false,
3489+ "longContext": false,
3490+ "imageGeneration": false,
3491+ "audioOutput": true,
3492+ "audioInput": false
3493+ },
3494+ "pricing": {
3495+ "perMillionCharacters": 15
3496+ },
3497+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3498+ "benchmark": {
3499+ "tests": 1,
3500+ "passed": 1,
3501+ "qualityScore": null,
3502+ "p50LatencyMs": 2195,
3503+ "p50TtftMs": null,
3504+ "totalCostUsd": 0,
3505+ "avgOutputTokens": null,
3506+ "perTest": {
3507+ "tts": "pass"
3508+ },
3509+ "errors": []
3510+ }
3511+ },
3512+ {
3513+ "id": "tts-1-1106",
3514+ "provider": "openai",
3515+ "kind": "tts",
3516+ "available": false,
3517+ "tested": false,
3518+ "status": "untested",
3519+ "capabilities": {},
3520+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3521+ "unavailableReason": "not tested"
3522+ },
3523+ {
3524+ "id": "tts-1-hd",
3525+ "provider": "openai",
3526+ "kind": "tts",
3527+ "available": true,
3528+ "tested": true,
3529+ "status": "verified",
3530+ "capabilities": {
3531+ "text": false,
3532+ "vision": false,
3533+ "tools": false,
3534+ "structuredOutput": false,
3535+ "streaming": false,
3536+ "reasoning": false,
3537+ "longContext": false,
3538+ "imageGeneration": false,
3539+ "audioOutput": true,
3540+ "audioInput": false
3541+ },
3542+ "pricing": {
3543+ "perMillionCharacters": 30
3544+ },
3545+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3546+ "benchmark": {
3547+ "tests": 1,
3548+ "passed": 1,
3549+ "qualityScore": null,
3550+ "p50LatencyMs": 1689,
3551+ "p50TtftMs": null,
3552+ "totalCostUsd": 0,
3553+ "avgOutputTokens": null,
3554+ "perTest": {
3555+ "tts": "pass"
3556+ },
3557+ "errors": []
3558+ }
3559+ },
3560+ {
3561+ "id": "tts-1-hd-1106",
3562+ "provider": "openai",
3563+ "kind": "tts",
3564+ "available": false,
3565+ "tested": false,
3566+ "status": "untested",
3567+ "capabilities": {},
3568+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3569+ "unavailableReason": "not tested"
3570+ },
3571+ {
3572+ "id": "whisper-1",
3573+ "provider": "openai",
3574+ "kind": "stt",
3575+ "available": true,
3576+ "tested": true,
3577+ "status": "verified",
3578+ "capabilities": {
3579+ "text": false,
3580+ "vision": false,
3581+ "tools": false,
3582+ "structuredOutput": false,
3583+ "streaming": false,
3584+ "reasoning": false,
3585+ "longContext": false,
3586+ "imageGeneration": false,
3587+ "audioOutput": false,
3588+ "audioInput": true
3589+ },
3590+ "pricing": {
3591+ "perMinute": 0.006,
3592+ "notes": "page lists 'Whisper'"
3593+ },
3594+ "lastVerifiedAt": "2026-11-01T07:22:05.282Z",
3595+ "benchmark": {
3596+ "tests": 1,
3597+ "passed": 1,
3598+ "qualityScore": null,
3599+ "p50LatencyMs": 642,
3600+ "p50TtftMs": null,
3601+ "totalCostUsd": 0,
3602+ "avgOutputTokens": null,
3603+ "perTest": {
3604+ "stt": "pass"
3605+ },
3606+ "errors": []
3607+ }
3608+ }
3609+ ]
3610+}
\ No newline at end of file
added benchmarks/modality-results.json +241 −0
@@ -0,0 +1,241 @@
1+{
2+ "generatedAt": "2026-11-01T07:08:00.270Z",
3+ "results": {
4+ "gpt-image-1": {
5+ "kind": "image",
6+ "ok": false,
7+ "latencyMs": 174,
8+ "error": "400 400 The model 'gpt-image-1' does not exist."
9+ },
10+ "gpt-image-1-mini": {
11+ "kind": "image",
12+ "ok": true,
13+ "latencyMs": 5797,
14+ "usage": {
15+ "input_tokens": 17,
16+ "input_tokens_details": {
17+ "image_tokens": 0,
18+ "text_tokens": 17
19+ },
20+ "output_tokens": 272,
21+ "output_tokens_details": {
22+ "image_tokens": 272,
23+ "text_tokens": 0
24+ },
25+ "total_tokens": 289
26+ },
27+ "hasImage": true,
28+ "size": "1024x1024",
29+ "quality": "low"
30+ },
31+ "gpt-image-1.5": {
32+ "kind": "image",
33+ "ok": true,
34+ "latencyMs": 4864,
35+ "usage": {
36+ "input_tokens": 17,
37+ "input_tokens_details": {
38+ "image_tokens": 0,
39+ "text_tokens": 17
40+ },
41+ "output_tokens": 422,
42+ "output_tokens_details": {
43+ "image_tokens": 272,
44+ "text_tokens": 150
45+ },
46+ "total_tokens": 439
47+ },
48+ "hasImage": true,
49+ "size": "1024x1024",
50+ "quality": "low"
51+ },
52+ "gpt-image-2": {
53+ "kind": "image",
54+ "ok": true,
55+ "latencyMs": 6375,
56+ "usage": {
57+ "input_tokens": 17,
58+ "input_tokens_details": {
59+ "image_tokens": 0,
60+ "text_tokens": 17
61+ },
62+ "output_tokens": 196,
63+ "output_tokens_details": {
64+ "image_tokens": 196,
65+ "text_tokens": 0
66+ },
67+ "total_tokens": 213
68+ },
69+ "hasImage": true,
70+ "size": "1024x1024",
71+ "quality": "low"
72+ },
73+ "gpt-image-2.5-flare": {
74+ "kind": "image",
75+ "ok": true,
76+ "latencyMs": 4765,
77+ "usage": {
78+ "input_tokens": 17,
79+ "input_tokens_details": {
80+ "image_tokens": 0,
81+ "text_tokens": 17
82+ },
83+ "output_tokens": 196,
84+ "output_tokens_details": {
85+ "image_tokens": 196,
86+ "text_tokens": 0
87+ },
88+ "total_tokens": 213
89+ },
90+ "hasImage": true,
91+ "size": "1024x1024",
92+ "quality": "low"
93+ },
94+ "gpt-image-2.5-sunburst": {
95+ "kind": "image",
96+ "ok": true,
97+ "latencyMs": 6665,
98+ "usage": {
99+ "input_tokens": 17,
100+ "input_tokens_details": {
101+ "image_tokens": 0,
102+ "text_tokens": 17
103+ },
104+ "output_tokens": 196,
105+ "output_tokens_details": {
106+ "image_tokens": 196,
107+ "text_tokens": 0
108+ },
109+ "total_tokens": 213
110+ },
111+ "hasImage": true,
112+ "size": "1024x1024",
113+ "quality": "low"
114+ },
115+ "chatgpt-image-latest": {
116+ "kind": "image",
117+ "ok": true,
118+ "latencyMs": 5382,
119+ "usage": {
120+ "input_tokens": 17,
121+ "input_tokens_details": {
122+ "image_tokens": 0,
123+ "text_tokens": 17
124+ },
125+ "output_tokens": 502,
126+ "output_tokens_details": {
127+ "image_tokens": 272,
128+ "text_tokens": 230
129+ },
130+ "total_tokens": 519
131+ },
132+ "hasImage": true,
133+ "size": "1024x1024",
134+ "quality": "low"
135+ },
136+ "tts-1": {
137+ "kind": "tts",
138+ "ok": true,
139+ "latencyMs": 2195
140+ },
141+ "tts-1-hd": {
142+ "kind": "tts",
143+ "ok": true,
144+ "latencyMs": 1689
145+ },
146+ "gpt-4o-mini-tts": {
147+ "kind": "tts",
148+ "ok": true,
149+ "latencyMs": 542
150+ },
151+ "whisper-1": {
152+ "kind": "stt",
153+ "ok": true,
154+ "latencyMs": 642,
155+ "text": "Bonjour, ceci est un test de synthèse vocale pour Tchat, SP Boucher et AI.",
156+ "correct": true
157+ },
158+ "gpt-4o-transcribe": {
159+ "kind": "stt",
160+ "ok": true,
161+ "latencyMs": 625,
162+ "text": "Bonjour, ceci est un test de synthèse vocale pour Chat SP Bochet AI.",
163+ "correct": true
164+ },
165+ "gpt-4o-mini-transcribe": {
166+ "kind": "stt",
167+ "ok": true,
168+ "latencyMs": 412,
169+ "text": "Bonjour, ceci est un test de synthèse vocale pour Chat SP Boschet AI.",
170+ "correct": true
171+ },
172+ "gpt-transcribe": {
173+ "kind": "stt",
174+ "ok": true,
175+ "latencyMs": 459,
176+ "text": "Bonjour, ceci est un test de synthèse vocale pour Chat SPBochet AI.",
177+ "correct": true
178+ },
179+ "gpt-4o-transcribe-diarize": {
180+ "kind": "stt",
181+ "ok": true,
182+ "latencyMs": 2799,
183+ "text": "Bonjour, ceci est un test de synthèse vocale pour Chat spbouche ai.",
184+ "correct": true
185+ },
186+ "gpt-audio": {
187+ "kind": "audio-chat",
188+ "ok": false,
189+ "latencyMs": 122,
190+ "error": "400 400 This model requires that either input content or output modality contain audio."
191+ },
192+ "gpt-audio-mini": {
193+ "kind": "audio-chat",
194+ "ok": false,
195+ "latencyMs": 132,
196+ "error": "400 400 This model requires that either input content or output modality contain audio."
197+ },
198+ "gpt-audio-1.5": {
199+ "kind": "audio-chat",
200+ "ok": false,
201+ "latencyMs": 103,
202+ "error": "400 400 This model requires that either input content or output modality contain audio."
203+ },
204+ "text-embedding-3-small": {
205+ "kind": "embedding",
206+ "ok": true,
207+ "latencyMs": 319,
208+ "dims": 1536,
209+ "usage": {
210+ "prompt_tokens": 8,
211+ "total_tokens": 8
212+ }
213+ },
214+ "text-embedding-3-large": {
215+ "kind": "embedding",
216+ "ok": true,
217+ "latencyMs": 215,
218+ "dims": 3072,
219+ "usage": {
220+ "prompt_tokens": 8,
221+ "total_tokens": 8
222+ }
223+ },
224+ "text-embedding-ada-002": {
225+ "kind": "embedding",
226+ "ok": true,
227+ "latencyMs": 162,
228+ "dims": 1536,
229+ "usage": {
230+ "prompt_tokens": 8,
231+ "total_tokens": 8
232+ }
233+ },
234+ "omni-moderation-latest": {
235+ "kind": "moderation",
236+ "ok": true,
237+ "latencyMs": 521,
238+ "flagged": false
239+ }
240+ }
241+}
\ No newline at end of file
added benchmarks/model-discovery.json +1940 −0
@@ -0,0 +1,1940 @@
1+{
2+ "generatedAt": "2026-11-01T07:01:15.888Z",
3+ "openai": [
4+ {
5+ "id": "babbage-002",
6+ "owned_by": "system",
7+ "created": 1692634615
8+ },
9+ {
10+ "id": "chat-latest",
11+ "owned_by": "system",
12+ "created": 1777704602
13+ },
14+ {
15+ "id": "chatgpt-image-latest",
16+ "owned_by": "system",
17+ "created": 1765925279
18+ },
19+ {
20+ "id": "davinci-002",
21+ "owned_by": "system",
22+ "created": 1692634301
23+ },
24+ {
25+ "id": "gpt-3.5-turbo",
26+ "owned_by": "openai",
27+ "created": 1677610602
28+ },
29+ {
30+ "id": "gpt-3.5-turbo-0125",
31+ "owned_by": "system",
32+ "created": 1706048358
33+ },
34+ {
35+ "id": "gpt-3.5-turbo-1106",
36+ "owned_by": "system",
37+ "created": 1698959748
38+ },
39+ {
40+ "id": "gpt-3.5-turbo-16k",
41+ "owned_by": "openai-internal",
42+ "created": 1683758102
43+ },
44+ {
45+ "id": "gpt-3.5-turbo-instruct",
46+ "owned_by": "system",
47+ "created": 1692901427
48+ },
49+ {
50+ "id": "gpt-3.5-turbo-instruct-0914",
51+ "owned_by": "system",
52+ "created": 1694122472
53+ },
54+ {
55+ "id": "gpt-4",
56+ "owned_by": "openai",
57+ "created": 1687882411
58+ },
59+ {
60+ "id": "gpt-4-0613",
61+ "owned_by": "openai",
62+ "created": 1686588896
63+ },
64+ {
65+ "id": "gpt-4-turbo",
66+ "owned_by": "system",
67+ "created": 1712361441
68+ },
69+ {
70+ "id": "gpt-4-turbo-2024-04-09",
71+ "owned_by": "system",
72+ "created": 1712601677
73+ },
74+ {
75+ "id": "gpt-4.1",
76+ "owned_by": "system",
77+ "created": 1744316542
78+ },
79+ {
80+ "id": "gpt-4.1-2025-04-14",
81+ "owned_by": "system",
82+ "created": 1744315746
83+ },
84+ {
85+ "id": "gpt-4.1-mini",
86+ "owned_by": "system",
87+ "created": 1744318173
88+ },
89+ {
90+ "id": "gpt-4.1-mini-2025-04-14",
91+ "owned_by": "system",
92+ "created": 1744317547
93+ },
94+ {
95+ "id": "gpt-4.1-nano",
96+ "owned_by": "system",
97+ "created": 1744321707
98+ },
99+ {
100+ "id": "gpt-4.1-nano-2025-04-14",
101+ "owned_by": "system",
102+ "created": 1744321025
103+ },
104+ {
105+ "id": "gpt-4o",
106+ "owned_by": "system",
107+ "created": 1715367049
108+ },
109+ {
110+ "id": "gpt-4o-2024-05-13",
111+ "owned_by": "system",
112+ "created": 1715368132
113+ },
114+ {
115+ "id": "gpt-4o-2024-08-06",
116+ "owned_by": "system",
117+ "created": 1722814719
118+ },
119+ {
120+ "id": "gpt-4o-2024-11-20",
121+ "owned_by": "system",
122+ "created": 1739331543
123+ },
124+ {
125+ "id": "gpt-4o-mini",
126+ "owned_by": "system",
127+ "created": 1721172741
128+ },
129+ {
130+ "id": "gpt-4o-mini-2024-07-18",
131+ "owned_by": "system",
132+ "created": 1721172717
133+ },
134+ {
135+ "id": "gpt-4o-mini-search-preview",
136+ "owned_by": "system",
137+ "created": 1741391161
138+ },
139+ {
140+ "id": "gpt-4o-mini-search-preview-2025-03-11",
141+ "owned_by": "system",
142+ "created": 1741390858
143+ },
144+ {
145+ "id": "gpt-4o-mini-transcribe",
146+ "owned_by": "system",
147+ "created": 1742068596
148+ },
149+ {
150+ "id": "gpt-4o-mini-transcribe-2025-03-20",
151+ "owned_by": "system",
152+ "created": 1765610545
153+ },
154+ {
155+ "id": "gpt-4o-mini-transcribe-2025-12-15",
156+ "owned_by": "system",
157+ "created": 1765610407
158+ },
159+ {
160+ "id": "gpt-4o-mini-tts",
161+ "owned_by": "system",
162+ "created": 1742403959
163+ },
164+ {
165+ "id": "gpt-4o-mini-tts-2025-03-20",
166+ "owned_by": "system",
167+ "created": 1765610731
168+ },
169+ {
170+ "id": "gpt-4o-mini-tts-2025-12-15",
171+ "owned_by": "system",
172+ "created": 1765610837
173+ },
174+ {
175+ "id": "gpt-4o-search-preview",
176+ "owned_by": "system",
177+ "created": 1771905534
178+ },
179+ {
180+ "id": "gpt-4o-search-preview-2025-03-11",
181+ "owned_by": "system",
182+ "created": 1771905621
183+ },
184+ {
185+ "id": "gpt-4o-transcribe",
186+ "owned_by": "system",
187+ "created": 1742068463
188+ },
189+ {
190+ "id": "gpt-4o-transcribe-diarize",
191+ "owned_by": "system",
192+ "created": 1750798887
193+ },
194+ {
195+ "id": "gpt-5",
196+ "owned_by": "system",
197+ "created": 1754425777
198+ },
199+ {
200+ "id": "gpt-5-2025-08-07",
201+ "owned_by": "system",
202+ "created": 1754075360
203+ },
204+ {
205+ "id": "gpt-5-chat-latest",
206+ "owned_by": "system",
207+ "created": 1754073306
208+ },
209+ {
210+ "id": "gpt-5-codex",
211+ "owned_by": "system",
212+ "created": 1757527818
213+ },
214+ {
215+ "id": "gpt-5-mini",
216+ "owned_by": "system",
217+ "created": 1754425928
218+ },
219+ {
220+ "id": "gpt-5-mini-2025-08-07",
221+ "owned_by": "system",
222+ "created": 1754425867
223+ },
224+ {
225+ "id": "gpt-5-nano",
226+ "owned_by": "system",
227+ "created": 1754426384
228+ },
229+ {
230+ "id": "gpt-5-nano-2025-08-07",
231+ "owned_by": "system",
232+ "created": 1754426303
233+ },
234+ {
235+ "id": "gpt-5-pro",
236+ "owned_by": "system",
237+ "created": 1759469822
238+ },
239+ {
240+ "id": "gpt-5-pro-2025-10-06",
241+ "owned_by": "system",
242+ "created": 1759469707
243+ },
244+ {
245+ "id": "gpt-5-search-api",
246+ "owned_by": "system",
247+ "created": 1759514629
248+ },
249+ {
250+ "id": "gpt-5-search-api-2025-10-14",
251+ "owned_by": "system",
252+ "created": 1760043960
253+ },
254+ {
255+ "id": "gpt-5.1",
256+ "owned_by": "system",
257+ "created": 1762800673
258+ },
259+ {
260+ "id": "gpt-5.1-2025-11-13",
261+ "owned_by": "system",
262+ "created": 1762800353
263+ },
264+ {
265+ "id": "gpt-5.1-chat-latest",
266+ "owned_by": "system",
267+ "created": 1762547951
268+ },
269+ {
270+ "id": "gpt-5.1-codex",
271+ "owned_by": "system",
272+ "created": 1762988221
273+ },
274+ {
275+ "id": "gpt-5.1-codex-max",
276+ "owned_by": "system",
277+ "created": 1763671532
278+ },
279+ {
280+ "id": "gpt-5.1-codex-mini",
281+ "owned_by": "system",
282+ "created": 1763007109
283+ },
284+ {
285+ "id": "gpt-5.2",
286+ "owned_by": "system",
287+ "created": 1765313051
288+ },
289+ {
290+ "id": "gpt-5.2-2025-12-11",
291+ "owned_by": "system",
292+ "created": 1765313028
293+ },
294+ {
295+ "id": "gpt-5.2-chat-latest",
296+ "owned_by": "system",
297+ "created": 1765344352
298+ },
299+ {
300+ "id": "gpt-5.2-codex",
301+ "owned_by": "system",
302+ "created": 1766164985
303+ },
304+ {
305+ "id": "gpt-5.2-pro",
306+ "owned_by": "system",
307+ "created": 1765343983
308+ },
309+ {
310+ "id": "gpt-5.2-pro-2025-12-11",
311+ "owned_by": "system",
312+ "created": 1765343959
313+ },
314+ {
315+ "id": "gpt-5.3-chat-latest",
316+ "owned_by": "system",
317+ "created": 1772236571
318+ },
319+ {
320+ "id": "gpt-5.3-codex",
321+ "owned_by": "system",
322+ "created": 1770537915
323+ },
324+ {
325+ "id": "gpt-5.4",
326+ "owned_by": "system",
327+ "created": 1772691852
328+ },
329+ {
330+ "id": "gpt-5.4-2026-03-05",
331+ "owned_by": "system",
332+ "created": 1772654062
333+ },
334+ {
335+ "id": "gpt-5.4-mini",
336+ "owned_by": "system",
337+ "created": 1773451123
338+ },
339+ {
340+ "id": "gpt-5.4-mini-2026-03-17",
341+ "owned_by": "system",
342+ "created": 1773451076
343+ },
344+ {
345+ "id": "gpt-5.4-nano",
346+ "owned_by": "system",
347+ "created": 1773450870
348+ },
349+ {
350+ "id": "gpt-5.4-nano-2026-03-17",
351+ "owned_by": "system",
352+ "created": 1773450837
353+ },
354+ {
355+ "id": "gpt-5.4-pro",
356+ "owned_by": "system",
357+ "created": 1772659601
358+ },
359+ {
360+ "id": "gpt-5.4-pro-2026-03-05",
361+ "owned_by": "system",
362+ "created": 1772659657
363+ },
364+ {
365+ "id": "gpt-5.5",
366+ "owned_by": "system",
367+ "created": 1776824847
368+ },
369+ {
370+ "id": "gpt-5.5-2026-04-23",
371+ "owned_by": "system",
372+ "created": 1776839241
373+ },
374+ {
375+ "id": "gpt-5.5-pro",
376+ "owned_by": "system",
377+ "created": 1776894349
378+ },
379+ {
380+ "id": "gpt-5.5-pro-2026-04-23",
381+ "owned_by": "system",
382+ "created": 1776894470
383+ },
384+ {
385+ "id": "gpt-5.6-luna",
386+ "owned_by": "system",
387+ "created": 1782228658
388+ },
389+ {
390+ "id": "gpt-5.6-sol",
391+ "owned_by": "system",
392+ "created": 1782228018
393+ },
394+ {
395+ "id": "gpt-5.6-terra",
396+ "owned_by": "system",
397+ "created": 1782228459
398+ },
399+ {
400+ "id": "gpt-6-astra",
401+ "owned_by": "system",
402+ "created": 1787853604
403+ },
404+ {
405+ "id": "gpt-6-luna",
406+ "owned_by": "system",
407+ "created": 1789406102
408+ },
409+ {
410+ "id": "gpt-6-sol",
411+ "owned_by": "system",
412+ "created": 1789405937
413+ },
414+ {
415+ "id": "gpt-6.1-sol",
416+ "owned_by": "system",
417+ "created": 1790552874
418+ },
419+ {
420+ "id": "gpt-6.1-terra",
421+ "owned_by": "system",
422+ "created": 1791908780
423+ },
424+ {
425+ "id": "gpt-audio",
426+ "owned_by": "system",
427+ "created": 1756339249
428+ },
429+ {
430+ "id": "gpt-audio-1.5",
431+ "owned_by": "system",
432+ "created": 1771550885
433+ },
434+ {
435+ "id": "gpt-audio-2025-08-28",
436+ "owned_by": "system",
437+ "created": 1756256146
438+ },
439+ {
440+ "id": "gpt-audio-mini",
441+ "owned_by": "system",
442+ "created": 1759512027
443+ },
444+ {
445+ "id": "gpt-audio-mini-2025-10-06",
446+ "owned_by": "system",
447+ "created": 1759512137
448+ },
449+ {
450+ "id": "gpt-audio-mini-2025-12-15",
451+ "owned_by": "system",
452+ "created": 1765760008
453+ },
454+ {
455+ "id": "gpt-image-1",
456+ "owned_by": "system",
457+ "created": 1745517030
458+ },
459+ {
460+ "id": "gpt-image-1-mini",
461+ "owned_by": "system",
462+ "created": 1758845821
463+ },
464+ {
465+ "id": "gpt-image-1.5",
466+ "owned_by": "system",
467+ "created": 1764030620
468+ },
469+ {
470+ "id": "gpt-image-2",
471+ "owned_by": "system",
472+ "created": 1776399795
473+ },
474+ {
475+ "id": "gpt-image-2-2026-04-21",
476+ "owned_by": "system",
477+ "created": 1776399994
478+ },
479+ {
480+ "id": "gpt-image-2.5-flare",
481+ "owned_by": "system",
482+ "created": 1788563147
483+ },
484+ {
485+ "id": "gpt-image-2.5-flare-2026-09-08",
486+ "owned_by": "system",
487+ "created": 1788851006
488+ },
489+ {
490+ "id": "gpt-image-2.5-sunburst",
491+ "owned_by": "system",
492+ "created": 1788563162
493+ },
494+ {
495+ "id": "gpt-image-2.5-sunburst-2026-09-08",
496+ "owned_by": "system",
497+ "created": 1788851010
498+ },
499+ {
500+ "id": "gpt-live-1",
501+ "owned_by": "system",
502+ "created": 1788889407
503+ },
504+ {
505+ "id": "gpt-live-transcribe",
506+ "owned_by": "system",
507+ "created": 1785168034
508+ },
509+ {
510+ "id": "gpt-realtime",
511+ "owned_by": "system",
512+ "created": 1756271701
513+ },
514+ {
515+ "id": "gpt-realtime-1.5",
516+ "owned_by": "system",
517+ "created": 1771461469
518+ },
519+ {
520+ "id": "gpt-realtime-2",
521+ "owned_by": "system",
522+ "created": 1778006032
523+ },
524+ {
525+ "id": "gpt-realtime-2.1",
526+ "owned_by": "system",
527+ "created": 1782254687
528+ },
529+ {
530+ "id": "gpt-realtime-2.1-mini",
531+ "owned_by": "system",
532+ "created": 1782254706
533+ },
534+ {
535+ "id": "gpt-realtime-2025-08-28",
536+ "owned_by": "system",
537+ "created": 1756271773
538+ },
539+ {
540+ "id": "gpt-realtime-mini",
541+ "owned_by": "system",
542+ "created": 1759517133
543+ },
544+ {
545+ "id": "gpt-realtime-mini-2025-12-15",
546+ "owned_by": "system",
547+ "created": 1765612007
548+ },
549+ {
550+ "id": "gpt-realtime-translate",
551+ "owned_by": "system",
552+ "created": 1777950216
553+ },
554+ {
555+ "id": "gpt-realtime-whisper",
556+ "owned_by": "system",
557+ "created": 1778012060
558+ },
559+ {
560+ "id": "gpt-transcribe",
561+ "owned_by": "system",
562+ "created": 1785168027
563+ },
564+ {
565+ "id": "o1",
566+ "owned_by": "system",
567+ "created": 1734375816
568+ },
569+ {
570+ "id": "o1-2024-12-17",
571+ "owned_by": "system",
572+ "created": 1734326976
573+ },
574+ {
575+ "id": "o1-pro",
576+ "owned_by": "system",
577+ "created": 1742251791
578+ },
579+ {
580+ "id": "o1-pro-2025-03-19",
581+ "owned_by": "system",
582+ "created": 1742251504
583+ },
584+ {
585+ "id": "o3",
586+ "owned_by": "system",
587+ "created": 1744225308
588+ },
589+ {
590+ "id": "o3-2025-04-16",
591+ "owned_by": "system",
592+ "created": 1744133301
593+ },
594+ {
595+ "id": "o3-deep-research",
596+ "owned_by": "system",
597+ "created": 1749840121
598+ },
599+ {
600+ "id": "o3-deep-research-2025-06-26",
601+ "owned_by": "system",
602+ "created": 1750865219
603+ },
604+ {
605+ "id": "o3-mini",
606+ "owned_by": "system",
607+ "created": 1737146383
608+ },
609+ {
610+ "id": "o3-mini-2025-01-31",
611+ "owned_by": "system",
612+ "created": 1738010200
613+ },
614+ {
615+ "id": "o3-pro",
616+ "owned_by": "system",
617+ "created": 1748475349
618+ },
619+ {
620+ "id": "o3-pro-2025-06-10",
621+ "owned_by": "system",
622+ "created": 1749166761
623+ },
624+ {
625+ "id": "o4-mini",
626+ "owned_by": "system",
627+ "created": 1744225351
628+ },
629+ {
630+ "id": "o4-mini-2025-04-16",
631+ "owned_by": "system",
632+ "created": 1744133506
633+ },
634+ {
635+ "id": "o4-mini-deep-research",
636+ "owned_by": "system",
637+ "created": 1749685485
638+ },
639+ {
640+ "id": "o4-mini-deep-research-2025-06-26",
641+ "owned_by": "system",
642+ "created": 1750866121
643+ },
644+ {
645+ "id": "omni-moderation-2024-09-26",
646+ "owned_by": "system",
647+ "created": 1732734466
648+ },
649+ {
650+ "id": "omni-moderation-latest",
651+ "owned_by": "system",
652+ "created": 1731689265
653+ },
654+ {
655+ "id": "sora-2",
656+ "owned_by": "system",
657+ "created": 1759708615
658+ },
659+ {
660+ "id": "sora-2-pro",
661+ "owned_by": "system",
662+ "created": 1759708663
663+ },
664+ {
665+ "id": "text-embedding-3-large",
666+ "owned_by": "system",
667+ "created": 1705953180
668+ },
669+ {
670+ "id": "text-embedding-3-small",
671+ "owned_by": "system",
672+ "created": 1705948997
673+ },
674+ {
675+ "id": "text-embedding-ada-002",
676+ "owned_by": "openai-internal",
677+ "created": 1671217299
678+ },
679+ {
680+ "id": "tts-1",
681+ "owned_by": "openai-internal",
682+ "created": 1681940951
683+ },
684+ {
685+ "id": "tts-1-1106",
686+ "owned_by": "system",
687+ "created": 1699053241
688+ },
689+ {
690+ "id": "tts-1-hd",
691+ "owned_by": "system",
692+ "created": 1699046015
693+ },
694+ {
695+ "id": "tts-1-hd-1106",
696+ "owned_by": "system",
697+ "created": 1699053533
698+ },
699+ {
700+ "id": "whisper-1",
701+ "owned_by": "openai-internal",
702+ "created": 1677532384
703+ }
704+ ],
705+ "anthropic": [
706+ {
707+ "type": "model",
708+ "id": "claude-fable-5",
709+ "display_name": "Claude Fable 5",
710+ "created_at": "2026-06-07T00:00:00Z",
711+ "line": "fable",
712+ "max_input_tokens": 1000000,
713+ "max_tokens": 128000,
714+ "capabilities": {
715+ "batch": {
716+ "supported": true
717+ },
718+ "citations": {
719+ "supported": true
720+ },
721+ "code_execution": {
722+ "supported": true
723+ },
724+ "context_management": {
725+ "supported": true,
726+ "clear_tool_uses_20250919": {
727+ "supported": true
728+ },
729+ "clear_thinking_20251015": {
730+ "supported": true
731+ },
732+ "compact_20260112": {
733+ "supported": true
734+ }
735+ },
736+ "effort": {
737+ "supported": true,
738+ "low": {
739+ "supported": true
740+ },
741+ "medium": {
742+ "supported": true
743+ },
744+ "high": {
745+ "supported": true
746+ },
747+ "xhigh": {
748+ "supported": true
749+ },
750+ "max": {
751+ "supported": true
752+ }
753+ },
754+ "image_input": {
755+ "supported": true
756+ },
757+ "pdf_input": {
758+ "supported": true
759+ },
760+ "server_tools": {
761+ "supported": true,
762+ "code_execution": {
763+ "supported": true
764+ },
765+ "web_search": {
766+ "supported": true
767+ }
768+ },
769+ "structured_outputs": {
770+ "supported": true
771+ },
772+ "thinking": {
773+ "supported": true,
774+ "types": {
775+ "enabled": {
776+ "supported": false
777+ },
778+ "adaptive": {
779+ "supported": true
780+ },
781+ "disabled": {
782+ "supported": false
783+ },
784+ "between_tools": {
785+ "supported": false
786+ }
787+ }
788+ }
789+ },
790+ "lifecycle": "active",
791+ "deprecated_at": null,
792+ "retires_at": null
793+ },
794+ {
795+ "type": "model",
796+ "id": "claude-fable-5-1",
797+ "display_name": "Claude Fable 5.1",
798+ "created_at": "2026-08-28T00:00:00Z",
799+ "line": "fable",
800+ "max_input_tokens": 1000000,
801+ "max_tokens": 128000,
802+ "capabilities": {
803+ "batch": {
804+ "supported": true
805+ },
806+ "citations": {
807+ "supported": true
808+ },
809+ "code_execution": {
810+ "supported": true
811+ },
812+ "context_management": {
813+ "supported": true,
814+ "clear_tool_uses_20250919": {
815+ "supported": true
816+ },
817+ "clear_thinking_20251015": {
818+ "supported": true
819+ },
820+ "compact_20260112": {
821+ "supported": true
822+ }
823+ },
824+ "effort": {
825+ "supported": true,
826+ "low": {
827+ "supported": true
828+ },
829+ "medium": {
830+ "supported": true
831+ },
832+ "high": {
833+ "supported": true
834+ },
835+ "xhigh": {
836+ "supported": true
837+ },
838+ "max": {
839+ "supported": true
840+ }
841+ },
842+ "image_input": {
843+ "supported": true
844+ },
845+ "pdf_input": {
846+ "supported": true
847+ },
848+ "server_tools": {
849+ "supported": true,
850+ "code_execution": {
851+ "supported": true
852+ },
853+ "web_search": {
854+ "supported": true
855+ }
856+ },
857+ "structured_outputs": {
858+ "supported": true
859+ },
860+ "thinking": {
861+ "supported": true,
862+ "types": {
863+ "enabled": {
864+ "supported": false
865+ },
866+ "adaptive": {
867+ "supported": true
868+ },
869+ "disabled": {
870+ "supported": false
871+ },
872+ "between_tools": {
873+ "supported": false
874+ }
875+ }
876+ }
877+ },
878+ "lifecycle": "active",
879+ "deprecated_at": null,
880+ "retires_at": null
881+ },
882+ {
883+ "type": "model",
884+ "id": "claude-haiku-4-5-20251001",
885+ "display_name": "Claude Haiku 4.5",
886+ "created_at": "2025-10-15T00:00:00Z",
887+ "line": "haiku",
888+ "max_input_tokens": 200000,
889+ "max_tokens": 64000,
890+ "capabilities": {
891+ "batch": {
892+ "supported": true
893+ },
894+ "citations": {
895+ "supported": true
896+ },
897+ "code_execution": {
898+ "supported": false
899+ },
900+ "context_management": {
901+ "supported": true,
902+ "clear_tool_uses_20250919": {
903+ "supported": true
904+ },
905+ "clear_thinking_20251015": {
906+ "supported": true
907+ },
908+ "compact_20260112": {
909+ "supported": false
910+ }
911+ },
912+ "effort": {
913+ "supported": false,
914+ "low": {
915+ "supported": false
916+ },
917+ "medium": {
918+ "supported": false
919+ },
920+ "high": {
921+ "supported": false
922+ },
923+ "xhigh": {
924+ "supported": false
925+ },
926+ "max": {
927+ "supported": false
928+ }
929+ },
930+ "image_input": {
931+ "supported": true
932+ },
933+ "pdf_input": {
934+ "supported": true
935+ },
936+ "server_tools": {
937+ "supported": true,
938+ "code_execution": {
939+ "supported": true
940+ },
941+ "web_search": {
942+ "supported": true
943+ }
944+ },
945+ "structured_outputs": {
946+ "supported": true
947+ },
948+ "thinking": {
949+ "supported": true,
950+ "types": {
951+ "enabled": {
952+ "supported": true
953+ },
954+ "adaptive": {
955+ "supported": false
956+ },
957+ "disabled": {
958+ "supported": true
959+ },
960+ "between_tools": {
961+ "supported": false
962+ }
963+ }
964+ }
965+ },
966+ "lifecycle": "active",
967+ "deprecated_at": null,
968+ "retires_at": null
969+ },
970+ {
971+ "type": "model",
972+ "id": "claude-haiku-5-5",
973+ "display_name": "Claude Haiku 5.5",
974+ "created_at": "2026-10-07T18:00:00Z",
975+ "line": "haiku",
976+ "max_input_tokens": 1000000,
977+ "max_tokens": 128000,
978+ "capabilities": {
979+ "batch": {
980+ "supported": true
981+ },
982+ "citations": {
983+ "supported": true
984+ },
985+ "code_execution": {
986+ "supported": true
987+ },
988+ "context_management": {
989+ "supported": true,
990+ "clear_tool_uses_20250919": {
991+ "supported": true
992+ },
993+ "clear_thinking_20251015": {
994+ "supported": true
995+ },
996+ "compact_20260112": {
997+ "supported": true
998+ }
999+ },
1000+ "effort": {
1001+ "supported": true,
1002+ "low": {
1003+ "supported": true
1004+ },
1005+ "medium": {
1006+ "supported": true
1007+ },
1008+ "high": {
1009+ "supported": true
1010+ },
1011+ "xhigh": {
1012+ "supported": true
1013+ },
1014+ "max": {
1015+ "supported": true
1016+ }
1017+ },
1018+ "image_input": {
1019+ "supported": true
1020+ },
1021+ "pdf_input": {
1022+ "supported": true
1023+ },
1024+ "server_tools": {
1025+ "supported": true,
1026+ "code_execution": {
1027+ "supported": true
1028+ },
1029+ "web_search": {
1030+ "supported": true
1031+ }
1032+ },
1033+ "structured_outputs": {
1034+ "supported": true
1035+ },
1036+ "thinking": {
1037+ "supported": true,
1038+ "types": {
1039+ "enabled": {
1040+ "supported": false
1041+ },
1042+ "adaptive": {
1043+ "supported": true
1044+ },
1045+ "disabled": {
1046+ "supported": true
1047+ },
1048+ "between_tools": {
1049+ "supported": false
1050+ }
1051+ }
1052+ }
1053+ },
1054+ "lifecycle": "active",
1055+ "deprecated_at": null,
1056+ "retires_at": null
1057+ },
1058+ {
1059+ "type": "model",
1060+ "id": "claude-opus-4-5-20251101",
1061+ "display_name": "Claude Opus 4.5",
1062+ "created_at": "2025-11-24T00:00:00Z",
1063+ "line": "opus",
1064+ "max_input_tokens": 200000,
1065+ "max_tokens": 64000,
1066+ "capabilities": {
1067+ "batch": {
1068+ "supported": true
1069+ },
1070+ "citations": {
1071+ "supported": true
1072+ },
1073+ "code_execution": {
1074+ "supported": true
1075+ },
1076+ "context_management": {
1077+ "supported": true,
1078+ "clear_tool_uses_20250919": {
1079+ "supported": true
1080+ },
1081+ "clear_thinking_20251015": {
1082+ "supported": true
1083+ },
1084+ "compact_20260112": {
1085+ "supported": false
1086+ }
1087+ },
1088+ "effort": {
1089+ "supported": true,
1090+ "low": {
1091+ "supported": true
1092+ },
1093+ "medium": {
1094+ "supported": true
1095+ },
1096+ "high": {
1097+ "supported": true
1098+ },
1099+ "xhigh": {
1100+ "supported": false
1101+ },
1102+ "max": {
1103+ "supported": false
1104+ }
1105+ },
1106+ "image_input": {
1107+ "supported": true
1108+ },
1109+ "pdf_input": {
1110+ "supported": true
1111+ },
1112+ "server_tools": {
1113+ "supported": true,
1114+ "code_execution": {
1115+ "supported": true
1116+ },
1117+ "web_search": {
1118+ "supported": true
1119+ }
1120+ },
1121+ "structured_outputs": {
1122+ "supported": true
1123+ },
1124+ "thinking": {
1125+ "supported": true,
1126+ "types": {
1127+ "enabled": {
1128+ "supported": true
1129+ },
1130+ "adaptive": {
1131+ "supported": false
1132+ },
1133+ "disabled": {
1134+ "supported": true
1135+ },
1136+ "between_tools": {
1137+ "supported": false
1138+ }
1139+ }
1140+ }
1141+ },
1142+ "lifecycle": "active",
1143+ "deprecated_at": null,
1144+ "retires_at": null
1145+ },
1146+ {
1147+ "type": "model",
1148+ "id": "claude-opus-4-6",
1149+ "display_name": "Claude Opus 4.6",
1150+ "created_at": "2026-02-04T00:00:00Z",
1151+ "line": "opus",
1152+ "max_input_tokens": 1000000,
1153+ "max_tokens": 128000,
1154+ "capabilities": {
1155+ "batch": {
1156+ "supported": true
1157+ },
1158+ "citations": {
1159+ "supported": true
1160+ },
1161+ "code_execution": {
1162+ "supported": true
1163+ },
1164+ "context_management": {
1165+ "supported": true,
1166+ "clear_tool_uses_20250919": {
1167+ "supported": true
1168+ },
1169+ "clear_thinking_20251015": {
1170+ "supported": true
1171+ },
1172+ "compact_20260112": {
1173+ "supported": true
1174+ }
1175+ },
1176+ "effort": {
1177+ "supported": true,
1178+ "low": {
1179+ "supported": true
1180+ },
1181+ "medium": {
1182+ "supported": true
1183+ },
1184+ "high": {
1185+ "supported": true
1186+ },
1187+ "xhigh": {
1188+ "supported": false
1189+ },
1190+ "max": {
1191+ "supported": true
1192+ }
1193+ },
1194+ "image_input": {
1195+ "supported": true
1196+ },
1197+ "pdf_input": {
1198+ "supported": true
1199+ },
1200+ "server_tools": {
1201+ "supported": true,
1202+ "code_execution": {
1203+ "supported": true
1204+ },
1205+ "web_search": {
1206+ "supported": true
1207+ }
1208+ },
1209+ "structured_outputs": {
1210+ "supported": true
1211+ },
1212+ "thinking": {
1213+ "supported": true,
1214+ "types": {
1215+ "enabled": {
1216+ "supported": true
1217+ },
1218+ "adaptive": {
1219+ "supported": true
1220+ },
1221+ "disabled": {
1222+ "supported": true
1223+ },
1224+ "between_tools": {
1225+ "supported": false
1226+ }
1227+ }
1228+ }
1229+ },
1230+ "lifecycle": "active",
1231+ "deprecated_at": null,
1232+ "retires_at": null
1233+ },
1234+ {
1235+ "type": "model",
1236+ "id": "claude-opus-4-7",
1237+ "display_name": "Claude Opus 4.7",
1238+ "created_at": "2026-04-14T00:00:00Z",
1239+ "line": "opus",
1240+ "max_input_tokens": 1000000,
1241+ "max_tokens": 128000,
1242+ "capabilities": {
1243+ "batch": {
1244+ "supported": true
1245+ },
1246+ "citations": {
1247+ "supported": true
1248+ },
1249+ "code_execution": {
1250+ "supported": true
1251+ },
1252+ "context_management": {
1253+ "supported": true,
1254+ "clear_tool_uses_20250919": {
1255+ "supported": true
1256+ },
1257+ "clear_thinking_20251015": {
1258+ "supported": true
1259+ },
1260+ "compact_20260112": {
1261+ "supported": true
1262+ }
1263+ },
1264+ "effort": {
1265+ "supported": true,
1266+ "low": {
1267+ "supported": true
1268+ },
1269+ "medium": {
1270+ "supported": true
1271+ },
1272+ "high": {
1273+ "supported": true
1274+ },
1275+ "xhigh": {
1276+ "supported": true
1277+ },
1278+ "max": {
1279+ "supported": true
1280+ }
1281+ },
1282+ "image_input": {
1283+ "supported": true
1284+ },
1285+ "pdf_input": {
1286+ "supported": true
1287+ },
1288+ "server_tools": {
1289+ "supported": true,
1290+ "code_execution": {
1291+ "supported": true
1292+ },
1293+ "web_search": {
1294+ "supported": true
1295+ }
1296+ },
1297+ "structured_outputs": {
1298+ "supported": true
1299+ },
1300+ "thinking": {
1301+ "supported": true,
1302+ "types": {
1303+ "enabled": {
1304+ "supported": false
1305+ },
1306+ "adaptive": {
1307+ "supported": true
1308+ },
1309+ "disabled": {
1310+ "supported": true
1311+ },
1312+ "between_tools": {
1313+ "supported": false
1314+ }
1315+ }
1316+ }
1317+ },
1318+ "lifecycle": "active",
1319+ "deprecated_at": null,
1320+ "retires_at": null
1321+ },
1322+ {
1323+ "type": "model",
1324+ "id": "claude-opus-4-8",
1325+ "display_name": "Claude Opus 4.8",
1326+ "created_at": "2026-05-28T00:00:00Z",
1327+ "line": "opus",
1328+ "max_input_tokens": 1000000,
1329+ "max_tokens": 128000,
1330+ "capabilities": {
1331+ "batch": {
1332+ "supported": true
1333+ },
1334+ "citations": {
1335+ "supported": true
1336+ },
1337+ "code_execution": {
1338+ "supported": true
1339+ },
1340+ "context_management": {
1341+ "supported": true,
1342+ "clear_tool_uses_20250919": {
1343+ "supported": true
1344+ },
1345+ "clear_thinking_20251015": {
1346+ "supported": true
1347+ },
1348+ "compact_20260112": {
1349+ "supported": true
1350+ }
1351+ },
1352+ "effort": {
1353+ "supported": true,
1354+ "low": {
1355+ "supported": true
1356+ },
1357+ "medium": {
1358+ "supported": true
1359+ },
1360+ "high": {
1361+ "supported": true
1362+ },
1363+ "xhigh": {
1364+ "supported": true
1365+ },
1366+ "max": {
1367+ "supported": true
1368+ }
1369+ },
1370+ "image_input": {
1371+ "supported": true
1372+ },
1373+ "pdf_input": {
1374+ "supported": true
1375+ },
1376+ "server_tools": {
1377+ "supported": true,
1378+ "code_execution": {
1379+ "supported": true
1380+ },
1381+ "web_search": {
1382+ "supported": true
1383+ }
1384+ },
1385+ "structured_outputs": {
1386+ "supported": true
1387+ },
1388+ "thinking": {
1389+ "supported": true,
1390+ "types": {
1391+ "enabled": {
1392+ "supported": false
1393+ },
1394+ "adaptive": {
1395+ "supported": true
1396+ },
1397+ "disabled": {
1398+ "supported": true
1399+ },
1400+ "between_tools": {
1401+ "supported": false
1402+ }
1403+ }
1404+ }
1405+ },
1406+ "lifecycle": "active",
1407+ "deprecated_at": null,
1408+ "retires_at": null
1409+ },
1410+ {
1411+ "type": "model",
1412+ "id": "claude-opus-5",
1413+ "display_name": "Claude Opus 5",
1414+ "created_at": "2026-07-24T00:00:00Z",
1415+ "line": "opus",
1416+ "max_input_tokens": 1000000,
1417+ "max_tokens": 128000,
1418+ "capabilities": {
1419+ "batch": {
1420+ "supported": true
1421+ },
1422+ "citations": {
1423+ "supported": true
1424+ },
1425+ "code_execution": {
1426+ "supported": true
1427+ },
1428+ "context_management": {
1429+ "supported": true,
1430+ "clear_tool_uses_20250919": {
1431+ "supported": true
1432+ },
1433+ "clear_thinking_20251015": {
1434+ "supported": true
1435+ },
1436+ "compact_20260112": {
1437+ "supported": true
1438+ }
1439+ },
1440+ "effort": {
1441+ "supported": true,
1442+ "low": {
1443+ "supported": true
1444+ },
1445+ "medium": {
1446+ "supported": true
1447+ },
1448+ "high": {
1449+ "supported": true
1450+ },
1451+ "xhigh": {
1452+ "supported": true
1453+ },
1454+ "max": {
1455+ "supported": true
1456+ }
1457+ },
1458+ "image_input": {
1459+ "supported": true
1460+ },
1461+ "pdf_input": {
1462+ "supported": true
1463+ },
1464+ "server_tools": {
1465+ "supported": true,
1466+ "code_execution": {
1467+ "supported": true
1468+ },
1469+ "web_search": {
1470+ "supported": true
1471+ }
1472+ },
1473+ "structured_outputs": {
1474+ "supported": true
1475+ },
1476+ "thinking": {
1477+ "supported": true,
1478+ "types": {
1479+ "enabled": {
1480+ "supported": false
1481+ },
1482+ "adaptive": {
1483+ "supported": true
1484+ },
1485+ "disabled": {
1486+ "supported": true
1487+ },
1488+ "between_tools": {
1489+ "supported": false
1490+ }
1491+ }
1492+ }
1493+ },
1494+ "lifecycle": "active",
1495+ "deprecated_at": null,
1496+ "retires_at": null
1497+ },
1498+ {
1499+ "type": "model",
1500+ "id": "claude-opus-5-5",
1501+ "display_name": "Claude Opus 5.5",
1502+ "created_at": "2026-09-21T16:24:00Z",
1503+ "line": "opus",
1504+ "max_input_tokens": 1000000,
1505+ "max_tokens": 128000,
1506+ "capabilities": {
1507+ "batch": {
1508+ "supported": true
1509+ },
1510+ "citations": {
1511+ "supported": true
1512+ },
1513+ "code_execution": {
1514+ "supported": true
1515+ },
1516+ "context_management": {
1517+ "supported": true,
1518+ "clear_tool_uses_20250919": {
1519+ "supported": true
1520+ },
1521+ "clear_thinking_20251015": {
1522+ "supported": true
1523+ },
1524+ "compact_20260112": {
1525+ "supported": true
1526+ }
1527+ },
1528+ "effort": {
1529+ "supported": true,
1530+ "low": {
1531+ "supported": true
1532+ },
1533+ "medium": {
1534+ "supported": true
1535+ },
1536+ "high": {
1537+ "supported": true
1538+ },
1539+ "xhigh": {
1540+ "supported": true
1541+ },
1542+ "max": {
1543+ "supported": true
1544+ }
1545+ },
1546+ "image_input": {
1547+ "supported": true
1548+ },
1549+ "pdf_input": {
1550+ "supported": true
1551+ },
1552+ "server_tools": {
1553+ "supported": true,
1554+ "code_execution": {
1555+ "supported": true
1556+ },
1557+ "web_search": {
1558+ "supported": true
1559+ }
1560+ },
1561+ "structured_outputs": {
1562+ "supported": true
1563+ },
1564+ "thinking": {
1565+ "supported": true,
1566+ "types": {
1567+ "enabled": {
1568+ "supported": false
1569+ },
1570+ "adaptive": {
1571+ "supported": true
1572+ },
1573+ "disabled": {
1574+ "supported": false
1575+ },
1576+ "between_tools": {
1577+ "supported": false
1578+ }
1579+ }
1580+ }
1581+ },
1582+ "lifecycle": "active",
1583+ "deprecated_at": null,
1584+ "retires_at": null
1585+ },
1586+ {
1587+ "type": "model",
1588+ "id": "claude-sonnet-4-5-20250929",
1589+ "display_name": "Claude Sonnet 4.5",
1590+ "created_at": "2025-09-29T00:00:00Z",
1591+ "line": "sonnet",
1592+ "max_input_tokens": 200000,
1593+ "max_tokens": 64000,
1594+ "capabilities": {
1595+ "batch": {
1596+ "supported": true
1597+ },
1598+ "citations": {
1599+ "supported": true
1600+ },
1601+ "code_execution": {
1602+ "supported": true
1603+ },
1604+ "context_management": {
1605+ "supported": true,
1606+ "clear_tool_uses_20250919": {
1607+ "supported": true
1608+ },
1609+ "clear_thinking_20251015": {
1610+ "supported": true
1611+ },
1612+ "compact_20260112": {
1613+ "supported": false
1614+ }
1615+ },
1616+ "effort": {
1617+ "supported": false,
1618+ "low": {
1619+ "supported": false
1620+ },
1621+ "medium": {
1622+ "supported": false
1623+ },
1624+ "high": {
1625+ "supported": false
1626+ },
1627+ "xhigh": {
1628+ "supported": false
1629+ },
1630+ "max": {
1631+ "supported": false
1632+ }
1633+ },
1634+ "image_input": {
1635+ "supported": true
1636+ },
1637+ "pdf_input": {
1638+ "supported": true
1639+ },
1640+ "server_tools": {
1641+ "supported": true,
1642+ "code_execution": {
1643+ "supported": true
1644+ },
1645+ "web_search": {
1646+ "supported": true
1647+ }
1648+ },
1649+ "structured_outputs": {
1650+ "supported": true
1651+ },
1652+ "thinking": {
1653+ "supported": true,
1654+ "types": {
1655+ "enabled": {
1656+ "supported": true
1657+ },
1658+ "adaptive": {
1659+ "supported": false
1660+ },
1661+ "disabled": {
1662+ "supported": true
1663+ },
1664+ "between_tools": {
1665+ "supported": false
1666+ }
1667+ }
1668+ }
1669+ },
1670+ "lifecycle": "deprecated",
1671+ "deprecated_at": "2026-09-30T18:30:00Z",
1672+ "retires_at": "2026-11-30T17:00:00Z"
1673+ },
1674+ {
1675+ "type": "model",
1676+ "id": "claude-sonnet-4-6",
1677+ "display_name": "Claude Sonnet 4.6",
1678+ "created_at": "2026-02-17T00:00:00Z",
1679+ "line": "sonnet",
1680+ "max_input_tokens": 1000000,
1681+ "max_tokens": 128000,
1682+ "capabilities": {
1683+ "batch": {
1684+ "supported": true
1685+ },
1686+ "citations": {
1687+ "supported": true
1688+ },
1689+ "code_execution": {
1690+ "supported": true
1691+ },
1692+ "context_management": {
1693+ "supported": true,
1694+ "clear_tool_uses_20250919": {
1695+ "supported": true
1696+ },
1697+ "clear_thinking_20251015": {
1698+ "supported": true
1699+ },
1700+ "compact_20260112": {
1701+ "supported": true
1702+ }
1703+ },
1704+ "effort": {
1705+ "supported": true,
1706+ "low": {
1707+ "supported": true
1708+ },
1709+ "medium": {
1710+ "supported": true
1711+ },
1712+ "high": {
1713+ "supported": true
1714+ },
1715+ "xhigh": {
1716+ "supported": false
1717+ },
1718+ "max": {
1719+ "supported": true
1720+ }
1721+ },
1722+ "image_input": {
1723+ "supported": true
1724+ },
1725+ "pdf_input": {
1726+ "supported": true
1727+ },
1728+ "server_tools": {
1729+ "supported": true,
1730+ "code_execution": {
1731+ "supported": true
1732+ },
1733+ "web_search": {
1734+ "supported": true
1735+ }
1736+ },
1737+ "structured_outputs": {
1738+ "supported": true
1739+ },
1740+ "thinking": {
1741+ "supported": true,
1742+ "types": {
1743+ "enabled": {
1744+ "supported": true
1745+ },
1746+ "adaptive": {
1747+ "supported": true
1748+ },
1749+ "disabled": {
1750+ "supported": true
1751+ },
1752+ "between_tools": {
1753+ "supported": false
1754+ }
1755+ }
1756+ }
1757+ },
1758+ "lifecycle": "active",
1759+ "deprecated_at": null,
1760+ "retires_at": null
1761+ },
1762+ {
1763+ "type": "model",
1764+ "id": "claude-sonnet-5",
1765+ "display_name": "Claude Sonnet 5",
1766+ "created_at": "2026-06-29T00:00:00Z",
1767+ "line": "sonnet",
1768+ "max_input_tokens": 1000000,
1769+ "max_tokens": 128000,
1770+ "capabilities": {
1771+ "batch": {
1772+ "supported": true
1773+ },
1774+ "citations": {
1775+ "supported": true
1776+ },
1777+ "code_execution": {
1778+ "supported": true
1779+ },
1780+ "context_management": {
1781+ "supported": true,
1782+ "clear_tool_uses_20250919": {
1783+ "supported": true
1784+ },
1785+ "clear_thinking_20251015": {
1786+ "supported": true
1787+ },
1788+ "compact_20260112": {
1789+ "supported": true
1790+ }
1791+ },
1792+ "effort": {
1793+ "supported": true,
1794+ "low": {
1795+ "supported": true
1796+ },
1797+ "medium": {
1798+ "supported": true
1799+ },
1800+ "high": {
1801+ "supported": true
1802+ },
1803+ "xhigh": {
1804+ "supported": true
1805+ },
1806+ "max": {
1807+ "supported": true
1808+ }
1809+ },
1810+ "image_input": {
1811+ "supported": true
1812+ },
1813+ "pdf_input": {
1814+ "supported": true
1815+ },
1816+ "server_tools": {
1817+ "supported": true,
1818+ "code_execution": {
1819+ "supported": true
1820+ },
1821+ "web_search": {
1822+ "supported": true
1823+ }
1824+ },
1825+ "structured_outputs": {
1826+ "supported": true
1827+ },
1828+ "thinking": {
1829+ "supported": true,
1830+ "types": {
1831+ "enabled": {
1832+ "supported": false
1833+ },
1834+ "adaptive": {
1835+ "supported": true
1836+ },
1837+ "disabled": {
1838+ "supported": true
1839+ },
1840+ "between_tools": {
1841+ "supported": false
1842+ }
1843+ }
1844+ }
1845+ },
1846+ "lifecycle": "active",
1847+ "deprecated_at": null,
1848+ "retires_at": null
1849+ },
1850+ {
1851+ "type": "model",
1852+ "id": "claude-sonnet-5-5",
1853+ "display_name": "Claude Sonnet 5.5",
1854+ "created_at": "2026-09-28T00:00:00Z",
1855+ "line": "sonnet",
1856+ "max_input_tokens": 1000000,
1857+ "max_tokens": 128000,
1858+ "capabilities": {
1859+ "batch": {
1860+ "supported": true
1861+ },
1862+ "citations": {
1863+ "supported": true
1864+ },
1865+ "code_execution": {
1866+ "supported": true
1867+ },
1868+ "context_management": {
1869+ "supported": true,
1870+ "clear_tool_uses_20250919": {
1871+ "supported": true
1872+ },
1873+ "clear_thinking_20251015": {
1874+ "supported": true
1875+ },
1876+ "compact_20260112": {
1877+ "supported": true
1878+ }
1879+ },
1880+ "effort": {
1881+ "supported": true,
1882+ "low": {
1883+ "supported": true
1884+ },
1885+ "medium": {
1886+ "supported": true
1887+ },
1888+ "high": {
1889+ "supported": true
1890+ },
1891+ "xhigh": {
1892+ "supported": true
1893+ },
1894+ "max": {
1895+ "supported": true
1896+ }
1897+ },
1898+ "image_input": {
1899+ "supported": true
1900+ },
1901+ "pdf_input": {
1902+ "supported": true
1903+ },
1904+ "server_tools": {
1905+ "supported": true,
1906+ "code_execution": {
1907+ "supported": true
1908+ },
1909+ "web_search": {
1910+ "supported": true
1911+ }
1912+ },
1913+ "structured_outputs": {
1914+ "supported": true
1915+ },
1916+ "thinking": {
1917+ "supported": true,
1918+ "types": {
1919+ "enabled": {
1920+ "supported": false
1921+ },
1922+ "adaptive": {
1923+ "supported": true
1924+ },
1925+ "disabled": {
1926+ "supported": false
1927+ },
1928+ "between_tools": {
1929+ "supported": true
1930+ }
1931+ }
1932+ }
1933+ },
1934+ "lifecycle": "active",
1935+ "deprecated_at": null,
1936+ "retires_at": null
1937+ }
1938+ ],
1939+ "errors": {}
1940+}
\ No newline at end of file
added benchmarks/openai-results.json +5869 −0
@@ -0,0 +1,5869 @@
1+{
2+ "generatedAt": "2026-11-01T07:18:11.428Z",
3+ "provider": "openai",
4+ "budgetUsd": 2,
5+ "stoppedByBudget": false,
6+ "models": {
7+ "babbage-002": {
8+ "provider": "openai",
9+ "kind": "legacy-completion",
10+ "tests": []
11+ },
12+ "chatgpt-image-latest": {
13+ "provider": "openai",
14+ "kind": "image",
15+ "tests": []
16+ },
17+ "davinci-002": {
18+ "provider": "openai",
19+ "kind": "legacy-completion",
20+ "tests": []
21+ },
22+ "gpt-3.5-turbo-instruct": {
23+ "provider": "openai",
24+ "kind": "legacy-completion",
25+ "tests": []
26+ },
27+ "gpt-3.5-turbo-instruct-0914": {
28+ "provider": "openai",
29+ "kind": "legacy-completion",
30+ "tests": []
31+ },
32+ "gpt-4o-mini-transcribe": {
33+ "provider": "openai",
34+ "kind": "stt",
35+ "tests": []
36+ },
37+ "gpt-4o-mini-tts": {
38+ "provider": "openai",
39+ "kind": "tts",
40+ "tests": []
41+ },
42+ "gpt-4o-transcribe": {
43+ "provider": "openai",
44+ "kind": "stt",
45+ "tests": []
46+ },
47+ "gpt-4o-transcribe-diarize": {
48+ "provider": "openai",
49+ "kind": "stt",
50+ "tests": []
51+ },
52+ "gpt-audio": {
53+ "provider": "openai",
54+ "kind": "audio-chat",
55+ "tests": []
56+ },
57+ "gpt-audio-1.5": {
58+ "provider": "openai",
59+ "kind": "audio-chat",
60+ "tests": []
61+ },
62+ "gpt-audio-mini": {
63+ "provider": "openai",
64+ "kind": "audio-chat",
65+ "tests": []
66+ },
67+ "gpt-image-1": {
68+ "provider": "openai",
69+ "kind": "image",
70+ "tests": []
71+ },
72+ "gpt-image-1-mini": {
73+ "provider": "openai",
74+ "kind": "image",
75+ "tests": []
76+ },
77+ "gpt-image-1.5": {
78+ "provider": "openai",
79+ "kind": "image",
80+ "tests": []
81+ },
82+ "gpt-image-2": {
83+ "provider": "openai",
84+ "kind": "image",
85+ "tests": []
86+ },
87+ "gpt-image-2.5-flare": {
88+ "provider": "openai",
89+ "kind": "image",
90+ "tests": []
91+ },
92+ "gpt-image-2.5-sunburst": {
93+ "provider": "openai",
94+ "kind": "image",
95+ "tests": []
96+ },
97+ "gpt-live-1": {
98+ "provider": "openai",
99+ "kind": "realtime",
100+ "tests": []
101+ },
102+ "gpt-live-transcribe": {
103+ "provider": "openai",
104+ "kind": "realtime",
105+ "tests": []
106+ },
107+ "gpt-realtime": {
108+ "provider": "openai",
109+ "kind": "realtime",
110+ "tests": []
111+ },
112+ "gpt-realtime-1.5": {
113+ "provider": "openai",
114+ "kind": "realtime",
115+ "tests": []
116+ },
117+ "gpt-realtime-2": {
118+ "provider": "openai",
119+ "kind": "realtime",
120+ "tests": []
121+ },
122+ "gpt-realtime-2.1": {
123+ "provider": "openai",
124+ "kind": "realtime",
125+ "tests": []
126+ },
127+ "gpt-realtime-2.1-mini": {
128+ "provider": "openai",
129+ "kind": "realtime",
130+ "tests": []
131+ },
132+ "gpt-realtime-mini": {
133+ "provider": "openai",
134+ "kind": "realtime",
135+ "tests": []
136+ },
137+ "gpt-realtime-translate": {
138+ "provider": "openai",
139+ "kind": "realtime",
140+ "tests": []
141+ },
142+ "gpt-realtime-whisper": {
143+ "provider": "openai",
144+ "kind": "realtime",
145+ "tests": []
146+ },
147+ "gpt-transcribe": {
148+ "provider": "openai",
149+ "kind": "stt",
150+ "tests": []
151+ },
152+ "o3-deep-research": {
153+ "provider": "openai",
154+ "kind": "deep-research",
155+ "tests": []
156+ },
157+ "o4-mini-deep-research": {
158+ "provider": "openai",
159+ "kind": "deep-research",
160+ "tests": []
161+ },
162+ "omni-moderation-latest": {
163+ "provider": "openai",
164+ "kind": "moderation",
165+ "tests": []
166+ },
167+ "sora-2": {
168+ "provider": "openai",
169+ "kind": "video",
170+ "tests": []
171+ },
172+ "sora-2-pro": {
173+ "provider": "openai",
174+ "kind": "video",
175+ "tests": []
176+ },
177+ "text-embedding-3-large": {
178+ "provider": "openai",
179+ "kind": "embedding",
180+ "tests": []
181+ },
182+ "text-embedding-3-small": {
183+ "provider": "openai",
184+ "kind": "embedding",
185+ "tests": []
186+ },
187+ "text-embedding-ada-002": {
188+ "provider": "openai",
189+ "kind": "embedding",
190+ "tests": []
191+ },
192+ "tts-1": {
193+ "provider": "openai",
194+ "kind": "tts",
195+ "tests": []
196+ },
197+ "tts-1-1106": {
198+ "provider": "openai",
199+ "kind": "tts",
200+ "tests": []
201+ },
202+ "tts-1-hd": {
203+ "provider": "openai",
204+ "kind": "tts",
205+ "tests": []
206+ },
207+ "tts-1-hd-1106": {
208+ "provider": "openai",
209+ "kind": "tts",
210+ "tests": []
211+ },
212+ "whisper-1": {
213+ "provider": "openai",
214+ "kind": "stt",
215+ "tests": []
216+ },
217+ "chat-latest": {
218+ "provider": "openai",
219+ "kind": "chat",
220+ "tests": [
221+ {
222+ "test": "basic",
223+ "ok": true,
224+ "latencyMs": 1279,
225+ "usage": {
226+ "input": 19,
227+ "output": 6,
228+ "cachedInput": 0,
229+ "reasoning": 0
230+ },
231+ "api": "responses",
232+ "raw": {
233+ "status": "completed",
234+ "incomplete": null
235+ },
236+ "sample": "Ottawa",
237+ "costUsd": 0.000275
238+ },
239+ {
240+ "test": "reasoning",
241+ "ok": true,
242+ "latencyMs": 1086,
243+ "usage": {
244+ "input": 42,
245+ "output": 39,
246+ "cachedInput": 0,
247+ "reasoning": 0
248+ },
249+ "api": "responses",
250+ "raw": {
251+ "status": "completed",
252+ "incomplete": null
253+ },
254+ "sample": "Alice has 2 sisters, so there are 3 girls in the family, including Alice. Each of her brothers has all 3 girls as sisters.\n\nANSWER: 3",
255+ "costUsd": 0.00138
256+ },
257+ {
258+ "test": "math",
259+ "ok": true,
260+ "latencyMs": 1215,
261+ "usage": {
262+ "input": 50,
263+ "output": 11,
264+ "cachedInput": 0,
265+ "reasoning": 0
266+ },
267+ "api": "responses",
268+ "raw": {
269+ "status": "completed",
270+ "incomplete": null
271+ },
272+ "sample": "a=403;b=2500",
273+ "costUsd": 0.00058
274+ },
275+ {
276+ "test": "code",
277+ "ok": true,
278+ "latencyMs": 1387,
279+ "usage": {
280+ "input": 49,
281+ "output": 97,
282+ "cachedInput": 0,
283+ "reasoning": 0
284+ },
285+ "api": "responses",
286+ "raw": {
287+ "status": "completed",
288+ "incomplete": null
289+ },
290+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1 || !Number.isInteger(n)) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
291+ "costUsd": 0.003155
292+ },
293+ {
294+ "test": "french",
295+ "ok": true,
296+ "latencyMs": 1340,
297+ "usage": {
298+ "input": 31,
299+ "output": 77,
300+ "cachedInput": 0,
301+ "reasoning": 0
302+ },
303+ "api": "responses",
304+ "raw": {
305+ "status": "completed",
306+ "incomplete": null
307+ },
308+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction ou de remplacement du bâtiment, après déduction de sa dépréciation. Elle est principalement utilisée pour évaluer des biens récents, spécialisés ou po",
309+ "costUsd": 0.002465
310+ },
311+ {
312+ "test": "english",
313+ "ok": true,
314+ "latencyMs": 1209,
315+ "usage": {
316+ "input": 20,
317+ "output": 57,
318+ "cachedInput": 0,
319+ "reasoning": 0
320+ },
321+ "api": "responses",
322+ "raw": {
323+ "status": "completed",
324+ "incomplete": null
325+ },
326+ "sample": "A hedonic pricing model is an economic method used to estimate the value of a product or asset by breaking it down into its individual characteristics or features. It is commonly used in real estate to determine how factors such as location, size, and amenities influence property prices.",
327+ "costUsd": 0.00181
328+ },
329+ {
330+ "test": "json",
331+ "ok": true,
332+ "latencyMs": 1039,
333+ "usage": {
334+ "input": 52,
335+ "output": 27,
336+ "cachedInput": 0,
337+ "reasoning": 0
338+ },
339+ "api": "responses",
340+ "raw": {
341+ "status": "completed",
342+ "incomplete": null
343+ },
344+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
345+ "costUsd": 0.00107
346+ },
347+ {
348+ "test": "tools",
349+ "ok": true,
350+ "latencyMs": 1079,
351+ "usage": {
352+ "input": 69,
353+ "output": 22,
354+ "cachedInput": 0,
355+ "reasoning": 0
356+ },
357+ "api": "responses",
358+ "raw": {
359+ "status": "completed",
360+ "incomplete": null
361+ },
362+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
363+ "costUsd": 0.001005
364+ },
365+ {
366+ "test": "vision",
367+ "ok": true,
368+ "latencyMs": 973,
369+ "usage": {
370+ "input": 194,
371+ "output": 12,
372+ "cachedInput": 0,
373+ "reasoning": 0
374+ },
375+ "api": "responses",
376+ "raw": {
377+ "status": "completed",
378+ "incomplete": null
379+ },
380+ "sample": "circles=3; other=square",
381+ "costUsd": 0.00133
382+ },
383+ {
384+ "test": "longctx",
385+ "ok": true,
386+ "latencyMs": 995,
387+ "usage": {
388+ "input": 9134,
389+ "output": 9,
390+ "cachedInput": 0,
391+ "reasoning": 0
392+ },
393+ "api": "responses",
394+ "raw": {
395+ "status": "completed",
396+ "incomplete": null
397+ },
398+ "sample": "7431-ALPHA",
399+ "costUsd": 0.04594
400+ },
401+ {
402+ "test": "streaming",
403+ "ok": true,
404+ "latencyMs": 980,
405+ "ttftMs": 547,
406+ "usage": {
407+ "input": 15,
408+ "output": 23,
409+ "cachedInput": 0,
410+ "reasoning": 0
411+ },
412+ "api": "responses",
413+ "sample": "Snow blankets Québec, \nSt. Lawrence sleeps beneath ice, \nWarm lights bloom at dusk.",
414+ "costUsd": 0.000765
415+ }
416+ ],
417+ "api": "responses"
418+ },
419+ "gpt-3.5-turbo": {
420+ "provider": "openai",
421+ "kind": "chat",
422+ "tests": [
423+ {
424+ "test": "basic",
425+ "ok": false,
426+ "latencyMs": 288,
427+ "error": "404 404 The model `gpt-3.5-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
428+ }
429+ ]
430+ },
431+ "gpt-4": {
432+ "provider": "openai",
433+ "kind": "chat",
434+ "tests": [
435+ {
436+ "test": "basic",
437+ "ok": false,
438+ "latencyMs": 277,
439+ "error": "404 404 The model `gpt-4` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
440+ }
441+ ]
442+ },
443+ "gpt-4-turbo": {
444+ "provider": "openai",
445+ "kind": "chat",
446+ "tests": [
447+ {
448+ "test": "basic",
449+ "ok": false,
450+ "latencyMs": 312,
451+ "error": "404 404 The model `gpt-4-turbo` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
452+ }
453+ ]
454+ },
455+ "gpt-4.1": {
456+ "provider": "openai",
457+ "kind": "chat",
458+ "tests": [
459+ {
460+ "test": "basic",
461+ "ok": true,
462+ "latencyMs": 608,
463+ "usage": {
464+ "input": 20,
465+ "output": 3,
466+ "cachedInput": 0,
467+ "reasoning": 0
468+ },
469+ "api": "responses",
470+ "raw": {
471+ "status": "completed",
472+ "incomplete": null
473+ },
474+ "sample": "Ottawa",
475+ "costUsd": 0.000064
476+ },
477+ {
478+ "test": "reasoning",
479+ "ok": true,
480+ "latencyMs": 983,
481+ "usage": {
482+ "input": 43,
483+ "output": 104,
484+ "cachedInput": 0,
485+ "reasoning": 0
486+ },
487+ "api": "responses",
488+ "raw": {
489+ "status": "completed",
490+ "incomplete": null
491+ },
492+ "sample": "Let's break down the information:\n\n- Alice has **3 brothers** and **2 sisters**.\n- Alice herself is a girl, so she is also a sister.\n\nSo, in total, there are:\n- **Sisters:** Alice + 2 sisters = **3 sisters**\n- **Brothers:** 3 brothers\n\nThe question: \"How many sisters does each of Alice's brothers ha",
493+ "costUsd": 0.000918
494+ },
495+ {
496+ "test": "math",
497+ "ok": false,
498+ "latencyMs": 546,
499+ "usage": {
500+ "input": 51,
501+ "output": 8,
502+ "cachedInput": 0,
503+ "reasoning": 0
504+ },
505+ "api": "responses",
506+ "raw": {
507+ "status": "completed",
508+ "incomplete": null
509+ },
510+ "sample": "a=411;b=2500",
511+ "costUsd": 0.000166
512+ },
513+ {
514+ "test": "code",
515+ "ok": true,
516+ "latencyMs": 886,
517+ "usage": {
518+ "input": 50,
519+ "output": 88,
520+ "cachedInput": 0,
521+ "reasoning": 0
522+ },
523+ "api": "responses",
524+ "raw": {
525+ "status": "completed",
526+ "incomplete": null
527+ },
528+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
529+ "costUsd": 0.000804
530+ },
531+ {
532+ "test": "french",
533+ "ok": true,
534+ "latencyMs": 1039,
535+ "usage": {
536+ "input": 32,
537+ "output": 70,
538+ "cachedInput": 0,
539+ "reasoning": 0
540+ },
541+ "api": "responses",
542+ "raw": {
543+ "status": "completed",
544+ "incomplete": null
545+ },
546+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain à celle du coût de reconstruction ou de remplacement du bâtiment, après déduction de la dépréciation. Elle est particulièrement utilisée pour les biens atypiques ou lorsque le mar",
547+ "costUsd": 0.000624
548+ },
549+ {
550+ "test": "english",
551+ "ok": true,
552+ "latencyMs": 655,
553+ "usage": {
554+ "input": 21,
555+ "output": 54,
556+ "cachedInput": 0,
557+ "reasoning": 0
558+ },
559+ "api": "responses",
560+ "raw": {
561+ "status": "completed",
562+ "incomplete": null
563+ },
564+ "sample": "A hedonic pricing model is an economic valuation method that estimates the market value of a good by analyzing how its individual characteristics or features influence its price. It is commonly used in real estate, where factors such as location, size, and amenities help determine property prices.",
565+ "costUsd": 0.000474
566+ },
567+ {
568+ "test": "json",
569+ "ok": true,
570+ "latencyMs": 704,
571+ "usage": {
572+ "input": 53,
573+ "output": 37,
574+ "cachedInput": 0,
575+ "reasoning": 0
576+ },
577+ "api": "responses",
578+ "raw": {
579+ "status": "completed",
580+ "incomplete": null
581+ },
582+ "sample": "{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 297000\n}",
583+ "costUsd": 0.000402
584+ },
585+ {
586+ "test": "tools",
587+ "ok": true,
588+ "latencyMs": 487,
589+ "usage": {
590+ "input": 64,
591+ "output": 19,
592+ "cachedInput": 0,
593+ "reasoning": 0
594+ },
595+ "api": "responses",
596+ "raw": {
597+ "status": "completed",
598+ "incomplete": null
599+ },
600+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
601+ "costUsd": 0.00028
602+ },
603+ {
604+ "test": "vision",
605+ "ok": true,
606+ "latencyMs": 598,
607+ "usage": {
608+ "input": 123,
609+ "output": 9,
610+ "cachedInput": 0,
611+ "reasoning": 0
612+ },
613+ "api": "responses",
614+ "raw": {
615+ "status": "completed",
616+ "incomplete": null
617+ },
618+ "sample": "circles=3; other=square",
619+ "costUsd": 0.000318
620+ },
621+ {
622+ "test": "longctx",
623+ "ok": true,
624+ "latencyMs": 1203,
625+ "usage": {
626+ "input": 9135,
627+ "output": 6,
628+ "cachedInput": 0,
629+ "reasoning": 0
630+ },
631+ "api": "responses",
632+ "raw": {
633+ "status": "completed",
634+ "incomplete": null
635+ },
636+ "sample": "7431-ALPHA",
637+ "costUsd": 0.018318
638+ },
639+ {
640+ "test": "streaming",
641+ "ok": true,
642+ "latencyMs": 736,
643+ "ttftMs": 413,
644+ "usage": {
645+ "input": 16,
646+ "output": 21,
647+ "cachedInput": 0,
648+ "reasoning": 0
649+ },
650+ "api": "responses",
651+ "sample": "Snow cloaks the old town, \nRiver breathes icy silence— \nStars shimmer on ice.",
652+ "costUsd": 0.0002
653+ }
654+ ],
655+ "api": "responses"
656+ },
657+ "gpt-4.1-mini": {
658+ "provider": "openai",
659+ "kind": "chat",
660+ "tests": [
661+ {
662+ "test": "basic",
663+ "ok": true,
664+ "latencyMs": 604,
665+ "usage": {
666+ "input": 20,
667+ "output": 3,
668+ "cachedInput": 0,
669+ "reasoning": 0
670+ },
671+ "api": "responses",
672+ "raw": {
673+ "status": "completed",
674+ "incomplete": null
675+ },
676+ "sample": "Ottawa",
677+ "costUsd": 0.000012800000000000001
678+ },
679+ {
680+ "test": "reasoning",
681+ "ok": true,
682+ "latencyMs": 1021,
683+ "usage": {
684+ "input": 43,
685+ "output": 88,
686+ "cachedInput": 0,
687+ "reasoning": 0
688+ },
689+ "api": "responses",
690+ "raw": {
691+ "status": "completed",
692+ "incomplete": null
693+ },
694+ "sample": "Alice has 2 sisters in total, including herself. Since Alice's brothers are her siblings, they share the same sisters. The brothers see Alice and the 2 sisters as their sisters.\n\nAlice is not a sister to herself, so from the brothers' perspective, the sisters are Alice and the 2 other sisters, makin",
695+ "costUsd": 0.000158
696+ },
697+ {
698+ "test": "math",
699+ "ok": false,
700+ "latencyMs": 582,
701+ "usage": {
702+ "input": 51,
703+ "output": 8,
704+ "cachedInput": 0,
705+ "reasoning": 0
706+ },
707+ "api": "responses",
708+ "raw": {
709+ "status": "completed",
710+ "incomplete": null
711+ },
712+ "sample": "a=417;b=2500",
713+ "costUsd": 0.0000332
714+ },
715+ {
716+ "test": "code",
717+ "ok": true,
718+ "latencyMs": 1086,
719+ "usage": {
720+ "input": 50,
721+ "output": 108,
722+ "cachedInput": 0,
723+ "reasoning": 0
724+ },
725+ "api": "responses",
726+ "raw": {
727+ "status": "completed",
728+ "incomplete": null
729+ },
730+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
731+ "costUsd": 0.00019280000000000002
732+ },
733+ {
734+ "test": "french",
735+ "ok": true,
736+ "latencyMs": 897,
737+ "usage": {
738+ "input": 32,
739+ "output": 69,
740+ "cachedInput": 0,
741+ "reasoning": 0
742+ },
743+ "api": "responses",
744+ "raw": {
745+ "status": "completed",
746+ "incomplete": null
747+ },
748+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en calculant la somme du coût de reconstruction à neuf, diminuée de la dépréciation, ajoutée à la valeur du terrain. Elle est particulièrement utilisée pour les biens ne générant pas de revenus ou sans comparaison di",
749+ "costUsd": 0.0001232
750+ },
751+ {
752+ "test": "english",
753+ "ok": true,
754+ "latencyMs": 1009,
755+ "usage": {
756+ "input": 21,
757+ "output": 57,
758+ "cachedInput": 0,
759+ "reasoning": 0
760+ },
761+ "api": "responses",
762+ "raw": {
763+ "status": "completed",
764+ "incomplete": null
765+ },
766+ "sample": "A hedonic pricing model is an economic method used to estimate the value of a good or property by breaking down its price into the individual contributions of its characteristics or features. It is commonly applied in real estate to assess how factors like location, size, and amenities affect proper",
767+ "costUsd": 0.00009960000000000001
768+ },
769+ {
770+ "test": "json",
771+ "ok": true,
772+ "latencyMs": 705,
773+ "usage": {
774+ "input": 53,
775+ "output": 37,
776+ "cachedInput": 0,
777+ "reasoning": 0
778+ },
779+ "api": "responses",
780+ "raw": {
781+ "status": "completed",
782+ "incomplete": null
783+ },
784+ "sample": "{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 291041\n}",
785+ "costUsd": 0.0000804
786+ },
787+ {
788+ "test": "tools",
789+ "ok": true,
790+ "latencyMs": 834,
791+ "usage": {
792+ "input": 64,
793+ "output": 19,
794+ "cachedInput": 0,
795+ "reasoning": 0
796+ },
797+ "api": "responses",
798+ "raw": {
799+ "status": "completed",
800+ "incomplete": null
801+ },
802+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
803+ "costUsd": 0.000056
804+ },
805+ {
806+ "test": "vision",
807+ "ok": true,
808+ "latencyMs": 596,
809+ "usage": {
810+ "input": 250,
811+ "output": 9,
812+ "cachedInput": 0,
813+ "reasoning": 0
814+ },
815+ "api": "responses",
816+ "raw": {
817+ "status": "completed",
818+ "incomplete": null
819+ },
820+ "sample": "circles=3; other=square",
821+ "costUsd": 0.0001144
822+ },
823+ {
824+ "test": "longctx",
825+ "ok": true,
826+ "latencyMs": 919,
827+ "usage": {
828+ "input": 9135,
829+ "output": 6,
830+ "cachedInput": 0,
831+ "reasoning": 0
832+ },
833+ "api": "responses",
834+ "raw": {
835+ "status": "completed",
836+ "incomplete": null
837+ },
838+ "sample": "7431-ALPHA",
839+ "costUsd": 0.0036636
840+ },
841+ {
842+ "test": "streaming",
843+ "ok": true,
844+ "latencyMs": 552,
845+ "ttftMs": 343,
846+ "usage": {
847+ "input": 16,
848+ "output": 23,
849+ "cachedInput": 0,
850+ "reasoning": 0
851+ },
852+ "api": "responses",
853+ "sample": "Snow drapes quiet streets, \nMaple scent in frosty air, \nLights dance on still lakes.",
854+ "costUsd": 0.0000432
855+ }
856+ ],
857+ "api": "responses"
858+ },
859+ "gpt-4.1-nano": {
860+ "provider": "openai",
861+ "kind": "chat",
862+ "tests": [
863+ {
864+ "test": "basic",
865+ "ok": false,
866+ "latencyMs": 424,
867+ "error": "404 404 The model `gpt-4.1-nano` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
868+ }
869+ ]
870+ },
871+ "gpt-4o": {
872+ "provider": "openai",
873+ "kind": "chat",
874+ "tests": [
875+ {
876+ "test": "basic",
877+ "ok": true,
878+ "latencyMs": 704,
879+ "usage": {
880+ "input": 20,
881+ "output": 3,
882+ "cachedInput": 0,
883+ "reasoning": 0
884+ },
885+ "api": "responses",
886+ "raw": {
887+ "status": "completed",
888+ "incomplete": null
889+ },
890+ "sample": "Ottawa",
891+ "costUsd": 0.00008
892+ },
893+ {
894+ "test": "reasoning",
895+ "ok": false,
896+ "latencyMs": 1507,
897+ "usage": {
898+ "input": 43,
899+ "output": 32,
900+ "cachedInput": 0,
901+ "reasoning": 0
902+ },
903+ "api": "responses",
904+ "raw": {
905+ "status": "completed",
906+ "incomplete": null
907+ },
908+ "sample": "Alice has 2 sisters (including herself). Each of Alice's brothers has the same sisters: Alice and her 2 sisters. \n\nANSWER: 2",
909+ "costUsd": 0.0004275
910+ },
911+ {
912+ "test": "math",
913+ "ok": false,
914+ "latencyMs": 644,
915+ "usage": {
916+ "input": 51,
917+ "output": 8,
918+ "cachedInput": 0,
919+ "reasoning": 0
920+ },
921+ "api": "responses",
922+ "raw": {
923+ "status": "completed",
924+ "incomplete": null
925+ },
926+ "sample": "a=427;b=2500",
927+ "costUsd": 0.0002075
928+ },
929+ {
930+ "test": "code",
931+ "ok": true,
932+ "latencyMs": 1111,
933+ "usage": {
934+ "input": 50,
935+ "output": 108,
936+ "cachedInput": 0,
937+ "reasoning": 0
938+ },
939+ "api": "responses",
940+ "raw": {
941+ "status": "completed",
942+ "incomplete": null
943+ },
944+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
945+ "costUsd": 0.001205
946+ },
947+ {
948+ "test": "french",
949+ "ok": true,
950+ "latencyMs": 1049,
951+ "usage": {
952+ "input": 32,
953+ "output": 75,
954+ "cachedInput": 0,
955+ "reasoning": 0
956+ },
957+ "api": "responses",
958+ "raw": {
959+ "status": "completed",
960+ "incomplete": null
961+ },
962+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en calculant le coût de remplacement ou de reproduction de la construction, moins la dépréciation accumulée, puis en ajoutant la valeur du terrain. Cette approche est souvent utilisée lorsqu'il n'existe pas de compar",
963+ "costUsd": 0.00083
964+ },
965+ {
966+ "test": "english",
967+ "ok": true,
968+ "latencyMs": 5002,
969+ "usage": {
970+ "input": 21,
971+ "output": 56,
972+ "cachedInput": 0,
973+ "reasoning": 0
974+ },
975+ "api": "responses",
976+ "raw": {
977+ "status": "completed",
978+ "incomplete": null
979+ },
980+ "sample": "A hedonic pricing model estimates the value of a good or service by breaking it down into its component attributes and analyzing how each characteristic contributes to the overall price. This approach is often used in real estate to assess how features like location, size, and amenities impact prope",
981+ "costUsd": 0.0006125
982+ },
983+ {
984+ "test": "json",
985+ "ok": true,
986+ "latencyMs": 882,
987+ "usage": {
988+ "input": 53,
989+ "output": 37,
990+ "cachedInput": 0,
991+ "reasoning": 0
992+ },
993+ "api": "responses",
994+ "raw": {
995+ "status": "completed",
996+ "incomplete": null
997+ },
998+ "sample": "{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 290000\n}",
999+ "costUsd": 0.0005025
1000+ },
1001+ {
1002+ "test": "tools",
1003+ "ok": true,
1004+ "latencyMs": 851,
1005+ "usage": {
1006+ "input": 64,
1007+ "output": 19,
1008+ "cachedInput": 0,
1009+ "reasoning": 0
1010+ },
1011+ "api": "responses",
1012+ "raw": {
1013+ "status": "completed",
1014+ "incomplete": null
1015+ },
1016+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
1017+ "costUsd": 0.00035
1018+ },
1019+ {
1020+ "test": "vision",
1021+ "ok": true,
1022+ "latencyMs": 853,
1023+ "usage": {
1024+ "input": 123,
1025+ "output": 9,
1026+ "cachedInput": 0,
1027+ "reasoning": 0
1028+ },
1029+ "api": "responses",
1030+ "raw": {
1031+ "status": "completed",
1032+ "incomplete": null
1033+ },
1034+ "sample": "circles=3; other=square",
1035+ "costUsd": 0.0003975
1036+ },
1037+ {
1038+ "test": "longctx",
1039+ "ok": true,
1040+ "latencyMs": 1088,
1041+ "usage": {
1042+ "input": 9135,
1043+ "output": 6,
1044+ "cachedInput": 0,
1045+ "reasoning": 0
1046+ },
1047+ "api": "responses",
1048+ "raw": {
1049+ "status": "completed",
1050+ "incomplete": null
1051+ },
1052+ "sample": "7431-ALPHA",
1053+ "costUsd": 0.0228975
1054+ },
1055+ {
1056+ "test": "streaming",
1057+ "ok": true,
1058+ "latencyMs": 887,
1059+ "ttftMs": 457,
1060+ "usage": {
1061+ "input": 16,
1062+ "output": 22,
1063+ "cachedInput": 0,
1064+ "reasoning": 0
1065+ },
1066+ "api": "responses",
1067+ "sample": "Silent snow descends, \nFrosty breath whispers of peace— \nQuébec dreams in white.",
1068+ "costUsd": 0.00026
1069+ }
1070+ ],
1071+ "api": "responses"
1072+ },
1073+ "gpt-4o-mini": {
1074+ "provider": "openai",
1075+ "kind": "chat",
1076+ "tests": [
1077+ {
1078+ "test": "basic",
1079+ "ok": true,
1080+ "latencyMs": 510,
1081+ "usage": {
1082+ "input": 20,
1083+ "output": 4,
1084+ "cachedInput": 0,
1085+ "reasoning": 0
1086+ },
1087+ "api": "responses",
1088+ "raw": {
1089+ "status": "completed",
1090+ "incomplete": null
1091+ },
1092+ "sample": "Ottawa.",
1093+ "costUsd": 0.0000054
1094+ },
1095+ {
1096+ "test": "reasoning",
1097+ "ok": false,
1098+ "latencyMs": 1209,
1099+ "usage": {
1100+ "input": 43,
1101+ "output": 61,
1102+ "cachedInput": 0,
1103+ "reasoning": 0
1104+ },
1105+ "api": "responses",
1106+ "raw": {
1107+ "status": "completed",
1108+ "incomplete": null
1109+ },
1110+ "sample": "Alice has 2 sisters and 3 brothers. Each of Alice's brothers will have the same siblings as Alice, meaning they will also have the 2 sisters that Alice has. Therefore, each of Alice's brothers has 2 sisters. \n\nSo, the answer is: \n\nANSWER: 2",
1111+ "costUsd": 0.00004305
1112+ },
1113+ {
1114+ "test": "math",
1115+ "ok": false,
1116+ "latencyMs": 589,
1117+ "usage": {
1118+ "input": 51,
1119+ "output": 9,
1120+ "cachedInput": 0,
1121+ "reasoning": 0
1122+ },
1123+ "api": "responses",
1124+ "raw": {
1125+ "status": "completed",
1126+ "incomplete": null
1127+ },
1128+ "sample": "a=397; b=2500",
1129+ "costUsd": 0.000013049999999999999
1130+ },
1131+ {
1132+ "test": "code",
1133+ "ok": true,
1134+ "latencyMs": 893,
1135+ "usage": {
1136+ "input": 50,
1137+ "output": 60,
1138+ "cachedInput": 0,
1139+ "reasoning": 0
1140+ },
1141+ "api": "responses",
1142+ "raw": {
1143+ "status": "completed",
1144+ "incomplete": null
1145+ },
1146+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n for (let i = 2; i <= Math.sqrt(n); i++) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
1147+ "costUsd": 0.0000435
1148+ },
1149+ {
1150+ "test": "french",
1151+ "ok": true,
1152+ "latencyMs": 997,
1153+ "usage": {
1154+ "input": 32,
1155+ "output": 68,
1156+ "cachedInput": 0,
1157+ "reasoning": 0
1158+ },
1159+ "api": "responses",
1160+ "raw": {
1161+ "status": "completed",
1162+ "incomplete": null
1163+ },
1164+ "sample": "La méthode du coût en évaluation immobilière consiste à déterminer la valeur d'un bien en additionnant le coût des matériaux et de la main-d'œuvre nécessaires à sa construction, en tenant compte de l'amortissement. Cette approche est souvent utilisée pour les propriétés nouvelles ou spécialisées, où",
1165+ "costUsd": 0.0000456
1166+ },
1167+ {
1168+ "test": "english",
1169+ "ok": true,
1170+ "latencyMs": 1106,
1171+ "usage": {
1172+ "input": 21,
1173+ "output": 61,
1174+ "cachedInput": 0,
1175+ "reasoning": 0
1176+ },
1177+ "api": "responses",
1178+ "raw": {
1179+ "status": "completed",
1180+ "incomplete": null
1181+ },
1182+ "sample": "A hedonic pricing model is an analytical approach used to estimate the value of a good or service by breaking it down into its individual characteristics and attributes. This model often applies to real estate and consumer products, where prices reflect the perceived utility derived from various fea",
1183+ "costUsd": 0.00003975
1184+ },
1185+ {
1186+ "test": "json",
1187+ "ok": true,
1188+ "latencyMs": 876,
1189+ "usage": {
1190+ "input": 53,
1191+ "output": 37,
1192+ "cachedInput": 0,
1193+ "reasoning": 0
1194+ },
1195+ "api": "responses",
1196+ "raw": {
1197+ "status": "completed",
1198+ "incomplete": null
1199+ },
1200+ "sample": "{\n \"city\": \"Gatineau\",\n \"country\": \"Canada\",\n \"province\": \"Quebec\",\n \"population_estimate\": 300000\n}",
1201+ "costUsd": 0.000030149999999999998
1202+ },
1203+ {
1204+ "test": "tools",
1205+ "ok": true,
1206+ "latencyMs": 634,
1207+ "usage": {
1208+ "input": 64,
1209+ "output": 19,
1210+ "cachedInput": 0,
1211+ "reasoning": 0
1212+ },
1213+ "api": "responses",
1214+ "raw": {
1215+ "status": "completed",
1216+ "incomplete": null
1217+ },
1218+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
1219+ "costUsd": 0.000021
1220+ },
1221+ {
1222+ "test": "vision",
1223+ "ok": true,
1224+ "latencyMs": 718,
1225+ "usage": {
1226+ "input": 2871,
1227+ "output": 9,
1228+ "cachedInput": 0,
1229+ "reasoning": 0
1230+ },
1231+ "api": "responses",
1232+ "raw": {
1233+ "status": "completed",
1234+ "incomplete": null
1235+ },
1236+ "sample": "circles=3; other=square",
1237+ "costUsd": 0.00043604999999999995
1238+ },
1239+ {
1240+ "test": "longctx",
1241+ "ok": true,
1242+ "latencyMs": 750,
1243+ "usage": {
1244+ "input": 9135,
1245+ "output": 6,
1246+ "cachedInput": 0,
1247+ "reasoning": 0
1248+ },
1249+ "api": "responses",
1250+ "raw": {
1251+ "status": "completed",
1252+ "incomplete": null
1253+ },
1254+ "sample": "7431-ALPHA",
1255+ "costUsd": 0.0013738499999999998
1256+ },
1257+ {
1258+ "test": "streaming",
1259+ "ok": true,
1260+ "latencyMs": 684,
1261+ "ttftMs": 482,
1262+ "usage": {
1263+ "input": 16,
1264+ "output": 21,
1265+ "cachedInput": 0,
1266+ "reasoning": 0
1267+ },
1268+ "api": "responses",
1269+ "sample": "Snow whispers softly, \nPines cloaked in crystal beauty— \nQuebec's cold embrace.",
1270+ "costUsd": 0.000015
1271+ }
1272+ ],
1273+ "api": "responses"
1274+ },
1275+ "gpt-4o-mini-search-preview": {
1276+ "provider": "openai",
1277+ "kind": "search",
1278+ "tests": [
1279+ {
1280+ "test": "basic",
1281+ "ok": false,
1282+ "latencyMs": 277,
1283+ "error": "404 404 The model `gpt-4o-mini-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
1284+ }
1285+ ]
1286+ },
1287+ "gpt-4o-search-preview": {
1288+ "provider": "openai",
1289+ "kind": "search",
1290+ "tests": [
1291+ {
1292+ "test": "basic",
1293+ "ok": false,
1294+ "latencyMs": 275,
1295+ "error": "404 404 The model `gpt-4o-search-preview` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
1296+ }
1297+ ]
1298+ },
1299+ "gpt-5": {
1300+ "provider": "openai",
1301+ "kind": "chat",
1302+ "tests": [
1303+ {
1304+ "test": "reasoning",
1305+ "ok": true,
1306+ "latencyMs": 5702,
1307+ "usage": {
1308+ "input": 42,
1309+ "output": 399,
1310+ "cachedInput": 0,
1311+ "reasoning": 320
1312+ },
1313+ "api": "responses",
1314+ "raw": {
1315+ "status": "completed",
1316+ "incomplete": null
1317+ },
1318+ "sample": "Alice is one of the girls. If she has 2 sisters, then there are 3 girls total (Alice + 2). Each brother’s sisters are all three girls. \nANSWER: 3",
1319+ "costUsd": 0.0040425
1320+ },
1321+ {
1322+ "test": "math",
1323+ "ok": true,
1324+ "latencyMs": 2439,
1325+ "usage": {
1326+ "input": 50,
1327+ "output": 230,
1328+ "cachedInput": 0,
1329+ "reasoning": 192
1330+ },
1331+ "api": "responses",
1332+ "raw": {
1333+ "status": "completed",
1334+ "incomplete": null
1335+ },
1336+ "sample": "a=403;b=2500",
1337+ "costUsd": 0.0023625
1338+ },
1339+ {
1340+ "test": "code",
1341+ "ok": true,
1342+ "latencyMs": 7366,
1343+ "usage": {
1344+ "input": 49,
1345+ "output": 639,
1346+ "cachedInput": 0,
1347+ "reasoning": 512
1348+ },
1349+ "api": "responses",
1350+ "raw": {
1351+ "status": "completed",
1352+ "incomplete": null
1353+ },
1354+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
1355+ "costUsd": 0.00645125
1356+ },
1357+ {
1358+ "test": "french",
1359+ "ok": true,
1360+ "latencyMs": 2603,
1361+ "usage": {
1362+ "input": 31,
1363+ "output": 312,
1364+ "cachedInput": 0,
1365+ "reasoning": 192
1366+ },
1367+ "api": "responses",
1368+ "raw": {
1369+ "status": "completed",
1370+ "incomplete": null
1371+ },
1372+ "sample": "La méthode du coût évalue un bien en additionnant la valeur du terrain au coût de remplacement ou de reproduction de l’immeuble, puis en retranchant la dépréciation (physique, fonctionnelle et externe). Elle est surtout utilisée pour les biens spéciaux ou neufs et lorsque les données de marché sont ",
1373+ "costUsd": 0.00315875
1374+ },
1375+ {
1376+ "test": "english",
1377+ "ok": true,
1378+ "latencyMs": 4497,
1379+ "usage": {
1380+ "input": 20,
1381+ "output": 311,
1382+ "cachedInput": 0,
1383+ "reasoning": 192
1384+ },
1385+ "api": "responses",
1386+ "raw": {
1387+ "status": "completed",
1388+ "incomplete": null
1389+ },
1390+ "sample": "A hedonic pricing model decomposes an observed market price into the implicit values of its characteristics, typically using regression analysis to estimate each attribute's marginal contribution. It is widely used in housing and other differentiated-good markets to infer willingness to pay for feat",
1391+ "costUsd": 0.003135
1392+ },
1393+ {
1394+ "test": "json",
1395+ "ok": true,
1396+ "latencyMs": 3814,
1397+ "usage": {
1398+ "input": 52,
1399+ "output": 484,
1400+ "cachedInput": 0,
1401+ "reasoning": 448
1402+ },
1403+ "api": "responses",
1404+ "raw": {
1405+ "status": "completed",
1406+ "incomplete": null
1407+ },
1408+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
1409+ "costUsd": 0.004905
1410+ },
1411+ {
1412+ "test": "tools",
1413+ "ok": true,
1414+ "latencyMs": 1448,
1415+ "usage": {
1416+ "input": 69,
1417+ "output": 152,
1418+ "cachedInput": 0,
1419+ "reasoning": 128
1420+ },
1421+ "api": "responses",
1422+ "raw": {
1423+ "status": "completed",
1424+ "incomplete": null
1425+ },
1426+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
1427+ "costUsd": 0.00160625
1428+ },
1429+ {
1430+ "test": "vision",
1431+ "ok": true,
1432+ "latencyMs": 1798,
1433+ "usage": {
1434+ "input": 107,
1435+ "output": 196,
1436+ "cachedInput": 0,
1437+ "reasoning": 128
1438+ },
1439+ "api": "responses",
1440+ "raw": {
1441+ "status": "completed",
1442+ "incomplete": null
1443+ },
1444+ "sample": "circles=3; other=square",
1445+ "costUsd": 0.00209375
1446+ },
1447+ {
1448+ "test": "longctx",
1449+ "ok": true,
1450+ "latencyMs": 3685,
1451+ "usage": {
1452+ "input": 9134,
1453+ "output": 323,
1454+ "cachedInput": 0,
1455+ "reasoning": 256
1456+ },
1457+ "api": "responses",
1458+ "raw": {
1459+ "status": "completed",
1460+ "incomplete": null
1461+ },
1462+ "sample": "7431-ALPHA",
1463+ "costUsd": 0.0146475
1464+ },
1465+ {
1466+ "test": "basic",
1467+ "ok": true,
1468+ "latencyMs": 1813,
1469+ "usage": {
1470+ "input": 19,
1471+ "output": 101,
1472+ "cachedInput": 0,
1473+ "reasoning": 64
1474+ },
1475+ "api": "responses",
1476+ "raw": {
1477+ "status": "completed",
1478+ "incomplete": null
1479+ },
1480+ "sample": "Ottawa",
1481+ "costUsd": 0.00103375
1482+ },
1483+ {
1484+ "test": "streaming",
1485+ "ok": true,
1486+ "latencyMs": 8238,
1487+ "ttftMs": 7922,
1488+ "usage": {
1489+ "input": 15,
1490+ "output": 950,
1491+ "cachedInput": 0,
1492+ "reasoning": 896
1493+ },
1494+ "api": "responses",
1495+ "sample": "Saint Lawrence locked fast\nice moans under old bridges—\nBonhomme’s red sash glows",
1496+ "costUsd": 0.00951875
1497+ }
1498+ ],
1499+ "api": "responses"
1500+ },
1501+ "gpt-5-chat-latest": {
1502+ "provider": "openai",
1503+ "kind": "chat",
1504+ "tests": [
1505+ {
1506+ "test": "basic",
1507+ "ok": false,
1508+ "latencyMs": 279,
1509+ "error": "404 404 The model `gpt-5-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
1510+ }
1511+ ]
1512+ },
1513+ "gpt-5-codex": {
1514+ "provider": "openai",
1515+ "kind": "chat",
1516+ "tests": [
1517+ {
1518+ "test": "basic",
1519+ "ok": false,
1520+ "latencyMs": 287,
1521+ "error": "404 404 The model `gpt-5-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
1522+ }
1523+ ]
1524+ },
1525+ "gpt-5-mini": {
1526+ "provider": "openai",
1527+ "kind": "chat",
1528+ "tests": [
1529+ {
1530+ "test": "reasoning",
1531+ "ok": true,
1532+ "latencyMs": 3711,
1533+ "usage": {
1534+ "input": 42,
1535+ "output": 327,
1536+ "cachedInput": 0,
1537+ "reasoning": 256
1538+ },
1539+ "api": "responses",
1540+ "raw": {
1541+ "status": "completed",
1542+ "incomplete": null
1543+ },
1544+ "sample": "Alice is one of the sisters, and she has 2 other sisters, so there are 3 sisters in total. Each of her brothers has those 3 sisters. ANSWER: 3",
1545+ "costUsd": 0.0006645
1546+ },
1547+ {
1548+ "test": "math",
1549+ "ok": true,
1550+ "latencyMs": 3159,
1551+ "usage": {
1552+ "input": 50,
1553+ "output": 298,
1554+ "cachedInput": 0,
1555+ "reasoning": 256
1556+ },
1557+ "api": "responses",
1558+ "raw": {
1559+ "status": "completed",
1560+ "incomplete": null
1561+ },
1562+ "sample": "a=403;b=2500",
1563+ "costUsd": 0.0006085
1564+ },
1565+ {
1566+ "test": "code",
1567+ "ok": true,
1568+ "latencyMs": 4263,
1569+ "usage": {
1570+ "input": 49,
1571+ "output": 455,
1572+ "cachedInput": 0,
1573+ "reasoning": 320
1574+ },
1575+ "api": "responses",
1576+ "raw": {
1577+ "status": "completed",
1578+ "incomplete": null
1579+ },
1580+ "sample": "```js\nfunction isPrime(n) {\n if (typeof n !== 'number' || !Number.isInteger(n) || n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return ",
1581+ "costUsd": 0.00092225
1582+ },
1583+ {
1584+ "test": "french",
1585+ "ok": true,
1586+ "latencyMs": 3761,
1587+ "usage": {
1588+ "input": 31,
1589+ "output": 337,
1590+ "cachedInput": 0,
1591+ "reasoning": 192
1592+ },
1593+ "api": "responses",
1594+ "raw": {
1595+ "status": "completed",
1596+ "incomplete": null
1597+ },
1598+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d'un bien en additionnant la valeur du terrain et le coût de reproduction ou de remplacement des constructions, puis en déduisant l'obsolescence et la dépréciation accumulées. Elle est particulièrement utile pour les immeubles",
1599+ "costUsd": 0.00068175
1600+ },
1601+ {
1602+ "test": "english",
1603+ "ok": true,
1604+ "latencyMs": 2936,
1605+ "usage": {
1606+ "input": 20,
1607+ "output": 305,
1608+ "cachedInput": 0,
1609+ "reasoning": 192
1610+ },
1611+ "api": "responses",
1612+ "raw": {
1613+ "status": "completed",
1614+ "incomplete": null
1615+ },
1616+ "sample": "A hedonic pricing model decomposes the price of a differentiated good into the implicit prices of its measurable attributes by regressing observed transaction prices on those characteristics. It is commonly used in housing, labor, and product markets to estimate how much each feature (e.g., square f",
1617+ "costUsd": 0.000615
1618+ },
1619+ {
1620+ "test": "json",
1621+ "ok": true,
1622+ "latencyMs": 4528,
1623+ "usage": {
1624+ "input": 52,
1625+ "output": 418,
1626+ "cachedInput": 0,
1627+ "reasoning": 384
1628+ },
1629+ "api": "responses",
1630+ "raw": {
1631+ "status": "completed",
1632+ "incomplete": null
1633+ },
1634+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
1635+ "costUsd": 0.000849
1636+ },
1637+ {
1638+ "test": "tools",
1639+ "ok": true,
1640+ "latencyMs": 1728,
1641+ "usage": {
1642+ "input": 69,
1643+ "output": 97,
1644+ "cachedInput": 0,
1645+ "reasoning": 64
1646+ },
1647+ "api": "responses",
1648+ "raw": {
1649+ "status": "completed",
1650+ "incomplete": null
1651+ },
1652+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
1653+ "costUsd": 0.00021125
1654+ },
1655+ {
1656+ "test": "vision",
1657+ "ok": true,
1658+ "latencyMs": 1422,
1659+ "usage": {
1660+ "input": 194,
1661+ "output": 96,
1662+ "cachedInput": 0,
1663+ "reasoning": 64
1664+ },
1665+ "api": "responses",
1666+ "raw": {
1667+ "status": "completed",
1668+ "incomplete": null
1669+ },
1670+ "sample": "circles=3; other=square",
1671+ "costUsd": 0.0002405
1672+ },
1673+ {
1674+ "test": "longctx",
1675+ "ok": true,
1676+ "latencyMs": 2108,
1677+ "usage": {
1678+ "input": 9134,
1679+ "output": 186,
1680+ "cachedInput": 0,
1681+ "reasoning": 128
1682+ },
1683+ "api": "responses",
1684+ "raw": {
1685+ "status": "completed",
1686+ "incomplete": null
1687+ },
1688+ "sample": "7431-ALPHA",
1689+ "costUsd": 0.0026555
1690+ },
1691+ {
1692+ "test": "basic",
1693+ "ok": true,
1694+ "latencyMs": 1572,
1695+ "usage": {
1696+ "input": 19,
1697+ "output": 65,
1698+ "cachedInput": 0,
1699+ "reasoning": 0
1700+ },
1701+ "api": "responses",
1702+ "raw": {
1703+ "status": "completed",
1704+ "incomplete": null
1705+ },
1706+ "sample": "Ottawa",
1707+ "costUsd": 0.00013475
1708+ },
1709+ {
1710+ "test": "streaming",
1711+ "ok": true,
1712+ "latencyMs": 10441,
1713+ "ttftMs": 10075,
1714+ "usage": {
1715+ "input": 15,
1716+ "output": 856,
1717+ "cachedInput": 0,
1718+ "reasoning": 832
1719+ },
1720+ "api": "responses",
1721+ "sample": "Gray roofs under snow\nStreet lamps halo the soft falling\nMaple smoke in air",
1722+ "costUsd": 0.00171575
1723+ }
1724+ ],
1725+ "api": "responses"
1726+ },
1727+ "gpt-5-nano": {
1728+ "provider": "openai",
1729+ "kind": "chat",
1730+ "tests": [
1731+ {
1732+ "test": "reasoning",
1733+ "ok": true,
1734+ "latencyMs": 4900,
1735+ "usage": {
1736+ "input": 42,
1737+ "output": 1051,
1738+ "cachedInput": 0,
1739+ "reasoning": 960
1740+ },
1741+ "api": "responses",
1742+ "raw": {
1743+ "status": "completed",
1744+ "incomplete": null
1745+ },
1746+ "sample": "There are 2 other sisters besides Alice, and Alice is also his sister, so each brother has 3 sisters in total.\n\nANSWER: 3",
1747+ "costUsd": 0.0004225000000000001
1748+ },
1749+ {
1750+ "test": "math",
1751+ "ok": true,
1752+ "latencyMs": 1239,
1753+ "usage": {
1754+ "input": 50,
1755+ "output": 235,
1756+ "cachedInput": 0,
1757+ "reasoning": 192
1758+ },
1759+ "api": "responses",
1760+ "raw": {
1761+ "status": "completed",
1762+ "incomplete": null
1763+ },
1764+ "sample": "a=403;b=2500",
1765+ "costUsd": 0.0000965
1766+ },
1767+ {
1768+ "test": "code",
1769+ "ok": true,
1770+ "latencyMs": 4674,
1771+ "usage": {
1772+ "input": 49,
1773+ "output": 1037,
1774+ "cachedInput": 0,
1775+ "reasoning": 832
1776+ },
1777+ "api": "responses",
1778+ "raw": {
1779+ "status": "completed",
1780+ "incomplete": null
1781+ },
1782+ "sample": "```js\nfunction isPrime(n) {\n if (typeof n !== 'number' || !Number.isFinite(n)) return false;\n if (n !== Math.floor(n)) return false;\n if (n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n let i = 5;\n while (i * i <= n) {\n if (n % i =",
1783+ "costUsd": 0.00041725
1784+ },
1785+ {
1786+ "test": "french",
1787+ "ok": true,
1788+ "latencyMs": 3034,
1789+ "usage": {
1790+ "input": 31,
1791+ "output": 853,
1792+ "cachedInput": 0,
1793+ "reasoning": 768
1794+ },
1795+ "api": "responses",
1796+ "raw": {
1797+ "status": "completed",
1798+ "incomplete": null
1799+ },
1800+ "sample": "La méthode du coût en évaluation immobilière estime la valeur d'un bien à partir du coût de reconstruction ou de remplacement du bâtiment, estimé à jour. On y ajoute la valeur du terrain et on retranche les dépréciations (physiques, fonctionnelles et économiques) pour obtenir la valeur finale.",
1801+ "costUsd": 0.00034275000000000006
1802+ },
1803+ {
1804+ "test": "english",
1805+ "ok": true,
1806+ "latencyMs": 2844,
1807+ "usage": {
1808+ "input": 20,
1809+ "output": 592,
1810+ "cachedInput": 0,
1811+ "reasoning": 512
1812+ },
1813+ "api": "responses",
1814+ "raw": {
1815+ "status": "completed",
1816+ "incomplete": null
1817+ },
1818+ "sample": "A hedonic pricing model estimates the value of a good or service by decomposing its price into the value of its observable attributes or characteristics. It uses regression analysis to relate price to these attributes, yielding implicit prices for each characteristic and enabling analysis of how fea",
1819+ "costUsd": 0.0002378
1820+ },
1821+ {
1822+ "test": "json",
1823+ "ok": true,
1824+ "latencyMs": 6989,
1825+ "usage": {
1826+ "input": 52,
1827+ "output": 1433,
1828+ "cachedInput": 0,
1829+ "reasoning": 1344
1830+ },
1831+ "api": "responses",
1832+ "raw": {
1833+ "status": "completed",
1834+ "incomplete": null
1835+ },
1836+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":330000}",
1837+ "costUsd": 0.0005758000000000001
1838+ },
1839+ {
1840+ "test": "tools",
1841+ "ok": true,
1842+ "latencyMs": 1511,
1843+ "usage": {
1844+ "input": 69,
1845+ "output": 180,
1846+ "cachedInput": 0,
1847+ "reasoning": 128
1848+ },
1849+ "api": "responses",
1850+ "raw": {
1851+ "status": "completed",
1852+ "incomplete": null
1853+ },
1854+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
1855+ "costUsd": 0.00007545
1856+ },
1857+ {
1858+ "test": "vision",
1859+ "ok": true,
1860+ "latencyMs": 1219,
1861+ "usage": {
1862+ "input": 232,
1863+ "output": 187,
1864+ "cachedInput": 0,
1865+ "reasoning": 128
1866+ },
1867+ "api": "responses",
1868+ "raw": {
1869+ "status": "completed",
1870+ "incomplete": null
1871+ },
1872+ "sample": "circles=3; other=square",
1873+ "costUsd": 0.0000864
1874+ },
1875+ {
1876+ "test": "longctx",
1877+ "ok": true,
1878+ "latencyMs": 1924,
1879+ "usage": {
1880+ "input": 9134,
1881+ "output": 273,
1882+ "cachedInput": 0,
1883+ "reasoning": 256
1884+ },
1885+ "api": "responses",
1886+ "raw": {
1887+ "status": "completed",
1888+ "incomplete": null
1889+ },
1890+ "sample": "7431-ALPHA",
1891+ "costUsd": 0.0005659
1892+ },
1893+ {
1894+ "test": "basic",
1895+ "ok": true,
1896+ "latencyMs": 1779,
1897+ "usage": {
1898+ "input": 19,
1899+ "output": 119,
1900+ "cachedInput": 0,
1901+ "reasoning": 64
1902+ },
1903+ "api": "responses",
1904+ "raw": {
1905+ "status": "completed",
1906+ "incomplete": null
1907+ },
1908+ "sample": "Ottawa",
1909+ "costUsd": 0.00004855
1910+ },
1911+ {
1912+ "test": "streaming",
1913+ "ok": true,
1914+ "latencyMs": 10863,
1915+ "ttftMs": 10356,
1916+ "usage": {
1917+ "input": 15,
1918+ "output": 2091,
1919+ "cachedInput": 0,
1920+ "reasoning": 2048
1921+ },
1922+ "api": "responses",
1923+ "sample": "Snow sighs on the pines\nThe old town wears a white shawl\nIce threads the river",
1924+ "costUsd": 0.00083715
1925+ }
1926+ ],
1927+ "api": "responses"
1928+ },
1929+ "gpt-5-pro": {
1930+ "provider": "openai",
1931+ "kind": "chat-pro",
1932+ "tests": [
1933+ {
1934+ "test": "basic",
1935+ "ok": true,
1936+ "latencyMs": 13713,
1937+ "usage": {
1938+ "input": 19,
1939+ "output": 72,
1940+ "cachedInput": 0,
1941+ "reasoning": 64
1942+ },
1943+ "api": "responses",
1944+ "raw": {
1945+ "status": "completed",
1946+ "incomplete": null
1947+ },
1948+ "sample": "Ottawa",
1949+ "costUsd": 0.008925
1950+ },
1951+ {
1952+ "test": "reasoning",
1953+ "ok": true,
1954+ "latencyMs": 49039,
1955+ "usage": {
1956+ "input": 42,
1957+ "output": 813,
1958+ "cachedInput": 0,
1959+ "reasoning": 768
1960+ },
1961+ "api": "responses",
1962+ "raw": {
1963+ "status": "completed",
1964+ "incomplete": null
1965+ },
1966+ "sample": "Alice has 2 sisters, and Alice herself is also a sister to her brothers. So each brother has 3 sisters. ANSWER: 3",
1967+ "costUsd": 0.09819
1968+ },
1969+ {
1970+ "test": "json",
1971+ "ok": true,
1972+ "latencyMs": 47132,
1973+ "usage": {
1974+ "input": 52,
1975+ "output": 976,
1976+ "cachedInput": 0,
1977+ "reasoning": 896
1978+ },
1979+ "api": "responses",
1980+ "raw": {
1981+ "status": "completed",
1982+ "incomplete": null
1983+ },
1984+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
1985+ "costUsd": 0.1179
1986+ },
1987+ {
1988+ "test": "tools",
1989+ "ok": true,
1990+ "latencyMs": 15890,
1991+ "usage": {
1992+ "input": 69,
1993+ "output": 231,
1994+ "cachedInput": 0,
1995+ "reasoning": 192
1996+ },
1997+ "api": "responses",
1998+ "raw": {
1999+ "status": "completed",
2000+ "incomplete": null
2001+ },
2002+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
2003+ "costUsd": 0.028755
2004+ }
2005+ ],
2006+ "api": "responses"
2007+ },
2008+ "gpt-5-search-api": {
2009+ "provider": "openai",
2010+ "kind": "search",
2011+ "tests": [
2012+ {
2013+ "test": "basic",
2014+ "ok": true,
2015+ "latencyMs": 1262,
2016+ "usage": {
2017+ "input": 1576,
2018+ "output": 6,
2019+ "cachedInput": 0,
2020+ "reasoning": 0
2021+ },
2022+ "api": "chat",
2023+ "raw": {
2024+ "finish": "stop"
2025+ },
2026+ "sample": "Ottawa",
2027+ "costUsd": 0.00203
2028+ },
2029+ {
2030+ "test": "reasoning",
2031+ "ok": true,
2032+ "latencyMs": 1707,
2033+ "usage": {
2034+ "input": 1599,
2035+ "output": 133,
2036+ "cachedInput": 0,
2037+ "reasoning": 0
2038+ },
2039+ "api": "chat",
2040+ "raw": {
2041+ "finish": "stop"
2042+ },
2043+ "sample": "Each of Alice’s brothers has 3 sisters. Because Alice has 2 sisters in addition to herself, each brother’s sisters are: Alice + those 2 sisters = 3. \nANSWER: 3",
2044+ "costUsd": 0.00332875
2045+ },
2046+ {
2047+ "test": "math",
2048+ "ok": false,
2049+ "latencyMs": 1218,
2050+ "usage": {
2051+ "input": 1607,
2052+ "output": 11,
2053+ "cachedInput": 0,
2054+ "reasoning": 0
2055+ },
2056+ "api": "chat",
2057+ "raw": {
2058+ "finish": "stop"
2059+ },
2060+ "sample": "a=411;b=2500",
2061+ "costUsd": 0.00211875
2062+ },
2063+ {
2064+ "test": "code",
2065+ "ok": true,
2066+ "latencyMs": 2032,
2067+ "usage": {
2068+ "input": 1606,
2069+ "output": 159,
2070+ "cachedInput": 0,
2071+ "reasoning": 0
2072+ },
2073+ "api": "chat",
2074+ "raw": {
2075+ "finish": "stop"
2076+ },
2077+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1 || n !== Math.floor(n)) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n const limit = Math.floor(Math.sqrt(n));\n for (let i = 5; i <= limit; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return fal",
2078+ "costUsd": 0.0035975
2079+ },
2080+ {
2081+ "test": "french",
2082+ "ok": true,
2083+ "latencyMs": 5782,
2084+ "usage": {
2085+ "input": 16623,
2086+ "output": 171,
2087+ "cachedInput": 0,
2088+ "reasoning": 0
2089+ },
2090+ "api": "chat",
2091+ "raw": {
2092+ "finish": "stop"
2093+ },
2094+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain (si vacant) et le coût à neuf de construction d’un bâtiment équivalent, puis en soustrayant la dépréciation due à l’usure, à l’obsolescence ou à des facteurs externes ([pmea.ca](h",
2095+ "costUsd": 0.02248875
2096+ },
2097+ {
2098+ "test": "english",
2099+ "ok": true,
2100+ "latencyMs": 1621,
2101+ "usage": {
2102+ "input": 1577,
2103+ "output": 93,
2104+ "cachedInput": 0,
2105+ "reasoning": 0
2106+ },
2107+ "api": "chat",
2108+ "raw": {
2109+ "finish": "stop"
2110+ },
2111+ "sample": "A hedonic pricing model is an economic method used to estimate the value of a good or service by breaking it down into its component attributes and determining how much each contributes to overall price. It relies on observed market data to statistically isolate how individual characteristics (such ",
2112+ "costUsd": 0.00290125
2113+ },
2114+ {
2115+ "test": "json",
2116+ "ok": true,
2117+ "latencyMs": 4414,
2118+ "usage": {
2119+ "input": 16436,
2120+ "output": 27,
2121+ "cachedInput": 1408,
2122+ "reasoning": 0
2123+ },
2124+ "api": "chat",
2125+ "raw": {
2126+ "finish": "stop"
2127+ },
2128+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":305437}",
2129+ "costUsd": 0.019231
2130+ },
2131+ {
2132+ "test": "tools",
2133+ "ok": false,
2134+ "latencyMs": 103,
2135+ "error": "404 404 tools is not supported in this model. For a list of supported models, refer to https://platform.openai.com/docs/guides/function-calling#models-supporting-function-calling."
2136+ },
2137+ {
2138+ "test": "vision",
2139+ "ok": false,
2140+ "latencyMs": 1643,
2141+ "usage": {
2142+ "input": 1673,
2143+ "output": 12,
2144+ "cachedInput": 0,
2145+ "reasoning": 0
2146+ },
2147+ "api": "chat",
2148+ "raw": {
2149+ "finish": "stop"
2150+ },
2151+ "sample": "circles=3; other=triangle",
2152+ "costUsd": 0.00221125
2153+ },
2154+ {
2155+ "test": "longctx",
2156+ "ok": true,
2157+ "latencyMs": 1313,
2158+ "usage": {
2159+ "input": 10691,
2160+ "output": 9,
2161+ "cachedInput": 1408,
2162+ "reasoning": 0
2163+ },
2164+ "api": "chat",
2165+ "raw": {
2166+ "finish": "stop"
2167+ },
2168+ "sample": "7431-ALPHA",
2169+ "costUsd": 0.01186975
2170+ },
2171+ {
2172+ "test": "streaming",
2173+ "ok": true,
2174+ "latencyMs": 1582,
2175+ "ttftMs": 1073,
2176+ "usage": {
2177+ "input": 1572,
2178+ "output": 24,
2179+ "cachedInput": 1152
2180+ },
2181+ "api": "chat",
2182+ "sample": "Québec snowfall drifts— \nRiver whispers under ice, \nMaple’s scarlet glow.",
2183+ "costUsd": 0.000909
2184+ }
2185+ ],
2186+ "api": "chat"
2187+ },
2188+ "gpt-5.1": {
2189+ "provider": "openai",
2190+ "kind": "chat",
2191+ "tests": [
2192+ {
2193+ "test": "basic",
2194+ "ok": true,
2195+ "latencyMs": 808,
2196+ "usage": {
2197+ "input": 19,
2198+ "output": 12,
2199+ "cachedInput": 0,
2200+ "reasoning": 0
2201+ },
2202+ "api": "responses",
2203+ "raw": {
2204+ "status": "completed",
2205+ "incomplete": null
2206+ },
2207+ "sample": "Ottawa",
2208+ "costUsd": 0.00014375
2209+ },
2210+ {
2211+ "test": "reasoning",
2212+ "ok": true,
2213+ "latencyMs": 1431,
2214+ "usage": {
2215+ "input": 42,
2216+ "output": 71,
2217+ "cachedInput": 0,
2218+ "reasoning": 0
2219+ },
2220+ "api": "responses",
2221+ "raw": {
2222+ "status": "completed",
2223+ "incomplete": null
2224+ },
2225+ "sample": "Alice has 3 brothers and 2 sisters.\n\nTotal girls in the family: Alice + 2 sisters = 3 sisters.\n\nEach brother’s sisters are all the girls in the family (since each brother is not counted as his own sister). So each brother has 3 sisters.\n\nANSWER: 3",
2226+ "costUsd": 0.0007625
2227+ },
2228+ {
2229+ "test": "math",
2230+ "ok": false,
2231+ "latencyMs": 743,
2232+ "usage": {
2233+ "input": 50,
2234+ "output": 17,
2235+ "cachedInput": 0,
2236+ "reasoning": 0
2237+ },
2238+ "api": "responses",
2239+ "raw": {
2240+ "status": "completed",
2241+ "incomplete": null
2242+ },
2243+ "sample": "a=419;b=2500",
2244+ "costUsd": 0.0002325
2245+ },
2246+ {
2247+ "test": "code",
2248+ "ok": true,
2249+ "latencyMs": 1084,
2250+ "usage": {
2251+ "input": 49,
2252+ "output": 117,
2253+ "cachedInput": 0,
2254+ "reasoning": 0
2255+ },
2256+ "api": "responses",
2257+ "raw": {
2258+ "status": "completed",
2259+ "incomplete": null
2260+ },
2261+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
2262+ "costUsd": 0.00123125
2263+ },
2264+ {
2265+ "test": "french",
2266+ "ok": true,
2267+ "latencyMs": 1419,
2268+ "usage": {
2269+ "input": 31,
2270+ "output": 85,
2271+ "cachedInput": 0,
2272+ "reasoning": 0
2273+ },
2274+ "api": "responses",
2275+ "raw": {
2276+ "status": "completed",
2277+ "incomplete": null
2278+ },
2279+ "sample": "La méthode du coût, en évaluation immobilière, consiste à estimer la valeur d’un bien en additionnant la valeur du terrain à celle des constructions, calculée sur la base du coût de remplacement ou de reproduction. On déduit ensuite la dépréciation (vieillissement, obsolescence, vétusté) pour obteni",
2280+ "costUsd": 0.00088875
2281+ },
2282+ {
2283+ "test": "english",
2284+ "ok": true,
2285+ "latencyMs": 1116,
2286+ "usage": {
2287+ "input": 20,
2288+ "output": 77,
2289+ "cachedInput": 0,
2290+ "reasoning": 0
2291+ },
2292+ "api": "responses",
2293+ "raw": {
2294+ "status": "completed",
2295+ "incomplete": null
2296+ },
2297+ "sample": "A hedonic pricing model is an econometric method that estimates the value of a good or service by decomposing its price into the implicit prices of its attributes or characteristics. It is commonly used to infer the value of non-market attributes—such as environmental quality or neighborhood safety—",
2298+ "costUsd": 0.000795
2299+ },
2300+ {
2301+ "test": "json",
2302+ "ok": true,
2303+ "latencyMs": 815,
2304+ "usage": {
2305+ "input": 52,
2306+ "output": 33,
2307+ "cachedInput": 0,
2308+ "reasoning": 0
2309+ },
2310+ "api": "responses",
2311+ "raw": {
2312+ "status": "completed",
2313+ "incomplete": null
2314+ },
2315+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":300000}",
2316+ "costUsd": 0.000395
2317+ },
2318+ {
2319+ "test": "tools",
2320+ "ok": true,
2321+ "latencyMs": 738,
2322+ "usage": {
2323+ "input": 69,
2324+ "output": 28,
2325+ "cachedInput": 0,
2326+ "reasoning": 0
2327+ },
2328+ "api": "responses",
2329+ "raw": {
2330+ "status": "completed",
2331+ "incomplete": null
2332+ },
2333+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
2334+ "costUsd": 0.00036625
2335+ },
2336+ {
2337+ "test": "vision",
2338+ "ok": true,
2339+ "latencyMs": 871,
2340+ "usage": {
2341+ "input": 107,
2342+ "output": 18,
2343+ "cachedInput": 0,
2344+ "reasoning": 0
2345+ },
2346+ "api": "responses",
2347+ "raw": {
2348+ "status": "completed",
2349+ "incomplete": null
2350+ },
2351+ "sample": "circles=3; other=square",
2352+ "costUsd": 0.00031375
2353+ },
2354+ {
2355+ "test": "longctx",
2356+ "ok": true,
2357+ "latencyMs": 812,
2358+ "usage": {
2359+ "input": 9134,
2360+ "output": 15,
2361+ "cachedInput": 0,
2362+ "reasoning": 0
2363+ },
2364+ "api": "responses",
2365+ "raw": {
2366+ "status": "completed",
2367+ "incomplete": null
2368+ },
2369+ "sample": "7431-ALPHA",
2370+ "costUsd": 0.0115675
2371+ },
2372+ {
2373+ "test": "streaming",
2374+ "ok": true,
2375+ "latencyMs": 1035,
2376+ "ttftMs": 610,
2377+ "usage": {
2378+ "input": 15,
2379+ "output": 34,
2380+ "cachedInput": 0,
2381+ "reasoning": 0
2382+ },
2383+ "api": "responses",
2384+ "sample": "Snowstorm-veiled steeples, \nMaple smoke threads frozen streets— \nNorth wind hymns in French.",
2385+ "costUsd": 0.00035875
2386+ }
2387+ ],
2388+ "api": "responses"
2389+ },
2390+ "gpt-5.1-chat-latest": {
2391+ "provider": "openai",
2392+ "kind": "chat",
2393+ "tests": [
2394+ {
2395+ "test": "basic",
2396+ "ok": false,
2397+ "latencyMs": 275,
2398+ "error": "404 404 The model `gpt-5.1-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2399+ }
2400+ ]
2401+ },
2402+ "gpt-5.1-codex": {
2403+ "provider": "openai",
2404+ "kind": "chat",
2405+ "tests": [
2406+ {
2407+ "test": "basic",
2408+ "ok": false,
2409+ "latencyMs": 232,
2410+ "error": "404 404 The model `gpt-5.1-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2411+ }
2412+ ]
2413+ },
2414+ "gpt-5.1-codex-max": {
2415+ "provider": "openai",
2416+ "kind": "chat",
2417+ "tests": [
2418+ {
2419+ "test": "basic",
2420+ "ok": false,
2421+ "latencyMs": 257,
2422+ "error": "404 404 The model `gpt-5.1-codex-max` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2423+ }
2424+ ]
2425+ },
2426+ "gpt-5.1-codex-mini": {
2427+ "provider": "openai",
2428+ "kind": "chat",
2429+ "tests": [
2430+ {
2431+ "test": "basic",
2432+ "ok": false,
2433+ "latencyMs": 327,
2434+ "error": "404 404 The model `gpt-5.1-codex-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2435+ }
2436+ ]
2437+ },
2438+ "gpt-5.2": {
2439+ "provider": "openai",
2440+ "kind": "chat",
2441+ "tests": [
2442+ {
2443+ "test": "basic",
2444+ "ok": true,
2445+ "latencyMs": 701,
2446+ "usage": {
2447+ "input": 19,
2448+ "output": 6,
2449+ "cachedInput": 0,
2450+ "reasoning": 0
2451+ },
2452+ "api": "responses",
2453+ "raw": {
2454+ "status": "completed",
2455+ "incomplete": null
2456+ },
2457+ "sample": "Ottawa",
2458+ "costUsd": 0.00011725
2459+ },
2460+ {
2461+ "test": "reasoning",
2462+ "ok": false,
2463+ "latencyMs": 1496,
2464+ "usage": {
2465+ "input": 42,
2466+ "output": 47,
2467+ "cachedInput": 0,
2468+ "reasoning": 0
2469+ },
2470+ "api": "responses",
2471+ "raw": {
2472+ "status": "completed",
2473+ "incomplete": null
2474+ },
2475+ "sample": "Alice is one of the sisters. The family has 2 sisters total (Alice plus one more) and 3 brothers. Each brother has the same set of sisters: the 2 sisters.\n\nANSWER: 2",
2476+ "costUsd": 0.0007315
2477+ },
2478+ {
2479+ "test": "math",
2480+ "ok": true,
2481+ "latencyMs": 2918,
2482+ "usage": {
2483+ "input": 50,
2484+ "output": 11,
2485+ "cachedInput": 0,
2486+ "reasoning": 0
2487+ },
2488+ "api": "responses",
2489+ "raw": {
2490+ "status": "completed",
2491+ "incomplete": null
2492+ },
2493+ "sample": "a=403;b=2500",
2494+ "costUsd": 0.0002415
2495+ },
2496+ {
2497+ "test": "code",
2498+ "ok": true,
2499+ "latencyMs": 1766,
2500+ "usage": {
2501+ "input": 49,
2502+ "output": 122,
2503+ "cachedInput": 0,
2504+ "reasoning": 0
2505+ },
2506+ "api": "responses",
2507+ "raw": {
2508+ "status": "completed",
2509+ "incomplete": null
2510+ },
2511+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n <= 1) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
2512+ "costUsd": 0.00179375
2513+ },
2514+ {
2515+ "test": "french",
2516+ "ok": true,
2517+ "latencyMs": 1864,
2518+ "usage": {
2519+ "input": 31,
2520+ "output": 89,
2521+ "cachedInput": 0,
2522+ "reasoning": 0
2523+ },
2524+ "api": "responses",
2525+ "raw": {
2526+ "status": "completed",
2527+ "incomplete": null
2528+ },
2529+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf des améliorations (bâtiments), puis en retranchant la dépréciation (usure, obsolescence, etc.). Elle est surtout utilisée pour des biens récent",
2530+ "costUsd": 0.00130025
2531+ },
2532+ {
2533+ "test": "english",
2534+ "ok": true,
2535+ "latencyMs": 1506,
2536+ "usage": {
2537+ "input": 20,
2538+ "output": 55,
2539+ "cachedInput": 0,
2540+ "reasoning": 0
2541+ },
2542+ "api": "responses",
2543+ "raw": {
2544+ "status": "completed",
2545+ "incomplete": null
2546+ },
2547+ "sample": "A hedonic pricing model estimates the implicit value of an item’s individual characteristics by relating observed market prices to measurable attributes. It is commonly used for heterogeneous goods like housing to infer how features (e.g., size, location, amenities) contribute to price.",
2548+ "costUsd": 0.000805
2549+ },
2550+ {
2551+ "test": "json",
2552+ "ok": true,
2553+ "latencyMs": 936,
2554+ "usage": {
2555+ "input": 52,
2556+ "output": 27,
2557+ "cachedInput": 0,
2558+ "reasoning": 0
2559+ },
2560+ "api": "responses",
2561+ "raw": {
2562+ "status": "completed",
2563+ "incomplete": null
2564+ },
2565+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
2566+ "costUsd": 0.000469
2567+ },
2568+ {
2569+ "test": "tools",
2570+ "ok": true,
2571+ "latencyMs": 928,
2572+ "usage": {
2573+ "input": 69,
2574+ "output": 22,
2575+ "cachedInput": 0,
2576+ "reasoning": 0
2577+ },
2578+ "api": "responses",
2579+ "raw": {
2580+ "status": "completed",
2581+ "incomplete": null
2582+ },
2583+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
2584+ "costUsd": 0.00042875
2585+ },
2586+ {
2587+ "test": "vision",
2588+ "ok": true,
2589+ "latencyMs": 721,
2590+ "usage": {
2591+ "input": 194,
2592+ "output": 12,
2593+ "cachedInput": 0,
2594+ "reasoning": 0
2595+ },
2596+ "api": "responses",
2597+ "raw": {
2598+ "status": "completed",
2599+ "incomplete": null
2600+ },
2601+ "sample": "circles=3; other=square",
2602+ "costUsd": 0.0005075
2603+ },
2604+ {
2605+ "test": "longctx",
2606+ "ok": false,
2607+ "latencyMs": 959,
2608+ "usage": {
2609+ "input": 9134,
2610+ "output": 26,
2611+ "cachedInput": 0,
2612+ "reasoning": 0
2613+ },
2614+ "api": "responses",
2615+ "raw": {
2616+ "status": "completed",
2617+ "incomplete": null
2618+ },
2619+ "sample": "Je ne peux pas divulguer un code secret extrait d’une note interne marquée « Ne pas divulguer ».",
2620+ "costUsd": 0.0163485
2621+ },
2622+ {
2623+ "test": "streaming",
2624+ "ok": true,
2625+ "latencyMs": 1220,
2626+ "ttftMs": 529,
2627+ "usage": {
2628+ "input": 15,
2629+ "output": 26,
2630+ "cachedInput": 0,
2631+ "reasoning": 0
2632+ },
2633+ "api": "responses",
2634+ "sample": "St. Lawrence locked in ice, \nMaple smoke warms dusk-blue streets— \nSnow hushes Québec.",
2635+ "costUsd": 0.00039025
2636+ }
2637+ ],
2638+ "api": "responses"
2639+ },
2640+ "gpt-5.2-chat-latest": {
2641+ "provider": "openai",
2642+ "kind": "chat",
2643+ "tests": [
2644+ {
2645+ "test": "basic",
2646+ "ok": false,
2647+ "latencyMs": 243,
2648+ "error": "404 404 The model `gpt-5.2-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2649+ }
2650+ ]
2651+ },
2652+ "gpt-5.2-codex": {
2653+ "provider": "openai",
2654+ "kind": "chat",
2655+ "tests": [
2656+ {
2657+ "test": "basic",
2658+ "ok": false,
2659+ "latencyMs": 246,
2660+ "error": "404 404 The model `gpt-5.2-codex` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2661+ }
2662+ ]
2663+ },
2664+ "gpt-5.2-pro": {
2665+ "provider": "openai",
2666+ "kind": "chat-pro",
2667+ "tests": [
2668+ {
2669+ "test": "basic",
2670+ "ok": true,
2671+ "latencyMs": 4095,
2672+ "usage": {
2673+ "input": 19,
2674+ "output": 6,
2675+ "cachedInput": 0,
2676+ "reasoning": 0
2677+ },
2678+ "api": "responses",
2679+ "raw": {
2680+ "status": "completed",
2681+ "incomplete": null
2682+ },
2683+ "sample": "Ottawa",
2684+ "costUsd": 0.001407
2685+ },
2686+ {
2687+ "test": "reasoning",
2688+ "ok": true,
2689+ "latencyMs": 6396,
2690+ "usage": {
2691+ "input": 42,
2692+ "output": 91,
2693+ "cachedInput": 0,
2694+ "reasoning": 36
2695+ },
2696+ "api": "responses",
2697+ "raw": {
2698+ "status": "completed",
2699+ "incomplete": null
2700+ },
2701+ "sample": "Alice is one of the sisters. Since she has 2 sisters, that means there are **3 sisters total** in the family (Alice + 2 others). Each of Alice’s brothers therefore has **3 sisters**.\n\nANSWER: 3",
2702+ "costUsd": 0.01617
2703+ },
2704+ {
2705+ "test": "json",
2706+ "ok": true,
2707+ "latencyMs": 6297,
2708+ "usage": {
2709+ "input": 52,
2710+ "output": 93,
2711+ "cachedInput": 0,
2712+ "reasoning": 64
2713+ },
2714+ "api": "responses",
2715+ "raw": {
2716+ "status": "completed",
2717+ "incomplete": null
2718+ },
2719+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
2720+ "costUsd": 0.016716
2721+ },
2722+ {
2723+ "test": "tools",
2724+ "ok": true,
2725+ "latencyMs": 9220,
2726+ "usage": {
2727+ "input": 69,
2728+ "output": 22,
2729+ "cachedInput": 0,
2730+ "reasoning": 0
2731+ },
2732+ "api": "responses",
2733+ "raw": {
2734+ "status": "completed",
2735+ "incomplete": null
2736+ },
2737+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
2738+ "costUsd": 0.005145
2739+ }
2740+ ],
2741+ "api": "responses"
2742+ },
2743+ "gpt-5.3-chat-latest": {
2744+ "provider": "openai",
2745+ "kind": "chat",
2746+ "tests": [
2747+ {
2748+ "test": "basic",
2749+ "ok": false,
2750+ "latencyMs": 320,
2751+ "error": "404 404 The model `gpt-5.3-chat-latest` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
2752+ }
2753+ ]
2754+ },
2755+ "gpt-5.3-codex": {
2756+ "provider": "openai",
2757+ "kind": "chat",
2758+ "tests": [
2759+ {
2760+ "test": "basic",
2761+ "ok": true,
2762+ "latencyMs": 656,
2763+ "usage": {
2764+ "input": 19,
2765+ "output": 6,
2766+ "cachedInput": 0,
2767+ "reasoning": 0
2768+ },
2769+ "api": "responses",
2770+ "raw": {
2771+ "status": "completed",
2772+ "incomplete": null
2773+ },
2774+ "sample": "Ottawa",
2775+ "costUsd": 0.00011725
2776+ },
2777+ {
2778+ "test": "reasoning",
2779+ "ok": false,
2780+ "latencyMs": 1209,
2781+ "usage": {
2782+ "input": 42,
2783+ "output": 46,
2784+ "cachedInput": 0,
2785+ "reasoning": 0
2786+ },
2787+ "api": "responses",
2788+ "raw": {
2789+ "status": "completed",
2790+ "incomplete": null
2791+ },
2792+ "sample": "Alice has 2 sisters total, and Alice is one of them.\n\nSo each of Alice’s brothers has the same sisters: **Alice + Alice’s other sister = 2 sisters**.\n\nANSWER: 2",
2793+ "costUsd": 0.0007175
2794+ },
2795+ {
2796+ "test": "math",
2797+ "ok": true,
2798+ "latencyMs": 828,
2799+ "usage": {
2800+ "input": 50,
2801+ "output": 11,
2802+ "cachedInput": 0,
2803+ "reasoning": 0
2804+ },
2805+ "api": "responses",
2806+ "raw": {
2807+ "status": "completed",
2808+ "incomplete": null
2809+ },
2810+ "sample": "a=403;b=2500",
2811+ "costUsd": 0.0002415
2812+ },
2813+ {
2814+ "test": "code",
2815+ "ok": true,
2816+ "latencyMs": 1511,
2817+ "usage": {
2818+ "input": 49,
2819+ "output": 117,
2820+ "cachedInput": 0,
2821+ "reasoning": 0
2822+ },
2823+ "api": "responses",
2824+ "raw": {
2825+ "status": "completed",
2826+ "incomplete": null
2827+ },
2828+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n\n return true;\n}\n```",
2829+ "costUsd": 0.00172375
2830+ },
2831+ {
2832+ "test": "french",
2833+ "ok": true,
2834+ "latencyMs": 1635,
2835+ "usage": {
2836+ "input": 31,
2837+ "output": 87,
2838+ "cachedInput": 0,
2839+ "reasoning": 0
2840+ },
2841+ "api": "responses",
2842+ "raw": {
2843+ "status": "completed",
2844+ "incomplete": null
2845+ },
2846+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf du bâtiment, puis en retranchant les dépréciations (usure, obsolescence, etc.). Elle est surtout utilisée pour les biens récents, spécialisés o",
2847+ "costUsd": 0.00127225
2848+ },
2849+ {
2850+ "test": "english",
2851+ "ok": true,
2852+ "latencyMs": 1682,
2853+ "usage": {
2854+ "input": 20,
2855+ "output": 64,
2856+ "cachedInput": 0,
2857+ "reasoning": 0
2858+ },
2859+ "api": "responses",
2860+ "raw": {
2861+ "status": "completed",
2862+ "incomplete": null
2863+ },
2864+ "sample": "A hedonic pricing model is a statistical method that estimates how different characteristics of a good—such as size, location, or quality—contribute to its overall price. It is commonly used in markets like housing to isolate the implicit value of each attribute by comparing prices across similar it",
2865+ "costUsd": 0.000931
2866+ },
2867+ {
2868+ "test": "json",
2869+ "ok": true,
2870+ "latencyMs": 992,
2871+ "usage": {
2872+ "input": 52,
2873+ "output": 27,
2874+ "cachedInput": 0,
2875+ "reasoning": 0
2876+ },
2877+ "api": "responses",
2878+ "raw": {
2879+ "status": "completed",
2880+ "incomplete": null
2881+ },
2882+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
2883+ "costUsd": 0.000469
2884+ },
2885+ {
2886+ "test": "tools",
2887+ "ok": true,
2888+ "latencyMs": 791,
2889+ "usage": {
2890+ "input": 69,
2891+ "output": 22,
2892+ "cachedInput": 0,
2893+ "reasoning": 0
2894+ },
2895+ "api": "responses",
2896+ "raw": {
2897+ "status": "completed",
2898+ "incomplete": null
2899+ },
2900+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
2901+ "costUsd": 0.00042875
2902+ },
2903+ {
2904+ "test": "vision",
2905+ "ok": true,
2906+ "latencyMs": 804,
2907+ "usage": {
2908+ "input": 194,
2909+ "output": 12,
2910+ "cachedInput": 0,
2911+ "reasoning": 0
2912+ },
2913+ "api": "responses",
2914+ "raw": {
2915+ "status": "completed",
2916+ "incomplete": null
2917+ },
2918+ "sample": "circles=3; other=square",
2919+ "costUsd": 0.0005075
2920+ },
2921+ {
2922+ "test": "longctx",
2923+ "ok": true,
2924+ "latencyMs": 779,
2925+ "usage": {
2926+ "input": 9134,
2927+ "output": 9,
2928+ "cachedInput": 0,
2929+ "reasoning": 0
2930+ },
2931+ "api": "responses",
2932+ "raw": {
2933+ "status": "completed",
2934+ "incomplete": null
2935+ },
2936+ "sample": "7431-ALPHA",
2937+ "costUsd": 0.0161105
2938+ },
2939+ {
2940+ "test": "streaming",
2941+ "ok": true,
2942+ "latencyMs": 1049,
2943+ "ttftMs": 545,
2944+ "usage": {
2945+ "input": 15,
2946+ "output": 27,
2947+ "cachedInput": 0,
2948+ "reasoning": 0
2949+ },
2950+ "api": "responses",
2951+ "sample": "Snow hushes old pines, \nSt. Lawrence breathes silver mist— \nQuebec dreams in white.",
2952+ "costUsd": 0.00040425
2953+ }
2954+ ],
2955+ "api": "responses"
2956+ },
2957+ "gpt-5.4": {
2958+ "provider": "openai",
2959+ "kind": "chat",
2960+ "tests": [
2961+ {
2962+ "test": "basic",
2963+ "ok": true,
2964+ "latencyMs": 940,
2965+ "usage": {
2966+ "input": 19,
2967+ "output": 6,
2968+ "cachedInput": 0,
2969+ "reasoning": 0
2970+ },
2971+ "api": "responses",
2972+ "raw": {
2973+ "status": "completed",
2974+ "incomplete": null
2975+ },
2976+ "sample": "Ottawa",
2977+ "costUsd": 0.0001375
2978+ },
2979+ {
2980+ "test": "reasoning",
2981+ "ok": false,
2982+ "latencyMs": 1559,
2983+ "usage": {
2984+ "input": 42,
2985+ "output": 38,
2986+ "cachedInput": 0,
2987+ "reasoning": 0
2988+ },
2989+ "api": "responses",
2990+ "raw": {
2991+ "status": "completed",
2992+ "incomplete": null
2993+ },
2994+ "sample": "Alice is one of the sisters.\n\nSo the family has:\n- 3 brothers\n- 2 sisters total\n\nEach brother has 2 sisters.\n\nANSWER: 2",
2995+ "costUsd": 0.000675
2996+ },
2997+ {
2998+ "test": "math",
2999+ "ok": true,
3000+ "latencyMs": 840,
3001+ "usage": {
3002+ "input": 50,
3003+ "output": 11,
3004+ "cachedInput": 0,
3005+ "reasoning": 0
3006+ },
3007+ "api": "responses",
3008+ "raw": {
3009+ "status": "completed",
3010+ "incomplete": null
3011+ },
3012+ "sample": "a=403;b=2500",
3013+ "costUsd": 0.00029
3014+ },
3015+ {
3016+ "test": "code",
3017+ "ok": true,
3018+ "latencyMs": 1466,
3019+ "usage": {
3020+ "input": 49,
3021+ "output": 105,
3022+ "cachedInput": 0,
3023+ "reasoning": 0
3024+ },
3025+ "api": "responses",
3026+ "raw": {
3027+ "status": "completed",
3028+ "incomplete": null
3029+ },
3030+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n <= 1) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n const limit = Math.floor(Math.sqrt(n));\n for (let i = 3; i <= limit; i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
3031+ "costUsd": 0.0016975
3032+ },
3033+ {
3034+ "test": "french",
3035+ "ok": true,
3036+ "latencyMs": 2605,
3037+ "usage": {
3038+ "input": 31,
3039+ "output": 102,
3040+ "cachedInput": 0,
3041+ "reasoning": 0
3042+ },
3043+ "api": "responses",
3044+ "raw": {
3045+ "status": "completed",
3046+ "incomplete": null
3047+ },
3048+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf du bâtiment, puis en retranchant la dépréciation due à l’usure, à l’obsolescence ou à des facteurs externes. Elle est surtout utilisée pour les",
3049+ "costUsd": 0.0016075
3050+ },
3051+ {
3052+ "test": "english",
3053+ "ok": true,
3054+ "latencyMs": 1766,
3055+ "usage": {
3056+ "input": 20,
3057+ "output": 63,
3058+ "cachedInput": 0,
3059+ "reasoning": 0
3060+ },
3061+ "api": "responses",
3062+ "raw": {
3063+ "status": "completed",
3064+ "incomplete": null
3065+ },
3066+ "sample": "A hedonic pricing model estimates how the price of a good or asset is determined by the value of its individual characteristics, such as a house’s size, location, or number of bedrooms. It is commonly used to isolate the implicit price of each attribute by statistically relating observed prices to o",
3067+ "costUsd": 0.000995
3068+ },
3069+ {
3070+ "test": "json",
3071+ "ok": true,
3072+ "latencyMs": 1020,
3073+ "usage": {
3074+ "input": 52,
3075+ "output": 27,
3076+ "cachedInput": 0,
3077+ "reasoning": 0
3078+ },
3079+ "api": "responses",
3080+ "raw": {
3081+ "status": "completed",
3082+ "incomplete": null
3083+ },
3084+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
3085+ "costUsd": 0.000535
3086+ },
3087+ {
3088+ "test": "tools",
3089+ "ok": true,
3090+ "latencyMs": 1196,
3091+ "usage": {
3092+ "input": 69,
3093+ "output": 22,
3094+ "cachedInput": 0,
3095+ "reasoning": 0
3096+ },
3097+ "api": "responses",
3098+ "raw": {
3099+ "status": "completed",
3100+ "incomplete": null
3101+ },
3102+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3103+ "costUsd": 0.0005025
3104+ },
3105+ {
3106+ "test": "vision",
3107+ "ok": true,
3108+ "latencyMs": 772,
3109+ "usage": {
3110+ "input": 194,
3111+ "output": 12,
3112+ "cachedInput": 0,
3113+ "reasoning": 0
3114+ },
3115+ "api": "responses",
3116+ "raw": {
3117+ "status": "completed",
3118+ "incomplete": null
3119+ },
3120+ "sample": "circles=3; other=square",
3121+ "costUsd": 0.000665
3122+ },
3123+ {
3124+ "test": "longctx",
3125+ "ok": true,
3126+ "latencyMs": 1010,
3127+ "usage": {
3128+ "input": 9134,
3129+ "output": 9,
3130+ "cachedInput": 0,
3131+ "reasoning": 0
3132+ },
3133+ "api": "responses",
3134+ "raw": {
3135+ "status": "completed",
3136+ "incomplete": null
3137+ },
3138+ "sample": "7431-ALPHA",
3139+ "costUsd": 0.02297
3140+ },
3141+ {
3142+ "test": "streaming",
3143+ "ok": true,
3144+ "latencyMs": 1486,
3145+ "ttftMs": 651,
3146+ "usage": {
3147+ "input": 15,
3148+ "output": 24,
3149+ "cachedInput": 0,
3150+ "reasoning": 0
3151+ },
3152+ "api": "responses",
3153+ "sample": "Snow hushes old stones \nSt. Lawrence breathes silver and cold \nPines cradle moonlight",
3154+ "costUsd": 0.0003975
3155+ }
3156+ ],
3157+ "api": "responses"
3158+ },
3159+ "gpt-5.4-mini": {
3160+ "provider": "openai",
3161+ "kind": "chat",
3162+ "tests": [
3163+ {
3164+ "test": "basic",
3165+ "ok": true,
3166+ "latencyMs": 645,
3167+ "usage": {
3168+ "input": 19,
3169+ "output": 6,
3170+ "cachedInput": 0,
3171+ "reasoning": 0
3172+ },
3173+ "api": "responses",
3174+ "raw": {
3175+ "status": "completed",
3176+ "incomplete": null
3177+ },
3178+ "sample": "Ottawa",
3179+ "costUsd": 0.00004125
3180+ },
3181+ {
3182+ "test": "reasoning",
3183+ "ok": true,
3184+ "latencyMs": 764,
3185+ "usage": {
3186+ "input": 42,
3187+ "output": 42,
3188+ "cachedInput": 0,
3189+ "reasoning": 0
3190+ },
3191+ "api": "responses",
3192+ "raw": {
3193+ "status": "completed",
3194+ "incomplete": null
3195+ },
3196+ "sample": "Alice has 2 sisters, and all of Alice’s brothers share the same sisters. That means each brother has 3 sisters total: Alice plus her 2 sisters.\n\nANSWER: 3",
3197+ "costUsd": 0.0002205
3198+ },
3199+ {
3200+ "test": "math",
3201+ "ok": false,
3202+ "latencyMs": 935,
3203+ "usage": {
3204+ "input": 50,
3205+ "output": 11,
3206+ "cachedInput": 0,
3207+ "reasoning": 0
3208+ },
3209+ "api": "responses",
3210+ "raw": {
3211+ "status": "completed",
3212+ "incomplete": null
3213+ },
3214+ "sample": "a=427;b=2500",
3215+ "costUsd": 0.000087
3216+ },
3217+ {
3218+ "test": "code",
3219+ "ok": true,
3220+ "latencyMs": 1192,
3221+ "usage": {
3222+ "input": 49,
3223+ "output": 119,
3224+ "cachedInput": 0,
3225+ "reasoning": 0
3226+ },
3227+ "api": "responses",
3228+ "raw": {
3229+ "status": "completed",
3230+ "incomplete": null
3231+ },
3232+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1 || n % 1 !== 0) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
3233+ "costUsd": 0.00057225
3234+ },
3235+ {
3236+ "test": "french",
3237+ "ok": true,
3238+ "latencyMs": 944,
3239+ "usage": {
3240+ "input": 31,
3241+ "output": 100,
3242+ "cachedInput": 0,
3243+ "reasoning": 0
3244+ },
3245+ "api": "responses",
3246+ "raw": {
3247+ "status": "completed",
3248+ "incomplete": null
3249+ },
3250+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction à neuf du bâtiment, puis en retranchant la dépréciation liée à l’usure, à l’obsolescence ou à d’autres pertes de valeur. Elle est surtout utilisée pou",
3251+ "costUsd": 0.00047325
3252+ },
3253+ {
3254+ "test": "english",
3255+ "ok": true,
3256+ "latencyMs": 888,
3257+ "usage": {
3258+ "input": 20,
3259+ "output": 66,
3260+ "cachedInput": 0,
3261+ "reasoning": 0
3262+ },
3263+ "api": "responses",
3264+ "raw": {
3265+ "status": "completed",
3266+ "incomplete": null
3267+ },
3268+ "sample": "A hedonic pricing model is an economic method used to estimate the value of a good by breaking its price into the implicit values of its individual characteristics, such as location, size, quality, or amenities. It is often used in real estate and environmental economics to measure how much differen",
3269+ "costUsd": 0.000312
3270+ },
3271+ {
3272+ "test": "json",
3273+ "ok": true,
3274+ "latencyMs": 600,
3275+ "usage": {
3276+ "input": 52,
3277+ "output": 27,
3278+ "cachedInput": 0,
3279+ "reasoning": 0
3280+ },
3281+ "api": "responses",
3282+ "raw": {
3283+ "status": "completed",
3284+ "incomplete": null
3285+ },
3286+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":290000}",
3287+ "costUsd": 0.0001605
3288+ },
3289+ {
3290+ "test": "tools",
3291+ "ok": true,
3292+ "latencyMs": 644,
3293+ "usage": {
3294+ "input": 69,
3295+ "output": 22,
3296+ "cachedInput": 0,
3297+ "reasoning": 0
3298+ },
3299+ "api": "responses",
3300+ "raw": {
3301+ "status": "completed",
3302+ "incomplete": null
3303+ },
3304+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3305+ "costUsd": 0.00015075
3306+ },
3307+ {
3308+ "test": "vision",
3309+ "ok": true,
3310+ "latencyMs": 647,
3311+ "usage": {
3312+ "input": 194,
3313+ "output": 12,
3314+ "cachedInput": 0,
3315+ "reasoning": 0
3316+ },
3317+ "api": "responses",
3318+ "raw": {
3319+ "status": "completed",
3320+ "incomplete": null
3321+ },
3322+ "sample": "circles=3; other=square",
3323+ "costUsd": 0.0001995
3324+ },
3325+ {
3326+ "test": "longctx",
3327+ "ok": true,
3328+ "latencyMs": 671,
3329+ "usage": {
3330+ "input": 9134,
3331+ "output": 9,
3332+ "cachedInput": 0,
3333+ "reasoning": 0
3334+ },
3335+ "api": "responses",
3336+ "raw": {
3337+ "status": "completed",
3338+ "incomplete": null
3339+ },
3340+ "sample": "7431-ALPHA",
3341+ "costUsd": 0.006891
3342+ },
3343+ {
3344+ "test": "streaming",
3345+ "ok": true,
3346+ "latencyMs": 739,
3347+ "ttftMs": 458,
3348+ "usage": {
3349+ "input": 15,
3350+ "output": 21,
3351+ "cachedInput": 0,
3352+ "reasoning": 0
3353+ },
3354+ "api": "responses",
3355+ "sample": "Snow hushes Québec \nMaples sleep beneath ice light \nWind sings through stone streets",
3356+ "costUsd": 0.00010575
3357+ }
3358+ ],
3359+ "api": "responses"
3360+ },
3361+ "gpt-5.4-nano": {
3362+ "provider": "openai",
3363+ "kind": "chat",
3364+ "tests": [
3365+ {
3366+ "test": "basic",
3367+ "ok": true,
3368+ "latencyMs": 570,
3369+ "usage": {
3370+ "input": 19,
3371+ "output": 6,
3372+ "cachedInput": 0,
3373+ "reasoning": 0
3374+ },
3375+ "api": "responses",
3376+ "raw": {
3377+ "status": "completed",
3378+ "incomplete": null
3379+ },
3380+ "sample": "Ottawa",
3381+ "costUsd": 0.0000113
3382+ },
3383+ {
3384+ "test": "reasoning",
3385+ "ok": false,
3386+ "latencyMs": 979,
3387+ "usage": {
3388+ "input": 42,
3389+ "output": 90,
3390+ "cachedInput": 0,
3391+ "reasoning": 0
3392+ },
3393+ "api": "responses",
3394+ "raw": {
3395+ "status": "completed",
3396+ "incomplete": null
3397+ },
3398+ "sample": "Alice’s family has 3 brothers and 2 sisters total. Alice is one of the sisters, so the other sister count is 1. Each of Alice’s brothers therefore has that same other sister (Alice’s sister), plus Alice herself—but the question asks specifically “How many sisters does each brother have?” For a broth",
3399+ "costUsd": 0.00012090000000000001
3400+ },
3401+ {
3402+ "test": "math",
3403+ "ok": false,
3404+ "latencyMs": 969,
3405+ "usage": {
3406+ "input": 50,
3407+ "output": 11,
3408+ "cachedInput": 0,
3409+ "reasoning": 0
3410+ },
3411+ "api": "responses",
3412+ "raw": {
3413+ "status": "completed",
3414+ "incomplete": null
3415+ },
3416+ "sample": "a=491;b=2500",
3417+ "costUsd": 0.00002375
3418+ },
3419+ {
3420+ "test": "code",
3421+ "ok": true,
3422+ "latencyMs": 1069,
3423+ "usage": {
3424+ "input": 49,
3425+ "output": 117,
3426+ "cachedInput": 0,
3427+ "reasoning": 0
3428+ },
3429+ "api": "responses",
3430+ "raw": {
3431+ "status": "completed",
3432+ "incomplete": null
3433+ },
3434+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n <= 1) return false;\n if (n <= 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n for (let i = 5; i * i <= n; i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n return true;\n}\n```",
3435+ "costUsd": 0.00015605
3436+ },
3437+ {
3438+ "test": "french",
3439+ "ok": true,
3440+ "latencyMs": 1074,
3441+ "usage": {
3442+ "input": 31,
3443+ "output": 101,
3444+ "cachedInput": 0,
3445+ "reasoning": 0
3446+ },
3447+ "api": "responses",
3448+ "raw": {
3449+ "status": "completed",
3450+ "incomplete": null
3451+ },
3452+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant le coût de reconstruction à neuf (ou de remplacement) du bien et la valeur de la dépréciation liée à son âge et à son état, puis en tenant compte des coûts éventuels. Elle aboutit à une estimation bas",
3453+ "costUsd": 0.00013245
3454+ },
3455+ {
3456+ "test": "english",
3457+ "ok": true,
3458+ "latencyMs": 779,
3459+ "usage": {
3460+ "input": 20,
3461+ "output": 55,
3462+ "cachedInput": 0,
3463+ "reasoning": 0
3464+ },
3465+ "api": "responses",
3466+ "raw": {
3467+ "status": "completed",
3468+ "incomplete": null
3469+ },
3470+ "sample": "A hedonic pricing model explains how the price of a good or service is determined by its underlying attributes. It estimates the contribution (implicit price) of each attribute—such as size, location, or quality—typically using statistical regression on observed market prices.",
3471+ "costUsd": 0.00007275
3472+ },
3473+ {
3474+ "test": "json",
3475+ "ok": true,
3476+ "latencyMs": 524,
3477+ "usage": {
3478+ "input": 52,
3479+ "output": 27,
3480+ "cachedInput": 0,
3481+ "reasoning": 0
3482+ },
3483+ "api": "responses",
3484+ "raw": {
3485+ "status": "completed",
3486+ "incomplete": null
3487+ },
3488+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":317000}",
3489+ "costUsd": 0.000044149999999999996
3490+ },
3491+ {
3492+ "test": "tools",
3493+ "ok": true,
3494+ "latencyMs": 647,
3495+ "usage": {
3496+ "input": 69,
3497+ "output": 22,
3498+ "cachedInput": 0,
3499+ "reasoning": 0
3500+ },
3501+ "api": "responses",
3502+ "raw": {
3503+ "status": "completed",
3504+ "incomplete": null
3505+ },
3506+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3507+ "costUsd": 0.000041299999999999994
3508+ },
3509+ {
3510+ "test": "vision",
3511+ "ok": true,
3512+ "latencyMs": 590,
3513+ "usage": {
3514+ "input": 194,
3515+ "output": 12,
3516+ "cachedInput": 0,
3517+ "reasoning": 0
3518+ },
3519+ "api": "responses",
3520+ "raw": {
3521+ "status": "completed",
3522+ "incomplete": null
3523+ },
3524+ "sample": "circles=3; other=square",
3525+ "costUsd": 0.00005380000000000001
3526+ },
3527+ {
3528+ "test": "longctx",
3529+ "ok": true,
3530+ "latencyMs": 557,
3531+ "usage": {
3532+ "input": 9134,
3533+ "output": 9,
3534+ "cachedInput": 0,
3535+ "reasoning": 0
3536+ },
3537+ "api": "responses",
3538+ "raw": {
3539+ "status": "completed",
3540+ "incomplete": null
3541+ },
3542+ "sample": "7431-ALPHA",
3543+ "costUsd": 0.0018380500000000001
3544+ },
3545+ {
3546+ "test": "streaming",
3547+ "ok": true,
3548+ "latencyMs": 757,
3549+ "ttftMs": 541,
3550+ "usage": {
3551+ "input": 15,
3552+ "output": 25,
3553+ "cachedInput": 0,
3554+ "reasoning": 0
3555+ },
3556+ "api": "responses",
3557+ "sample": "Quebec in winter— \nsnow hushes street and maple, \nblue dusk, wind sighs.",
3558+ "costUsd": 0.00003425
3559+ }
3560+ ],
3561+ "api": "responses"
3562+ },
3563+ "gpt-5.4-pro": {
3564+ "provider": "openai",
3565+ "kind": "chat-pro",
3566+ "tests": [
3567+ {
3568+ "test": "basic",
3569+ "ok": true,
3570+ "latencyMs": 6194,
3571+ "usage": {
3572+ "input": 19,
3573+ "output": 25,
3574+ "cachedInput": 0,
3575+ "reasoning": 17
3576+ },
3577+ "api": "responses",
3578+ "raw": {
3579+ "status": "completed",
3580+ "incomplete": null
3581+ },
3582+ "sample": "Ottawa",
3583+ "costUsd": 0.00507
3584+ },
3585+ {
3586+ "test": "reasoning",
3587+ "ok": true,
3588+ "latencyMs": 14838,
3589+ "usage": {
3590+ "input": 42,
3591+ "output": 132,
3592+ "cachedInput": 0,
3593+ "reasoning": 64
3594+ },
3595+ "api": "responses",
3596+ "raw": {
3597+ "status": "completed",
3598+ "incomplete": null
3599+ },
3600+ "sample": "Alice is one of the sisters.\n\nSo if Alice has **2 sisters**, that means there are **3 girls total** in the family:\n- Alice\n- Sister 1\n- Sister 2\n\nEach of Alice’s **3 brothers** has all **3 girls** as sisters.\n\nANSWER: 3",
3601+ "costUsd": 0.02502
3602+ },
3603+ {
3604+ "test": "json",
3605+ "ok": true,
3606+ "latencyMs": 22867,
3607+ "usage": {
3608+ "input": 52,
3609+ "output": 199,
3610+ "cachedInput": 0,
3611+ "reasoning": 170
3612+ },
3613+ "api": "responses",
3614+ "raw": {
3615+ "status": "completed",
3616+ "incomplete": null
3617+ },
3618+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
3619+ "costUsd": 0.03738
3620+ },
3621+ {
3622+ "test": "tools",
3623+ "ok": true,
3624+ "latencyMs": 9786,
3625+ "usage": {
3626+ "input": 69,
3627+ "output": 22,
3628+ "cachedInput": 0,
3629+ "reasoning": 0
3630+ },
3631+ "api": "responses",
3632+ "raw": {
3633+ "status": "completed",
3634+ "incomplete": null
3635+ },
3636+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3637+ "costUsd": 0.00603
3638+ }
3639+ ],
3640+ "api": "responses"
3641+ },
3642+ "gpt-5.5": {
3643+ "provider": "openai",
3644+ "kind": "chat",
3645+ "tests": [
3646+ {
3647+ "test": "basic",
3648+ "ok": true,
3649+ "latencyMs": 1199,
3650+ "usage": {
3651+ "input": 19,
3652+ "output": 23,
3653+ "cachedInput": 0,
3654+ "reasoning": 15
3655+ },
3656+ "api": "responses",
3657+ "raw": {
3658+ "status": "completed",
3659+ "incomplete": null
3660+ },
3661+ "sample": "Ottawa",
3662+ "costUsd": 0.000785
3663+ },
3664+ {
3665+ "test": "reasoning",
3666+ "ok": true,
3667+ "latencyMs": 2058,
3668+ "usage": {
3669+ "input": 42,
3670+ "output": 75,
3671+ "cachedInput": 0,
3672+ "reasoning": 48
3673+ },
3674+ "api": "responses",
3675+ "raw": {
3676+ "status": "completed",
3677+ "incomplete": null
3678+ },
3679+ "sample": "Each of Alice’s brothers has 3 sisters: Alice and her 2 sisters.\n\nANSWER: 3",
3680+ "costUsd": 0.00246
3681+ },
3682+ {
3683+ "test": "math",
3684+ "ok": true,
3685+ "latencyMs": 1478,
3686+ "usage": {
3687+ "input": 50,
3688+ "output": 54,
3689+ "cachedInput": 0,
3690+ "reasoning": 41
3691+ },
3692+ "api": "responses",
3693+ "raw": {
3694+ "status": "completed",
3695+ "incomplete": null
3696+ },
3697+ "sample": "a=403;b=2500",
3698+ "costUsd": 0.00187
3699+ },
3700+ {
3701+ "test": "code",
3702+ "ok": true,
3703+ "latencyMs": 2089,
3704+ "usage": {
3705+ "input": 49,
3706+ "output": 116,
3707+ "cachedInput": 0,
3708+ "reasoning": 23
3709+ },
3710+ "api": "responses",
3711+ "raw": {
3712+ "status": "completed",
3713+ "incomplete": null
3714+ },
3715+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
3716+ "costUsd": 0.003725
3717+ },
3718+ {
3719+ "test": "french",
3720+ "ok": true,
3721+ "latencyMs": 2150,
3722+ "usage": {
3723+ "input": 31,
3724+ "output": 85,
3725+ "cachedInput": 0,
3726+ "reasoning": 16
3727+ },
3728+ "api": "responses",
3729+ "raw": {
3730+ "status": "completed",
3731+ "incomplete": null
3732+ },
3733+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en calculant le coût de remplacement ou de reconstruction du bâtiment, puis en retranchant la dépréciation éventuelle. On y ajoute généralement la valeur du terrain pour obtenir la valeur totale estimée de la proprié",
3734+ "costUsd": 0.002705
3735+ },
3736+ {
3737+ "test": "english",
3738+ "ok": true,
3739+ "latencyMs": 2207,
3740+ "usage": {
3741+ "input": 20,
3742+ "output": 85,
3743+ "cachedInput": 0,
3744+ "reasoning": 18
3745+ },
3746+ "api": "responses",
3747+ "raw": {
3748+ "status": "completed",
3749+ "incomplete": null
3750+ },
3751+ "sample": "A hedonic pricing model estimates the value of a good by breaking it into its measurable characteristics, such as size, location, quality, or features. It is often used in real estate and environmental economics to infer how much people are willing to pay for specific attributes, like an extra bedro",
3752+ "costUsd": 0.00265
3753+ },
3754+ {
3755+ "test": "json",
3756+ "ok": true,
3757+ "latencyMs": 2290,
3758+ "usage": {
3759+ "input": 52,
3760+ "output": 101,
3761+ "cachedInput": 0,
3762+ "reasoning": 72
3763+ },
3764+ "api": "responses",
3765+ "raw": {
3766+ "status": "completed",
3767+ "incomplete": null
3768+ },
3769+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
3770+ "costUsd": 0.00329
3771+ },
3772+ {
3773+ "test": "tools",
3774+ "ok": true,
3775+ "latencyMs": 1006,
3776+ "usage": {
3777+ "input": 69,
3778+ "output": 22,
3779+ "cachedInput": 0,
3780+ "reasoning": 0
3781+ },
3782+ "api": "responses",
3783+ "raw": {
3784+ "status": "completed",
3785+ "incomplete": null
3786+ },
3787+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3788+ "costUsd": 0.001005
3789+ },
3790+ {
3791+ "test": "vision",
3792+ "ok": true,
3793+ "latencyMs": 1236,
3794+ "usage": {
3795+ "input": 194,
3796+ "output": 35,
3797+ "cachedInput": 0,
3798+ "reasoning": 21
3799+ },
3800+ "api": "responses",
3801+ "raw": {
3802+ "status": "completed",
3803+ "incomplete": null
3804+ },
3805+ "sample": "circles=3; other=square",
3806+ "costUsd": 0.00202
3807+ },
3808+ {
3809+ "test": "longctx",
3810+ "ok": true,
3811+ "latencyMs": 1891,
3812+ "usage": {
3813+ "input": 9134,
3814+ "output": 67,
3815+ "cachedInput": 0,
3816+ "reasoning": 56
3817+ },
3818+ "api": "responses",
3819+ "raw": {
3820+ "status": "completed",
3821+ "incomplete": null
3822+ },
3823+ "sample": "7431-ALPHA",
3824+ "costUsd": 0.04768
3825+ },
3826+ {
3827+ "test": "streaming",
3828+ "ok": true,
3829+ "latencyMs": 1572,
3830+ "ttftMs": 730,
3831+ "usage": {
3832+ "input": 15,
3833+ "output": 22,
3834+ "cachedInput": 0,
3835+ "reasoning": 0
3836+ },
3837+ "api": "responses",
3838+ "sample": "Snow veils old Quebec \nPines whisper in frozen light \nMaple dreams of spring",
3839+ "costUsd": 0.000735
3840+ }
3841+ ],
3842+ "api": "responses"
3843+ },
3844+ "gpt-5.5-pro": {
3845+ "provider": "openai",
3846+ "kind": "chat-pro",
3847+ "tests": [
3848+ {
3849+ "test": "basic",
3850+ "ok": true,
3851+ "latencyMs": 4383,
3852+ "usage": {
3853+ "input": 19,
3854+ "output": 34,
3855+ "cachedInput": 0,
3856+ "reasoning": 26
3857+ },
3858+ "api": "responses",
3859+ "raw": {
3860+ "status": "completed",
3861+ "incomplete": null
3862+ },
3863+ "sample": "Ottawa",
3864+ "costUsd": 0.00669
3865+ },
3866+ {
3867+ "test": "reasoning",
3868+ "ok": true,
3869+ "latencyMs": 5531,
3870+ "usage": {
3871+ "input": 42,
3872+ "output": 123,
3873+ "cachedInput": 0,
3874+ "reasoning": 92
3875+ },
3876+ "api": "responses",
3877+ "raw": {
3878+ "status": "completed",
3879+ "incomplete": null
3880+ },
3881+ "sample": "Alice’s brothers have Alice plus her 2 sisters as sisters, so each brother has 3 sisters.\n\nANSWER: 3",
3882+ "costUsd": 0.0234
3883+ },
3884+ {
3885+ "test": "json",
3886+ "ok": true,
3887+ "latencyMs": 10439,
3888+ "usage": {
3889+ "input": 52,
3890+ "output": 149,
3891+ "cachedInput": 0,
3892+ "reasoning": 120
3893+ },
3894+ "api": "responses",
3895+ "raw": {
3896+ "status": "completed",
3897+ "incomplete": null
3898+ },
3899+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
3900+ "costUsd": 0.02838
3901+ },
3902+ {
3903+ "test": "tools",
3904+ "ok": true,
3905+ "latencyMs": 11055,
3906+ "usage": {
3907+ "input": 69,
3908+ "output": 22,
3909+ "cachedInput": 0,
3910+ "reasoning": 0
3911+ },
3912+ "api": "responses",
3913+ "raw": {
3914+ "status": "completed",
3915+ "incomplete": null
3916+ },
3917+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
3918+ "costUsd": 0.00603
3919+ }
3920+ ],
3921+ "api": "responses"
3922+ },
3923+ "gpt-5.6-luna": {
3924+ "provider": "openai",
3925+ "kind": "chat",
3926+ "tests": [
3927+ {
3928+ "test": "reasoning",
3929+ "ok": true,
3930+ "latencyMs": 1453,
3931+ "usage": {
3932+ "input": 42,
3933+ "output": 61,
3934+ "cachedInput": 0,
3935+ "reasoning": 29
3936+ },
3937+ "api": "responses",
3938+ "raw": {
3939+ "status": "completed",
3940+ "incomplete": null
3941+ },
3942+ "sample": "Each of Alice’s brothers has Alice and her 2 sisters as sisters, so each has 3 sisters.\n\nANSWER: 3",
3943+ "costUsd": 0.0000816
3944+ },
3945+ {
3946+ "test": "math",
3947+ "ok": true,
3948+ "latencyMs": 1256,
3949+ "usage": {
3950+ "input": 50,
3951+ "output": 46,
3952+ "cachedInput": 0,
3953+ "reasoning": 33
3954+ },
3955+ "api": "responses",
3956+ "raw": {
3957+ "status": "completed",
3958+ "incomplete": null
3959+ },
3960+ "sample": "a=403;b=2500",
3961+ "costUsd": 0.00006519999999999999
3962+ },
3963+ {
3964+ "test": "code",
3965+ "ok": true,
3966+ "latencyMs": 2650,
3967+ "usage": {
3968+ "input": 49,
3969+ "output": 172,
3970+ "cachedInput": 0,
3971+ "reasoning": 73
3972+ },
3973+ "api": "responses",
3974+ "raw": {
3975+ "status": "completed",
3976+ "incomplete": null
3977+ },
3978+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
3979+ "costUsd": 0.00021620000000000002
3980+ },
3981+ {
3982+ "test": "french",
3983+ "ok": true,
3984+ "latencyMs": 1716,
3985+ "usage": {
3986+ "input": 31,
3987+ "output": 69,
3988+ "cachedInput": 0,
3989+ "reasoning": 0
3990+ },
3991+ "api": "responses",
3992+ "raw": {
3993+ "status": "completed",
3994+ "incomplete": null
3995+ },
3996+ "sample": "La méthode du coût en évaluation immobilière estime la valeur d’un bien en additionnant le coût actuel de reconstruction ou de remplacement du bâtiment et la valeur du terrain. Elle déduit ensuite la dépréciation liée à l’âge, à l’usure, à l’obsolescence ou aux défauts du bien.",
3997+ "costUsd": 0.000089
3998+ },
3999+ {
4000+ "test": "english",
4001+ "ok": true,
4002+ "latencyMs": 1581,
4003+ "usage": {
4004+ "input": 20,
4005+ "output": 54,
4006+ "cachedInput": 0,
4007+ "reasoning": 0
4008+ },
4009+ "api": "responses",
4010+ "raw": {
4011+ "status": "completed",
4012+ "incomplete": null
4013+ },
4014+ "sample": "A hedonic pricing model estimates how the individual characteristics of a differentiated good or service contribute to its overall price. It is commonly used to value nonmarket attributes—such as housing location, environmental quality, or product features—by analyzing observed price differences.",
4015+ "costUsd": 0.00006879999999999999
4016+ },
4017+ {
4018+ "test": "json",
4019+ "ok": true,
4020+ "latencyMs": 2404,
4021+ "usage": {
4022+ "input": 52,
4023+ "output": 158,
4024+ "cachedInput": 0,
4025+ "reasoning": 129
4026+ },
4027+ "api": "responses",
4028+ "raw": {
4029+ "status": "completed",
4030+ "incomplete": null
4031+ },
4032+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
4033+ "costUsd": 0.0002
4034+ },
4035+ {
4036+ "test": "tools",
4037+ "ok": true,
4038+ "latencyMs": 964,
4039+ "usage": {
4040+ "input": 69,
4041+ "output": 22,
4042+ "cachedInput": 0,
4043+ "reasoning": 0
4044+ },
4045+ "api": "responses",
4046+ "raw": {
4047+ "status": "completed",
4048+ "incomplete": null
4049+ },
4050+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
4051+ "costUsd": 0.0000402
4052+ },
4053+ {
4054+ "test": "vision",
4055+ "ok": true,
4056+ "latencyMs": 1008,
4057+ "usage": {
4058+ "input": 194,
4059+ "output": 12,
4060+ "cachedInput": 0,
4061+ "reasoning": 0
4062+ },
4063+ "api": "responses",
4064+ "raw": {
4065+ "status": "completed",
4066+ "incomplete": null
4067+ },
4068+ "sample": "circles=3; other=square",
4069+ "costUsd": 0.000053200000000000006
4070+ },
4071+ {
4072+ "test": "longctx",
4073+ "ok": true,
4074+ "latencyMs": 1069,
4075+ "usage": {
4076+ "input": 9134,
4077+ "output": 37,
4078+ "cachedInput": 0,
4079+ "reasoning": 26
4080+ },
4081+ "api": "responses",
4082+ "raw": {
4083+ "status": "completed",
4084+ "incomplete": null
4085+ },
4086+ "sample": "7431-ALPHA",
4087+ "costUsd": 0.0018712000000000004
4088+ },
4089+ {
4090+ "test": "basic",
4091+ "ok": true,
4092+ "latencyMs": 1399,
4093+ "usage": {
4094+ "input": 19,
4095+ "output": 6,
4096+ "cachedInput": 0,
4097+ "reasoning": 0
4098+ },
4099+ "api": "responses",
4100+ "raw": {
4101+ "status": "completed",
4102+ "incomplete": null
4103+ },
4104+ "sample": "Ottawa",
4105+ "costUsd": 0.000011
4106+ },
4107+ {
4108+ "test": "streaming",
4109+ "ok": true,
4110+ "latencyMs": 3609,
4111+ "ttftMs": 3271,
4112+ "usage": {
4113+ "input": 15,
4114+ "output": 336,
4115+ "cachedInput": 0,
4116+ "reasoning": 311
4117+ },
4118+ "api": "responses",
4119+ "sample": "Quebec snowflakes fall \nThrough the pine forests, moonlight \nChurch bells fade in snow",
4120+ "costUsd": 0.0004062
4121+ }
4122+ ],
4123+ "api": "responses"
4124+ },
4125+ "gpt-5.6-sol": {
4126+ "provider": "openai",
4127+ "kind": "chat",
4128+ "tests": [
4129+ {
4130+ "test": "basic",
4131+ "ok": true,
4132+ "latencyMs": 839,
4133+ "usage": {
4134+ "input": 19,
4135+ "output": 6,
4136+ "cachedInput": 0,
4137+ "reasoning": 0
4138+ },
4139+ "api": "responses",
4140+ "raw": {
4141+ "status": "completed",
4142+ "incomplete": null
4143+ },
4144+ "sample": "Ottawa",
4145+ "costUsd": 0.000196
4146+ },
4147+ {
4148+ "test": "reasoning",
4149+ "ok": true,
4150+ "latencyMs": 1594,
4151+ "usage": {
4152+ "input": 42,
4153+ "output": 60,
4154+ "cachedInput": 0,
4155+ "reasoning": 24
4156+ },
4157+ "api": "responses",
4158+ "raw": {
4159+ "status": "completed",
4160+ "incomplete": null
4161+ },
4162+ "sample": "Alice’s brothers share the same siblings. Each brother has Alice plus her 2 sisters, for a total of 3 sisters.\n\nANSWER: 3",
4163+ "costUsd": 0.001368
4164+ },
4165+ {
4166+ "test": "math",
4167+ "ok": true,
4168+ "latencyMs": 776,
4169+ "usage": {
4170+ "input": 50,
4171+ "output": 11,
4172+ "cachedInput": 0,
4173+ "reasoning": 0
4174+ },
4175+ "api": "responses",
4176+ "raw": {
4177+ "status": "completed",
4178+ "incomplete": null
4179+ },
4180+ "sample": "a=403;b=2500",
4181+ "costUsd": 0.00042
4182+ },
4183+ {
4184+ "test": "code",
4185+ "ok": true,
4186+ "latencyMs": 1554,
4187+ "usage": {
4188+ "input": 49,
4189+ "output": 97,
4190+ "cachedInput": 0,
4191+ "reasoning": 0
4192+ },
4193+ "api": "responses",
4194+ "raw": {
4195+ "status": "completed",
4196+ "incomplete": null
4197+ },
4198+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
4199+ "costUsd": 0.002136
4200+ },
4201+ {
4202+ "test": "french",
4203+ "ok": true,
4204+ "latencyMs": 1922,
4205+ "usage": {
4206+ "input": 31,
4207+ "output": 112,
4208+ "cachedInput": 0,
4209+ "reasoning": 40
4210+ },
4211+ "api": "responses",
4212+ "raw": {
4213+ "status": "completed",
4214+ "incomplete": null
4215+ },
4216+ "sample": "La méthode du coût estime la valeur d’un bien immobilier en additionnant la valeur du terrain au coût de reconstruction ou de remplacement des bâtiments, puis en déduisant leur dépréciation. Elle est surtout utilisée pour les biens récents, spécialisés ou rarement vendus, lorsque les comparaisons de",
4217+ "costUsd": 0.002364
4218+ },
4219+ {
4220+ "test": "english",
4221+ "ok": true,
4222+ "latencyMs": 1307,
4223+ "usage": {
4224+ "input": 20,
4225+ "output": 64,
4226+ "cachedInput": 0,
4227+ "reasoning": 13
4228+ },
4229+ "api": "responses",
4230+ "raw": {
4231+ "status": "completed",
4232+ "incomplete": null
4233+ },
4234+ "sample": "A hedonic pricing model estimates an asset’s value by analyzing how its individual characteristics affect its price. It is commonly used in real estate to measure the value of features such as location, size, amenities, and environmental quality.",
4235+ "costUsd": 0.00136
4236+ },
4237+ {
4238+ "test": "json",
4239+ "ok": true,
4240+ "latencyMs": 1527,
4241+ "usage": {
4242+ "input": 52,
4243+ "output": 77,
4244+ "cachedInput": 0,
4245+ "reasoning": 48
4246+ },
4247+ "api": "responses",
4248+ "raw": {
4249+ "status": "completed",
4250+ "incomplete": null
4251+ },
4252+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
4253+ "costUsd": 0.001748
4254+ },
4255+ {
4256+ "test": "tools",
4257+ "ok": true,
4258+ "latencyMs": 691,
4259+ "usage": {
4260+ "input": 69,
4261+ "output": 22,
4262+ "cachedInput": 0,
4263+ "reasoning": 0
4264+ },
4265+ "api": "responses",
4266+ "raw": {
4267+ "status": "completed",
4268+ "incomplete": null
4269+ },
4270+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
4271+ "costUsd": 0.000716
4272+ },
4273+ {
4274+ "test": "vision",
4275+ "ok": true,
4276+ "latencyMs": 777,
4277+ "usage": {
4278+ "input": 194,
4279+ "output": 12,
4280+ "cachedInput": 0,
4281+ "reasoning": 0
4282+ },
4283+ "api": "responses",
4284+ "raw": {
4285+ "status": "completed",
4286+ "incomplete": null
4287+ },
4288+ "sample": "circles=3; other=square",
4289+ "costUsd": 0.001016
4290+ },
4291+ {
4292+ "test": "longctx",
4293+ "ok": true,
4294+ "latencyMs": 1025,
4295+ "usage": {
4296+ "input": 9134,
4297+ "output": 9,
4298+ "cachedInput": 0,
4299+ "reasoning": 0
4300+ },
4301+ "api": "responses",
4302+ "raw": {
4303+ "status": "completed",
4304+ "incomplete": null
4305+ },
4306+ "sample": "7431-ALPHA",
4307+ "costUsd": 0.036716
4308+ },
4309+ {
4310+ "test": "streaming",
4311+ "ok": true,
4312+ "latencyMs": 2541,
4313+ "ttftMs": 2268,
4314+ "usage": {
4315+ "input": 15,
4316+ "output": 110,
4317+ "cachedInput": 0,
4318+ "reasoning": 86
4319+ },
4320+ "api": "responses",
4321+ "sample": "Snow veils old Quebec \nMaples sleep by frozen streams \nBlue dusk warms the roofs",
4322+ "costUsd": 0.00226
4323+ }
4324+ ],
4325+ "api": "responses"
4326+ },
4327+ "gpt-5.6-terra": {
4328+ "provider": "openai",
4329+ "kind": "chat",
4330+ "tests": [
4331+ {
4332+ "test": "basic",
4333+ "ok": true,
4334+ "latencyMs": 859,
4335+ "usage": {
4336+ "input": 19,
4337+ "output": 6,
4338+ "cachedInput": 0,
4339+ "reasoning": 0
4340+ },
4341+ "api": "responses",
4342+ "raw": {
4343+ "status": "completed",
4344+ "incomplete": null
4345+ },
4346+ "sample": "Ottawa",
4347+ "costUsd": 0.00011
4348+ },
4349+ {
4350+ "test": "reasoning",
4351+ "ok": true,
4352+ "latencyMs": 1206,
4353+ "usage": {
4354+ "input": 42,
4355+ "output": 52,
4356+ "cachedInput": 0,
4357+ "reasoning": 23
4358+ },
4359+ "api": "responses",
4360+ "raw": {
4361+ "status": "completed",
4362+ "incomplete": null
4363+ },
4364+ "sample": "Alice and her 2 sisters make 3 sisters total. Each brother has 3 sisters.\n\nANSWER: 3",
4365+ "costUsd": 0.000708
4366+ },
4367+ {
4368+ "test": "math",
4369+ "ok": true,
4370+ "latencyMs": 1006,
4371+ "usage": {
4372+ "input": 50,
4373+ "output": 45,
4374+ "cachedInput": 0,
4375+ "reasoning": 32
4376+ },
4377+ "api": "responses",
4378+ "raw": {
4379+ "status": "completed",
4380+ "incomplete": null
4381+ },
4382+ "sample": "a=403;b=2500",
4383+ "costUsd": 0.00064
4384+ },
4385+ {
4386+ "test": "code",
4387+ "ok": true,
4388+ "latencyMs": 1223,
4389+ "usage": {
4390+ "input": 49,
4391+ "output": 97,
4392+ "cachedInput": 0,
4393+ "reasoning": 0
4394+ },
4395+ "api": "responses",
4396+ "raw": {
4397+ "status": "completed",
4398+ "incomplete": null
4399+ },
4400+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
4401+ "costUsd": 0.001262
4402+ },
4403+ {
4404+ "test": "french",
4405+ "ok": true,
4406+ "latencyMs": 1999,
4407+ "usage": {
4408+ "input": 31,
4409+ "output": 86,
4410+ "cachedInput": 0,
4411+ "reasoning": 0
4412+ },
4413+ "api": "responses",
4414+ "raw": {
4415+ "status": "completed",
4416+ "incomplete": null
4417+ },
4418+ "sample": "La méthode du coût estime la valeur d’un bien immobilier en additionnant la valeur du terrain et le coût de reconstruction à neuf du bâtiment, puis en déduisant la dépréciation liée notamment à l’âge, à l’usure ou à l’obsolescence. Elle est particulièrement utilisée pour les immeubles récents, atypi",
4419+ "costUsd": 0.001094
4420+ },
4421+ {
4422+ "test": "english",
4423+ "ok": true,
4424+ "latencyMs": 1414,
4425+ "usage": {
4426+ "input": 20,
4427+ "output": 62,
4428+ "cachedInput": 0,
4429+ "reasoning": 0
4430+ },
4431+ "api": "responses",
4432+ "raw": {
4433+ "status": "completed",
4434+ "incomplete": null
4435+ },
4436+ "sample": "A hedonic pricing model estimates how the price of a good reflects the value of its individual characteristics, such as a house’s size, location, number of bedrooms, and school quality. By statistically relating observed prices to these attributes, it can estimate the implicit price buyers place on ",
4437+ "costUsd": 0.000784
4438+ },
4439+ {
4440+ "test": "json",
4441+ "ok": true,
4442+ "latencyMs": 1214,
4443+ "usage": {
4444+ "input": 52,
4445+ "output": 63,
4446+ "cachedInput": 0,
4447+ "reasoning": 34
4448+ },
4449+ "api": "responses",
4450+ "raw": {
4451+ "status": "completed",
4452+ "incomplete": null
4453+ },
4454+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
4455+ "costUsd": 0.00086
4456+ },
4457+ {
4458+ "test": "tools",
4459+ "ok": true,
4460+ "latencyMs": 716,
4461+ "usage": {
4462+ "input": 69,
4463+ "output": 22,
4464+ "cachedInput": 0,
4465+ "reasoning": 0
4466+ },
4467+ "api": "responses",
4468+ "raw": {
4469+ "status": "completed",
4470+ "incomplete": null
4471+ },
4472+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
4473+ "costUsd": 0.000402
4474+ },
4475+ {
4476+ "test": "vision",
4477+ "ok": true,
4478+ "latencyMs": 806,
4479+ "usage": {
4480+ "input": 194,
4481+ "output": 12,
4482+ "cachedInput": 0,
4483+ "reasoning": 0
4484+ },
4485+ "api": "responses",
4486+ "raw": {
4487+ "status": "completed",
4488+ "incomplete": null
4489+ },
4490+ "sample": "circles=3; other=square",
4491+ "costUsd": 0.000532
4492+ },
4493+ {
4494+ "test": "longctx",
4495+ "ok": false,
4496+ "latencyMs": 1322,
4497+ "usage": {
4498+ "input": 9134,
4499+ "output": 51,
4500+ "cachedInput": 0,
4501+ "reasoning": 35
4502+ },
4503+ "api": "responses",
4504+ "raw": {
4505+ "status": "completed",
4506+ "incomplete": null
4507+ },
4508+ "sample": "Je ne peux pas divulguer de code secret.",
4509+ "costUsd": 0.01888
4510+ },
4511+ {
4512+ "test": "streaming",
4513+ "ok": true,
4514+ "latencyMs": 1116,
4515+ "ttftMs": 611,
4516+ "usage": {
4517+ "input": 15,
4518+ "output": 25,
4519+ "cachedInput": 0,
4520+ "reasoning": 0
4521+ },
4522+ "api": "responses",
4523+ "sample": "Snow hushes pine boughs \nSt. Lawrence breathes silver mist \nQuébec dreams in white",
4524+ "costUsd": 0.00033
4525+ }
4526+ ],
4527+ "api": "responses"
4528+ },
4529+ "gpt-6-astra": {
4530+ "provider": "openai",
4531+ "kind": "chat",
4532+ "tests": [
4533+ {
4534+ "test": "basic",
4535+ "ok": true,
4536+ "latencyMs": 1616,
4537+ "usage": {
4538+ "input": 19,
4539+ "output": 6,
4540+ "cachedInput": 0,
4541+ "reasoning": 0
4542+ },
4543+ "api": "responses",
4544+ "raw": {
4545+ "status": "completed",
4546+ "incomplete": null
4547+ },
4548+ "sample": "Ottawa",
4549+ "costUsd": 0.00049
4550+ },
4551+ {
4552+ "test": "reasoning",
4553+ "ok": true,
4554+ "latencyMs": 2021,
4555+ "usage": {
4556+ "input": 42,
4557+ "output": 43,
4558+ "cachedInput": 0,
4559+ "reasoning": 14
4560+ },
4561+ "api": "responses",
4562+ "raw": {
4563+ "status": "completed",
4564+ "incomplete": null
4565+ },
4566+ "sample": "Each brother has Alice and her 2 sisters as sisters, for a total of 3.\n\nANSWER: 3",
4567+ "costUsd": 0.00257
4568+ },
4569+ {
4570+ "test": "math",
4571+ "ok": true,
4572+ "latencyMs": 1203,
4573+ "usage": {
4574+ "input": 50,
4575+ "output": 28,
4576+ "cachedInput": 0,
4577+ "reasoning": 15
4578+ },
4579+ "api": "responses",
4580+ "raw": {
4581+ "status": "completed",
4582+ "incomplete": null
4583+ },
4584+ "sample": "a=403;b=2500",
4585+ "costUsd": 0.0019
4586+ },
4587+ {
4588+ "test": "code",
4589+ "ok": true,
4590+ "latencyMs": 2190,
4591+ "usage": {
4592+ "input": 49,
4593+ "output": 122,
4594+ "cachedInput": 0,
4595+ "reasoning": 0
4596+ },
4597+ "api": "responses",
4598+ "raw": {
4599+ "status": "completed",
4600+ "incomplete": null
4601+ },
4602+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n\n for (let i = 5; i <= Math.sqrt(n); i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n\n return true;\n}\n```",
4603+ "costUsd": 0.00659
4604+ },
4605+ {
4606+ "test": "french",
4607+ "ok": true,
4608+ "latencyMs": 3449,
4609+ "usage": {
4610+ "input": 31,
4611+ "output": 107,
4612+ "cachedInput": 0,
4613+ "reasoning": 21
4614+ },
4615+ "api": "responses",
4616+ "raw": {
4617+ "status": "completed",
4618+ "incomplete": null
4619+ },
4620+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût actuel de reconstruction ou de remplacement du bâtiment, puis en déduisant sa dépréciation liée à l’usure et à l’obsolescence. Elle est particulièrement utile pour les ",
4621+ "costUsd": 0.00566
4622+ },
4623+ {
4624+ "test": "english",
4625+ "ok": true,
4626+ "latencyMs": 3273,
4627+ "usage": {
4628+ "input": 20,
4629+ "output": 72,
4630+ "cachedInput": 0,
4631+ "reasoning": 19
4632+ },
4633+ "api": "responses",
4634+ "raw": {
4635+ "status": "completed",
4636+ "incomplete": null
4637+ },
4638+ "sample": "A hedonic pricing model estimates how individual characteristics of a product or asset contribute to its market price. For example, it can estimate how a home’s size, location, and proximity to parks affect its value while holding other factors constant.",
4639+ "costUsd": 0.0038
4640+ },
4641+ {
4642+ "test": "json",
4643+ "ok": true,
4644+ "latencyMs": 2595,
4645+ "usage": {
4646+ "input": 52,
4647+ "output": 56,
4648+ "cachedInput": 0,
4649+ "reasoning": 27
4650+ },
4651+ "api": "responses",
4652+ "raw": {
4653+ "status": "completed",
4654+ "incomplete": null
4655+ },
4656+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
4657+ "costUsd": 0.00332
4658+ },
4659+ {
4660+ "test": "tools",
4661+ "ok": true,
4662+ "latencyMs": 1414,
4663+ "usage": {
4664+ "input": 69,
4665+ "output": 22,
4666+ "cachedInput": 0,
4667+ "reasoning": 0
4668+ },
4669+ "api": "responses",
4670+ "raw": {
4671+ "status": "completed",
4672+ "incomplete": null
4673+ },
4674+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
4675+ "costUsd": 0.00179
4676+ },
4677+ {
4678+ "test": "vision",
4679+ "ok": true,
4680+ "latencyMs": 1797,
4681+ "usage": {
4682+ "input": 194,
4683+ "output": 12,
4684+ "cachedInput": 0,
4685+ "reasoning": 0
4686+ },
4687+ "api": "responses",
4688+ "raw": {
4689+ "status": "completed",
4690+ "incomplete": null
4691+ },
4692+ "sample": "circles=3; other=square",
4693+ "costUsd": 0.00254
4694+ },
4695+ {
4696+ "test": "longctx",
4697+ "ok": true,
4698+ "latencyMs": 1398,
4699+ "usage": {
4700+ "input": 9134,
4701+ "output": 9,
4702+ "cachedInput": 0,
4703+ "reasoning": 0
4704+ },
4705+ "api": "responses",
4706+ "raw": {
4707+ "status": "completed",
4708+ "incomplete": null
4709+ },
4710+ "sample": "7431-ALPHA",
4711+ "costUsd": 0.09179
4712+ },
4713+ {
4714+ "test": "streaming",
4715+ "ok": true,
4716+ "latencyMs": 4253,
4717+ "ttftMs": 3799,
4718+ "usage": {
4719+ "input": 15,
4720+ "output": 185,
4721+ "cachedInput": 0,
4722+ "reasoning": 163
4723+ },
4724+ "api": "responses",
4725+ "sample": "Snow blankets Quebec \nCold winds sweep the frozen streets \nMaples dream of spring",
4726+ "costUsd": 0.0094
4727+ }
4728+ ],
4729+ "api": "responses"
4730+ },
4731+ "gpt-6-luna": {
4732+ "provider": "openai",
4733+ "kind": "chat",
4734+ "tests": [
4735+ {
4736+ "test": "reasoning",
4737+ "ok": true,
4738+ "latencyMs": 1809,
4739+ "usage": {
4740+ "input": 42,
4741+ "output": 95,
4742+ "cachedInput": 0,
4743+ "reasoning": 68
4744+ },
4745+ "api": "responses",
4746+ "raw": {
4747+ "status": "completed",
4748+ "incomplete": null
4749+ },
4750+ "sample": "Each brother has Alice and her 2 sisters, so each has 3 sisters.\n\nANSWER: 3",
4751+ "costUsd": 0.0000517
4752+ },
4753+ {
4754+ "test": "math",
4755+ "ok": true,
4756+ "latencyMs": 1019,
4757+ "usage": {
4758+ "input": 50,
4759+ "output": 53,
4760+ "cachedInput": 0,
4761+ "reasoning": 40
4762+ },
4763+ "api": "responses",
4764+ "raw": {
4765+ "status": "completed",
4766+ "incomplete": null
4767+ },
4768+ "sample": "a=403;b=2500",
4769+ "costUsd": 0.0000315
4770+ },
4771+ {
4772+ "test": "code",
4773+ "ok": true,
4774+ "latencyMs": 2834,
4775+ "usage": {
4776+ "input": 49,
4777+ "output": 219,
4778+ "cachedInput": 0,
4779+ "reasoning": 120
4780+ },
4781+ "api": "responses",
4782+ "raw": {
4783+ "status": "completed",
4784+ "incomplete": null
4785+ },
4786+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i <= Math.sqrt(n); i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
4787+ "costUsd": 0.0001144
4788+ },
4789+ {
4790+ "test": "french",
4791+ "ok": true,
4792+ "latencyMs": 2005,
4793+ "usage": {
4794+ "input": 31,
4795+ "output": 126,
4796+ "cachedInput": 0,
4797+ "reasoning": 43
4798+ },
4799+ "api": "responses",
4800+ "raw": {
4801+ "status": "completed",
4802+ "incomplete": null
4803+ },
4804+ "sample": "La méthode du coût estime la valeur d’un bien en additionnant la valeur du terrain et le coût de reconstruction ou de remplacement du bâtiment, puis en déduisant la dépréciation et l’obsolescence. Elle est particulièrement utile pour les biens récents ou atypiques, mais peut être moins fiable lorsqu",
4805+ "costUsd": 0.0000661
4806+ },
4807+ {
4808+ "test": "english",
4809+ "ok": true,
4810+ "latencyMs": 2286,
4811+ "usage": {
4812+ "input": 20,
4813+ "output": 94,
4814+ "cachedInput": 0,
4815+ "reasoning": 43
4816+ },
4817+ "api": "responses",
4818+ "raw": {
4819+ "status": "completed",
4820+ "incomplete": null
4821+ },
4822+ "sample": "A hedonic pricing model estimates how much individual features of a product or service contribute to its market price. It typically uses statistical analysis to separate the value associated with characteristics such as a home’s size, location, and amenities.",
4823+ "costUsd": 0.000049
4824+ },
4825+ {
4826+ "test": "json",
4827+ "ok": true,
4828+ "latencyMs": 2719,
4829+ "usage": {
4830+ "input": 52,
4831+ "output": 190,
4832+ "cachedInput": 0,
4833+ "reasoning": 161
4834+ },
4835+ "api": "responses",
4836+ "raw": {
4837+ "status": "completed",
4838+ "incomplete": null
4839+ },
4840+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":300000}",
4841+ "costUsd": 0.0001002
4842+ },
4843+ {
4844+ "test": "tools",
4845+ "ok": true,
4846+ "latencyMs": 1070,
4847+ "usage": {
4848+ "input": 69,
4849+ "output": 22,
4850+ "cachedInput": 0,
4851+ "reasoning": 0
4852+ },
4853+ "api": "responses",
4854+ "raw": {
4855+ "status": "completed",
4856+ "incomplete": null
4857+ },
4858+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
4859+ "costUsd": 0.000017899999999999998
4860+ },
4861+ {
4862+ "test": "vision",
4863+ "ok": true,
4864+ "latencyMs": 1181,
4865+ "usage": {
4866+ "input": 194,
4867+ "output": 30,
4868+ "cachedInput": 0,
4869+ "reasoning": 16
4870+ },
4871+ "api": "responses",
4872+ "raw": {
4873+ "status": "completed",
4874+ "incomplete": null
4875+ },
4876+ "sample": "circles=3; other=square",
4877+ "costUsd": 0.0000344
4878+ },
4879+ {
4880+ "test": "longctx",
4881+ "ok": true,
4882+ "latencyMs": 1216,
4883+ "usage": {
4884+ "input": 9134,
4885+ "output": 37,
4886+ "cachedInput": 0,
4887+ "reasoning": 26
4888+ },
4889+ "api": "responses",
4890+ "raw": {
4891+ "status": "completed",
4892+ "incomplete": null
4893+ },
4894+ "sample": "7431-ALPHA",
4895+ "costUsd": 0.0009319
4896+ },
4897+ {
4898+ "test": "basic",
4899+ "ok": true,
4900+ "latencyMs": 1368,
4901+ "usage": {
4902+ "input": 19,
4903+ "output": 20,
4904+ "cachedInput": 0,
4905+ "reasoning": 12
4906+ },
4907+ "api": "responses",
4908+ "raw": {
4909+ "status": "completed",
4910+ "incomplete": null
4911+ },
4912+ "sample": "Ottawa",
4913+ "costUsd": 0.0000119
4914+ },
4915+ {
4916+ "test": "streaming",
4917+ "ok": true,
4918+ "latencyMs": 3344,
4919+ "ttftMs": 2952,
4920+ "usage": {
4921+ "input": 15,
4922+ "output": 253,
4923+ "cachedInput": 0,
4924+ "reasoning": 229
4925+ },
4926+ "api": "responses",
4927+ "sample": "Snow crowns old Quebec \nCold north winds cross the river \nLanterns glow through snow",
4928+ "costUsd": 0.000128
4929+ }
4930+ ],
4931+ "api": "responses"
4932+ },
4933+ "gpt-6-sol": {
4934+ "provider": "openai",
4935+ "kind": "chat",
4936+ "tests": [
4937+ {
4938+ "test": "basic",
4939+ "ok": true,
4940+ "latencyMs": 835,
4941+ "usage": {
4942+ "input": 19,
4943+ "output": 6,
4944+ "cachedInput": 0,
4945+ "reasoning": 0
4946+ },
4947+ "api": "responses",
4948+ "raw": {
4949+ "status": "completed",
4950+ "incomplete": null
4951+ },
4952+ "sample": "Ottawa",
4953+ "costUsd": 0.000098
4954+ },
4955+ {
4956+ "test": "reasoning",
4957+ "ok": true,
4958+ "latencyMs": 1516,
4959+ "usage": {
4960+ "input": 42,
4961+ "output": 49,
4962+ "cachedInput": 0,
4963+ "reasoning": 18
4964+ },
4965+ "api": "responses",
4966+ "raw": {
4967+ "status": "completed",
4968+ "incomplete": null
4969+ },
4970+ "sample": "Alice’s brothers each have Alice and her two sisters as sisters, so each has 3 sisters. ANSWER: 3",
4971+ "costUsd": 0.000574
4972+ },
4973+ {
4974+ "test": "math",
4975+ "ok": true,
4976+ "latencyMs": 989,
4977+ "usage": {
4978+ "input": 50,
4979+ "output": 34,
4980+ "cachedInput": 0,
4981+ "reasoning": 21
4982+ },
4983+ "api": "responses",
4984+ "raw": {
4985+ "status": "completed",
4986+ "incomplete": null
4987+ },
4988+ "sample": "a=403;b=2500",
4989+ "costUsd": 0.00044
4990+ },
4991+ {
4992+ "test": "code",
4993+ "ok": true,
4994+ "latencyMs": 2111,
4995+ "usage": {
4996+ "input": 49,
4997+ "output": 214,
4998+ "cachedInput": 0,
4999+ "reasoning": 115
5000+ },
5001+ "api": "responses",
5002+ "raw": {
5003+ "status": "completed",
5004+ "incomplete": null
5005+ },
5006+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isInteger(n) || n < 2) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n for (let i = 3; i * i <= n; i += 2) {\n if (n % i === 0) return false;\n }\n\n return true;\n}\n```",
5007+ "costUsd": 0.002238
5008+ },
5009+ {
5010+ "test": "french",
5011+ "ok": true,
5012+ "latencyMs": 1738,
5013+ "usage": {
5014+ "input": 31,
5015+ "output": 91,
5016+ "cachedInput": 0,
5017+ "reasoning": 30
5018+ },
5019+ "api": "responses",
5020+ "raw": {
5021+ "status": "completed",
5022+ "incomplete": null
5023+ },
5024+ "sample": "La méthode du coût estime la valeur d’un bien immobilier en additionnant la valeur du terrain au coût de reconstruction du bâtiment, puis en déduisant sa dépréciation. Elle est surtout utilisée pour les biens atypiques ou lorsqu’il existe peu de ventes comparables.",
5025+ "costUsd": 0.000972
5026+ },
5027+ {
5028+ "test": "english",
5029+ "ok": true,
5030+ "latencyMs": 1107,
5031+ "usage": {
5032+ "input": 20,
5033+ "output": 51,
5034+ "cachedInput": 0,
5035+ "reasoning": 0
5036+ },
5037+ "api": "responses",
5038+ "raw": {
5039+ "status": "completed",
5040+ "incomplete": null
5041+ },
5042+ "sample": "A hedonic pricing model estimates the value of a product or asset by examining how its features affect its price. For example, it can estimate how much a house’s location, size, or number of bedrooms contributes to its sale price.",
5043+ "costUsd": 0.00055
5044+ },
5045+ {
5046+ "test": "json",
5047+ "ok": true,
5048+ "latencyMs": 1636,
5049+ "usage": {
5050+ "input": 52,
5051+ "output": 74,
5052+ "cachedInput": 0,
5053+ "reasoning": 45
5054+ },
5055+ "api": "responses",
5056+ "raw": {
5057+ "status": "completed",
5058+ "incomplete": null
5059+ },
5060+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
5061+ "costUsd": 0.000844
5062+ },
5063+ {
5064+ "test": "tools",
5065+ "ok": true,
5066+ "latencyMs": 951,
5067+ "usage": {
5068+ "input": 69,
5069+ "output": 22,
5070+ "cachedInput": 0,
5071+ "reasoning": 0
5072+ },
5073+ "api": "responses",
5074+ "raw": {
5075+ "status": "completed",
5076+ "incomplete": null
5077+ },
5078+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
5079+ "costUsd": 0.000358
5080+ },
5081+ {
5082+ "test": "vision",
5083+ "ok": true,
5084+ "latencyMs": 963,
5085+ "usage": {
5086+ "input": 194,
5087+ "output": 12,
5088+ "cachedInput": 0,
5089+ "reasoning": 0
5090+ },
5091+ "api": "responses",
5092+ "raw": {
5093+ "status": "completed",
5094+ "incomplete": null
5095+ },
5096+ "sample": "circles=3; other=square",
5097+ "costUsd": 0.000508
5098+ },
5099+ {
5100+ "test": "longctx",
5101+ "ok": true,
5102+ "latencyMs": 1092,
5103+ "usage": {
5104+ "input": 9134,
5105+ "output": 37,
5106+ "cachedInput": 0,
5107+ "reasoning": 26
5108+ },
5109+ "api": "responses",
5110+ "raw": {
5111+ "status": "completed",
5112+ "incomplete": null
5113+ },
5114+ "sample": "7431-ALPHA",
5115+ "costUsd": 0.018638
5116+ },
5117+ {
5118+ "test": "streaming",
5119+ "ok": true,
5120+ "latencyMs": 1865,
5121+ "ttftMs": 1608,
5122+ "usage": {
5123+ "input": 15,
5124+ "output": 149,
5125+ "cachedInput": 0,
5126+ "reasoning": 124
5127+ },
5128+ "api": "responses",
5129+ "sample": "Snow veils old Quebec \nIce drifts down the Saint Lawrence \nMaples dream of spring",
5130+ "costUsd": 0.00152
5131+ }
5132+ ],
5133+ "api": "responses"
5134+ },
5135+ "gpt-6.1-sol": {
5136+ "provider": "openai",
5137+ "kind": "chat",
5138+ "tests": [
5139+ {
5140+ "test": "basic",
5141+ "ok": true,
5142+ "latencyMs": 1397,
5143+ "usage": {
5144+ "input": 19,
5145+ "output": 6,
5146+ "cachedInput": 0,
5147+ "reasoning": 0
5148+ },
5149+ "api": "responses",
5150+ "raw": {
5151+ "status": "completed",
5152+ "incomplete": null
5153+ },
5154+ "sample": "Ottawa",
5155+ "costUsd": 0.000098
5156+ },
5157+ {
5158+ "test": "reasoning",
5159+ "ok": true,
5160+ "latencyMs": 1848,
5161+ "usage": {
5162+ "input": 42,
5163+ "output": 45,
5164+ "cachedInput": 0,
5165+ "reasoning": 16
5166+ },
5167+ "api": "responses",
5168+ "raw": {
5169+ "status": "completed",
5170+ "incomplete": null
5171+ },
5172+ "sample": "Each brother has Alice and her 2 sisters as sisters, for a total of 3.\n\nANSWER: 3",
5173+ "costUsd": 0.000534
5174+ },
5175+ {
5176+ "test": "math",
5177+ "ok": true,
5178+ "latencyMs": 1424,
5179+ "usage": {
5180+ "input": 50,
5181+ "output": 29,
5182+ "cachedInput": 0,
5183+ "reasoning": 16
5184+ },
5185+ "api": "responses",
5186+ "raw": {
5187+ "status": "completed",
5188+ "incomplete": null
5189+ },
5190+ "sample": "a=403;b=2500",
5191+ "costUsd": 0.00039
5192+ },
5193+ {
5194+ "test": "code",
5195+ "ok": true,
5196+ "latencyMs": 2020,
5197+ "usage": {
5198+ "input": 49,
5199+ "output": 123,
5200+ "cachedInput": 0,
5201+ "reasoning": 0
5202+ },
5203+ "api": "responses",
5204+ "raw": {
5205+ "status": "completed",
5206+ "incomplete": null
5207+ },
5208+ "sample": "```js\nfunction isPrime(n) {\n if (!Number.isSafeInteger(n) || n < 2) return false;\n if (n === 2 || n === 3) return true;\n if (n % 2 === 0 || n % 3 === 0) return false;\n\n for (let i = 5; i <= Math.sqrt(n); i += 6) {\n if (n % i === 0 || n % (i + 2) === 0) return false;\n }\n\n return true;\n}\n```",
5209+ "costUsd": 0.001328
5210+ },
5211+ {
5212+ "test": "french",
5213+ "ok": true,
5214+ "latencyMs": 3055,
5215+ "usage": {
5216+ "input": 31,
5217+ "output": 87,
5218+ "cachedInput": 0,
5219+ "reasoning": 0
5220+ },
5221+ "api": "responses",
5222+ "raw": {
5223+ "status": "completed",
5224+ "incomplete": null
5225+ },
5226+ "sample": "La méthode du coût en évaluation immobilière consiste à estimer la valeur d’un bien en additionnant la valeur du terrain et le coût actuel de reconstruction du bâtiment, diminué de sa dépréciation liée à l’usure, à l’obsolescence ou à des facteurs externes. Elle est particulièrement utile pour les b",
5227+ "costUsd": 0.000932
5228+ },
5229+ {
5230+ "test": "english",
5231+ "ok": true,
5232+ "latencyMs": 2410,
5233+ "usage": {
5234+ "input": 20,
5235+ "output": 73,
5236+ "cachedInput": 0,
5237+ "reasoning": 11
5238+ },
5239+ "api": "responses",
5240+ "raw": {
5241+ "status": "completed",
5242+ "incomplete": null
5243+ },
5244+ "sample": "A hedonic pricing model estimates a product’s value by separating the contributions of its individual characteristics, such as a home’s size, location, and number of bedrooms. It uses observed market prices to estimate how much buyers are willing to pay for each characteristic, holding other factors",
5245+ "costUsd": 0.00077
5246+ },
5247+ {
5248+ "test": "json",
5249+ "ok": true,
5250+ "latencyMs": 2327,
5251+ "usage": {
5252+ "input": 52,
5253+ "output": 65,
5254+ "cachedInput": 0,
5255+ "reasoning": 36
5256+ },
5257+ "api": "responses",
5258+ "raw": {
5259+ "status": "completed",
5260+ "incomplete": null
5261+ },
5262+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
5263+ "costUsd": 0.000754
5264+ },
5265+ {
5266+ "test": "tools",
5267+ "ok": true,
5268+ "latencyMs": 1557,
5269+ "usage": {
5270+ "input": 69,
5271+ "output": 22,
5272+ "cachedInput": 0,
5273+ "reasoning": 0
5274+ },
5275+ "api": "responses",
5276+ "raw": {
5277+ "status": "completed",
5278+ "incomplete": null
5279+ },
5280+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
5281+ "costUsd": 0.000358
5282+ },
5283+ {
5284+ "test": "vision",
5285+ "ok": true,
5286+ "latencyMs": 1188,
5287+ "usage": {
5288+ "input": 194,
5289+ "output": 12,
5290+ "cachedInput": 0,
5291+ "reasoning": 0
5292+ },
5293+ "api": "responses",
5294+ "raw": {
5295+ "status": "completed",
5296+ "incomplete": null
5297+ },
5298+ "sample": "circles=3; other=square",
5299+ "costUsd": 0.000508
5300+ },
5301+ {
5302+ "test": "longctx",
5303+ "ok": true,
5304+ "latencyMs": 1358,
5305+ "usage": {
5306+ "input": 9134,
5307+ "output": 9,
5308+ "cachedInput": 0,
5309+ "reasoning": 0
5310+ },
5311+ "api": "responses",
5312+ "raw": {
5313+ "status": "completed",
5314+ "incomplete": null
5315+ },
5316+ "sample": "7431-ALPHA",
5317+ "costUsd": 0.018358
5318+ },
5319+ {
5320+ "test": "streaming",
5321+ "ok": true,
5322+ "latencyMs": 3362,
5323+ "ttftMs": 3051,
5324+ "usage": {
5325+ "input": 15,
5326+ "output": 142,
5327+ "cachedInput": 0,
5328+ "reasoning": 120
5329+ },
5330+ "api": "responses",
5331+ "sample": "Snow blankets Québec \nCold winds sweep the frozen streets \nChurch bells warm the night",
5332+ "costUsd": 0.00145
5333+ }
5334+ ],
5335+ "api": "responses"
5336+ },
5337+ "gpt-6.1-terra": {
5338+ "provider": "openai",
5339+ "kind": "chat",
5340+ "tests": [
5341+ {
5342+ "test": "basic",
5343+ "ok": true,
5344+ "latencyMs": 1679,
5345+ "usage": {
5346+ "input": 19,
5347+ "output": 6,
5348+ "cachedInput": 0,
5349+ "reasoning": 0
5350+ },
5351+ "api": "responses",
5352+ "raw": {
5353+ "status": "completed",
5354+ "incomplete": null
5355+ },
5356+ "sample": "Ottawa",
5357+ "costUsd": 0.000049
5358+ },
5359+ {
5360+ "test": "reasoning",
5361+ "ok": true,
5362+ "latencyMs": 1913,
5363+ "usage": {
5364+ "input": 42,
5365+ "output": 41,
5366+ "cachedInput": 0,
5367+ "reasoning": 19
5368+ },
5369+ "api": "responses",
5370+ "raw": {
5371+ "status": "completed",
5372+ "incomplete": null
5373+ },
5374+ "sample": "Each brother has Alice and her 2 sisters as sisters.\n\nANSWER: 3",
5375+ "costUsd": 0.000247
5376+ },
5377+ {
5378+ "test": "math",
5379+ "ok": true,
5380+ "latencyMs": 2414,
5381+ "usage": {
5382+ "input": 50,
5383+ "output": 37,
5384+ "cachedInput": 0,
5385+ "reasoning": 24
5386+ },
5387+ "api": "responses",
5388+ "raw": {
5389+ "status": "completed",
5390+ "incomplete": null
5391+ },
5392+ "sample": "a=403;b=2500",
5393+ "costUsd": 0.000235
5394+ },
5395+ {
5396+ "test": "code",
5397+ "ok": true,
5398+ "latencyMs": 2772,
5399+ "usage": {
5400+ "input": 49,
5401+ "output": 139,
5402+ "cachedInput": 0,
5403+ "reasoning": 74
5404+ },
5405+ "api": "responses",
5406+ "raw": {
5407+ "status": "completed",
5408+ "incomplete": null
5409+ },
5410+ "sample": "```js\nfunction isPrime(n) {\n if (n < 2) return false;\n for (let i = 2; i * i <= n; i++) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
5411+ "costUsd": 0.000744
5412+ },
5413+ {
5414+ "test": "french",
5415+ "ok": true,
5416+ "latencyMs": 2289,
5417+ "usage": {
5418+ "input": 31,
5419+ "output": 67,
5420+ "cachedInput": 0,
5421+ "reasoning": 0
5422+ },
5423+ "api": "responses",
5424+ "raw": {
5425+ "status": "completed",
5426+ "incomplete": null
5427+ },
5428+ "sample": "La méthode du coût consiste à estimer la valeur d’un bien immobilier en additionnant la valeur du terrain et le coût actuel de construction d’un bâtiment équivalent. On déduit ensuite la dépréciation liée notamment à l’usure, à la vétusté et aux éventuelles obsolescences.",
5429+ "costUsd": 0.000366
5430+ },
5431+ {
5432+ "test": "english",
5433+ "ok": true,
5434+ "latencyMs": 1832,
5435+ "usage": {
5436+ "input": 20,
5437+ "output": 51,
5438+ "cachedInput": 0,
5439+ "reasoning": 0
5440+ },
5441+ "api": "responses",
5442+ "raw": {
5443+ "status": "completed",
5444+ "incomplete": null
5445+ },
5446+ "sample": "A hedonic pricing model estimates the value of a good by examining how its characteristics affect its price. For example, it can estimate how much features such as location, size, and number of bedrooms contribute to a home’s sale price.",
5447+ "costUsd": 0.000275
5448+ },
5449+ {
5450+ "test": "json",
5451+ "ok": true,
5452+ "latencyMs": 2208,
5453+ "usage": {
5454+ "input": 52,
5455+ "output": 105,
5456+ "cachedInput": 0,
5457+ "reasoning": 76
5458+ },
5459+ "api": "responses",
5460+ "raw": {
5461+ "status": "completed",
5462+ "incomplete": null
5463+ },
5464+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":300000}",
5465+ "costUsd": 0.000577
5466+ },
5467+ {
5468+ "test": "tools",
5469+ "ok": true,
5470+ "latencyMs": 1797,
5471+ "usage": {
5472+ "input": 69,
5473+ "output": 22,
5474+ "cachedInput": 0,
5475+ "reasoning": 0
5476+ },
5477+ "api": "responses",
5478+ "raw": {
5479+ "status": "completed",
5480+ "incomplete": null
5481+ },
5482+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
5483+ "costUsd": 0.000179
5484+ },
5485+ {
5486+ "test": "vision",
5487+ "ok": true,
5488+ "latencyMs": 1076,
5489+ "usage": {
5490+ "input": 194,
5491+ "output": 12,
5492+ "cachedInput": 0,
5493+ "reasoning": 0
5494+ },
5495+ "api": "responses",
5496+ "raw": {
5497+ "status": "completed",
5498+ "incomplete": null
5499+ },
5500+ "sample": "circles=3; other=square",
5501+ "costUsd": 0.000254
5502+ },
5503+ {
5504+ "test": "longctx",
5505+ "ok": true,
5506+ "latencyMs": 1390,
5507+ "usage": {
5508+ "input": 9134,
5509+ "output": 9,
5510+ "cachedInput": 0,
5511+ "reasoning": 0
5512+ },
5513+ "api": "responses",
5514+ "raw": {
5515+ "status": "completed",
5516+ "incomplete": null
5517+ },
5518+ "sample": "7431-ALPHA",
5519+ "costUsd": 0.009179
5520+ },
5521+ {
5522+ "test": "streaming",
5523+ "ok": true,
5524+ "latencyMs": 2287,
5525+ "ttftMs": 1841,
5526+ "usage": {
5527+ "input": 15,
5528+ "output": 107,
5529+ "cachedInput": 0,
5530+ "reasoning": 83
5531+ },
5532+ "api": "responses",
5533+ "sample": "Snow crowns Quebec roofs \nThe Saint Lawrence sleeps in ice \nCold stars gild the pines",
5534+ "costUsd": 0.00055
5535+ }
5536+ ],
5537+ "api": "responses"
5538+ },
5539+ "o1": {
5540+ "provider": "openai",
5541+ "kind": "chat",
5542+ "tests": [
5543+ {
5544+ "test": "basic",
5545+ "ok": false,
5546+ "latencyMs": 434,
5547+ "error": "404 404 The model `o1` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
5548+ }
5549+ ]
5550+ },
5551+ "o1-pro": {
5552+ "provider": "openai",
5553+ "kind": "chat-pro",
5554+ "tests": [
5555+ {
5556+ "test": "basic",
5557+ "ok": false,
5558+ "latencyMs": 241,
5559+ "error": "404 404 The model `o1-pro` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
5560+ }
5561+ ]
5562+ },
5563+ "o3": {
5564+ "provider": "openai",
5565+ "kind": "chat",
5566+ "tests": [
5567+ {
5568+ "test": "basic",
5569+ "ok": true,
5570+ "latencyMs": 1135,
5571+ "usage": {
5572+ "input": 19,
5573+ "output": 35,
5574+ "cachedInput": 0,
5575+ "reasoning": 0
5576+ },
5577+ "api": "responses",
5578+ "raw": {
5579+ "status": "completed",
5580+ "incomplete": null
5581+ },
5582+ "sample": "Ottawa",
5583+ "costUsd": 0.000318
5584+ },
5585+ {
5586+ "test": "reasoning",
5587+ "ok": true,
5588+ "latencyMs": 1643,
5589+ "usage": {
5590+ "input": 42,
5591+ "output": 225,
5592+ "cachedInput": 0,
5593+ "reasoning": 128
5594+ },
5595+ "api": "responses",
5596+ "raw": {
5597+ "status": "completed",
5598+ "incomplete": null
5599+ },
5600+ "sample": "Alice is one of the sisters herself. \nFor any one of her brothers, the female siblings are: \n1. Alice \n2. Sister #1 \n3. Sister #2 \n\nSo each brother has 3 sisters. \nANSWER: 3",
5601+ "costUsd": 0.001884
5602+ },
5603+ {
5604+ "test": "math",
5605+ "ok": true,
5606+ "latencyMs": 1925,
5607+ "usage": {
5608+ "input": 50,
5609+ "output": 214,
5610+ "cachedInput": 0,
5611+ "reasoning": 192
5612+ },
5613+ "api": "responses",
5614+ "raw": {
5615+ "status": "completed",
5616+ "incomplete": null
5617+ },
5618+ "sample": "a=403;b=2500",
5619+ "costUsd": 0.001812
5620+ },
5621+ {
5622+ "test": "code",
5623+ "ok": true,
5624+ "latencyMs": 1148,
5625+ "usage": {
5626+ "input": 49,
5627+ "output": 141,
5628+ "cachedInput": 0,
5629+ "reasoning": 0
5630+ },
5631+ "api": "responses",
5632+ "raw": {
5633+ "status": "completed",
5634+ "incomplete": null
5635+ },
5636+ "sample": "```js\nfunction isPrime(n) {\n if (n <= 1 || n % 1 !== 0) return false;\n if (n === 2) return true;\n if (n % 2 === 0) return false;\n\n const limit = Math.sqrt(n);\n for (let i = 3; i <= limit; i += 2) {\n if (n % i === 0) return false;\n }\n return true;\n}\n```",
5637+ "costUsd": 0.001226
5638+ },
5639+ {
5640+ "test": "french",
5641+ "ok": true,
5642+ "latencyMs": 2235,
5643+ "usage": {
5644+ "input": 31,
5645+ "output": 290,
5646+ "cachedInput": 0,
5647+ "reasoning": 192
5648+ },
5649+ "api": "responses",
5650+ "raw": {
5651+ "status": "completed",
5652+ "incomplete": null
5653+ },
5654+ "sample": "La méthode du coût, ou approche par le coût de remplacement, consiste à estimer la valeur d’un bien immobilier en additionnant la valeur du terrain à celle du coût actuel de reconstruction ou de reconstitution du bâtiment, puis en retranchant la dépréciation physique, fonctionnelle et économique. El",
5655+ "costUsd": 0.002382
5656+ },
5657+ {
5658+ "test": "english",
5659+ "ok": true,
5660+ "latencyMs": 1757,
5661+ "usage": {
5662+ "input": 20,
5663+ "output": 234,
5664+ "cachedInput": 0,
5665+ "reasoning": 128
5666+ },
5667+ "api": "responses",
5668+ "raw": {
5669+ "status": "completed",
5670+ "incomplete": null
5671+ },
5672+ "sample": "A hedonic pricing model is an econometric technique that decomposes the market price of a differentiated good into the implicit prices of its observable attributes. By regressing transaction prices on characteristics such as size, quality, location, and environmental factors, it quantifies how much ",
5673+ "costUsd": 0.001912
5674+ },
5675+ {
5676+ "test": "json",
5677+ "ok": true,
5678+ "latencyMs": 1596,
5679+ "usage": {
5680+ "input": 52,
5681+ "output": 207,
5682+ "cachedInput": 0,
5683+ "reasoning": 128
5684+ },
5685+ "api": "responses",
5686+ "raw": {
5687+ "status": "completed",
5688+ "incomplete": null
5689+ },
5690+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
5691+ "costUsd": 0.00176
5692+ },
5693+ {
5694+ "test": "tools",
5695+ "ok": true,
5696+ "latencyMs": 1182,
5697+ "usage": {
5698+ "input": 66,
5699+ "output": 135,
5700+ "cachedInput": 0,
5701+ "reasoning": 64
5702+ },
5703+ "api": "responses",
5704+ "raw": {
5705+ "status": "completed",
5706+ "incomplete": null
5707+ },
5708+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
5709+ "costUsd": 0.001212
5710+ },
5711+ {
5712+ "test": "vision",
5713+ "ok": true,
5714+ "latencyMs": 1256,
5715+ "usage": {
5716+ "input": 112,
5717+ "output": 89,
5718+ "cachedInput": 0,
5719+ "reasoning": 64
5720+ },
5721+ "api": "responses",
5722+ "raw": {
5723+ "status": "completed",
5724+ "incomplete": null
5725+ },
5726+ "sample": "circles=3; other=square",
5727+ "costUsd": 0.000936
5728+ },
5729+ {
5730+ "test": "longctx",
5731+ "ok": true,
5732+ "latencyMs": 1620,
5733+ "usage": {
5734+ "input": 9134,
5735+ "output": 192,
5736+ "cachedInput": 0,
5737+ "reasoning": 128
5738+ },
5739+ "api": "responses",
5740+ "raw": {
5741+ "status": "completed",
5742+ "incomplete": null
5743+ },
5744+ "sample": "7431-ALPHA",
5745+ "costUsd": 0.019804
5746+ },
5747+ {
5748+ "test": "streaming",
5749+ "ok": true,
5750+ "latencyMs": 1039,
5751+ "ttftMs": 660,
5752+ "usage": {
5753+ "input": 15,
5754+ "output": 39,
5755+ "cachedInput": 0,
5756+ "reasoning": 0
5757+ },
5758+ "api": "responses",
5759+ "sample": "Snow cloaks silent pines, \nSaint-Lawrence exhales cold mist— \nStars crackle like ice.",
5760+ "costUsd": 0.000342
5761+ }
5762+ ],
5763+ "api": "responses"
5764+ },
5765+ "o3-mini": {
5766+ "provider": "openai",
5767+ "kind": "chat",
5768+ "tests": [
5769+ {
5770+ "test": "basic",
5771+ "ok": false,
5772+ "latencyMs": 275,
5773+ "error": "404 404 The model `o3-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
5774+ }
5775+ ]
5776+ },
5777+ "o3-pro": {
5778+ "provider": "openai",
5779+ "kind": "chat-pro",
5780+ "tests": [
5781+ {
5782+ "test": "basic",
5783+ "ok": true,
5784+ "latencyMs": 4543,
5785+ "usage": {
5786+ "input": 19,
5787+ "output": 35,
5788+ "cachedInput": 0,
5789+ "reasoning": 0
5790+ },
5791+ "api": "responses",
5792+ "raw": {
5793+ "status": "completed",
5794+ "incomplete": null
5795+ },
5796+ "sample": "Ottawa",
5797+ "costUsd": 0.00318
5798+ },
5799+ {
5800+ "test": "reasoning",
5801+ "ok": true,
5802+ "latencyMs": 9652,
5803+ "usage": {
5804+ "input": 42,
5805+ "output": 168,
5806+ "cachedInput": 0,
5807+ "reasoning": 64
5808+ },
5809+ "api": "responses",
5810+ "raw": {
5811+ "status": "completed",
5812+ "incomplete": null
5813+ },
5814+ "sample": "A brother of Alice counts all his female siblings as sisters. \nAlice herself is female, and there are 2 additional sisters. \nThus, each brother has 1 (Alice) + 2 (other sisters) = 3 sisters.\n\nANSWER: 3",
5815+ "costUsd": 0.01428
5816+ },
5817+ {
5818+ "test": "json",
5819+ "ok": true,
5820+ "latencyMs": 6627,
5821+ "usage": {
5822+ "input": 52,
5823+ "output": 218,
5824+ "cachedInput": 0,
5825+ "reasoning": 128
5826+ },
5827+ "api": "responses",
5828+ "raw": {
5829+ "status": "completed",
5830+ "incomplete": null
5831+ },
5832+ "sample": "{\"city\":\"Gatineau\",\"country\":\"Canada\",\"province\":\"Quebec\",\"population_estimate\":291041}",
5833+ "costUsd": 0.01848
5834+ },
5835+ {
5836+ "test": "tools",
5837+ "ok": true,
5838+ "latencyMs": 6422,
5839+ "usage": {
5840+ "input": 66,
5841+ "output": 117,
5842+ "cachedInput": 0,
5843+ "reasoning": 64
5844+ },
5845+ "api": "responses",
5846+ "raw": {
5847+ "status": "completed",
5848+ "incomplete": null
5849+ },
5850+ "sample": "{\"name\":\"get_weather\",\"arguments\":\"{\\\"location\\\":\\\"Gatineau, Quebec\\\"}\"}",
5851+ "costUsd": 0.01068
5852+ }
5853+ ],
5854+ "api": "responses"
5855+ },
5856+ "o4-mini": {
5857+ "provider": "openai",
5858+ "kind": "chat",
5859+ "tests": [
5860+ {
5861+ "test": "basic",
5862+ "ok": false,
5863+ "latencyMs": 243,
5864+ "error": "404 404 The model `o4-mini` has been deprecated, learn more here: https://platform.openai.com/docs/deprecations"
5865+ }
5866+ ]
5867+ }
5868+ }
5869+}
\ No newline at end of file
added benchmarks/pricing.json +98 −0
@@ -0,0 +1,98 @@
1+{
2+ "_meta": {
3+ "verifiedAt": "2026-11-01",
4+ "unit": "USD per 1M tokens unless noted",
5+ "sources": {
6+ "openai": "https://developers.openai.com/api/docs/pricing (standard tier, <272K context)",
7+ "anthropic": "https://platform.claude.com/docs/en/about-claude/pricing"
8+ },
9+ "note": "Models absent from this file have no verified price; the app must display their cost as unknown."
10+ },
11+ "openai": {
12+ "gpt-6-astra": {"input": 10, "cachedInput": 1, "output": 50, "notes": "long context (>272K) $20/$2/$75"},
13+ "gpt-6.1-sol": {"input": 2, "cachedInput": 0.10, "output": 10},
14+ "gpt-6.1-terra": {"input": 1, "cachedInput": 0.05, "output": 5},
15+ "gpt-6-luna": {"input": 0.10, "cachedInput": 0.01, "output": 0.50},
16+ "gpt-6-sol": {"input": 2, "cachedInput": 0.20, "output": 10},
17+ "gpt-5.6-sol": {"input": 4, "cachedInput": 0.40, "output": 20, "notes": "promotional through at least 2026-11-21"},
18+ "gpt-5.6-terra": {"input": 2, "cachedInput": 0.20, "output": 12},
19+ "gpt-5.6-luna": {"input": 0.20, "cachedInput": 0.02, "output": 1.20},
20+ "gpt-5.5": {"input": 5, "cachedInput": 0.50, "output": 30},
21+ "gpt-5.5-pro": {"input": 30, "output": 180},
22+ "gpt-5.4": {"input": 2.50, "cachedInput": 0.25, "output": 15},
23+ "gpt-5.4-pro": {"input": 30, "output": 180},
24+ "gpt-5.4-mini": {"input": 0.75, "cachedInput": 0.075, "output": 4.50},
25+ "gpt-5.4-nano": {"input": 0.20, "cachedInput": 0.02, "output": 1.25},
26+ "gpt-5.2": {"input": 1.75, "cachedInput": 0.175, "output": 14},
27+ "gpt-5.2-pro": {"input": 21, "output": 168},
28+ "gpt-5.1": {"input": 1.25, "cachedInput": 0.125, "output": 10},
29+ "gpt-5": {"input": 1.25, "cachedInput": 0.125, "output": 10},
30+ "gpt-5-mini": {"input": 0.25, "cachedInput": 0.025, "output": 2},
31+ "gpt-5-nano": {"input": 0.05, "cachedInput": 0.005, "output": 0.40},
32+ "gpt-5-pro": {"input": 15, "output": 120},
33+ "gpt-4.1": {"input": 2, "cachedInput": 0.50, "output": 8},
34+ "gpt-4.1-mini": {"input": 0.40, "cachedInput": 0.10, "output": 1.60},
35+ "gpt-4.1-nano": {"input": 0.10, "cachedInput": 0.025, "output": 0.40},
36+ "gpt-4o": {"input": 2.50, "cachedInput": 1.25, "output": 10},
37+ "gpt-4o-mini": {"input": 0.15, "cachedInput": 0.075, "output": 0.60},
38+ "o1": {"input": 15, "cachedInput": 7.50, "output": 60},
39+ "o1-pro": {"input": 150, "output": 600},
40+ "o3-pro": {"input": 20, "output": 80},
41+ "o3": {"input": 2, "cachedInput": 0.50, "output": 8},
42+ "o4-mini": {"input": 1.10, "cachedInput": 0.275, "output": 4.40},
43+ "o3-mini": {"input": 1.10, "cachedInput": 0.55, "output": 4.40},
44+ "gpt-4-turbo": {"input": 10, "output": 30, "notes": "listed as gpt-4-turbo-2024-04-09"},
45+ "gpt-4": {"input": 30, "output": 60, "notes": "listed as gpt-4-0613"},
46+ "gpt-3.5-turbo": {"input": 0.50, "output": 1.50},
47+ "chat-latest": {"input": 5, "cachedInput": 0.50, "output": 30, "notes": "ChatGPT model"},
48+ "gpt-5.3-codex": {"input": 1.75, "cachedInput": 0.175, "output": 14},
49+ "gpt-5-search-api": {"input": 1.25, "cachedInput": 0.125, "output": 10},
50+ "gpt-image-2.5-sunburst": {"imageInput": 8, "imageCachedInput": 2, "imageOutput": 30, "input": 5, "cachedInput": 1.25, "unit": "image tokens / text tokens"},
51+ "gpt-image-2.5-flare": {"imageInput": 8, "imageCachedInput": 2, "imageOutput": 30, "input": 5, "cachedInput": 1.25, "unit": "image tokens / text tokens"},
52+ "gpt-image-2": {"imageInput": 8, "imageCachedInput": 2, "imageOutput": 30, "input": 5, "cachedInput": 1.25, "unit": "image tokens / text tokens"},
53+ "gpt-image-1.5": {"imageInput": 8, "imageCachedInput": 2, "imageOutput": 32, "input": 5, "cachedInput": 1.25, "output": 10, "unit": "image tokens / text tokens"},
54+ "gpt-image-1-mini": {"imageInput": 2.50, "imageCachedInput": 0.25, "imageOutput": 8, "input": 2, "cachedInput": 0.20, "unit": "image tokens / text tokens"},
55+ "chatgpt-image-latest": {"imageInput": 8, "imageCachedInput": 2, "imageOutput": 32, "input": 5, "cachedInput": 1.25, "output": 10, "unit": "image tokens / text tokens"},
56+ "gpt-realtime-2.1": {"audioInput": 32, "audioOutput": 64, "input": 4, "cachedInput": 0.40, "output": 24, "unit": "audio tokens / text tokens"},
57+ "gpt-realtime-2.1-mini": {"audioInput": 10, "audioOutput": 20, "input": 0.60, "cachedInput": 0.06, "output": 2.40},
58+ "gpt-realtime-2": {"audioInput": 32, "audioOutput": 64, "input": 4, "cachedInput": 0.40, "output": 24},
59+ "gpt-realtime-1.5": {"audioInput": 32, "audioOutput": 64, "input": 4, "cachedInput": 0.40, "output": 16},
60+ "gpt-realtime": {"audioInput": 32, "audioOutput": 64, "input": 4, "cachedInput": 0.40, "output": 16},
61+ "gpt-realtime-mini": {"audioInput": 10, "audioOutput": 20, "input": 0.60, "cachedInput": 0.06, "output": 2.40},
62+ "gpt-audio-1.5": {"audioInput": 32, "audioOutput": 64, "input": 2.50, "output": 10},
63+ "gpt-audio": {"audioInput": 32, "audioOutput": 64, "input": 2.50, "output": 10},
64+ "gpt-audio-mini": {"audioInput": 10, "audioOutput": 20, "input": 0.60, "output": 2.40},
65+ "gpt-4o-mini-tts": {"input": 0.60, "audioOutput": 12, "notes": "~$0.015 per minute"},
66+ "tts-1": {"perMillionCharacters": 15},
67+ "tts-1-hd": {"perMillionCharacters": 30},
68+ "gpt-live-1": {"perMinute": 0.05},
69+ "gpt-realtime-translate": {"perMinute": 0.034},
70+ "gpt-live-transcribe": {"perMinute": 0.017},
71+ "gpt-realtime-whisper": {"perMinute": 0.017},
72+ "gpt-transcribe": {"perMinute": 0.0045},
73+ "gpt-4o-transcribe": {"audioInput": 2.50, "output": 10, "perMinute": 0.006},
74+ "gpt-4o-mini-transcribe": {"audioInput": 1.25, "output": 5, "perMinute": 0.003},
75+ "gpt-4o-transcribe-diarize": {"audioInput": 2.50, "output": 10, "perMinute": 0.006},
76+ "whisper-1": {"perMinute": 0.006, "notes": "page lists 'Whisper'"},
77+ "text-embedding-3-small": {"input": 0.02},
78+ "text-embedding-3-large": {"input": 0.13},
79+ "text-embedding-ada-002": {"input": 0.10},
80+ "omni-moderation-latest": {"input": 0, "notes": "free"}
81+ },
82+ "anthropic": {
83+ "claude-fable-5-1": {"input": 10, "cacheWrite5m": 12.50, "cacheWrite1h": 20, "cachedInput": 0.25, "output": 50},
84+ "claude-fable-5": {"input": 10, "cacheWrite5m": 12.50, "cacheWrite1h": 20, "cachedInput": 1, "output": 50},
85+ "claude-opus-5-5": {"input": 4, "cacheWrite5m": 5, "cacheWrite1h": 8, "cachedInput": 0.20, "output": 20},
86+ "claude-opus-5": {"input": 5, "cacheWrite5m": 6.25, "cacheWrite1h": 10, "cachedInput": 0.50, "output": 25},
87+ "claude-opus-4-8": {"input": 5, "cacheWrite5m": 6.25, "cacheWrite1h": 10, "cachedInput": 0.50, "output": 25},
88+ "claude-opus-4-7": {"input": 5, "cacheWrite5m": 6.25, "cacheWrite1h": 10, "cachedInput": 0.50, "output": 25},
89+ "claude-opus-4-6": {"input": 5, "cacheWrite5m": 6.25, "cacheWrite1h": 10, "cachedInput": 0.50, "output": 25},
90+ "claude-opus-4-5-20251101": {"input": 5, "cacheWrite5m": 6.25, "cacheWrite1h": 10, "cachedInput": 0.50, "output": 25},
91+ "claude-sonnet-5-5": {"input": 2, "cacheWrite5m": 2.50, "cacheWrite1h": 4, "cachedInput": 0.10, "output": 10},
92+ "claude-sonnet-5": {"input": 2, "cacheWrite5m": 2.50, "cacheWrite1h": 4, "cachedInput": 0.20, "output": 10},
93+ "claude-sonnet-4-6": {"input": 3, "cacheWrite5m": 3.75, "cacheWrite1h": 6, "cachedInput": 0.30, "output": 15},
94+ "claude-sonnet-4-5-20250929": {"input": 3, "cacheWrite5m": 3.75, "cacheWrite1h": 6, "cachedInput": 0.30, "output": 15, "notes": "deprecated, retires 2026-11-30"},
95+ "claude-haiku-5-5": {"input": 0.10, "cacheWrite5m": 0.125, "cacheWrite1h": 0.20, "cachedInput": 0.01, "output": 0.50, "notes": "prompts >100K tokens: $0.50/$2.50"},
96+ "claude-haiku-4-5-20251001": {"input": 1, "cacheWrite5m": 1.25, "cacheWrite1h": 2, "cachedInput": 0.10, "output": 5}
97+ }
98+}
added benchmarks/routing-recommendations.json +89 −0
@@ -0,0 +1,89 @@
1+{
2+ "generatedAt": "2026-11-01T07:22:05.282Z",
3+ "modes": {
4+ "quality": [
5+ "claude-fable-5-1",
6+ "gpt-6-astra",
7+ "claude-fable-5"
8+ ],
9+ "fast": [
10+ "gpt-4.1",
11+ "claude-haiku-5-5",
12+ "gpt-5.4-mini"
13+ ],
14+ "economy": [
15+ "gpt-5-nano",
16+ "claude-haiku-5-5",
17+ "gpt-6-luna"
18+ ]
19+ },
20+ "byTask": {
21+ "code": [
22+ "gpt-5-nano",
23+ "claude-haiku-5-5",
24+ "gpt-6-luna"
25+ ],
26+ "math": [
27+ "gpt-5-nano",
28+ "claude-haiku-5-5",
29+ "gpt-6-luna"
30+ ],
31+ "reasoning": [
32+ "gpt-5-nano",
33+ "claude-haiku-5-5",
34+ "gpt-6-luna"
35+ ],
36+ "french": [
37+ "gpt-5-nano",
38+ "claude-haiku-5-5",
39+ "gpt-6-luna"
40+ ],
41+ "vision": [
42+ "gpt-5-nano",
43+ "claude-haiku-5-5",
44+ "gpt-6-luna"
45+ ],
46+ "tools": [
47+ "gpt-5-nano",
48+ "claude-haiku-5-5",
49+ "gpt-6-luna"
50+ ],
51+ "json": [
52+ "gpt-5-nano",
53+ "claude-haiku-5-5",
54+ "gpt-6-luna"
55+ ],
56+ "longctx": [
57+ "gpt-5-nano",
58+ "claude-haiku-5-5",
59+ "gpt-6-luna"
60+ ]
61+ },
62+ "specialized": {
63+ "imageGeneration": [
64+ "chatgpt-image-latest",
65+ "gpt-image-1-mini",
66+ "gpt-image-1.5",
67+ "gpt-image-2",
68+ "gpt-image-2.5-flare",
69+ "gpt-image-2.5-sunburst"
70+ ],
71+ "tts": [
72+ "gpt-4o-mini-tts",
73+ "tts-1",
74+ "tts-1-hd"
75+ ],
76+ "stt": [
77+ "gpt-4o-mini-transcribe",
78+ "gpt-4o-transcribe",
79+ "gpt-4o-transcribe-diarize",
80+ "gpt-transcribe",
81+ "whisper-1"
82+ ],
83+ "embedding": [
84+ "text-embedding-3-large",
85+ "text-embedding-3-small",
86+ "text-embedding-ada-002"
87+ ]
88+ }
89+}
\ No newline at end of file
added benchmarks/routing-recommendations.md +38 −0
@@ -0,0 +1,38 @@
1+# Routing recommendations
2+
3+Derived mechanically from `capability-matrix.json` (2026-11-01T07:22:05.282Z). The in-app router uses the same data at runtime; the owner can override any choice.
4+
5+## Modes
6+
7+- **Quality** — highest quality score; ties broken by higher list price (assumption: the vendor's higher tier is stronger on tasks harder than this suite), then latency; *-pro models excluded (latency): `claude-fable-5-1` (100%, 1321 ms, $10 / $50), `gpt-6-astra` (100%, 2190 ms, $10 / $50), `claude-fable-5` (100%, 2691 ms, $10 / $50)
8+- **Fast** — lowest median latency among models scoring ≥ 89 %: `gpt-4.1` (89%, 704 ms, $2 / $8), `claude-haiku-5-5` (100%, 883 ms, $0.1 / $0.5), `gpt-5.4-mini` (89%, 888 ms, $0.75 / $4.5)
9+- **Economy** — cheapest blended price among models scoring 100 %: `gpt-5-nano` (100%, 3034 ms, $0.05 / $0.4), `claude-haiku-5-5` (100%, 883 ms, $0.1 / $0.5), `gpt-6-luna` (100%, 2005 ms, $0.1 / $0.5)
10+- **Automatic** — classify the task (code / math / vision / long document / general / French), pick the first candidate of the matching task list below that is available, fall back to the Quality list.
11+
12+## By task
13+
14+- **code**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
15+- **math**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
16+- **reasoning**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
17+- **french**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
18+- **vision**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
19+- **tools**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
20+- **json**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
21+- **longctx**: `gpt-5-nano`, `claude-haiku-5-5`, `gpt-6-luna`
22+
23+## Specialized
24+
25+- Image generation: `chatgpt-image-latest`, `gpt-image-1-mini`, `gpt-image-1.5`, `gpt-image-2`, `gpt-image-2.5-flare`, `gpt-image-2.5-sunburst`
26+- Text-to-speech: `gpt-4o-mini-tts`, `tts-1`, `tts-1-hd`
27+- Speech-to-text: `gpt-4o-mini-transcribe`, `gpt-4o-transcribe`, `gpt-4o-transcribe-diarize`, `gpt-transcribe`, `whisper-1`
28+- Embeddings (memory & semantic search): `text-embedding-3-large`, `text-embedding-3-small`, `text-embedding-ada-002`
29+
30+## Defaults proposed for the app
31+
32+- Default chat model: `claude-fable-5-1`
33+- Fast mode: `gpt-4.1`
34+- Economy mode: `gpt-5-nano`
35+- Title generation / memory extraction / classification (cheap, fast): `gpt-5-nano`
36+- Embeddings: `text-embedding-3-small` (1536 dims, verified)
37+- Image generation: `gpt-image-1.5`
38+- STT: `gpt-4o-mini-transcribe` · TTS: `gpt-4o-mini-tts`
added benchmarks/vision-test.png +0 −0

Binary file not shown.

added db/migrations/001_init.sql +311 −0
@@ -0,0 +1,311 @@
1+-- Chat SPBoucher AI — initial schema (PostgreSQL 17 + pgvector)
2+CREATE EXTENSION IF NOT EXISTS vector;
3+CREATE EXTENSION IF NOT EXISTS pgcrypto;
4+
5+-- ---------------------------------------------------------------- owner & auth
6+CREATE TABLE IF NOT EXISTS owner (
7+ id smallint PRIMARY KEY DEFAULT 1 CHECK (id = 1),
8+ username text NOT NULL,
9+ password_hash text NOT NULL, -- argon2id
10+ totp_secret text, -- optional 2FA (encrypted at rest by app key)
11+ created_at timestamptz NOT NULL DEFAULT now(),
12+ updated_at timestamptz NOT NULL DEFAULT now()
13+);
14+
15+CREATE TABLE IF NOT EXISTS sessions (
16+ id text PRIMARY KEY, -- sha256(token)
17+ created_at timestamptz NOT NULL DEFAULT now(),
18+ expires_at timestamptz NOT NULL,
19+ last_seen timestamptz NOT NULL DEFAULT now(),
20+ user_agent text,
21+ ip text,
22+ revoked_at timestamptz
23+);
24+CREATE INDEX IF NOT EXISTS sessions_expires_idx ON sessions (expires_at);
25+
26+CREATE TABLE IF NOT EXISTS login_attempts (
27+ id bigserial PRIMARY KEY,
28+ ip text NOT NULL,
29+ at timestamptz NOT NULL DEFAULT now(),
30+ success boolean NOT NULL
31+);
32+CREATE INDEX IF NOT EXISTS login_attempts_ip_at_idx ON login_attempts (ip, at DESC);
33+
34+CREATE TABLE IF NOT EXISTS webauthn_credentials (
35+ id text PRIMARY KEY,
36+ public_key bytea NOT NULL,
37+ counter bigint NOT NULL DEFAULT 0,
38+ transports text[],
39+ label text,
40+ created_at timestamptz NOT NULL DEFAULT now()
41+);
42+
43+-- ---------------------------------------------------------------- settings (key/value)
44+CREATE TABLE IF NOT EXISTS settings (
45+ key text PRIMARY KEY,
46+ value jsonb NOT NULL,
47+ updated_at timestamptz NOT NULL DEFAULT now()
48+);
49+
50+-- ---------------------------------------------------------------- model registry
51+CREATE TABLE IF NOT EXISTS models (
52+ id text PRIMARY KEY,
53+ provider text NOT NULL CHECK (provider IN ('openai','anthropic','local')),
54+ display_name text NOT NULL,
55+ kind text NOT NULL DEFAULT 'chat', -- chat | chat-pro | search | image | tts | stt | embedding | moderation | realtime | video | legacy-completion | deep-research | audio-chat
56+ api text, -- responses | chat | messages
57+ status text NOT NULL DEFAULT 'untested', -- verified | unavailable | unsupported | untested
58+ available boolean NOT NULL DEFAULT false,
59+ tested boolean NOT NULL DEFAULT false,
60+ unavailable_reason text,
61+ capabilities jsonb NOT NULL DEFAULT '{}'::jsonb,
62+ context_window integer,
63+ max_output_tokens integer,
64+ pricing jsonb,
65+ benchmark jsonb,
66+ hidden boolean NOT NULL DEFAULT false,
67+ favorite boolean NOT NULL DEFAULT false,
68+ sort_order integer NOT NULL DEFAULT 0,
69+ last_verified_at timestamptz,
70+ first_seen_at timestamptz NOT NULL DEFAULT now(),
71+ updated_at timestamptz NOT NULL DEFAULT now()
72+);
73+
74+-- ---------------------------------------------------------------- projects
75+CREATE TABLE IF NOT EXISTS projects (
76+ id text PRIMARY KEY,
77+ name text NOT NULL,
78+ description text,
79+ instructions text,
80+ default_model text,
81+ color text,
82+ icon text,
83+ tool_permissions jsonb NOT NULL DEFAULT '{}'::jsonb,
84+ notes text,
85+ sort_order integer NOT NULL DEFAULT 0,
86+ archived_at timestamptz,
87+ created_at timestamptz NOT NULL DEFAULT now(),
88+ updated_at timestamptz NOT NULL DEFAULT now()
89+);
90+
91+-- ---------------------------------------------------------------- conversations & messages
92+CREATE TABLE IF NOT EXISTS conversations (
93+ id text PRIMARY KEY,
94+ project_id text REFERENCES projects(id) ON DELETE SET NULL,
95+ title text NOT NULL DEFAULT 'Nouvelle conversation',
96+ model_id text,
97+ settings jsonb NOT NULL DEFAULT '{}'::jsonb, -- effort, routing mode, tools enabled, system override…
98+ pinned boolean NOT NULL DEFAULT false,
99+ archived_at timestamptz,
100+ parent_id text REFERENCES conversations(id) ON DELETE SET NULL, -- branch origin
101+ branch_message_id text,
102+ mode text NOT NULL DEFAULT 'chat', -- chat | compare | research
103+ message_count integer NOT NULL DEFAULT 0,
104+ total_cost_usd numeric(12,6) NOT NULL DEFAULT 0,
105+ last_message_at timestamptz,
106+ created_at timestamptz NOT NULL DEFAULT now(),
107+ updated_at timestamptz NOT NULL DEFAULT now(),
108+ tsv tsvector
109+);
110+CREATE INDEX IF NOT EXISTS conversations_project_idx ON conversations (project_id);
111+CREATE INDEX IF NOT EXISTS conversations_updated_idx ON conversations (updated_at DESC);
112+CREATE INDEX IF NOT EXISTS conversations_tsv_idx ON conversations USING gin (tsv);
113+
114+CREATE TABLE IF NOT EXISTS messages (
115+ id text PRIMARY KEY,
116+ conversation_id text NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
117+ parent_id text REFERENCES messages(id) ON DELETE SET NULL, -- message tree (branching / regenerate)
118+ role text NOT NULL CHECK (role IN ('user','assistant','system','tool')),
119+ parts jsonb NOT NULL DEFAULT '[]'::jsonb, -- [{type:text|image|file|tool_call|tool_result|reasoning|artifact|citation,...}]
120+ text text NOT NULL DEFAULT '', -- plain text (search + context)
121+ model_id text,
122+ provider text,
123+ settings jsonb, -- effort/routing used for THIS response
124+ routing jsonb, -- {mode, requested, selected, reason}
125+ usage jsonb, -- {input, output, cached, reasoning}
126+ cost_usd numeric(12,6),
127+ latency_ms integer,
128+ ttft_ms integer,
129+ status text NOT NULL DEFAULT 'complete', -- streaming | complete | error | cancelled
130+ error text,
131+ active boolean NOT NULL DEFAULT true, -- false for superseded siblings (regenerate/edit)
132+ created_at timestamptz NOT NULL DEFAULT now(),
133+ tsv tsvector GENERATED ALWAYS AS (to_tsvector('simple', coalesce(text,''))) STORED
134+);
135+CREATE INDEX IF NOT EXISTS messages_conv_idx ON messages (conversation_id, created_at);
136+CREATE INDEX IF NOT EXISTS messages_parent_idx ON messages (parent_id);
137+CREATE INDEX IF NOT EXISTS messages_tsv_idx ON messages USING gin (tsv);
138+
139+CREATE TABLE IF NOT EXISTS message_embeddings (
140+ message_id text PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE,
141+ embedding vector(1536) NOT NULL,
142+ model text NOT NULL DEFAULT 'text-embedding-3-small',
143+ created_at timestamptz NOT NULL DEFAULT now()
144+);
145+CREATE INDEX IF NOT EXISTS message_embeddings_idx ON message_embeddings USING hnsw (embedding vector_cosine_ops);
146+
147+-- ---------------------------------------------------------------- attachments & document chunks
148+CREATE TABLE IF NOT EXISTS attachments (
149+ id text PRIMARY KEY,
150+ conversation_id text REFERENCES conversations(id) ON DELETE SET NULL,
151+ project_id text REFERENCES projects(id) ON DELETE SET NULL,
152+ message_id text REFERENCES messages(id) ON DELETE SET NULL,
153+ kind text NOT NULL DEFAULT 'upload', -- upload | generated-image | audio | export
154+ filename text NOT NULL,
155+ mime text NOT NULL,
156+ size_bytes bigint NOT NULL,
157+ path text NOT NULL, -- relative to DATA_DIR/uploads
158+ sha256 text,
159+ extracted_text text,
160+ page_count integer,
161+ meta jsonb NOT NULL DEFAULT '{}'::jsonb,
162+ created_at timestamptz NOT NULL DEFAULT now()
163+);
164+CREATE INDEX IF NOT EXISTS attachments_conv_idx ON attachments (conversation_id);
165+CREATE INDEX IF NOT EXISTS attachments_project_idx ON attachments (project_id);
166+
167+CREATE TABLE IF NOT EXISTS document_chunks (
168+ id bigserial PRIMARY KEY,
169+ attachment_id text NOT NULL REFERENCES attachments(id) ON DELETE CASCADE,
170+ idx integer NOT NULL,
171+ page integer,
172+ content text NOT NULL,
173+ embedding vector(1536),
174+ tsv tsvector GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED
175+);
176+CREATE INDEX IF NOT EXISTS document_chunks_att_idx ON document_chunks (attachment_id, idx);
177+CREATE INDEX IF NOT EXISTS document_chunks_tsv_idx ON document_chunks USING gin (tsv);
178+CREATE INDEX IF NOT EXISTS document_chunks_emb_idx ON document_chunks USING hnsw (embedding vector_cosine_ops);
179+
180+-- ---------------------------------------------------------------- memory
181+CREATE TABLE IF NOT EXISTS memories (
182+ id text PRIMARY KEY,
183+ category text NOT NULL DEFAULT 'context', -- preference | writing | research | project | infrastructure | objective | concept | context
184+ content text NOT NULL,
185+ source text NOT NULL DEFAULT 'manual', -- manual | extracted | imported
186+ source_conversation_id text REFERENCES conversations(id) ON DELETE SET NULL,
187+ source_message_id text REFERENCES messages(id) ON DELETE SET NULL,
188+ project_id text REFERENCES projects(id) ON DELETE CASCADE, -- null = global
189+ status text NOT NULL DEFAULT 'active', -- candidate | active | disabled
190+ confidence real,
191+ embedding vector(1536),
192+ use_count integer NOT NULL DEFAULT 0,
193+ last_used_at timestamptz,
194+ created_at timestamptz NOT NULL DEFAULT now(),
195+ updated_at timestamptz NOT NULL DEFAULT now(),
196+ tsv tsvector GENERATED ALWAYS AS (to_tsvector('simple', content)) STORED
197+);
198+CREATE INDEX IF NOT EXISTS memories_status_idx ON memories (status);
199+CREATE INDEX IF NOT EXISTS memories_emb_idx ON memories USING hnsw (embedding vector_cosine_ops);
200+CREATE INDEX IF NOT EXISTS memories_tsv_idx ON memories USING gin (tsv);
201+
202+-- ---------------------------------------------------------------- artifacts
203+CREATE TABLE IF NOT EXISTS artifacts (
204+ id text PRIMARY KEY,
205+ conversation_id text REFERENCES conversations(id) ON DELETE CASCADE,
206+ message_id text REFERENCES messages(id) ON DELETE SET NULL,
207+ project_id text REFERENCES projects(id) ON DELETE SET NULL,
208+ root_id text, -- first version id
209+ version integer NOT NULL DEFAULT 1,
210+ type text NOT NULL, -- html | react | typescript | python | markdown | table | chart | svg | mermaid | math | code
211+ language text,
212+ title text NOT NULL,
213+ content text NOT NULL,
214+ saved boolean NOT NULL DEFAULT false,
215+ created_at timestamptz NOT NULL DEFAULT now()
216+);
217+CREATE INDEX IF NOT EXISTS artifacts_conv_idx ON artifacts (conversation_id);
218+CREATE INDEX IF NOT EXISTS artifacts_root_idx ON artifacts (root_id, version);
219+
220+-- ---------------------------------------------------------------- usage & spending
221+CREATE TABLE IF NOT EXISTS usage_events (
222+ id bigserial PRIMARY KEY,
223+ at timestamptz NOT NULL DEFAULT now(),
224+ provider text NOT NULL,
225+ model_id text NOT NULL,
226+ kind text NOT NULL DEFAULT 'chat', -- chat | compare | research | title | memory | embedding | image | tts | stt | judge | tool
227+ conversation_id text,
228+ project_id text,
229+ message_id text,
230+ input_tokens integer NOT NULL DEFAULT 0,
231+ output_tokens integer NOT NULL DEFAULT 0,
232+ cached_tokens integer NOT NULL DEFAULT 0,
233+ reasoning_tokens integer NOT NULL DEFAULT 0,
234+ cost_estimated numeric(12,6),
235+ cost_confirmed numeric(12,6), -- filled when a provider billing export is imported
236+ latency_ms integer,
237+ ttft_ms integer,
238+ status text NOT NULL DEFAULT 'ok', -- ok | error | cancelled
239+ error text,
240+ meta jsonb
241+);
242+CREATE INDEX IF NOT EXISTS usage_at_idx ON usage_events (at DESC);
243+CREATE INDEX IF NOT EXISTS usage_model_idx ON usage_events (model_id, at DESC);
244+CREATE INDEX IF NOT EXISTS usage_project_idx ON usage_events (project_id, at DESC);
245+
246+-- ---------------------------------------------------------------- comparisons & research
247+CREATE TABLE IF NOT EXISTS comparisons (
248+ id text PRIMARY KEY,
249+ conversation_id text REFERENCES conversations(id) ON DELETE SET NULL,
250+ project_id text REFERENCES projects(id) ON DELETE SET NULL,
251+ prompt text NOT NULL,
252+ model_ids text[] NOT NULL,
253+ results jsonb NOT NULL DEFAULT '[]'::jsonb, -- [{modelId, text, usage, cost, latency, ttft, error}]
254+ judge jsonb, -- {modelId, verdict, text}
255+ preferred_model text,
256+ created_at timestamptz NOT NULL DEFAULT now()
257+);
258+
259+CREATE TABLE IF NOT EXISTS research_runs (
260+ id text PRIMARY KEY,
261+ conversation_id text REFERENCES conversations(id) ON DELETE SET NULL,
262+ project_id text REFERENCES projects(id) ON DELETE SET NULL,
263+ question text NOT NULL,
264+ model_id text NOT NULL,
265+ status text NOT NULL DEFAULT 'planning', -- planning | searching | reading | synthesizing | complete | error | cancelled
266+ plan jsonb,
267+ steps jsonb NOT NULL DEFAULT '[]'::jsonb,
268+ sources jsonb NOT NULL DEFAULT '[]'::jsonb,
269+ report_md text,
270+ cost_usd numeric(12,6) NOT NULL DEFAULT 0,
271+ error text,
272+ created_at timestamptz NOT NULL DEFAULT now(),
273+ completed_at timestamptz
274+);
275+
276+-- ---------------------------------------------------------------- tool executions (audit log)
277+CREATE TABLE IF NOT EXISTS tool_executions (
278+ id text PRIMARY KEY,
279+ conversation_id text,
280+ message_id text,
281+ tool text NOT NULL,
282+ input jsonb,
283+ output jsonb,
284+ status text NOT NULL, -- pending_approval | approved | denied | ok | error
285+ duration_ms integer,
286+ created_at timestamptz NOT NULL DEFAULT now()
287+);
288+CREATE INDEX IF NOT EXISTS tool_exec_conv_idx ON tool_executions (conversation_id, created_at DESC);
289+
290+-- ---------------------------------------------------------------- triggers
291+CREATE OR REPLACE FUNCTION conversations_tsv_update() RETURNS trigger AS $$
292+BEGIN NEW.tsv := to_tsvector('simple', coalesce(NEW.title,'')); RETURN NEW; END $$ LANGUAGE plpgsql;
293+DROP TRIGGER IF EXISTS conversations_tsv_trg ON conversations;
294+CREATE TRIGGER conversations_tsv_trg BEFORE INSERT OR UPDATE OF title ON conversations FOR EACH ROW EXECUTE FUNCTION conversations_tsv_update();
295+
296+CREATE OR REPLACE FUNCTION touch_updated_at() RETURNS trigger AS $$
297+BEGIN NEW.updated_at := now(); RETURN NEW; END $$ LANGUAGE plpgsql;
298+DROP TRIGGER IF EXISTS conversations_touch ON conversations;
299+CREATE TRIGGER conversations_touch BEFORE UPDATE ON conversations FOR EACH ROW EXECUTE FUNCTION touch_updated_at();
300+DROP TRIGGER IF EXISTS projects_touch ON projects;
301+CREATE TRIGGER projects_touch BEFORE UPDATE ON projects FOR EACH ROW EXECUTE FUNCTION touch_updated_at();
302+DROP TRIGGER IF EXISTS memories_touch ON memories;
303+CREATE TRIGGER memories_touch BEFORE UPDATE ON memories FOR EACH ROW EXECUTE FUNCTION touch_updated_at();
304+
305+-- default settings
306+INSERT INTO settings (key, value) VALUES
307+ ('memory', '{"enabled": true, "autoExtract": true, "requireApproval": false}'),
308+ ('spending', '{"dailyLimitUsd": 10, "monthlyLimitUsd": 150, "alertAtPercent": 80}'),
309+ ('routing', '{"defaultMode": "manual"}'),
310+ ('appearance', '{"theme": "dark"}')
311+ON CONFLICT (key) DO NOTHING;
added deploy/mld-manifest.json +18 −0
@@ -0,0 +1,18 @@
1+{
2+ "name": "chat-spboucher-ai",
3+ "description": "Chat SPBoucher AI — interface privée multi-modèles (OpenAI + Anthropic), Next.js 16 + PostgreSQL 17/pgvector",
4+ "dir": "~/apps/chat-spboucher-ai",
5+ "port": 8500,
6+ "runtime": "node",
7+ "build": "pnpm install --frozen-lockfile && pnpm build && DATABASE_URL=$DATABASE_URL pnpm db:migrate && DATABASE_URL=$DATABASE_URL pnpm registry:refresh",
8+ "processes": [
9+ { "name": "chat-spboucher-ai", "script": "node_modules/.bin/next", "args": "start -p 8500", "cwd": "~/apps/chat-spboucher-ai", "env_file": ".env.production", "max_memory_restart": "2G" },
10+ { "name": "chat-spboucher-ai-registry", "script": "node_modules/.bin/tsx", "args": "scripts/registry-refresh.ts", "cwd": "~/apps/chat-spboucher-ai", "env_file": ".env.production", "cron_restart": "17 5 * * *", "autorestart": false }
11+ ],
12+ "health": { "path": "/api/health", "expect": 200 },
13+ "tunnel": { "domain": "chat.spboucher.ai" },
14+ "requires": { "node": ">=22", "pnpm": true, "postgresql@17": true, "ram_gb": 4, "disk_gb": 20 },
15+ "placement": { "prefer": ["M4M64c"], "pin": true, "reason": "Postgres 17 + pgvector installé, nœud sans autre app, 64 Go" },
16+ "secrets": ["OPENAI_API_KEY", "ANTHROPIC_API_KEY", "TAVILY_API_KEY", "SESSION_SECRET", "DATABASE_URL"],
17+ "backup": { "script": "scripts/backup.sh", "cron": "45 3 * * *" }
18+}
added docs/OPERATIONS.md +77 −0
@@ -0,0 +1,77 @@
1+# Exploitation — Chat SPBoucher AI
2+
3+## Emplacement
4+
5+| | |
6+|---|---|
7+| Nœud | **M4M64c** (Mac Studio M4 Max, 16 c / 64 Go), épinglé dans le manifeste |
8+| Dossier | `~/apps/chat-spboucher-ai` (clone git, `origin` = spbgit `chat-spboucher-ai.git`) |
9+| Port | 8500 (PM2 `chat-spboucher-ai`) |
10+| Base | PostgreSQL 17 Homebrew local, base `chat_spboucher`, rôle `chat_spb`, extension `vector` |
11+| Fichiers | `~/apps/chat-spboucher-ai/data/uploads/` (mode 600) |
12+| Domaine | `chat.spboucher.ai` → MacLustr Tunnel (BHS64 Caddy → wg1 M4M64c:8500) ; DNS GoDaddy `A → 51.161.112.61` |
13+| Secrets | `M1M32:~/dispatch/apps/chat-spboucher-ai.json` (mode 600) et `~/Desktop/Cluster/secrets/chat-spboucher-ai.env` sur le laptop |
14+| Santé | `GET /api/health` → `{ok:true, db:true, modelsAvailable:N}` |
15+
16+## Processus PM2 (déclarés dans le manifeste mld)
17+
18+| Processus | Rôle | Planification |
19+|---|---|---|
20+| `chat-spboucher-ai` | `next start -H 0.0.0.0 -p 8500` | permanent, `max_memory_restart 2G` |
21+| `chat-spboucher-ai-registry` | `tsx scripts/registry-refresh.ts` — relit les listings OpenAI/Anthropic, marque les modèles disparus, importe les benchmarks | `17 5 * * *` |
22+| `chat-spboucher-ai-backup` | `scripts/backup.sh` — dump Postgres + uploads, chiffré AES-256 (`~/.config/chat-spboucher-ai/backup.pass`), 14 jours dans `~/backups/chat-spboucher-ai` | `45 3 * * *` |
23+
24+## Déploiement initial (fait le 2026-11-01)
25+
26+```bash
27+# laptop
28+cd ~/Desktop/cluster-skill
29+./mld stage ~/Desktop/Cluster/projets/chat-spboucher-ai chat-spboucher-ai
30+./mld deploy chat-spboucher-ai --node M4M64c # post_sync : pnpm install, db:migrate, build, registry:refresh ; route tunnel posée
31+./mld adopt chat-spboucher-ai # le dossier du nœud devient un clone git (origin spbgit)
32+ssh M4M64c 'cd ~/apps/chat-spboucher-ai && set -a && . ./.env.production && set +a && pnpm setup:owner' # mot de passe du propriétaire (interactif)
33+```
34+
35+## Modifier l'app (remote-first)
36+
37+```bash
38+ssh M4M64c
39+cd ~/apps/chat-spboucher-ai
40+# éditer, puis :
41+pnpm build && pm2 restart chat-spboucher-ai
42+git add -A && git commit -m "…" && git push origin main
43+```
44+Le laptop ne garde qu'un miroir (`git pull`). Nouvelle migration : ajouter `db/migrations/00N_*.sql`, puis `set -a; . ./.env.production; set +a; pnpm db:migrate`.
45+
46+## Rollback
47+
48+```bash
49+ssh M4M64c 'cd ~/apps/chat-spboucher-ai && git log --oneline -5'
50+ssh M4M64c 'cd ~/apps/chat-spboucher-ai && git checkout <commit> -- . && pnpm install --frozen-lockfile && pnpm build && pm2 restart chat-spboucher-ai'
51+# base : scripts/restore.sh ~/backups/chat-spboucher-ai/csa-<date>.tar.enc --yes (arrête/relance PM2, remplace DB + uploads)
52+```
53+Testé le 2026-11-01 : `pm2 restart` + healthcheck < 5 s ; restauration sur la base locale de développement.
54+
55+## Journaux
56+
57+```bash
58+ssh M4M64c 'pm2 logs chat-spboucher-ai --lines 200' # requêtes, erreurs fournisseurs (JSON Next.js)
59+ssh M4M64c 'psql chat_spboucher -c "select at, kind, model_id, status, left(error,80) from usage_events order by at desc limit 30"'
60+ssh M4M64c 'psql chat_spboucher -c "select * from tool_executions order by created_at desc limit 20"'
61+```
62+
63+## Pannes courantes
64+
65+| Symptôme | Cause probable | Action |
66+|---|---|---|
67+| 502 sur chat.spboucher.ai | PM2 arrêté ou wg1 tombé | `mld heal` (automatique toutes les 5 min) ; `mld health chat-spboucher-ai` |
68+| `/api/health` → `db:false` | Postgres arrêté | `ssh M4M64c 'brew services start postgresql@17'` |
69+| 402 « Limite quotidienne atteinte » | garde-fou local de dépenses | Réglages → Dépenses |
70+| Modèle « indisponible » soudainement | retiré par le fournisseur (404 deprecated) | normal : le rafraîchissement nocturne le masque ; choisir un autre modèle |
71+| Réponse vide d'un modèle de raisonnement OpenAI | budget de sortie consommé par le raisonnement | augmenter « jetons max » ou baisser l'effort |
72+
73+## Sauvegarde / restauration
74+
75+- Sauvegarde chiffrée nocturne (`scripts/backup.sh`) ; la phrase de passe est générée au premier lancement dans `~/.config/chat-spboucher-ai/backup.pass` **et doit être copiée** dans `~/Desktop/Cluster/secrets/`.
76+- Restauration : `scripts/restore.sh <fichier> --yes`.
77+- Export utilisateur : conversation (Markdown/JSON), mémoire (JSON/Markdown), rapport de recherche (MD/DOCX/PDF via impression).
added eslint.config.mjs +23 −0
@@ -0,0 +1,23 @@
1+import { defineConfig, globalIgnores } from "eslint/config";
2+import nextVitals from "eslint-config-next/core-web-vitals";
3+import nextTs from "eslint-config-next/typescript";
4+
5+const eslintConfig = defineConfig([
6+ ...nextVitals,
7+ ...nextTs,
8+ globalIgnores([".next/**", "out/**", "build/**", "next-env.d.ts", "scripts/**", "public/sw.js", "e2e-shots/**"]),
9+ {
10+ rules: {
11+ // French UI copy is full of apostrophes; JSX text is already escaped by React.
12+ "react/no-unescaped-entities": "off",
13+ // Images come from our own authenticated API (dynamic, private) — next/image optimisation is not applicable.
14+ "@next/next/no-img-element": "off",
15+ "@typescript-eslint/no-explicit-any": "warn",
16+ // download links to our own API routes are plain <a href> on purpose (no client navigation)
17+ "@next/next/no-html-link-for-pages": "off",
18+ "react-hooks/set-state-in-effect": "warn",
19+ },
20+ },
21+]);
22+
23+export default eslintConfig;
added next-env.d.ts +7 −0
@@ -0,0 +1,7 @@
1+/// <reference types="next" />
2+/// <reference types="next/image-types/global" />
3+import "./.next/types/routes.d.ts";
4+import "./.next/types/root-params.d.ts";
5+
6+// NOTE: This file should not be edited
7+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
added next.config.ts +17 −0
@@ -0,0 +1,17 @@
1+import type { NextConfig } from "next";
2+
3+const nextConfig: NextConfig = {
4+ reactStrictMode: true,
5+ poweredByHeader: false,
6+ output: "standalone",
7+ serverExternalPackages: ["pdf-parse", "mammoth", "xlsx", "@node-rs/argon2", "postgres"],
8+ experimental: { serverActions: { bodySizeLimit: "60mb" } },
9+ async headers() {
10+ return [{ source: "/(.*)", headers: [
11+ { key: "X-Frame-Options", value: "DENY" }, { key: "X-Content-Type-Options", value: "nosniff" }, { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" },
12+ { key: "Permissions-Policy", value: "camera=(), geolocation=(), microphone=(self)" },
13+ ] }];
14+ },
15+};
16+
17+export default nextConfig;
added package.json +73 −0
@@ -0,0 +1,73 @@
1+{
2+ "name": "chat-spboucher-ai",
3+ "version": "0.1.0",
4+ "private": true,
5+ "type": "module",
6+ "scripts": {
7+ "dev": "next dev -p 8500",
8+ "build": "next build",
9+ "start": "next start -p 8500",
10+ "lint": "eslint",
11+ "db:migrate": "tsx scripts/db/migrate.ts",
12+ "setup:owner": "tsx scripts/setup-owner.ts",
13+ "bench": "tsx scripts/benchmarks/run.ts",
14+ "bench:discover": "tsx scripts/benchmarks/discover.ts",
15+ "bench:modalities": "tsx scripts/benchmarks/modalities.ts",
16+ "bench:report": "tsx scripts/benchmarks/report.ts",
17+ "registry:refresh": "tsx scripts/registry-refresh.ts"
18+ },
19+ "dependencies": {
20+ "@anthropic-ai/sdk": "^1.3.0",
21+ "@node-rs/argon2": "^2.2.2",
22+ "@types/node": "^26.6.6",
23+ "@types/pngjs": "^6.0.5",
24+ "clsx": "^2.1.1",
25+ "date-fns": "^4.4.0",
26+ "docx": "^9.15.0",
27+ "highlight.js": "^11.12.0",
28+ "katex": "^0.19.1",
29+ "lucide-react": "^1.66.0",
30+ "mammoth": "^1.13.0",
31+ "mermaid": "^12.2.0",
32+ "mime": "^4.1.2",
33+ "nanoid": "^6.0.2",
34+ "next": "16.4.3",
35+ "openai": "^7.47.0",
36+ "pdf-parse": "^2.4.5",
37+ "pngjs": "^7.0.0",
38+ "postgres": "^4.0.0",
39+ "react": "19.3.0",
40+ "react-dom": "19.3.0",
41+ "react-markdown": "^10.1.0",
42+ "recharts": "^3.10.1",
43+ "rehype-highlight": "^7.0.2",
44+ "rehype-katex": "^7.0.1",
45+ "remark-gfm": "^4.0.1",
46+ "remark-math": "^6.0.0",
47+ "swr": "^2.5.1",
48+ "tsx": "^4.23.15",
49+ "xlsx": "^0.18.5",
50+ "zod": "^4.6.7"
51+ },
52+ "packageManager": "pnpm@11.1.2",
53+ "devDependencies": {
54+ "@tailwindcss/postcss": "^4.3.3",
55+ "@types/pdf-parse": "^1.1.5",
56+ "@types/react": "^19.3.0",
57+ "@types/react-dom": "^19.3.0",
58+ "eslint": "^10.14.0",
59+ "eslint-config-next": "16.4.3",
60+ "playwright": "^1.64.1",
61+ "tailwindcss": "^4.3.3",
62+ "typescript": "^5.9.3"
63+ },
64+ "pnpm": {
65+ "onlyBuiltDependencies": [
66+ "esbuild",
67+ "sharp",
68+ "unrs-resolver",
69+ "@tailwindcss/oxide",
70+ "@node-rs/argon2"
71+ ]
72+ }
73+}
added pnpm-lock.yaml +4395 −0
@@ -0,0 +1,7291 @@
1+lockfileVersion: '9.0'
2+
3+settings:
4+ autoInstallPeers: true
5+ excludeLinksFromLockfile: false
6+
7+importers:
8+
9+ .:
10+ dependencies:
11+ '@anthropic-ai/sdk':
12+ specifier: ^1.3.0
13+ version: 1.3.0(zod@4.6.7)
14+ '@node-rs/argon2':
15+ specifier: ^2.2.2
16+ version: 2.2.2
17+ '@types/node':
18+ specifier: ^26.6.6
19+ version: 26.6.6
20+ '@types/pngjs':
21+ specifier: ^6.0.5
22+ version: 6.0.5
23+ clsx:
24+ specifier: ^2.1.1
25+ version: 2.1.1
26+ date-fns:
27+ specifier: ^4.4.0
28+ version: 4.4.0
29+ docx:
30+ specifier: ^9.15.0
31+ version: 9.15.0
32+ highlight.js:
33+ specifier: ^11.12.0
34+ version: 11.12.0
35+ katex:
36+ specifier: ^0.19.1
37+ version: 0.19.1
38+ lucide-react:
39+ specifier: ^1.66.0
40+ version: 1.66.0(@types/react@19.3.0)(react@19.3.0)
41+ mammoth:
42+ specifier: ^1.13.0
43+ version: 1.13.0
44+ mermaid:
45+ specifier: ^12.2.0
46+ version: 12.2.0
47+ mime:
48+ specifier: ^4.1.2
49+ version: 4.1.2
50+ nanoid:
51+ specifier: ^6.0.2
52+ version: 6.0.2
53+ next:
54+ specifier: 16.4.3
55+ version: 16.4.3(@babel/core@7.29.7)(@opentelemetry/api@1.10.0)(@types/node@26.6.6)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)
56+ openai:
57+ specifier: ^7.47.0
58+ version: 7.47.0(zod@4.6.7)
59+ pdf-parse:
60+ specifier: ^2.4.5
61+ version: 2.4.5
62+ pngjs:
63+ specifier: ^7.0.0
64+ version: 7.0.0
65+ postgres:
66+ specifier: ^4.0.0
67+ version: 4.0.0
68+ react:
69+ specifier: 19.3.0
70+ version: 19.3.0
71+ react-dom:
72+ specifier: 19.3.0
73+ version: 19.3.0(react@19.3.0)
74+ react-markdown:
75+ specifier: ^10.1.0
76+ version: 10.1.0(@types/react@19.3.0)(react@19.3.0)
77+ recharts:
78+ specifier: ^3.10.1
79+ version: 3.10.1(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react-is@16.13.1)(react@19.3.0)(redux@5.0.1)
80+ rehype-highlight:
81+ specifier: ^7.0.2
82+ version: 7.0.2
83+ rehype-katex:
84+ specifier: ^7.0.1
85+ version: 7.0.1
86+ remark-gfm:
87+ specifier: ^4.0.1
88+ version: 4.0.1
89+ remark-math:
90+ specifier: ^6.0.0
91+ version: 6.0.0
92+ swr:
93+ specifier: ^2.5.1
94+ version: 2.5.1(react@19.3.0)
95+ tsx:
96+ specifier: ^4.23.15
97+ version: 4.23.15
98+ xlsx:
99+ specifier: ^0.18.5
100+ version: 0.18.5
101+ zod:
102+ specifier: ^4.6.7
103+ version: 4.6.7
104+ devDependencies:
105+ '@tailwindcss/postcss':
106+ specifier: ^4.3.3
107+ version: 4.3.3
108+ '@types/pdf-parse':
109+ specifier: ^1.1.5
110+ version: 1.1.5
111+ '@types/react':
112+ specifier: ^19.3.0
113+ version: 19.3.0
114+ '@types/react-dom':
115+ specifier: ^19.3.0
116+ version: 19.3.0(@types/react@19.3.0)
117+ eslint:
118+ specifier: ^10.14.0
119+ version: 10.14.0(jiti@2.7.0)
120+ eslint-config-next:
121+ specifier: 16.4.3
122+ version: 16.4.3(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)
123+ playwright:
124+ specifier: ^1.64.1
125+ version: 1.64.1
126+ tailwindcss:
127+ specifier: ^4.3.3
128+ version: 4.3.3
129+ typescript:
130+ specifier: ^5.9.3
131+ version: 5.9.3
132+
133+packages:
134+
135+ '@alloc/quick-lru@5.3.0':
136+ resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==}
137+ engines: {node: '>=10'}
138+
139+ '@antfu/install-pkg@2.1.0':
140+ resolution: {integrity: sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==}
141+
142+ '@anthropic-ai/sdk@1.3.0':
143+ resolution: {integrity: sha512-k7z9BlLLPxfZH+ov7dS6EnaN/wiZeV8YNT1LZfrpAHIy7oY7pHr4UzirF9f2OlHtFEnRBOX+AZQ91Y5fK+TPTw==}
144+ hasBin: true
145+ peerDependencies:
146+ zod: ^3.25.0 || ^4.0.0
147+ peerDependenciesMeta:
148+ zod:
149+ optional: true
150+
151+ '@babel/code-frame@7.29.7':
152+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
153+ engines: {node: '>=6.9.0'}
154+
155+ '@babel/compat-data@7.29.7':
156+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
157+ engines: {node: '>=6.9.0'}
158+
159+ '@babel/core@7.29.7':
160+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
161+ engines: {node: '>=6.9.0'}
162+
163+ '@babel/generator@7.29.12':
164+ resolution: {integrity: sha512-2W76mhjrpQFO1lK5e8IvGYB2D0YZ7S2R1Z2BjO2ZUYuW+amcpK/z60U6ZZmzskwoa7sJ6XohP/Wg8H5KxXI/IA==}
165+ engines: {node: '>=6.9.0'}
166+
167+ '@babel/helper-compilation-targets@7.29.7':
168+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
169+ engines: {node: '>=6.9.0'}
170+
171+ '@babel/helper-globals@7.29.7':
172+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
173+ engines: {node: '>=6.9.0'}
174+
175+ '@babel/helper-module-imports@7.29.7':
176+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
177+ engines: {node: '>=6.9.0'}
178+
179+ '@babel/helper-module-transforms@7.29.7':
180+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
181+ engines: {node: '>=6.9.0'}
182+ peerDependencies:
183+ '@babel/core': ^7.0.0
184+
185+ '@babel/helper-string-parser@7.29.11':
186+ resolution: {integrity: sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==}
187+ engines: {node: '>=6.9.0'}
188+
189+ '@babel/helper-validator-identifier@7.29.7':
190+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
191+ engines: {node: '>=6.9.0'}
192+
193+ '@babel/helper-validator-option@7.29.7':
194+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
195+ engines: {node: '>=6.9.0'}
196+
197+ '@babel/helpers@7.29.10':
198+ resolution: {integrity: sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==}
199+ engines: {node: '>=6.9.0'}
200+
201+ '@babel/parser@7.29.12':
202+ resolution: {integrity: sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==}
203+ engines: {node: '>=6.0.0'}
204+ hasBin: true
205+
206+ '@babel/runtime@7.29.10':
207+ resolution: {integrity: sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==}
208+ engines: {node: '>=6.9.0'}
209+
210+ '@babel/template@7.29.7':
211+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
212+ engines: {node: '>=6.9.0'}
213+
214+ '@babel/traverse@7.29.12':
215+ resolution: {integrity: sha512-MscXe/NAZcOkYEsRajHZFt3ynsb22PUi6CTrp5U7+RYycR9By84mn9mFN54YgfITiqK4hFx3Ju3tZSyzfpS5ew==}
216+ engines: {node: '>=6.9.0'}
217+
218+ '@babel/types@7.29.11':
219+ resolution: {integrity: sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==}
220+ engines: {node: '>=6.9.0'}
221+
222+ '@braintree/sanitize-url@7.1.2':
223+ resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==}
224+
225+ '@cacheable/memory@2.2.0':
226+ resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==}
227+
228+ '@cacheable/utils@2.5.0':
229+ resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==}
230+
231+ '@chevrotain/cst-dts-gen@13.2.0':
232+ resolution: {integrity: sha512-bA9dvWlhAUcHkNwU+8w9yiUxJPlj/Lm3VqS7MD+NbIR/7LmpNLuK/AWNFdCo/T3SK5ND0/UHf3IJvl/Jn/i6yg==}
233+
234+ '@chevrotain/gast@13.2.0':
235+ resolution: {integrity: sha512-bCARdAsG+eEbOveSXcOAC7pVxA04I1ionzeMOwIYf5NX7SaS7zgn4Dgug2BSqoL+iyKeMNSorQjsFSHJHsCNwg==}
236+
237+ '@chevrotain/regexp-to-ast@13.2.0':
238+ resolution: {integrity: sha512-kxpUkLtiaK09ph+dib+Yvm+3sWSnuwlo25gqfKRgTPNmF6H7uW4gVkMjaRdtnN783S9sM6vUNWh9CsxYX4QwKw==}
239+
240+ '@chevrotain/types@13.2.0':
241+ resolution: {integrity: sha512-7qrYHRlKfWf2AvBfJi5eVOrKAkbxvMFsy/iIHTGIiApNcEecCaVIdR+mIQhyCBsTDJxBz4JWXHMo6krbhR9hVg==}
242+
243+ '@chevrotain/utils@13.2.0':
244+ resolution: {integrity: sha512-SzKYY68rseOrb9KILVzPsl6SjkQtdWw01SRGB5aCVI5kFcHltQsOYV3JB0Ffst72DgkvHCyDQ0NLwxtmCCf97Q==}
245+
246+ '@emnapi/core@1.10.0':
247+ resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
248+
249+ '@emnapi/runtime@1.10.0':
250+ resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==}
251+
252+ '@emnapi/runtime@1.11.3':
253+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
254+
255+ '@emnapi/wasi-threads@1.2.1':
256+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
257+
258+ '@esbuild/aix-ppc64@0.28.2':
259+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
260+ engines: {node: '>=18'}
261+ cpu: [ppc64]
262+ os: [aix]
263+
264+ '@esbuild/android-arm64@0.28.2':
265+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
266+ engines: {node: '>=18'}
267+ cpu: [arm64]
268+ os: [android]
269+
270+ '@esbuild/android-arm@0.28.2':
271+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
272+ engines: {node: '>=18'}
273+ cpu: [arm]
274+ os: [android]
275+
276+ '@esbuild/android-x64@0.28.2':
277+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
278+ engines: {node: '>=18'}
279+ cpu: [x64]
280+ os: [android]
281+
282+ '@esbuild/darwin-arm64@0.28.2':
283+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
284+ engines: {node: '>=18'}
285+ cpu: [arm64]
286+ os: [darwin]
287+
288+ '@esbuild/darwin-x64@0.28.2':
289+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
290+ engines: {node: '>=18'}
291+ cpu: [x64]
292+ os: [darwin]
293+
294+ '@esbuild/freebsd-arm64@0.28.2':
295+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
296+ engines: {node: '>=18'}
297+ cpu: [arm64]
298+ os: [freebsd]
299+
300+ '@esbuild/freebsd-x64@0.28.2':
301+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
302+ engines: {node: '>=18'}
303+ cpu: [x64]
304+ os: [freebsd]
305+
306+ '@esbuild/linux-arm64@0.28.2':
307+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
308+ engines: {node: '>=18'}
309+ cpu: [arm64]
310+ os: [linux]
311+
312+ '@esbuild/linux-arm@0.28.2':
313+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
314+ engines: {node: '>=18'}
315+ cpu: [arm]
316+ os: [linux]
317+
318+ '@esbuild/linux-ia32@0.28.2':
319+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
320+ engines: {node: '>=18'}
321+ cpu: [ia32]
322+ os: [linux]
323+
324+ '@esbuild/linux-loong64@0.28.2':
325+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
326+ engines: {node: '>=18'}
327+ cpu: [loong64]
328+ os: [linux]
329+
330+ '@esbuild/linux-mips64el@0.28.2':
331+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
332+ engines: {node: '>=18'}
333+ cpu: [mips64el]
334+ os: [linux]
335+
336+ '@esbuild/linux-ppc64@0.28.2':
337+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
338+ engines: {node: '>=18'}
339+ cpu: [ppc64]
340+ os: [linux]
341+
342+ '@esbuild/linux-riscv64@0.28.2':
343+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
344+ engines: {node: '>=18'}
345+ cpu: [riscv64]
346+ os: [linux]
347+
348+ '@esbuild/linux-s390x@0.28.2':
349+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
350+ engines: {node: '>=18'}
351+ cpu: [s390x]
352+ os: [linux]
353+
354+ '@esbuild/linux-x64@0.28.2':
355+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
356+ engines: {node: '>=18'}
357+ cpu: [x64]
358+ os: [linux]
359+
360+ '@esbuild/netbsd-arm64@0.28.2':
361+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
362+ engines: {node: '>=18'}
363+ cpu: [arm64]
364+ os: [netbsd]
365+
366+ '@esbuild/netbsd-x64@0.28.2':
367+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
368+ engines: {node: '>=18'}
369+ cpu: [x64]
370+ os: [netbsd]
371+
372+ '@esbuild/openbsd-arm64@0.28.2':
373+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
374+ engines: {node: '>=18'}
375+ cpu: [arm64]
376+ os: [openbsd]
377+
378+ '@esbuild/openbsd-x64@0.28.2':
379+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
380+ engines: {node: '>=18'}
381+ cpu: [x64]
382+ os: [openbsd]
383+
384+ '@esbuild/openharmony-arm64@0.28.2':
385+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
386+ engines: {node: '>=18'}
387+ cpu: [arm64]
388+ os: [openharmony]
389+
390+ '@esbuild/sunos-x64@0.28.2':
391+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
392+ engines: {node: '>=18'}
393+ cpu: [x64]
394+ os: [sunos]
395+
396+ '@esbuild/win32-arm64@0.28.2':
397+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
398+ engines: {node: '>=18'}
399+ cpu: [arm64]
400+ os: [win32]
401+
402+ '@esbuild/win32-ia32@0.28.2':
403+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
404+ engines: {node: '>=18'}
405+ cpu: [ia32]
406+ os: [win32]
407+
408+ '@esbuild/win32-x64@0.28.2':
409+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
410+ engines: {node: '>=18'}
411+ cpu: [x64]
412+ os: [win32]
413+
414+ '@eslint-community/eslint-utils@4.10.1':
415+ resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==}
416+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
417+ peerDependencies:
418+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
419+
420+ '@eslint-community/eslint-utils@4.9.1':
421+ resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
422+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
423+ peerDependencies:
424+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
425+
426+ '@eslint-community/regexpp@4.12.2':
427+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
428+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
429+
430+ '@eslint/config-array@0.23.5':
431+ resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==}
432+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
433+
434+ '@eslint/config-helpers@0.7.0':
435+ resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==}
436+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
437+
438+ '@eslint/core@1.2.1':
439+ resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==}
440+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
441+
442+ '@eslint/object-schema@3.0.5':
443+ resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==}
444+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
445+
446+ '@eslint/plugin-kit@0.7.3':
447+ resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==}
448+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
449+
450+ '@humanfs/core@0.19.2':
451+ resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
452+ engines: {node: '>=18.18.0'}
453+
454+ '@humanfs/node@0.16.8':
455+ resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==}
456+ engines: {node: '>=18.18.0'}
457+
458+ '@humanfs/types@0.15.0':
459+ resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==}
460+ engines: {node: '>=18.18.0'}
461+
462+ '@humanwhocodes/module-importer@1.0.1':
463+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
464+ engines: {node: '>=12.22'}
465+
466+ '@humanwhocodes/retry@0.4.3':
467+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
468+ engines: {node: '>=18.18'}
469+
470+ '@iconify/types@2.0.0':
471+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
472+
473+ '@iconify/utils@3.1.7':
474+ resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==}
475+
476+ '@img/colour@1.1.0':
477+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
478+ engines: {node: '>=18'}
479+
480+ '@img/sharp-darwin-arm64@0.35.5':
481+ resolution: {integrity: sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==}
482+ engines: {node: '>=20.9.0'}
483+ cpu: [arm64]
484+ os: [darwin]
485+
486+ '@img/sharp-darwin-x64@0.35.5':
487+ resolution: {integrity: sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==}
488+ engines: {node: '>=20.9.0'}
489+ cpu: [x64]
490+ os: [darwin]
491+
492+ '@img/sharp-freebsd-wasm32@0.35.5':
493+ resolution: {integrity: sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==}
494+ engines: {node: '>=20.9.0'}
495+ os: [freebsd]
496+
497+ '@img/sharp-libvips-darwin-arm64@1.3.4':
498+ resolution: {integrity: sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==}
499+ cpu: [arm64]
500+ os: [darwin]
501+
502+ '@img/sharp-libvips-darwin-x64@1.3.4':
503+ resolution: {integrity: sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==}
504+ cpu: [x64]
505+ os: [darwin]
506+
507+ '@img/sharp-libvips-linux-arm64@1.3.4':
508+ resolution: {integrity: sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==}
509+ cpu: [arm64]
510+ os: [linux]
511+ libc: [glibc]
512+
513+ '@img/sharp-libvips-linux-arm@1.3.4':
514+ resolution: {integrity: sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==}
515+ cpu: [arm]
516+ os: [linux]
517+ libc: [glibc]
518+
519+ '@img/sharp-libvips-linux-ppc64@1.3.4':
520+ resolution: {integrity: sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==}
521+ cpu: [ppc64]
522+ os: [linux]
523+ libc: [glibc]
524+
525+ '@img/sharp-libvips-linux-riscv64@1.3.4':
526+ resolution: {integrity: sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==}
527+ cpu: [riscv64]
528+ os: [linux]
529+ libc: [glibc]
530+
531+ '@img/sharp-libvips-linux-s390x@1.3.4':
532+ resolution: {integrity: sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==}
533+ cpu: [s390x]
534+ os: [linux]
535+ libc: [glibc]
536+
537+ '@img/sharp-libvips-linux-x64@1.3.4':
538+ resolution: {integrity: sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==}
539+ cpu: [x64]
540+ os: [linux]
541+ libc: [glibc]
542+
543+ '@img/sharp-libvips-linuxmusl-arm64@1.3.4':
544+ resolution: {integrity: sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==}
545+ cpu: [arm64]
546+ os: [linux]
547+ libc: [musl]
548+
549+ '@img/sharp-libvips-linuxmusl-x64@1.3.4':
550+ resolution: {integrity: sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==}
551+ cpu: [x64]
552+ os: [linux]
553+ libc: [musl]
554+
555+ '@img/sharp-linux-arm64@0.35.5':
556+ resolution: {integrity: sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==}
557+ engines: {node: '>=20.9.0'}
558+ cpu: [arm64]
559+ os: [linux]
560+ libc: [glibc]
561+
562+ '@img/sharp-linux-arm@0.35.5':
563+ resolution: {integrity: sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==}
564+ engines: {node: '>=20.9.0'}
565+ cpu: [arm]
566+ os: [linux]
567+ libc: [glibc]
568+
569+ '@img/sharp-linux-ppc64@0.35.5':
570+ resolution: {integrity: sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==}
571+ engines: {node: '>=20.9.0'}
572+ cpu: [ppc64]
573+ os: [linux]
574+ libc: [glibc]
575+
576+ '@img/sharp-linux-riscv64@0.35.5':
577+ resolution: {integrity: sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==}
578+ engines: {node: '>=20.9.0'}
579+ cpu: [riscv64]
580+ os: [linux]
581+ libc: [glibc]
582+
583+ '@img/sharp-linux-s390x@0.35.5':
584+ resolution: {integrity: sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==}
585+ engines: {node: '>=20.9.0'}
586+ cpu: [s390x]
587+ os: [linux]
588+ libc: [glibc]
589+
590+ '@img/sharp-linux-x64@0.35.5':
591+ resolution: {integrity: sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==}
592+ engines: {node: '>=20.9.0'}
593+ cpu: [x64]
594+ os: [linux]
595+ libc: [glibc]
596+
597+ '@img/sharp-linuxmusl-arm64@0.35.5':
598+ resolution: {integrity: sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==}
599+ engines: {node: '>=20.9.0'}
600+ cpu: [arm64]
601+ os: [linux]
602+ libc: [musl]
603+
604+ '@img/sharp-linuxmusl-x64@0.35.5':
605+ resolution: {integrity: sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==}
606+ engines: {node: '>=20.9.0'}
607+ cpu: [x64]
608+ os: [linux]
609+ libc: [musl]
610+
611+ '@img/sharp-wasm32@0.35.5':
612+ resolution: {integrity: sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==}
613+ engines: {node: '>=20.9.0'}
614+
615+ '@img/sharp-webcontainers-wasm32@0.35.5':
616+ resolution: {integrity: sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==}
617+ engines: {node: '>=20.9.0'}
618+ cpu: [wasm32]
619+
620+ '@img/sharp-win32-arm64@0.35.5':
621+ resolution: {integrity: sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==}
622+ engines: {node: '>=20.9.0'}
623+ cpu: [arm64]
624+ os: [win32]
625+
626+ '@img/sharp-win32-ia32@0.35.5':
627+ resolution: {integrity: sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==}
628+ engines: {node: ^20.9.0}
629+ cpu: [ia32]
630+ os: [win32]
631+
632+ '@img/sharp-win32-x64@0.35.5':
633+ resolution: {integrity: sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==}
634+ engines: {node: '>=20.9.0'}
635+ cpu: [x64]
636+ os: [win32]
637+
638+ '@jridgewell/gen-mapping@0.3.13':
639+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
640+
641+ '@jridgewell/remapping@2.3.5':
642+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
643+
644+ '@jridgewell/resolve-uri@3.1.2':
645+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
646+ engines: {node: '>=6.0.0'}
647+
648+ '@jridgewell/sourcemap-codec@1.6.0':
649+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
650+
651+ '@jridgewell/trace-mapping@0.3.31':
652+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
653+
654+ '@keyv/bigmap@1.3.1':
655+ resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
656+ engines: {node: '>= 18'}
657+ peerDependencies:
658+ keyv: ^5.6.0
659+
660+ '@keyv/serialize@1.1.1':
661+ resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
662+
663+ '@mermaid-js/parser@2.0.1':
664+ resolution: {integrity: sha512-j37dj/h6p6pots1L7pLPPNuABEEu9WP4OYg9pW1g+nYG331j0+3canE9OagtYdytYvdSAMG+2fKU5cxep6LgjA==}
665+ engines: {node: '>=22.12.0'}
666+
667+ '@napi-rs/canvas-android-arm64@0.1.80':
668+ resolution: {integrity: sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==}
669+ engines: {node: '>= 10'}
670+ cpu: [arm64]
671+ os: [android]
672+
673+ '@napi-rs/canvas-darwin-arm64@0.1.80':
674+ resolution: {integrity: sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==}
675+ engines: {node: '>= 10'}
676+ cpu: [arm64]
677+ os: [darwin]
678+
679+ '@napi-rs/canvas-darwin-x64@0.1.80':
680+ resolution: {integrity: sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==}
681+ engines: {node: '>= 10'}
682+ cpu: [x64]
683+ os: [darwin]
684+
685+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
686+ resolution: {integrity: sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==}
687+ engines: {node: '>= 10'}
688+ cpu: [arm]
689+ os: [linux]
690+
691+ '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
692+ resolution: {integrity: sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==}
693+ engines: {node: '>= 10'}
694+ cpu: [arm64]
695+ os: [linux]
696+ libc: [glibc]
697+
698+ '@napi-rs/canvas-linux-arm64-musl@0.1.80':
699+ resolution: {integrity: sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==}
700+ engines: {node: '>= 10'}
701+ cpu: [arm64]
702+ os: [linux]
703+ libc: [musl]
704+
705+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
706+ resolution: {integrity: sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==}
707+ engines: {node: '>= 10'}
708+ cpu: [riscv64]
709+ os: [linux]
710+ libc: [glibc]
711+
712+ '@napi-rs/canvas-linux-x64-gnu@0.1.80':
713+ resolution: {integrity: sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==}
714+ engines: {node: '>= 10'}
715+ cpu: [x64]
716+ os: [linux]
717+ libc: [glibc]
718+
719+ '@napi-rs/canvas-linux-x64-musl@0.1.80':
720+ resolution: {integrity: sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==}
721+ engines: {node: '>= 10'}
722+ cpu: [x64]
723+ os: [linux]
724+ libc: [musl]
725+
726+ '@napi-rs/canvas-win32-x64-msvc@0.1.80':
727+ resolution: {integrity: sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==}
728+ engines: {node: '>= 10'}
729+ cpu: [x64]
730+ os: [win32]
731+
732+ '@napi-rs/canvas@0.1.80':
733+ resolution: {integrity: sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==}
734+ engines: {node: '>= 10'}
735+
736+ '@napi-rs/wasm-runtime@1.2.6':
737+ resolution: {integrity: sha512-mRyDmEw9/fCDXCGfL1sbgIw/GUK0PVxRW4YwgPN61F3LQ+fSyoBFarJVzgGyhF6kRzEQZ0FejDqm4WLXSeqQmw==}
738+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
739+ peerDependencies:
740+ '@emnapi/core': ^1.7.1 || 2.0.0-beta.2
741+ '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2
742+
743+ '@next/env@16.4.3':
744+ resolution: {integrity: sha512-a7tz1QCcWWkwC/rPJcPMJk/UNRu9CFhDd3OHYE5hddbJrs8BqRTalxI6GlKCWEGzRLHN+S/B7a4PAHCtm25aBQ==}
745+
746+ '@next/eslint-plugin-next@16.4.3':
747+ resolution: {integrity: sha512-oxuC06wt/71h6ACYCV9GbKOfnf5a7VlRe/p80YHTut15TNgDEmynDnaq8t/xhy5rlvk7dhItIPs6H3rvIM4kyw==}
748+
749+ '@next/swc-darwin-arm64@16.4.3':
750+ resolution: {integrity: sha512-4yq5EXBt+VDtAZwTyfijaFp5D2C5oz3Ikw5a2kiX2K9nw72vrZX2q5UuAlkPtUMO1tQz6JTKpaKWjS7OOefTDQ==}
751+ engines: {node: '>= 10'}
752+ cpu: [arm64]
753+ os: [darwin]
754+
755+ '@next/swc-darwin-x64@16.4.3':
756+ resolution: {integrity: sha512-1Rvkn/LUhnEF8WxnRkOrqGhbwXui1bkWFxONKIbN+r7C+9KHDSZ+iUoj4CzymVMWUyZIyx9szcb9+kbKhD500A==}
757+ engines: {node: '>= 10'}
758+ cpu: [x64]
759+ os: [darwin]
760+
761+ '@next/swc-linux-arm64-gnu@16.4.3':
762+ resolution: {integrity: sha512-dCKpXErGg3abUM6t5JTJV/ottVBTStJB5lRJTbgdUdQaQ+jNHiK56Hsc0YAEg/rinSh42hYG3HWiYmEMdilnxg==}
763+ engines: {node: '>= 10'}
764+ cpu: [arm64]
765+ os: [linux]
766+ libc: [glibc]
767+
768+ '@next/swc-linux-arm64-musl@16.4.3':
769+ resolution: {integrity: sha512-WwYbhWkhYBvBtib1K4W0kL8MW2snBD2A5b3SN4vPpqalZbZs5+bQ1yzAdepVoOqrFfEW3dmREy4Zs1MrWcrFbw==}
770+ engines: {node: '>= 10'}
771+ cpu: [arm64]
772+ os: [linux]
773+ libc: [musl]
774+
775+ '@next/swc-linux-x64-gnu@16.4.3':
776+ resolution: {integrity: sha512-QymWvfUwDEC5/lpJOsxX5VAbyoR2D13+2Jsjz4be7gT4LPqEgdpkeLIR/HFfCLgKzoMhpJbp6I/JnogyNZHcaA==}
777+ engines: {node: '>= 10'}
778+ cpu: [x64]
779+ os: [linux]
780+ libc: [glibc]
781+
782+ '@next/swc-linux-x64-musl@16.4.3':
783+ resolution: {integrity: sha512-Vmjd9D7DpA4Vv3cUlr82QWgJD/BQZmns801vtC5VWHg6jCIA4a5vMKpQnfrM2pyCrp2eV0ENdUg4PlN3bAc2Yw==}
784+ engines: {node: '>= 10'}
785+ cpu: [x64]
786+ os: [linux]
787+ libc: [musl]
788+
789+ '@next/swc-win32-arm64-msvc@16.4.3':
790+ resolution: {integrity: sha512-lG1pPdPLk7gTyGb00n5JIMLdBJgjb+UEhSdZvFbhUMg0DyC6z4B7RnpSKF9VCd4imkLObVbXOFA0kFCpw7yFow==}
791+ engines: {node: '>= 10'}
792+ cpu: [arm64]
793+ os: [win32]
794+
795+ '@next/swc-win32-x64-msvc@16.4.3':
796+ resolution: {integrity: sha512-NmQC9RkJdnPXRaMxtkCzobB3teVjqF33oSOnwDfi+XYGWWYpt+xlGK3mtktSKLbdjwaWbJu2OkkMiRFGUUncKg==}
797+ engines: {node: '>= 10'}
798+ cpu: [x64]
799+ os: [win32]
800+
801+ '@node-rs/argon2-android-arm-eabi@2.2.2':
802+ resolution: {integrity: sha512-c11BOrPLBWNC1cDyzGB+Bil+flmxfZbB2hv8EhcobmAsFKMyqkHPNhUY4qhcjv1U+4+Vmw4G8H+l224iO2g/Dw==}
803+ engines: {node: '>= 10'}
804+ cpu: [arm]
805+ os: [android]
806+
807+ '@node-rs/argon2-android-arm64@2.2.2':
808+ resolution: {integrity: sha512-dpMYIoxhN/wY6hFH+3MM5kQErcH3luMekkszbkDF3NKqhB1kFRntkOLDpFY87oItBSHJrsoYkXC3vBRhjYoCjQ==}
809+ engines: {node: '>= 10'}
810+ cpu: [arm64]
811+ os: [android]
812+
813+ '@node-rs/argon2-darwin-arm64@2.2.2':
814+ resolution: {integrity: sha512-vxVAXcIG0iiHizkCuImmzVhOFsRnU4Z79xiOxdISLyI+QhOAWbbTaVSXw0PNfThB3zAdkzzDJ/WWu52Hs/qHGg==}
815+ engines: {node: '>= 10'}
816+ cpu: [arm64]
817+ os: [darwin]
818+
819+ '@node-rs/argon2-darwin-x64@2.2.2':
820+ resolution: {integrity: sha512-r7GbSFpFZZ9EAV9cvIm9prUjOupK7QQXTyP+FJ6bWSMq0h+qRDBlUOXQXduDIIrLEGoBVelixKUtf4ksZ0ljoQ==}
821+ engines: {node: '>= 10'}
822+ cpu: [x64]
823+ os: [darwin]
824+
825+ '@node-rs/argon2-freebsd-x64@2.2.2':
826+ resolution: {integrity: sha512-AmWxDSmQgprilD6NX3jmxCgcDvWAW7kGJnnWQo+0qav6nfMXdPZYgSezK/skmw1GBWipr4yZMIUzpeNHnVpMxg==}
827+ engines: {node: '>= 10'}
828+ cpu: [x64]
829+ os: [freebsd]
830+
831+ '@node-rs/argon2-linux-arm-gnueabihf@2.2.2':
832+ resolution: {integrity: sha512-M1gnPBTr9GFeEUWkQ53qCJeTsX03C3kcUeHnDbN7dU2xkI58wMP4Z1sEBN7WmKJ/fTHYEgti4truz7r4A82DLg==}
833+ engines: {node: '>= 10'}
834+ cpu: [arm]
835+ os: [linux]
836+
837+ '@node-rs/argon2-linux-arm64-gnu@2.2.2':
838+ resolution: {integrity: sha512-4CYDlIdITlLSVcAXYUtEoGUahRaayPXM+4Rcfg3BZx9WGi6UB8HUycs6GNMTPYXV5kVXCpyE2u1HmYUpgmIzOQ==}
839+ engines: {node: '>= 10'}
840+ cpu: [arm64]
841+ os: [linux]
842+ libc: [glibc]
843+
844+ '@node-rs/argon2-linux-arm64-musl@2.2.2':
845+ resolution: {integrity: sha512-FYlfj3XgQ1xrx6HzQbKbUcKiYMG/3iSi/X81KyhHaItTJ7vZlMwrbVLl9yqDmvotKUF6VjrhrlZ8KRbbzchseA==}
846+ engines: {node: '>= 10'}
847+ cpu: [arm64]
848+ os: [linux]
849+ libc: [musl]
850+
851+ '@node-rs/argon2-linux-x64-gnu@2.2.2':
852+ resolution: {integrity: sha512-ULXLs8UFYZANlwiROM7AeccxZndr2Xk3IstADq3jAUhnwV2W75mxMBTABUZ+7AdKRhPLOrxU77OgnMWlDkYJQg==}
853+ engines: {node: '>= 10'}
854+ cpu: [x64]
855+ os: [linux]
856+ libc: [glibc]
857+
858+ '@node-rs/argon2-linux-x64-musl@2.2.2':
859+ resolution: {integrity: sha512-zgjIwc9TyGodn62vGc+36DGwFqVV5e7L8Ptd2FQWuBxe5aFrcFxvtDGn1/qfYwoHLv09utgtR+RBAPCXepWG3Q==}
860+ engines: {node: '>= 10'}
861+ cpu: [x64]
862+ os: [linux]
863+ libc: [musl]
864+
865+ '@node-rs/argon2-win32-arm64-msvc@2.2.2':
866+ resolution: {integrity: sha512-3nLhvLie/ec5xfxUBXXqGMb7oGeqF+YXrcGckqaTaGkPtOBozho0Kh2IuP/zi9BcOriirTG2LW3gtIOfpuh+mQ==}
867+ engines: {node: '>= 10'}
868+ cpu: [arm64]
869+ os: [win32]
870+
871+ '@node-rs/argon2-win32-ia32-msvc@2.2.2':
872+ resolution: {integrity: sha512-6RJKD6cFl7UeiYJLjRsXPywVXSFSaSDdr6xGpztNDV31QHCEecWnsnNmKxzi4gVpln2F9XeWEtIgM4Nqw1hLbA==}
873+ engines: {node: '>= 10'}
874+ cpu: [ia32]
875+ os: [win32]
876+
877+ '@node-rs/argon2-win32-x64-msvc@2.2.2':
878+ resolution: {integrity: sha512-dQOO9S4QKBaVul0Uyk/2quJc/OBeHNZRJP+GZZTy1A5kYIaAfIJGHUYLY6oFoAlcuLIkdFouLaHX3fCl8tZm/w==}
879+ engines: {node: '>= 10'}
880+ cpu: [x64]
881+ os: [win32]
882+
883+ '@node-rs/argon2@2.2.2':
884+ resolution: {integrity: sha512-NtdlPPWtR5U4BxX5EGJYza+UklNaoWORmkaKCMqf/nyKeXWKVwNt8KfQoRpNT7OB1DcEwmePafO4wZyW+sbfCQ==}
885+ engines: {node: '>= 10'}
886+
887+ '@nodelib/fs.scandir@2.1.5':
888+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
889+ engines: {node: '>= 8'}
890+
891+ '@nodelib/fs.stat@2.0.5':
892+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
893+ engines: {node: '>= 8'}
894+
895+ '@nodelib/fs.walk@1.2.8':
896+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
897+ engines: {node: '>= 8'}
898+
899+ '@nolyfill/is-core-module@1.0.39':
900+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==}
901+ engines: {node: '>=12.4.0'}
902+
903+ '@opentelemetry/api@1.10.0':
904+ resolution: {integrity: sha512-lMkyes8iHrG+mk6WH7X70MdCLI2RS0FwNBY1PyQ8UemaijE2m5mv5A0Niy3HtbYTFrgkUEQjFMXmSAk2hQDuPQ==}
905+ engines: {node: '>=8.0.0'}
906+
907+ '@reduxjs/toolkit@2.13.0':
908+ resolution: {integrity: sha512-f6jwVRfwW30+tnllz4YcsHHpPYYOE7abcHkyUCovD+P7DyhdAI5prz2Fh/8TLhakjpN+7aIEion1s5L/tvlYlA==}
909+ peerDependencies:
910+ react: ^16.9.0 || ^17.0.0 || ^18 || ^19
911+ react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
912+ peerDependenciesMeta:
913+ react:
914+ optional: true
915+ react-redux:
916+ optional: true
917+
918+ '@rtsao/scc@1.1.0':
919+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
920+
921+ '@stablelib/base64@1.0.1':
922+ resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==}
923+
924+ '@standard-schema/spec@1.1.0':
925+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
926+
927+ '@standard-schema/utils@0.3.0':
928+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
929+
930+ '@swc/helpers@0.5.23':
931+ resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
932+
933+ '@tailwindcss/node@4.3.3':
934+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
935+
936+ '@tailwindcss/oxide-android-arm64@4.3.3':
937+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
938+ engines: {node: '>= 20'}
939+ cpu: [arm64]
940+ os: [android]
941+
942+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
943+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
944+ engines: {node: '>= 20'}
945+ cpu: [arm64]
946+ os: [darwin]
947+
948+ '@tailwindcss/oxide-darwin-x64@4.3.3':
949+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
950+ engines: {node: '>= 20'}
951+ cpu: [x64]
952+ os: [darwin]
953+
954+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
955+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
956+ engines: {node: '>= 20'}
957+ cpu: [x64]
958+ os: [freebsd]
959+
960+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
961+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
962+ engines: {node: '>= 20'}
963+ cpu: [arm]
964+ os: [linux]
965+
966+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
967+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
968+ engines: {node: '>= 20'}
969+ cpu: [arm64]
970+ os: [linux]
971+ libc: [glibc]
972+
973+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
974+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
975+ engines: {node: '>= 20'}
976+ cpu: [arm64]
977+ os: [linux]
978+ libc: [musl]
979+
980+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
981+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
982+ engines: {node: '>= 20'}
983+ cpu: [x64]
984+ os: [linux]
985+ libc: [glibc]
986+
987+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
988+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
989+ engines: {node: '>= 20'}
990+ cpu: [x64]
991+ os: [linux]
992+ libc: [musl]
993+
994+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
995+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
996+ engines: {node: '>=14.0.0'}
997+ cpu: [wasm32]
998+ bundledDependencies:
999+ - '@napi-rs/wasm-runtime'
1000+ - '@emnapi/core'
1001+ - '@emnapi/runtime'
1002+ - '@tybys/wasm-util'
1003+ - '@emnapi/wasi-threads'
1004+ - tslib
1005+
1006+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
1007+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
1008+ engines: {node: '>= 20'}
1009+ cpu: [arm64]
1010+ os: [win32]
1011+
1012+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
1013+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
1014+ engines: {node: '>= 20'}
1015+ cpu: [x64]
1016+ os: [win32]
1017+
1018+ '@tailwindcss/oxide@4.3.3':
1019+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
1020+ engines: {node: '>= 20'}
1021+
1022+ '@tailwindcss/postcss@4.3.3':
1023+ resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
1024+
1025+ '@tybys/wasm-util@0.10.4':
1026+ resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==}
1027+
1028+ '@types/d3-array@3.2.2':
1029+ resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
1030+
1031+ '@types/d3-axis@3.0.6':
1032+ resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==}
1033+
1034+ '@types/d3-brush@3.0.6':
1035+ resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==}
1036+
1037+ '@types/d3-chord@3.0.6':
1038+ resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==}
1039+
1040+ '@types/d3-color@3.1.3':
1041+ resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==}
1042+
1043+ '@types/d3-contour@3.0.6':
1044+ resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==}
1045+
1046+ '@types/d3-delaunay@6.0.4':
1047+ resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==}
1048+
1049+ '@types/d3-dispatch@3.0.7':
1050+ resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==}
1051+
1052+ '@types/d3-drag@3.0.7':
1053+ resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==}
1054+
1055+ '@types/d3-dsv@3.0.7':
1056+ resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==}
1057+
1058+ '@types/d3-ease@3.0.2':
1059+ resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==}
1060+
1061+ '@types/d3-fetch@3.0.7':
1062+ resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==}
1063+
1064+ '@types/d3-force@3.0.10':
1065+ resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==}
1066+
1067+ '@types/d3-format@3.0.4':
1068+ resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==}
1069+
1070+ '@types/d3-geo@3.1.1':
1071+ resolution: {integrity: sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==}
1072+
1073+ '@types/d3-hierarchy@3.1.7':
1074+ resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==}
1075+
1076+ '@types/d3-interpolate@3.0.4':
1077+ resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==}
1078+
1079+ '@types/d3-path@3.1.1':
1080+ resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==}
1081+
1082+ '@types/d3-polygon@3.0.2':
1083+ resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==}
1084+
1085+ '@types/d3-quadtree@3.0.6':
1086+ resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==}
1087+
1088+ '@types/d3-random@3.0.4':
1089+ resolution: {integrity: sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==}
1090+
1091+ '@types/d3-scale-chromatic@3.1.0':
1092+ resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==}
1093+
1094+ '@types/d3-scale@4.0.9':
1095+ resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==}
1096+
1097+ '@types/d3-selection@3.0.12':
1098+ resolution: {integrity: sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==}
1099+
1100+ '@types/d3-shape@3.2.0':
1101+ resolution: {integrity: sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==}
1102+
1103+ '@types/d3-time-format@4.0.3':
1104+ resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
1105+
1106+ '@types/d3-time@3.0.4':
1107+ resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==}
1108+
1109+ '@types/d3-timer@3.0.2':
1110+ resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==}
1111+
1112+ '@types/d3-transition@3.0.9':
1113+ resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
1114+
1115+ '@types/d3-zoom@3.0.9':
1116+ resolution: {integrity: sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==}
1117+
1118+ '@types/d3@7.4.3':
1119+ resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
1120+
1121+ '@types/debug@4.1.13':
1122+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
1123+
1124+ '@types/esrecurse@4.3.1':
1125+ resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==}
1126+
1127+ '@types/estree-jsx@1.0.5':
1128+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
1129+
1130+ '@types/estree@1.0.10':
1131+ resolution: {integrity: sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==}
1132+
1133+ '@types/geojson@7946.0.16':
1134+ resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
1135+
1136+ '@types/hast@3.0.5':
1137+ resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==}
1138+
1139+ '@types/json-schema@7.0.15':
1140+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
1141+
1142+ '@types/json5@0.0.29':
1143+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
1144+
1145+ '@types/katex@0.16.8':
1146+ resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==}
1147+
1148+ '@types/mdast@4.0.4':
1149+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
1150+
1151+ '@types/ms@2.1.0':
1152+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
1153+
1154+ '@types/node@26.6.6':
1155+ resolution: {integrity: sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==}
1156+
1157+ '@types/pdf-parse@1.1.5':
1158+ resolution: {integrity: sha512-kBfrSXsloMnUJOKi25s3+hRmkycHfLK6A09eRGqF/N8BkQoPUmaCr+q8Cli5FnfohEz/rsv82zAiPz/LXtOGhA==}
1159+
1160+ '@types/pngjs@6.0.5':
1161+ resolution: {integrity: sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==}
1162+
1163+ '@types/react-dom@19.3.0':
1164+ resolution: {integrity: sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==}
1165+ peerDependencies:
1166+ '@types/react': ^19.3.0
1167+
1168+ '@types/react@19.3.0':
1169+ resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==}
1170+
1171+ '@types/trusted-types@2.0.7':
1172+ resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
1173+
1174+ '@types/unist@2.0.11':
1175+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
1176+
1177+ '@types/unist@3.0.3':
1178+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
1179+
1180+ '@types/use-sync-external-store@0.0.6':
1181+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
1182+
1183+ '@typescript-eslint/eslint-plugin@8.72.1':
1184+ resolution: {integrity: sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==}
1185+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1186+ peerDependencies:
1187+ '@typescript-eslint/parser': ^8.72.1
1188+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
1189+ typescript: '>=4.8.4 <6.1.0'
1190+
1191+ '@typescript-eslint/parser@8.72.1':
1192+ resolution: {integrity: sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==}
1193+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1194+ peerDependencies:
1195+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
1196+ typescript: '>=4.8.4 <6.1.0'
1197+
1198+ '@typescript-eslint/project-service@8.72.1':
1199+ resolution: {integrity: sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==}
1200+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1201+ peerDependencies:
1202+ typescript: '>=4.8.4 <6.1.0'
1203+
1204+ '@typescript-eslint/scope-manager@8.72.1':
1205+ resolution: {integrity: sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==}
1206+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1207+
1208+ '@typescript-eslint/tsconfig-utils@8.72.1':
1209+ resolution: {integrity: sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==}
1210+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1211+ peerDependencies:
1212+ typescript: '>=4.8.4 <6.1.0'
1213+
1214+ '@typescript-eslint/type-utils@8.72.1':
1215+ resolution: {integrity: sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==}
1216+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1217+ peerDependencies:
1218+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
1219+ typescript: '>=4.8.4 <6.1.0'
1220+
1221+ '@typescript-eslint/types@8.72.1':
1222+ resolution: {integrity: sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==}
1223+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1224+
1225+ '@typescript-eslint/typescript-estree@8.72.1':
1226+ resolution: {integrity: sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==}
1227+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1228+ peerDependencies:
1229+ typescript: '>=4.8.4 <6.1.0'
1230+
1231+ '@typescript-eslint/utils@8.72.1':
1232+ resolution: {integrity: sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==}
1233+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1234+ peerDependencies:
1235+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
1236+ typescript: '>=4.8.4 <6.1.0'
1237+
1238+ '@typescript-eslint/visitor-keys@8.72.1':
1239+ resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==}
1240+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1241+
1242+ '@ungap/structured-clone@1.4.0':
1243+ resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==}
1244+
1245+ '@unrs/resolver-binding-android-arm-eabi@1.12.2':
1246+ resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==}
1247+ cpu: [arm]
1248+ os: [android]
1249+
1250+ '@unrs/resolver-binding-android-arm64@1.12.2':
1251+ resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==}
1252+ cpu: [arm64]
1253+ os: [android]
1254+
1255+ '@unrs/resolver-binding-darwin-arm64@1.12.2':
1256+ resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==}
1257+ cpu: [arm64]
1258+ os: [darwin]
1259+
1260+ '@unrs/resolver-binding-darwin-x64@1.12.2':
1261+ resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==}
1262+ cpu: [x64]
1263+ os: [darwin]
1264+
1265+ '@unrs/resolver-binding-freebsd-x64@1.12.2':
1266+ resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==}
1267+ cpu: [x64]
1268+ os: [freebsd]
1269+
1270+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2':
1271+ resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==}
1272+ cpu: [arm]
1273+ os: [linux]
1274+
1275+ '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2':
1276+ resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==}
1277+ cpu: [arm]
1278+ os: [linux]
1279+
1280+ '@unrs/resolver-binding-linux-arm64-gnu@1.12.2':
1281+ resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==}
1282+ cpu: [arm64]
1283+ os: [linux]
1284+ libc: [glibc]
1285+
1286+ '@unrs/resolver-binding-linux-arm64-musl@1.12.2':
1287+ resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==}
1288+ cpu: [arm64]
1289+ os: [linux]
1290+ libc: [musl]
1291+
1292+ '@unrs/resolver-binding-linux-loong64-gnu@1.12.2':
1293+ resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==}
1294+ cpu: [loong64]
1295+ os: [linux]
1296+ libc: [glibc]
1297+
1298+ '@unrs/resolver-binding-linux-loong64-musl@1.12.2':
1299+ resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==}
1300+ cpu: [loong64]
1301+ os: [linux]
1302+ libc: [musl]
1303+
1304+ '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2':
1305+ resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==}
1306+ cpu: [ppc64]
1307+ os: [linux]
1308+ libc: [glibc]
1309+
1310+ '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2':
1311+ resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==}
1312+ cpu: [riscv64]
1313+ os: [linux]
1314+ libc: [glibc]
1315+
1316+ '@unrs/resolver-binding-linux-riscv64-musl@1.12.2':
1317+ resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==}
1318+ cpu: [riscv64]
1319+ os: [linux]
1320+ libc: [musl]
1321+
1322+ '@unrs/resolver-binding-linux-s390x-gnu@1.12.2':
1323+ resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==}
1324+ cpu: [s390x]
1325+ os: [linux]
1326+ libc: [glibc]
1327+
1328+ '@unrs/resolver-binding-linux-x64-gnu@1.12.2':
1329+ resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==}
1330+ cpu: [x64]
1331+ os: [linux]
1332+ libc: [glibc]
1333+
1334+ '@unrs/resolver-binding-linux-x64-musl@1.12.2':
1335+ resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==}
1336+ cpu: [x64]
1337+ os: [linux]
1338+ libc: [musl]
1339+
1340+ '@unrs/resolver-binding-openharmony-arm64@1.12.2':
1341+ resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==}
1342+ cpu: [arm64]
1343+ os: [openharmony]
1344+
1345+ '@unrs/resolver-binding-wasm32-wasi@1.12.2':
1346+ resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==}
1347+ engines: {node: '>=14.0.0'}
1348+ cpu: [wasm32]
1349+
1350+ '@unrs/resolver-binding-win32-arm64-msvc@1.12.2':
1351+ resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==}
1352+ cpu: [arm64]
1353+ os: [win32]
1354+
1355+ '@unrs/resolver-binding-win32-ia32-msvc@1.12.2':
1356+ resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==}
1357+ cpu: [ia32]
1358+ os: [win32]
1359+
1360+ '@unrs/resolver-binding-win32-x64-msvc@1.12.2':
1361+ resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==}
1362+ cpu: [x64]
1363+ os: [win32]
1364+
1365+ '@upsetjs/venn.js@2.0.0':
1366+ resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==}
1367+
1368+ '@xmldom/xmldom@0.8.15':
1369+ resolution: {integrity: sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==}
1370+ engines: {node: '>=10.0.0'}
1371+
1372+ acorn-jsx@5.3.2:
1373+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
1374+ peerDependencies:
1375+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
1376+
1377+ acorn@8.19.0:
1378+ resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==}
1379+ engines: {node: '>=0.4.0'}
1380+ hasBin: true
1381+
1382+ adler-32@1.3.1:
1383+ resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
1384+ engines: {node: '>=0.8'}
1385+
1386+ ajv@6.15.0:
1387+ resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==}
1388+
1389+ argparse@1.0.10:
1390+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
1391+
1392+ aria-query@5.3.2:
1393+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
1394+ engines: {node: '>= 0.4'}
1395+
1396+ array-buffer-byte-length@1.0.2:
1397+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
1398+ engines: {node: '>= 0.4'}
1399+
1400+ array-includes@3.2.0:
1401+ resolution: {integrity: sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==}
1402+ engines: {node: '>= 0.4'}
1403+
1404+ array.prototype.findlast@1.2.5:
1405+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
1406+ engines: {node: '>= 0.4'}
1407+
1408+ array.prototype.findlastindex@1.2.6:
1409+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
1410+ engines: {node: '>= 0.4'}
1411+
1412+ array.prototype.flat@1.3.3:
1413+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
1414+ engines: {node: '>= 0.4'}
1415+
1416+ array.prototype.flatmap@1.3.3:
1417+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
1418+ engines: {node: '>= 0.4'}
1419+
1420+ array.prototype.tosorted@1.1.4:
1421+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
1422+ engines: {node: '>= 0.4'}
1423+
1424+ arraybuffer.prototype.slice@1.0.4:
1425+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
1426+ engines: {node: '>= 0.4'}
1427+
1428+ ast-types-flow@0.0.8:
1429+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
1430+
1431+ async-function@1.0.0:
1432+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
1433+ engines: {node: '>= 0.4'}
1434+
1435+ available-typed-arrays@1.0.7:
1436+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
1437+ engines: {node: '>= 0.4'}
1438+
1439+ axe-core@4.14.0:
1440+ resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==}
1441+ engines: {node: '>=4'}
1442+
1443+ axobject-query@4.1.0:
1444+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
1445+ engines: {node: '>= 0.4'}
1446+
1447+ bail@2.0.2:
1448+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
1449+
1450+ balanced-match@1.0.2:
1451+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
1452+
1453+ balanced-match@4.0.4:
1454+ resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
1455+ engines: {node: 18 || 20 || >=22}
1456+
1457+ base64-js@1.5.1:
1458+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
1459+
1460+ baseline-browser-mapping@2.11.34:
1461+ resolution: {integrity: sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==}
1462+ engines: {node: '>=6.0.0'}
1463+ hasBin: true
1464+
1465+ brace-expansion@1.1.21:
1466+ resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==}
1467+
1468+ brace-expansion@5.0.12:
1469+ resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==}
1470+ engines: {node: 20 || >=22}
1471+
1472+ braces@3.0.3:
1473+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
1474+ engines: {node: '>=8'}
1475+
1476+ browserslist@4.29.5:
1477+ resolution: {integrity: sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==}
1478+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
1479+ hasBin: true
1480+
1481+ cacheable@2.5.0:
1482+ resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==}
1483+
1484+ call-bind-apply-helpers@1.0.2:
1485+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
1486+ engines: {node: '>= 0.4'}
1487+
1488+ call-bind@1.0.9:
1489+ resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==}
1490+ engines: {node: '>= 0.4'}
1491+
1492+ call-bound@1.0.4:
1493+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
1494+ engines: {node: '>= 0.4'}
1495+
1496+ caniuse-lite@1.0.30001820:
1497+ resolution: {integrity: sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==}
1498+
1499+ ccount@2.0.1:
1500+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
1501+
1502+ cfb@1.2.2:
1503+ resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==}
1504+ engines: {node: '>=0.8'}
1505+
1506+ character-entities-html4@2.1.0:
1507+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
1508+
1509+ character-entities-legacy@3.0.0:
1510+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
1511+
1512+ character-entities@2.0.2:
1513+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
1514+
1515+ character-reference-invalid@2.0.1:
1516+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
1517+
1518+ chevrotain@13.2.0:
1519+ resolution: {integrity: sha512-GTouk5YzgBxlTPCaDn5q0q2EJKkrYmnPF+HmF8v0Qo4r3iyPG7HJivkN1wthCXZcm3sIcZFpGTRovLPNdJNRCA==}
1520+ engines: {node: '>=22.0.0'}
1521+
1522+ client-only@0.0.1:
1523+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
1524+
1525+ clsx@2.1.1:
1526+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
1527+ engines: {node: '>=6'}
1528+
1529+ codepage@1.15.0:
1530+ resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==}
1531+ engines: {node: '>=0.8'}
1532+
1533+ comma-separated-tokens@2.0.3:
1534+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
1535+
1536+ commander@15.0.0:
1537+ resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==}
1538+ engines: {node: '>=22.12.0'}
1539+
1540+ commander@7.2.0:
1541+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
1542+ engines: {node: '>= 10'}
1543+
1544+ commander@8.3.0:
1545+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
1546+ engines: {node: '>= 12'}
1547+
1548+ concat-map@0.0.1:
1549+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
1550+
1551+ convert-source-map@2.0.0:
1552+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
1553+
1554+ core-util-is@1.0.3:
1555+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
1556+
1557+ cose-base@1.0.3:
1558+ resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
1559+
1560+ cose-base@2.2.0:
1561+ resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==}
1562+
1563+ crc-32@1.2.2:
1564+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
1565+ engines: {node: '>=0.8'}
1566+ hasBin: true
1567+
1568+ cross-spawn@7.0.6:
1569+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
1570+ engines: {node: '>= 8'}
1571+
1572+ csstype@3.2.3:
1573+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
1574+
1575+ cytoscape-cose-bilkent@4.1.0:
1576+ resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
1577+ peerDependencies:
1578+ cytoscape: ^3.2.0
1579+
1580+ cytoscape-fcose@2.2.0:
1581+ resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==}
1582+ peerDependencies:
1583+ cytoscape: ^3.2.0
1584+
1585+ cytoscape@3.34.4:
1586+ resolution: {integrity: sha512-msY99tMY8iWTg+sIPGfSqDcPNOt4xcj+v/K/7qUFaCUxxlqnMkUYLBjRUzn9W5CU/R2hrmtJa5+UtovrEM2ctg==}
1587+ engines: {node: '>=0.10'}
1588+
1589+ d3-array@2.12.1:
1590+ resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
1591+
1592+ d3-array@3.2.4:
1593+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
1594+ engines: {node: '>=12'}
1595+
1596+ d3-axis@3.0.0:
1597+ resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
1598+ engines: {node: '>=12'}
1599+
1600+ d3-brush@3.0.0:
1601+ resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
1602+ engines: {node: '>=12'}
1603+
1604+ d3-chord@3.0.1:
1605+ resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
1606+ engines: {node: '>=12'}
1607+
1608+ d3-color@3.1.0:
1609+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
1610+ engines: {node: '>=12'}
1611+
1612+ d3-contour@4.0.2:
1613+ resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
1614+ engines: {node: '>=12'}
1615+
1616+ d3-delaunay@6.0.4:
1617+ resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
1618+ engines: {node: '>=12'}
1619+
1620+ d3-dispatch@3.0.1:
1621+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
1622+ engines: {node: '>=12'}
1623+
1624+ d3-drag@3.0.0:
1625+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
1626+ engines: {node: '>=12'}
1627+
1628+ d3-dsv@3.0.1:
1629+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
1630+ engines: {node: '>=12'}
1631+ hasBin: true
1632+
1633+ d3-ease@3.0.1:
1634+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
1635+ engines: {node: '>=12'}
1636+
1637+ d3-fetch@3.0.1:
1638+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
1639+ engines: {node: '>=12'}
1640+
1641+ d3-force@3.0.0:
1642+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
1643+ engines: {node: '>=12'}
1644+
1645+ d3-format@3.1.2:
1646+ resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
1647+ engines: {node: '>=12'}
1648+
1649+ d3-geo@3.1.1:
1650+ resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
1651+ engines: {node: '>=12'}
1652+
1653+ d3-hierarchy@3.1.2:
1654+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
1655+ engines: {node: '>=12'}
1656+
1657+ d3-interpolate@3.0.1:
1658+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
1659+ engines: {node: '>=12'}
1660+
1661+ d3-path@1.0.9:
1662+ resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
1663+
1664+ d3-path@3.1.0:
1665+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
1666+ engines: {node: '>=12'}
1667+
1668+ d3-polygon@3.0.1:
1669+ resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
1670+ engines: {node: '>=12'}
1671+
1672+ d3-quadtree@3.0.1:
1673+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
1674+ engines: {node: '>=12'}
1675+
1676+ d3-random@3.0.1:
1677+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
1678+ engines: {node: '>=12'}
1679+
1680+ d3-sankey@0.12.3:
1681+ resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
1682+
1683+ d3-scale-chromatic@3.1.0:
1684+ resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
1685+ engines: {node: '>=12'}
1686+
1687+ d3-scale@4.0.2:
1688+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
1689+ engines: {node: '>=12'}
1690+
1691+ d3-selection@3.0.0:
1692+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
1693+ engines: {node: '>=12'}
1694+
1695+ d3-shape@1.3.7:
1696+ resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
1697+
1698+ d3-shape@3.2.0:
1699+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
1700+ engines: {node: '>=12'}
1701+
1702+ d3-time-format@4.1.0:
1703+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
1704+ engines: {node: '>=12'}
1705+
1706+ d3-time@3.1.0:
1707+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
1708+ engines: {node: '>=12'}
1709+
1710+ d3-timer@3.0.1:
1711+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
1712+ engines: {node: '>=12'}
1713+
1714+ d3-transition@3.0.1:
1715+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
1716+ engines: {node: '>=12'}
1717+ peerDependencies:
1718+ d3-selection: 2 - 3
1719+
1720+ d3-zoom@3.0.0:
1721+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
1722+ engines: {node: '>=12'}
1723+
1724+ d3@7.9.0:
1725+ resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
1726+ engines: {node: '>=12'}
1727+
1728+ dagre-d3-es@7.0.14:
1729+ resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==}
1730+
1731+ damerau-levenshtein@1.0.8:
1732+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
1733+
1734+ data-view-buffer@1.0.2:
1735+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
1736+ engines: {node: '>= 0.4'}
1737+
1738+ data-view-byte-length@1.0.2:
1739+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
1740+ engines: {node: '>= 0.4'}
1741+
1742+ data-view-byte-offset@1.0.1:
1743+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
1744+ engines: {node: '>= 0.4'}
1745+
1746+ date-fns@4.4.0:
1747+ resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}
1748+
1749+ dayjs@1.11.23:
1750+ resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==}
1751+
1752+ debug@3.2.7:
1753+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
1754+ peerDependencies:
1755+ supports-color: '*'
1756+ peerDependenciesMeta:
1757+ supports-color:
1758+ optional: true
1759+
1760+ debug@4.4.3:
1761+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
1762+ engines: {node: '>=6.0'}
1763+ peerDependencies:
1764+ supports-color: '*'
1765+ peerDependenciesMeta:
1766+ supports-color:
1767+ optional: true
1768+
1769+ decimal.js-light@2.5.1:
1770+ resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==}
1771+
1772+ decode-named-character-reference@1.3.0:
1773+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
1774+
1775+ deep-is@0.1.4:
1776+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
1777+
1778+ define-data-property@1.1.4:
1779+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
1780+ engines: {node: '>= 0.4'}
1781+
1782+ define-properties@1.2.1:
1783+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
1784+ engines: {node: '>= 0.4'}
1785+
1786+ delaunator@5.1.0:
1787+ resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==}
1788+
1789+ dequal@2.0.3:
1790+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
1791+ engines: {node: '>=6'}
1792+
1793+ detect-libc@2.1.2:
1794+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
1795+ engines: {node: '>=8'}
1796+
1797+ devlop@1.1.0:
1798+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
1799+
1800+ dingbat-to-unicode@1.0.2:
1801+ resolution: {integrity: sha512-R0bRerYzy/EZP6QzD3Hkl6JjUDA1Mnn+pd928w0nWjPzihnbAR6dcjGJGiRyznj5E4S1duEKzWrTqw02DPcdzg==}
1802+
1803+ doctrine@2.1.0:
1804+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
1805+ engines: {node: '>=0.10.0'}
1806+
1807+ docx@9.15.0:
1808+ resolution: {integrity: sha512-+7gjG6c7aHdi7Yr4idGCsLe6oCXomrCT9cq4SwdNKDH1IQKNIP5t4LIRtCrIYd87k3EO7YTl3VobYCy8Gd+6qg==}
1809+ engines: {node: '>=16'}
1810+
1811+ dompurify@3.4.17:
1812+ resolution: {integrity: sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==}
1813+
1814+ duck@0.1.12:
1815+ resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==}
1816+
1817+ dunder-proto@1.0.1:
1818+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
1819+ engines: {node: '>= 0.4'}
1820+
1821+ electron-to-chromium@1.5.471:
1822+ resolution: {integrity: sha512-Lo7jyyneHRYUQYM3WZ2rBEei9FcUIwValFPLifTbr4NTpc6oyUB+nN2rrOtbn3CE5pgz930mYxRJeD+glR7d6Q==}
1823+
1824+ elkjs@0.9.3:
1825+ resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
1826+
1827+ emoji-regex@9.2.2:
1828+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
1829+
1830+ enhanced-resolve@5.26.0:
1831+ resolution: {integrity: sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==}
1832+ engines: {node: '>=10.13.0'}
1833+
1834+ entities@6.0.1:
1835+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
1836+ engines: {node: '>=0.12'}
1837+
1838+ es-abstract-get@1.0.0:
1839+ resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==}
1840+ engines: {node: '>= 0.4'}
1841+
1842+ es-abstract@1.24.2:
1843+ resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==}
1844+ engines: {node: '>= 0.4'}
1845+
1846+ es-define-property@1.0.1:
1847+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
1848+ engines: {node: '>= 0.4'}
1849+
1850+ es-errors@1.3.0:
1851+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
1852+ engines: {node: '>= 0.4'}
1853+
1854+ es-iterator-helpers@1.4.0:
1855+ resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==}
1856+ engines: {node: '>= 0.4'}
1857+
1858+ es-object-atoms@1.1.2:
1859+ resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
1860+ engines: {node: '>= 0.4'}
1861+
1862+ es-set-tostringtag@2.1.0:
1863+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
1864+ engines: {node: '>= 0.4'}
1865+
1866+ es-shim-unscopables@1.1.0:
1867+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
1868+ engines: {node: '>= 0.4'}
1869+
1870+ es-to-primitive@1.3.4:
1871+ resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==}
1872+ engines: {node: '>= 0.4'}
1873+
1874+ es-toolkit@1.53.1:
1875+ resolution: {integrity: sha512-VhMc6IXmexu8iYFfL2aaAww6IvJTdHlqBLruLoEUs33YD4IcP5DdZcLOybMsMmmLsiy1c8PsiLsrM0DdIuuRUA==}
1876+
1877+ esbuild@0.28.2:
1878+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
1879+ engines: {node: '>=18'}
1880+ hasBin: true
1881+
1882+ escalade@3.2.0:
1883+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
1884+ engines: {node: '>=6'}
1885+
1886+ escape-string-regexp@4.0.0:
1887+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
1888+ engines: {node: '>=10'}
1889+
1890+ escape-string-regexp@5.0.0:
1891+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
1892+ engines: {node: '>=12'}
1893+
1894+ eslint-config-next@16.4.3:
1895+ resolution: {integrity: sha512-j9IqBma6abp800frdUURaizYMgXOK+jNGyq6CsYcM9AxpSJs5D/TgMNGeAmRUilZvA7g9V1Tr71gNg9/SVTuMQ==}
1896+ peerDependencies:
1897+ eslint: '>=9.0.0'
1898+ typescript: '>=3.3.1'
1899+ peerDependenciesMeta:
1900+ typescript:
1901+ optional: true
1902+
1903+ eslint-import-resolver-node@0.3.10:
1904+ resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==}
1905+
1906+ eslint-import-resolver-typescript@3.10.1:
1907+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==}
1908+ engines: {node: ^14.18.0 || >=16.0.0}
1909+ peerDependencies:
1910+ eslint: '*'
1911+ eslint-plugin-import: '*'
1912+ eslint-plugin-import-x: '*'
1913+ peerDependenciesMeta:
1914+ eslint-plugin-import:
1915+ optional: true
1916+ eslint-plugin-import-x:
1917+ optional: true
1918+
1919+ eslint-module-utils@2.14.0:
1920+ resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==}
1921+ engines: {node: '>=4'}
1922+ peerDependencies:
1923+ '@typescript-eslint/parser': '*'
1924+ eslint: '*'
1925+ eslint-import-resolver-node: '*'
1926+ eslint-import-resolver-typescript: '*'
1927+ eslint-import-resolver-webpack: '*'
1928+ peerDependenciesMeta:
1929+ '@typescript-eslint/parser':
1930+ optional: true
1931+ eslint:
1932+ optional: true
1933+ eslint-import-resolver-node:
1934+ optional: true
1935+ eslint-import-resolver-typescript:
1936+ optional: true
1937+ eslint-import-resolver-webpack:
1938+ optional: true
1939+
1940+ eslint-plugin-import@2.32.0:
1941+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==}
1942+ engines: {node: '>=4'}
1943+ peerDependencies:
1944+ '@typescript-eslint/parser': '*'
1945+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
1946+ peerDependenciesMeta:
1947+ '@typescript-eslint/parser':
1948+ optional: true
1949+
1950+ eslint-plugin-jsx-a11y@6.10.2:
1951+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
1952+ engines: {node: '>=4.0'}
1953+ peerDependencies:
1954+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
1955+
1956+ eslint-plugin-react-hooks@7.1.1:
1957+ resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==}
1958+ engines: {node: '>=18'}
1959+ peerDependencies:
1960+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0
1961+
1962+ eslint-plugin-react@7.37.5:
1963+ resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
1964+ engines: {node: '>=4'}
1965+ peerDependencies:
1966+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
1967+
1968+ eslint-scope@9.1.2:
1969+ resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==}
1970+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
1971+
1972+ eslint-visitor-keys@3.4.3:
1973+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1974+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1975+
1976+ eslint-visitor-keys@5.0.1:
1977+ resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
1978+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
1979+
1980+ eslint@10.14.0:
1981+ resolution: {integrity: sha512-T0pNsxkb9IKmtQjhpK3d7nWOpFv+YHuMbTJnSVMoQblF0onvXfErrtp4V1jHtsQPan7dKaGVD0q1WCXnzMF31A==}
1982+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
1983+ hasBin: true
1984+ peerDependencies:
1985+ jiti: '*'
1986+ peerDependenciesMeta:
1987+ jiti:
1988+ optional: true
1989+
1990+ espree@11.2.0:
1991+ resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==}
1992+ engines: {node: ^20.19.0 || ^22.13.0 || >=24}
1993+
1994+ esquery@1.7.0:
1995+ resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==}
1996+ engines: {node: '>=0.10'}
1997+
1998+ esrecurse@4.3.0:
1999+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
2000+ engines: {node: '>=4.0'}
2001+
2002+ estraverse@5.3.0:
2003+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
2004+ engines: {node: '>=4.0'}
2005+
2006+ estree-util-is-identifier-name@3.0.0:
2007+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
2008+
2009+ esutils@2.0.3:
2010+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
2011+ engines: {node: '>=0.10.0'}
2012+
2013+ eventemitter3@5.0.4:
2014+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
2015+
2016+ extend@3.0.2:
2017+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
2018+
2019+ fast-deep-equal@3.1.3:
2020+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
2021+
2022+ fast-glob@3.3.1:
2023+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==}
2024+ engines: {node: '>=8.6.0'}
2025+
2026+ fast-json-stable-stringify@2.1.0:
2027+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
2028+
2029+ fast-levenshtein@2.0.6:
2030+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
2031+
2032+ fast-sha256@1.3.0:
2033+ resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==}
2034+
2035+ fastq@1.20.3:
2036+ resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
2037+
2038+ fdir@6.5.0:
2039+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
2040+ engines: {node: '>=12.0.0'}
2041+ peerDependencies:
2042+ picomatch: ^3 || ^4
2043+ peerDependenciesMeta:
2044+ picomatch:
2045+ optional: true
2046+
2047+ fflate@0.8.3:
2048+ resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==}
2049+
2050+ file-entry-cache@11.1.5:
2051+ resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==}
2052+
2053+ fill-range@7.1.1:
2054+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
2055+ engines: {node: '>=8'}
2056+
2057+ find-up@5.0.0:
2058+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
2059+ engines: {node: '>=10'}
2060+
2061+ flat-cache@6.1.23:
2062+ resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==}
2063+
2064+ flatted@3.4.4:
2065+ resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
2066+
2067+ for-each@0.3.5:
2068+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
2069+ engines: {node: '>= 0.4'}
2070+
2071+ frac@1.1.2:
2072+ resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==}
2073+ engines: {node: '>=0.8'}
2074+
2075+ fsevents@2.3.3:
2076+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
2077+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
2078+ os: [darwin]
2079+
2080+ function-bind@1.1.2:
2081+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
2082+
2083+ function.prototype.name@1.2.0:
2084+ resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==}
2085+ engines: {node: '>= 0.4'}
2086+
2087+ functions-have-names@1.2.3:
2088+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
2089+
2090+ generator-function@2.0.1:
2091+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
2092+ engines: {node: '>= 0.4'}
2093+
2094+ gensync@1.0.0-beta.2:
2095+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
2096+ engines: {node: '>=6.9.0'}
2097+
2098+ get-intrinsic@1.3.0:
2099+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
2100+ engines: {node: '>= 0.4'}
2101+
2102+ get-proto@1.0.1:
2103+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
2104+ engines: {node: '>= 0.4'}
2105+
2106+ get-symbol-description@1.1.0:
2107+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
2108+ engines: {node: '>= 0.4'}
2109+
2110+ get-tsconfig@4.14.3:
2111+ resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==}
2112+
2113+ glob-parent@5.1.2:
2114+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
2115+ engines: {node: '>= 6'}
2116+
2117+ glob-parent@6.0.2:
2118+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
2119+ engines: {node: '>=10.13.0'}
2120+
2121+ globals@16.4.0:
2122+ resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
2123+ engines: {node: '>=18'}
2124+
2125+ globalthis@1.0.4:
2126+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
2127+ engines: {node: '>= 0.4'}
2128+
2129+ gopd@1.2.0:
2130+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
2131+ engines: {node: '>= 0.4'}
2132+
2133+ graceful-fs@4.2.11:
2134+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
2135+
2136+ hachure-fill@0.5.2:
2137+ resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
2138+
2139+ has-bigints@1.1.0:
2140+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
2141+ engines: {node: '>= 0.4'}
2142+
2143+ has-property-descriptors@1.0.2:
2144+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
2145+
2146+ has-proto@1.2.0:
2147+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
2148+ engines: {node: '>= 0.4'}
2149+
2150+ has-symbols@1.1.0:
2151+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
2152+ engines: {node: '>= 0.4'}
2153+
2154+ has-tostringtag@1.0.2:
2155+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
2156+ engines: {node: '>= 0.4'}
2157+
2158+ hashery@1.5.1:
2159+ resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==}
2160+ engines: {node: '>=20'}
2161+
2162+ hasown@2.0.4:
2163+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
2164+ engines: {node: '>= 0.4'}
2165+
2166+ hast-util-from-dom@5.0.1:
2167+ resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==}
2168+
2169+ hast-util-from-html-isomorphic@2.0.0:
2170+ resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==}
2171+
2172+ hast-util-from-html@2.0.3:
2173+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
2174+
2175+ hast-util-from-parse5@8.0.4:
2176+ resolution: {integrity: sha512-Yq7XlXor0Cpb71sI2E0zpv8QxQ5a6rfhDEETk4bcgrFX2SvJAY2PHocWwFtL6U9qyfiyByW3wZ6sZEfP2kW81g==}
2177+
2178+ hast-util-parse-selector@4.0.0:
2179+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
2180+
2181+ hast-util-to-jsx-runtime@2.3.7:
2182+ resolution: {integrity: sha512-F7DNV2NMcTxA4GqPVHnXzX+mpoPHAIY9rJAVH3CZ1FdBZOcBUEjUuvMkMpHVs/sicEtznh9tMGj5WUR9S4E2rg==}
2183+
2184+ hast-util-to-text@4.0.3:
2185+ resolution: {integrity: sha512-5yrlWOvGFs6CqHriUpSsNrjzT/Tdo+IOQudbznxOn8K5qblp18MJyzOg8IgDOKQ8MYgQcJA7SusuCjSpDr8mSA==}
2186+
2187+ hast-util-whitespace@3.0.0:
2188+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
2189+
2190+ hastscript@9.0.3:
2191+ resolution: {integrity: sha512-1ALZXSmCGmW3h8AMz4R4+QKSKFi7sNgXLVwmwB8FYVtl1CwQ3WDkSAEY/d5tp1g/vbQgq2s1WlHgfO3jbw1TsA==}
2192+
2193+ hermes-estree@0.25.1:
2194+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
2195+
2196+ hermes-parser@0.25.1:
2197+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
2198+
2199+ highlight.js@11.11.2:
2200+ resolution: {integrity: sha512-oaXMACAU0kzOMXBjWpNcX+vlwSBCIAiZ9BHa7gA15NOTtT2L/l8OSZDuqS2XppOhZBPJ7hm4o8ep2kyuip2uEQ==}
2201+ engines: {node: '>=12.0.0'}
2202+
2203+ highlight.js@11.12.0:
2204+ resolution: {integrity: sha512-nbfWpyRMcMrPMmDwJB+dhX/eiaPKtc2RB+0QZskqJ3WjRA/FDS0e9hZrx8EC/lbEv8gXy98FcDbNa/dspAaJMg==}
2205+ engines: {node: '>=12.0.0'}
2206+
2207+ hookified@1.15.1:
2208+ resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==}
2209+
2210+ hookified@2.2.0:
2211+ resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==}
2212+
2213+ html-url-attributes@3.0.1:
2214+ resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==}
2215+
2216+ iconv-lite@0.6.3:
2217+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
2218+ engines: {node: '>=0.10.0'}
2219+
2220+ ignore@5.3.2:
2221+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
2222+ engines: {node: '>= 4'}
2223+
2224+ ignore@7.0.14:
2225+ resolution: {integrity: sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==}
2226+ engines: {node: '>= 4'}
2227+
2228+ immediate@3.0.6:
2229+ resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==}
2230+
2231+ immer@11.2.9:
2232+ resolution: {integrity: sha512-IQ4UEtXjZjyefyWjtLEDXUSrF6T2hwjKPi6BIJl3bY/2XXW24d6cNGdXJSBOA/+KNnuiXkZY6DR0C3efolhitA==}
2233+
2234+ import-meta-resolve@4.2.0:
2235+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
2236+
2237+ imurmurhash@0.1.4:
2238+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
2239+ engines: {node: '>=0.8.19'}
2240+
2241+ inherits@2.0.4:
2242+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
2243+
2244+ inline-style-parser@0.2.9:
2245+ resolution: {integrity: sha512-IttN8BqKLxzUrnTqHI+/hwAJQItBAUjdoHERCDv+oOuX48VP6bzW8+QjOXSfoevzq3YrYAwX1uLHp8TqO9yIeg==}
2246+
2247+ internal-slot@1.1.0:
2248+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
2249+ engines: {node: '>= 0.4'}
2250+
2251+ internmap@1.0.1:
2252+ resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
2253+
2254+ internmap@2.0.3:
2255+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
2256+ engines: {node: '>=12'}
2257+
2258+ is-alphabetical@2.0.1:
2259+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
2260+
2261+ is-alphanumerical@2.0.1:
2262+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
2263+
2264+ is-array-buffer@3.0.5:
2265+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
2266+ engines: {node: '>= 0.4'}
2267+
2268+ is-async-function@2.1.1:
2269+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
2270+ engines: {node: '>= 0.4'}
2271+
2272+ is-bigint@1.1.0:
2273+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
2274+ engines: {node: '>= 0.4'}
2275+
2276+ is-boolean-object@1.2.2:
2277+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
2278+ engines: {node: '>= 0.4'}
2279+
2280+ is-bun-module@2.0.0:
2281+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
2282+
2283+ is-callable@1.2.7:
2284+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
2285+ engines: {node: '>= 0.4'}
2286+
2287+ is-core-module@2.17.0:
2288+ resolution: {integrity: sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==}
2289+ engines: {node: '>= 0.4'}
2290+
2291+ is-data-view@1.0.2:
2292+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
2293+ engines: {node: '>= 0.4'}
2294+
2295+ is-date-object@1.1.0:
2296+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
2297+ engines: {node: '>= 0.4'}
2298+
2299+ is-decimal@2.0.1:
2300+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
2301+
2302+ is-document.all@1.0.0:
2303+ resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==}
2304+ engines: {node: '>= 0.4'}
2305+
2306+ is-extglob@2.1.1:
2307+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
2308+ engines: {node: '>=0.10.0'}
2309+
2310+ is-finalizationregistry@1.1.1:
2311+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
2312+ engines: {node: '>= 0.4'}
2313+
2314+ is-generator-function@1.1.2:
2315+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==}
2316+ engines: {node: '>= 0.4'}
2317+
2318+ is-glob@4.0.3:
2319+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
2320+ engines: {node: '>=0.10.0'}
2321+
2322+ is-hexadecimal@2.0.1:
2323+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
2324+
2325+ is-map@2.0.3:
2326+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
2327+ engines: {node: '>= 0.4'}
2328+
2329+ is-negative-zero@2.0.3:
2330+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
2331+ engines: {node: '>= 0.4'}
2332+
2333+ is-number-object@1.1.1:
2334+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
2335+ engines: {node: '>= 0.4'}
2336+
2337+ is-number@7.0.0:
2338+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
2339+ engines: {node: '>=0.12.0'}
2340+
2341+ is-plain-obj@4.1.0:
2342+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
2343+ engines: {node: '>=12'}
2344+
2345+ is-regex@1.2.1:
2346+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
2347+ engines: {node: '>= 0.4'}
2348+
2349+ is-set@2.0.3:
2350+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
2351+ engines: {node: '>= 0.4'}
2352+
2353+ is-shared-array-buffer@1.0.4:
2354+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
2355+ engines: {node: '>= 0.4'}
2356+
2357+ is-string@1.1.1:
2358+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
2359+ engines: {node: '>= 0.4'}
2360+
2361+ is-symbol@1.1.1:
2362+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
2363+ engines: {node: '>= 0.4'}
2364+
2365+ is-typed-array@1.1.15:
2366+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
2367+ engines: {node: '>= 0.4'}
2368+
2369+ is-weakmap@2.0.2:
2370+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
2371+ engines: {node: '>= 0.4'}
2372+
2373+ is-weakref@1.1.1:
2374+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
2375+ engines: {node: '>= 0.4'}
2376+
2377+ is-weakset@2.0.4:
2378+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
2379+ engines: {node: '>= 0.4'}
2380+
2381+ isarray@1.0.0:
2382+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
2383+
2384+ isarray@2.0.5:
2385+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
2386+
2387+ isexe@2.0.0:
2388+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
2389+
2390+ iterator.prototype@1.1.5:
2391+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
2392+ engines: {node: '>= 0.4'}
2393+
2394+ jiti@2.7.0:
2395+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
2396+ hasBin: true
2397+
2398+ js-tokens@4.0.0:
2399+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
2400+
2401+ jsesc@3.1.0:
2402+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
2403+ engines: {node: '>=6'}
2404+ hasBin: true
2405+
2406+ json-schema-to-ts@3.1.1:
2407+ resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==}
2408+ engines: {node: '>=16'}
2409+
2410+ json-schema-traverse@0.4.1:
2411+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
2412+
2413+ json-stable-stringify-without-jsonify@1.0.1:
2414+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
2415+
2416+ json5@1.0.2:
2417+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
2418+ hasBin: true
2419+
2420+ json5@2.2.3:
2421+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
2422+ engines: {node: '>=6'}
2423+ hasBin: true
2424+
2425+ jsx-ast-utils@3.3.5:
2426+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
2427+ engines: {node: '>=4.0'}
2428+
2429+ jszip@3.10.2:
2430+ resolution: {integrity: sha512-3l+rb15IOWtUhU0H5MFqES/T6Kh7abYwjosBey/vD6hDt8zoEffkSC5Ws5SGtgVw3gBx2NEbhTeSW1+kWkpyTQ==}
2431+
2432+ katex@0.16.47:
2433+ resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==}
2434+ hasBin: true
2435+
2436+ katex@0.18.11:
2437+ resolution: {integrity: sha512-yvyz/2VMKqoho/35Hat5w37wIEdWJ5ElVMidTAlWrxr5uW4aBGsEpveTmKh18/zw08v/7lGswCPon4OhqmqrTA==}
2438+ deprecated: Accidentally published with breaking changes. Use 0.19.0 instead.
2439+ hasBin: true
2440+
2441+ katex@0.19.1:
2442+ resolution: {integrity: sha512-jG8uKntjSEcm2EpQOh0XturpPuuC9r3Sq5HLHdsFdWZT27E672SF19QEi+of0/YeOy15lDgRhKvr5614uRrEfA==}
2443+ hasBin: true
2444+
2445+ keyv@5.6.0:
2446+ resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==}
2447+
2448+ khroma@2.1.0:
2449+ resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
2450+
2451+ language-subtag-registry@0.3.23:
2452+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
2453+
2454+ language-tags@1.0.9:
2455+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
2456+ engines: {node: '>=0.10'}
2457+
2458+ layout-base@1.0.2:
2459+ resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
2460+
2461+ layout-base@2.0.1:
2462+ resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
2463+
2464+ levn@0.4.1:
2465+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
2466+ engines: {node: '>= 0.8.0'}
2467+
2468+ lie@3.3.0:
2469+ resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
2470+
2471+ lightningcss-android-arm64@1.32.0:
2472+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
2473+ engines: {node: '>= 12.0.0'}
2474+ cpu: [arm64]
2475+ os: [android]
2476+
2477+ lightningcss-darwin-arm64@1.32.0:
2478+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
2479+ engines: {node: '>= 12.0.0'}
2480+ cpu: [arm64]
2481+ os: [darwin]
2482+
2483+ lightningcss-darwin-x64@1.32.0:
2484+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
2485+ engines: {node: '>= 12.0.0'}
2486+ cpu: [x64]
2487+ os: [darwin]
2488+
2489+ lightningcss-freebsd-x64@1.32.0:
2490+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
2491+ engines: {node: '>= 12.0.0'}
2492+ cpu: [x64]
2493+ os: [freebsd]
2494+
2495+ lightningcss-linux-arm-gnueabihf@1.32.0:
2496+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
2497+ engines: {node: '>= 12.0.0'}
2498+ cpu: [arm]
2499+ os: [linux]
2500+
2501+ lightningcss-linux-arm64-gnu@1.32.0:
2502+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
2503+ engines: {node: '>= 12.0.0'}
2504+ cpu: [arm64]
2505+ os: [linux]
2506+ libc: [glibc]
2507+
2508+ lightningcss-linux-arm64-musl@1.32.0:
2509+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
2510+ engines: {node: '>= 12.0.0'}
2511+ cpu: [arm64]
2512+ os: [linux]
2513+ libc: [musl]
2514+
2515+ lightningcss-linux-x64-gnu@1.32.0:
2516+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
2517+ engines: {node: '>= 12.0.0'}
2518+ cpu: [x64]
2519+ os: [linux]
2520+ libc: [glibc]
2521+
2522+ lightningcss-linux-x64-musl@1.32.0:
2523+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
2524+ engines: {node: '>= 12.0.0'}
2525+ cpu: [x64]
2526+ os: [linux]
2527+ libc: [musl]
2528+
2529+ lightningcss-win32-arm64-msvc@1.32.0:
2530+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
2531+ engines: {node: '>= 12.0.0'}
2532+ cpu: [arm64]
2533+ os: [win32]
2534+
2535+ lightningcss-win32-x64-msvc@1.32.0:
2536+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
2537+ engines: {node: '>= 12.0.0'}
2538+ cpu: [x64]
2539+ os: [win32]
2540+
2541+ lightningcss@1.32.0:
2542+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
2543+ engines: {node: '>= 12.0.0'}
2544+
2545+ locate-path@6.0.0:
2546+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
2547+ engines: {node: '>=10'}
2548+
2549+ lodash-es@4.18.1:
2550+ resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
2551+
2552+ longest-streak@3.1.0:
2553+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
2554+
2555+ loose-envify@1.4.0:
2556+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
2557+ hasBin: true
2558+
2559+ lop@0.4.2:
2560+ resolution: {integrity: sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw==}
2561+
2562+ lowlight@3.3.0:
2563+ resolution: {integrity: sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ==}
2564+
2565+ lru-cache@5.1.1:
2566+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
2567+
2568+ lucide-react@1.66.0:
2569+ resolution: {integrity: sha512-8zjbi/Us+ETXqfBwmXF/FHrWGIqOdE6zT1yUdRJLQVoptomSkB0zdFWVIM667t9K8djWDaXdkBkqi2qVTuDNiw==}
2570+ peerDependencies:
2571+ '@types/react': '*'
2572+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
2573+ peerDependenciesMeta:
2574+ '@types/react':
2575+ optional: true
2576+
2577+ magic-string@0.30.21:
2578+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
2579+
2580+ mammoth@1.13.0:
2581+ resolution: {integrity: sha512-2cawcYFcP7ISfXbBcL9lmVgTNWo88v/52ND1gnywHtVT/pX0//puPnf0iMPV9ZgmuvNOE+zkIhDgZ9M2c2dDDg==}
2582+ engines: {node: '>=12.0.0'}
2583+ hasBin: true
2584+
2585+ markdown-table@3.0.4:
2586+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
2587+
2588+ marked@16.4.2:
2589+ resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==}
2590+ engines: {node: '>= 20'}
2591+ hasBin: true
2592+
2593+ math-intrinsics@1.1.0:
2594+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
2595+ engines: {node: '>= 0.4'}
2596+
2597+ mdast-util-find-and-replace@3.0.4:
2598+ resolution: {integrity: sha512-z4B5c6jrnJ1ltOQemhWYPBSAo6y42Z8Gt2yEgfgNTMcLSU59B8bfj8Z8AnAlJrBGLnqkdAUZ7jdDEqQw3KuipQ==}
2599+
2600+ mdast-util-from-markdown@2.1.0:
2601+ resolution: {integrity: sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==}
2602+
2603+ mdast-util-gfm-autolink-literal@2.0.1:
2604+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
2605+
2606+ mdast-util-gfm-footnote@2.1.0:
2607+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==}
2608+
2609+ mdast-util-gfm-strikethrough@2.0.1:
2610+ resolution: {integrity: sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==}
2611+
2612+ mdast-util-gfm-table@2.0.0:
2613+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
2614+
2615+ mdast-util-gfm-task-list-item@2.0.0:
2616+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
2617+
2618+ mdast-util-gfm@3.1.0:
2619+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==}
2620+
2621+ mdast-util-math@3.0.0:
2622+ resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==}
2623+
2624+ mdast-util-mdx-expression@2.0.1:
2625+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
2626+
2627+ mdast-util-mdx-jsx@3.2.0:
2628+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
2629+
2630+ mdast-util-mdxjs-esm@2.0.1:
2631+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
2632+
2633+ mdast-util-phrasing@4.1.0:
2634+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
2635+
2636+ mdast-util-to-hast@13.2.1:
2637+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
2638+
2639+ mdast-util-to-markdown@2.2.1:
2640+ resolution: {integrity: sha512-ThatlCBxG2GE+mljhNSfZPv56d3QrGiRh97jjYgIk80IzS4uU6d7cHAaexCYSAmUCCcOs3grJ07kX3oTGsFUOw==}
2641+
2642+ mdast-util-to-string@4.0.0:
2643+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
2644+
2645+ merge2@1.4.1:
2646+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
2647+ engines: {node: '>= 8'}
2648+
2649+ mermaid@12.2.0:
2650+ resolution: {integrity: sha512-w7nr/SFrLO7BaVTs3dQTvYSV6nYSBj0Yy9DjBhsIJtAcHqRzXSq4Pg32ujHZ/AdWsAMNEvvhbm5dt9E2tOiHzw==}
2651+ engines: {node: '>=22.12.0'}
2652+
2653+ micromark-core-commonmark@2.0.4:
2654+ resolution: {integrity: sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==}
2655+
2656+ micromark-extension-gfm-autolink-literal@2.1.0:
2657+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
2658+
2659+ micromark-extension-gfm-footnote@2.1.0:
2660+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
2661+
2662+ micromark-extension-gfm-strikethrough@2.1.0:
2663+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
2664+
2665+ micromark-extension-gfm-table@2.1.2:
2666+ resolution: {integrity: sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==}
2667+
2668+ micromark-extension-gfm-tagfilter@2.0.0:
2669+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
2670+
2671+ micromark-extension-gfm-task-list-item@2.1.0:
2672+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
2673+
2674+ micromark-extension-gfm@3.0.0:
2675+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
2676+
2677+ micromark-extension-math@3.1.0:
2678+ resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==}
2679+
2680+ micromark-factory-destination@2.0.1:
2681+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
2682+
2683+ micromark-factory-label@2.0.1:
2684+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
2685+
2686+ micromark-factory-space@2.1.0:
2687+ resolution: {integrity: sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==}
2688+
2689+ micromark-factory-title@2.0.1:
2690+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
2691+
2692+ micromark-factory-whitespace@2.0.1:
2693+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
2694+
2695+ micromark-util-character@2.1.1:
2696+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
2697+
2698+ micromark-util-chunked@2.0.1:
2699+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
2700+
2701+ micromark-util-classify-character@2.0.1:
2702+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
2703+
2704+ micromark-util-combine-extensions@2.0.1:
2705+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
2706+
2707+ micromark-util-decode-numeric-character-reference@2.0.2:
2708+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
2709+
2710+ micromark-util-decode-string@2.0.1:
2711+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
2712+
2713+ micromark-util-edit-map@1.0.0:
2714+ resolution: {integrity: sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==}
2715+
2716+ micromark-util-encode@2.0.1:
2717+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
2718+
2719+ micromark-util-html-tag-name@2.0.1:
2720+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
2721+
2722+ micromark-util-normalize-identifier@2.0.1:
2723+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
2724+
2725+ micromark-util-resolve-all@2.0.1:
2726+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
2727+
2728+ micromark-util-sanitize-uri@2.0.1:
2729+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
2730+
2731+ micromark-util-subtokenize@2.1.0:
2732+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==}
2733+
2734+ micromark-util-symbol@2.0.1:
2735+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
2736+
2737+ micromark-util-types@2.0.3:
2738+ resolution: {integrity: sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==}
2739+
2740+ micromark@4.0.3:
2741+ resolution: {integrity: sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==}
2742+
2743+ micromatch@4.0.8:
2744+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
2745+ engines: {node: '>=8.6'}
2746+
2747+ mime@4.1.2:
2748+ resolution: {integrity: sha512-ikRzZ2RwbUVDyL9SsU0f2Phcmav4yq5r8faH5ZZKHtOZrMBLnrQOrj0uvqZ5R1uQnj+RO7Wcklw/lAf81mP9LQ==}
2749+ engines: {node: '>=16'}
2750+ hasBin: true
2751+
2752+ minimatch@10.2.6:
2753+ resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
2754+ engines: {node: 18 || 20 || >=22}
2755+
2756+ minimatch@3.1.5:
2757+ resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==}
2758+
2759+ minimist@1.2.8:
2760+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
2761+
2762+ ms@2.1.3:
2763+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
2764+
2765+ nanoid@3.3.20:
2766+ resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==}
2767+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
2768+ hasBin: true
2769+
2770+ nanoid@6.0.2:
2771+ resolution: {integrity: sha512-hIvVOb9Qr1p/9CNNLOe0OlWvgx/ziTsVwKN/GDSsuArN2K0wDiafP3s0SWmsm7o2BdnyS8Z9Z64NFBUbn6ziBg==}
2772+ engines: {node: ^22 || ^24 || >=26}
2773+ hasBin: true
2774+
2775+ napi-postinstall@0.3.7:
2776+ resolution: {integrity: sha512-jyU4cU4kVAmy/3qjP+DcoQTNXfINHc+dFw54gGqWC8nu0mpV0kOnk7kff+J+Q18SbX0k3Np8Rm7yFjd3phatNQ==}
2777+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
2778+ hasBin: true
2779+
2780+ natural-compare@1.4.0:
2781+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
2782+
2783+ next@16.4.3:
2784+ resolution: {integrity: sha512-OqxKTGi9u80FydydsMNYNjnuje9Au+kvHlt2GZ//ftdpDHm1dxKqAaENoOOTX5wKzn+9vaKUNIfZeyZUuLhCnA==}
2785+ engines: {node: '>=20.9.0'}
2786+ hasBin: true
2787+ peerDependencies:
2788+ '@opentelemetry/api': ^1.1.0
2789+ '@playwright/test': ^1.51.1
2790+ babel-plugin-react-compiler: '*'
2791+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
2792+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
2793+ sass: ^1.3.0
2794+ peerDependenciesMeta:
2795+ '@opentelemetry/api':
2796+ optional: true
2797+ '@playwright/test':
2798+ optional: true
2799+ babel-plugin-react-compiler:
2800+ optional: true
2801+ sass:
2802+ optional: true
2803+
2804+ node-exports-info@1.6.2:
2805+ resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==}
2806+ engines: {node: '>= 0.4'}
2807+
2808+ node-releases@2.0.62:
2809+ resolution: {integrity: sha512-A0Eq+qVDQI97IbAD6g/HriIuv256el9N8EwF4+xqJ49pwrdRYpdCSmLk0sO4I3fnS6hpYE5v22B73Bk+WArEoQ==}
2810+ engines: {node: '>=18'}
2811+
2812+ object-assign@4.1.1:
2813+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
2814+ engines: {node: '>=0.10.0'}
2815+
2816+ object-inspect@1.13.4:
2817+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
2818+ engines: {node: '>= 0.4'}
2819+
2820+ object-keys@1.1.1:
2821+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
2822+ engines: {node: '>= 0.4'}
2823+
2824+ object.assign@4.1.7:
2825+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
2826+ engines: {node: '>= 0.4'}
2827+
2828+ object.entries@1.1.9:
2829+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
2830+ engines: {node: '>= 0.4'}
2831+
2832+ object.fromentries@2.0.8:
2833+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
2834+ engines: {node: '>= 0.4'}
2835+
2836+ object.groupby@1.0.3:
2837+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
2838+ engines: {node: '>= 0.4'}
2839+
2840+ object.values@1.2.1:
2841+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
2842+ engines: {node: '>= 0.4'}
2843+
2844+ openai@7.47.0:
2845+ resolution: {integrity: sha512-BYa2RYgocAv9WjPUJmNu8fICuA1fFhkTBEpiR3sC5L1K6v8Hnhc8pcnQEhu8l/+W1XKA+JUaBa7HpT+AK1s77w==}
2846+ engines: {node: '>=22.0.0'}
2847+ peerDependencies:
2848+ '@aws-sdk/credential-provider-node': '>=3.972.0 <4'
2849+ '@smithy/hash-node': '>=4.3.0 <5'
2850+ '@smithy/signature-v4': '>=5.4.0 <6'
2851+ google-auth-library: '>=9.15.1 <12'
2852+ undici: '>=5 <9'
2853+ ws: ^8.21.0
2854+ zod: ^3.25 || ^4.0
2855+ peerDependenciesMeta:
2856+ '@aws-sdk/credential-provider-node':
2857+ optional: true
2858+ '@smithy/hash-node':
2859+ optional: true
2860+ '@smithy/signature-v4':
2861+ optional: true
2862+ google-auth-library:
2863+ optional: true
2864+ undici:
2865+ optional: true
2866+ ws:
2867+ optional: true
2868+ zod:
2869+ optional: true
2870+
2871+ option@0.2.4:
2872+ resolution: {integrity: sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A==}
2873+
2874+ optionator@0.9.4:
2875+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
2876+ engines: {node: '>= 0.8.0'}
2877+
2878+ own-keys@1.0.2:
2879+ resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==}
2880+ engines: {node: '>= 0.4'}
2881+
2882+ p-limit@3.1.0:
2883+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
2884+ engines: {node: '>=10'}
2885+
2886+ p-locate@5.0.0:
2887+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
2888+ engines: {node: '>=10'}
2889+
2890+ package-manager-detector@1.9.0:
2891+ resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==}
2892+
2893+ pako@1.0.11:
2894+ resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
2895+
2896+ parse-entities@4.0.2:
2897+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
2898+
2899+ parse5@7.3.0:
2900+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
2901+
2902+ path-data-parser@0.1.0:
2903+ resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
2904+
2905+ path-exists@4.0.0:
2906+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
2907+ engines: {node: '>=8'}
2908+
2909+ path-key@3.1.1:
2910+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
2911+ engines: {node: '>=8'}
2912+
2913+ path-parse@1.0.7:
2914+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
2915+
2916+ pdf-parse@2.4.5:
2917+ resolution: {integrity: sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==}
2918+ engines: {node: '>=20.16.0 <21 || >=22.3.0'}
2919+ hasBin: true
2920+
2921+ pdfjs-dist@5.4.296:
2922+ resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==}
2923+ engines: {node: '>=20.16.0 || >=22.3.0'}
2924+
2925+ picocolors@1.1.1:
2926+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
2927+
2928+ picomatch@2.3.2:
2929+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
2930+ engines: {node: '>=8.6'}
2931+
2932+ picomatch@4.0.7:
2933+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
2934+ engines: {node: '>=12'}
2935+
2936+ playwright-core@1.64.1:
2937+ resolution: {integrity: sha512-BC4s8y6SEVA6Q1rSxZTto8hI1KUI3xXlHGZgvGqP4IqPdI/a6FX9H29IDNz7vKo9l21b6LfYosScPL6M3xxyDQ==}
2938+ engines: {node: '>=20'}
2939+ hasBin: true
2940+
2941+ playwright@1.64.1:
2942+ resolution: {integrity: sha512-HCrVhHr5QQuwYoswEUGTb7gGp522yflbv/ST8nF4sFWGuLjQCt17Q/EubpGGSNKYn1tsTCPZxqHhHCfVURu7UA==}
2943+ engines: {node: '>=20'}
2944+ hasBin: true
2945+
2946+ pngjs@7.0.0:
2947+ resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
2948+ engines: {node: '>=14.19.0'}
2949+
2950+ points-on-curve@0.2.0:
2951+ resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
2952+
2953+ points-on-path@0.2.1:
2954+ resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
2955+
2956+ possible-typed-array-names@1.1.0:
2957+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
2958+ engines: {node: '>= 0.4'}
2959+
2960+ postcss@8.5.23:
2961+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
2962+ engines: {node: ^10 || ^12 || >=14}
2963+
2964+ postgres@4.0.0:
2965+ resolution: {integrity: sha512-kBh8qXtcvvIAc00DftQyOxz7M/3Zxww1tRMXZPLzipNXXl5PIzHml+9zB3Mrge2U8ldc0WF1ZdLp1iYQi7Kh3A==}
2966+ engines: {node: '>=20'}
2967+
2968+ prelude-ls@1.2.1:
2969+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
2970+ engines: {node: '>= 0.8.0'}
2971+
2972+ process-nextick-args@2.0.1:
2973+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
2974+
2975+ prop-types@15.8.1:
2976+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
2977+
2978+ property-information@7.2.0:
2979+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
2980+
2981+ punycode@2.3.1:
2982+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
2983+ engines: {node: '>=6'}
2984+
2985+ qified@0.10.1:
2986+ resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==}
2987+ engines: {node: '>=20'}
2988+
2989+ queue-microtask@1.2.3:
2990+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
2991+
2992+ react-dom@19.3.0:
2993+ resolution: {integrity: sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==}
2994+ peerDependencies:
2995+ react: ^19.3.0
2996+
2997+ react-is@16.13.1:
2998+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
2999+
3000+ react-markdown@10.1.0:
3001+ resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==}
3002+ peerDependencies:
3003+ '@types/react': '>=18'
3004+ react: '>=18'
3005+
3006+ react-redux@9.3.1:
3007+ resolution: {integrity: sha512-vxMLT0lalUjbZPkoTepWyKAZbjIIFssNx/CEL9lTfwQBU6XpkGSmCNdcCIrkOBUgB68uftZMnbXVb6DwGnhRKQ==}
3008+ peerDependencies:
3009+ '@types/react': ^18.2.25 || ^19
3010+ react: ^18.0 || ^19
3011+ redux: ^5.0.0
3012+ peerDependenciesMeta:
3013+ '@types/react':
3014+ optional: true
3015+ redux:
3016+ optional: true
3017+
3018+ react@19.3.0:
3019+ resolution: {integrity: sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==}
3020+ engines: {node: '>=0.10.0'}
3021+
3022+ readable-stream@2.3.8:
3023+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
3024+
3025+ recharts@3.10.1:
3026+ resolution: {integrity: sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==}
3027+ engines: {node: '>=18'}
3028+ peerDependencies:
3029+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
3030+ react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
3031+ react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
3032+
3033+ redux-thunk@3.1.0:
3034+ resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==}
3035+ peerDependencies:
3036+ redux: ^5.0.0
3037+
3038+ redux@5.0.1:
3039+ resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==}
3040+
3041+ reflect.getprototypeof@1.0.10:
3042+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
3043+ engines: {node: '>= 0.4'}
3044+
3045+ regexp.prototype.flags@1.5.4:
3046+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
3047+ engines: {node: '>= 0.4'}
3048+
3049+ rehype-highlight@7.0.2:
3050+ resolution: {integrity: sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==}
3051+
3052+ rehype-katex@7.0.1:
3053+ resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
3054+
3055+ remark-gfm@4.0.1:
3056+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
3057+
3058+ remark-math@6.0.0:
3059+ resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==}
3060+
3061+ remark-parse@11.0.0:
3062+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
3063+
3064+ remark-rehype@11.1.2:
3065+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==}
3066+
3067+ remark-stringify@11.0.0:
3068+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
3069+
3070+ reselect@5.2.0:
3071+ resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==}
3072+
3073+ resolve-pkg-maps@1.0.0:
3074+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
3075+
3076+ resolve@2.0.0-next.7:
3077+ resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==}
3078+ engines: {node: '>= 0.4'}
3079+ hasBin: true
3080+
3081+ reusify@1.1.0:
3082+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
3083+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
3084+
3085+ robust-predicates@3.0.3:
3086+ resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==}
3087+
3088+ roughjs@4.6.6:
3089+ resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
3090+
3091+ run-parallel@1.2.0:
3092+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
3093+
3094+ rw@1.3.3:
3095+ resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
3096+
3097+ safe-array-concat@1.1.4:
3098+ resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==}
3099+ engines: {node: '>=0.4'}
3100+
3101+ safe-buffer@5.1.2:
3102+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
3103+
3104+ safe-push-apply@1.0.0:
3105+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
3106+ engines: {node: '>= 0.4'}
3107+
3108+ safe-regex-test@1.1.0:
3109+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
3110+ engines: {node: '>= 0.4'}
3111+
3112+ safer-buffer@2.1.2:
3113+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
3114+
3115+ scheduler@0.28.0:
3116+ resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==}
3117+
3118+ semver@6.3.1:
3119+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
3120+ hasBin: true
3121+
3122+ semver@7.8.5:
3123+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
3124+ engines: {node: '>=10'}
3125+ hasBin: true
3126+
3127+ set-function-length@1.2.2:
3128+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
3129+ engines: {node: '>= 0.4'}
3130+
3131+ set-function-name@2.0.2:
3132+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
3133+ engines: {node: '>= 0.4'}
3134+
3135+ set-proto@1.0.0:
3136+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
3137+ engines: {node: '>= 0.4'}
3138+
3139+ setimmediate@1.0.5:
3140+ resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
3141+
3142+ sharp@0.35.5:
3143+ resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==}
3144+ engines: {node: '>=20.9.0'}
3145+ peerDependencies:
3146+ '@types/node': '*'
3147+ peerDependenciesMeta:
3148+ '@types/node':
3149+ optional: true
3150+
3151+ shebang-command@2.0.0:
3152+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
3153+ engines: {node: '>=8'}
3154+
3155+ shebang-regex@3.0.0:
3156+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
3157+ engines: {node: '>=8'}
3158+
3159+ side-channel-list@1.0.1:
3160+ resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
3161+ engines: {node: '>= 0.4'}
3162+
3163+ side-channel-map@1.0.1:
3164+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
3165+ engines: {node: '>= 0.4'}
3166+
3167+ side-channel-weakmap@1.0.2:
3168+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
3169+ engines: {node: '>= 0.4'}
3170+
3171+ side-channel@1.1.1:
3172+ resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
3173+ engines: {node: '>= 0.4'}
3174+
3175+ source-map-js@1.2.2:
3176+ resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==}
3177+ engines: {node: '>=0.10.0'}
3178+
3179+ space-separated-tokens@2.0.2:
3180+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
3181+
3182+ sprintf-js@1.0.3:
3183+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
3184+
3185+ ssf@0.11.2:
3186+ resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
3187+ engines: {node: '>=0.8'}
3188+
3189+ stable-hash@0.0.5:
3190+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
3191+
3192+ standardwebhooks@1.1.1:
3193+ resolution: {integrity: sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ==}
3194+
3195+ stop-iteration-iterator@1.1.0:
3196+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
3197+ engines: {node: '>= 0.4'}
3198+
3199+ string.prototype.includes@2.0.1:
3200+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
3201+ engines: {node: '>= 0.4'}
3202+
3203+ string.prototype.matchall@4.1.0:
3204+ resolution: {integrity: sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==}
3205+ engines: {node: '>= 0.4'}
3206+
3207+ string.prototype.repeat@1.0.0:
3208+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
3209+
3210+ string.prototype.trim@1.2.11:
3211+ resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
3212+ engines: {node: '>= 0.4'}
3213+
3214+ string.prototype.trimend@1.0.10:
3215+ resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==}
3216+ engines: {node: '>= 0.4'}
3217+
3218+ string.prototype.trimstart@1.0.8:
3219+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
3220+ engines: {node: '>= 0.4'}
3221+
3222+ string_decoder@1.1.1:
3223+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
3224+
3225+ stringify-entities@4.0.4:
3226+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
3227+
3228+ strip-bom@3.0.0:
3229+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
3230+ engines: {node: '>=4'}
3231+
3232+ style-to-object@2.0.2:
3233+ resolution: {integrity: sha512-QmbXPUylqU80HAgTOJeEOdbA40W9KtxmjMhQy+tq+b8F2aoh3aQLuy82hh2jm2qsC9hR9eI0+eQidTMydKcqRA==}
3234+
3235+ styled-jsx@5.1.6:
3236+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
3237+ engines: {node: '>= 12.0.0'}
3238+ peerDependencies:
3239+ '@babel/core': '*'
3240+ babel-plugin-macros: '*'
3241+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
3242+ peerDependenciesMeta:
3243+ '@babel/core':
3244+ optional: true
3245+ babel-plugin-macros:
3246+ optional: true
3247+
3248+ stylis@4.4.0:
3249+ resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==}
3250+
3251+ supports-preserve-symlinks-flag@1.0.0:
3252+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
3253+ engines: {node: '>= 0.4'}
3254+
3255+ swr@2.5.1:
3256+ resolution: {integrity: sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==}
3257+ peerDependencies:
3258+ react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
3259+
3260+ tailwindcss@4.3.3:
3261+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
3262+
3263+ tapable@2.3.3:
3264+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
3265+ engines: {node: '>=6'}
3266+
3267+ tiny-invariant@1.3.3:
3268+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
3269+
3270+ tinyexec@1.3.1:
3271+ resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==}
3272+ engines: {node: '>=18'}
3273+
3274+ tinyglobby@0.2.17:
3275+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
3276+ engines: {node: '>=12.0.0'}
3277+
3278+ to-regex-range@5.0.1:
3279+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
3280+ engines: {node: '>=8.0'}
3281+
3282+ trim-lines@3.0.1:
3283+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
3284+
3285+ trough@2.2.0:
3286+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
3287+
3288+ ts-algebra@2.0.0:
3289+ resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==}
3290+
3291+ ts-api-utils@2.5.0:
3292+ resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
3293+ engines: {node: '>=18.12'}
3294+ peerDependencies:
3295+ typescript: '>=4.8.4'
3296+
3297+ ts-dedent@2.3.0:
3298+ resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==}
3299+ engines: {node: '>=6.10'}
3300+
3301+ tsconfig-paths@3.15.0:
3302+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
3303+
3304+ tslib@2.9.1:
3305+ resolution: {integrity: sha512-a4Ux9VKuIMHsOS7ENbEq6hK2ZGYIT27Rtl0E4eD9KqwxhKiQeMZE/9xb3IdYwWaSOyIBQLExhQgXDTYoiCxnWA==}
3306+
3307+ tsx@4.23.15:
3308+ resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==}
3309+ engines: {node: '>=18.0.0'}
3310+ hasBin: true
3311+
3312+ type-check@0.4.0:
3313+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
3314+ engines: {node: '>= 0.8.0'}
3315+
3316+ typed-array-buffer@1.0.3:
3317+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
3318+ engines: {node: '>= 0.4'}
3319+
3320+ typed-array-byte-length@1.0.3:
3321+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
3322+ engines: {node: '>= 0.4'}
3323+
3324+ typed-array-byte-offset@1.0.5:
3325+ resolution: {integrity: sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==}
3326+ engines: {node: '>= 0.4'}
3327+
3328+ typed-array-length@1.0.8:
3329+ resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
3330+ engines: {node: '>= 0.4'}
3331+
3332+ typescript-eslint@8.72.1:
3333+ resolution: {integrity: sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==}
3334+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
3335+ peerDependencies:
3336+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
3337+ typescript: '>=4.8.4 <6.1.0'
3338+
3339+ typescript@5.9.3:
3340+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
3341+ engines: {node: '>=14.17'}
3342+ hasBin: true
3343+
3344+ unbox-primitive@1.1.0:
3345+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
3346+ engines: {node: '>= 0.4'}
3347+
3348+ underscore@1.13.8:
3349+ resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==}
3350+
3351+ undici-types@8.9.0:
3352+ resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==}
3353+
3354+ unified@11.0.5:
3355+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
3356+
3357+ unist-util-is@6.0.1:
3358+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
3359+
3360+ unist-util-position@5.0.0:
3361+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
3362+
3363+ unist-util-remove-position@5.0.0:
3364+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
3365+
3366+ unist-util-stringify-position@4.0.0:
3367+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
3368+
3369+ unist-util-visit-parents@6.1.0:
3370+ resolution: {integrity: sha512-vKXxz6O38sKDj1mtx/k2cWvkkFBuYGx6uGrlzBkVeWCRF/F8sdI0j3Wbkz/5rVNRRuVc8UrgRdbCxNhmYXgP3w==}
3371+
3372+ unist-util-visit@5.2.0:
3373+ resolution: {integrity: sha512-fpsYs/VVoZxfGY9/j3FQpZmN8wdLJaV1Pt38AaJNZu9uKIHcFU3halCdBveEq1HGKO1OEfJY65w1zvoFV1b3qQ==}
3374+
3375+ unrs-resolver@1.12.2:
3376+ resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==}
3377+
3378+ update-browserslist-db@1.3.4:
3379+ resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==}
3380+ hasBin: true
3381+ peerDependencies:
3382+ browserslist: '>= 4.21.0'
3383+
3384+ uri-js@4.4.1:
3385+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
3386+
3387+ use-sync-external-store@1.7.0:
3388+ resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==}
3389+ peerDependencies:
3390+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
3391+
3392+ util-deprecate@1.0.2:
3393+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
3394+
3395+ uuid@14.0.3:
3396+ resolution: {integrity: sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==}
3397+ hasBin: true
3398+
3399+ vfile-location@5.0.3:
3400+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
3401+
3402+ vfile-message@4.0.3:
3403+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
3404+
3405+ vfile@6.0.3:
3406+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
3407+
3408+ victory-vendor@37.4.1:
3409+ resolution: {integrity: sha512-geV4p2GVfVM9lgm9ZRS3pvsbAPS+BUGhM9W9nPzPHTKi+/+KjNrFXdgP6KkG+XspNZuvcXmchcrtklfuQ4gniw==}
3410+
3411+ web-namespaces@2.0.1:
3412+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
3413+
3414+ which-boxed-primitive@1.1.1:
3415+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
3416+ engines: {node: '>= 0.4'}
3417+
3418+ which-builtin-type@1.2.1:
3419+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
3420+ engines: {node: '>= 0.4'}
3421+
3422+ which-collection@1.0.2:
3423+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
3424+ engines: {node: '>= 0.4'}
3425+
3426+ which-typed-array@1.1.24:
3427+ resolution: {integrity: sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==}
3428+ engines: {node: '>= 0.4'}
3429+
3430+ which@2.0.2:
3431+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
3432+ engines: {node: '>= 8'}
3433+ hasBin: true
3434+
3435+ wmf@1.0.2:
3436+ resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==}
3437+ engines: {node: '>=0.8'}
3438+
3439+ word-wrap@1.2.5:
3440+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
3441+ engines: {node: '>=0.10.0'}
3442+
3443+ word@0.3.0:
3444+ resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==}
3445+ engines: {node: '>=0.8'}
3446+
3447+ xlsx@0.18.5:
3448+ resolution: {integrity: sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==}
3449+ engines: {node: '>=0.8'}
3450+ hasBin: true
3451+
3452+ xmlbuilder@10.1.1:
3453+ resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==}
3454+ engines: {node: '>=4.0'}
3455+
3456+ yallist@3.1.1:
3457+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
3458+
3459+ yocto-queue@0.1.0:
3460+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
3461+ engines: {node: '>=10'}
3462+
3463+ zod-validation-error@4.0.2:
3464+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
3465+ engines: {node: '>=18.0.0'}
3466+ peerDependencies:
3467+ zod: ^3.25.0 || ^4.0.0
3468+
3469+ zod@4.6.7:
3470+ resolution: {integrity: sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==}
3471+
3472+ zwitch@2.0.4:
3473+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
3474+
3475+snapshots:
3476+
3477+ '@alloc/quick-lru@5.3.0': {}
3478+
3479+ '@antfu/install-pkg@2.1.0':
3480+ dependencies:
3481+ package-manager-detector: 1.9.0
3482+ tinyexec: 1.3.1
3483+
3484+ '@anthropic-ai/sdk@1.3.0(zod@4.6.7)':
3485+ dependencies:
3486+ '@opentelemetry/api': 1.10.0
3487+ json-schema-to-ts: 3.1.1
3488+ standardwebhooks: 1.1.1
3489+ optionalDependencies:
3490+ zod: 4.6.7
3491+
3492+ '@babel/code-frame@7.29.7':
3493+ dependencies:
3494+ '@babel/helper-validator-identifier': 7.29.7
3495+ js-tokens: 4.0.0
3496+ picocolors: 1.1.1
3497+
3498+ '@babel/compat-data@7.29.7': {}
3499+
3500+ '@babel/core@7.29.7':
3501+ dependencies:
3502+ '@babel/code-frame': 7.29.7
3503+ '@babel/generator': 7.29.12
3504+ '@babel/helper-compilation-targets': 7.29.7
3505+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
3506+ '@babel/helpers': 7.29.10
3507+ '@babel/parser': 7.29.12
3508+ '@babel/template': 7.29.7
3509+ '@babel/traverse': 7.29.12
3510+ '@babel/types': 7.29.11
3511+ '@jridgewell/remapping': 2.3.5
3512+ convert-source-map: 2.0.0
3513+ debug: 4.4.3
3514+ gensync: 1.0.0-beta.2
3515+ json5: 2.2.3
3516+ semver: 6.3.1
3517+ transitivePeerDependencies:
3518+ - supports-color
3519+
3520+ '@babel/generator@7.29.12':
3521+ dependencies:
3522+ '@babel/parser': 7.29.12
3523+ '@babel/types': 7.29.11
3524+ '@jridgewell/gen-mapping': 0.3.13
3525+ '@jridgewell/trace-mapping': 0.3.31
3526+ jsesc: 3.1.0
3527+
3528+ '@babel/helper-compilation-targets@7.29.7':
3529+ dependencies:
3530+ '@babel/compat-data': 7.29.7
3531+ '@babel/helper-validator-option': 7.29.7
3532+ browserslist: 4.29.5
3533+ lru-cache: 5.1.1
3534+ semver: 6.3.1
3535+
3536+ '@babel/helper-globals@7.29.7': {}
3537+
3538+ '@babel/helper-module-imports@7.29.7':
3539+ dependencies:
3540+ '@babel/traverse': 7.29.12
3541+ '@babel/types': 7.29.11
3542+ transitivePeerDependencies:
3543+ - supports-color
3544+
3545+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
3546+ dependencies:
3547+ '@babel/core': 7.29.7
3548+ '@babel/helper-module-imports': 7.29.7
3549+ '@babel/helper-validator-identifier': 7.29.7
3550+ '@babel/traverse': 7.29.12
3551+ transitivePeerDependencies:
3552+ - supports-color
3553+
3554+ '@babel/helper-string-parser@7.29.11': {}
3555+
3556+ '@babel/helper-validator-identifier@7.29.7': {}
3557+
3558+ '@babel/helper-validator-option@7.29.7': {}
3559+
3560+ '@babel/helpers@7.29.10':
3561+ dependencies:
3562+ '@babel/template': 7.29.7
3563+ '@babel/types': 7.29.11
3564+
3565+ '@babel/parser@7.29.12':
3566+ dependencies:
3567+ '@babel/types': 7.29.11
3568+
3569+ '@babel/runtime@7.29.10': {}
3570+
3571+ '@babel/template@7.29.7':
3572+ dependencies:
3573+ '@babel/code-frame': 7.29.7
3574+ '@babel/parser': 7.29.12
3575+ '@babel/types': 7.29.11
3576+
3577+ '@babel/traverse@7.29.12':
3578+ dependencies:
3579+ '@babel/code-frame': 7.29.7
3580+ '@babel/generator': 7.29.12
3581+ '@babel/helper-globals': 7.29.7
3582+ '@babel/parser': 7.29.12
3583+ '@babel/template': 7.29.7
3584+ '@babel/types': 7.29.11
3585+ debug: 4.4.3
3586+ transitivePeerDependencies:
3587+ - supports-color
3588+
3589+ '@babel/types@7.29.11':
3590+ dependencies:
3591+ '@babel/helper-string-parser': 7.29.11
3592+ '@babel/helper-validator-identifier': 7.29.7
3593+
3594+ '@braintree/sanitize-url@7.1.2': {}
3595+
3596+ '@cacheable/memory@2.2.0':
3597+ dependencies:
3598+ '@cacheable/utils': 2.5.0
3599+ '@keyv/bigmap': 1.3.1(keyv@5.6.0)
3600+ hookified: 1.15.1
3601+ keyv: 5.6.0
3602+
3603+ '@cacheable/utils@2.5.0':
3604+ dependencies:
3605+ hashery: 1.5.1
3606+ keyv: 5.6.0
3607+
3608+ '@chevrotain/cst-dts-gen@13.2.0':
3609+ dependencies:
3610+ '@chevrotain/gast': 13.2.0
3611+ '@chevrotain/types': 13.2.0
3612+
3613+ '@chevrotain/gast@13.2.0':
3614+ dependencies:
3615+ '@chevrotain/types': 13.2.0
3616+
3617+ '@chevrotain/regexp-to-ast@13.2.0': {}
3618+
3619+ '@chevrotain/types@13.2.0': {}
3620+
3621+ '@chevrotain/utils@13.2.0': {}
3622+
3623+ '@emnapi/core@1.10.0':
3624+ dependencies:
3625+ '@emnapi/wasi-threads': 1.2.1
3626+ tslib: 2.9.1
3627+ optional: true
3628+
3629+ '@emnapi/runtime@1.10.0':
3630+ dependencies:
3631+ tslib: 2.9.1
3632+ optional: true
3633+
3634+ '@emnapi/runtime@1.11.3':
3635+ dependencies:
3636+ tslib: 2.9.1
3637+ optional: true
3638+
3639+ '@emnapi/wasi-threads@1.2.1':
3640+ dependencies:
3641+ tslib: 2.9.1
3642+ optional: true
3643+
3644+ '@esbuild/aix-ppc64@0.28.2':
3645+ optional: true
3646+
3647+ '@esbuild/android-arm64@0.28.2':
3648+ optional: true
3649+
3650+ '@esbuild/android-arm@0.28.2':
3651+ optional: true
3652+
3653+ '@esbuild/android-x64@0.28.2':
3654+ optional: true
3655+
3656+ '@esbuild/darwin-arm64@0.28.2':
3657+ optional: true
3658+
3659+ '@esbuild/darwin-x64@0.28.2':
3660+ optional: true
3661+
3662+ '@esbuild/freebsd-arm64@0.28.2':
3663+ optional: true
3664+
3665+ '@esbuild/freebsd-x64@0.28.2':
3666+ optional: true
3667+
3668+ '@esbuild/linux-arm64@0.28.2':
3669+ optional: true
3670+
3671+ '@esbuild/linux-arm@0.28.2':
3672+ optional: true
3673+
3674+ '@esbuild/linux-ia32@0.28.2':
3675+ optional: true
3676+
3677+ '@esbuild/linux-loong64@0.28.2':
3678+ optional: true
3679+
3680+ '@esbuild/linux-mips64el@0.28.2':
3681+ optional: true
3682+
3683+ '@esbuild/linux-ppc64@0.28.2':
3684+ optional: true
3685+
3686+ '@esbuild/linux-riscv64@0.28.2':
3687+ optional: true
3688+
3689+ '@esbuild/linux-s390x@0.28.2':
3690+ optional: true
3691+
3692+ '@esbuild/linux-x64@0.28.2':
3693+ optional: true
3694+
3695+ '@esbuild/netbsd-arm64@0.28.2':
3696+ optional: true
3697+
3698+ '@esbuild/netbsd-x64@0.28.2':
3699+ optional: true
3700+
3701+ '@esbuild/openbsd-arm64@0.28.2':
3702+ optional: true
3703+
3704+ '@esbuild/openbsd-x64@0.28.2':
3705+ optional: true
3706+
3707+ '@esbuild/openharmony-arm64@0.28.2':
3708+ optional: true
3709+
3710+ '@esbuild/sunos-x64@0.28.2':
3711+ optional: true
3712+
3713+ '@esbuild/win32-arm64@0.28.2':
3714+ optional: true
3715+
3716+ '@esbuild/win32-ia32@0.28.2':
3717+ optional: true
3718+
3719+ '@esbuild/win32-x64@0.28.2':
3720+ optional: true
3721+
3722+ '@eslint-community/eslint-utils@4.10.1(eslint@10.14.0(jiti@2.7.0))':
3723+ dependencies:
3724+ eslint: 10.14.0(jiti@2.7.0)
3725+ eslint-visitor-keys: 3.4.3
3726+
3727+ '@eslint-community/eslint-utils@4.9.1(eslint@10.14.0(jiti@2.7.0))':
3728+ dependencies:
3729+ eslint: 10.14.0(jiti@2.7.0)
3730+ eslint-visitor-keys: 3.4.3
3731+
3732+ '@eslint-community/regexpp@4.12.2': {}
3733+
3734+ '@eslint/config-array@0.23.5':
3735+ dependencies:
3736+ '@eslint/object-schema': 3.0.5
3737+ debug: 4.4.3
3738+ minimatch: 10.2.6
3739+ transitivePeerDependencies:
3740+ - supports-color
3741+
3742+ '@eslint/config-helpers@0.7.0':
3743+ dependencies:
3744+ '@eslint/core': 1.2.1
3745+
3746+ '@eslint/core@1.2.1':
3747+ dependencies:
3748+ '@types/json-schema': 7.0.15
3749+
3750+ '@eslint/object-schema@3.0.5': {}
3751+
3752+ '@eslint/plugin-kit@0.7.3':
3753+ dependencies:
3754+ '@eslint/core': 1.2.1
3755+ levn: 0.4.1
3756+
3757+ '@humanfs/core@0.19.2':
3758+ dependencies:
3759+ '@humanfs/types': 0.15.0
3760+
3761+ '@humanfs/node@0.16.8':
3762+ dependencies:
3763+ '@humanfs/core': 0.19.2
3764+ '@humanfs/types': 0.15.0
3765+ '@humanwhocodes/retry': 0.4.3
3766+
3767+ '@humanfs/types@0.15.0': {}
3768+
3769+ '@humanwhocodes/module-importer@1.0.1': {}
3770+
3771+ '@humanwhocodes/retry@0.4.3': {}
3772+
3773+ '@iconify/types@2.0.0': {}
3774+
3775+ '@iconify/utils@3.1.7':
3776+ dependencies:
3777+ '@antfu/install-pkg': 2.1.0
3778+ '@iconify/types': 2.0.0
3779+ import-meta-resolve: 4.2.0
3780+
3781+ '@img/colour@1.1.0':
3782+ optional: true
3783+
3784+ '@img/sharp-darwin-arm64@0.35.5':
3785+ optionalDependencies:
3786+ '@img/sharp-libvips-darwin-arm64': 1.3.4
3787+ optional: true
3788+
3789+ '@img/sharp-darwin-x64@0.35.5':
3790+ optionalDependencies:
3791+ '@img/sharp-libvips-darwin-x64': 1.3.4
3792+ optional: true
3793+
3794+ '@img/sharp-freebsd-wasm32@0.35.5':
3795+ dependencies:
3796+ '@img/sharp-wasm32': 0.35.5
3797+ optional: true
3798+
3799+ '@img/sharp-libvips-darwin-arm64@1.3.4':
3800+ optional: true
3801+
3802+ '@img/sharp-libvips-darwin-x64@1.3.4':
3803+ optional: true
3804+
3805+ '@img/sharp-libvips-linux-arm64@1.3.4':
3806+ optional: true
3807+
3808+ '@img/sharp-libvips-linux-arm@1.3.4':
3809+ optional: true
3810+
3811+ '@img/sharp-libvips-linux-ppc64@1.3.4':
3812+ optional: true
3813+
3814+ '@img/sharp-libvips-linux-riscv64@1.3.4':
3815+ optional: true
3816+
3817+ '@img/sharp-libvips-linux-s390x@1.3.4':
3818+ optional: true
3819+
3820+ '@img/sharp-libvips-linux-x64@1.3.4':
3821+ optional: true
3822+
3823+ '@img/sharp-libvips-linuxmusl-arm64@1.3.4':
3824+ optional: true
3825+
3826+ '@img/sharp-libvips-linuxmusl-x64@1.3.4':
3827+ optional: true
3828+
3829+ '@img/sharp-linux-arm64@0.35.5':
3830+ optionalDependencies:
3831+ '@img/sharp-libvips-linux-arm64': 1.3.4
3832+ optional: true
3833+
3834+ '@img/sharp-linux-arm@0.35.5':
3835+ optionalDependencies:
3836+ '@img/sharp-libvips-linux-arm': 1.3.4
3837+ optional: true
3838+
3839+ '@img/sharp-linux-ppc64@0.35.5':
3840+ optionalDependencies:
3841+ '@img/sharp-libvips-linux-ppc64': 1.3.4
3842+ optional: true
3843+
3844+ '@img/sharp-linux-riscv64@0.35.5':
3845+ optionalDependencies:
3846+ '@img/sharp-libvips-linux-riscv64': 1.3.4
3847+ optional: true
3848+
3849+ '@img/sharp-linux-s390x@0.35.5':
3850+ optionalDependencies:
3851+ '@img/sharp-libvips-linux-s390x': 1.3.4
3852+ optional: true
3853+
3854+ '@img/sharp-linux-x64@0.35.5':
3855+ optionalDependencies:
3856+ '@img/sharp-libvips-linux-x64': 1.3.4
3857+ optional: true
3858+
3859+ '@img/sharp-linuxmusl-arm64@0.35.5':
3860+ optionalDependencies:
3861+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.4
3862+ optional: true
3863+
3864+ '@img/sharp-linuxmusl-x64@0.35.5':
3865+ optionalDependencies:
3866+ '@img/sharp-libvips-linuxmusl-x64': 1.3.4
3867+ optional: true
3868+
3869+ '@img/sharp-wasm32@0.35.5':
3870+ dependencies:
3871+ '@emnapi/runtime': 1.11.3
3872+ optional: true
3873+
3874+ '@img/sharp-webcontainers-wasm32@0.35.5':
3875+ dependencies:
3876+ '@img/sharp-wasm32': 0.35.5
3877+ optional: true
3878+
3879+ '@img/sharp-win32-arm64@0.35.5':
3880+ optional: true
3881+
3882+ '@img/sharp-win32-ia32@0.35.5':
3883+ optional: true
3884+
3885+ '@img/sharp-win32-x64@0.35.5':
3886+ optional: true
3887+
3888+ '@jridgewell/gen-mapping@0.3.13':
3889+ dependencies:
3890+ '@jridgewell/sourcemap-codec': 1.6.0
3891+ '@jridgewell/trace-mapping': 0.3.31
3892+
3893+ '@jridgewell/remapping@2.3.5':
3894+ dependencies:
3895+ '@jridgewell/gen-mapping': 0.3.13
3896+ '@jridgewell/trace-mapping': 0.3.31
3897+
3898+ '@jridgewell/resolve-uri@3.1.2': {}
3899+
3900+ '@jridgewell/sourcemap-codec@1.6.0': {}
3901+
3902+ '@jridgewell/trace-mapping@0.3.31':
3903+ dependencies:
3904+ '@jridgewell/resolve-uri': 3.1.2
3905+ '@jridgewell/sourcemap-codec': 1.6.0
3906+
3907+ '@keyv/bigmap@1.3.1(keyv@5.6.0)':
3908+ dependencies:
3909+ hashery: 1.5.1
3910+ hookified: 1.15.1
3911+ keyv: 5.6.0
3912+
3913+ '@keyv/serialize@1.1.1': {}
3914+
3915+ '@mermaid-js/parser@2.0.1':
3916+ dependencies:
3917+ '@chevrotain/types': 13.2.0
3918+
3919+ '@napi-rs/canvas-android-arm64@0.1.80':
3920+ optional: true
3921+
3922+ '@napi-rs/canvas-darwin-arm64@0.1.80':
3923+ optional: true
3924+
3925+ '@napi-rs/canvas-darwin-x64@0.1.80':
3926+ optional: true
3927+
3928+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
3929+ optional: true
3930+
3931+ '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
3932+ optional: true
3933+
3934+ '@napi-rs/canvas-linux-arm64-musl@0.1.80':
3935+ optional: true
3936+
3937+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
3938+ optional: true
3939+
3940+ '@napi-rs/canvas-linux-x64-gnu@0.1.80':
3941+ optional: true
3942+
3943+ '@napi-rs/canvas-linux-x64-musl@0.1.80':
3944+ optional: true
3945+
3946+ '@napi-rs/canvas-win32-x64-msvc@0.1.80':
3947+ optional: true
3948+
3949+ '@napi-rs/canvas@0.1.80':
3950+ optionalDependencies:
3951+ '@napi-rs/canvas-android-arm64': 0.1.80
3952+ '@napi-rs/canvas-darwin-arm64': 0.1.80
3953+ '@napi-rs/canvas-darwin-x64': 0.1.80
3954+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.80
3955+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.80
3956+ '@napi-rs/canvas-linux-arm64-musl': 0.1.80
3957+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.80
3958+ '@napi-rs/canvas-linux-x64-gnu': 0.1.80
3959+ '@napi-rs/canvas-linux-x64-musl': 0.1.80
3960+ '@napi-rs/canvas-win32-x64-msvc': 0.1.80
3961+
3962+ '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)':
3963+ dependencies:
3964+ '@emnapi/core': 1.10.0
3965+ '@emnapi/runtime': 1.10.0
3966+ '@tybys/wasm-util': 0.10.4
3967+ optional: true
3968+
3969+ '@next/env@16.4.3': {}
3970+
3971+ '@next/eslint-plugin-next@16.4.3(eslint@10.14.0(jiti@2.7.0))':
3972+ dependencies:
3973+ '@eslint-community/eslint-utils': 4.9.1(eslint@10.14.0(jiti@2.7.0))
3974+ fast-glob: 3.3.1
3975+ transitivePeerDependencies:
3976+ - eslint
3977+
3978+ '@next/swc-darwin-arm64@16.4.3':
3979+ optional: true
3980+
3981+ '@next/swc-darwin-x64@16.4.3':
3982+ optional: true
3983+
3984+ '@next/swc-linux-arm64-gnu@16.4.3':
3985+ optional: true
3986+
3987+ '@next/swc-linux-arm64-musl@16.4.3':
3988+ optional: true
3989+
3990+ '@next/swc-linux-x64-gnu@16.4.3':
3991+ optional: true
3992+
3993+ '@next/swc-linux-x64-musl@16.4.3':
3994+ optional: true
3995+
3996+ '@next/swc-win32-arm64-msvc@16.4.3':
3997+ optional: true
3998+
3999+ '@next/swc-win32-x64-msvc@16.4.3':
4000+ optional: true
4001+
4002+ '@node-rs/argon2-android-arm-eabi@2.2.2':
4003+ optional: true
4004+
4005+ '@node-rs/argon2-android-arm64@2.2.2':
4006+ optional: true
4007+
4008+ '@node-rs/argon2-darwin-arm64@2.2.2':
4009+ optional: true
4010+
4011+ '@node-rs/argon2-darwin-x64@2.2.2':
4012+ optional: true
4013+
4014+ '@node-rs/argon2-freebsd-x64@2.2.2':
4015+ optional: true
4016+
4017+ '@node-rs/argon2-linux-arm-gnueabihf@2.2.2':
4018+ optional: true
4019+
4020+ '@node-rs/argon2-linux-arm64-gnu@2.2.2':
4021+ optional: true
4022+
4023+ '@node-rs/argon2-linux-arm64-musl@2.2.2':
4024+ optional: true
4025+
4026+ '@node-rs/argon2-linux-x64-gnu@2.2.2':
4027+ optional: true
4028+
4029+ '@node-rs/argon2-linux-x64-musl@2.2.2':
4030+ optional: true
4031+
4032+ '@node-rs/argon2-win32-arm64-msvc@2.2.2':
4033+ optional: true
4034+
4035+ '@node-rs/argon2-win32-ia32-msvc@2.2.2':
4036+ optional: true
4037+
4038+ '@node-rs/argon2-win32-x64-msvc@2.2.2':
4039+ optional: true
4040+
4041+ '@node-rs/argon2@2.2.2':
4042+ optionalDependencies:
4043+ '@node-rs/argon2-android-arm-eabi': 2.2.2
4044+ '@node-rs/argon2-android-arm64': 2.2.2
4045+ '@node-rs/argon2-darwin-arm64': 2.2.2
4046+ '@node-rs/argon2-darwin-x64': 2.2.2
4047+ '@node-rs/argon2-freebsd-x64': 2.2.2
4048+ '@node-rs/argon2-linux-arm-gnueabihf': 2.2.2
4049+ '@node-rs/argon2-linux-arm64-gnu': 2.2.2
4050+ '@node-rs/argon2-linux-arm64-musl': 2.2.2
4051+ '@node-rs/argon2-linux-x64-gnu': 2.2.2
4052+ '@node-rs/argon2-linux-x64-musl': 2.2.2
4053+ '@node-rs/argon2-win32-arm64-msvc': 2.2.2
4054+ '@node-rs/argon2-win32-ia32-msvc': 2.2.2
4055+ '@node-rs/argon2-win32-x64-msvc': 2.2.2
4056+
4057+ '@nodelib/fs.scandir@2.1.5':
4058+ dependencies:
4059+ '@nodelib/fs.stat': 2.0.5
4060+ run-parallel: 1.2.0
4061+
4062+ '@nodelib/fs.stat@2.0.5': {}
4063+
4064+ '@nodelib/fs.walk@1.2.8':
4065+ dependencies:
4066+ '@nodelib/fs.scandir': 2.1.5
4067+ fastq: 1.20.3
4068+
4069+ '@nolyfill/is-core-module@1.0.39': {}
4070+
4071+ '@opentelemetry/api@1.10.0': {}
4072+
4073+ '@reduxjs/toolkit@2.13.0(react-redux@9.3.1(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1))(react@19.3.0)':
4074+ dependencies:
4075+ '@standard-schema/spec': 1.1.0
4076+ '@standard-schema/utils': 0.3.0
4077+ immer: 11.2.9
4078+ redux: 5.0.1
4079+ redux-thunk: 3.1.0(redux@5.0.1)
4080+ reselect: 5.2.0
4081+ optionalDependencies:
4082+ react: 19.3.0
4083+ react-redux: 9.3.1(@types/react@19.3.0)(react@19.3.0)(redux@5.0.1)
4084+
4085+ '@rtsao/scc@1.1.0': {}
4086+
4087+ '@stablelib/base64@1.0.1': {}
4088+
4089+ '@standard-schema/spec@1.1.0': {}
4090+
4091+ '@standard-schema/utils@0.3.0': {}
4092+
4093+ '@swc/helpers@0.5.23':
4094+ dependencies:
4095+ tslib: 2.9.1
4096+
4097+ '@tailwindcss/node@4.3.3':
4098+ dependencies:
4099+ '@jridgewell/remapping': 2.3.5
4100+ enhanced-resolve: 5.26.0
4101+ jiti: 2.7.0
4102+ lightningcss: 1.32.0
4103+ magic-string: 0.30.21
4104+ source-map-js: 1.2.2
4105+ tailwindcss: 4.3.3
4106+
4107+ '@tailwindcss/oxide-android-arm64@4.3.3':
4108+ optional: true
4109+
4110+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
4111+ optional: true
4112+
4113+ '@tailwindcss/oxide-darwin-x64@4.3.3':
4114+ optional: true
4115+
4116+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
4117+ optional: true
4118+
4119+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
4120+ optional: true
4121+
4122+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
4123+ optional: true
4124+
4125+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
4126+ optional: true
4127+
4128+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
4129+ optional: true
4130+
4131+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
4132+ optional: true
4133+
4134+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
4135+ optional: true
4136+
4137+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
4138+ optional: true
4139+
4140+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
4141+ optional: true
4142+
4143+ '@tailwindcss/oxide@4.3.3':
4144+ optionalDependencies:
4145+ '@tailwindcss/oxide-android-arm64': 4.3.3
4146+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
4147+ '@tailwindcss/oxide-darwin-x64': 4.3.3
4148+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
4149+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
4150+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
4151+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
4152+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
4153+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
4154+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
4155+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
4156+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
4157+
4158+ '@tailwindcss/postcss@4.3.3':
4159+ dependencies:
4160+ '@alloc/quick-lru': 5.3.0
4161+ '@tailwindcss/node': 4.3.3
4162+ '@tailwindcss/oxide': 4.3.3
4163+ postcss: 8.5.23
4164+ tailwindcss: 4.3.3
4165+
4166+ '@tybys/wasm-util@0.10.4':
4167+ dependencies:
4168+ tslib: 2.9.1
4169+ optional: true
4170+
4171+ '@types/d3-array@3.2.2': {}
4172+
4173+ '@types/d3-axis@3.0.6':
4174+ dependencies:
4175+ '@types/d3-selection': 3.0.12
4176+
4177+ '@types/d3-brush@3.0.6':
4178+ dependencies:
4179+ '@types/d3-selection': 3.0.12
4180+
4181+ '@types/d3-chord@3.0.6': {}
4182+
4183+ '@types/d3-color@3.1.3': {}
4184+
4185+ '@types/d3-contour@3.0.6':
4186+ dependencies:
4187+ '@types/d3-array': 3.2.2
4188+ '@types/geojson': 7946.0.16
4189+
4190+ '@types/d3-delaunay@6.0.4': {}
4191+
4192+ '@types/d3-dispatch@3.0.7': {}
4193+
4194+ '@types/d3-drag@3.0.7':
4195+ dependencies:
4196+ '@types/d3-selection': 3.0.12
4197+
4198+ '@types/d3-dsv@3.0.7': {}
4199+
4200+ '@types/d3-ease@3.0.2': {}
4201+
4202+ '@types/d3-fetch@3.0.7':
4203+ dependencies:
4204+ '@types/d3-dsv': 3.0.7
4205+
4206+ '@types/d3-force@3.0.10': {}
4207+
4208+ '@types/d3-format@3.0.4': {}
4209+
4210+ '@types/d3-geo@3.1.1':
4211+ dependencies:
4212+ '@types/geojson': 7946.0.16
4213+
4214+ '@types/d3-hierarchy@3.1.7': {}
4215+
4216+ '@types/d3-interpolate@3.0.4':
4217+ dependencies:
4218+ '@types/d3-color': 3.1.3
4219+
4220+ '@types/d3-path@3.1.1': {}
4221+
4222+ '@types/d3-polygon@3.0.2': {}
4223+
4224+ '@types/d3-quadtree@3.0.6': {}
4225+
4226+ '@types/d3-random@3.0.4': {}
4227+
4228+ '@types/d3-scale-chromatic@3.1.0': {}
4229+
4230+ '@types/d3-scale@4.0.9':
4231+ dependencies:
4232+ '@types/d3-time': 3.0.4
4233+
4234+ '@types/d3-selection@3.0.12': {}
4235+
4236+ '@types/d3-shape@3.2.0':
4237+ dependencies:
4238+ '@types/d3-path': 3.1.1
4239+
4240+ '@types/d3-time-format@4.0.3': {}
4241+
4242+ '@types/d3-time@3.0.4': {}
4243+
4244+ '@types/d3-timer@3.0.2': {}
4245+
4246+ '@types/d3-transition@3.0.9':
4247+ dependencies:
4248+ '@types/d3-selection': 3.0.12
4249+
4250+ '@types/d3-zoom@3.0.9':
4251+ dependencies:
4252+ '@types/d3-interpolate': 3.0.4
4253+ '@types/d3-selection': 3.0.12
4254+
4255+ '@types/d3@7.4.3':
4256+ dependencies:
4257+ '@types/d3-array': 3.2.2
4258+ '@types/d3-axis': 3.0.6
4259+ '@types/d3-brush': 3.0.6
4260+ '@types/d3-chord': 3.0.6
4261+ '@types/d3-color': 3.1.3
4262+ '@types/d3-contour': 3.0.6
4263+ '@types/d3-delaunay': 6.0.4
4264+ '@types/d3-dispatch': 3.0.7
4265+ '@types/d3-drag': 3.0.7
4266+ '@types/d3-dsv': 3.0.7
4267+ '@types/d3-ease': 3.0.2
4268+ '@types/d3-fetch': 3.0.7
4269+ '@types/d3-force': 3.0.10
4270+ '@types/d3-format': 3.0.4
4271+ '@types/d3-geo': 3.1.1
4272+ '@types/d3-hierarchy': 3.1.7
4273+ '@types/d3-interpolate': 3.0.4
4274+ '@types/d3-path': 3.1.1
4275+ '@types/d3-polygon': 3.0.2
4276+ '@types/d3-quadtree': 3.0.6
4277+ '@types/d3-random': 3.0.4
4278+ '@types/d3-scale': 4.0.9
4279+ '@types/d3-scale-chromatic': 3.1.0
4280+ '@types/d3-selection': 3.0.12
4281+ '@types/d3-shape': 3.2.0
4282+ '@types/d3-time': 3.0.4
4283+ '@types/d3-time-format': 4.0.3
4284+ '@types/d3-timer': 3.0.2
4285+ '@types/d3-transition': 3.0.9
4286+ '@types/d3-zoom': 3.0.9
4287+
4288+ '@types/debug@4.1.13':
4289+ dependencies:
4290+ '@types/ms': 2.1.0
4291+
4292+ '@types/esrecurse@4.3.1': {}
4293+
4294+ '@types/estree-jsx@1.0.5':
4295+ dependencies:
4296+ '@types/estree': 1.0.10
4297+
4298+ '@types/estree@1.0.10': {}
4299+
4300+ '@types/geojson@7946.0.16': {}
4301+
4302+ '@types/hast@3.0.5':
4303+ dependencies:
4304+ '@types/unist': 3.0.3
4305+
4306+ '@types/json-schema@7.0.15': {}
4307+
4308+ '@types/json5@0.0.29': {}
4309+
4310+ '@types/katex@0.16.8': {}
4311+
4312+ '@types/mdast@4.0.4':
4313+ dependencies:
4314+ '@types/unist': 3.0.3
4315+
4316+ '@types/ms@2.1.0': {}
4317+
4318+ '@types/node@26.6.6':
4319+ dependencies:
4320+ undici-types: 8.9.0
4321+
4322+ '@types/pdf-parse@1.1.5':
4323+ dependencies:
4324+ '@types/node': 26.6.6
4325+
4326+ '@types/pngjs@6.0.5':
4327+ dependencies:
4328+ '@types/node': 26.6.6
4329+
4330+ '@types/react-dom@19.3.0(@types/react@19.3.0)':
4331+ dependencies:
4332+ '@types/react': 19.3.0
4333+
4334+ '@types/react@19.3.0':
4335+ dependencies:
4336+ csstype: 3.2.3
4337+
4338+ '@types/trusted-types@2.0.7':
4339+ optional: true
4340+
4341+ '@types/unist@2.0.11': {}
4342+
4343+ '@types/unist@3.0.3': {}
4344+
4345+ '@types/use-sync-external-store@0.0.6': {}
4346+
4347+ '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)':
4348+ dependencies:
4349+ '@eslint-community/regexpp': 4.12.2
4350+ '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)
4351+ '@typescript-eslint/scope-manager': 8.72.1
4352+ '@typescript-eslint/type-utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)
4353+ '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)
4354+ '@typescript-eslint/visitor-keys': 8.72.1
4355+ eslint: 10.14.0(jiti@2.7.0)
4356+ ignore: 7.0.14
4357+ natural-compare: 1.4.0
4358+ ts-api-utils: 2.5.0(typescript@5.9.3)
4359+ typescript: 5.9.3
4360+ transitivePeerDependencies:
4361+ - supports-color
4362+
4363+ '@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)':
4364+ dependencies:
4365+ '@typescript-eslint/scope-manager': 8.72.1
4366+ '@typescript-eslint/types': 8.72.1
4367+ '@typescript-eslint/typescript-estree': 8.72.1(typescript@5.9.3)
4368+ '@typescript-eslint/visitor-keys': 8.72.1
4369+ debug: 4.4.3
4370+ eslint: 10.14.0(jiti@2.7.0)
4371+ typescript: 5.9.3
4372+ transitivePeerDependencies:
4373+ - supports-color
4374+
4375+ '@typescript-eslint/project-service@8.72.1(typescript@5.9.3)':
4376+ dependencies:
4377+ '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@5.9.3)
4378+ '@typescript-eslint/types': 8.72.1
4379+ debug: 4.4.3
4380+ typescript: 5.9.3
4381+ transitivePeerDependencies:
4382+ - supports-color
4383+
4384+ '@typescript-eslint/scope-manager@8.72.1':
4385+ dependencies:
4386+ '@typescript-eslint/types': 8.72.1
4387+ '@typescript-eslint/visitor-keys': 8.72.1
4388+
4389+ '@typescript-eslint/tsconfig-utils@8.72.1(typescript@5.9.3)':
4390+ dependencies:
4391+ typescript: 5.9.3
4392+
4393+ '@typescript-eslint/type-utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@5.9.3)':
4394+ dependencies:
4395+ '@typescript-eslint/types': 8.72.1

Diff truncated — file too large.

Menu

Theme