kiln-ai 0.16.0__py3-none-any.whl → 0.18.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.
Files changed (66) hide show
  1. kiln_ai/adapters/__init__.py +2 -0
  2. kiln_ai/adapters/adapter_registry.py +22 -44
  3. kiln_ai/adapters/chat/__init__.py +8 -0
  4. kiln_ai/adapters/chat/chat_formatter.py +233 -0
  5. kiln_ai/adapters/chat/test_chat_formatter.py +131 -0
  6. kiln_ai/adapters/data_gen/data_gen_prompts.py +121 -36
  7. kiln_ai/adapters/data_gen/data_gen_task.py +49 -36
  8. kiln_ai/adapters/data_gen/test_data_gen_task.py +330 -40
  9. kiln_ai/adapters/eval/base_eval.py +7 -6
  10. kiln_ai/adapters/eval/eval_runner.py +9 -2
  11. kiln_ai/adapters/eval/g_eval.py +40 -17
  12. kiln_ai/adapters/eval/test_base_eval.py +174 -17
  13. kiln_ai/adapters/eval/test_eval_runner.py +3 -0
  14. kiln_ai/adapters/eval/test_g_eval.py +116 -5
  15. kiln_ai/adapters/fine_tune/base_finetune.py +3 -8
  16. kiln_ai/adapters/fine_tune/dataset_formatter.py +135 -273
  17. kiln_ai/adapters/fine_tune/test_base_finetune.py +10 -10
  18. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +287 -353
  19. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +3 -3
  20. kiln_ai/adapters/fine_tune/test_openai_finetune.py +6 -6
  21. kiln_ai/adapters/fine_tune/test_together_finetune.py +1 -0
  22. kiln_ai/adapters/fine_tune/test_vertex_finetune.py +6 -11
  23. kiln_ai/adapters/fine_tune/together_finetune.py +13 -2
  24. kiln_ai/adapters/ml_model_list.py +370 -84
  25. kiln_ai/adapters/model_adapters/base_adapter.py +73 -26
  26. kiln_ai/adapters/model_adapters/litellm_adapter.py +88 -97
  27. kiln_ai/adapters/model_adapters/litellm_config.py +3 -2
  28. kiln_ai/adapters/model_adapters/test_base_adapter.py +235 -61
  29. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +104 -21
  30. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +41 -0
  31. kiln_ai/adapters/model_adapters/test_structured_output.py +44 -12
  32. kiln_ai/adapters/parsers/parser_registry.py +0 -2
  33. kiln_ai/adapters/parsers/r1_parser.py +0 -1
  34. kiln_ai/adapters/prompt_builders.py +0 -16
  35. kiln_ai/adapters/provider_tools.py +27 -9
  36. kiln_ai/adapters/remote_config.py +66 -0
  37. kiln_ai/adapters/repair/repair_task.py +1 -6
  38. kiln_ai/adapters/repair/test_repair_task.py +24 -3
  39. kiln_ai/adapters/test_adapter_registry.py +88 -28
  40. kiln_ai/adapters/test_ml_model_list.py +176 -0
  41. kiln_ai/adapters/test_prompt_adaptors.py +17 -7
  42. kiln_ai/adapters/test_prompt_builders.py +3 -16
  43. kiln_ai/adapters/test_provider_tools.py +69 -20
  44. kiln_ai/adapters/test_remote_config.py +100 -0
  45. kiln_ai/datamodel/__init__.py +0 -2
  46. kiln_ai/datamodel/datamodel_enums.py +38 -13
  47. kiln_ai/datamodel/eval.py +32 -0
  48. kiln_ai/datamodel/finetune.py +12 -8
  49. kiln_ai/datamodel/task.py +68 -7
  50. kiln_ai/datamodel/task_output.py +0 -2
  51. kiln_ai/datamodel/task_run.py +0 -2
  52. kiln_ai/datamodel/test_basemodel.py +2 -1
  53. kiln_ai/datamodel/test_dataset_split.py +0 -8
  54. kiln_ai/datamodel/test_eval_model.py +146 -4
  55. kiln_ai/datamodel/test_models.py +33 -10
  56. kiln_ai/datamodel/test_task.py +168 -2
  57. kiln_ai/utils/config.py +3 -2
  58. kiln_ai/utils/dataset_import.py +1 -1
  59. kiln_ai/utils/logging.py +166 -0
  60. kiln_ai/utils/test_config.py +23 -0
  61. kiln_ai/utils/test_dataset_import.py +30 -0
  62. {kiln_ai-0.16.0.dist-info → kiln_ai-0.18.0.dist-info}/METADATA +2 -2
  63. kiln_ai-0.18.0.dist-info/RECORD +115 -0
  64. kiln_ai-0.16.0.dist-info/RECORD +0 -108
  65. {kiln_ai-0.16.0.dist-info → kiln_ai-0.18.0.dist-info}/WHEEL +0 -0
  66. {kiln_ai-0.16.0.dist-info → kiln_ai-0.18.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,9 +1,13 @@
1
1
  from enum import Enum
2
- from typing import Dict, List, Literal
2
+ from typing import List, Literal
3
3
 
4
4
  from pydantic import BaseModel
5
5
 
6
- from kiln_ai.datamodel import StructuredOutputMode
6
+ from kiln_ai.datamodel.datamodel_enums import (
7
+ ChatStrategy,
8
+ ModelProviderName,
9
+ StructuredOutputMode,
10
+ )
7
11
 
8
12
  """
9
13
  Provides model configuration and management for various LLM providers and models.
@@ -12,28 +16,6 @@ including configuration, validation, and instantiation of language models.
12
16
  """
13
17
 
14
18
 
15
- class ModelProviderName(str, Enum):
16
- """
17
- Enumeration of supported AI model providers.
18
- """
19
-
20
- openai = "openai"
21
- groq = "groq"
22
- amazon_bedrock = "amazon_bedrock"
23
- ollama = "ollama"
24
- openrouter = "openrouter"
25
- fireworks_ai = "fireworks_ai"
26
- kiln_fine_tune = "kiln_fine_tune"
27
- kiln_custom_registry = "kiln_custom_registry"
28
- openai_compatible = "openai_compatible"
29
- anthropic = "anthropic"
30
- gemini_api = "gemini_api"
31
- azure_openai = "azure_openai"
32
- huggingface = "huggingface"
33
- vertex = "vertex"
34
- together_ai = "together_ai"
35
-
36
-
37
19
  class ModelFamily(str, Enum):
38
20
  """
39
21
  Enumeration of supported model families/architectures.
@@ -51,6 +33,7 @@ class ModelFamily(str, Enum):
51
33
  deepseek = "deepseek"
52
34
  dolphin = "dolphin"
53
35
  grok = "grok"
36
+ kimi = "kimi"
54
37
 
55
38
 
56
39
  # Where models have instruct and raw versions, instruct is default and raw is specified
@@ -68,6 +51,8 @@ class ModelName(str, Enum):
68
51
  llama_3_2_11b = "llama_3_2_11b"
69
52
  llama_3_2_90b = "llama_3_2_90b"
70
53
  llama_3_3_70b = "llama_3_3_70b"
54
+ llama_4_maverick = "llama_4_maverick"
55
+ llama_4_scout = "llama_4_scout"
71
56
  gpt_4o_mini = "gpt_4o_mini"
72
57
  gpt_4o = "gpt_4o"
73
58
  gpt_4_1 = "gpt_4_1"
@@ -91,6 +76,9 @@ class ModelName(str, Enum):
91
76
  phi_4_mini = "phi_4_mini"
92
77
  mistral_large = "mistral_large"
93
78
  mistral_nemo = "mistral_nemo"
79
+ mistral_small_3 = "mistral_small_3"
80
+ magistral_medium = "magistral_medium"
81
+ magistral_medium_thinking = "magistral_medium_thinking"
94
82
  gemma_2_2b = "gemma_2_2b"
95
83
  gemma_2_9b = "gemma_2_9b"
96
84
  gemma_2_27b = "gemma_2_27b"
@@ -98,10 +86,14 @@ class ModelName(str, Enum):
98
86
  gemma_3_4b = "gemma_3_4b"
99
87
  gemma_3_12b = "gemma_3_12b"
100
88
  gemma_3_27b = "gemma_3_27b"
89
+ gemma_3n_2b = "gemma_3n_2b"
90
+ gemma_3n_4b = "gemma_3n_4b"
101
91
  claude_3_5_haiku = "claude_3_5_haiku"
102
92
  claude_3_5_sonnet = "claude_3_5_sonnet"
103
93
  claude_3_7_sonnet = "claude_3_7_sonnet"
104
94
  claude_3_7_sonnet_thinking = "claude_3_7_sonnet_thinking"
95
+ claude_sonnet_4 = "claude_sonnet_4"
96
+ claude_opus_4 = "claude_opus_4"
105
97
  gemini_1_5_flash = "gemini_1_5_flash"
106
98
  gemini_1_5_flash_8b = "gemini_1_5_flash_8b"
107
99
  gemini_1_5_pro = "gemini_1_5_pro"
@@ -109,6 +101,7 @@ class ModelName(str, Enum):
109
101
  gemini_2_0_flash_lite = "gemini_2_0_flash_lite"
110
102
  gemini_2_5_pro = "gemini_2_5_pro"
111
103
  gemini_2_5_flash = "gemini_2_5_flash"
104
+ gemini_2_5_flash_lite = "gemini_2_5_flash_lite"
112
105
  nemotron_70b = "nemotron_70b"
113
106
  mixtral_8x7b = "mixtral_8x7b"
114
107
  qwen_2p5_7b = "qwen_2p5_7b"
@@ -117,7 +110,7 @@ class ModelName(str, Enum):
117
110
  qwq_32b = "qwq_32b"
118
111
  deepseek_3 = "deepseek_3"
119
112
  deepseek_r1 = "deepseek_r1"
120
- mistral_small_3 = "mistral_small_3"
113
+ deepseek_r1_0528 = "deepseek_r1_0528"
121
114
  deepseek_r1_distill_qwen_32b = "deepseek_r1_distill_qwen_32b"
122
115
  deepseek_r1_distill_llama_70b = "deepseek_r1_distill_llama_70b"
123
116
  deepseek_r1_distill_qwen_14b = "deepseek_r1_distill_qwen_14b"
@@ -126,6 +119,9 @@ class ModelName(str, Enum):
126
119
  deepseek_r1_distill_llama_8b = "deepseek_r1_distill_llama_8b"
127
120
  dolphin_2_9_8x22b = "dolphin_2_9_8x22b"
128
121
  grok_2 = "grok_2"
122
+ grok_3 = "grok_3"
123
+ grok_3_mini = "grok_3_mini"
124
+ grok_4 = "grok_4"
129
125
  qwen_3_0p6b = "qwen_3_0p6b"
130
126
  qwen_3_0p6b_no_thinking = "qwen_3_0p6b_no_thinking"
131
127
  qwen_3_1p7b = "qwen_3_1p7b"
@@ -142,6 +138,7 @@ class ModelName(str, Enum):
142
138
  qwen_3_32b_no_thinking = "qwen_3_32b_no_thinking"
143
139
  qwen_3_235b_a22b = "qwen_3_235b_a22b"
144
140
  qwen_3_235b_a22b_no_thinking = "qwen_3_235b_a22b_no_thinking"
141
+ kimi_k2 = "kimi_k2"
145
142
 
146
143
 
147
144
  class ModelParserID(str, Enum):
@@ -174,6 +171,7 @@ class KilnModelProvider(BaseModel):
174
171
  structured_output_mode: The mode we should use to call the model for structured output, if it was trained with structured output.
175
172
  parser: A parser to use for the model, if applicable
176
173
  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.
174
+ tuned_chat_strategy: Used when a model is finetuned with a specific chat strategy, and it's best to use it at call time.
177
175
  """
178
176
 
179
177
  name: ModelProviderName
@@ -189,6 +187,9 @@ class KilnModelProvider(BaseModel):
189
187
  reasoning_capable: bool = False
190
188
  supports_logprobs: bool = False
191
189
  suggested_for_evals: bool = False
190
+ uncensored: bool = False
191
+ suggested_for_uncensored_data_gen: bool = False
192
+ tuned_chat_strategy: ChatStrategy | None = None
192
193
 
193
194
  # TODO P1: Need a more generalized way to handle custom provider parameters.
194
195
  # Making them quite declarative here for now, isolating provider specific logic
@@ -264,22 +265,16 @@ built_in_models: List[KilnModel] = [
264
265
  provider_finetune_id="gpt-4.1-mini-2025-04-14",
265
266
  structured_output_mode=StructuredOutputMode.json_schema,
266
267
  supports_logprobs=True,
267
- suggested_for_data_gen=True,
268
- suggested_for_evals=True,
269
268
  ),
270
269
  KilnModelProvider(
271
270
  name=ModelProviderName.openrouter,
272
271
  model_id="openai/gpt-4.1-mini",
273
272
  structured_output_mode=StructuredOutputMode.json_schema,
274
273
  supports_logprobs=True,
275
- suggested_for_data_gen=True,
276
- suggested_for_evals=True,
277
274
  ),
278
275
  KilnModelProvider(
279
276
  name=ModelProviderName.azure_openai,
280
277
  model_id="gpt-4.1-mini",
281
- suggested_for_data_gen=True,
282
- suggested_for_evals=True,
283
278
  ),
284
279
  ],
285
280
  ),
@@ -319,6 +314,8 @@ built_in_models: List[KilnModel] = [
319
314
  provider_finetune_id="gpt-4o-2024-08-06",
320
315
  structured_output_mode=StructuredOutputMode.json_schema,
321
316
  supports_logprobs=True,
317
+ suggested_for_data_gen=True,
318
+ suggested_for_evals=True,
322
319
  ),
323
320
  KilnModelProvider(
324
321
  name=ModelProviderName.openrouter,
@@ -326,10 +323,14 @@ built_in_models: List[KilnModel] = [
326
323
  structured_output_mode=StructuredOutputMode.json_schema,
327
324
  supports_logprobs=True,
328
325
  logprobs_openrouter_options=True,
326
+ suggested_for_data_gen=True,
327
+ suggested_for_evals=True,
329
328
  ),
330
329
  KilnModelProvider(
331
330
  name=ModelProviderName.azure_openai,
332
331
  model_id="gpt-4o",
332
+ suggested_for_data_gen=True,
333
+ suggested_for_evals=True,
333
334
  ),
334
335
  ],
335
336
  ),
@@ -665,15 +666,11 @@ built_in_models: List[KilnModel] = [
665
666
  name=ModelProviderName.openrouter,
666
667
  structured_output_mode=StructuredOutputMode.function_calling,
667
668
  model_id="anthropic/claude-3.7-sonnet",
668
- suggested_for_data_gen=True,
669
- suggested_for_evals=True,
670
669
  ),
671
670
  KilnModelProvider(
672
671
  name=ModelProviderName.anthropic,
673
672
  model_id="claude-3-7-sonnet-20250219",
674
673
  structured_output_mode=StructuredOutputMode.function_calling,
675
- suggested_for_data_gen=True,
676
- suggested_for_evals=True,
677
674
  ),
678
675
  ],
679
676
  ),
@@ -700,6 +697,46 @@ built_in_models: List[KilnModel] = [
700
697
  ),
701
698
  ],
702
699
  ),
700
+ # Claude Sonnet 4
701
+ KilnModel(
702
+ family=ModelFamily.claude,
703
+ name=ModelName.claude_sonnet_4,
704
+ friendly_name="Claude Sonnet 4",
705
+ providers=[
706
+ KilnModelProvider(
707
+ name=ModelProviderName.openrouter,
708
+ model_id="anthropic/claude-sonnet-4",
709
+ structured_output_mode=StructuredOutputMode.function_calling,
710
+ suggested_for_data_gen=True,
711
+ suggested_for_evals=True,
712
+ ),
713
+ KilnModelProvider(
714
+ name=ModelProviderName.anthropic,
715
+ model_id="claude-sonnet-4-20250514",
716
+ structured_output_mode=StructuredOutputMode.function_calling,
717
+ suggested_for_data_gen=True,
718
+ suggested_for_evals=True,
719
+ ),
720
+ ],
721
+ ),
722
+ # Claude Opus 4
723
+ KilnModel(
724
+ family=ModelFamily.claude,
725
+ name=ModelName.claude_opus_4,
726
+ friendly_name="Claude Opus 4",
727
+ providers=[
728
+ KilnModelProvider(
729
+ name=ModelProviderName.openrouter,
730
+ model_id="anthropic/claude-opus-4",
731
+ structured_output_mode=StructuredOutputMode.function_calling,
732
+ ),
733
+ KilnModelProvider(
734
+ name=ModelProviderName.anthropic,
735
+ model_id="claude-opus-4-20250514",
736
+ structured_output_mode=StructuredOutputMode.function_calling,
737
+ ),
738
+ ],
739
+ ),
703
740
  # Gemini 2.5 Pro
704
741
  KilnModel(
705
742
  family=ModelFamily.gemini,
@@ -708,24 +745,31 @@ built_in_models: List[KilnModel] = [
708
745
  providers=[
709
746
  KilnModelProvider(
710
747
  name=ModelProviderName.openrouter,
711
- model_id="google/gemini-2.5-pro-preview-03-25",
748
+ model_id="google/gemini-2.5-pro",
712
749
  structured_output_mode=StructuredOutputMode.json_schema,
713
750
  suggested_for_data_gen=True,
714
751
  suggested_for_evals=True,
752
+ reasoning_capable=True,
715
753
  ),
716
754
  KilnModelProvider(
717
755
  name=ModelProviderName.gemini_api,
718
- model_id="gemini-2.5-pro-preview-03-25",
756
+ model_id="gemini-2.5-pro",
719
757
  structured_output_mode=StructuredOutputMode.json_schema,
720
758
  suggested_for_data_gen=True,
721
759
  suggested_for_evals=True,
760
+ # TODO: Gemini API doesn't return reasoning here, so we don't ask for it. Strange.
761
+ # reasoning_capable=True,
762
+ # thinking_level="medium",
722
763
  ),
723
764
  KilnModelProvider(
724
765
  name=ModelProviderName.vertex,
725
- model_id="gemini-2.5-pro-preview-03-25",
766
+ model_id="gemini-2.5-pro",
726
767
  structured_output_mode=StructuredOutputMode.json_schema,
727
768
  suggested_for_data_gen=True,
728
769
  suggested_for_evals=True,
770
+ # TODO: Vertex doesn't return reasoning here, so we don't ask for it. Strange.
771
+ # reasoning_capable=True,
772
+ # thinking_level="medium",
729
773
  ),
730
774
  ],
731
775
  ),
@@ -737,18 +781,23 @@ built_in_models: List[KilnModel] = [
737
781
  providers=[
738
782
  KilnModelProvider(
739
783
  name=ModelProviderName.openrouter,
740
- model_id="google/gemini-2.5-flash-preview",
784
+ model_id="google/gemini-2.5-flash",
741
785
  structured_output_mode=StructuredOutputMode.json_schema,
786
+ reasoning_capable=True,
742
787
  ),
743
788
  KilnModelProvider(
744
789
  name=ModelProviderName.gemini_api,
745
- model_id="gemini-2.5-flash-preview-04-17",
790
+ model_id="gemini-2.5-flash",
746
791
  structured_output_mode=StructuredOutputMode.json_schema,
792
+ reasoning_capable=True,
793
+ thinking_level="medium",
747
794
  ),
748
795
  KilnModelProvider(
749
796
  name=ModelProviderName.vertex,
750
- model_id="gemini-2.5-flash-preview-04-17",
797
+ model_id="gemini-2.5-flash",
751
798
  structured_output_mode=StructuredOutputMode.json_schema,
799
+ reasoning_capable=True,
800
+ thinking_level="medium",
752
801
  ),
753
802
  ],
754
803
  ),
@@ -880,6 +929,52 @@ built_in_models: List[KilnModel] = [
880
929
  ),
881
930
  ],
882
931
  ),
932
+ # Llama 4 Maverick Basic
933
+ KilnModel(
934
+ family=ModelFamily.llama,
935
+ name=ModelName.llama_4_maverick,
936
+ friendly_name="Llama 4 Maverick",
937
+ providers=[
938
+ KilnModelProvider(
939
+ name=ModelProviderName.openrouter,
940
+ model_id="meta-llama/llama-4-maverick",
941
+ structured_output_mode=StructuredOutputMode.json_schema,
942
+ ),
943
+ KilnModelProvider(
944
+ name=ModelProviderName.fireworks_ai,
945
+ model_id="accounts/fireworks/models/llama4-maverick-instruct-basic",
946
+ structured_output_mode=StructuredOutputMode.json_schema,
947
+ ),
948
+ KilnModelProvider(
949
+ name=ModelProviderName.together_ai,
950
+ model_id="meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
951
+ structured_output_mode=StructuredOutputMode.json_schema,
952
+ ),
953
+ ],
954
+ ),
955
+ # Llama 4 Scout Basic
956
+ KilnModel(
957
+ family=ModelFamily.llama,
958
+ name=ModelName.llama_4_scout,
959
+ friendly_name="Llama 4 Scout",
960
+ providers=[
961
+ KilnModelProvider(
962
+ name=ModelProviderName.openrouter,
963
+ model_id="meta-llama/llama-4-scout",
964
+ structured_output_mode=StructuredOutputMode.json_schema,
965
+ ),
966
+ KilnModelProvider(
967
+ name=ModelProviderName.fireworks_ai,
968
+ model_id="accounts/fireworks/models/llama4-scout-instruct-basic",
969
+ structured_output_mode=StructuredOutputMode.json_schema,
970
+ ),
971
+ KilnModelProvider(
972
+ name=ModelProviderName.together_ai,
973
+ model_id="meta-llama/Llama-4-Scout-17B-16E-Instruct",
974
+ structured_output_mode=StructuredOutputMode.json_schema,
975
+ ),
976
+ ],
977
+ ),
883
978
  # Llama 3.1-8b
884
979
  KilnModel(
885
980
  family=ModelFamily.llama,
@@ -920,7 +1015,7 @@ built_in_models: List[KilnModel] = [
920
1015
  model_id="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
921
1016
  supports_data_gen=False,
922
1017
  structured_output_mode=StructuredOutputMode.function_calling_weak,
923
- provider_finetune_id="meta-llama/Meta-Llama-3.1-8B-Instruct",
1018
+ provider_finetune_id="meta-llama/Meta-Llama-3.1-8B-Instruct-Reference",
924
1019
  ),
925
1020
  ],
926
1021
  ),
@@ -939,8 +1034,7 @@ built_in_models: List[KilnModel] = [
939
1034
  KilnModelProvider(
940
1035
  name=ModelProviderName.openrouter,
941
1036
  supports_data_gen=False,
942
- # Need to not pass "strict=True" to the function call to get this to work with logprobs for some reason. Openrouter issue.
943
- structured_output_mode=StructuredOutputMode.function_calling_weak,
1037
+ structured_output_mode=StructuredOutputMode.json_schema,
944
1038
  model_id="meta-llama/llama-3.1-70b-instruct",
945
1039
  supports_logprobs=True,
946
1040
  logprobs_openrouter_options=True,
@@ -961,7 +1055,7 @@ built_in_models: List[KilnModel] = [
961
1055
  model_id="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
962
1056
  supports_data_gen=False,
963
1057
  structured_output_mode=StructuredOutputMode.function_calling_weak,
964
- provider_finetune_id="meta-llama/Meta-Llama-3.1-70B-Instruct",
1058
+ provider_finetune_id="meta-llama/Meta-Llama-3.1-70B-Instruct-Reference",
965
1059
  ),
966
1060
  ],
967
1061
  ),
@@ -1001,6 +1095,33 @@ built_in_models: List[KilnModel] = [
1001
1095
  ),
1002
1096
  ],
1003
1097
  ),
1098
+ # Magistral Medium (Thinking)
1099
+ KilnModel(
1100
+ family=ModelFamily.mistral,
1101
+ name=ModelName.magistral_medium_thinking,
1102
+ friendly_name="Magistral Medium (Thinking)",
1103
+ providers=[
1104
+ KilnModelProvider(
1105
+ name=ModelProviderName.openrouter,
1106
+ model_id="mistralai/magistral-medium-2506:thinking",
1107
+ structured_output_mode=StructuredOutputMode.json_schema,
1108
+ # Thinking tokens are hidden by Mistral so not "reasoning" from Kiln API POV
1109
+ ),
1110
+ ],
1111
+ ),
1112
+ # Magistral Medium (No Thinking)
1113
+ KilnModel(
1114
+ family=ModelFamily.mistral,
1115
+ name=ModelName.magistral_medium,
1116
+ friendly_name="Magistral Medium (No Thinking)",
1117
+ providers=[
1118
+ KilnModelProvider(
1119
+ name=ModelProviderName.openrouter,
1120
+ model_id="mistralai/magistral-medium-2506",
1121
+ structured_output_mode=StructuredOutputMode.json_schema,
1122
+ ),
1123
+ ],
1124
+ ),
1004
1125
  # Mistral Nemo
1005
1126
  KilnModel(
1006
1127
  family=ModelFamily.mistral,
@@ -1024,16 +1145,22 @@ built_in_models: List[KilnModel] = [
1024
1145
  name=ModelProviderName.amazon_bedrock,
1025
1146
  structured_output_mode=StructuredOutputMode.json_instructions,
1026
1147
  model_id="mistral.mistral-large-2407-v1:0",
1148
+ uncensored=True,
1149
+ suggested_for_uncensored_data_gen=True,
1027
1150
  ),
1028
1151
  KilnModelProvider(
1029
1152
  name=ModelProviderName.openrouter,
1030
1153
  structured_output_mode=StructuredOutputMode.json_schema,
1031
1154
  model_id="mistralai/mistral-large",
1155
+ uncensored=True,
1156
+ suggested_for_uncensored_data_gen=True,
1032
1157
  ),
1033
1158
  KilnModelProvider(
1034
1159
  name=ModelProviderName.ollama,
1035
1160
  structured_output_mode=StructuredOutputMode.json_schema,
1036
1161
  model_id="mistral-large",
1162
+ uncensored=True,
1163
+ suggested_for_uncensored_data_gen=True,
1037
1164
  ),
1038
1165
  ],
1039
1166
  ),
@@ -1062,16 +1189,6 @@ built_in_models: List[KilnModel] = [
1062
1189
  supports_data_gen=False,
1063
1190
  model_id="llama3.2:1b",
1064
1191
  ),
1065
- KilnModelProvider(
1066
- name=ModelProviderName.huggingface,
1067
- model_id="meta-llama/Llama-3.2-1B-Instruct",
1068
- supports_structured_output=False,
1069
- supports_data_gen=False,
1070
- ),
1071
- KilnModelProvider(
1072
- name=ModelProviderName.together_ai,
1073
- provider_finetune_id="meta-llama/Llama-3.2-1B-Instruct",
1074
- ),
1075
1192
  ],
1076
1193
  ),
1077
1194
  # Llama 3.2 3B
@@ -1097,18 +1214,11 @@ built_in_models: List[KilnModel] = [
1097
1214
  supports_data_gen=False,
1098
1215
  model_id="llama3.2",
1099
1216
  ),
1100
- KilnModelProvider(
1101
- name=ModelProviderName.huggingface,
1102
- model_id="meta-llama/Llama-3.2-3B-Instruct",
1103
- supports_structured_output=False,
1104
- supports_data_gen=False,
1105
- ),
1106
1217
  KilnModelProvider(
1107
1218
  name=ModelProviderName.together_ai,
1108
1219
  model_id="meta-llama/Llama-3.2-3B-Instruct-Turbo",
1109
1220
  supports_structured_output=False,
1110
1221
  supports_data_gen=False,
1111
- provider_finetune_id="meta-llama/Llama-3.2-3B-Instruct",
1112
1222
  ),
1113
1223
  ],
1114
1224
  ),
@@ -1158,10 +1268,6 @@ built_in_models: List[KilnModel] = [
1158
1268
  name=ModelName.llama_3_2_90b,
1159
1269
  friendly_name="Llama 3.2 90B",
1160
1270
  providers=[
1161
- KilnModelProvider(
1162
- name=ModelProviderName.groq,
1163
- model_id="llama-3.2-90b-vision-preview",
1164
- ),
1165
1271
  KilnModelProvider(
1166
1272
  name=ModelProviderName.openrouter,
1167
1273
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
@@ -1434,10 +1540,51 @@ built_in_models: List[KilnModel] = [
1434
1540
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1435
1541
  model_id="google/gemma-3-27b-it",
1436
1542
  ),
1543
+ ],
1544
+ ),
1545
+ # Gemma 3n 2B
1546
+ KilnModel(
1547
+ family=ModelFamily.gemma,
1548
+ name=ModelName.gemma_3n_2b,
1549
+ friendly_name="Gemma 3n 2B",
1550
+ providers=[
1437
1551
  KilnModelProvider(
1438
- name=ModelProviderName.huggingface,
1439
- model_id="google/gemma-3-27b-it",
1552
+ name=ModelProviderName.ollama,
1553
+ model_id="gemma3n:e2b",
1554
+ structured_output_mode=StructuredOutputMode.json_schema,
1555
+ supports_data_gen=False,
1556
+ ),
1557
+ KilnModelProvider(
1558
+ name=ModelProviderName.gemini_api,
1559
+ model_id="gemma-3n-e2b-it",
1560
+ supports_structured_output=False,
1561
+ supports_data_gen=False,
1562
+ ),
1563
+ ],
1564
+ ),
1565
+ # Gemma 3n 4B
1566
+ KilnModel(
1567
+ family=ModelFamily.gemma,
1568
+ name=ModelName.gemma_3n_4b,
1569
+ friendly_name="Gemma 3n 4B",
1570
+ providers=[
1571
+ KilnModelProvider(
1572
+ name=ModelProviderName.openrouter,
1573
+ model_id="google/gemma-3n-e4b-it",
1574
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1575
+ supports_data_gen=False,
1576
+ ),
1577
+ KilnModelProvider(
1578
+ name=ModelProviderName.ollama,
1579
+ model_id="gemma3n:e4b",
1580
+ supports_data_gen=False,
1581
+ structured_output_mode=StructuredOutputMode.json_schema,
1582
+ ),
1583
+ KilnModelProvider(
1584
+ name=ModelProviderName.gemini_api,
1585
+ model_id="gemma-3n-e4b-it",
1440
1586
  structured_output_mode=StructuredOutputMode.json_instructions,
1587
+ supports_data_gen=False,
1441
1588
  ),
1442
1589
  ],
1443
1590
  ),
@@ -1578,10 +1725,46 @@ built_in_models: List[KilnModel] = [
1578
1725
  name=ModelProviderName.openrouter,
1579
1726
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1580
1727
  model_id="mistralai/mistral-small-24b-instruct-2501",
1728
+ uncensored=True,
1581
1729
  ),
1582
1730
  KilnModelProvider(
1583
1731
  name=ModelProviderName.ollama,
1584
1732
  model_id="mistral-small:24b",
1733
+ uncensored=True,
1734
+ ),
1735
+ ],
1736
+ ),
1737
+ # DeepSeek R1 0528
1738
+ KilnModel(
1739
+ family=ModelFamily.deepseek,
1740
+ name=ModelName.deepseek_r1_0528,
1741
+ friendly_name="DeepSeek R1 0528",
1742
+ providers=[
1743
+ KilnModelProvider(
1744
+ name=ModelProviderName.openrouter,
1745
+ model_id="deepseek/deepseek-r1-0528",
1746
+ parser=ModelParserID.r1_thinking,
1747
+ structured_output_mode=StructuredOutputMode.json_instructions,
1748
+ reasoning_capable=True,
1749
+ r1_openrouter_options=True,
1750
+ require_openrouter_reasoning=True,
1751
+ supports_data_gen=True,
1752
+ ),
1753
+ KilnModelProvider(
1754
+ name=ModelProviderName.fireworks_ai,
1755
+ model_id="accounts/fireworks/models/deepseek-r1-0528",
1756
+ parser=ModelParserID.r1_thinking,
1757
+ supports_data_gen=True,
1758
+ structured_output_mode=StructuredOutputMode.json_instructions,
1759
+ reasoning_capable=True,
1760
+ ),
1761
+ KilnModelProvider(
1762
+ name=ModelProviderName.together_ai,
1763
+ model_id="deepseek-ai/DeepSeek-R1", # Note: Together remapped the R1 endpoint to this 0528 model
1764
+ structured_output_mode=StructuredOutputMode.json_instructions,
1765
+ parser=ModelParserID.r1_thinking,
1766
+ reasoning_capable=True,
1767
+ supports_data_gen=True,
1585
1768
  ),
1586
1769
  ],
1587
1770
  ),
@@ -1614,7 +1797,7 @@ built_in_models: List[KilnModel] = [
1614
1797
  KilnModel(
1615
1798
  family=ModelFamily.deepseek,
1616
1799
  name=ModelName.deepseek_r1,
1617
- friendly_name="DeepSeek R1",
1800
+ friendly_name="DeepSeek R1 (Original)",
1618
1801
  providers=[
1619
1802
  KilnModelProvider(
1620
1803
  name=ModelProviderName.openrouter,
@@ -1624,8 +1807,6 @@ built_in_models: List[KilnModel] = [
1624
1807
  reasoning_capable=True,
1625
1808
  r1_openrouter_options=True,
1626
1809
  require_openrouter_reasoning=True,
1627
- suggested_for_data_gen=True,
1628
- suggested_for_evals=True,
1629
1810
  ),
1630
1811
  KilnModelProvider(
1631
1812
  name=ModelProviderName.fireworks_ai,
@@ -1633,8 +1814,6 @@ built_in_models: List[KilnModel] = [
1633
1814
  parser=ModelParserID.r1_thinking,
1634
1815
  structured_output_mode=StructuredOutputMode.json_instructions,
1635
1816
  reasoning_capable=True,
1636
- suggested_for_data_gen=True,
1637
- suggested_for_evals=True,
1638
1817
  ),
1639
1818
  KilnModelProvider(
1640
1819
  # I want your RAM
@@ -1643,17 +1822,6 @@ built_in_models: List[KilnModel] = [
1643
1822
  parser=ModelParserID.r1_thinking,
1644
1823
  structured_output_mode=StructuredOutputMode.json_instructions,
1645
1824
  reasoning_capable=True,
1646
- suggested_for_data_gen=True,
1647
- suggested_for_evals=True,
1648
- ),
1649
- KilnModelProvider(
1650
- name=ModelProviderName.together_ai,
1651
- model_id="deepseek-ai/DeepSeek-R1",
1652
- structured_output_mode=StructuredOutputMode.json_instructions,
1653
- parser=ModelParserID.r1_thinking,
1654
- reasoning_capable=True,
1655
- suggested_for_data_gen=True,
1656
- suggested_for_evals=True,
1657
1825
  ),
1658
1826
  ],
1659
1827
  ),
@@ -1849,12 +2017,67 @@ built_in_models: List[KilnModel] = [
1849
2017
  structured_output_mode=StructuredOutputMode.json_schema,
1850
2018
  supports_data_gen=True,
1851
2019
  model_id="dolphin-mixtral:8x22b",
2020
+ uncensored=True,
2021
+ suggested_for_uncensored_data_gen=True,
1852
2022
  ),
1853
2023
  KilnModelProvider(
1854
2024
  name=ModelProviderName.openrouter,
1855
2025
  supports_data_gen=True,
1856
2026
  structured_output_mode=StructuredOutputMode.json_instruction_and_object,
1857
2027
  model_id="cognitivecomputations/dolphin-mixtral-8x22b",
2028
+ uncensored=True,
2029
+ suggested_for_uncensored_data_gen=True,
2030
+ ),
2031
+ ],
2032
+ ),
2033
+ # Grok 4
2034
+ KilnModel(
2035
+ family=ModelFamily.grok,
2036
+ name=ModelName.grok_4,
2037
+ friendly_name="Grok 4",
2038
+ providers=[
2039
+ KilnModelProvider(
2040
+ name=ModelProviderName.openrouter,
2041
+ model_id="x-ai/grok-4",
2042
+ supports_structured_output=True,
2043
+ supports_data_gen=True,
2044
+ structured_output_mode=StructuredOutputMode.json_schema,
2045
+ suggested_for_data_gen=True,
2046
+ uncensored=True,
2047
+ suggested_for_uncensored_data_gen=True,
2048
+ ),
2049
+ ],
2050
+ ),
2051
+ # Grok 3
2052
+ KilnModel(
2053
+ family=ModelFamily.grok,
2054
+ name=ModelName.grok_3,
2055
+ friendly_name="Grok 3",
2056
+ providers=[
2057
+ KilnModelProvider(
2058
+ name=ModelProviderName.openrouter,
2059
+ model_id="x-ai/grok-3",
2060
+ supports_structured_output=True,
2061
+ supports_data_gen=True,
2062
+ structured_output_mode=StructuredOutputMode.json_schema,
2063
+ suggested_for_data_gen=True,
2064
+ uncensored=True,
2065
+ ),
2066
+ ],
2067
+ ),
2068
+ # Grok 3 Mini
2069
+ KilnModel(
2070
+ family=ModelFamily.grok,
2071
+ name=ModelName.grok_3_mini,
2072
+ friendly_name="Grok 3 Mini",
2073
+ providers=[
2074
+ KilnModelProvider(
2075
+ name=ModelProviderName.openrouter,
2076
+ model_id="x-ai/grok-3-mini",
2077
+ supports_structured_output=True,
2078
+ supports_data_gen=True,
2079
+ structured_output_mode=StructuredOutputMode.json_schema,
2080
+ uncensored=True,
1858
2081
  ),
1859
2082
  ],
1860
2083
  ),
@@ -2286,6 +2509,41 @@ built_in_models: List[KilnModel] = [
2286
2509
  ),
2287
2510
  ],
2288
2511
  ),
2512
+ # Kimi K2 Instruct
2513
+ KilnModel(
2514
+ family=ModelFamily.kimi,
2515
+ name=ModelName.kimi_k2,
2516
+ friendly_name="Kimi K2",
2517
+ providers=[
2518
+ KilnModelProvider(
2519
+ name=ModelProviderName.fireworks_ai,
2520
+ model_id="accounts/fireworks/models/kimi-k2-instruct",
2521
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2522
+ # Ignoring json mode for now, so not suggested for evals
2523
+ ),
2524
+ KilnModelProvider(
2525
+ name=ModelProviderName.openrouter,
2526
+ model_id="moonshotai/kimi-k2",
2527
+ structured_output_mode=StructuredOutputMode.json_schema,
2528
+ supports_data_gen=True,
2529
+ suggested_for_evals=True,
2530
+ ),
2531
+ KilnModelProvider(
2532
+ name=ModelProviderName.together_ai,
2533
+ model_id="moonshotai/Kimi-K2-Instruct",
2534
+ supports_data_gen=True,
2535
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
2536
+ suggested_for_evals=True,
2537
+ ),
2538
+ KilnModelProvider(
2539
+ name=ModelProviderName.groq,
2540
+ model_id="moonshotai/kimi-k2-instruct",
2541
+ supports_data_gen=True,
2542
+ structured_output_mode=StructuredOutputMode.function_calling,
2543
+ suggested_for_evals=True,
2544
+ ),
2545
+ ],
2546
+ ),
2289
2547
  ]
2290
2548
 
2291
2549
 
@@ -2294,3 +2552,31 @@ def get_model_by_name(name: ModelName) -> KilnModel:
2294
2552
  if model.name == name:
2295
2553
  return model
2296
2554
  raise ValueError(f"Model {name} not found in the list of built-in models")
2555
+
2556
+
2557
+ def default_structured_output_mode_for_model_provider(
2558
+ model_name: str,
2559
+ provider: ModelProviderName,
2560
+ default: StructuredOutputMode = StructuredOutputMode.default,
2561
+ disallowed_modes: List[StructuredOutputMode] = [],
2562
+ ) -> StructuredOutputMode:
2563
+ """
2564
+ We don't expose setting this manually in the UI, so pull a recommended mode from ml_model_list
2565
+ """
2566
+ try:
2567
+ # Convert string to ModelName enum
2568
+ model_name_enum = ModelName(model_name)
2569
+ model = get_model_by_name(model_name_enum)
2570
+ except (ValueError, KeyError):
2571
+ # If model not found, return default
2572
+ return default
2573
+
2574
+ # Find the provider within the model's providers
2575
+ for model_provider in model.providers:
2576
+ if model_provider.name == provider:
2577
+ mode = model_provider.structured_output_mode
2578
+ if mode not in disallowed_modes:
2579
+ return mode
2580
+
2581
+ # If provider not found, return default
2582
+ return default