kiln-ai 0.19.0__py3-none-any.whl → 0.21.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 (158) hide show
  1. kiln_ai/adapters/__init__.py +8 -2
  2. kiln_ai/adapters/adapter_registry.py +43 -208
  3. kiln_ai/adapters/chat/chat_formatter.py +8 -12
  4. kiln_ai/adapters/chat/test_chat_formatter.py +6 -2
  5. kiln_ai/adapters/chunkers/__init__.py +13 -0
  6. kiln_ai/adapters/chunkers/base_chunker.py +42 -0
  7. kiln_ai/adapters/chunkers/chunker_registry.py +16 -0
  8. kiln_ai/adapters/chunkers/fixed_window_chunker.py +39 -0
  9. kiln_ai/adapters/chunkers/helpers.py +23 -0
  10. kiln_ai/adapters/chunkers/test_base_chunker.py +63 -0
  11. kiln_ai/adapters/chunkers/test_chunker_registry.py +28 -0
  12. kiln_ai/adapters/chunkers/test_fixed_window_chunker.py +346 -0
  13. kiln_ai/adapters/chunkers/test_helpers.py +75 -0
  14. kiln_ai/adapters/data_gen/test_data_gen_task.py +9 -3
  15. kiln_ai/adapters/docker_model_runner_tools.py +119 -0
  16. kiln_ai/adapters/embedding/__init__.py +0 -0
  17. kiln_ai/adapters/embedding/base_embedding_adapter.py +44 -0
  18. kiln_ai/adapters/embedding/embedding_registry.py +32 -0
  19. kiln_ai/adapters/embedding/litellm_embedding_adapter.py +199 -0
  20. kiln_ai/adapters/embedding/test_base_embedding_adapter.py +283 -0
  21. kiln_ai/adapters/embedding/test_embedding_registry.py +166 -0
  22. kiln_ai/adapters/embedding/test_litellm_embedding_adapter.py +1149 -0
  23. kiln_ai/adapters/eval/base_eval.py +2 -2
  24. kiln_ai/adapters/eval/eval_runner.py +9 -3
  25. kiln_ai/adapters/eval/g_eval.py +2 -2
  26. kiln_ai/adapters/eval/test_base_eval.py +2 -4
  27. kiln_ai/adapters/eval/test_g_eval.py +4 -5
  28. kiln_ai/adapters/extractors/__init__.py +18 -0
  29. kiln_ai/adapters/extractors/base_extractor.py +72 -0
  30. kiln_ai/adapters/extractors/encoding.py +20 -0
  31. kiln_ai/adapters/extractors/extractor_registry.py +44 -0
  32. kiln_ai/adapters/extractors/extractor_runner.py +112 -0
  33. kiln_ai/adapters/extractors/litellm_extractor.py +386 -0
  34. kiln_ai/adapters/extractors/test_base_extractor.py +244 -0
  35. kiln_ai/adapters/extractors/test_encoding.py +54 -0
  36. kiln_ai/adapters/extractors/test_extractor_registry.py +181 -0
  37. kiln_ai/adapters/extractors/test_extractor_runner.py +181 -0
  38. kiln_ai/adapters/extractors/test_litellm_extractor.py +1192 -0
  39. kiln_ai/adapters/fine_tune/__init__.py +1 -1
  40. kiln_ai/adapters/fine_tune/openai_finetune.py +14 -4
  41. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +2 -2
  42. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +2 -6
  43. kiln_ai/adapters/fine_tune/test_openai_finetune.py +108 -111
  44. kiln_ai/adapters/fine_tune/test_together_finetune.py +2 -6
  45. kiln_ai/adapters/ml_embedding_model_list.py +192 -0
  46. kiln_ai/adapters/ml_model_list.py +761 -37
  47. kiln_ai/adapters/model_adapters/base_adapter.py +51 -21
  48. kiln_ai/adapters/model_adapters/litellm_adapter.py +380 -138
  49. kiln_ai/adapters/model_adapters/test_base_adapter.py +193 -17
  50. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +407 -2
  51. kiln_ai/adapters/model_adapters/test_litellm_adapter_tools.py +1103 -0
  52. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +5 -5
  53. kiln_ai/adapters/model_adapters/test_structured_output.py +113 -5
  54. kiln_ai/adapters/ollama_tools.py +69 -12
  55. kiln_ai/adapters/parsers/__init__.py +1 -1
  56. kiln_ai/adapters/provider_tools.py +205 -47
  57. kiln_ai/adapters/rag/deduplication.py +49 -0
  58. kiln_ai/adapters/rag/progress.py +252 -0
  59. kiln_ai/adapters/rag/rag_runners.py +844 -0
  60. kiln_ai/adapters/rag/test_deduplication.py +195 -0
  61. kiln_ai/adapters/rag/test_progress.py +785 -0
  62. kiln_ai/adapters/rag/test_rag_runners.py +2376 -0
  63. kiln_ai/adapters/remote_config.py +80 -8
  64. kiln_ai/adapters/repair/test_repair_task.py +12 -9
  65. kiln_ai/adapters/run_output.py +3 -0
  66. kiln_ai/adapters/test_adapter_registry.py +657 -85
  67. kiln_ai/adapters/test_docker_model_runner_tools.py +305 -0
  68. kiln_ai/adapters/test_ml_embedding_model_list.py +429 -0
  69. kiln_ai/adapters/test_ml_model_list.py +251 -1
  70. kiln_ai/adapters/test_ollama_tools.py +340 -1
  71. kiln_ai/adapters/test_prompt_adaptors.py +13 -6
  72. kiln_ai/adapters/test_prompt_builders.py +1 -1
  73. kiln_ai/adapters/test_provider_tools.py +254 -8
  74. kiln_ai/adapters/test_remote_config.py +651 -58
  75. kiln_ai/adapters/vector_store/__init__.py +1 -0
  76. kiln_ai/adapters/vector_store/base_vector_store_adapter.py +83 -0
  77. kiln_ai/adapters/vector_store/lancedb_adapter.py +389 -0
  78. kiln_ai/adapters/vector_store/test_base_vector_store.py +160 -0
  79. kiln_ai/adapters/vector_store/test_lancedb_adapter.py +1841 -0
  80. kiln_ai/adapters/vector_store/test_vector_store_registry.py +199 -0
  81. kiln_ai/adapters/vector_store/vector_store_registry.py +33 -0
  82. kiln_ai/datamodel/__init__.py +39 -34
  83. kiln_ai/datamodel/basemodel.py +170 -1
  84. kiln_ai/datamodel/chunk.py +158 -0
  85. kiln_ai/datamodel/datamodel_enums.py +28 -0
  86. kiln_ai/datamodel/embedding.py +64 -0
  87. kiln_ai/datamodel/eval.py +1 -1
  88. kiln_ai/datamodel/external_tool_server.py +298 -0
  89. kiln_ai/datamodel/extraction.py +303 -0
  90. kiln_ai/datamodel/json_schema.py +25 -10
  91. kiln_ai/datamodel/project.py +40 -1
  92. kiln_ai/datamodel/rag.py +79 -0
  93. kiln_ai/datamodel/registry.py +0 -15
  94. kiln_ai/datamodel/run_config.py +62 -0
  95. kiln_ai/datamodel/task.py +2 -77
  96. kiln_ai/datamodel/task_output.py +6 -1
  97. kiln_ai/datamodel/task_run.py +41 -0
  98. kiln_ai/datamodel/test_attachment.py +649 -0
  99. kiln_ai/datamodel/test_basemodel.py +4 -4
  100. kiln_ai/datamodel/test_chunk_models.py +317 -0
  101. kiln_ai/datamodel/test_dataset_split.py +1 -1
  102. kiln_ai/datamodel/test_embedding_models.py +448 -0
  103. kiln_ai/datamodel/test_eval_model.py +6 -6
  104. kiln_ai/datamodel/test_example_models.py +175 -0
  105. kiln_ai/datamodel/test_external_tool_server.py +691 -0
  106. kiln_ai/datamodel/test_extraction_chunk.py +206 -0
  107. kiln_ai/datamodel/test_extraction_model.py +470 -0
  108. kiln_ai/datamodel/test_rag.py +641 -0
  109. kiln_ai/datamodel/test_registry.py +8 -3
  110. kiln_ai/datamodel/test_task.py +15 -47
  111. kiln_ai/datamodel/test_tool_id.py +320 -0
  112. kiln_ai/datamodel/test_vector_store.py +320 -0
  113. kiln_ai/datamodel/tool_id.py +105 -0
  114. kiln_ai/datamodel/vector_store.py +141 -0
  115. kiln_ai/tools/__init__.py +8 -0
  116. kiln_ai/tools/base_tool.py +82 -0
  117. kiln_ai/tools/built_in_tools/__init__.py +13 -0
  118. kiln_ai/tools/built_in_tools/math_tools.py +124 -0
  119. kiln_ai/tools/built_in_tools/test_math_tools.py +204 -0
  120. kiln_ai/tools/mcp_server_tool.py +95 -0
  121. kiln_ai/tools/mcp_session_manager.py +246 -0
  122. kiln_ai/tools/rag_tools.py +157 -0
  123. kiln_ai/tools/test_base_tools.py +199 -0
  124. kiln_ai/tools/test_mcp_server_tool.py +457 -0
  125. kiln_ai/tools/test_mcp_session_manager.py +1585 -0
  126. kiln_ai/tools/test_rag_tools.py +848 -0
  127. kiln_ai/tools/test_tool_registry.py +562 -0
  128. kiln_ai/tools/tool_registry.py +85 -0
  129. kiln_ai/utils/__init__.py +3 -0
  130. kiln_ai/utils/async_job_runner.py +62 -17
  131. kiln_ai/utils/config.py +24 -2
  132. kiln_ai/utils/env.py +15 -0
  133. kiln_ai/utils/filesystem.py +14 -0
  134. kiln_ai/utils/filesystem_cache.py +60 -0
  135. kiln_ai/utils/litellm.py +94 -0
  136. kiln_ai/utils/lock.py +100 -0
  137. kiln_ai/utils/mime_type.py +38 -0
  138. kiln_ai/utils/open_ai_types.py +94 -0
  139. kiln_ai/utils/pdf_utils.py +38 -0
  140. kiln_ai/utils/project_utils.py +17 -0
  141. kiln_ai/utils/test_async_job_runner.py +151 -35
  142. kiln_ai/utils/test_config.py +138 -1
  143. kiln_ai/utils/test_env.py +142 -0
  144. kiln_ai/utils/test_filesystem_cache.py +316 -0
  145. kiln_ai/utils/test_litellm.py +206 -0
  146. kiln_ai/utils/test_lock.py +185 -0
  147. kiln_ai/utils/test_mime_type.py +66 -0
  148. kiln_ai/utils/test_open_ai_types.py +131 -0
  149. kiln_ai/utils/test_pdf_utils.py +73 -0
  150. kiln_ai/utils/test_uuid.py +111 -0
  151. kiln_ai/utils/test_validation.py +524 -0
  152. kiln_ai/utils/uuid.py +9 -0
  153. kiln_ai/utils/validation.py +90 -0
  154. {kiln_ai-0.19.0.dist-info → kiln_ai-0.21.0.dist-info}/METADATA +12 -5
  155. kiln_ai-0.21.0.dist-info/RECORD +211 -0
  156. kiln_ai-0.19.0.dist-info/RECORD +0 -115
  157. {kiln_ai-0.19.0.dist-info → kiln_ai-0.21.0.dist-info}/WHEEL +0 -0
  158. {kiln_ai-0.19.0.dist-info → kiln_ai-0.21.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
@@ -93,6 +96,7 @@ class ModelName(str, Enum):
93
96
  gemma_2_2b = "gemma_2_2b"
94
97
  gemma_2_9b = "gemma_2_9b"
95
98
  gemma_2_27b = "gemma_2_27b"
99
+ gemma_3_0p27b = "gemma_3_0p27b"
96
100
  gemma_3_1b = "gemma_3_1b"
97
101
  gemma_3_4b = "gemma_3_4b"
98
102
  gemma_3_12b = "gemma_3_12b"
@@ -119,6 +123,7 @@ class ModelName(str, Enum):
119
123
  qwen_2p5_14b = "qwen_2p5_14b"
120
124
  qwen_2p5_72b = "qwen_2p5_72b"
121
125
  qwq_32b = "qwq_32b"
126
+ deepseek_3_1 = "deepseek_3_1"
122
127
  deepseek_3 = "deepseek_3"
123
128
  deepseek_r1 = "deepseek_r1"
124
129
  deepseek_r1_0528 = "deepseek_r1_0528"
@@ -134,6 +139,9 @@ class ModelName(str, Enum):
134
139
  grok_3 = "grok_3"
135
140
  grok_3_mini = "grok_3_mini"
136
141
  grok_4 = "grok_4"
142
+ qwen_3_next_80b_a3b = "qwen_3_next_80b_a3b"
143
+ qwen_3_next_80b_a3b_thinking = "qwen_3_next_80b_a3b_thinking"
144
+ qwen_3_max = "qwen_3_max"
137
145
  qwen_3_0p6b = "qwen_3_0p6b"
138
146
  qwen_3_0p6b_no_thinking = "qwen_3_0p6b_no_thinking"
139
147
  qwen_3_1p7b = "qwen_3_1p7b"
@@ -156,7 +164,10 @@ class ModelName(str, Enum):
156
164
  qwen_3_235b_a22b_no_thinking = "qwen_3_235b_a22b_no_thinking"
157
165
  qwen_long_l1_32b = "qwen_long_l1_32b"
158
166
  kimi_k2 = "kimi_k2"
167
+ kimi_k2_0905 = "kimi_k2_0905"
159
168
  kimi_dev_72b = "kimi_dev_72b"
169
+ glm_4_5 = "glm_4_5"
170
+ glm_4_5_air = "glm_4_5_air"
160
171
  glm_4_1v_9b_thinking = "glm_4_1v_9b_thinking"
161
172
  glm_z1_32b_0414 = "glm_z1_32b_0414"
162
173
  glm_z1_9b_0414 = "glm_z1_9b_0414"
@@ -165,6 +176,8 @@ class ModelName(str, Enum):
165
176
  hunyuan_a13b_no_thinking = "hunyuan_a13b_no_thinking"
166
177
  minimax_m1_80k = "minimax_m1_80k"
167
178
  pangu_pro_moe_72b_a16b = "pangu_pro_moe_72b_a16b"
179
+ bytedance_seed_oss_36b = "bytedance_seed_oss_36b"
180
+ stepfun_step3 = "stepfun_step3"
168
181
 
169
182
 
170
183
  class ModelParserID(str, Enum):
@@ -198,6 +211,10 @@ class KilnModelProvider(BaseModel):
198
211
  parser: A parser to use for the model, if applicable
199
212
  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.
200
213
  tuned_chat_strategy: Used when a model is finetuned with a specific chat strategy, and it's best to use it at call time.
214
+ supports_doc_extraction: Whether the provider is meant to support document extraction
215
+ suggested_for_doc_extraction: Whether the model is suggested for document extraction
216
+ multimodal_capable: Whether the model supports multimodal inputs (e.g. images, audio, video, PDFs, etc.)
217
+ multimodal_mime_types: The mime types that the model supports for multimodal inputs (e.g. image/jpeg, video/mp4, application/pdf, etc.)
201
218
  """
202
219
 
203
220
  name: ModelProviderName
@@ -213,9 +230,14 @@ class KilnModelProvider(BaseModel):
213
230
  reasoning_capable: bool = False
214
231
  supports_logprobs: bool = False
215
232
  suggested_for_evals: bool = False
233
+ supports_function_calling: bool = True
216
234
  uncensored: bool = False
217
235
  suggested_for_uncensored_data_gen: bool = False
218
236
  tuned_chat_strategy: ChatStrategy | None = None
237
+ supports_doc_extraction: bool = False
238
+ suggested_for_doc_extraction: bool = False
239
+ multimodal_capable: bool = False
240
+ multimodal_mime_types: List[str] | None = None
219
241
 
220
242
  # We need a more generalized way to handle custom provider parameters.
221
243
  # Making them quite declarative here for now, isolating provider specific logic
@@ -270,6 +292,22 @@ built_in_models: List[KilnModel] = [
270
292
  structured_output_mode=StructuredOutputMode.json_schema,
271
293
  suggested_for_data_gen=True,
272
294
  suggested_for_evals=True,
295
+ supports_doc_extraction=True,
296
+ multimodal_capable=True,
297
+ multimodal_mime_types=[
298
+ # documents
299
+ KilnMimeType.PDF,
300
+ # images
301
+ KilnMimeType.JPG,
302
+ KilnMimeType.PNG,
303
+ ],
304
+ ),
305
+ KilnModelProvider(
306
+ name=ModelProviderName.openrouter,
307
+ model_id="openai/gpt-5",
308
+ structured_output_mode=StructuredOutputMode.json_schema,
309
+ suggested_for_data_gen=True,
310
+ suggested_for_evals=True,
273
311
  ),
274
312
  ],
275
313
  ),
@@ -285,6 +323,22 @@ built_in_models: List[KilnModel] = [
285
323
  structured_output_mode=StructuredOutputMode.json_schema,
286
324
  suggested_for_evals=True,
287
325
  suggested_for_data_gen=True,
326
+ supports_doc_extraction=True,
327
+ multimodal_capable=True,
328
+ multimodal_mime_types=[
329
+ # documents
330
+ KilnMimeType.PDF,
331
+ # images
332
+ KilnMimeType.JPG,
333
+ KilnMimeType.PNG,
334
+ ],
335
+ ),
336
+ KilnModelProvider(
337
+ name=ModelProviderName.openrouter,
338
+ model_id="openai/gpt-5-mini",
339
+ structured_output_mode=StructuredOutputMode.json_schema,
340
+ suggested_for_evals=True,
341
+ suggested_for_data_gen=True,
288
342
  ),
289
343
  ],
290
344
  ),
@@ -298,6 +352,20 @@ built_in_models: List[KilnModel] = [
298
352
  name=ModelProviderName.openai,
299
353
  model_id="gpt-5-nano",
300
354
  structured_output_mode=StructuredOutputMode.json_schema,
355
+ supports_doc_extraction=True,
356
+ multimodal_capable=True,
357
+ multimodal_mime_types=[
358
+ # documents
359
+ KilnMimeType.PDF,
360
+ # images
361
+ KilnMimeType.JPG,
362
+ KilnMimeType.PNG,
363
+ ],
364
+ ),
365
+ KilnModelProvider(
366
+ name=ModelProviderName.openrouter,
367
+ model_id="openai/gpt-5-nano",
368
+ structured_output_mode=StructuredOutputMode.json_schema,
301
369
  ),
302
370
  ],
303
371
  ),
@@ -312,6 +380,7 @@ built_in_models: List[KilnModel] = [
312
380
  model_id="gpt-5-chat-latest",
313
381
  # Oddly no json_schema support for this model.
314
382
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
383
+ supports_function_calling=False,
315
384
  ),
316
385
  ],
317
386
  ),
@@ -328,6 +397,16 @@ built_in_models: List[KilnModel] = [
328
397
  structured_output_mode=StructuredOutputMode.json_schema,
329
398
  supports_logprobs=True,
330
399
  suggested_for_evals=True,
400
+ suggested_for_data_gen=True,
401
+ supports_doc_extraction=True,
402
+ multimodal_capable=True,
403
+ multimodal_mime_types=[
404
+ # documents
405
+ KilnMimeType.PDF,
406
+ # images
407
+ KilnMimeType.JPG,
408
+ KilnMimeType.PNG,
409
+ ],
331
410
  ),
332
411
  KilnModelProvider(
333
412
  name=ModelProviderName.openrouter,
@@ -335,11 +414,31 @@ built_in_models: List[KilnModel] = [
335
414
  structured_output_mode=StructuredOutputMode.json_schema,
336
415
  supports_logprobs=True,
337
416
  suggested_for_evals=True,
417
+ suggested_for_data_gen=True,
418
+ supports_doc_extraction=True,
419
+ multimodal_capable=True,
420
+ multimodal_mime_types=[
421
+ # documents
422
+ KilnMimeType.PDF,
423
+ # images
424
+ KilnMimeType.JPG,
425
+ KilnMimeType.PNG,
426
+ ],
338
427
  ),
339
428
  KilnModelProvider(
340
429
  name=ModelProviderName.azure_openai,
341
430
  model_id="gpt-4.1",
342
431
  suggested_for_evals=True,
432
+ 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
+ ],
343
442
  ),
344
443
  ],
345
444
  ),
@@ -788,26 +887,25 @@ built_in_models: List[KilnModel] = [
788
887
  ),
789
888
  ],
790
889
  ),
791
- # Claude 3.5 Sonnet
890
+ # Claude Sonnet 4
792
891
  KilnModel(
793
892
  family=ModelFamily.claude,
794
- name=ModelName.claude_3_5_sonnet,
795
- friendly_name="Claude 3.5 Sonnet",
893
+ name=ModelName.claude_sonnet_4,
894
+ friendly_name="Claude 4 Sonnet",
796
895
  providers=[
797
896
  KilnModelProvider(
798
897
  name=ModelProviderName.openrouter,
898
+ model_id="anthropic/claude-sonnet-4",
799
899
  structured_output_mode=StructuredOutputMode.function_calling,
800
- model_id="anthropic/claude-3.5-sonnet",
900
+ suggested_for_data_gen=True,
901
+ suggested_for_evals=True,
801
902
  ),
802
903
  KilnModelProvider(
803
904
  name=ModelProviderName.anthropic,
804
- model_id="claude-3-5-sonnet-20241022",
905
+ model_id="claude-sonnet-4-20250514",
805
906
  structured_output_mode=StructuredOutputMode.function_calling,
806
- ),
807
- KilnModelProvider(
808
- name=ModelProviderName.vertex,
809
- model_id="claude-3-5-sonnet",
810
- structured_output_mode=StructuredOutputMode.function_calling_weak,
907
+ suggested_for_data_gen=True,
908
+ suggested_for_evals=True,
811
909
  ),
812
910
  ],
813
911
  ),
@@ -852,25 +950,26 @@ built_in_models: List[KilnModel] = [
852
950
  ),
853
951
  ],
854
952
  ),
855
- # Claude Sonnet 4
953
+ # Claude 3.5 Sonnet
856
954
  KilnModel(
857
955
  family=ModelFamily.claude,
858
- name=ModelName.claude_sonnet_4,
859
- friendly_name="Claude Sonnet 4",
956
+ name=ModelName.claude_3_5_sonnet,
957
+ friendly_name="Claude 3.5 Sonnet",
860
958
  providers=[
861
959
  KilnModelProvider(
862
960
  name=ModelProviderName.openrouter,
863
- model_id="anthropic/claude-sonnet-4",
864
961
  structured_output_mode=StructuredOutputMode.function_calling,
865
- suggested_for_data_gen=True,
866
- suggested_for_evals=True,
962
+ model_id="anthropic/claude-3.5-sonnet",
867
963
  ),
868
964
  KilnModelProvider(
869
965
  name=ModelProviderName.anthropic,
870
- model_id="claude-sonnet-4-20250514",
966
+ model_id="claude-3-5-sonnet-20241022",
871
967
  structured_output_mode=StructuredOutputMode.function_calling,
872
- suggested_for_data_gen=True,
873
- suggested_for_evals=True,
968
+ ),
969
+ KilnModelProvider(
970
+ name=ModelProviderName.vertex,
971
+ model_id="claude-3-5-sonnet",
972
+ structured_output_mode=StructuredOutputMode.function_calling_weak,
874
973
  ),
875
974
  ],
876
975
  ),
@@ -905,6 +1004,20 @@ built_in_models: List[KilnModel] = [
905
1004
  suggested_for_data_gen=True,
906
1005
  suggested_for_evals=True,
907
1006
  reasoning_capable=True,
1007
+ supports_doc_extraction=True,
1008
+ suggested_for_doc_extraction=True,
1009
+ multimodal_capable=True,
1010
+ multimodal_mime_types=[
1011
+ # documents
1012
+ KilnMimeType.PDF,
1013
+ KilnMimeType.CSV,
1014
+ KilnMimeType.TXT,
1015
+ KilnMimeType.HTML,
1016
+ KilnMimeType.MD,
1017
+ # images
1018
+ KilnMimeType.JPG,
1019
+ KilnMimeType.PNG,
1020
+ ],
908
1021
  gemini_reasoning_enabled=True,
909
1022
  thinking_level="medium",
910
1023
  ),
@@ -914,6 +1027,27 @@ built_in_models: List[KilnModel] = [
914
1027
  structured_output_mode=StructuredOutputMode.json_schema,
915
1028
  suggested_for_data_gen=True,
916
1029
  suggested_for_evals=True,
1030
+ supports_doc_extraction=True,
1031
+ suggested_for_doc_extraction=True,
1032
+ multimodal_capable=True,
1033
+ multimodal_mime_types=[
1034
+ # documents
1035
+ KilnMimeType.PDF,
1036
+ KilnMimeType.CSV,
1037
+ KilnMimeType.TXT,
1038
+ KilnMimeType.HTML,
1039
+ KilnMimeType.MD,
1040
+ # images
1041
+ KilnMimeType.JPG,
1042
+ KilnMimeType.PNG,
1043
+ # audio
1044
+ KilnMimeType.MP3,
1045
+ KilnMimeType.WAV,
1046
+ KilnMimeType.OGG,
1047
+ # video
1048
+ KilnMimeType.MP4,
1049
+ KilnMimeType.MOV,
1050
+ ],
917
1051
  reasoning_capable=True,
918
1052
  gemini_reasoning_enabled=True,
919
1053
  thinking_level="medium",
@@ -941,6 +1075,20 @@ built_in_models: List[KilnModel] = [
941
1075
  model_id="google/gemini-2.5-flash",
942
1076
  structured_output_mode=StructuredOutputMode.json_schema,
943
1077
  reasoning_capable=True,
1078
+ supports_doc_extraction=True,
1079
+ suggested_for_doc_extraction=True,
1080
+ multimodal_capable=True,
1081
+ multimodal_mime_types=[
1082
+ # documents
1083
+ KilnMimeType.PDF,
1084
+ KilnMimeType.CSV,
1085
+ KilnMimeType.TXT,
1086
+ KilnMimeType.HTML,
1087
+ KilnMimeType.MD,
1088
+ # images
1089
+ KilnMimeType.JPG,
1090
+ KilnMimeType.PNG,
1091
+ ],
944
1092
  gemini_reasoning_enabled=True,
945
1093
  ),
946
1094
  KilnModelProvider(
@@ -949,6 +1097,27 @@ built_in_models: List[KilnModel] = [
949
1097
  structured_output_mode=StructuredOutputMode.json_schema,
950
1098
  reasoning_capable=True,
951
1099
  thinking_level="medium",
1100
+ supports_doc_extraction=True,
1101
+ suggested_for_doc_extraction=True,
1102
+ multimodal_capable=True,
1103
+ multimodal_mime_types=[
1104
+ # documents
1105
+ KilnMimeType.PDF,
1106
+ KilnMimeType.CSV,
1107
+ KilnMimeType.TXT,
1108
+ KilnMimeType.HTML,
1109
+ KilnMimeType.MD,
1110
+ # images
1111
+ KilnMimeType.JPG,
1112
+ KilnMimeType.PNG,
1113
+ # audio
1114
+ KilnMimeType.MP3,
1115
+ KilnMimeType.WAV,
1116
+ KilnMimeType.OGG,
1117
+ # video
1118
+ KilnMimeType.MP4,
1119
+ KilnMimeType.MOV,
1120
+ ],
952
1121
  ),
953
1122
  KilnModelProvider(
954
1123
  name=ModelProviderName.vertex,
@@ -968,11 +1137,44 @@ built_in_models: List[KilnModel] = [
968
1137
  KilnModelProvider(
969
1138
  name=ModelProviderName.openrouter,
970
1139
  model_id="google/gemini-2.0-flash-001",
1140
+ supports_doc_extraction=True,
1141
+ multimodal_capable=True,
1142
+ multimodal_mime_types=[
1143
+ # documents
1144
+ KilnMimeType.PDF,
1145
+ KilnMimeType.CSV,
1146
+ KilnMimeType.TXT,
1147
+ KilnMimeType.HTML,
1148
+ KilnMimeType.MD,
1149
+ # images
1150
+ KilnMimeType.JPG,
1151
+ KilnMimeType.PNG,
1152
+ ],
971
1153
  structured_output_mode=StructuredOutputMode.json_schema,
972
1154
  ),
973
1155
  KilnModelProvider(
974
1156
  name=ModelProviderName.gemini_api,
975
1157
  model_id="gemini-2.0-flash",
1158
+ supports_doc_extraction=True,
1159
+ multimodal_capable=True,
1160
+ multimodal_mime_types=[
1161
+ # documents
1162
+ KilnMimeType.PDF,
1163
+ KilnMimeType.CSV,
1164
+ KilnMimeType.TXT,
1165
+ KilnMimeType.HTML,
1166
+ KilnMimeType.MD,
1167
+ # images
1168
+ KilnMimeType.JPG,
1169
+ KilnMimeType.PNG,
1170
+ # audio
1171
+ KilnMimeType.MP3,
1172
+ KilnMimeType.WAV,
1173
+ KilnMimeType.OGG,
1174
+ # video
1175
+ KilnMimeType.MP4,
1176
+ KilnMimeType.MOV,
1177
+ ],
976
1178
  structured_output_mode=StructuredOutputMode.json_schema,
977
1179
  ),
978
1180
  KilnModelProvider(
@@ -992,11 +1194,44 @@ built_in_models: List[KilnModel] = [
992
1194
  KilnModelProvider(
993
1195
  name=ModelProviderName.openrouter,
994
1196
  model_id="google/gemini-2.0-flash-lite-001",
1197
+ supports_doc_extraction=True,
1198
+ multimodal_capable=True,
1199
+ multimodal_mime_types=[
1200
+ # documents
1201
+ KilnMimeType.PDF,
1202
+ KilnMimeType.CSV,
1203
+ KilnMimeType.TXT,
1204
+ KilnMimeType.HTML,
1205
+ KilnMimeType.MD,
1206
+ # images
1207
+ KilnMimeType.JPG,
1208
+ KilnMimeType.PNG,
1209
+ ],
995
1210
  structured_output_mode=StructuredOutputMode.json_schema,
996
1211
  ),
997
1212
  KilnModelProvider(
998
1213
  name=ModelProviderName.gemini_api,
999
1214
  model_id="gemini-2.0-flash-lite",
1215
+ supports_doc_extraction=True,
1216
+ multimodal_capable=True,
1217
+ multimodal_mime_types=[
1218
+ # documents
1219
+ KilnMimeType.PDF,
1220
+ KilnMimeType.CSV,
1221
+ KilnMimeType.TXT,
1222
+ KilnMimeType.HTML,
1223
+ KilnMimeType.MD,
1224
+ # images
1225
+ KilnMimeType.JPG,
1226
+ KilnMimeType.PNG,
1227
+ # audio
1228
+ KilnMimeType.MP3,
1229
+ KilnMimeType.WAV,
1230
+ KilnMimeType.OGG,
1231
+ # video
1232
+ KilnMimeType.MP4,
1233
+ KilnMimeType.MOV,
1234
+ ],
1000
1235
  structured_output_mode=StructuredOutputMode.json_schema,
1001
1236
  ),
1002
1237
  KilnModelProvider(
@@ -1084,6 +1319,7 @@ built_in_models: List[KilnModel] = [
1084
1319
  supports_structured_output=False,
1085
1320
  supports_data_gen=False,
1086
1321
  model_id="nvidia/llama-3.1-nemotron-70b-instruct",
1322
+ supports_function_calling=False,
1087
1323
  ),
1088
1324
  ],
1089
1325
  ),
@@ -1097,16 +1333,19 @@ built_in_models: List[KilnModel] = [
1097
1333
  name=ModelProviderName.openrouter,
1098
1334
  model_id="meta-llama/llama-4-maverick",
1099
1335
  structured_output_mode=StructuredOutputMode.json_schema,
1336
+ supports_function_calling=False,
1100
1337
  ),
1101
1338
  KilnModelProvider(
1102
1339
  name=ModelProviderName.fireworks_ai,
1103
1340
  model_id="accounts/fireworks/models/llama4-maverick-instruct-basic",
1104
1341
  structured_output_mode=StructuredOutputMode.json_schema,
1342
+ supports_function_calling=False,
1105
1343
  ),
1106
1344
  KilnModelProvider(
1107
1345
  name=ModelProviderName.together_ai,
1108
1346
  model_id="meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
1109
1347
  structured_output_mode=StructuredOutputMode.json_schema,
1348
+ supports_function_calling=False,
1110
1349
  ),
1111
1350
  KilnModelProvider(
1112
1351
  name=ModelProviderName.cerebras,
@@ -1125,16 +1364,19 @@ built_in_models: List[KilnModel] = [
1125
1364
  name=ModelProviderName.openrouter,
1126
1365
  model_id="meta-llama/llama-4-scout",
1127
1366
  structured_output_mode=StructuredOutputMode.json_schema,
1367
+ supports_function_calling=False,
1128
1368
  ),
1129
1369
  KilnModelProvider(
1130
1370
  name=ModelProviderName.fireworks_ai,
1131
1371
  model_id="accounts/fireworks/models/llama4-scout-instruct-basic",
1132
1372
  structured_output_mode=StructuredOutputMode.json_schema,
1373
+ supports_function_calling=False,
1133
1374
  ),
1134
1375
  KilnModelProvider(
1135
1376
  name=ModelProviderName.together_ai,
1136
1377
  model_id="meta-llama/Llama-4-Scout-17B-16E-Instruct",
1137
1378
  structured_output_mode=StructuredOutputMode.json_schema,
1379
+ supports_function_calling=False,
1138
1380
  ),
1139
1381
  KilnModelProvider(
1140
1382
  name=ModelProviderName.cerebras,
@@ -1152,24 +1394,28 @@ built_in_models: List[KilnModel] = [
1152
1394
  KilnModelProvider(
1153
1395
  name=ModelProviderName.groq,
1154
1396
  model_id="llama-3.1-8b-instant",
1397
+ supports_function_calling=False,
1155
1398
  ),
1156
1399
  KilnModelProvider(
1157
1400
  name=ModelProviderName.amazon_bedrock,
1158
1401
  structured_output_mode=StructuredOutputMode.json_schema,
1159
1402
  supports_structured_output=False,
1160
1403
  model_id="meta.llama3-1-8b-instruct-v1:0",
1404
+ supports_function_calling=False,
1161
1405
  ),
1162
1406
  KilnModelProvider(
1163
1407
  name=ModelProviderName.ollama,
1164
1408
  structured_output_mode=StructuredOutputMode.json_schema,
1165
1409
  model_id="llama3.1:8b",
1166
1410
  ollama_model_aliases=["llama3.1"], # 8b is default
1411
+ supports_function_calling=False,
1167
1412
  ),
1168
1413
  KilnModelProvider(
1169
1414
  name=ModelProviderName.openrouter,
1170
1415
  supports_data_gen=False,
1171
1416
  structured_output_mode=StructuredOutputMode.function_calling,
1172
1417
  model_id="meta-llama/llama-3.1-8b-instruct",
1418
+ supports_function_calling=False,
1173
1419
  ),
1174
1420
  KilnModelProvider(
1175
1421
  name=ModelProviderName.fireworks_ai,
@@ -1177,6 +1423,7 @@ built_in_models: List[KilnModel] = [
1177
1423
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1178
1424
  supports_data_gen=False,
1179
1425
  model_id="accounts/fireworks/models/llama-v3p1-8b-instruct",
1426
+ supports_function_calling=False,
1180
1427
  ),
1181
1428
  KilnModelProvider(
1182
1429
  name=ModelProviderName.together_ai,
@@ -1184,6 +1431,7 @@ built_in_models: List[KilnModel] = [
1184
1431
  supports_data_gen=False,
1185
1432
  structured_output_mode=StructuredOutputMode.function_calling_weak,
1186
1433
  provider_finetune_id="meta-llama/Meta-Llama-3.1-8B-Instruct-Reference",
1434
+ # Constrained decode? They make function calling work when no one else does!
1187
1435
  ),
1188
1436
  KilnModelProvider(
1189
1437
  name=ModelProviderName.cerebras,
@@ -1191,6 +1439,13 @@ built_in_models: List[KilnModel] = [
1191
1439
  structured_output_mode=StructuredOutputMode.function_calling,
1192
1440
  supports_data_gen=False,
1193
1441
  suggested_for_evals=False,
1442
+ supports_function_calling=False,
1443
+ ),
1444
+ KilnModelProvider(
1445
+ name=ModelProviderName.docker_model_runner,
1446
+ structured_output_mode=StructuredOutputMode.json_schema,
1447
+ model_id="ai/llama3.1:8B-Q4_K_M",
1448
+ supports_function_calling=False,
1194
1449
  ),
1195
1450
  ],
1196
1451
  ),
@@ -1205,6 +1460,7 @@ built_in_models: List[KilnModel] = [
1205
1460
  structured_output_mode=StructuredOutputMode.json_schema,
1206
1461
  supports_data_gen=False,
1207
1462
  model_id="meta.llama3-1-70b-instruct-v1:0",
1463
+ supports_function_calling=False,
1208
1464
  ),
1209
1465
  KilnModelProvider(
1210
1466
  name=ModelProviderName.openrouter,
@@ -1213,11 +1469,13 @@ built_in_models: List[KilnModel] = [
1213
1469
  model_id="meta-llama/llama-3.1-70b-instruct",
1214
1470
  supports_logprobs=True,
1215
1471
  logprobs_openrouter_options=True,
1472
+ supports_function_calling=False,
1216
1473
  ),
1217
1474
  KilnModelProvider(
1218
1475
  name=ModelProviderName.ollama,
1219
1476
  structured_output_mode=StructuredOutputMode.json_schema,
1220
1477
  model_id="llama3.1:70b",
1478
+ supports_function_calling=False,
1221
1479
  ),
1222
1480
  KilnModelProvider(
1223
1481
  name=ModelProviderName.fireworks_ai,
@@ -1255,6 +1513,7 @@ built_in_models: List[KilnModel] = [
1255
1513
  name=ModelProviderName.openrouter,
1256
1514
  structured_output_mode=StructuredOutputMode.function_calling,
1257
1515
  model_id="meta-llama/llama-3.1-405b-instruct",
1516
+ supports_function_calling=False, # Not reliable
1258
1517
  ),
1259
1518
  KilnModelProvider(
1260
1519
  name=ModelProviderName.fireworks_ai,
@@ -1307,6 +1566,12 @@ built_in_models: List[KilnModel] = [
1307
1566
  name=ModelProviderName.openrouter,
1308
1567
  model_id="mistralai/mistral-nemo",
1309
1568
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1569
+ supports_function_calling=False, # Not reliable
1570
+ ),
1571
+ KilnModelProvider(
1572
+ name=ModelProviderName.docker_model_runner,
1573
+ model_id="ai/mistral-nemo:12B-Q4_K_M",
1574
+ structured_output_mode=StructuredOutputMode.json_schema,
1310
1575
  ),
1311
1576
  ],
1312
1577
  ),
@@ -1351,12 +1616,21 @@ built_in_models: List[KilnModel] = [
1351
1616
  supports_data_gen=False,
1352
1617
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1353
1618
  model_id="meta-llama/llama-3.2-1b-instruct",
1619
+ supports_function_calling=False,
1354
1620
  ),
1355
1621
  KilnModelProvider(
1356
1622
  name=ModelProviderName.ollama,
1357
1623
  supports_structured_output=False,
1358
1624
  supports_data_gen=False,
1359
1625
  model_id="llama3.2:1b",
1626
+ supports_function_calling=False,
1627
+ ),
1628
+ KilnModelProvider(
1629
+ name=ModelProviderName.docker_model_runner,
1630
+ supports_structured_output=False,
1631
+ supports_data_gen=False,
1632
+ model_id="ai/llama3.2:1B-F16",
1633
+ supports_function_calling=False,
1360
1634
  ),
1361
1635
  ],
1362
1636
  ),
@@ -1372,11 +1646,13 @@ built_in_models: List[KilnModel] = [
1372
1646
  supports_data_gen=False,
1373
1647
  structured_output_mode=StructuredOutputMode.json_schema,
1374
1648
  model_id="meta-llama/llama-3.2-3b-instruct",
1649
+ supports_function_calling=False,
1375
1650
  ),
1376
1651
  KilnModelProvider(
1377
1652
  name=ModelProviderName.ollama,
1378
1653
  supports_data_gen=False,
1379
1654
  model_id="llama3.2",
1655
+ supports_function_calling=False,
1380
1656
  ),
1381
1657
  KilnModelProvider(
1382
1658
  name=ModelProviderName.together_ai,
@@ -1384,6 +1660,13 @@ built_in_models: List[KilnModel] = [
1384
1660
  supports_structured_output=False,
1385
1661
  supports_data_gen=False,
1386
1662
  ),
1663
+ KilnModelProvider(
1664
+ name=ModelProviderName.docker_model_runner,
1665
+ model_id="ai/llama3.2:3B-Q4_K_M",
1666
+ structured_output_mode=StructuredOutputMode.json_schema,
1667
+ supports_data_gen=False,
1668
+ supports_function_calling=False,
1669
+ ),
1387
1670
  ],
1388
1671
  ),
1389
1672
  # Llama 3.2 11B
@@ -1399,17 +1682,20 @@ built_in_models: List[KilnModel] = [
1399
1682
  supports_structured_output=False,
1400
1683
  supports_data_gen=False,
1401
1684
  model_id="meta-llama/llama-3.2-11b-vision-instruct",
1685
+ supports_function_calling=False,
1402
1686
  ),
1403
1687
  KilnModelProvider(
1404
1688
  name=ModelProviderName.ollama,
1405
1689
  structured_output_mode=StructuredOutputMode.json_schema,
1406
1690
  model_id="llama3.2-vision",
1691
+ supports_function_calling=False,
1407
1692
  ),
1408
1693
  KilnModelProvider(
1409
1694
  name=ModelProviderName.together_ai,
1410
1695
  model_id="meta-llama/Llama-3.2-11B-Vision-Instruct-Turbo",
1411
1696
  supports_structured_output=False,
1412
1697
  supports_data_gen=False,
1698
+ supports_function_calling=False, # weird 3b works and 11b doesn't but... vision?
1413
1699
  ),
1414
1700
  ],
1415
1701
  ),
@@ -1423,17 +1709,20 @@ built_in_models: List[KilnModel] = [
1423
1709
  name=ModelProviderName.openrouter,
1424
1710
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1425
1711
  model_id="meta-llama/llama-3.2-90b-vision-instruct",
1712
+ supports_function_calling=False,
1426
1713
  ),
1427
1714
  KilnModelProvider(
1428
1715
  name=ModelProviderName.ollama,
1429
1716
  structured_output_mode=StructuredOutputMode.json_schema,
1430
1717
  model_id="llama3.2-vision:90b",
1718
+ supports_function_calling=False,
1431
1719
  ),
1432
1720
  KilnModelProvider(
1433
1721
  name=ModelProviderName.together_ai,
1434
1722
  model_id="meta-llama/Llama-3.2-90B-Vision-Instruct-Turbo",
1435
1723
  supports_structured_output=False,
1436
1724
  supports_data_gen=False,
1725
+ supports_function_calling=False,
1437
1726
  ),
1438
1727
  ],
1439
1728
  ),
@@ -1450,23 +1739,27 @@ built_in_models: List[KilnModel] = [
1450
1739
  # Openrouter not working with json_schema or tools. JSON_schema sometimes works so force that, but not consistently so still not recommended.
1451
1740
  supports_structured_output=False,
1452
1741
  supports_data_gen=False,
1742
+ supports_function_calling=False,
1453
1743
  ),
1454
1744
  KilnModelProvider(
1455
1745
  name=ModelProviderName.groq,
1456
1746
  supports_structured_output=True,
1457
1747
  supports_data_gen=True,
1458
1748
  model_id="llama-3.3-70b-versatile",
1749
+ supports_function_calling=False,
1459
1750
  ),
1460
1751
  KilnModelProvider(
1461
1752
  name=ModelProviderName.ollama,
1462
1753
  structured_output_mode=StructuredOutputMode.json_schema,
1463
1754
  model_id="llama3.3",
1755
+ supports_function_calling=False,
1464
1756
  ),
1465
1757
  KilnModelProvider(
1466
1758
  name=ModelProviderName.fireworks_ai,
1467
1759
  # Tool calling forces schema -- fireworks doesn't support json_schema, just json_mode
1468
1760
  structured_output_mode=StructuredOutputMode.function_calling_weak,
1469
1761
  model_id="accounts/fireworks/models/llama-v3p3-70b-instruct",
1762
+ supports_function_calling=False,
1470
1763
  ),
1471
1764
  KilnModelProvider(
1472
1765
  name=ModelProviderName.vertex,
@@ -1474,11 +1767,19 @@ built_in_models: List[KilnModel] = [
1474
1767
  # Doesn't work yet; needs debugging
1475
1768
  supports_structured_output=False,
1476
1769
  supports_data_gen=False,
1770
+ supports_function_calling=False,
1477
1771
  ),
1478
1772
  KilnModelProvider(
1479
1773
  name=ModelProviderName.together_ai,
1480
1774
  model_id="meta-llama/Llama-3.3-70B-Instruct-Turbo",
1481
1775
  structured_output_mode=StructuredOutputMode.function_calling_weak,
1776
+ # Tools work. Probably constrained decode? Nice
1777
+ ),
1778
+ KilnModelProvider(
1779
+ name=ModelProviderName.docker_model_runner,
1780
+ structured_output_mode=StructuredOutputMode.json_schema,
1781
+ model_id="ai/llama3.3:70B-Q4_K_M",
1782
+ supports_function_calling=False,
1482
1783
  ),
1483
1784
  ],
1484
1785
  ),
@@ -1494,6 +1795,7 @@ built_in_models: List[KilnModel] = [
1494
1795
  supports_structured_output=False,
1495
1796
  supports_data_gen=False,
1496
1797
  model_id="phi3.5",
1798
+ supports_function_calling=False,
1497
1799
  ),
1498
1800
  KilnModelProvider(
1499
1801
  name=ModelProviderName.openrouter,
@@ -1501,6 +1803,7 @@ built_in_models: List[KilnModel] = [
1501
1803
  supports_data_gen=False,
1502
1804
  model_id="microsoft/phi-3.5-mini-128k-instruct",
1503
1805
  structured_output_mode=StructuredOutputMode.json_schema,
1806
+ supports_function_calling=False,
1504
1807
  ),
1505
1808
  ],
1506
1809
  ),
@@ -1514,6 +1817,7 @@ built_in_models: List[KilnModel] = [
1514
1817
  name=ModelProviderName.ollama,
1515
1818
  structured_output_mode=StructuredOutputMode.json_schema,
1516
1819
  model_id="phi4",
1820
+ supports_function_calling=False,
1517
1821
  ),
1518
1822
  KilnModelProvider(
1519
1823
  name=ModelProviderName.openrouter,
@@ -1521,6 +1825,13 @@ built_in_models: List[KilnModel] = [
1521
1825
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1522
1826
  supports_data_gen=False,
1523
1827
  model_id="microsoft/phi-4",
1828
+ supports_function_calling=False,
1829
+ ),
1830
+ KilnModelProvider(
1831
+ name=ModelProviderName.docker_model_runner,
1832
+ structured_output_mode=StructuredOutputMode.json_schema,
1833
+ model_id="ai/phi4:14B-Q4_K_M",
1834
+ supports_function_calling=False,
1524
1835
  ),
1525
1836
  ],
1526
1837
  ),
@@ -1535,6 +1846,7 @@ built_in_models: List[KilnModel] = [
1535
1846
  model_id="microsoft/phi-4-multimodal-instruct",
1536
1847
  supports_structured_output=False,
1537
1848
  supports_data_gen=False,
1849
+ supports_function_calling=False,
1538
1850
  ),
1539
1851
  ],
1540
1852
  ),
@@ -1547,6 +1859,7 @@ built_in_models: List[KilnModel] = [
1547
1859
  KilnModelProvider(
1548
1860
  name=ModelProviderName.ollama,
1549
1861
  model_id="phi4-mini",
1862
+ supports_function_calling=False,
1550
1863
  ),
1551
1864
  ],
1552
1865
  ),
@@ -1560,6 +1873,7 @@ built_in_models: List[KilnModel] = [
1560
1873
  name=ModelProviderName.ollama,
1561
1874
  supports_data_gen=False,
1562
1875
  model_id="gemma2:2b",
1876
+ supports_function_calling=False,
1563
1877
  ),
1564
1878
  ],
1565
1879
  ),
@@ -1573,6 +1887,7 @@ built_in_models: List[KilnModel] = [
1573
1887
  name=ModelProviderName.ollama,
1574
1888
  supports_data_gen=False,
1575
1889
  model_id="gemma2:9b",
1890
+ supports_function_calling=False,
1576
1891
  ),
1577
1892
  KilnModelProvider(
1578
1893
  name=ModelProviderName.openrouter,
@@ -1581,6 +1896,7 @@ built_in_models: List[KilnModel] = [
1581
1896
  supports_structured_output=False,
1582
1897
  supports_data_gen=False,
1583
1898
  model_id="google/gemma-2-9b-it",
1899
+ supports_function_calling=False,
1584
1900
  ),
1585
1901
  # fireworks AI errors - not allowing system role. Exclude until resolved.
1586
1902
  ],
@@ -1595,15 +1911,32 @@ built_in_models: List[KilnModel] = [
1595
1911
  name=ModelProviderName.ollama,
1596
1912
  supports_data_gen=False,
1597
1913
  model_id="gemma2:27b",
1914
+ supports_function_calling=False,
1598
1915
  ),
1599
1916
  KilnModelProvider(
1600
1917
  name=ModelProviderName.openrouter,
1601
1918
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1602
1919
  supports_data_gen=False,
1603
1920
  model_id="google/gemma-2-27b-it",
1921
+ supports_function_calling=False,
1604
1922
  ),
1605
1923
  ],
1606
1924
  ),
1925
+ # Gemma 3 270M
1926
+ KilnModel(
1927
+ family=ModelFamily.gemma,
1928
+ name=ModelName.gemma_3_0p27b,
1929
+ friendly_name="Gemma 3 270M",
1930
+ providers=[
1931
+ KilnModelProvider(
1932
+ name=ModelProviderName.docker_model_runner,
1933
+ model_id="ai/gemma3:270M-F16",
1934
+ supports_structured_output=False,
1935
+ supports_data_gen=False,
1936
+ supports_function_calling=False,
1937
+ )
1938
+ ],
1939
+ ),
1607
1940
  # Gemma 3 1B
1608
1941
  KilnModel(
1609
1942
  family=ModelFamily.gemma,
@@ -1615,6 +1948,14 @@ built_in_models: List[KilnModel] = [
1615
1948
  model_id="gemma3:1b",
1616
1949
  supports_structured_output=False,
1617
1950
  supports_data_gen=False,
1951
+ supports_function_calling=False,
1952
+ ),
1953
+ KilnModelProvider(
1954
+ name=ModelProviderName.docker_model_runner,
1955
+ model_id="ai/gemma3:1B-F16",
1956
+ supports_structured_output=False,
1957
+ supports_data_gen=False,
1958
+ supports_function_calling=False,
1618
1959
  ),
1619
1960
  ],
1620
1961
  ),
@@ -1628,11 +1969,18 @@ built_in_models: List[KilnModel] = [
1628
1969
  name=ModelProviderName.ollama,
1629
1970
  model_id="gemma3:4b",
1630
1971
  ollama_model_aliases=["gemma3"],
1972
+ supports_function_calling=False,
1631
1973
  ),
1632
1974
  KilnModelProvider(
1633
1975
  name=ModelProviderName.openrouter,
1634
1976
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1635
1977
  model_id="google/gemma-3-4b-it",
1978
+ supports_function_calling=False,
1979
+ ),
1980
+ KilnModelProvider(
1981
+ name=ModelProviderName.docker_model_runner,
1982
+ model_id="ai/gemma3:4B-Q4_K_M",
1983
+ supports_function_calling=False,
1636
1984
  ),
1637
1985
  ],
1638
1986
  ),
@@ -1645,11 +1993,13 @@ built_in_models: List[KilnModel] = [
1645
1993
  KilnModelProvider(
1646
1994
  name=ModelProviderName.ollama,
1647
1995
  model_id="gemma3:12b",
1996
+ supports_function_calling=False,
1648
1997
  ),
1649
1998
  KilnModelProvider(
1650
1999
  name=ModelProviderName.openrouter,
1651
2000
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1652
2001
  model_id="google/gemma-3-12b-it",
2002
+ supports_function_calling=False,
1653
2003
  ),
1654
2004
  ],
1655
2005
  ),
@@ -1662,11 +2012,13 @@ built_in_models: List[KilnModel] = [
1662
2012
  KilnModelProvider(
1663
2013
  name=ModelProviderName.ollama,
1664
2014
  model_id="gemma3:27b",
2015
+ supports_function_calling=False,
1665
2016
  ),
1666
2017
  KilnModelProvider(
1667
2018
  name=ModelProviderName.openrouter,
1668
2019
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1669
2020
  model_id="google/gemma-3-27b-it",
2021
+ supports_function_calling=False,
1670
2022
  ),
1671
2023
  ],
1672
2024
  ),
@@ -1681,12 +2033,14 @@ built_in_models: List[KilnModel] = [
1681
2033
  model_id="gemma3n:e2b",
1682
2034
  structured_output_mode=StructuredOutputMode.json_schema,
1683
2035
  supports_data_gen=False,
2036
+ supports_function_calling=False,
1684
2037
  ),
1685
2038
  KilnModelProvider(
1686
2039
  name=ModelProviderName.gemini_api,
1687
2040
  model_id="gemma-3n-e2b-it",
1688
2041
  supports_structured_output=False,
1689
2042
  supports_data_gen=False,
2043
+ supports_function_calling=False,
1690
2044
  ),
1691
2045
  ],
1692
2046
  ),
@@ -1701,18 +2055,28 @@ built_in_models: List[KilnModel] = [
1701
2055
  model_id="google/gemma-3n-e4b-it",
1702
2056
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1703
2057
  supports_data_gen=False,
2058
+ supports_function_calling=False,
1704
2059
  ),
1705
2060
  KilnModelProvider(
1706
2061
  name=ModelProviderName.ollama,
1707
2062
  model_id="gemma3n:e4b",
1708
2063
  supports_data_gen=False,
1709
2064
  structured_output_mode=StructuredOutputMode.json_schema,
2065
+ supports_function_calling=False,
1710
2066
  ),
1711
2067
  KilnModelProvider(
1712
2068
  name=ModelProviderName.gemini_api,
1713
2069
  model_id="gemma-3n-e4b-it",
1714
2070
  structured_output_mode=StructuredOutputMode.json_instructions,
1715
2071
  supports_data_gen=False,
2072
+ supports_function_calling=False,
2073
+ ),
2074
+ KilnModelProvider(
2075
+ name=ModelProviderName.docker_model_runner,
2076
+ model_id="ai/gemma3n:4B-Q4_K_M",
2077
+ supports_data_gen=False,
2078
+ structured_output_mode=StructuredOutputMode.json_schema,
2079
+ supports_function_calling=False,
1716
2080
  ),
1717
2081
  ],
1718
2082
  ),
@@ -1727,10 +2091,12 @@ built_in_models: List[KilnModel] = [
1727
2091
  model_id="mistralai/mixtral-8x7b-instruct",
1728
2092
  supports_data_gen=False,
1729
2093
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2094
+ supports_function_calling=False,
1730
2095
  ),
1731
2096
  KilnModelProvider(
1732
2097
  name=ModelProviderName.ollama,
1733
2098
  model_id="mixtral",
2099
+ supports_function_calling=False,
1734
2100
  ),
1735
2101
  ],
1736
2102
  ),
@@ -1748,13 +2114,7 @@ built_in_models: List[KilnModel] = [
1748
2114
  r1_openrouter_options=True,
1749
2115
  structured_output_mode=StructuredOutputMode.json_instructions,
1750
2116
  parser=ModelParserID.r1_thinking,
1751
- ),
1752
- KilnModelProvider(
1753
- name=ModelProviderName.fireworks_ai,
1754
- model_id="accounts/fireworks/models/qwq-32b",
1755
- reasoning_capable=True,
1756
- parser=ModelParserID.r1_thinking,
1757
- structured_output_mode=StructuredOutputMode.json_instructions,
2117
+ supports_function_calling=False,
1758
2118
  ),
1759
2119
  KilnModelProvider(
1760
2120
  name=ModelProviderName.ollama,
@@ -1762,6 +2122,7 @@ built_in_models: List[KilnModel] = [
1762
2122
  reasoning_capable=True,
1763
2123
  parser=ModelParserID.r1_thinking,
1764
2124
  structured_output_mode=StructuredOutputMode.json_instructions,
2125
+ supports_function_calling=False,
1765
2126
  ),
1766
2127
  KilnModelProvider(
1767
2128
  name=ModelProviderName.together_ai,
@@ -1769,6 +2130,7 @@ built_in_models: List[KilnModel] = [
1769
2130
  structured_output_mode=StructuredOutputMode.json_instructions,
1770
2131
  parser=ModelParserID.r1_thinking,
1771
2132
  reasoning_capable=True,
2133
+ supports_function_calling=False,
1772
2134
  ),
1773
2135
  KilnModelProvider(
1774
2136
  name=ModelProviderName.siliconflow_cn,
@@ -1776,6 +2138,14 @@ built_in_models: List[KilnModel] = [
1776
2138
  structured_output_mode=StructuredOutputMode.json_instructions,
1777
2139
  reasoning_capable=True,
1778
2140
  ),
2141
+ KilnModelProvider(
2142
+ name=ModelProviderName.docker_model_runner,
2143
+ model_id="ai/qwq:32B-Q4_K_M",
2144
+ reasoning_capable=True,
2145
+ parser=ModelParserID.r1_thinking,
2146
+ structured_output_mode=StructuredOutputMode.json_instructions,
2147
+ supports_function_calling=False,
2148
+ ),
1779
2149
  ],
1780
2150
  ),
1781
2151
  # Qwen 2.5 7B
@@ -1788,10 +2158,17 @@ built_in_models: List[KilnModel] = [
1788
2158
  name=ModelProviderName.openrouter,
1789
2159
  model_id="qwen/qwen-2.5-7b-instruct",
1790
2160
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2161
+ supports_function_calling=False,
1791
2162
  ),
1792
2163
  KilnModelProvider(
1793
2164
  name=ModelProviderName.ollama,
1794
2165
  model_id="qwen2.5",
2166
+ supports_function_calling=False,
2167
+ ),
2168
+ KilnModelProvider(
2169
+ name=ModelProviderName.docker_model_runner,
2170
+ model_id="ai/qwen2.5:7B-Q4_K_M",
2171
+ supports_function_calling=False,
1795
2172
  ),
1796
2173
  ],
1797
2174
  ),
@@ -1809,6 +2186,7 @@ built_in_models: List[KilnModel] = [
1809
2186
  name=ModelProviderName.ollama,
1810
2187
  model_id="qwen2.5:14b",
1811
2188
  supports_data_gen=False,
2189
+ supports_function_calling=False,
1812
2190
  ),
1813
2191
  ],
1814
2192
  ),
@@ -1830,12 +2208,6 @@ built_in_models: List[KilnModel] = [
1830
2208
  name=ModelProviderName.ollama,
1831
2209
  model_id="qwen2.5:72b",
1832
2210
  ),
1833
- KilnModelProvider(
1834
- name=ModelProviderName.fireworks_ai,
1835
- model_id="accounts/fireworks/models/qwen2p5-72b-instruct",
1836
- # Tool calling forces schema -- fireworks doesn't support json_schema, just json_mode
1837
- structured_output_mode=StructuredOutputMode.function_calling_weak,
1838
- ),
1839
2211
  KilnModelProvider(
1840
2212
  name=ModelProviderName.together_ai,
1841
2213
  provider_finetune_id="Qwen/Qwen2.5-72B-Instruct",
@@ -1853,11 +2225,13 @@ built_in_models: List[KilnModel] = [
1853
2225
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1854
2226
  model_id="mistralai/mistral-small-24b-instruct-2501",
1855
2227
  uncensored=True,
2228
+ supports_function_calling=False,
1856
2229
  ),
1857
2230
  KilnModelProvider(
1858
2231
  name=ModelProviderName.ollama,
1859
2232
  model_id="mistral-small:24b",
1860
2233
  uncensored=True,
2234
+ supports_function_calling=False,
1861
2235
  ),
1862
2236
  ],
1863
2237
  ),
@@ -1892,6 +2266,7 @@ built_in_models: List[KilnModel] = [
1892
2266
  parser=ModelParserID.r1_thinking,
1893
2267
  reasoning_capable=True,
1894
2268
  supports_data_gen=True,
2269
+ supports_function_calling=False,
1895
2270
  ),
1896
2271
  KilnModelProvider(
1897
2272
  name=ModelProviderName.siliconflow_cn,
@@ -1900,6 +2275,7 @@ built_in_models: List[KilnModel] = [
1900
2275
  structured_output_mode=StructuredOutputMode.json_instructions,
1901
2276
  reasoning_capable=True,
1902
2277
  supports_data_gen=True,
2278
+ supports_function_calling=False,
1903
2279
  ),
1904
2280
  ],
1905
2281
  ),
@@ -1916,6 +2292,7 @@ built_in_models: List[KilnModel] = [
1916
2292
  reasoning_capable=True,
1917
2293
  r1_openrouter_options=True,
1918
2294
  require_openrouter_reasoning=True,
2295
+ supports_function_calling=False,
1919
2296
  ),
1920
2297
  KilnModelProvider(
1921
2298
  name=ModelProviderName.siliconflow_cn,
@@ -1924,6 +2301,33 @@ built_in_models: List[KilnModel] = [
1924
2301
  reasoning_capable=True,
1925
2302
  reasoning_optional_for_structured_output=True,
1926
2303
  supports_data_gen=False,
2304
+ supports_function_calling=False,
2305
+ ),
2306
+ ],
2307
+ ),
2308
+ # DeepSeek 3.1
2309
+ KilnModel(
2310
+ family=ModelFamily.deepseek,
2311
+ name=ModelName.deepseek_3_1,
2312
+ friendly_name="DeepSeek 3.1",
2313
+ providers=[
2314
+ KilnModelProvider(
2315
+ name=ModelProviderName.openrouter,
2316
+ model_id="deepseek/deepseek-chat-v3.1",
2317
+ structured_output_mode=StructuredOutputMode.json_schema,
2318
+ supports_data_gen=True,
2319
+ ),
2320
+ KilnModelProvider(
2321
+ name=ModelProviderName.fireworks_ai,
2322
+ model_id="accounts/fireworks/models/deepseek-v3p1",
2323
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2324
+ supports_data_gen=True,
2325
+ ),
2326
+ KilnModelProvider(
2327
+ name=ModelProviderName.siliconflow_cn,
2328
+ model_id="Pro/deepseek-ai/DeepSeek-V3.1",
2329
+ structured_output_mode=StructuredOutputMode.json_schema,
2330
+ supports_data_gen=True,
1927
2331
  ),
1928
2332
  ],
1929
2333
  ),
@@ -1978,6 +2382,7 @@ built_in_models: List[KilnModel] = [
1978
2382
  parser=ModelParserID.r1_thinking,
1979
2383
  structured_output_mode=StructuredOutputMode.json_instructions,
1980
2384
  reasoning_capable=True,
2385
+ supports_function_calling=False,
1981
2386
  ),
1982
2387
  KilnModelProvider(
1983
2388
  # I want your RAM
@@ -2003,6 +2408,7 @@ built_in_models: List[KilnModel] = [
2003
2408
  r1_openrouter_options=True,
2004
2409
  parser=ModelParserID.r1_thinking,
2005
2410
  require_openrouter_reasoning=True,
2411
+ supports_function_calling=False,
2006
2412
  ),
2007
2413
  KilnModelProvider(
2008
2414
  name=ModelProviderName.ollama,
@@ -2010,12 +2416,14 @@ built_in_models: List[KilnModel] = [
2010
2416
  reasoning_capable=True,
2011
2417
  structured_output_mode=StructuredOutputMode.json_instructions,
2012
2418
  model_id="deepseek-r1:32b",
2419
+ supports_function_calling=False,
2013
2420
  ),
2014
2421
  KilnModelProvider(
2015
2422
  name=ModelProviderName.siliconflow_cn,
2016
2423
  model_id="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
2017
2424
  structured_output_mode=StructuredOutputMode.json_schema,
2018
2425
  reasoning_capable=True,
2426
+ supports_function_calling=False,
2019
2427
  reasoning_optional_for_structured_output=True,
2020
2428
  ),
2021
2429
  ],
@@ -2034,6 +2442,7 @@ built_in_models: List[KilnModel] = [
2034
2442
  r1_openrouter_options=True,
2035
2443
  require_openrouter_reasoning=True,
2036
2444
  parser=ModelParserID.r1_thinking,
2445
+ supports_function_calling=False,
2037
2446
  ),
2038
2447
  KilnModelProvider(
2039
2448
  name=ModelProviderName.ollama,
@@ -2042,12 +2451,23 @@ built_in_models: List[KilnModel] = [
2042
2451
  reasoning_capable=True,
2043
2452
  structured_output_mode=StructuredOutputMode.json_instructions,
2044
2453
  model_id="deepseek-r1:70b",
2454
+ supports_function_calling=False,
2045
2455
  ),
2046
2456
  KilnModelProvider(
2047
2457
  name=ModelProviderName.together_ai,
2048
2458
  model_id="deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
2049
2459
  structured_output_mode=StructuredOutputMode.json_instructions,
2050
2460
  parser=ModelParserID.r1_thinking,
2461
+ supports_function_calling=False,
2462
+ ),
2463
+ KilnModelProvider(
2464
+ name=ModelProviderName.docker_model_runner,
2465
+ supports_data_gen=False,
2466
+ parser=ModelParserID.r1_thinking,
2467
+ reasoning_capable=True,
2468
+ structured_output_mode=StructuredOutputMode.json_instructions,
2469
+ model_id="ai/deepseek-r1-distill-llama:70B-Q4_K_M",
2470
+ supports_function_calling=False,
2051
2471
  ),
2052
2472
  ],
2053
2473
  ),
@@ -2067,6 +2487,7 @@ built_in_models: List[KilnModel] = [
2067
2487
  require_openrouter_reasoning=True,
2068
2488
  openrouter_skip_required_parameters=True,
2069
2489
  parser=ModelParserID.r1_thinking,
2490
+ supports_function_calling=False,
2070
2491
  ),
2071
2492
  KilnModelProvider(
2072
2493
  name=ModelProviderName.ollama,
@@ -2075,12 +2496,14 @@ built_in_models: List[KilnModel] = [
2075
2496
  reasoning_capable=True,
2076
2497
  structured_output_mode=StructuredOutputMode.json_instructions,
2077
2498
  model_id="deepseek-r1:14b",
2499
+ supports_function_calling=False,
2078
2500
  ),
2079
2501
  KilnModelProvider(
2080
2502
  name=ModelProviderName.together_ai,
2081
2503
  model_id="deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",
2082
2504
  structured_output_mode=StructuredOutputMode.json_instructions,
2083
2505
  parser=ModelParserID.r1_thinking,
2506
+ supports_function_calling=False,
2084
2507
  ),
2085
2508
  KilnModelProvider(
2086
2509
  name=ModelProviderName.siliconflow_cn,
@@ -2089,6 +2512,7 @@ built_in_models: List[KilnModel] = [
2089
2512
  reasoning_capable=True,
2090
2513
  reasoning_optional_for_structured_output=True,
2091
2514
  supports_data_gen=False,
2515
+ supports_function_calling=False,
2092
2516
  ),
2093
2517
  ],
2094
2518
  ),
@@ -2110,6 +2534,7 @@ built_in_models: List[KilnModel] = [
2110
2534
  require_openrouter_reasoning=True,
2111
2535
  openrouter_skip_required_parameters=True,
2112
2536
  parser=ModelParserID.r1_thinking,
2537
+ supports_function_calling=False,
2113
2538
  ),
2114
2539
  KilnModelProvider(
2115
2540
  name=ModelProviderName.ollama,
@@ -2120,6 +2545,18 @@ built_in_models: List[KilnModel] = [
2120
2545
  # Best mode, but fails to often to enable without warning
2121
2546
  structured_output_mode=StructuredOutputMode.json_instructions,
2122
2547
  model_id="deepseek-r1:8b",
2548
+ supports_function_calling=False,
2549
+ ),
2550
+ KilnModelProvider(
2551
+ name=ModelProviderName.docker_model_runner,
2552
+ supports_structured_output=False,
2553
+ supports_data_gen=False,
2554
+ parser=ModelParserID.r1_thinking,
2555
+ reasoning_capable=True,
2556
+ # Best mode, but fails to often to enable without warning
2557
+ structured_output_mode=StructuredOutputMode.json_instructions,
2558
+ model_id="ai/deepseek-r1-distill-llama:8B-Q4_K_M",
2559
+ supports_function_calling=False,
2123
2560
  ),
2124
2561
  ],
2125
2562
  ),
@@ -2139,6 +2576,7 @@ built_in_models: List[KilnModel] = [
2139
2576
  reasoning_capable=True,
2140
2577
  r1_openrouter_options=True,
2141
2578
  require_openrouter_reasoning=True,
2579
+ supports_function_calling=False,
2142
2580
  ),
2143
2581
  KilnModelProvider(
2144
2582
  name=ModelProviderName.ollama,
@@ -2149,6 +2587,7 @@ built_in_models: List[KilnModel] = [
2149
2587
  reasoning_capable=True,
2150
2588
  structured_output_mode=StructuredOutputMode.json_instructions,
2151
2589
  model_id="deepseek-r1:7b",
2590
+ supports_function_calling=False,
2152
2591
  ),
2153
2592
  KilnModelProvider(
2154
2593
  name=ModelProviderName.siliconflow_cn,
@@ -2159,6 +2598,7 @@ built_in_models: List[KilnModel] = [
2159
2598
  structured_output_mode=StructuredOutputMode.json_instructions,
2160
2599
  reasoning_capable=True,
2161
2600
  reasoning_optional_for_structured_output=True,
2601
+ supports_function_calling=False,
2162
2602
  ),
2163
2603
  ],
2164
2604
  ),
@@ -2179,6 +2619,7 @@ built_in_models: List[KilnModel] = [
2179
2619
  require_openrouter_reasoning=True,
2180
2620
  openrouter_skip_required_parameters=True,
2181
2621
  parser=ModelParserID.r1_thinking,
2622
+ supports_function_calling=False,
2182
2623
  ),
2183
2624
  KilnModelProvider(
2184
2625
  name=ModelProviderName.ollama,
@@ -2188,6 +2629,7 @@ built_in_models: List[KilnModel] = [
2188
2629
  reasoning_capable=True,
2189
2630
  structured_output_mode=StructuredOutputMode.json_instructions,
2190
2631
  model_id="deepseek-r1:1.5b",
2632
+ supports_function_calling=False,
2191
2633
  ),
2192
2634
  KilnModelProvider(
2193
2635
  name=ModelProviderName.together_ai,
@@ -2196,6 +2638,7 @@ built_in_models: List[KilnModel] = [
2196
2638
  parser=ModelParserID.r1_thinking,
2197
2639
  supports_structured_output=False,
2198
2640
  supports_data_gen=False,
2641
+ supports_function_calling=False,
2199
2642
  ),
2200
2643
  ],
2201
2644
  ),
@@ -2212,6 +2655,7 @@ built_in_models: List[KilnModel] = [
2212
2655
  model_id="dolphin-mixtral:8x22b",
2213
2656
  uncensored=True,
2214
2657
  suggested_for_uncensored_data_gen=True,
2658
+ supports_function_calling=False,
2215
2659
  ),
2216
2660
  KilnModelProvider(
2217
2661
  name=ModelProviderName.openrouter,
@@ -2220,6 +2664,7 @@ built_in_models: List[KilnModel] = [
2220
2664
  model_id="cognitivecomputations/dolphin-mixtral-8x22b",
2221
2665
  uncensored=True,
2222
2666
  suggested_for_uncensored_data_gen=True,
2667
+ supports_function_calling=False,
2223
2668
  ),
2224
2669
  ],
2225
2670
  ),
@@ -2289,6 +2734,53 @@ built_in_models: List[KilnModel] = [
2289
2734
  ),
2290
2735
  ],
2291
2736
  ),
2737
+ # Qwen 3 Next 80B A3B
2738
+ KilnModel(
2739
+ family=ModelFamily.qwen,
2740
+ name=ModelName.qwen_3_next_80b_a3b,
2741
+ friendly_name="Qwen 3 Next 80B A3B (Instruct)",
2742
+ providers=[
2743
+ KilnModelProvider(
2744
+ name=ModelProviderName.openrouter,
2745
+ model_id="qwen/qwen3-next-80b-a3b-instruct",
2746
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2747
+ supports_data_gen=True,
2748
+ supports_function_calling=True,
2749
+ ),
2750
+ ],
2751
+ ),
2752
+ # Qwen 3 Next 80B A3B (Thinking)
2753
+ KilnModel(
2754
+ family=ModelFamily.qwen,
2755
+ name=ModelName.qwen_3_next_80b_a3b_thinking,
2756
+ friendly_name="Qwen 3 Next 80B A3B (Thinking)",
2757
+ providers=[
2758
+ KilnModelProvider(
2759
+ name=ModelProviderName.openrouter,
2760
+ model_id="qwen/qwen3-next-80b-a3b-thinking",
2761
+ structured_output_mode=StructuredOutputMode.json_instructions,
2762
+ supports_data_gen=True,
2763
+ supports_function_calling=True,
2764
+ reasoning_capable=True,
2765
+ require_openrouter_reasoning=True,
2766
+ ),
2767
+ ],
2768
+ ),
2769
+ # Qwen 3 Max
2770
+ KilnModel(
2771
+ family=ModelFamily.qwen,
2772
+ name=ModelName.qwen_3_max,
2773
+ friendly_name="Qwen 3 Max",
2774
+ providers=[
2775
+ KilnModelProvider(
2776
+ name=ModelProviderName.openrouter,
2777
+ model_id="qwen/qwen3-max",
2778
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2779
+ supports_data_gen=True,
2780
+ supports_function_calling=True,
2781
+ ),
2782
+ ],
2783
+ ),
2292
2784
  # Qwen 3 0.6B
2293
2785
  KilnModel(
2294
2786
  family=ModelFamily.qwen,
@@ -2304,6 +2796,7 @@ built_in_models: List[KilnModel] = [
2304
2796
  r1_openrouter_options=True,
2305
2797
  parser=ModelParserID.r1_thinking,
2306
2798
  supports_data_gen=False,
2799
+ supports_function_calling=False,
2307
2800
  ),
2308
2801
  KilnModelProvider(
2309
2802
  name=ModelProviderName.ollama,
@@ -2311,6 +2804,15 @@ built_in_models: List[KilnModel] = [
2311
2804
  supports_data_gen=False,
2312
2805
  reasoning_capable=True,
2313
2806
  structured_output_mode=StructuredOutputMode.json_schema,
2807
+ supports_function_calling=False,
2808
+ ),
2809
+ KilnModelProvider(
2810
+ name=ModelProviderName.docker_model_runner,
2811
+ model_id="ai/qwen3:0.6B-F16",
2812
+ supports_data_gen=False,
2813
+ reasoning_capable=True,
2814
+ structured_output_mode=StructuredOutputMode.json_schema,
2815
+ supports_function_calling=False,
2314
2816
  ),
2315
2817
  ],
2316
2818
  ),
@@ -2330,6 +2832,7 @@ built_in_models: List[KilnModel] = [
2330
2832
  r1_openrouter_options=True,
2331
2833
  parser=ModelParserID.r1_thinking,
2332
2834
  supports_data_gen=False,
2835
+ supports_function_calling=False,
2333
2836
  ),
2334
2837
  KilnModelProvider(
2335
2838
  name=ModelProviderName.ollama,
@@ -2337,6 +2840,7 @@ built_in_models: List[KilnModel] = [
2337
2840
  supports_data_gen=False,
2338
2841
  reasoning_capable=True,
2339
2842
  structured_output_mode=StructuredOutputMode.json_schema,
2843
+ supports_function_calling=False,
2340
2844
  ),
2341
2845
  ],
2342
2846
  ),
@@ -2353,6 +2857,7 @@ built_in_models: List[KilnModel] = [
2353
2857
  formatter=ModelFormatterID.qwen3_style_no_think,
2354
2858
  supports_data_gen=False,
2355
2859
  parser=ModelParserID.optional_r1_thinking,
2860
+ supports_function_calling=False,
2356
2861
  ),
2357
2862
  KilnModelProvider(
2358
2863
  name=ModelProviderName.ollama,
@@ -2360,6 +2865,7 @@ built_in_models: List[KilnModel] = [
2360
2865
  formatter=ModelFormatterID.qwen3_style_no_think,
2361
2866
  supports_data_gen=False,
2362
2867
  structured_output_mode=StructuredOutputMode.json_schema,
2868
+ supports_function_calling=False,
2363
2869
  ),
2364
2870
  ],
2365
2871
  ),
@@ -2378,6 +2884,7 @@ built_in_models: List[KilnModel] = [
2378
2884
  r1_openrouter_options=True,
2379
2885
  parser=ModelParserID.r1_thinking,
2380
2886
  supports_data_gen=False,
2887
+ supports_function_calling=False,
2381
2888
  ),
2382
2889
  KilnModelProvider(
2383
2890
  name=ModelProviderName.ollama,
@@ -2385,6 +2892,7 @@ built_in_models: List[KilnModel] = [
2385
2892
  supports_data_gen=False,
2386
2893
  reasoning_capable=True,
2387
2894
  structured_output_mode=StructuredOutputMode.json_schema,
2895
+ supports_function_calling=False,
2388
2896
  ),
2389
2897
  ],
2390
2898
  ),
@@ -2401,6 +2909,7 @@ built_in_models: List[KilnModel] = [
2401
2909
  formatter=ModelFormatterID.qwen3_style_no_think,
2402
2910
  supports_data_gen=False,
2403
2911
  parser=ModelParserID.optional_r1_thinking,
2912
+ supports_function_calling=False,
2404
2913
  ),
2405
2914
  KilnModelProvider(
2406
2915
  name=ModelProviderName.ollama,
@@ -2408,6 +2917,7 @@ built_in_models: List[KilnModel] = [
2408
2917
  structured_output_mode=StructuredOutputMode.json_schema,
2409
2918
  formatter=ModelFormatterID.qwen3_style_no_think,
2410
2919
  supports_data_gen=False,
2920
+ supports_function_calling=False,
2411
2921
  ),
2412
2922
  ],
2413
2923
  ),
@@ -2427,6 +2937,7 @@ built_in_models: List[KilnModel] = [
2427
2937
  r1_openrouter_options=True,
2428
2938
  parser=ModelParserID.r1_thinking,
2429
2939
  supports_data_gen=False,
2940
+ supports_function_calling=False,
2430
2941
  ),
2431
2942
  KilnModelProvider(
2432
2943
  name=ModelProviderName.ollama,
@@ -2434,6 +2945,7 @@ built_in_models: List[KilnModel] = [
2434
2945
  supports_data_gen=False,
2435
2946
  reasoning_capable=True,
2436
2947
  structured_output_mode=StructuredOutputMode.json_schema,
2948
+ supports_function_calling=False,
2437
2949
  ),
2438
2950
  KilnModelProvider(
2439
2951
  name=ModelProviderName.siliconflow_cn,
@@ -2443,6 +2955,15 @@ built_in_models: List[KilnModel] = [
2443
2955
  siliconflow_enable_thinking=True,
2444
2956
  reasoning_optional_for_structured_output=True,
2445
2957
  supports_data_gen=False,
2958
+ supports_function_calling=False,
2959
+ ),
2960
+ KilnModelProvider(
2961
+ name=ModelProviderName.docker_model_runner,
2962
+ model_id="ai/qwen3:8B-Q4_K_M",
2963
+ supports_data_gen=False,
2964
+ reasoning_capable=True,
2965
+ structured_output_mode=StructuredOutputMode.json_schema,
2966
+ supports_function_calling=False,
2446
2967
  ),
2447
2968
  ],
2448
2969
  ),
@@ -2459,6 +2980,7 @@ built_in_models: List[KilnModel] = [
2459
2980
  formatter=ModelFormatterID.qwen3_style_no_think,
2460
2981
  supports_data_gen=False,
2461
2982
  parser=ModelParserID.optional_r1_thinking,
2983
+ supports_function_calling=False,
2462
2984
  ),
2463
2985
  KilnModelProvider(
2464
2986
  name=ModelProviderName.ollama,
@@ -2466,6 +2988,7 @@ built_in_models: List[KilnModel] = [
2466
2988
  structured_output_mode=StructuredOutputMode.json_schema,
2467
2989
  formatter=ModelFormatterID.qwen3_style_no_think,
2468
2990
  supports_data_gen=False,
2991
+ supports_function_calling=False,
2469
2992
  ),
2470
2993
  KilnModelProvider(
2471
2994
  name=ModelProviderName.siliconflow_cn,
@@ -2473,6 +2996,7 @@ built_in_models: List[KilnModel] = [
2473
2996
  structured_output_mode=StructuredOutputMode.json_schema,
2474
2997
  siliconflow_enable_thinking=False,
2475
2998
  supports_data_gen=False,
2999
+ supports_function_calling=False,
2476
3000
  ),
2477
3001
  ],
2478
3002
  ),
@@ -2491,6 +3015,7 @@ built_in_models: List[KilnModel] = [
2491
3015
  r1_openrouter_options=True,
2492
3016
  parser=ModelParserID.r1_thinking,
2493
3017
  supports_data_gen=True,
3018
+ supports_function_calling=False,
2494
3019
  ),
2495
3020
  KilnModelProvider(
2496
3021
  name=ModelProviderName.ollama,
@@ -2498,6 +3023,7 @@ built_in_models: List[KilnModel] = [
2498
3023
  supports_data_gen=True,
2499
3024
  reasoning_capable=True,
2500
3025
  structured_output_mode=StructuredOutputMode.json_schema,
3026
+ supports_function_calling=False,
2501
3027
  ),
2502
3028
  KilnModelProvider(
2503
3029
  name=ModelProviderName.siliconflow_cn,
@@ -2507,6 +3033,15 @@ built_in_models: List[KilnModel] = [
2507
3033
  reasoning_capable=True,
2508
3034
  siliconflow_enable_thinking=True,
2509
3035
  reasoning_optional_for_structured_output=True,
3036
+ supports_function_calling=False,
3037
+ ),
3038
+ KilnModelProvider(
3039
+ name=ModelProviderName.docker_model_runner,
3040
+ model_id="ai/qwen3:14B-Q6_K",
3041
+ supports_data_gen=True,
3042
+ reasoning_capable=True,
3043
+ structured_output_mode=StructuredOutputMode.json_schema,
3044
+ supports_function_calling=False,
2510
3045
  ),
2511
3046
  ],
2512
3047
  ),
@@ -2553,6 +3088,12 @@ built_in_models: List[KilnModel] = [
2553
3088
  reasoning_capable=True,
2554
3089
  structured_output_mode=StructuredOutputMode.json_schema,
2555
3090
  ),
3091
+ KilnModelProvider(
3092
+ name=ModelProviderName.docker_model_runner,
3093
+ model_id="ai/qwen3:30B-A3B-Q4_K_M",
3094
+ reasoning_capable=True,
3095
+ structured_output_mode=StructuredOutputMode.json_schema,
3096
+ ),
2556
3097
  ],
2557
3098
  ),
2558
3099
  # Qwen 3 30B (3B Active)
@@ -2658,7 +3199,8 @@ built_in_models: List[KilnModel] = [
2658
3199
  supports_data_gen=True,
2659
3200
  reasoning_capable=True,
2660
3201
  structured_output_mode=StructuredOutputMode.json_instructions,
2661
- parser=ModelParserID.r1_thinking,
3202
+ # This model doesn't return reasoning content after a tool call so we need to allow optional reasoning.
3203
+ parser=ModelParserID.optional_r1_thinking,
2662
3204
  ),
2663
3205
  KilnModelProvider(
2664
3206
  name=ModelProviderName.openrouter,
@@ -2669,6 +3211,8 @@ built_in_models: List[KilnModel] = [
2669
3211
  structured_output_mode=StructuredOutputMode.json_instructions,
2670
3212
  parser=ModelParserID.r1_thinking,
2671
3213
  supports_data_gen=True,
3214
+ # Not reliable, even for simple functions
3215
+ supports_function_calling=False,
2672
3216
  ),
2673
3217
  KilnModelProvider(
2674
3218
  name=ModelProviderName.ollama,
@@ -2691,7 +3235,8 @@ built_in_models: List[KilnModel] = [
2691
3235
  structured_output_mode=StructuredOutputMode.json_instructions,
2692
3236
  supports_data_gen=True,
2693
3237
  reasoning_capable=True,
2694
- parser=ModelParserID.r1_thinking,
3238
+ # This model doesn't return reasoning content after a tool call so we need to allow optional reasoning.
3239
+ parser=ModelParserID.optional_r1_thinking,
2695
3240
  ),
2696
3241
  ],
2697
3242
  ),
@@ -2765,6 +3310,7 @@ built_in_models: List[KilnModel] = [
2765
3310
  reasoning_capable=True,
2766
3311
  structured_output_mode=StructuredOutputMode.json_instructions,
2767
3312
  parser=ModelParserID.r1_thinking,
3313
+ supports_function_calling=False,
2768
3314
  ),
2769
3315
  ],
2770
3316
  ),
@@ -2806,6 +3352,7 @@ built_in_models: List[KilnModel] = [
2806
3352
  reasoning_capable=True,
2807
3353
  structured_output_mode=StructuredOutputMode.json_instructions,
2808
3354
  parser=ModelParserID.r1_thinking,
3355
+ supports_function_calling=False,
2809
3356
  ),
2810
3357
  KilnModelProvider(
2811
3358
  name=ModelProviderName.siliconflow_cn,
@@ -2849,6 +3396,7 @@ built_in_models: List[KilnModel] = [
2849
3396
  model_id="Qwen/Qwen3-235B-A22B-Instruct-2507-tput",
2850
3397
  supports_data_gen=True,
2851
3398
  structured_output_mode=StructuredOutputMode.json_instructions,
3399
+ supports_function_calling=False,
2852
3400
  ),
2853
3401
  ],
2854
3402
  ),
@@ -2889,6 +3437,7 @@ built_in_models: List[KilnModel] = [
2889
3437
  formatter=ModelFormatterID.qwen3_style_no_think,
2890
3438
  structured_output_mode=StructuredOutputMode.json_instructions,
2891
3439
  parser=ModelParserID.optional_r1_thinking,
3440
+ supports_function_calling=False,
2892
3441
  ),
2893
3442
  KilnModelProvider(
2894
3443
  name=ModelProviderName.siliconflow_cn,
@@ -2911,6 +3460,68 @@ built_in_models: List[KilnModel] = [
2911
3460
  structured_output_mode=StructuredOutputMode.json_schema,
2912
3461
  reasoning_capable=True,
2913
3462
  reasoning_optional_for_structured_output=True,
3463
+ supports_function_calling=False,
3464
+ ),
3465
+ ],
3466
+ ),
3467
+ # GLM 4.5
3468
+ KilnModel(
3469
+ family=ModelFamily.glm,
3470
+ name=ModelName.glm_4_5,
3471
+ friendly_name="GLM 4.5",
3472
+ providers=[
3473
+ KilnModelProvider(
3474
+ name=ModelProviderName.openrouter,
3475
+ model_id="z-ai/glm-4.5",
3476
+ structured_output_mode=StructuredOutputMode.json_instructions,
3477
+ reasoning_capable=True,
3478
+ ),
3479
+ KilnModelProvider(
3480
+ name=ModelProviderName.fireworks_ai,
3481
+ model_id="accounts/fireworks/models/glm-4p5",
3482
+ structured_output_mode=StructuredOutputMode.json_instructions,
3483
+ reasoning_capable=True,
3484
+ ),
3485
+ KilnModelProvider(
3486
+ name=ModelProviderName.siliconflow_cn,
3487
+ model_id="zai-org/GLM-4.5",
3488
+ structured_output_mode=StructuredOutputMode.json_instructions,
3489
+ reasoning_capable=True,
3490
+ reasoning_optional_for_structured_output=True,
3491
+ ),
3492
+ ],
3493
+ ),
3494
+ # GLM 4.5 AIR
3495
+ KilnModel(
3496
+ family=ModelFamily.glm,
3497
+ name=ModelName.glm_4_5_air,
3498
+ friendly_name="GLM 4.5 AIR",
3499
+ providers=[
3500
+ KilnModelProvider(
3501
+ name=ModelProviderName.openrouter,
3502
+ model_id="z-ai/glm-4.5-air",
3503
+ structured_output_mode=StructuredOutputMode.json_instructions,
3504
+ reasoning_capable=True,
3505
+ ),
3506
+ KilnModelProvider(
3507
+ name=ModelProviderName.fireworks_ai,
3508
+ model_id="accounts/fireworks/models/glm-4p5-air",
3509
+ structured_output_mode=StructuredOutputMode.json_instructions,
3510
+ reasoning_capable=True,
3511
+ ),
3512
+ KilnModelProvider(
3513
+ name=ModelProviderName.together_ai,
3514
+ model_id="zai-org/GLM-4.5-Air-FP8",
3515
+ structured_output_mode=StructuredOutputMode.json_instructions,
3516
+ reasoning_capable=True,
3517
+ parser=ModelParserID.r1_thinking,
3518
+ ),
3519
+ KilnModelProvider(
3520
+ name=ModelProviderName.siliconflow_cn,
3521
+ model_id="zai-org/GLM-4.5-Air",
3522
+ structured_output_mode=StructuredOutputMode.json_instructions,
3523
+ reasoning_capable=True,
3524
+ reasoning_optional_for_structured_output=True,
2914
3525
  ),
2915
3526
  ],
2916
3527
  ),
@@ -2923,8 +3534,9 @@ built_in_models: List[KilnModel] = [
2923
3534
  KilnModelProvider(
2924
3535
  name=ModelProviderName.fireworks_ai,
2925
3536
  model_id="accounts/fireworks/models/kimi-k2-instruct",
2926
- structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2927
- # Ignoring json mode for now, so not suggested for evals
3537
+ structured_output_mode=StructuredOutputMode.json_schema,
3538
+ supports_data_gen=True,
3539
+ suggested_for_evals=True,
2928
3540
  ),
2929
3541
  KilnModelProvider(
2930
3542
  name=ModelProviderName.openrouter,
@@ -2944,7 +3556,7 @@ built_in_models: List[KilnModel] = [
2944
3556
  name=ModelProviderName.groq,
2945
3557
  model_id="moonshotai/kimi-k2-instruct",
2946
3558
  supports_data_gen=True,
2947
- structured_output_mode=StructuredOutputMode.function_calling,
3559
+ structured_output_mode=StructuredOutputMode.json_schema,
2948
3560
  suggested_for_evals=True,
2949
3561
  ),
2950
3562
  KilnModelProvider(
@@ -2956,6 +3568,51 @@ built_in_models: List[KilnModel] = [
2956
3568
  ),
2957
3569
  ],
2958
3570
  ),
3571
+ # Kimi K2 Instruct 0905
3572
+ KilnModel(
3573
+ family=ModelFamily.kimi,
3574
+ name=ModelName.kimi_k2_0905,
3575
+ friendly_name="Kimi K2 0905",
3576
+ providers=[
3577
+ KilnModelProvider(
3578
+ name=ModelProviderName.openrouter,
3579
+ model_id="moonshotai/kimi-k2-0905",
3580
+ structured_output_mode=StructuredOutputMode.json_schema,
3581
+ supports_data_gen=True,
3582
+ suggested_for_evals=True,
3583
+ ),
3584
+ KilnModelProvider(
3585
+ name=ModelProviderName.fireworks_ai,
3586
+ model_id="accounts/fireworks/models/kimi-k2-instruct-0905",
3587
+ structured_output_mode=StructuredOutputMode.json_schema,
3588
+ supports_data_gen=True,
3589
+ suggested_for_evals=True,
3590
+ ),
3591
+ KilnModelProvider(
3592
+ name=ModelProviderName.together_ai,
3593
+ model_id="moonshotai/Kimi-K2-Instruct-0905",
3594
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
3595
+ supports_data_gen=True,
3596
+ suggested_for_evals=True,
3597
+ # this model on this provider currently fails the tool call test, but might work in the future
3598
+ supports_function_calling=False,
3599
+ ),
3600
+ KilnModelProvider(
3601
+ name=ModelProviderName.groq,
3602
+ model_id="moonshotai/kimi-k2-instruct-0905",
3603
+ structured_output_mode=StructuredOutputMode.json_schema,
3604
+ supports_data_gen=True,
3605
+ suggested_for_evals=True,
3606
+ ),
3607
+ KilnModelProvider(
3608
+ name=ModelProviderName.siliconflow_cn,
3609
+ model_id="Pro/moonshotai/Kimi-K2-Instruct-0905",
3610
+ structured_output_mode=StructuredOutputMode.json_schema,
3611
+ supports_data_gen=True,
3612
+ suggested_for_evals=True,
3613
+ ),
3614
+ ],
3615
+ ),
2959
3616
  KilnModel(
2960
3617
  family=ModelFamily.kimi,
2961
3618
  name=ModelName.kimi_dev_72b,
@@ -2967,6 +3624,7 @@ built_in_models: List[KilnModel] = [
2967
3624
  structured_output_mode=StructuredOutputMode.json_schema,
2968
3625
  reasoning_capable=True,
2969
3626
  reasoning_optional_for_structured_output=True,
3627
+ supports_function_calling=False,
2970
3628
  ),
2971
3629
  ],
2972
3630
  ),
@@ -2982,6 +3640,7 @@ built_in_models: List[KilnModel] = [
2982
3640
  structured_output_mode=StructuredOutputMode.json_instructions,
2983
3641
  reasoning_capable=True,
2984
3642
  supports_data_gen=False,
3643
+ supports_function_calling=False,
2985
3644
  ),
2986
3645
  ],
2987
3646
  ),
@@ -2998,6 +3657,7 @@ built_in_models: List[KilnModel] = [
2998
3657
  reasoning_capable=True,
2999
3658
  reasoning_optional_for_structured_output=True,
3000
3659
  supports_data_gen=False,
3660
+ supports_function_calling=False,
3001
3661
  ),
3002
3662
  ],
3003
3663
  ),
@@ -3014,6 +3674,7 @@ built_in_models: List[KilnModel] = [
3014
3674
  reasoning_capable=True,
3015
3675
  reasoning_optional_for_structured_output=True,
3016
3676
  supports_data_gen=False,
3677
+ supports_function_calling=False,
3017
3678
  ),
3018
3679
  ],
3019
3680
  ),
@@ -3029,12 +3690,14 @@ built_in_models: List[KilnModel] = [
3029
3690
  structured_output_mode=StructuredOutputMode.json_instructions,
3030
3691
  supports_data_gen=True,
3031
3692
  r1_openrouter_options=True,
3693
+ supports_function_calling=False,
3032
3694
  ),
3033
3695
  KilnModelProvider(
3034
3696
  name=ModelProviderName.siliconflow_cn,
3035
3697
  model_id="baidu/ERNIE-4.5-300B-A47B",
3036
3698
  structured_output_mode=StructuredOutputMode.json_schema,
3037
3699
  supports_data_gen=True,
3700
+ supports_function_calling=False,
3038
3701
  ),
3039
3702
  ],
3040
3703
  ),
@@ -3055,6 +3718,7 @@ built_in_models: List[KilnModel] = [
3055
3718
  siliconflow_enable_thinking=True,
3056
3719
  reasoning_optional_for_structured_output=True,
3057
3720
  supports_data_gen=False,
3721
+ supports_function_calling=False,
3058
3722
  ),
3059
3723
  ],
3060
3724
  ),
@@ -3078,6 +3742,7 @@ built_in_models: List[KilnModel] = [
3078
3742
  structured_output_mode=StructuredOutputMode.json_instructions,
3079
3743
  reasoning_capable=True,
3080
3744
  supports_data_gen=True,
3745
+ supports_function_calling=False,
3081
3746
  ),
3082
3747
  ],
3083
3748
  ),
@@ -3093,6 +3758,54 @@ built_in_models: List[KilnModel] = [
3093
3758
  structured_output_mode=StructuredOutputMode.json_instructions,
3094
3759
  reasoning_capable=True,
3095
3760
  supports_data_gen=True,
3761
+ supports_function_calling=False,
3762
+ ),
3763
+ ],
3764
+ ),
3765
+ # Bytedance
3766
+ KilnModel(
3767
+ family=ModelFamily.bytedance,
3768
+ name=ModelName.bytedance_seed_oss_36b,
3769
+ friendly_name="ByteDance Seed OSS 36B",
3770
+ providers=[
3771
+ KilnModelProvider(
3772
+ name=ModelProviderName.openrouter,
3773
+ model_id="bytedance/seed-oss-36b-instruct",
3774
+ structured_output_mode=StructuredOutputMode.json_schema,
3775
+ reasoning_capable=True,
3776
+ supports_data_gen=True,
3777
+ supports_function_calling=False,
3778
+ ),
3779
+ KilnModelProvider(
3780
+ name=ModelProviderName.siliconflow_cn,
3781
+ model_id="ByteDance-Seed/Seed-OSS-36B-Instruct",
3782
+ structured_output_mode=StructuredOutputMode.json_schema,
3783
+ reasoning_capable=True,
3784
+ supports_data_gen=True,
3785
+ supports_function_calling=False,
3786
+ reasoning_optional_for_structured_output=True,
3787
+ ),
3788
+ ],
3789
+ ),
3790
+ # StepFun
3791
+ KilnModel(
3792
+ family=ModelFamily.stepfun,
3793
+ name=ModelName.stepfun_step3,
3794
+ friendly_name="StepFun Step3",
3795
+ providers=[
3796
+ KilnModelProvider(
3797
+ name=ModelProviderName.openrouter,
3798
+ model_id="stepfun-ai/step3",
3799
+ structured_output_mode=StructuredOutputMode.json_instructions,
3800
+ reasoning_capable=True,
3801
+ supports_function_calling=False,
3802
+ ),
3803
+ KilnModelProvider(
3804
+ name=ModelProviderName.siliconflow_cn,
3805
+ model_id="stepfun-ai/step3",
3806
+ structured_output_mode=StructuredOutputMode.json_instructions,
3807
+ reasoning_capable=True,
3808
+ supports_function_calling=False,
3096
3809
  ),
3097
3810
  ],
3098
3811
  ),
@@ -3106,6 +3819,17 @@ def get_model_by_name(name: ModelName) -> KilnModel:
3106
3819
  raise ValueError(f"Model {name} not found in the list of built-in models")
3107
3820
 
3108
3821
 
3822
+ def built_in_models_from_provider(
3823
+ provider_name: ModelProviderName, model_name: str
3824
+ ) -> KilnModelProvider | None:
3825
+ for model in built_in_models:
3826
+ if model.name == model_name:
3827
+ for p in model.providers:
3828
+ if p.name == provider_name:
3829
+ return p
3830
+ return None
3831
+
3832
+
3109
3833
  def default_structured_output_mode_for_model_provider(
3110
3834
  model_name: str,
3111
3835
  provider: ModelProviderName,