kiln-ai 0.20.1__py3-none-any.whl → 0.22.0__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 (133) hide show
  1. kiln_ai/adapters/__init__.py +6 -0
  2. kiln_ai/adapters/adapter_registry.py +43 -226
  3. kiln_ai/adapters/chunkers/__init__.py +13 -0
  4. kiln_ai/adapters/chunkers/base_chunker.py +42 -0
  5. kiln_ai/adapters/chunkers/chunker_registry.py +16 -0
  6. kiln_ai/adapters/chunkers/fixed_window_chunker.py +39 -0
  7. kiln_ai/adapters/chunkers/helpers.py +23 -0
  8. kiln_ai/adapters/chunkers/test_base_chunker.py +63 -0
  9. kiln_ai/adapters/chunkers/test_chunker_registry.py +28 -0
  10. kiln_ai/adapters/chunkers/test_fixed_window_chunker.py +346 -0
  11. kiln_ai/adapters/chunkers/test_helpers.py +75 -0
  12. kiln_ai/adapters/data_gen/test_data_gen_task.py +9 -3
  13. kiln_ai/adapters/embedding/__init__.py +0 -0
  14. kiln_ai/adapters/embedding/base_embedding_adapter.py +44 -0
  15. kiln_ai/adapters/embedding/embedding_registry.py +32 -0
  16. kiln_ai/adapters/embedding/litellm_embedding_adapter.py +199 -0
  17. kiln_ai/adapters/embedding/test_base_embedding_adapter.py +283 -0
  18. kiln_ai/adapters/embedding/test_embedding_registry.py +166 -0
  19. kiln_ai/adapters/embedding/test_litellm_embedding_adapter.py +1149 -0
  20. kiln_ai/adapters/eval/eval_runner.py +6 -2
  21. kiln_ai/adapters/eval/test_base_eval.py +1 -3
  22. kiln_ai/adapters/eval/test_g_eval.py +1 -1
  23. kiln_ai/adapters/extractors/__init__.py +18 -0
  24. kiln_ai/adapters/extractors/base_extractor.py +72 -0
  25. kiln_ai/adapters/extractors/encoding.py +20 -0
  26. kiln_ai/adapters/extractors/extractor_registry.py +44 -0
  27. kiln_ai/adapters/extractors/extractor_runner.py +112 -0
  28. kiln_ai/adapters/extractors/litellm_extractor.py +406 -0
  29. kiln_ai/adapters/extractors/test_base_extractor.py +244 -0
  30. kiln_ai/adapters/extractors/test_encoding.py +54 -0
  31. kiln_ai/adapters/extractors/test_extractor_registry.py +181 -0
  32. kiln_ai/adapters/extractors/test_extractor_runner.py +181 -0
  33. kiln_ai/adapters/extractors/test_litellm_extractor.py +1290 -0
  34. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +2 -2
  35. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +2 -6
  36. kiln_ai/adapters/fine_tune/test_together_finetune.py +2 -6
  37. kiln_ai/adapters/ml_embedding_model_list.py +494 -0
  38. kiln_ai/adapters/ml_model_list.py +876 -18
  39. kiln_ai/adapters/model_adapters/litellm_adapter.py +40 -75
  40. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +79 -1
  41. kiln_ai/adapters/model_adapters/test_litellm_adapter_tools.py +119 -5
  42. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +9 -3
  43. kiln_ai/adapters/model_adapters/test_structured_output.py +9 -10
  44. kiln_ai/adapters/ollama_tools.py +69 -12
  45. kiln_ai/adapters/provider_tools.py +190 -46
  46. kiln_ai/adapters/rag/deduplication.py +49 -0
  47. kiln_ai/adapters/rag/progress.py +252 -0
  48. kiln_ai/adapters/rag/rag_runners.py +844 -0
  49. kiln_ai/adapters/rag/test_deduplication.py +195 -0
  50. kiln_ai/adapters/rag/test_progress.py +785 -0
  51. kiln_ai/adapters/rag/test_rag_runners.py +2376 -0
  52. kiln_ai/adapters/remote_config.py +80 -8
  53. kiln_ai/adapters/test_adapter_registry.py +579 -86
  54. kiln_ai/adapters/test_ml_embedding_model_list.py +239 -0
  55. kiln_ai/adapters/test_ml_model_list.py +202 -0
  56. kiln_ai/adapters/test_ollama_tools.py +340 -1
  57. kiln_ai/adapters/test_prompt_builders.py +1 -1
  58. kiln_ai/adapters/test_provider_tools.py +199 -8
  59. kiln_ai/adapters/test_remote_config.py +551 -56
  60. kiln_ai/adapters/vector_store/__init__.py +1 -0
  61. kiln_ai/adapters/vector_store/base_vector_store_adapter.py +83 -0
  62. kiln_ai/adapters/vector_store/lancedb_adapter.py +389 -0
  63. kiln_ai/adapters/vector_store/test_base_vector_store.py +160 -0
  64. kiln_ai/adapters/vector_store/test_lancedb_adapter.py +1841 -0
  65. kiln_ai/adapters/vector_store/test_vector_store_registry.py +199 -0
  66. kiln_ai/adapters/vector_store/vector_store_registry.py +33 -0
  67. kiln_ai/datamodel/__init__.py +16 -13
  68. kiln_ai/datamodel/basemodel.py +201 -4
  69. kiln_ai/datamodel/chunk.py +158 -0
  70. kiln_ai/datamodel/datamodel_enums.py +27 -0
  71. kiln_ai/datamodel/embedding.py +64 -0
  72. kiln_ai/datamodel/external_tool_server.py +206 -54
  73. kiln_ai/datamodel/extraction.py +317 -0
  74. kiln_ai/datamodel/project.py +33 -1
  75. kiln_ai/datamodel/rag.py +79 -0
  76. kiln_ai/datamodel/task.py +5 -0
  77. kiln_ai/datamodel/task_output.py +41 -11
  78. kiln_ai/datamodel/test_attachment.py +649 -0
  79. kiln_ai/datamodel/test_basemodel.py +270 -14
  80. kiln_ai/datamodel/test_chunk_models.py +317 -0
  81. kiln_ai/datamodel/test_dataset_split.py +1 -1
  82. kiln_ai/datamodel/test_datasource.py +50 -0
  83. kiln_ai/datamodel/test_embedding_models.py +448 -0
  84. kiln_ai/datamodel/test_eval_model.py +6 -6
  85. kiln_ai/datamodel/test_external_tool_server.py +534 -152
  86. kiln_ai/datamodel/test_extraction_chunk.py +206 -0
  87. kiln_ai/datamodel/test_extraction_model.py +501 -0
  88. kiln_ai/datamodel/test_rag.py +641 -0
  89. kiln_ai/datamodel/test_task.py +35 -1
  90. kiln_ai/datamodel/test_tool_id.py +187 -1
  91. kiln_ai/datamodel/test_vector_store.py +320 -0
  92. kiln_ai/datamodel/tool_id.py +58 -0
  93. kiln_ai/datamodel/vector_store.py +141 -0
  94. kiln_ai/tools/base_tool.py +12 -3
  95. kiln_ai/tools/built_in_tools/math_tools.py +12 -4
  96. kiln_ai/tools/kiln_task_tool.py +158 -0
  97. kiln_ai/tools/mcp_server_tool.py +2 -2
  98. kiln_ai/tools/mcp_session_manager.py +51 -22
  99. kiln_ai/tools/rag_tools.py +164 -0
  100. kiln_ai/tools/test_kiln_task_tool.py +527 -0
  101. kiln_ai/tools/test_mcp_server_tool.py +4 -15
  102. kiln_ai/tools/test_mcp_session_manager.py +187 -227
  103. kiln_ai/tools/test_rag_tools.py +929 -0
  104. kiln_ai/tools/test_tool_registry.py +290 -7
  105. kiln_ai/tools/tool_registry.py +69 -16
  106. kiln_ai/utils/__init__.py +3 -0
  107. kiln_ai/utils/async_job_runner.py +62 -17
  108. kiln_ai/utils/config.py +2 -2
  109. kiln_ai/utils/env.py +15 -0
  110. kiln_ai/utils/filesystem.py +14 -0
  111. kiln_ai/utils/filesystem_cache.py +60 -0
  112. kiln_ai/utils/litellm.py +94 -0
  113. kiln_ai/utils/lock.py +100 -0
  114. kiln_ai/utils/mime_type.py +38 -0
  115. kiln_ai/utils/open_ai_types.py +19 -2
  116. kiln_ai/utils/pdf_utils.py +59 -0
  117. kiln_ai/utils/test_async_job_runner.py +151 -35
  118. kiln_ai/utils/test_env.py +142 -0
  119. kiln_ai/utils/test_filesystem_cache.py +316 -0
  120. kiln_ai/utils/test_litellm.py +206 -0
  121. kiln_ai/utils/test_lock.py +185 -0
  122. kiln_ai/utils/test_mime_type.py +66 -0
  123. kiln_ai/utils/test_open_ai_types.py +88 -12
  124. kiln_ai/utils/test_pdf_utils.py +86 -0
  125. kiln_ai/utils/test_uuid.py +111 -0
  126. kiln_ai/utils/test_validation.py +524 -0
  127. kiln_ai/utils/uuid.py +9 -0
  128. kiln_ai/utils/validation.py +90 -0
  129. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/METADATA +9 -1
  130. kiln_ai-0.22.0.dist-info/RECORD +213 -0
  131. kiln_ai-0.20.1.dist-info/RECORD +0 -138
  132. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/WHEEL +0 -0
  133. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -5,6 +5,7 @@ from pydantic import BaseModel
5
5
 
6
6
  from kiln_ai.datamodel.datamodel_enums import (
7
7
  ChatStrategy,
8
+ KilnMimeType,
8
9
  ModelProviderName,
9
10
  StructuredOutputMode,
10
11
  )
@@ -39,6 +40,8 @@ class ModelFamily(str, Enum):
39
40
  ernie = "ernie"
40
41
  minimax = "minimax"
41
42
  pangu = "pangu"
43
+ bytedance = "bytedance"
44
+ stepfun = "stepfun"
42
45
 
43
46
 
44
47
  # Where models have instruct and raw versions, instruct is default and raw is specified
@@ -88,6 +91,7 @@ class ModelName(str, Enum):
88
91
  mistral_large = "mistral_large"
89
92
  mistral_nemo = "mistral_nemo"
90
93
  mistral_small_3 = "mistral_small_3"
94
+ mistral_medium_3_1 = "mistral_medium_3_1"
91
95
  magistral_medium = "magistral_medium"
92
96
  magistral_medium_thinking = "magistral_medium_thinking"
93
97
  gemma_2_2b = "gemma_2_2b"
@@ -105,7 +109,9 @@ class ModelName(str, Enum):
105
109
  claude_3_7_sonnet = "claude_3_7_sonnet"
106
110
  claude_3_7_sonnet_thinking = "claude_3_7_sonnet_thinking"
107
111
  claude_sonnet_4 = "claude_sonnet_4"
112
+ claude_sonnet_4_5 = "claude_sonnet_4_5"
108
113
  claude_opus_4 = "claude_opus_4"
114
+ claude_opus_4_1 = "claude_opus_4_1"
109
115
  gemini_1_5_flash = "gemini_1_5_flash"
110
116
  gemini_1_5_flash_8b = "gemini_1_5_flash_8b"
111
117
  gemini_1_5_pro = "gemini_1_5_pro"
@@ -119,8 +125,13 @@ class ModelName(str, Enum):
119
125
  qwen_2p5_7b = "qwen_2p5_7b"
120
126
  qwen_2p5_14b = "qwen_2p5_14b"
121
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"
122
132
  qwq_32b = "qwq_32b"
123
133
  deepseek_3_1 = "deepseek_3_1"
134
+ deepseek_3_1_terminus = "deepseek_3_1_terminus"
124
135
  deepseek_3 = "deepseek_3"
125
136
  deepseek_r1 = "deepseek_r1"
126
137
  deepseek_r1_0528 = "deepseek_r1_0528"
@@ -136,6 +147,9 @@ class ModelName(str, Enum):
136
147
  grok_3 = "grok_3"
137
148
  grok_3_mini = "grok_3_mini"
138
149
  grok_4 = "grok_4"
150
+ qwen_3_next_80b_a3b = "qwen_3_next_80b_a3b"
151
+ qwen_3_next_80b_a3b_thinking = "qwen_3_next_80b_a3b_thinking"
152
+ qwen_3_max = "qwen_3_max"
139
153
  qwen_3_0p6b = "qwen_3_0p6b"
140
154
  qwen_3_0p6b_no_thinking = "qwen_3_0p6b_no_thinking"
141
155
  qwen_3_1p7b = "qwen_3_1p7b"
@@ -156,9 +170,13 @@ class ModelName(str, Enum):
156
170
  qwen_3_235b_a22b = "qwen_3_235b_a22b"
157
171
  qwen_3_235b_a22b_2507_no_thinking = "qwen_3_235b_a22b_2507_no_thinking"
158
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"
159
174
  qwen_long_l1_32b = "qwen_long_l1_32b"
160
175
  kimi_k2 = "kimi_k2"
176
+ kimi_k2_0905 = "kimi_k2_0905"
161
177
  kimi_dev_72b = "kimi_dev_72b"
178
+ glm_4_6 = "glm_4_6"
179
+ glm_4_5v = "glm_4_5v"
162
180
  glm_4_5 = "glm_4_5"
163
181
  glm_4_5_air = "glm_4_5_air"
164
182
  glm_4_1v_9b_thinking = "glm_4_1v_9b_thinking"
@@ -169,6 +187,8 @@ class ModelName(str, Enum):
169
187
  hunyuan_a13b_no_thinking = "hunyuan_a13b_no_thinking"
170
188
  minimax_m1_80k = "minimax_m1_80k"
171
189
  pangu_pro_moe_72b_a16b = "pangu_pro_moe_72b_a16b"
190
+ bytedance_seed_oss_36b = "bytedance_seed_oss_36b"
191
+ stepfun_step3 = "stepfun_step3"
172
192
 
173
193
 
174
194
  class ModelParserID(str, Enum):
@@ -202,6 +222,11 @@ class KilnModelProvider(BaseModel):
202
222
  parser: A parser to use for the model, if applicable
203
223
  reasoning_capable: Whether the model is designed to output thinking in a structured format (eg <think></think>). If so we don't use COT across 2 calls, and ask for thinking and final response in the same call.
204
224
  tuned_chat_strategy: Used when a model is finetuned with a specific chat strategy, and it's best to use it at call time.
225
+ supports_doc_extraction: Whether the provider is meant to support document extraction
226
+ suggested_for_doc_extraction: Whether the model is suggested for document extraction
227
+ multimodal_capable: Whether the model supports multimodal inputs (e.g. images, audio, video, PDFs, etc.)
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
205
230
  """
206
231
 
207
232
  name: ModelProviderName
@@ -221,6 +246,11 @@ class KilnModelProvider(BaseModel):
221
246
  uncensored: bool = False
222
247
  suggested_for_uncensored_data_gen: bool = False
223
248
  tuned_chat_strategy: ChatStrategy | None = None
249
+ supports_doc_extraction: bool = False
250
+ suggested_for_doc_extraction: bool = False
251
+ multimodal_capable: bool = False
252
+ multimodal_mime_types: List[str] | None = None
253
+ multimodal_requires_pdf_as_image: bool = False
224
254
 
225
255
  # We need a more generalized way to handle custom provider parameters.
226
256
  # Making them quite declarative here for now, isolating provider specific logic
@@ -233,6 +263,8 @@ class KilnModelProvider(BaseModel):
233
263
  ollama_model_aliases: List[str] | None = None
234
264
  anthropic_extended_thinking: bool = False
235
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
236
268
 
237
269
  # some models on siliconflow allow dynamically disabling thinking
238
270
  # currently only supported by Qwen3 and tencent/Hunyuan-A13B-Instruct
@@ -243,6 +275,11 @@ class KilnModelProvider(BaseModel):
243
275
  # this is not uniform nor documented, so we need to test each model
244
276
  reasoning_optional_for_structured_output: bool | None = None
245
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
+
246
283
 
247
284
  class KilnModel(BaseModel):
248
285
  """
@@ -275,6 +312,17 @@ built_in_models: List[KilnModel] = [
275
312
  structured_output_mode=StructuredOutputMode.json_schema,
276
313
  suggested_for_data_gen=True,
277
314
  suggested_for_evals=True,
315
+ supports_doc_extraction=True,
316
+ multimodal_capable=True,
317
+ multimodal_mime_types=[
318
+ # documents
319
+ KilnMimeType.PDF,
320
+ KilnMimeType.TXT,
321
+ KilnMimeType.MD,
322
+ # images
323
+ KilnMimeType.JPG,
324
+ KilnMimeType.PNG,
325
+ ],
278
326
  ),
279
327
  KilnModelProvider(
280
328
  name=ModelProviderName.openrouter,
@@ -282,6 +330,17 @@ built_in_models: List[KilnModel] = [
282
330
  structured_output_mode=StructuredOutputMode.json_schema,
283
331
  suggested_for_data_gen=True,
284
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
+ ],
285
344
  ),
286
345
  ],
287
346
  ),
@@ -297,6 +356,17 @@ built_in_models: List[KilnModel] = [
297
356
  structured_output_mode=StructuredOutputMode.json_schema,
298
357
  suggested_for_evals=True,
299
358
  suggested_for_data_gen=True,
359
+ supports_doc_extraction=True,
360
+ multimodal_capable=True,
361
+ multimodal_mime_types=[
362
+ # documents
363
+ KilnMimeType.PDF,
364
+ KilnMimeType.TXT,
365
+ KilnMimeType.MD,
366
+ # images
367
+ KilnMimeType.JPG,
368
+ KilnMimeType.PNG,
369
+ ],
300
370
  ),
301
371
  KilnModelProvider(
302
372
  name=ModelProviderName.openrouter,
@@ -304,6 +374,17 @@ built_in_models: List[KilnModel] = [
304
374
  structured_output_mode=StructuredOutputMode.json_schema,
305
375
  suggested_for_evals=True,
306
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
+ ],
307
388
  ),
308
389
  ],
309
390
  ),
@@ -317,11 +398,33 @@ built_in_models: List[KilnModel] = [
317
398
  name=ModelProviderName.openai,
318
399
  model_id="gpt-5-nano",
319
400
  structured_output_mode=StructuredOutputMode.json_schema,
401
+ supports_doc_extraction=True,
402
+ multimodal_capable=True,
403
+ multimodal_mime_types=[
404
+ # documents
405
+ KilnMimeType.PDF,
406
+ KilnMimeType.TXT,
407
+ KilnMimeType.MD,
408
+ # images
409
+ KilnMimeType.JPG,
410
+ KilnMimeType.PNG,
411
+ ],
320
412
  ),
321
413
  KilnModelProvider(
322
414
  name=ModelProviderName.openrouter,
323
415
  model_id="openai/gpt-5-nano",
324
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
+ ],
325
428
  ),
326
429
  ],
327
430
  ),
@@ -354,6 +457,15 @@ built_in_models: List[KilnModel] = [
354
457
  supports_logprobs=True,
355
458
  suggested_for_evals=True,
356
459
  suggested_for_data_gen=True,
460
+ supports_doc_extraction=True,
461
+ multimodal_capable=True,
462
+ multimodal_mime_types=[
463
+ # documents
464
+ KilnMimeType.PDF,
465
+ # images
466
+ KilnMimeType.JPG,
467
+ KilnMimeType.PNG,
468
+ ],
357
469
  ),
358
470
  KilnModelProvider(
359
471
  name=ModelProviderName.openrouter,
@@ -362,6 +474,15 @@ built_in_models: List[KilnModel] = [
362
474
  supports_logprobs=True,
363
475
  suggested_for_evals=True,
364
476
  suggested_for_data_gen=True,
477
+ supports_doc_extraction=True,
478
+ multimodal_capable=True,
479
+ multimodal_mime_types=[
480
+ # documents
481
+ KilnMimeType.PDF,
482
+ # images
483
+ KilnMimeType.JPG,
484
+ KilnMimeType.PNG,
485
+ ],
365
486
  ),
366
487
  KilnModelProvider(
367
488
  name=ModelProviderName.azure_openai,
@@ -816,6 +937,25 @@ built_in_models: List[KilnModel] = [
816
937
  ),
817
938
  ],
818
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
+ ),
819
959
  # Claude Sonnet 4
820
960
  KilnModel(
821
961
  family=ModelFamily.claude,
@@ -902,6 +1042,25 @@ built_in_models: List[KilnModel] = [
902
1042
  ),
903
1043
  ],
904
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
+ ),
905
1064
  # Claude Opus 4
906
1065
  KilnModel(
907
1066
  family=ModelFamily.claude,
@@ -933,6 +1092,20 @@ built_in_models: List[KilnModel] = [
933
1092
  suggested_for_data_gen=True,
934
1093
  suggested_for_evals=True,
935
1094
  reasoning_capable=True,
1095
+ supports_doc_extraction=True,
1096
+ suggested_for_doc_extraction=True,
1097
+ multimodal_capable=True,
1098
+ multimodal_mime_types=[
1099
+ # documents
1100
+ KilnMimeType.PDF,
1101
+ KilnMimeType.CSV,
1102
+ KilnMimeType.TXT,
1103
+ KilnMimeType.HTML,
1104
+ KilnMimeType.MD,
1105
+ # images
1106
+ KilnMimeType.JPG,
1107
+ KilnMimeType.PNG,
1108
+ ],
936
1109
  gemini_reasoning_enabled=True,
937
1110
  thinking_level="medium",
938
1111
  ),
@@ -942,9 +1115,31 @@ built_in_models: List[KilnModel] = [
942
1115
  structured_output_mode=StructuredOutputMode.json_schema,
943
1116
  suggested_for_data_gen=True,
944
1117
  suggested_for_evals=True,
1118
+ supports_doc_extraction=True,
1119
+ suggested_for_doc_extraction=True,
1120
+ multimodal_capable=True,
1121
+ multimodal_mime_types=[
1122
+ # documents
1123
+ KilnMimeType.PDF,
1124
+ KilnMimeType.CSV,
1125
+ KilnMimeType.TXT,
1126
+ KilnMimeType.HTML,
1127
+ KilnMimeType.MD,
1128
+ # images
1129
+ KilnMimeType.JPG,
1130
+ KilnMimeType.PNG,
1131
+ # audio
1132
+ KilnMimeType.MP3,
1133
+ KilnMimeType.WAV,
1134
+ KilnMimeType.OGG,
1135
+ # video
1136
+ KilnMimeType.MP4,
1137
+ KilnMimeType.MOV,
1138
+ ],
945
1139
  reasoning_capable=True,
946
1140
  gemini_reasoning_enabled=True,
947
1141
  thinking_level="medium",
1142
+ max_parallel_requests=2,
948
1143
  ),
949
1144
  KilnModelProvider(
950
1145
  name=ModelProviderName.vertex,
@@ -969,6 +1164,20 @@ built_in_models: List[KilnModel] = [
969
1164
  model_id="google/gemini-2.5-flash",
970
1165
  structured_output_mode=StructuredOutputMode.json_schema,
971
1166
  reasoning_capable=True,
1167
+ supports_doc_extraction=True,
1168
+ suggested_for_doc_extraction=True,
1169
+ multimodal_capable=True,
1170
+ multimodal_mime_types=[
1171
+ # documents
1172
+ KilnMimeType.PDF,
1173
+ KilnMimeType.CSV,
1174
+ KilnMimeType.TXT,
1175
+ KilnMimeType.HTML,
1176
+ KilnMimeType.MD,
1177
+ # images
1178
+ KilnMimeType.JPG,
1179
+ KilnMimeType.PNG,
1180
+ ],
972
1181
  gemini_reasoning_enabled=True,
973
1182
  ),
974
1183
  KilnModelProvider(
@@ -977,6 +1186,27 @@ built_in_models: List[KilnModel] = [
977
1186
  structured_output_mode=StructuredOutputMode.json_schema,
978
1187
  reasoning_capable=True,
979
1188
  thinking_level="medium",
1189
+ supports_doc_extraction=True,
1190
+ suggested_for_doc_extraction=True,
1191
+ multimodal_capable=True,
1192
+ multimodal_mime_types=[
1193
+ # documents
1194
+ KilnMimeType.PDF,
1195
+ KilnMimeType.CSV,
1196
+ KilnMimeType.TXT,
1197
+ KilnMimeType.HTML,
1198
+ KilnMimeType.MD,
1199
+ # images
1200
+ KilnMimeType.JPG,
1201
+ KilnMimeType.PNG,
1202
+ # audio
1203
+ KilnMimeType.MP3,
1204
+ KilnMimeType.WAV,
1205
+ KilnMimeType.OGG,
1206
+ # video
1207
+ KilnMimeType.MP4,
1208
+ KilnMimeType.MOV,
1209
+ ],
980
1210
  ),
981
1211
  KilnModelProvider(
982
1212
  name=ModelProviderName.vertex,
@@ -996,11 +1226,44 @@ built_in_models: List[KilnModel] = [
996
1226
  KilnModelProvider(
997
1227
  name=ModelProviderName.openrouter,
998
1228
  model_id="google/gemini-2.0-flash-001",
1229
+ supports_doc_extraction=True,
1230
+ multimodal_capable=True,
1231
+ multimodal_mime_types=[
1232
+ # documents
1233
+ KilnMimeType.PDF,
1234
+ KilnMimeType.CSV,
1235
+ KilnMimeType.TXT,
1236
+ KilnMimeType.HTML,
1237
+ KilnMimeType.MD,
1238
+ # images
1239
+ KilnMimeType.JPG,
1240
+ KilnMimeType.PNG,
1241
+ ],
999
1242
  structured_output_mode=StructuredOutputMode.json_schema,
1000
1243
  ),
1001
1244
  KilnModelProvider(
1002
1245
  name=ModelProviderName.gemini_api,
1003
1246
  model_id="gemini-2.0-flash",
1247
+ supports_doc_extraction=True,
1248
+ multimodal_capable=True,
1249
+ multimodal_mime_types=[
1250
+ # documents
1251
+ KilnMimeType.PDF,
1252
+ KilnMimeType.CSV,
1253
+ KilnMimeType.TXT,
1254
+ KilnMimeType.HTML,
1255
+ KilnMimeType.MD,
1256
+ # images
1257
+ KilnMimeType.JPG,
1258
+ KilnMimeType.PNG,
1259
+ # audio
1260
+ KilnMimeType.MP3,
1261
+ KilnMimeType.WAV,
1262
+ KilnMimeType.OGG,
1263
+ # video
1264
+ KilnMimeType.MP4,
1265
+ KilnMimeType.MOV,
1266
+ ],
1004
1267
  structured_output_mode=StructuredOutputMode.json_schema,
1005
1268
  ),
1006
1269
  KilnModelProvider(
@@ -1020,11 +1283,44 @@ built_in_models: List[KilnModel] = [
1020
1283
  KilnModelProvider(
1021
1284
  name=ModelProviderName.openrouter,
1022
1285
  model_id="google/gemini-2.0-flash-lite-001",
1286
+ supports_doc_extraction=True,
1287
+ multimodal_capable=True,
1288
+ multimodal_mime_types=[
1289
+ # documents
1290
+ KilnMimeType.PDF,
1291
+ KilnMimeType.CSV,
1292
+ KilnMimeType.TXT,
1293
+ KilnMimeType.HTML,
1294
+ KilnMimeType.MD,
1295
+ # images
1296
+ KilnMimeType.JPG,
1297
+ KilnMimeType.PNG,
1298
+ ],
1023
1299
  structured_output_mode=StructuredOutputMode.json_schema,
1024
1300
  ),
1025
1301
  KilnModelProvider(
1026
1302
  name=ModelProviderName.gemini_api,
1027
1303
  model_id="gemini-2.0-flash-lite",
1304
+ supports_doc_extraction=True,
1305
+ multimodal_capable=True,
1306
+ multimodal_mime_types=[
1307
+ # documents
1308
+ KilnMimeType.PDF,
1309
+ KilnMimeType.CSV,
1310
+ KilnMimeType.TXT,
1311
+ KilnMimeType.HTML,
1312
+ KilnMimeType.MD,
1313
+ # images
1314
+ KilnMimeType.JPG,
1315
+ KilnMimeType.PNG,
1316
+ # audio
1317
+ KilnMimeType.MP3,
1318
+ KilnMimeType.WAV,
1319
+ KilnMimeType.OGG,
1320
+ # video
1321
+ KilnMimeType.MP4,
1322
+ KilnMimeType.MOV,
1323
+ ],
1028
1324
  structured_output_mode=StructuredOutputMode.json_schema,
1029
1325
  ),
1030
1326
  KilnModelProvider(
@@ -1322,6 +1618,19 @@ built_in_models: List[KilnModel] = [
1322
1618
  ),
1323
1619
  ],
1324
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
+ ),
1325
1634
  # Magistral Medium (Thinking)
1326
1635
  KilnModel(
1327
1636
  family=ModelFamily.mistral,
@@ -1941,45 +2250,232 @@ built_in_models: List[KilnModel] = [
1941
2250
  ),
1942
2251
  ],
1943
2252
  ),
1944
- # Qwen 2.5 7B
2253
+ # Qwen 2.5 VL 72B
1945
2254
  KilnModel(
1946
2255
  family=ModelFamily.qwen,
1947
- name=ModelName.qwen_2p5_7b,
1948
- friendly_name="Qwen 2.5 7B",
2256
+ name=ModelName.qwen_2p5_vl_72b,
2257
+ friendly_name="Qwen 2.5 VL 72B (Vision-Language)",
1949
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
+ ),
1950
2276
  KilnModelProvider(
1951
2277
  name=ModelProviderName.openrouter,
1952
- 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",
1953
2311
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1954
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,
1955
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=[
1956
2333
  KilnModelProvider(
1957
2334
  name=ModelProviderName.ollama,
1958
- model_id="qwen2.5",
2335
+ model_id="qwen2.5vl:32b",
2336
+ structured_output_mode=StructuredOutputMode.json_schema,
1959
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,
1960
2349
  ),
1961
2350
  KilnModelProvider(
1962
- name=ModelProviderName.docker_model_runner,
1963
- 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,
1964
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,
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,
1965
2397
  ),
1966
2398
  ],
1967
2399
  ),
1968
- # Qwen 2.5 14B
2400
+ # Qwen 2.5 VL 7B
1969
2401
  KilnModel(
1970
2402
  family=ModelFamily.qwen,
1971
- name=ModelName.qwen_2p5_14b,
1972
- friendly_name="Qwen 2.5 14B",
2403
+ name=ModelName.qwen_2p5_vl_7b,
2404
+ friendly_name="Qwen 2.5 VL 7B (Vision-Language)",
1973
2405
  providers=[
1974
2406
  KilnModelProvider(
1975
- name=ModelProviderName.together_ai,
1976
- 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,
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,
1977
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=[
1978
2463
  KilnModelProvider(
1979
2464
  name=ModelProviderName.ollama,
1980
- model_id="qwen2.5:14b",
1981
- supports_data_gen=False,
2465
+ model_id="qwen2.5vl:3b",
2466
+ supports_structured_output=False,
1982
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,
1983
2479
  ),
1984
2480
  ],
1985
2481
  ),
@@ -2007,6 +2503,48 @@ built_in_models: List[KilnModel] = [
2007
2503
  ),
2008
2504
  ],
2009
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
+ ),
2010
2548
  # Mistral Small 3
2011
2549
  KilnModel(
2012
2550
  family=ModelFamily.mistral,
@@ -2098,6 +2636,29 @@ built_in_models: List[KilnModel] = [
2098
2636
  ),
2099
2637
  ],
2100
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
+ ),
2101
2662
  # DeepSeek 3.1
2102
2663
  KilnModel(
2103
2664
  family=ModelFamily.deepseek,
@@ -2107,7 +2668,7 @@ built_in_models: List[KilnModel] = [
2107
2668
  KilnModelProvider(
2108
2669
  name=ModelProviderName.openrouter,
2109
2670
  model_id="deepseek/deepseek-chat-v3.1",
2110
- structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2671
+ structured_output_mode=StructuredOutputMode.json_schema,
2111
2672
  supports_data_gen=True,
2112
2673
  ),
2113
2674
  KilnModelProvider(
@@ -2116,6 +2677,12 @@ built_in_models: List[KilnModel] = [
2116
2677
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2117
2678
  supports_data_gen=True,
2118
2679
  ),
2680
+ KilnModelProvider(
2681
+ name=ModelProviderName.siliconflow_cn,
2682
+ model_id="Pro/deepseek-ai/DeepSeek-V3.1",
2683
+ structured_output_mode=StructuredOutputMode.json_schema,
2684
+ supports_data_gen=True,
2685
+ ),
2119
2686
  ],
2120
2687
  ),
2121
2688
  # DeepSeek 3
@@ -2521,6 +3088,76 @@ built_in_models: List[KilnModel] = [
2521
3088
  ),
2522
3089
  ],
2523
3090
  ),
3091
+ # Qwen 3 Next 80B A3B
3092
+ KilnModel(
3093
+ family=ModelFamily.qwen,
3094
+ name=ModelName.qwen_3_next_80b_a3b,
3095
+ friendly_name="Qwen 3 Next 80B A3B (Instruct)",
3096
+ providers=[
3097
+ KilnModelProvider(
3098
+ name=ModelProviderName.openrouter,
3099
+ model_id="qwen/qwen3-next-80b-a3b-instruct",
3100
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3101
+ supports_data_gen=True,
3102
+ supports_function_calling=True,
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
+ ),
3118
+ ],
3119
+ ),
3120
+ # Qwen 3 Next 80B A3B (Thinking)
3121
+ KilnModel(
3122
+ family=ModelFamily.qwen,
3123
+ name=ModelName.qwen_3_next_80b_a3b_thinking,
3124
+ friendly_name="Qwen 3 Next 80B A3B (Thinking)",
3125
+ providers=[
3126
+ KilnModelProvider(
3127
+ name=ModelProviderName.openrouter,
3128
+ model_id="qwen/qwen3-next-80b-a3b-thinking",
3129
+ structured_output_mode=StructuredOutputMode.json_instructions,
3130
+ supports_data_gen=True,
3131
+ supports_function_calling=True,
3132
+ reasoning_capable=True,
3133
+ require_openrouter_reasoning=True,
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
+ ),
3144
+ ],
3145
+ ),
3146
+ # Qwen 3 Max
3147
+ KilnModel(
3148
+ family=ModelFamily.qwen,
3149
+ name=ModelName.qwen_3_max,
3150
+ friendly_name="Qwen 3 Max",
3151
+ providers=[
3152
+ KilnModelProvider(
3153
+ name=ModelProviderName.openrouter,
3154
+ model_id="qwen/qwen3-max",
3155
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3156
+ supports_data_gen=True,
3157
+ supports_function_calling=True,
3158
+ ),
3159
+ ],
3160
+ ),
2524
3161
  # Qwen 3 0.6B
2525
3162
  KilnModel(
2526
3163
  family=ModelFamily.qwen,
@@ -3011,6 +3648,34 @@ built_in_models: List[KilnModel] = [
3011
3648
  ),
3012
3649
  ],
3013
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
+ ),
3014
3679
  # Qwen 3 235B (22B Active) 2507 Version
3015
3680
  KilnModel(
3016
3681
  family=ModelFamily.qwen,
@@ -3204,6 +3869,75 @@ built_in_models: List[KilnModel] = [
3204
3869
  ),
3205
3870
  ],
3206
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
+ ),
3207
3941
  # GLM 4.5
3208
3942
  KilnModel(
3209
3943
  family=ModelFamily.glm,
@@ -3222,6 +3956,13 @@ built_in_models: List[KilnModel] = [
3222
3956
  structured_output_mode=StructuredOutputMode.json_instructions,
3223
3957
  reasoning_capable=True,
3224
3958
  ),
3959
+ KilnModelProvider(
3960
+ name=ModelProviderName.siliconflow_cn,
3961
+ model_id="zai-org/GLM-4.5",
3962
+ structured_output_mode=StructuredOutputMode.json_instructions,
3963
+ reasoning_capable=True,
3964
+ reasoning_optional_for_structured_output=True,
3965
+ ),
3225
3966
  ],
3226
3967
  ),
3227
3968
  # GLM 4.5 AIR
@@ -3249,6 +3990,13 @@ built_in_models: List[KilnModel] = [
3249
3990
  reasoning_capable=True,
3250
3991
  parser=ModelParserID.r1_thinking,
3251
3992
  ),
3993
+ KilnModelProvider(
3994
+ name=ModelProviderName.siliconflow_cn,
3995
+ model_id="zai-org/GLM-4.5-Air",
3996
+ structured_output_mode=StructuredOutputMode.json_instructions,
3997
+ reasoning_capable=True,
3998
+ reasoning_optional_for_structured_output=True,
3999
+ ),
3252
4000
  ],
3253
4001
  ),
3254
4002
  # Kimi K2 Instruct
@@ -3260,8 +4008,9 @@ built_in_models: List[KilnModel] = [
3260
4008
  KilnModelProvider(
3261
4009
  name=ModelProviderName.fireworks_ai,
3262
4010
  model_id="accounts/fireworks/models/kimi-k2-instruct",
3263
- structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3264
- # Ignoring json mode for now, so not suggested for evals
4011
+ structured_output_mode=StructuredOutputMode.json_schema,
4012
+ supports_data_gen=True,
4013
+ suggested_for_evals=True,
3265
4014
  ),
3266
4015
  KilnModelProvider(
3267
4016
  name=ModelProviderName.openrouter,
@@ -3281,7 +4030,7 @@ built_in_models: List[KilnModel] = [
3281
4030
  name=ModelProviderName.groq,
3282
4031
  model_id="moonshotai/kimi-k2-instruct",
3283
4032
  supports_data_gen=True,
3284
- structured_output_mode=StructuredOutputMode.function_calling,
4033
+ structured_output_mode=StructuredOutputMode.json_schema,
3285
4034
  suggested_for_evals=True,
3286
4035
  ),
3287
4036
  KilnModelProvider(
@@ -3293,6 +4042,51 @@ built_in_models: List[KilnModel] = [
3293
4042
  ),
3294
4043
  ],
3295
4044
  ),
4045
+ # Kimi K2 Instruct 0905
4046
+ KilnModel(
4047
+ family=ModelFamily.kimi,
4048
+ name=ModelName.kimi_k2_0905,
4049
+ friendly_name="Kimi K2 0905",
4050
+ providers=[
4051
+ KilnModelProvider(
4052
+ name=ModelProviderName.openrouter,
4053
+ model_id="moonshotai/kimi-k2-0905",
4054
+ structured_output_mode=StructuredOutputMode.json_schema,
4055
+ supports_data_gen=True,
4056
+ suggested_for_evals=True,
4057
+ ),
4058
+ KilnModelProvider(
4059
+ name=ModelProviderName.fireworks_ai,
4060
+ model_id="accounts/fireworks/models/kimi-k2-instruct-0905",
4061
+ structured_output_mode=StructuredOutputMode.json_schema,
4062
+ supports_data_gen=True,
4063
+ suggested_for_evals=True,
4064
+ ),
4065
+ KilnModelProvider(
4066
+ name=ModelProviderName.together_ai,
4067
+ model_id="moonshotai/Kimi-K2-Instruct-0905",
4068
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
4069
+ supports_data_gen=True,
4070
+ suggested_for_evals=True,
4071
+ # this model on this provider currently fails the tool call test, but might work in the future
4072
+ supports_function_calling=False,
4073
+ ),
4074
+ KilnModelProvider(
4075
+ name=ModelProviderName.groq,
4076
+ model_id="moonshotai/kimi-k2-instruct-0905",
4077
+ structured_output_mode=StructuredOutputMode.json_schema,
4078
+ supports_data_gen=True,
4079
+ suggested_for_evals=True,
4080
+ ),
4081
+ KilnModelProvider(
4082
+ name=ModelProviderName.siliconflow_cn,
4083
+ model_id="Pro/moonshotai/Kimi-K2-Instruct-0905",
4084
+ structured_output_mode=StructuredOutputMode.json_schema,
4085
+ supports_data_gen=True,
4086
+ suggested_for_evals=True,
4087
+ ),
4088
+ ],
4089
+ ),
3296
4090
  KilnModel(
3297
4091
  family=ModelFamily.kimi,
3298
4092
  name=ModelName.kimi_dev_72b,
@@ -3442,6 +4236,59 @@ built_in_models: List[KilnModel] = [
3442
4236
  ),
3443
4237
  ],
3444
4238
  ),
4239
+ # Bytedance
4240
+ KilnModel(
4241
+ family=ModelFamily.bytedance,
4242
+ name=ModelName.bytedance_seed_oss_36b,
4243
+ friendly_name="ByteDance Seed OSS 36B",
4244
+ providers=[
4245
+ KilnModelProvider(
4246
+ name=ModelProviderName.openrouter,
4247
+ model_id="bytedance/seed-oss-36b-instruct",
4248
+ structured_output_mode=StructuredOutputMode.json_schema,
4249
+ reasoning_capable=True,
4250
+ supports_data_gen=True,
4251
+ supports_function_calling=False,
4252
+ ),
4253
+ KilnModelProvider(
4254
+ name=ModelProviderName.siliconflow_cn,
4255
+ model_id="ByteDance-Seed/Seed-OSS-36B-Instruct",
4256
+ structured_output_mode=StructuredOutputMode.json_schema,
4257
+ reasoning_capable=True,
4258
+ supports_data_gen=True,
4259
+ supports_function_calling=False,
4260
+ reasoning_optional_for_structured_output=True,
4261
+ ),
4262
+ ],
4263
+ ),
4264
+ # StepFun
4265
+ KilnModel(
4266
+ family=ModelFamily.stepfun,
4267
+ name=ModelName.stepfun_step3,
4268
+ friendly_name="StepFun Step3",
4269
+ providers=[
4270
+ KilnModelProvider(
4271
+ name=ModelProviderName.openrouter,
4272
+ model_id="stepfun-ai/step3",
4273
+ structured_output_mode=StructuredOutputMode.json_instructions,
4274
+ reasoning_capable=True,
4275
+ supports_function_calling=False,
4276
+ ),
4277
+ KilnModelProvider(
4278
+ name=ModelProviderName.siliconflow_cn,
4279
+ model_id="stepfun-ai/step3",
4280
+ structured_output_mode=StructuredOutputMode.json_instructions,
4281
+ reasoning_capable=True,
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
+ ],
4289
+ ),
4290
+ ],
4291
+ ),
3445
4292
  ]
3446
4293
 
3447
4294
 
@@ -3452,6 +4299,17 @@ def get_model_by_name(name: ModelName) -> KilnModel:
3452
4299
  raise ValueError(f"Model {name} not found in the list of built-in models")
3453
4300
 
3454
4301
 
4302
+ def built_in_models_from_provider(
4303
+ provider_name: ModelProviderName, model_name: str
4304
+ ) -> KilnModelProvider | None:
4305
+ for model in built_in_models:
4306
+ if model.name == model_name:
4307
+ for p in model.providers:
4308
+ if p.name == provider_name:
4309
+ return p
4310
+ return None
4311
+
4312
+
3455
4313
  def default_structured_output_mode_for_model_provider(
3456
4314
  model_name: str,
3457
4315
  provider: ModelProviderName,