kiln-ai 0.21.0__py3-none-any.whl → 0.22.1__py3-none-any.whl

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.

Potentially problematic release.


This version of kiln-ai might be problematic. Click here for more details.

Files changed (53) hide show
  1. kiln_ai/adapters/extractors/litellm_extractor.py +52 -32
  2. kiln_ai/adapters/extractors/test_litellm_extractor.py +169 -71
  3. kiln_ai/adapters/ml_embedding_model_list.py +330 -28
  4. kiln_ai/adapters/ml_model_list.py +503 -23
  5. kiln_ai/adapters/model_adapters/litellm_adapter.py +39 -8
  6. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +78 -0
  7. kiln_ai/adapters/model_adapters/test_litellm_adapter_tools.py +119 -5
  8. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +9 -3
  9. kiln_ai/adapters/model_adapters/test_structured_output.py +6 -9
  10. kiln_ai/adapters/test_ml_embedding_model_list.py +89 -279
  11. kiln_ai/adapters/test_ml_model_list.py +0 -10
  12. kiln_ai/adapters/vector_store/lancedb_adapter.py +24 -70
  13. kiln_ai/adapters/vector_store/lancedb_helpers.py +101 -0
  14. kiln_ai/adapters/vector_store/test_lancedb_adapter.py +9 -16
  15. kiln_ai/adapters/vector_store/test_lancedb_helpers.py +142 -0
  16. kiln_ai/adapters/vector_store_loaders/__init__.py +0 -0
  17. kiln_ai/adapters/vector_store_loaders/test_lancedb_loader.py +282 -0
  18. kiln_ai/adapters/vector_store_loaders/test_vector_store_loader.py +544 -0
  19. kiln_ai/adapters/vector_store_loaders/vector_store_loader.py +91 -0
  20. kiln_ai/datamodel/basemodel.py +31 -3
  21. kiln_ai/datamodel/external_tool_server.py +206 -54
  22. kiln_ai/datamodel/extraction.py +14 -0
  23. kiln_ai/datamodel/task.py +5 -0
  24. kiln_ai/datamodel/task_output.py +41 -11
  25. kiln_ai/datamodel/test_attachment.py +3 -3
  26. kiln_ai/datamodel/test_basemodel.py +269 -13
  27. kiln_ai/datamodel/test_datasource.py +50 -0
  28. kiln_ai/datamodel/test_external_tool_server.py +534 -152
  29. kiln_ai/datamodel/test_extraction_model.py +31 -0
  30. kiln_ai/datamodel/test_task.py +35 -1
  31. kiln_ai/datamodel/test_tool_id.py +106 -1
  32. kiln_ai/datamodel/tool_id.py +49 -0
  33. kiln_ai/tools/base_tool.py +30 -6
  34. kiln_ai/tools/built_in_tools/math_tools.py +12 -4
  35. kiln_ai/tools/kiln_task_tool.py +162 -0
  36. kiln_ai/tools/mcp_server_tool.py +7 -5
  37. kiln_ai/tools/mcp_session_manager.py +50 -24
  38. kiln_ai/tools/rag_tools.py +17 -6
  39. kiln_ai/tools/test_kiln_task_tool.py +527 -0
  40. kiln_ai/tools/test_mcp_server_tool.py +4 -15
  41. kiln_ai/tools/test_mcp_session_manager.py +186 -226
  42. kiln_ai/tools/test_rag_tools.py +86 -5
  43. kiln_ai/tools/test_tool_registry.py +199 -5
  44. kiln_ai/tools/tool_registry.py +49 -17
  45. kiln_ai/utils/filesystem.py +4 -4
  46. kiln_ai/utils/open_ai_types.py +19 -2
  47. kiln_ai/utils/pdf_utils.py +21 -0
  48. kiln_ai/utils/test_open_ai_types.py +88 -12
  49. kiln_ai/utils/test_pdf_utils.py +14 -1
  50. {kiln_ai-0.21.0.dist-info → kiln_ai-0.22.1.dist-info}/METADATA +79 -1
  51. {kiln_ai-0.21.0.dist-info → kiln_ai-0.22.1.dist-info}/RECORD +53 -45
  52. {kiln_ai-0.21.0.dist-info → kiln_ai-0.22.1.dist-info}/WHEEL +0 -0
  53. {kiln_ai-0.21.0.dist-info → kiln_ai-0.22.1.dist-info}/licenses/LICENSE.txt +0 -0
@@ -91,6 +91,7 @@ class ModelName(str, Enum):
91
91
  mistral_large = "mistral_large"
92
92
  mistral_nemo = "mistral_nemo"
93
93
  mistral_small_3 = "mistral_small_3"
94
+ mistral_medium_3_1 = "mistral_medium_3_1"
94
95
  magistral_medium = "magistral_medium"
95
96
  magistral_medium_thinking = "magistral_medium_thinking"
96
97
  gemma_2_2b = "gemma_2_2b"
@@ -108,7 +109,9 @@ class ModelName(str, Enum):
108
109
  claude_3_7_sonnet = "claude_3_7_sonnet"
109
110
  claude_3_7_sonnet_thinking = "claude_3_7_sonnet_thinking"
110
111
  claude_sonnet_4 = "claude_sonnet_4"
112
+ claude_sonnet_4_5 = "claude_sonnet_4_5"
111
113
  claude_opus_4 = "claude_opus_4"
114
+ claude_opus_4_1 = "claude_opus_4_1"
112
115
  gemini_1_5_flash = "gemini_1_5_flash"
113
116
  gemini_1_5_flash_8b = "gemini_1_5_flash_8b"
114
117
  gemini_1_5_pro = "gemini_1_5_pro"
@@ -122,8 +125,13 @@ class ModelName(str, Enum):
122
125
  qwen_2p5_7b = "qwen_2p5_7b"
123
126
  qwen_2p5_14b = "qwen_2p5_14b"
124
127
  qwen_2p5_72b = "qwen_2p5_72b"
128
+ qwen_2p5_vl_3b = "qwen_2p5_vl_3b"
129
+ qwen_2p5_vl_7b = "qwen_2p5_vl_7b"
130
+ qwen_2p5_vl_32b = "qwen_2p5_vl_32b"
131
+ qwen_2p5_vl_72b = "qwen_2p5_vl_72b"
125
132
  qwq_32b = "qwq_32b"
126
133
  deepseek_3_1 = "deepseek_3_1"
134
+ deepseek_3_1_terminus = "deepseek_3_1_terminus"
127
135
  deepseek_3 = "deepseek_3"
128
136
  deepseek_r1 = "deepseek_r1"
129
137
  deepseek_r1_0528 = "deepseek_r1_0528"
@@ -162,10 +170,13 @@ class ModelName(str, Enum):
162
170
  qwen_3_235b_a22b = "qwen_3_235b_a22b"
163
171
  qwen_3_235b_a22b_2507_no_thinking = "qwen_3_235b_a22b_2507_no_thinking"
164
172
  qwen_3_235b_a22b_no_thinking = "qwen_3_235b_a22b_no_thinking"
173
+ qwen_3_vl_235b_a22b_no_thinking = "qwen_3_vl_235b_a22b_no_thinking"
165
174
  qwen_long_l1_32b = "qwen_long_l1_32b"
166
175
  kimi_k2 = "kimi_k2"
167
176
  kimi_k2_0905 = "kimi_k2_0905"
168
177
  kimi_dev_72b = "kimi_dev_72b"
178
+ glm_4_6 = "glm_4_6"
179
+ glm_4_5v = "glm_4_5v"
169
180
  glm_4_5 = "glm_4_5"
170
181
  glm_4_5_air = "glm_4_5_air"
171
182
  glm_4_1v_9b_thinking = "glm_4_1v_9b_thinking"
@@ -215,6 +226,7 @@ class KilnModelProvider(BaseModel):
215
226
  suggested_for_doc_extraction: Whether the model is suggested for document extraction
216
227
  multimodal_capable: Whether the model supports multimodal inputs (e.g. images, audio, video, PDFs, etc.)
217
228
  multimodal_mime_types: The mime types that the model supports for multimodal inputs (e.g. image/jpeg, video/mp4, application/pdf, etc.)
229
+ multimodal_requires_pdf_as_image: Whether the model requires PDFs to be processed as images
218
230
  """
219
231
 
220
232
  name: ModelProviderName
@@ -238,6 +250,7 @@ class KilnModelProvider(BaseModel):
238
250
  suggested_for_doc_extraction: bool = False
239
251
  multimodal_capable: bool = False
240
252
  multimodal_mime_types: List[str] | None = None
253
+ multimodal_requires_pdf_as_image: bool = False
241
254
 
242
255
  # We need a more generalized way to handle custom provider parameters.
243
256
  # Making them quite declarative here for now, isolating provider specific logic
@@ -250,6 +263,8 @@ class KilnModelProvider(BaseModel):
250
263
  ollama_model_aliases: List[str] | None = None
251
264
  anthropic_extended_thinking: bool = False
252
265
  gemini_reasoning_enabled: bool = False
266
+ # Can only specify top_p or temp, not both. Opus 4.1 and Sonnet 4.5 for example.
267
+ temp_top_p_exclusive: bool = False
253
268
 
254
269
  # some models on siliconflow allow dynamically disabling thinking
255
270
  # currently only supported by Qwen3 and tencent/Hunyuan-A13B-Instruct
@@ -260,6 +275,11 @@ class KilnModelProvider(BaseModel):
260
275
  # this is not uniform nor documented, so we need to test each model
261
276
  reasoning_optional_for_structured_output: bool | None = None
262
277
 
278
+ # models have rate limits, which become very relevant when doing heavy processing like in RAG
279
+ # this RPM gives a rough estimate of how many requests we should allow to run in parallel, it is
280
+ # not exact and real rate limit rules are much more complex
281
+ max_parallel_requests: int | None = None
282
+
263
283
 
264
284
  class KilnModel(BaseModel):
265
285
  """
@@ -297,6 +317,8 @@ built_in_models: List[KilnModel] = [
297
317
  multimodal_mime_types=[
298
318
  # documents
299
319
  KilnMimeType.PDF,
320
+ KilnMimeType.TXT,
321
+ KilnMimeType.MD,
300
322
  # images
301
323
  KilnMimeType.JPG,
302
324
  KilnMimeType.PNG,
@@ -308,6 +330,17 @@ built_in_models: List[KilnModel] = [
308
330
  structured_output_mode=StructuredOutputMode.json_schema,
309
331
  suggested_for_data_gen=True,
310
332
  suggested_for_evals=True,
333
+ supports_doc_extraction=True,
334
+ multimodal_capable=True,
335
+ multimodal_mime_types=[
336
+ # documents
337
+ KilnMimeType.PDF,
338
+ KilnMimeType.TXT,
339
+ KilnMimeType.MD,
340
+ # images
341
+ KilnMimeType.JPG,
342
+ KilnMimeType.PNG,
343
+ ],
311
344
  ),
312
345
  ],
313
346
  ),
@@ -328,6 +361,8 @@ built_in_models: List[KilnModel] = [
328
361
  multimodal_mime_types=[
329
362
  # documents
330
363
  KilnMimeType.PDF,
364
+ KilnMimeType.TXT,
365
+ KilnMimeType.MD,
331
366
  # images
332
367
  KilnMimeType.JPG,
333
368
  KilnMimeType.PNG,
@@ -339,6 +374,17 @@ built_in_models: List[KilnModel] = [
339
374
  structured_output_mode=StructuredOutputMode.json_schema,
340
375
  suggested_for_evals=True,
341
376
  suggested_for_data_gen=True,
377
+ supports_doc_extraction=True,
378
+ multimodal_capable=True,
379
+ multimodal_mime_types=[
380
+ # documents
381
+ KilnMimeType.PDF,
382
+ KilnMimeType.TXT,
383
+ KilnMimeType.MD,
384
+ # images
385
+ KilnMimeType.JPG,
386
+ KilnMimeType.PNG,
387
+ ],
342
388
  ),
343
389
  ],
344
390
  ),
@@ -357,6 +403,8 @@ built_in_models: List[KilnModel] = [
357
403
  multimodal_mime_types=[
358
404
  # documents
359
405
  KilnMimeType.PDF,
406
+ KilnMimeType.TXT,
407
+ KilnMimeType.MD,
360
408
  # images
361
409
  KilnMimeType.JPG,
362
410
  KilnMimeType.PNG,
@@ -366,6 +414,17 @@ built_in_models: List[KilnModel] = [
366
414
  name=ModelProviderName.openrouter,
367
415
  model_id="openai/gpt-5-nano",
368
416
  structured_output_mode=StructuredOutputMode.json_schema,
417
+ supports_doc_extraction=True,
418
+ multimodal_capable=True,
419
+ multimodal_mime_types=[
420
+ # documents
421
+ KilnMimeType.PDF,
422
+ KilnMimeType.TXT,
423
+ KilnMimeType.MD,
424
+ # images
425
+ KilnMimeType.JPG,
426
+ KilnMimeType.PNG,
427
+ ],
369
428
  ),
370
429
  ],
371
430
  ),
@@ -430,15 +489,6 @@ built_in_models: List[KilnModel] = [
430
489
  model_id="gpt-4.1",
431
490
  suggested_for_evals=True,
432
491
  suggested_for_data_gen=True,
433
- supports_doc_extraction=True,
434
- multimodal_capable=True,
435
- multimodal_mime_types=[
436
- # documents
437
- KilnMimeType.PDF,
438
- # images
439
- KilnMimeType.JPG,
440
- KilnMimeType.PNG,
441
- ],
442
492
  ),
443
493
  ],
444
494
  ),
@@ -887,6 +937,25 @@ built_in_models: List[KilnModel] = [
887
937
  ),
888
938
  ],
889
939
  ),
940
+ # Claude Sonnet 4.5
941
+ KilnModel(
942
+ family=ModelFamily.claude,
943
+ name=ModelName.claude_sonnet_4_5,
944
+ friendly_name="Claude 4.5 Sonnet",
945
+ providers=[
946
+ KilnModelProvider(
947
+ name=ModelProviderName.openrouter,
948
+ model_id="anthropic/claude-4.5-sonnet",
949
+ structured_output_mode=StructuredOutputMode.function_calling,
950
+ ),
951
+ KilnModelProvider(
952
+ name=ModelProviderName.anthropic,
953
+ model_id="claude-sonnet-4-5-20250929",
954
+ structured_output_mode=StructuredOutputMode.json_schema,
955
+ temp_top_p_exclusive=True,
956
+ ),
957
+ ],
958
+ ),
890
959
  # Claude Sonnet 4
891
960
  KilnModel(
892
961
  family=ModelFamily.claude,
@@ -973,6 +1042,25 @@ built_in_models: List[KilnModel] = [
973
1042
  ),
974
1043
  ],
975
1044
  ),
1045
+ # Claude Opus 4.1
1046
+ KilnModel(
1047
+ family=ModelFamily.claude,
1048
+ name=ModelName.claude_opus_4_1,
1049
+ friendly_name="Claude Opus 4.1",
1050
+ providers=[
1051
+ KilnModelProvider(
1052
+ name=ModelProviderName.openrouter,
1053
+ model_id="anthropic/claude-opus-4.1",
1054
+ structured_output_mode=StructuredOutputMode.function_calling,
1055
+ ),
1056
+ KilnModelProvider(
1057
+ name=ModelProviderName.anthropic,
1058
+ model_id="claude-opus-4-1-20250805",
1059
+ structured_output_mode=StructuredOutputMode.function_calling,
1060
+ temp_top_p_exclusive=True,
1061
+ ),
1062
+ ],
1063
+ ),
976
1064
  # Claude Opus 4
977
1065
  KilnModel(
978
1066
  family=ModelFamily.claude,
@@ -1051,6 +1139,7 @@ built_in_models: List[KilnModel] = [
1051
1139
  reasoning_capable=True,
1052
1140
  gemini_reasoning_enabled=True,
1053
1141
  thinking_level="medium",
1142
+ max_parallel_requests=2,
1054
1143
  ),
1055
1144
  KilnModelProvider(
1056
1145
  name=ModelProviderName.vertex,
@@ -1529,6 +1618,19 @@ built_in_models: List[KilnModel] = [
1529
1618
  ),
1530
1619
  ],
1531
1620
  ),
1621
+ # Mistral Medium 3.1
1622
+ KilnModel(
1623
+ family=ModelFamily.mistral,
1624
+ name=ModelName.mistral_medium_3_1,
1625
+ friendly_name="Mistral Medium 3.1",
1626
+ providers=[
1627
+ KilnModelProvider(
1628
+ name=ModelProviderName.openrouter,
1629
+ model_id="mistralai/mistral-medium-3.1",
1630
+ structured_output_mode=StructuredOutputMode.json_schema,
1631
+ ),
1632
+ ],
1633
+ ),
1532
1634
  # Magistral Medium (Thinking)
1533
1635
  KilnModel(
1534
1636
  family=ModelFamily.mistral,
@@ -2148,45 +2250,232 @@ built_in_models: List[KilnModel] = [
2148
2250
  ),
2149
2251
  ],
2150
2252
  ),
2151
- # Qwen 2.5 7B
2253
+ # Qwen 2.5 VL 72B
2152
2254
  KilnModel(
2153
2255
  family=ModelFamily.qwen,
2154
- name=ModelName.qwen_2p5_7b,
2155
- friendly_name="Qwen 2.5 7B",
2256
+ name=ModelName.qwen_2p5_vl_72b,
2257
+ friendly_name="Qwen 2.5 VL 72B (Vision-Language)",
2156
2258
  providers=[
2259
+ KilnModelProvider(
2260
+ name=ModelProviderName.ollama,
2261
+ model_id="qwen2.5vl:72b",
2262
+ structured_output_mode=StructuredOutputMode.json_schema,
2263
+ supports_function_calling=False,
2264
+ supports_doc_extraction=True,
2265
+ multimodal_capable=True,
2266
+ multimodal_mime_types=[
2267
+ KilnMimeType.JPG,
2268
+ KilnMimeType.PNG,
2269
+ KilnMimeType.PDF,
2270
+ KilnMimeType.TXT,
2271
+ KilnMimeType.MD,
2272
+ ],
2273
+ multimodal_requires_pdf_as_image=True,
2274
+ max_parallel_requests=1,
2275
+ ),
2157
2276
  KilnModelProvider(
2158
2277
  name=ModelProviderName.openrouter,
2159
- model_id="qwen/qwen-2.5-7b-instruct",
2278
+ model_id="qwen/qwen2.5-vl-72b-instruct",
2279
+ structured_output_mode=StructuredOutputMode.json_schema,
2280
+ supports_function_calling=False,
2281
+ supports_doc_extraction=True,
2282
+ multimodal_capable=True,
2283
+ multimodal_mime_types=[
2284
+ KilnMimeType.JPG,
2285
+ KilnMimeType.PNG,
2286
+ KilnMimeType.PDF,
2287
+ KilnMimeType.TXT,
2288
+ KilnMimeType.MD,
2289
+ ],
2290
+ multimodal_requires_pdf_as_image=True,
2291
+ ),
2292
+ KilnModelProvider(
2293
+ name=ModelProviderName.siliconflow_cn,
2294
+ model_id="Qwen/Qwen2.5-VL-72B-Instruct",
2295
+ structured_output_mode=StructuredOutputMode.json_instructions,
2296
+ supports_function_calling=False,
2297
+ supports_doc_extraction=True,
2298
+ multimodal_capable=True,
2299
+ multimodal_mime_types=[
2300
+ KilnMimeType.JPG,
2301
+ KilnMimeType.PNG,
2302
+ KilnMimeType.PDF,
2303
+ KilnMimeType.TXT,
2304
+ KilnMimeType.MD,
2305
+ ],
2306
+ multimodal_requires_pdf_as_image=True,
2307
+ ),
2308
+ KilnModelProvider(
2309
+ name=ModelProviderName.together_ai,
2310
+ model_id="Qwen/Qwen2.5-VL-72B-Instruct",
2160
2311
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2161
2312
  supports_function_calling=False,
2313
+ supports_doc_extraction=True,
2314
+ multimodal_capable=True,
2315
+ multimodal_mime_types=[
2316
+ KilnMimeType.JPG,
2317
+ KilnMimeType.PNG,
2318
+ KilnMimeType.PDF,
2319
+ KilnMimeType.TXT,
2320
+ KilnMimeType.MD,
2321
+ # supports video, but LiteLLM fails request validation
2322
+ ],
2323
+ multimodal_requires_pdf_as_image=True,
2162
2324
  ),
2325
+ ],
2326
+ ),
2327
+ # Qwen 2.5 VL 32B
2328
+ KilnModel(
2329
+ family=ModelFamily.qwen,
2330
+ name=ModelName.qwen_2p5_vl_32b,
2331
+ friendly_name="Qwen 2.5 VL 32B (Vision-Language)",
2332
+ providers=[
2163
2333
  KilnModelProvider(
2164
2334
  name=ModelProviderName.ollama,
2165
- model_id="qwen2.5",
2335
+ model_id="qwen2.5vl:32b",
2336
+ structured_output_mode=StructuredOutputMode.json_schema,
2166
2337
  supports_function_calling=False,
2338
+ supports_doc_extraction=True,
2339
+ multimodal_capable=True,
2340
+ multimodal_mime_types=[
2341
+ KilnMimeType.JPG,
2342
+ KilnMimeType.PNG,
2343
+ KilnMimeType.PDF,
2344
+ KilnMimeType.TXT,
2345
+ KilnMimeType.MD,
2346
+ ],
2347
+ multimodal_requires_pdf_as_image=True,
2348
+ max_parallel_requests=1,
2167
2349
  ),
2168
2350
  KilnModelProvider(
2169
- name=ModelProviderName.docker_model_runner,
2170
- model_id="ai/qwen2.5:7B-Q4_K_M",
2351
+ name=ModelProviderName.openrouter,
2352
+ model_id="qwen/qwen2.5-vl-32b-instruct",
2353
+ structured_output_mode=StructuredOutputMode.json_schema,
2354
+ supports_function_calling=False,
2355
+ supports_doc_extraction=True,
2356
+ multimodal_capable=True,
2357
+ multimodal_mime_types=[
2358
+ KilnMimeType.JPG,
2359
+ KilnMimeType.PNG,
2360
+ KilnMimeType.PDF,
2361
+ KilnMimeType.TXT,
2362
+ KilnMimeType.MD,
2363
+ ],
2364
+ multimodal_requires_pdf_as_image=True,
2365
+ ),
2366
+ KilnModelProvider(
2367
+ name=ModelProviderName.siliconflow_cn,
2368
+ model_id="Qwen/Qwen2.5-VL-32B-Instruct",
2369
+ structured_output_mode=StructuredOutputMode.json_instructions,
2370
+ supports_function_calling=False,
2371
+ supports_doc_extraction=True,
2372
+ multimodal_capable=True,
2373
+ multimodal_mime_types=[
2374
+ KilnMimeType.JPG,
2375
+ KilnMimeType.PNG,
2376
+ KilnMimeType.PDF,
2377
+ KilnMimeType.TXT,
2378
+ KilnMimeType.MD,
2379
+ ],
2380
+ multimodal_requires_pdf_as_image=True,
2381
+ ),
2382
+ KilnModelProvider(
2383
+ name=ModelProviderName.fireworks_ai,
2384
+ model_id="accounts/fireworks/models/qwen2p5-vl-32b-instruct",
2385
+ structured_output_mode=StructuredOutputMode.json_schema,
2171
2386
  supports_function_calling=False,
2387
+ supports_doc_extraction=True,
2388
+ multimodal_capable=True,
2389
+ multimodal_mime_types=[
2390
+ KilnMimeType.JPG,
2391
+ KilnMimeType.PNG,
2392
+ KilnMimeType.PDF,
2393
+ KilnMimeType.TXT,
2394
+ KilnMimeType.MD,
2395
+ ],
2396
+ multimodal_requires_pdf_as_image=True,
2172
2397
  ),
2173
2398
  ],
2174
2399
  ),
2175
- # Qwen 2.5 14B
2400
+ # Qwen 2.5 VL 7B
2176
2401
  KilnModel(
2177
2402
  family=ModelFamily.qwen,
2178
- name=ModelName.qwen_2p5_14b,
2179
- friendly_name="Qwen 2.5 14B",
2403
+ name=ModelName.qwen_2p5_vl_7b,
2404
+ friendly_name="Qwen 2.5 VL 7B (Vision-Language)",
2180
2405
  providers=[
2181
2406
  KilnModelProvider(
2182
- name=ModelProviderName.together_ai,
2183
- provider_finetune_id="Qwen/Qwen2.5-14B-Instruct",
2407
+ name=ModelProviderName.ollama,
2408
+ model_id="qwen2.5vl:7b",
2409
+ supports_structured_output=False,
2410
+ supports_function_calling=False,
2411
+ supports_doc_extraction=True,
2412
+ multimodal_capable=True,
2413
+ multimodal_mime_types=[
2414
+ KilnMimeType.JPG,
2415
+ KilnMimeType.PNG,
2416
+ KilnMimeType.PDF,
2417
+ KilnMimeType.TXT,
2418
+ KilnMimeType.MD,
2419
+ ],
2420
+ multimodal_requires_pdf_as_image=True,
2421
+ max_parallel_requests=1,
2184
2422
  ),
2423
+ KilnModelProvider(
2424
+ name=ModelProviderName.openrouter,
2425
+ model_id="qwen/qwen-2.5-vl-7b-instruct",
2426
+ supports_structured_output=False,
2427
+ supports_function_calling=False,
2428
+ supports_doc_extraction=True,
2429
+ multimodal_capable=True,
2430
+ multimodal_mime_types=[
2431
+ KilnMimeType.JPG,
2432
+ KilnMimeType.PNG,
2433
+ KilnMimeType.PDF,
2434
+ KilnMimeType.TXT,
2435
+ KilnMimeType.MD,
2436
+ ],
2437
+ multimodal_requires_pdf_as_image=True,
2438
+ ),
2439
+ KilnModelProvider(
2440
+ name=ModelProviderName.siliconflow_cn,
2441
+ model_id="Pro/Qwen/Qwen2.5-VL-7B-Instruct",
2442
+ supports_structured_output=False,
2443
+ supports_function_calling=False,
2444
+ supports_doc_extraction=True,
2445
+ multimodal_capable=True,
2446
+ multimodal_mime_types=[
2447
+ KilnMimeType.JPG,
2448
+ KilnMimeType.PNG,
2449
+ KilnMimeType.PDF,
2450
+ KilnMimeType.TXT,
2451
+ KilnMimeType.MD,
2452
+ ],
2453
+ multimodal_requires_pdf_as_image=True,
2454
+ ),
2455
+ ],
2456
+ ),
2457
+ # Qwen 2.5 VL 3B
2458
+ KilnModel(
2459
+ family=ModelFamily.qwen,
2460
+ name=ModelName.qwen_2p5_vl_3b,
2461
+ friendly_name="Qwen 2.5 VL 3B (Vision-Language)",
2462
+ providers=[
2185
2463
  KilnModelProvider(
2186
2464
  name=ModelProviderName.ollama,
2187
- model_id="qwen2.5:14b",
2188
- supports_data_gen=False,
2465
+ model_id="qwen2.5vl:3b",
2466
+ supports_structured_output=False,
2189
2467
  supports_function_calling=False,
2468
+ supports_doc_extraction=True,
2469
+ multimodal_capable=True,
2470
+ multimodal_mime_types=[
2471
+ KilnMimeType.JPG,
2472
+ KilnMimeType.PNG,
2473
+ KilnMimeType.PDF,
2474
+ KilnMimeType.TXT,
2475
+ KilnMimeType.MD,
2476
+ ],
2477
+ multimodal_requires_pdf_as_image=True,
2478
+ max_parallel_requests=1,
2190
2479
  ),
2191
2480
  ],
2192
2481
  ),
@@ -2214,6 +2503,48 @@ built_in_models: List[KilnModel] = [
2214
2503
  ),
2215
2504
  ],
2216
2505
  ),
2506
+ # Qwen 2.5 14B
2507
+ KilnModel(
2508
+ family=ModelFamily.qwen,
2509
+ name=ModelName.qwen_2p5_14b,
2510
+ friendly_name="Qwen 2.5 14B",
2511
+ providers=[
2512
+ KilnModelProvider(
2513
+ name=ModelProviderName.together_ai,
2514
+ provider_finetune_id="Qwen/Qwen2.5-14B-Instruct",
2515
+ ),
2516
+ KilnModelProvider(
2517
+ name=ModelProviderName.ollama,
2518
+ model_id="qwen2.5:14b",
2519
+ supports_data_gen=False,
2520
+ supports_function_calling=False,
2521
+ ),
2522
+ ],
2523
+ ),
2524
+ # Qwen 2.5 7B
2525
+ KilnModel(
2526
+ family=ModelFamily.qwen,
2527
+ name=ModelName.qwen_2p5_7b,
2528
+ friendly_name="Qwen 2.5 7B",
2529
+ providers=[
2530
+ KilnModelProvider(
2531
+ name=ModelProviderName.openrouter,
2532
+ model_id="qwen/qwen-2.5-7b-instruct",
2533
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2534
+ supports_function_calling=False,
2535
+ ),
2536
+ KilnModelProvider(
2537
+ name=ModelProviderName.ollama,
2538
+ model_id="qwen2.5",
2539
+ supports_function_calling=False,
2540
+ ),
2541
+ KilnModelProvider(
2542
+ name=ModelProviderName.docker_model_runner,
2543
+ model_id="ai/qwen2.5:7B-Q4_K_M",
2544
+ supports_function_calling=False,
2545
+ ),
2546
+ ],
2547
+ ),
2217
2548
  # Mistral Small 3
2218
2549
  KilnModel(
2219
2550
  family=ModelFamily.mistral,
@@ -2305,6 +2636,29 @@ built_in_models: List[KilnModel] = [
2305
2636
  ),
2306
2637
  ],
2307
2638
  ),
2639
+ # DeepSeek 3.1 Terminus
2640
+ KilnModel(
2641
+ family=ModelFamily.deepseek,
2642
+ name=ModelName.deepseek_3_1_terminus,
2643
+ friendly_name="DeepSeek 3.1 Terminus",
2644
+ providers=[
2645
+ KilnModelProvider(
2646
+ name=ModelProviderName.openrouter,
2647
+ model_id="deepseek/deepseek-v3.1-terminus",
2648
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2649
+ supports_data_gen=True,
2650
+ ),
2651
+ KilnModelProvider(
2652
+ name=ModelProviderName.fireworks_ai,
2653
+ model_id="accounts/fireworks/models/deepseek-v3p1-terminus",
2654
+ structured_output_mode=StructuredOutputMode.json_schema,
2655
+ supports_data_gen=True,
2656
+ # the model page states it supports function calling, but our test fails
2657
+ # for this particular provider
2658
+ supports_function_calling=False,
2659
+ ),
2660
+ ],
2661
+ ),
2308
2662
  # DeepSeek 3.1
2309
2663
  KilnModel(
2310
2664
  family=ModelFamily.deepseek,
@@ -2747,6 +3101,20 @@ built_in_models: List[KilnModel] = [
2747
3101
  supports_data_gen=True,
2748
3102
  supports_function_calling=True,
2749
3103
  ),
3104
+ KilnModelProvider(
3105
+ name=ModelProviderName.together_ai,
3106
+ model_id="Qwen/Qwen3-Next-80B-A3B-Instruct",
3107
+ supports_data_gen=True,
3108
+ supports_function_calling=False,
3109
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3110
+ ),
3111
+ KilnModelProvider(
3112
+ name=ModelProviderName.siliconflow_cn,
3113
+ model_id="Qwen/Qwen3-Next-80B-A3B-Instruct",
3114
+ structured_output_mode=StructuredOutputMode.json_schema,
3115
+ supports_data_gen=True,
3116
+ supports_function_calling=False,
3117
+ ),
2750
3118
  ],
2751
3119
  ),
2752
3120
  # Qwen 3 Next 80B A3B (Thinking)
@@ -2764,6 +3132,15 @@ built_in_models: List[KilnModel] = [
2764
3132
  reasoning_capable=True,
2765
3133
  require_openrouter_reasoning=True,
2766
3134
  ),
3135
+ KilnModelProvider(
3136
+ name=ModelProviderName.siliconflow_cn,
3137
+ model_id="Qwen/Qwen3-Next-80B-A3B-Thinking",
3138
+ structured_output_mode=StructuredOutputMode.json_instructions,
3139
+ supports_data_gen=True,
3140
+ supports_function_calling=True,
3141
+ reasoning_capable=True,
3142
+ siliconflow_enable_thinking=True,
3143
+ ),
2767
3144
  ],
2768
3145
  ),
2769
3146
  # Qwen 3 Max
@@ -3271,6 +3648,34 @@ built_in_models: List[KilnModel] = [
3271
3648
  ),
3272
3649
  ],
3273
3650
  ),
3651
+ # Qwen 3 235B (22B Active) VL Instruct
3652
+ KilnModel(
3653
+ family=ModelFamily.qwen,
3654
+ name=ModelName.qwen_3_vl_235b_a22b_no_thinking,
3655
+ friendly_name="Qwen 3 VL Instruct 235B / 22B Active (Vision-Language)",
3656
+ providers=[
3657
+ KilnModelProvider(
3658
+ name=ModelProviderName.openrouter,
3659
+ model_id="qwen/qwen3-vl-235b-a22b-instruct",
3660
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3661
+ formatter=ModelFormatterID.qwen3_style_no_think,
3662
+ supports_data_gen=False,
3663
+ reasoning_capable=False,
3664
+ supports_doc_extraction=True,
3665
+ multimodal_capable=True,
3666
+ multimodal_mime_types=[
3667
+ # images
3668
+ KilnMimeType.JPG,
3669
+ KilnMimeType.PNG,
3670
+ # documents
3671
+ KilnMimeType.PDF,
3672
+ KilnMimeType.TXT,
3673
+ KilnMimeType.MD,
3674
+ ],
3675
+ multimodal_requires_pdf_as_image=True,
3676
+ ),
3677
+ ],
3678
+ ),
3274
3679
  # Qwen 3 235B (22B Active) 2507 Version
3275
3680
  KilnModel(
3276
3681
  family=ModelFamily.qwen,
@@ -3464,6 +3869,75 @@ built_in_models: List[KilnModel] = [
3464
3869
  ),
3465
3870
  ],
3466
3871
  ),
3872
+ # GLM 4.6
3873
+ KilnModel(
3874
+ family=ModelFamily.glm,
3875
+ name=ModelName.glm_4_6,
3876
+ friendly_name="GLM 4.6",
3877
+ providers=[
3878
+ KilnModelProvider(
3879
+ name=ModelProviderName.openrouter,
3880
+ model_id="z-ai/glm-4.6",
3881
+ structured_output_mode=StructuredOutputMode.json_instructions,
3882
+ reasoning_capable=True,
3883
+ reasoning_optional_for_structured_output=True,
3884
+ ),
3885
+ KilnModelProvider(
3886
+ name=ModelProviderName.siliconflow_cn,
3887
+ model_id="zai-org/GLM-4.6",
3888
+ structured_output_mode=StructuredOutputMode.json_instructions,
3889
+ ),
3890
+ ],
3891
+ ),
3892
+ # GLM 4.5V
3893
+ KilnModel(
3894
+ family=ModelFamily.glm,
3895
+ name=ModelName.glm_4_5v,
3896
+ friendly_name="GLM 4.5V (Vision-Language)",
3897
+ providers=[
3898
+ KilnModelProvider(
3899
+ name=ModelProviderName.openrouter,
3900
+ model_id="z-ai/glm-4.5v",
3901
+ supports_structured_output=False,
3902
+ reasoning_capable=True,
3903
+ supports_data_gen=False,
3904
+ supports_doc_extraction=True,
3905
+ multimodal_capable=True,
3906
+ multimodal_mime_types=[
3907
+ # documents
3908
+ KilnMimeType.PDF,
3909
+ KilnMimeType.TXT,
3910
+ KilnMimeType.MD,
3911
+ # images
3912
+ KilnMimeType.JPG,
3913
+ KilnMimeType.PNG,
3914
+ ],
3915
+ multimodal_requires_pdf_as_image=True,
3916
+ ),
3917
+ KilnModelProvider(
3918
+ name=ModelProviderName.siliconflow_cn,
3919
+ model_id="zai-org/GLM-4.5V",
3920
+ supports_structured_output=False,
3921
+ reasoning_capable=True,
3922
+ reasoning_optional_for_structured_output=True,
3923
+ supports_data_gen=False,
3924
+ supports_doc_extraction=True,
3925
+ multimodal_capable=True,
3926
+ multimodal_mime_types=[
3927
+ # documents
3928
+ KilnMimeType.PDF,
3929
+ KilnMimeType.TXT,
3930
+ KilnMimeType.MD,
3931
+ # images
3932
+ KilnMimeType.JPG,
3933
+ KilnMimeType.PNG,
3934
+ ],
3935
+ multimodal_requires_pdf_as_image=True,
3936
+ max_parallel_requests=1,
3937
+ ),
3938
+ # fireworks currently has it but not serverless
3939
+ ],
3940
+ ),
3467
3941
  # GLM 4.5
3468
3942
  KilnModel(
3469
3943
  family=ModelFamily.glm,
@@ -3806,6 +4280,12 @@ built_in_models: List[KilnModel] = [
3806
4280
  structured_output_mode=StructuredOutputMode.json_instructions,
3807
4281
  reasoning_capable=True,
3808
4282
  supports_function_calling=False,
4283
+ # image only is not sufficient for doc extraction
4284
+ multimodal_capable=True,
4285
+ multimodal_mime_types=[
4286
+ KilnMimeType.JPG,
4287
+ KilnMimeType.PNG,
4288
+ ],
3809
4289
  ),
3810
4290
  ],
3811
4291
  ),