ruby_llm-providers-qiniu 0.1.1

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.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.flayignore +1 -0
  3. data/.github/workflows/ci.yml +28 -0
  4. data/.github/workflows/gitleaks.yml +23 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.overcommit.yml +31 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +29 -0
  9. data/Archspec.rb +14 -0
  10. data/LICENSE +21 -0
  11. data/README.md +114 -0
  12. data/lib/ruby_llm/providers/qiniu.rb +134 -0
  13. data/models.json +859 -0
  14. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_can_handle_a_multi_turn_conversation.yml +154 -0
  15. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_can_have_a_basic_conversation.yml +61 -0
  16. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_can_use_tools.yml +121 -0
  17. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_returns_structured_output.yml +62 -0
  18. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_returns_the_raw_response.yml +66 -0
  19. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_anthropic_claude_sonnet_5_supports_streaming_responses.yml +105 -0
  20. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_can_handle_a_multi_turn_conversation.yml +127 -0
  21. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_can_have_a_basic_conversation.yml +58 -0
  22. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_can_use_tools.yml +119 -0
  23. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_returns_structured_output.yml +59 -0
  24. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_returns_the_raw_response.yml +58 -0
  25. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_deepseek_deepseek_v4_1_flash_supports_streaming_responses.yml +89 -0
  26. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_can_handle_a_multi_turn_conversation.yml +195 -0
  27. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_can_have_a_basic_conversation.yml +96 -0
  28. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_can_use_tools.yml +165 -0
  29. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_returns_structured_output.yml +97 -0
  30. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_returns_the_raw_response.yml +97 -0
  31. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_gemini_3_1_flash_lite_preview_supports_streaming_responses.yml +70 -0
  32. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_can_handle_a_multi_turn_conversation.yml +194 -0
  33. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_can_have_a_basic_conversation.yml +96 -0
  34. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_can_use_tools.yml +165 -0
  35. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_returns_structured_output.yml +97 -0
  36. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_returns_the_raw_response.yml +97 -0
  37. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_1_flash_lite_supports_streaming_responses.yml +70 -0
  38. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_can_handle_a_multi_turn_conversation.yml +199 -0
  39. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_can_have_a_basic_conversation.yml +97 -0
  40. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_can_use_tools.yml +166 -0
  41. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_returns_structured_output.yml +98 -0
  42. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_returns_the_raw_response.yml +98 -0
  43. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_google_gemini_3_8_flash_supports_streaming_responses.yml +71 -0
  44. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_can_handle_a_multi_turn_conversation.yml +419 -0
  45. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_can_have_a_basic_conversation.yml +210 -0
  46. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_can_use_tools.yml +468 -0
  47. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_returns_structured_output.yml +229 -0
  48. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_returns_the_raw_response.yml +210 -0
  49. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_2_supports_streaming_responses.yml +102 -0
  50. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_can_handle_a_multi_turn_conversation.yml +421 -0
  51. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_can_have_a_basic_conversation.yml +157 -0
  52. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_can_use_tools.yml +469 -0
  53. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_can_handle_a_multi_turn_conversation.yml +422 -0
  54. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_can_have_a_basic_conversation.yml +211 -0
  55. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_can_use_tools.yml +469 -0
  56. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_returns_structured_output.yml +230 -0
  57. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_returns_the_raw_response.yml +211 -0
  58. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_mini_supports_streaming_responses.yml +102 -0
  59. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_returns_structured_output.yml +230 -0
  60. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_returns_the_raw_response.yml +157 -0
  61. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_4_supports_streaming_responses.yml +102 -0
  62. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_can_handle_a_multi_turn_conversation.yml +389 -0
  63. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_can_have_a_basic_conversation.yml +241 -0
  64. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_can_use_tools.yml +437 -0
  65. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_returns_structured_output.yml +214 -0
  66. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_returns_the_raw_response.yml +241 -0
  67. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_5_6_luna_supports_streaming_responses.yml +106 -0
  68. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_can_handle_a_multi_turn_conversation.yml +389 -0
  69. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_can_have_a_basic_conversation.yml +202 -0
  70. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_can_use_tools.yml +437 -0
  71. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_returns_structured_output.yml +221 -0
  72. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_returns_the_raw_response.yml +202 -0
  73. data/spec/fixtures/vcr_cassettes/rubyllm_chat_qiniu_openai_gpt_6_luna_supports_streaming_responses.yml +112 -0
  74. data/spec/ruby_llm/chat_schema_spec.rb +30 -0
  75. data/spec/ruby_llm/chat_spec.rb +35 -0
  76. data/spec/ruby_llm/chat_streaming_spec.rb +22 -0
  77. data/spec/ruby_llm/chat_tools_spec.rb +32 -0
  78. data/spec/ruby_llm/embedding_spec.rb +49 -0
  79. data/spec/ruby_llm/image_spec.rb +23 -0
  80. data/spec/ruby_llm/models_spec.rb +11 -0
  81. data/spec/ruby_llm/moderation_spec.rb +22 -0
  82. data/spec/ruby_llm/providers/qiniu_spec.rb +103 -0
  83. data/spec/ruby_llm/rerank_spec.rb +23 -0
  84. data/spec/ruby_llm/speech_spec.rb +25 -0
  85. data/spec/ruby_llm/video_spec.rb +27 -0
  86. data/spec/spec_helper.rb +26 -0
  87. data/spec/support/models.rb +30 -0
  88. data/spec/support/rubyllm_configuration.rb +14 -0
  89. data/spec/support/vcr_configuration.rb +16 -0
  90. metadata +147 -0
data/models.json ADDED
@@ -0,0 +1,859 @@
1
+ [
2
+ {
3
+ "id": "anthropic/claude-sonnet-5",
4
+ "name": "Claude Sonnet 5",
5
+ "provider": "qiniu",
6
+ "family": "claude-sonnet",
7
+ "created_at": "2026-06-29 00:00:00 UTC",
8
+ "context_window": 1000000,
9
+ "max_output_tokens": 128000,
10
+ "knowledge_cutoff": "2026-01-31",
11
+ "modalities": {
12
+ "input": [
13
+ "text",
14
+ "image",
15
+ "pdf"
16
+ ],
17
+ "output": [
18
+ "text"
19
+ ]
20
+ },
21
+ "capabilities": [
22
+ "function_calling",
23
+ "structured_output",
24
+ "reasoning",
25
+ "vision",
26
+ "tool_choice",
27
+ "parallel_tool_calls",
28
+ "batch",
29
+ "citations"
30
+ ],
31
+ "pricing": {
32
+ "text_tokens": {
33
+ "standard": {
34
+ "input_per_million": 2,
35
+ "output_per_million": 10,
36
+ "cache_read_input_per_million": 0.2,
37
+ "cache_write_input_per_million": 2.5
38
+ }
39
+ }
40
+ },
41
+ "metadata": {
42
+ "source": "models.dev",
43
+ "provider_id": "anthropic",
44
+ "open_weights": false,
45
+ "attachment": true,
46
+ "temperature": false,
47
+ "last_updated": "2026-06-30",
48
+ "tool_call": true,
49
+ "structured_output": true,
50
+ "reasoning": true,
51
+ "reasoning_options": [
52
+ {
53
+ "type": "toggle"
54
+ },
55
+ {
56
+ "type": "effort",
57
+ "values": [
58
+ "low",
59
+ "medium",
60
+ "high",
61
+ "xhigh",
62
+ "max"
63
+ ]
64
+ }
65
+ ],
66
+ "cost": {
67
+ "input": 2,
68
+ "output": 10,
69
+ "cache_read": 0.2,
70
+ "cache_write": 2.5
71
+ },
72
+ "limit": {
73
+ "context": 1000000,
74
+ "output": 128000
75
+ },
76
+ "knowledge": "2026-01-31"
77
+ }
78
+ },
79
+ {
80
+ "id": "gemini-3.1-flash-lite-preview",
81
+ "name": "Gemini 3.1 Flash Lite Preview",
82
+ "provider": "qiniu",
83
+ "family": "gemini-flash-lite",
84
+ "created_at": "2026-03-03 00:00:00 UTC",
85
+ "context_window": 1048576,
86
+ "max_output_tokens": 65536,
87
+ "knowledge_cutoff": null,
88
+ "modalities": {
89
+ "input": [
90
+ "text",
91
+ "image",
92
+ "video",
93
+ "audio",
94
+ "pdf"
95
+ ],
96
+ "output": [
97
+ "text"
98
+ ]
99
+ },
100
+ "capabilities": [
101
+ "function_calling",
102
+ "structured_output",
103
+ "reasoning",
104
+ "vision",
105
+ "video",
106
+ "tool_choice",
107
+ "transcription",
108
+ "batch",
109
+ "caching"
110
+ ],
111
+ "pricing": {
112
+ "text_tokens": {
113
+ "standard": {
114
+ "input_per_million": 0.25,
115
+ "output_per_million": 1.5,
116
+ "cache_read_input_per_million": 0.025
117
+ }
118
+ },
119
+ "audio_tokens": {
120
+ "standard": {
121
+ "input_per_million": 0.5
122
+ }
123
+ }
124
+ },
125
+ "metadata": {
126
+ "version": "3.1-flash-lite-preview-03-2026",
127
+ "description": "Gemini 3.1 Flash Lite Preview",
128
+ "supported_generation_methods": [
129
+ "generateContent",
130
+ "countTokens",
131
+ "createCachedContent",
132
+ "batchGenerateContent"
133
+ ],
134
+ "source": "models.dev",
135
+ "provider_id": "google",
136
+ "open_weights": false,
137
+ "attachment": true,
138
+ "temperature": true,
139
+ "last_updated": "2026-03-03",
140
+ "status": "deprecated",
141
+ "tool_call": true,
142
+ "structured_output": true,
143
+ "reasoning": true,
144
+ "reasoning_options": [
145
+ {
146
+ "type": "effort",
147
+ "values": [
148
+ "minimal",
149
+ "low",
150
+ "medium",
151
+ "high"
152
+ ]
153
+ }
154
+ ],
155
+ "cost": {
156
+ "input": 0.25,
157
+ "output": 1.5,
158
+ "cache_read": 0.025,
159
+ "input_audio": 0.5
160
+ },
161
+ "limit": {
162
+ "context": 1048576,
163
+ "output": 65536
164
+ },
165
+ "knowledge": "2025-01"
166
+ }
167
+ },
168
+ {
169
+ "id": "google/gemini-3.1-flash-lite",
170
+ "name": "Gemini 3.1 Flash Lite",
171
+ "provider": "qiniu",
172
+ "family": "gemini-flash-lite",
173
+ "created_at": "2026-05-07 00:00:00 UTC",
174
+ "context_window": 1048576,
175
+ "max_output_tokens": 65536,
176
+ "knowledge_cutoff": null,
177
+ "modalities": {
178
+ "input": [
179
+ "text",
180
+ "image",
181
+ "video",
182
+ "audio",
183
+ "pdf"
184
+ ],
185
+ "output": [
186
+ "text"
187
+ ]
188
+ },
189
+ "capabilities": [
190
+ "function_calling",
191
+ "structured_output",
192
+ "reasoning",
193
+ "vision",
194
+ "video",
195
+ "tool_choice",
196
+ "transcription",
197
+ "batch",
198
+ "caching"
199
+ ],
200
+ "pricing": {
201
+ "text_tokens": {
202
+ "standard": {
203
+ "input_per_million": 0.25,
204
+ "output_per_million": 1.5,
205
+ "cache_read_input_per_million": 0.025
206
+ }
207
+ },
208
+ "audio_tokens": {
209
+ "standard": {
210
+ "input_per_million": 0.5
211
+ }
212
+ }
213
+ },
214
+ "metadata": {
215
+ "version": "3.1-flash-lite-05-2026",
216
+ "description": "Gemini 3.1 Flash Lite",
217
+ "supported_generation_methods": [
218
+ "generateContent",
219
+ "countTokens",
220
+ "createCachedContent",
221
+ "batchGenerateContent"
222
+ ],
223
+ "source": "models.dev",
224
+ "provider_id": "google",
225
+ "open_weights": false,
226
+ "attachment": true,
227
+ "temperature": true,
228
+ "last_updated": "2026-05-07",
229
+ "tool_call": true,
230
+ "structured_output": true,
231
+ "reasoning": true,
232
+ "reasoning_options": [
233
+ {
234
+ "type": "effort",
235
+ "values": [
236
+ "minimal",
237
+ "low",
238
+ "medium",
239
+ "high"
240
+ ]
241
+ }
242
+ ],
243
+ "cost": {
244
+ "input": 0.25,
245
+ "output": 1.5,
246
+ "cache_read": 0.025,
247
+ "input_audio": 0.5
248
+ },
249
+ "limit": {
250
+ "context": 1048576,
251
+ "output": 65536
252
+ },
253
+ "knowledge": "2025-01"
254
+ }
255
+ },
256
+ {
257
+ "id": "google/gemini-3.8-flash",
258
+ "name": "Gemini 3.8 Flash",
259
+ "provider": "qiniu",
260
+ "family": "gemini-flash",
261
+ "created_at": "2026-09-02 00:00:00 UTC",
262
+ "context_window": 1048576,
263
+ "max_output_tokens": 65536,
264
+ "knowledge_cutoff": null,
265
+ "modalities": {
266
+ "input": [
267
+ "text",
268
+ "image",
269
+ "video",
270
+ "audio",
271
+ "pdf"
272
+ ],
273
+ "output": [
274
+ "text"
275
+ ]
276
+ },
277
+ "capabilities": [
278
+ "function_calling",
279
+ "structured_output",
280
+ "reasoning",
281
+ "vision",
282
+ "video",
283
+ "tool_choice",
284
+ "transcription",
285
+ "batch",
286
+ "caching"
287
+ ],
288
+ "pricing": {
289
+ "text_tokens": {
290
+ "standard": {
291
+ "input_per_million": 0.75,
292
+ "output_per_million": 3.75,
293
+ "cache_read_input_per_million": 0.075
294
+ }
295
+ },
296
+ "audio_tokens": {
297
+ "standard": {
298
+ "input_per_million": 0.75
299
+ }
300
+ }
301
+ },
302
+ "metadata": {
303
+ "version": "3.0",
304
+ "description": "Gemini 3.8 Flash",
305
+ "supported_generation_methods": [
306
+ "generateContent",
307
+ "countTokens",
308
+ "createCachedContent",
309
+ "batchGenerateContent"
310
+ ],
311
+ "source": "models.dev",
312
+ "provider_id": "google",
313
+ "open_weights": false,
314
+ "attachment": true,
315
+ "temperature": true,
316
+ "last_updated": "2026-09-02",
317
+ "tool_call": true,
318
+ "structured_output": true,
319
+ "reasoning": true,
320
+ "reasoning_options": [
321
+ {
322
+ "type": "effort",
323
+ "values": [
324
+ "low",
325
+ "medium",
326
+ "high"
327
+ ]
328
+ }
329
+ ],
330
+ "cost": {
331
+ "input": 0.75,
332
+ "output": 3.75,
333
+ "cache_read": 0.075,
334
+ "input_audio": 0.75
335
+ },
336
+ "limit": {
337
+ "context": 1048576,
338
+ "output": 65536
339
+ }
340
+ }
341
+ },
342
+ {
343
+ "id": "openai/gpt-6-luna",
344
+ "name": "GPT-6 Luna",
345
+ "provider": "qiniu",
346
+ "family": "gpt-luna",
347
+ "created_at": "2026-09-22 00:00:00 UTC",
348
+ "context_window": 1050000,
349
+ "max_output_tokens": 128000,
350
+ "knowledge_cutoff": "2026-05-18",
351
+ "modalities": {
352
+ "input": [
353
+ "text",
354
+ "image",
355
+ "pdf"
356
+ ],
357
+ "output": [
358
+ "text"
359
+ ]
360
+ },
361
+ "capabilities": [
362
+ "function_calling",
363
+ "structured_output",
364
+ "reasoning",
365
+ "vision",
366
+ "tool_choice",
367
+ "parallel_tool_calls"
368
+ ],
369
+ "pricing": {
370
+ "text_tokens": {
371
+ "standard": {
372
+ "input_per_million": 0.1,
373
+ "output_per_million": 0.5,
374
+ "cache_read_input_per_million": 0.01,
375
+ "cache_write_input_per_million": 0.125
376
+ },
377
+ "long_context": {
378
+ "input_per_million": 0.2,
379
+ "output_per_million": 0.75,
380
+ "cache_read_input_per_million": 0.02,
381
+ "cache_write_input_per_million": 0.25
382
+ },
383
+ "long_context_threshold": 272000
384
+ }
385
+ },
386
+ "metadata": {
387
+ "object": "model",
388
+ "owned_by": "system",
389
+ "source": "models.dev",
390
+ "provider_id": "openai",
391
+ "open_weights": false,
392
+ "attachment": true,
393
+ "temperature": false,
394
+ "last_updated": "2026-09-22",
395
+ "tool_call": true,
396
+ "structured_output": true,
397
+ "reasoning": true,
398
+ "reasoning_options": [
399
+ {
400
+ "type": "effort",
401
+ "values": [
402
+ "none",
403
+ "low",
404
+ "medium",
405
+ "high",
406
+ "xhigh",
407
+ "max"
408
+ ]
409
+ }
410
+ ],
411
+ "cost": {
412
+ "input": 0.1,
413
+ "output": 0.5,
414
+ "cache_read": 0.01,
415
+ "cache_write": 0.125,
416
+ "tiers": [
417
+ {
418
+ "input": 0.2,
419
+ "output": 0.75,
420
+ "cache_read": 0.02,
421
+ "cache_write": 0.25,
422
+ "tier": {
423
+ "type": "context",
424
+ "size": 272000
425
+ }
426
+ }
427
+ ],
428
+ "context_over_200k": {
429
+ "input": 0.2,
430
+ "output": 0.75,
431
+ "cache_read": 0.02,
432
+ "cache_write": 0.25
433
+ }
434
+ },
435
+ "limit": {
436
+ "context": 1050000,
437
+ "input": 922000,
438
+ "output": 128000
439
+ },
440
+ "knowledge": "2026-05-18"
441
+ }
442
+ },
443
+ {
444
+ "id": "openai/gpt-5.6-luna",
445
+ "name": "GPT-5.6 Luna",
446
+ "provider": "qiniu",
447
+ "family": "gpt-luna",
448
+ "created_at": "2026-07-09 00:00:00 UTC",
449
+ "context_window": 1050000,
450
+ "max_output_tokens": 128000,
451
+ "knowledge_cutoff": "2026-02-16",
452
+ "modalities": {
453
+ "input": [
454
+ "text",
455
+ "image",
456
+ "pdf"
457
+ ],
458
+ "output": [
459
+ "text"
460
+ ]
461
+ },
462
+ "capabilities": [
463
+ "function_calling",
464
+ "structured_output",
465
+ "reasoning",
466
+ "vision",
467
+ "tool_choice",
468
+ "parallel_tool_calls"
469
+ ],
470
+ "pricing": {
471
+ "text_tokens": {
472
+ "standard": {
473
+ "input_per_million": 0.2,
474
+ "output_per_million": 1.2,
475
+ "cache_read_input_per_million": 0.02,
476
+ "cache_write_input_per_million": 0.25
477
+ },
478
+ "long_context": {
479
+ "input_per_million": 0.4,
480
+ "output_per_million": 1.8,
481
+ "cache_read_input_per_million": 0.04,
482
+ "cache_write_input_per_million": 0.5
483
+ },
484
+ "long_context_threshold": 272000
485
+ }
486
+ },
487
+ "metadata": {
488
+ "object": "model",
489
+ "owned_by": "system",
490
+ "source": "models.dev",
491
+ "provider_id": "openai",
492
+ "open_weights": false,
493
+ "attachment": true,
494
+ "temperature": false,
495
+ "last_updated": "2026-07-09",
496
+ "tool_call": true,
497
+ "structured_output": true,
498
+ "reasoning": true,
499
+ "reasoning_options": [
500
+ {
501
+ "type": "effort",
502
+ "values": [
503
+ "none",
504
+ "low",
505
+ "medium",
506
+ "high",
507
+ "xhigh",
508
+ "max"
509
+ ]
510
+ }
511
+ ],
512
+ "cost": {
513
+ "input": 0.2,
514
+ "output": 1.2,
515
+ "cache_read": 0.02,
516
+ "cache_write": 0.25,
517
+ "tiers": [
518
+ {
519
+ "input": 0.4,
520
+ "output": 1.8,
521
+ "cache_read": 0.04,
522
+ "cache_write": 0.5,
523
+ "tier": {
524
+ "type": "context",
525
+ "size": 272000
526
+ }
527
+ }
528
+ ],
529
+ "context_over_200k": {
530
+ "input": 0.4,
531
+ "output": 1.8,
532
+ "cache_read": 0.04,
533
+ "cache_write": 0.5
534
+ }
535
+ },
536
+ "limit": {
537
+ "context": 1050000,
538
+ "input": 922000,
539
+ "output": 128000
540
+ },
541
+ "knowledge": "2026-02-16"
542
+ }
543
+ },
544
+ {
545
+ "id": "openai/gpt-5.4",
546
+ "name": "GPT-5.4",
547
+ "provider": "qiniu",
548
+ "family": "gpt",
549
+ "created_at": "2026-03-05 00:00:00 UTC",
550
+ "context_window": 1050000,
551
+ "max_output_tokens": 128000,
552
+ "knowledge_cutoff": "2025-08-31",
553
+ "modalities": {
554
+ "input": [
555
+ "text",
556
+ "image",
557
+ "pdf"
558
+ ],
559
+ "output": [
560
+ "text"
561
+ ]
562
+ },
563
+ "capabilities": [
564
+ "function_calling",
565
+ "structured_output",
566
+ "reasoning",
567
+ "vision",
568
+ "tool_choice",
569
+ "parallel_tool_calls"
570
+ ],
571
+ "pricing": {
572
+ "text_tokens": {
573
+ "standard": {
574
+ "input_per_million": 2.5,
575
+ "output_per_million": 15,
576
+ "cache_read_input_per_million": 0.25
577
+ },
578
+ "long_context": {
579
+ "input_per_million": 5,
580
+ "output_per_million": 22.5,
581
+ "cache_read_input_per_million": 0.5
582
+ },
583
+ "long_context_threshold": 272000
584
+ }
585
+ },
586
+ "metadata": {
587
+ "object": "model",
588
+ "owned_by": "system",
589
+ "source": "models.dev",
590
+ "provider_id": "openai",
591
+ "open_weights": false,
592
+ "attachment": true,
593
+ "temperature": true,
594
+ "last_updated": "2026-03-05",
595
+ "tool_call": true,
596
+ "structured_output": true,
597
+ "reasoning": true,
598
+ "reasoning_options": [
599
+ {
600
+ "type": "effort",
601
+ "values": [
602
+ "none",
603
+ "low",
604
+ "medium",
605
+ "high",
606
+ "xhigh"
607
+ ]
608
+ }
609
+ ],
610
+ "cost": {
611
+ "input": 2.5,
612
+ "output": 15,
613
+ "cache_read": 0.25,
614
+ "tiers": [
615
+ {
616
+ "input": 5,
617
+ "output": 22.5,
618
+ "cache_read": 0.5,
619
+ "tier": {
620
+ "type": "context",
621
+ "size": 272000
622
+ }
623
+ }
624
+ ],
625
+ "context_over_200k": {
626
+ "input": 5,
627
+ "output": 22.5,
628
+ "cache_read": 0.5
629
+ }
630
+ },
631
+ "limit": {
632
+ "context": 1050000,
633
+ "input": 922000,
634
+ "output": 128000
635
+ },
636
+ "knowledge": "2025-08-31"
637
+ }
638
+ },
639
+ {
640
+ "id": "openai/gpt-5.4-mini",
641
+ "name": "GPT-5.4 mini",
642
+ "provider": "qiniu",
643
+ "family": "gpt-mini",
644
+ "created_at": "2026-03-17 00:00:00 UTC",
645
+ "context_window": 400000,
646
+ "max_output_tokens": 128000,
647
+ "knowledge_cutoff": "2025-08-31",
648
+ "modalities": {
649
+ "input": [
650
+ "text",
651
+ "image"
652
+ ],
653
+ "output": [
654
+ "text"
655
+ ]
656
+ },
657
+ "capabilities": [
658
+ "function_calling",
659
+ "structured_output",
660
+ "reasoning",
661
+ "vision",
662
+ "tool_choice",
663
+ "parallel_tool_calls"
664
+ ],
665
+ "pricing": {
666
+ "text_tokens": {
667
+ "standard": {
668
+ "input_per_million": 0.75,
669
+ "output_per_million": 4.5,
670
+ "cache_read_input_per_million": 0.075
671
+ }
672
+ }
673
+ },
674
+ "metadata": {
675
+ "object": "model",
676
+ "owned_by": "system",
677
+ "source": "models.dev",
678
+ "provider_id": "openai",
679
+ "open_weights": false,
680
+ "attachment": true,
681
+ "temperature": true,
682
+ "last_updated": "2026-03-17",
683
+ "tool_call": true,
684
+ "structured_output": true,
685
+ "reasoning": true,
686
+ "reasoning_options": [
687
+ {
688
+ "type": "effort",
689
+ "values": [
690
+ "none",
691
+ "low",
692
+ "medium",
693
+ "high",
694
+ "xhigh"
695
+ ]
696
+ }
697
+ ],
698
+ "cost": {
699
+ "input": 0.75,
700
+ "output": 4.5,
701
+ "cache_read": 0.075
702
+ },
703
+ "limit": {
704
+ "context": 400000,
705
+ "input": 272000,
706
+ "output": 128000
707
+ },
708
+ "knowledge": "2025-08-31"
709
+ }
710
+ },
711
+ {
712
+ "id": "openai/gpt-5.2",
713
+ "name": "GPT-5.2",
714
+ "provider": "qiniu",
715
+ "family": "gpt",
716
+ "created_at": "2025-12-11 00:00:00 UTC",
717
+ "context_window": 400000,
718
+ "max_output_tokens": 128000,
719
+ "knowledge_cutoff": "2025-08-31",
720
+ "modalities": {
721
+ "input": [
722
+ "text",
723
+ "image"
724
+ ],
725
+ "output": [
726
+ "text"
727
+ ]
728
+ },
729
+ "capabilities": [
730
+ "function_calling",
731
+ "structured_output",
732
+ "reasoning",
733
+ "vision",
734
+ "tool_choice",
735
+ "parallel_tool_calls"
736
+ ],
737
+ "pricing": {
738
+ "text_tokens": {
739
+ "standard": {
740
+ "input_per_million": 1.75,
741
+ "output_per_million": 14,
742
+ "cache_read_input_per_million": 0.175
743
+ }
744
+ }
745
+ },
746
+ "metadata": {
747
+ "object": "model",
748
+ "owned_by": "system",
749
+ "source": "models.dev",
750
+ "provider_id": "openai",
751
+ "open_weights": false,
752
+ "attachment": true,
753
+ "temperature": true,
754
+ "last_updated": "2025-12-11",
755
+ "tool_call": true,
756
+ "structured_output": true,
757
+ "reasoning": true,
758
+ "reasoning_options": [
759
+ {
760
+ "type": "effort",
761
+ "values": [
762
+ "none",
763
+ "low",
764
+ "medium",
765
+ "high",
766
+ "xhigh"
767
+ ]
768
+ }
769
+ ],
770
+ "cost": {
771
+ "input": 1.75,
772
+ "output": 14,
773
+ "cache_read": 0.175
774
+ },
775
+ "limit": {
776
+ "context": 400000,
777
+ "input": 272000,
778
+ "output": 128000
779
+ },
780
+ "knowledge": "2025-08-31"
781
+ }
782
+ },
783
+ {
784
+ "id": "deepseek/deepseek-v4.1-flash",
785
+ "name": "DeepSeek V4.1 Flash",
786
+ "provider": "qiniu",
787
+ "family": "deepseek-flash",
788
+ "created_at": "2026-09-10 00:00:00 UTC",
789
+ "context_window": 1000000,
790
+ "max_output_tokens": 393216,
791
+ "knowledge_cutoff": null,
792
+ "modalities": {
793
+ "input": [
794
+ "text",
795
+ "image"
796
+ ],
797
+ "output": [
798
+ "text"
799
+ ]
800
+ },
801
+ "capabilities": [
802
+ "function_calling",
803
+ "structured_output",
804
+ "reasoning",
805
+ "vision",
806
+ "tool_choice"
807
+ ],
808
+ "pricing": {
809
+ "text_tokens": {
810
+ "standard": {
811
+ "input_per_million": 0.15,
812
+ "output_per_million": 0.6,
813
+ "cache_read_input_per_million": 0.003,
814
+ "reasoning_output_per_million": 0.6
815
+ }
816
+ }
817
+ },
818
+ "metadata": {
819
+ "object": "model",
820
+ "owned_by": "deepseek",
821
+ "source": "models.dev",
822
+ "provider_id": "deepseek",
823
+ "open_weights": true,
824
+ "attachment": true,
825
+ "temperature": true,
826
+ "last_updated": "2026-09-10",
827
+ "interleaved": {
828
+ "field": "reasoning_content"
829
+ },
830
+ "tool_call": true,
831
+ "structured_output": true,
832
+ "reasoning": true,
833
+ "reasoning_options": [
834
+ {
835
+ "type": "toggle"
836
+ },
837
+ {
838
+ "type": "effort",
839
+ "values": [
840
+ "low",
841
+ "high",
842
+ "max"
843
+ ]
844
+ }
845
+ ],
846
+ "cost": {
847
+ "input": 0.15,
848
+ "output": 0.6,
849
+ "reasoning": 0.6,
850
+ "cache_read": 0.003
851
+ },
852
+ "limit": {
853
+ "context": 1000000,
854
+ "output": 393216
855
+ },
856
+ "knowledge": "2025-05"
857
+ }
858
+ }
859
+ ]