llm.rb 16.0.0.pre.7 → 16.0.0.pre.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a92555a0d4e73fd37604103300639f048607b332a106a042615ff76880b9665
4
- data.tar.gz: de618250fdd9cdf37c928e2753e6be173201f482ce30ae97ce0e080bea3c8a24
3
+ metadata.gz: 05acffd1b6e5349176d0f54466c43f26d7918aa7132de40f99b57ccce25c1bf4
4
+ data.tar.gz: 0cd1c8e985a857b207e8024d7fa65c84bd5ae3de742f11bf761683542d8eb637
5
5
  SHA512:
6
- metadata.gz: 8739cb9db9168ea2a6daedb82a068b51085509ffc0447e0d4f7415fc7b3c02051d9a26b85f3a0a0b7cda7e7cb4ae47f50f5a7f181a56b1f97d516e4b34a99117
7
- data.tar.gz: 6c615f5ac41d186a2215db2f3d64fe68896f960bab8154629ac3322666e350bbe29dce80622cac190f6e1b8b57827413545cc41d5098f7d88867f0a9469ced2a
6
+ metadata.gz: db1d654420ee79781bcb296b0b975005b38199d7c0fabd0d83dbbe6392648bd6c3c6f41b701132ddbb4ae1b87289e9edce12b4c588b1c79736275944b4c4d279
7
+ data.tar.gz: b71bd520cdf43918b5223dd6a78985f174cbb07dd3f8b03b1d62ee4f4b2a178e39b0af4b4157d4db6d9f038b8418b330363b8c81b226125d30993ca9d090bf3b
data/CHANGELOG.md CHANGED
@@ -27,8 +27,9 @@ Releases before v15 are kept in [changelog/old.md](changelog/old.md).
27
27
  | Ruby 3.3 or later | Ruby 3.4 or later |
28
28
  | `record.messages` returns the messages the runtime holds | a `:jsonb` record returns a relation of `LLM::ActiveRecord::Message` rows |
29
29
  | a `set_tracer` method on an ORM model | `set tracer:` in the block, or `tracer:` on the wrapper |
30
- | a `:thread` or `:fiber` cancel that arrives before the tool starts is dropped | the cancel is held and raised once the tool starts |
30
+ | a pre-start cancel is dropped on `:thread`, `:fiber`, and `:async`, a `NoMethodError` on `:fork`, and says nothing on `:ractor` | the cancel is held, and delivered inside the tool's call |
31
31
  | a cancel that arrives between two requests does nothing | the turn ends there, and the caller sees `LLM::Interrupt` |
32
+ | a bare `rescue`, or `rescue => ex`, catches a cancel | `LLM::Interrupt` is outside `StandardError`, so both forms pass it through |
32
33
 
33
34
  * **drop Ruby 3.3 support** <br>
34
35
  The gem now requires Ruby 3.4 or later. Ruby 3.3 cannot hold an
@@ -42,12 +43,16 @@ Releases before v15 are kept in [changelog/old.md](changelog/old.md).
42
43
  that again with `#messages!`, and order the relation by `position`
43
44
  because it is unordered.
44
45
 
45
- * **function: hold a cancel on `:thread` and `:fiber` instead of dropping it** <br>
46
- A cancel that arrived before the tool started used to be dropped, and the call
47
- ran to completion. It is now held and raised once the tool starts, so a caller
48
- that cancelled a task it had not yet spawned sees
49
- [`LLM::Interrupt`](https://r.uby.dev/api-docs/llm.rb/LLM/Interrupt.html) where
50
- it used to see a return.
46
+ * **function: hold a cancel that arrives before the tool starts** <br>
47
+ A cancel that arrived before the tool started used to be lost: dropped on
48
+ `:thread`, `:fiber`, and `:async`, a `NoMethodError` on a `:fork` task that
49
+ had not been spawned, and nothing at all on `:ractor`. It is now held until
50
+ the call opens and delivered inside it, so the tool is entered, its own
51
+ `rescue` sees the interrupt, and a caller that cancelled a task it had not
52
+ yet spawned is answered with the cancel rather than a return. On `:async`
53
+ and `:fiber` the raise is asked of the scheduler rather than issued, so a
54
+ tool that never yields still answers, and that caller sees a return with the
55
+ tool told it was asked about.
51
56
 
52
57
  * **interrupt: reach a turn that is between its requests** <br>
53
58
  A cancel that arrived between two requests used to do nothing, because
@@ -57,8 +62,19 @@ Releases before v15 are kept in [changelog/old.md](changelog/old.md).
57
62
  first. `LLM::Agent#run_loop` records that caller for as long as the turn
58
63
  lasts, and it answers `interrupt!` through
59
64
  [`LLM::Agent::Interrupt`](https://r.uby.dev/api-docs/llm.rb/LLM/Agent/Interrupt.html).
60
- `LLM::Interrupt` is a `StandardError`, so a broad `rescue` catches it
61
- wherever the turn had reached.
65
+ The raise lands in the thread or fiber the turn runs on, so it unwinds out
66
+ of the turn to whoever called it.
67
+
68
+ * **interrupt: move `LLM::Interrupt` outside `StandardError`** <br>
69
+ `LLM::Interrupt` is now an `Exception` rather than an `LLM::Error`, so a
70
+ bare `rescue` and a `rescue => ex` pass a cancel through instead of
71
+ swallowing it. Before, a broad rescue in a tool, a tracer, or an
72
+ application could eat an interrupt, and the turn looked like one that had
73
+ ignored its cancel. It is not a `SignalException`, since an interrupt has
74
+ to be catchable and a signal is a framework's own condition. A caller that
75
+ handles a cancel names `LLM::Interrupt`; `#wait` and the tool's
76
+ `on_interrupt` hook are unchanged, and a task still carries the interrupt
77
+ back to the caller rather than raising it inside its reactor.
62
78
 
63
79
  ### ActiveRecord
64
80
 
@@ -98,42 +114,50 @@ Releases before v15 are kept in [changelog/old.md](changelog/old.md).
98
114
  ### Function
99
115
 
100
116
  * **function: deliver an interrupt to the tool, not to whatever is running** <br>
101
- A cancel now raises
102
- [`LLM::Interrupt`](https://r.uby.dev/api-docs/llm.rb/LLM/Interrupt.html) on the
103
- thread running the tool, and only while it runs: arriving early, it is held
104
- until the tool starts, so the tool's own `rescue` sees it; arriving late, it
105
- is a no-op instead of throwing the result away. Applies to `:fork` and
106
- `:ractor`.
107
-
108
- * **function: answer a ractor-backed task once its ractor has gone** <br>
109
- A `:ractor` tool's result is now held by the task instead of asked of the
110
- ractor that ran it, so a late wait is answered, a second wait comes from
111
- memory, and a cancel returns `nil` instead of raising. A group's cancel now
112
- reaches every task, not just the ones still running.
113
-
114
- * **function: tell an `:async` tool it was cancelled** <br>
115
- A cancel now raises `LLM::Interrupt` on the fiber the tool runs in, so the
116
- tool is told and can clean up. Before, the cancel was queued and the tool
117
- kept running, its result written to a queue nobody read.
118
-
119
- * **function: run the interrupt hook on every strategy** <br>
120
- A tool that implements
117
+ A cancel is now aimed at the tool on every concurrency strategy. A running
118
+ tool is entered and
119
+ [`LLM::Interrupt`](https://r.uby.dev/api-docs/llm.rb/LLM/Interrupt.html) raised
120
+ inside it, so its own `rescue` and its
121
121
  [`LLM::Tool#on_interrupt`](https://r.uby.dev/api-docs/llm.rb/LLM/Tool.html#on_interrupt-instance_method)
122
- is now told on every concurrency strategy. Before, `:async`, `:fork`, and
123
- `:ractor` never ran it, and a class-backed tool ran it on no strategy at all.
124
-
125
- * **function: hold a cancel that arrives before a thread or fiber starts** <br>
126
- Fix a bug where a cancel that arrived before a `:thread` or `:fiber` tool
127
- started was dropped, and the call ran to completion as if nobody had asked it
128
- to stop. The cancel is now held on the task and raised once the body is live,
129
- so the tool's `on_interrupt` hook runs and the caller sees `LLM::Interrupt`.
122
+ hook see it, whether the tool was given as an instance or a class. A cancel
123
+ that arrives before the tool starts is held and delivered inside the call, and
124
+ one that arrives after the tool returns is a no-op that leaves the result
125
+ alone. Before, the raise landed wherever the target thread or fiber had got
126
+ to, and a tool's hook ran on some strategies but not others. A pre-start
127
+ cancel was dropped on `:thread`, `:fiber`, and `:async`, was a `NoMethodError`
128
+ on `:fork`, and said nothing on `:ractor`. Three strategies keep a shape of
129
+ their own: `:fiber` and `:async` ask the fiber scheduler for the raise, so a
130
+ tool that never yields is one it cannot reach, and `:sequential` runs the tool
131
+ in the caller's own thread, so it tells the tool through its hook alone.
130
132
 
131
133
  * **function: answer a task that has already answered** <br>
132
- A second `#wait` on an `:async` or `:fork` task is answered from what the
133
- first one took, which is what `Thread#value` does, so a task that has answered
134
- answers again. Before, a second wait blocked on a queue nothing would fill, or
135
- read a channel the task had already closed. An interrupt re-raises the same
136
- exception rather than blocking.
134
+ A second `#wait` is answered from what the first one took, which is what
135
+ `Thread#value` does, so a task that has answered answers again. That covers an
136
+ `:async` queue the first wait drained, a `:fork` channel the task closed, and
137
+ a `:ractor` whose result is held by a ractor of the task's own rather than
138
+ asked of the ractor that ran the tool and has gone. A group's cancel reaches
139
+ every task it holds, and an interrupt re-raises the same exception rather than
140
+ blocking. Before, a second wait blocked on a queue nothing would fill, or read
141
+ a channel or ractor that had already closed.
142
+
143
+ * **function: answer a forked call that ended without a result** <br>
144
+ A `:fork` tool that died before it wrote anything used to leave
145
+ [`LLM::Function::Fork::Task#wait`](https://r.uby.dev/api-docs/llm.rb/LLM/Function/Fork/Task.html#wait-instance_method)
146
+ blocked on a read that never ended, because this side still held the write
147
+ end of the same channel and so never saw end of file. Each side now closes
148
+ the end it does not use, which makes that ending an `EOFError`, and `#wait`
149
+ answers it in band rather than raising into the turn, the way the runtime
150
+ answers a tool that raised: `{error: true, type: "EOFError", message: "the
151
+ tool exited unexpectedly"}`. A second wait is given the same return.
152
+
153
+ * **function: refuse a `:fiber` scheduler that cannot hold a cancel** <br>
154
+ The `:fiber` strategy now raises
155
+ [`LLM::FiberError`](https://r.uby.dev/api-docs/llm.rb/LLM/FiberError.html) when
156
+ `Fiber.scheduler` does not implement `fiber_interrupt`, because a cancel that
157
+ arrives before the call is held by asking the scheduler for a raise at the
158
+ call's first instruction. A scheduler that cannot be asked would be sent the
159
+ cancel before the call instead, where the tool never runs, so the strategy
160
+ refuses in the caller's hands, before a fiber is scheduled at all.
137
161
 
138
162
  ### ORM
139
163
 
@@ -169,12 +193,26 @@ Releases before v15 are kept in [changelog/old.md](changelog/old.md).
169
193
  because DeepSeek has no Files API, and a non-image local file raises because
170
194
  its models read images only.
171
195
 
196
+ * **provider: keep a scoped header alive through garbage collection** <br>
197
+ Fix a bug where a header set by
198
+ [`LLM::Provider#with`](https://r.uby.dev/api-docs/llm.rb/LLM/Provider.html#with-instance_method)
199
+ could be collected before its block returned, so a garbage collection inside
200
+ the block was enough to make a request later in the same scope go out without
201
+ it. The store held the header hash weakly. It now holds it for as long as the
202
+ provider is alive, so a scoped header lasts as long as the scope does.
203
+
172
204
  ### Registry
173
205
 
174
206
  * **refresh model metadata** <br>
175
- Update `data/` with current listings, limits, and pricing. Alibaba, OpenAI,
176
- Bedrock, DeepInfra, Google, and OpenRouter gain models and correct limits or
177
- prices, and OpenRouter drops six entries.
207
+ Update `data/` with current listings, limits, and pricing. Anthropic adds
208
+ Claude Sonnet 5.5, OpenAI adds GPT-6.1 Sol and the Daybreak Blue and Daybreak
209
+ Red models, Bedrock adds Claude Sonnet 5.5, GPT-6 Sol, GPT-6 Luna, and GPT-6.1
210
+ Sol across regions plus Grok 4.7 in the global and US regions, Alibaba adds
211
+ the Qwen3.5, Qwen3.7, and Qwen3.8 Flash models, DeepInfra adds the Xiaomi
212
+ MiMo V2.6 models and `tencent/Hy4-preview`, xAI adds Grok Imagine Video 1.5
213
+ Lite, and OpenRouter adds ten models. OpenRouter drops six entries, Mistral
214
+ drops `magistral-small`, and Google, DeepSeek, Moonshot, and Z.ai correct
215
+ limits and prices.
178
216
 
179
217
  ### Schema
180
218
 
data/data/bedrock.json CHANGED
@@ -371,6 +371,23 @@
371
371
  "input": 922000,
372
372
  "output": 128000
373
373
  },
374
+ "experimental": {
375
+ "modes": {
376
+ "ultrafast": {
377
+ "cost": {
378
+ "input": 60,
379
+ "output": 300,
380
+ "cache_read": 6,
381
+ "cache_write": 75
382
+ },
383
+ "provider": {
384
+ "body": {
385
+ "service_tier": "ultrafast"
386
+ }
387
+ }
388
+ }
389
+ }
390
+ },
374
391
  "cost": {
375
392
  "input": 10,
376
393
  "output": 50,
@@ -397,6 +414,72 @@
397
414
  },
398
415
  "canonical_model_id": "openai/gpt-6-astra"
399
416
  },
417
+ "us.openai.gpt-6.1-sol": {
418
+ "id": "us.openai.gpt-6.1-sol",
419
+ "name": "GPT-6.1 Sol (US)",
420
+ "description": "Near-Astra performance for complex coding, computer use, and professional work at a lower cost.",
421
+ "family": "gpt-sol",
422
+ "attachment": true,
423
+ "reasoning": true,
424
+ "reasoning_options": [
425
+ {
426
+ "type": "effort",
427
+ "values": [
428
+ "low",
429
+ "medium",
430
+ "high",
431
+ "xhigh",
432
+ "max"
433
+ ]
434
+ }
435
+ ],
436
+ "tool_call": true,
437
+ "structured_output": true,
438
+ "temperature": false,
439
+ "knowledge": "2026-04-30",
440
+ "release_date": "2026-09-29",
441
+ "last_updated": "2026-09-29",
442
+ "modalities": {
443
+ "input": [
444
+ "text",
445
+ "image"
446
+ ],
447
+ "output": [
448
+ "text"
449
+ ]
450
+ },
451
+ "open_weights": false,
452
+ "limit": {
453
+ "context": 1050000,
454
+ "input": 922000,
455
+ "output": 128000
456
+ },
457
+ "cost": {
458
+ "input": 2.2,
459
+ "output": 11,
460
+ "cache_read": 0.11,
461
+ "cache_write": 2.75,
462
+ "tiers": [
463
+ {
464
+ "input": 4.4,
465
+ "output": 16.5,
466
+ "cache_read": 0.22,
467
+ "cache_write": 5.5,
468
+ "tier": {
469
+ "type": "context",
470
+ "size": 272000
471
+ }
472
+ }
473
+ ],
474
+ "context_over_200k": {
475
+ "input": 4.4,
476
+ "output": 16.5,
477
+ "cache_read": 0.22,
478
+ "cache_write": 5.5
479
+ }
480
+ },
481
+ "canonical_model_id": "openai/gpt-6.1-sol"
482
+ },
400
483
  "eu.amazon.nova-lite-v1:0": {
401
484
  "id": "eu.amazon.nova-lite-v1:0",
402
485
  "name": "Nova Lite (EU)",
@@ -2379,6 +2462,78 @@
2379
2462
  },
2380
2463
  "canonical_model_id": "nvidia/nemotron-nano-12b-v2-vl"
2381
2464
  },
2465
+ "openai.gpt-6.1-sol": {
2466
+ "id": "openai.gpt-6.1-sol",
2467
+ "name": "GPT-6.1 Sol",
2468
+ "description": "Near-Astra performance for complex coding, computer use, and professional work at a lower cost.",
2469
+ "family": "gpt-sol",
2470
+ "attachment": true,
2471
+ "reasoning": true,
2472
+ "reasoning_options": [
2473
+ {
2474
+ "type": "effort",
2475
+ "values": [
2476
+ "low",
2477
+ "medium",
2478
+ "high",
2479
+ "xhigh",
2480
+ "max"
2481
+ ]
2482
+ }
2483
+ ],
2484
+ "tool_call": true,
2485
+ "structured_output": true,
2486
+ "temperature": false,
2487
+ "knowledge": "2026-04-30",
2488
+ "release_date": "2026-09-29",
2489
+ "last_updated": "2026-09-29",
2490
+ "modalities": {
2491
+ "input": [
2492
+ "text",
2493
+ "image",
2494
+ "pdf"
2495
+ ],
2496
+ "output": [
2497
+ "text"
2498
+ ]
2499
+ },
2500
+ "open_weights": false,
2501
+ "limit": {
2502
+ "context": 1050000,
2503
+ "input": 922000,
2504
+ "output": 128000
2505
+ },
2506
+ "provider": {
2507
+ "npm": "@ai-sdk/amazon-bedrock/mantle",
2508
+ "api": "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1",
2509
+ "shape": "responses"
2510
+ },
2511
+ "cost": {
2512
+ "input": 2.2,
2513
+ "output": 11,
2514
+ "cache_read": 0.11,
2515
+ "cache_write": 2.75,
2516
+ "tiers": [
2517
+ {
2518
+ "input": 4.4,
2519
+ "output": 16.5,
2520
+ "cache_read": 0.22,
2521
+ "cache_write": 5.5,
2522
+ "tier": {
2523
+ "type": "context",
2524
+ "size": 272000
2525
+ }
2526
+ }
2527
+ ],
2528
+ "context_over_200k": {
2529
+ "input": 4.4,
2530
+ "output": 16.5,
2531
+ "cache_read": 0.22,
2532
+ "cache_write": 5.5
2533
+ }
2534
+ },
2535
+ "canonical_model_id": "openai/gpt-6.1-sol"
2536
+ },
2382
2537
  "us.amazon.nova-2-lite-v1:0": {
2383
2538
  "id": "us.amazon.nova-2-lite-v1:0",
2384
2539
  "name": "Nova 2 Lite (US)",
@@ -2468,6 +2623,23 @@
2468
2623
  "input": 922000,
2469
2624
  "output": 128000
2470
2625
  },
2626
+ "experimental": {
2627
+ "modes": {
2628
+ "ultrafast": {
2629
+ "cost": {
2630
+ "input": 66,
2631
+ "output": 330,
2632
+ "cache_read": 6.6,
2633
+ "cache_write": 82.5
2634
+ },
2635
+ "provider": {
2636
+ "body": {
2637
+ "service_tier": "ultrafast"
2638
+ }
2639
+ }
2640
+ }
2641
+ }
2642
+ },
2471
2643
  "cost": {
2472
2644
  "input": 11,
2473
2645
  "output": 55,
@@ -2567,6 +2739,72 @@
2567
2739
  },
2568
2740
  "canonical_model_id": "openai/gpt-5.6-terra"
2569
2741
  },
2742
+ "global.openai.gpt-6.1-sol": {
2743
+ "id": "global.openai.gpt-6.1-sol",
2744
+ "name": "GPT-6.1 Sol (Global)",
2745
+ "description": "Near-Astra performance for complex coding, computer use, and professional work at a lower cost.",
2746
+ "family": "gpt-sol",
2747
+ "attachment": true,
2748
+ "reasoning": true,
2749
+ "reasoning_options": [
2750
+ {
2751
+ "type": "effort",
2752
+ "values": [
2753
+ "low",
2754
+ "medium",
2755
+ "high",
2756
+ "xhigh",
2757
+ "max"
2758
+ ]
2759
+ }
2760
+ ],
2761
+ "tool_call": true,
2762
+ "structured_output": true,
2763
+ "temperature": false,
2764
+ "knowledge": "2026-04-30",
2765
+ "release_date": "2026-09-29",
2766
+ "last_updated": "2026-09-29",
2767
+ "modalities": {
2768
+ "input": [
2769
+ "text",
2770
+ "image"
2771
+ ],
2772
+ "output": [
2773
+ "text"
2774
+ ]
2775
+ },
2776
+ "open_weights": false,
2777
+ "limit": {
2778
+ "context": 1050000,
2779
+ "input": 922000,
2780
+ "output": 128000
2781
+ },
2782
+ "cost": {
2783
+ "input": 2,
2784
+ "output": 10,
2785
+ "cache_read": 0.1,
2786
+ "cache_write": 2.5,
2787
+ "tiers": [
2788
+ {
2789
+ "input": 4,
2790
+ "output": 15,
2791
+ "cache_read": 0.2,
2792
+ "cache_write": 5,
2793
+ "tier": {
2794
+ "type": "context",
2795
+ "size": 272000
2796
+ }
2797
+ }
2798
+ ],
2799
+ "context_over_200k": {
2800
+ "input": 4,
2801
+ "output": 15,
2802
+ "cache_read": 0.2,
2803
+ "cache_write": 5
2804
+ }
2805
+ },
2806
+ "canonical_model_id": "openai/gpt-6.1-sol"
2807
+ },
2570
2808
  "anthropic.claude-opus-4-6-v1": {
2571
2809
  "id": "anthropic.claude-opus-4-6-v1",
2572
2810
  "name": "Claude Opus 4.6",
@@ -7092,6 +7330,23 @@
7092
7330
  "input": 922000,
7093
7331
  "output": 128000
7094
7332
  },
7333
+ "experimental": {
7334
+ "modes": {
7335
+ "ultrafast": {
7336
+ "cost": {
7337
+ "input": 66,
7338
+ "output": 330,
7339
+ "cache_read": 6.6,
7340
+ "cache_write": 82.5
7341
+ },
7342
+ "provider": {
7343
+ "body": {
7344
+ "service_tier": "ultrafast"
7345
+ }
7346
+ }
7347
+ }
7348
+ }
7349
+ },
7095
7350
  "provider": {
7096
7351
  "npm": "@ai-sdk/amazon-bedrock/mantle",
7097
7352
  "api": "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1",
data/data/deepinfra.json CHANGED
@@ -166,6 +166,7 @@
166
166
  "context": 1048576,
167
167
  "output": 16384
168
168
  },
169
+ "status": "deprecated",
169
170
  "cost": {
170
171
  "input": 0.2,
171
172
  "output": 0.8
@@ -541,8 +542,8 @@
541
542
  "output": 32768
542
543
  },
543
544
  "cost": {
544
- "input": 0.13,
545
- "output": 0.38
545
+ "input": 0.15,
546
+ "output": 0.4
546
547
  },
547
548
  "canonical_model_id": "google/gemma-4-31b-it"
548
549
  },
@@ -615,6 +616,7 @@
615
616
  "context": 131072,
616
617
  "output": 8192
617
618
  },
619
+ "status": "deprecated",
618
620
  "cost": {
619
621
  "input": 0.02,
620
622
  "output": 0.1
@@ -886,7 +888,8 @@
886
888
  },
887
889
  "cost": {
888
890
  "input": 0.1,
889
- "output": 0.95
891
+ "output": 0.95,
892
+ "cache_read": 0.1
890
893
  }
891
894
  },
892
895
  "Qwen/Qwen3-Coder-480B-A35B-Instruct-Turbo": {
@@ -1135,6 +1138,7 @@
1135
1138
  "context": 262144,
1136
1139
  "output": 65536
1137
1140
  },
1141
+ "status": "deprecated",
1138
1142
  "cost": {
1139
1143
  "input": 0.29,
1140
1144
  "output": 2.4
@@ -1793,6 +1797,7 @@
1793
1797
  "context": 262144,
1794
1798
  "output": 256000
1795
1799
  },
1800
+ "status": "deprecated",
1796
1801
  "cost": {
1797
1802
  "input": 0.2,
1798
1803
  "output": 1.15,
@@ -2110,6 +2115,7 @@
2110
2115
  "context": 202752,
2111
2116
  "output": 16384
2112
2117
  },
2118
+ "status": "deprecated",
2113
2119
  "cost": {
2114
2120
  "input": 1.05,
2115
2121
  "output": 3.5,
data/data/deepseek.json CHANGED
@@ -153,10 +153,10 @@
153
153
  "output": 393216
154
154
  },
155
155
  "cost": {
156
- "input": 0.435,
157
- "output": 0.87,
158
- "reasoning": 0.87,
159
- "cache_read": 0.003625
156
+ "input": 0.66,
157
+ "output": 1.98,
158
+ "reasoning": 1.98,
159
+ "cache_read": 0.022
160
160
  },
161
161
  "canonical_model_id": "deepseek/deepseek-v4-pro-0813"
162
162
  },
data/data/moonshot.json CHANGED
@@ -16,9 +16,6 @@
16
16
  "attachment": true,
17
17
  "reasoning": true,
18
18
  "reasoning_options": [
19
- {
20
- "type": "toggle"
21
- },
22
19
  {
23
20
  "type": "effort",
24
21
  "values": [