kiln-ai 0.8.1__py3-none-any.whl → 0.11.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (57) hide show
  1. kiln_ai/adapters/__init__.py +7 -7
  2. kiln_ai/adapters/adapter_registry.py +77 -5
  3. kiln_ai/adapters/data_gen/data_gen_task.py +3 -3
  4. kiln_ai/adapters/data_gen/test_data_gen_task.py +23 -3
  5. kiln_ai/adapters/fine_tune/base_finetune.py +5 -1
  6. kiln_ai/adapters/fine_tune/dataset_formatter.py +310 -65
  7. kiln_ai/adapters/fine_tune/fireworks_finetune.py +47 -32
  8. kiln_ai/adapters/fine_tune/openai_finetune.py +12 -11
  9. kiln_ai/adapters/fine_tune/test_base_finetune.py +19 -0
  10. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +469 -129
  11. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +113 -21
  12. kiln_ai/adapters/fine_tune/test_openai_finetune.py +125 -14
  13. kiln_ai/adapters/ml_model_list.py +323 -94
  14. kiln_ai/adapters/model_adapters/__init__.py +18 -0
  15. kiln_ai/adapters/{base_adapter.py → model_adapters/base_adapter.py} +81 -37
  16. kiln_ai/adapters/{langchain_adapters.py → model_adapters/langchain_adapters.py} +130 -84
  17. kiln_ai/adapters/model_adapters/openai_compatible_config.py +11 -0
  18. kiln_ai/adapters/model_adapters/openai_model_adapter.py +246 -0
  19. kiln_ai/adapters/model_adapters/test_base_adapter.py +190 -0
  20. kiln_ai/adapters/{test_langchain_adapter.py → model_adapters/test_langchain_adapter.py} +103 -88
  21. kiln_ai/adapters/model_adapters/test_openai_model_adapter.py +225 -0
  22. kiln_ai/adapters/{test_saving_adapter_results.py → model_adapters/test_saving_adapter_results.py} +43 -15
  23. kiln_ai/adapters/{test_structured_output.py → model_adapters/test_structured_output.py} +93 -20
  24. kiln_ai/adapters/parsers/__init__.py +10 -0
  25. kiln_ai/adapters/parsers/base_parser.py +12 -0
  26. kiln_ai/adapters/parsers/json_parser.py +37 -0
  27. kiln_ai/adapters/parsers/parser_registry.py +19 -0
  28. kiln_ai/adapters/parsers/r1_parser.py +69 -0
  29. kiln_ai/adapters/parsers/test_json_parser.py +81 -0
  30. kiln_ai/adapters/parsers/test_parser_registry.py +32 -0
  31. kiln_ai/adapters/parsers/test_r1_parser.py +144 -0
  32. kiln_ai/adapters/prompt_builders.py +126 -20
  33. kiln_ai/adapters/provider_tools.py +91 -36
  34. kiln_ai/adapters/repair/repair_task.py +17 -6
  35. kiln_ai/adapters/repair/test_repair_task.py +4 -4
  36. kiln_ai/adapters/run_output.py +8 -0
  37. kiln_ai/adapters/test_adapter_registry.py +177 -0
  38. kiln_ai/adapters/test_generate_docs.py +69 -0
  39. kiln_ai/adapters/test_prompt_adaptors.py +8 -4
  40. kiln_ai/adapters/test_prompt_builders.py +190 -29
  41. kiln_ai/adapters/test_provider_tools.py +268 -46
  42. kiln_ai/datamodel/__init__.py +193 -12
  43. kiln_ai/datamodel/basemodel.py +31 -11
  44. kiln_ai/datamodel/json_schema.py +8 -3
  45. kiln_ai/datamodel/model_cache.py +8 -3
  46. kiln_ai/datamodel/test_basemodel.py +81 -2
  47. kiln_ai/datamodel/test_dataset_split.py +100 -3
  48. kiln_ai/datamodel/test_example_models.py +25 -4
  49. kiln_ai/datamodel/test_model_cache.py +24 -0
  50. kiln_ai/datamodel/test_model_perf.py +125 -0
  51. kiln_ai/datamodel/test_models.py +129 -0
  52. kiln_ai/utils/exhaustive_error.py +6 -0
  53. {kiln_ai-0.8.1.dist-info → kiln_ai-0.11.1.dist-info}/METADATA +9 -7
  54. kiln_ai-0.11.1.dist-info/RECORD +76 -0
  55. kiln_ai-0.8.1.dist-info/RECORD +0 -58
  56. {kiln_ai-0.8.1.dist-info → kiln_ai-0.11.1.dist-info}/WHEEL +0 -0
  57. {kiln_ai-0.8.1.dist-info → kiln_ai-0.11.1.dist-info}/licenses/LICENSE.txt +0 -0
@@ -3,6 +3,8 @@ from typing import Dict, List
3
3
 
4
4
  from pydantic import BaseModel
5
5
 
6
+ from kiln_ai.datamodel import StructuredOutputMode
7
+
6
8
  """
7
9
  Provides model configuration and management for various LLM providers and models.
8
10
  This module handles the integration with different AI model providers and their respective models,
@@ -40,6 +42,7 @@ class ModelFamily(str, Enum):
40
42
  claude = "claude"
41
43
  mixtral = "mixtral"
42
44
  qwen = "qwen"
45
+ deepseek = "deepseek"
43
46
 
44
47
 
45
48
  # Where models have instruct and raw versions, instruct is default and raw is specified
@@ -60,6 +63,7 @@ class ModelName(str, Enum):
60
63
  gpt_4o_mini = "gpt_4o_mini"
61
64
  gpt_4o = "gpt_4o"
62
65
  phi_3_5 = "phi_3_5"
66
+ phi_4 = "phi_4"
63
67
  mistral_large = "mistral_large"
64
68
  mistral_nemo = "mistral_nemo"
65
69
  gemma_2_2b = "gemma_2_2b"
@@ -70,10 +74,28 @@ class ModelName(str, Enum):
70
74
  gemini_1_5_flash = "gemini_1_5_flash"
71
75
  gemini_1_5_flash_8b = "gemini_1_5_flash_8b"
72
76
  gemini_1_5_pro = "gemini_1_5_pro"
77
+ gemini_2_0_flash = "gemini_2_0_flash"
73
78
  nemotron_70b = "nemotron_70b"
74
79
  mixtral_8x7b = "mixtral_8x7b"
75
80
  qwen_2p5_7b = "qwen_2p5_7b"
76
81
  qwen_2p5_72b = "qwen_2p5_72b"
82
+ deepseek_3 = "deepseek_3"
83
+ deepseek_r1 = "deepseek_r1"
84
+ mistral_small_3 = "mistral_small_3"
85
+ deepseek_r1_distill_qwen_32b = "deepseek_r1_distill_qwen_32b"
86
+ deepseek_r1_distill_llama_70b = "deepseek_r1_distill_llama_70b"
87
+ deepseek_r1_distill_qwen_14b = "deepseek_r1_distill_qwen_14b"
88
+ deepseek_r1_distill_qwen_1p5b = "deepseek_r1_distill_qwen_1p5b"
89
+ deepseek_r1_distill_qwen_7b = "deepseek_r1_distill_qwen_7b"
90
+ deepseek_r1_distill_llama_8b = "deepseek_r1_distill_llama_8b"
91
+
92
+
93
+ class ModelParserID(str, Enum):
94
+ """
95
+ Enumeration of supported model parsers.
96
+ """
97
+
98
+ r1_thinking = "r1_thinking"
77
99
 
78
100
 
79
101
  class KilnModelProvider(BaseModel):
@@ -87,7 +109,9 @@ class KilnModelProvider(BaseModel):
87
109
  untested_model: Whether the model is untested (typically user added). The supports_ fields are not applicable.
88
110
  provider_finetune_id: The finetune ID for the provider, if applicable
89
111
  provider_options: Additional provider-specific configuration options
90
- adapter_options: Additional options specific to the adapter. Top level key should be adapter ID.
112
+ structured_output_mode: The mode we should use to call the model for structured output, if it was trained with structured output.
113
+ parser: A parser to use for the model, if applicable
114
+ 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.
91
115
  """
92
116
 
93
117
  name: ModelProviderName
@@ -96,7 +120,9 @@ class KilnModelProvider(BaseModel):
96
120
  untested_model: bool = False
97
121
  provider_finetune_id: str | None = None
98
122
  provider_options: Dict = {}
99
- adapter_options: Dict = {}
123
+ structured_output_mode: StructuredOutputMode = StructuredOutputMode.default
124
+ parser: ModelParserID | None = None
125
+ reasoning_capable: bool = False
100
126
 
101
127
 
102
128
  class KilnModel(BaseModel):
@@ -115,7 +141,6 @@ class KilnModel(BaseModel):
115
141
  name: str
116
142
  friendly_name: str
117
143
  providers: List[KilnModelProvider]
118
- supports_structured_output: bool = True
119
144
 
120
145
 
121
146
  built_in_models: List[KilnModel] = [
@@ -129,10 +154,12 @@ built_in_models: List[KilnModel] = [
129
154
  name=ModelProviderName.openai,
130
155
  provider_options={"model": "gpt-4o-mini"},
131
156
  provider_finetune_id="gpt-4o-mini-2024-07-18",
157
+ structured_output_mode=StructuredOutputMode.json_schema,
132
158
  ),
133
159
  KilnModelProvider(
134
160
  name=ModelProviderName.openrouter,
135
161
  provider_options={"model": "openai/gpt-4o-mini"},
162
+ structured_output_mode=StructuredOutputMode.json_schema,
136
163
  ),
137
164
  ],
138
165
  ),
@@ -146,10 +173,12 @@ built_in_models: List[KilnModel] = [
146
173
  name=ModelProviderName.openai,
147
174
  provider_options={"model": "gpt-4o"},
148
175
  provider_finetune_id="gpt-4o-2024-08-06",
176
+ structured_output_mode=StructuredOutputMode.json_schema,
149
177
  ),
150
178
  KilnModelProvider(
151
179
  name=ModelProviderName.openrouter,
152
- provider_options={"model": "openai/gpt-4o-2024-08-06"},
180
+ provider_options={"model": "openai/gpt-4o"},
181
+ structured_output_mode=StructuredOutputMode.json_schema,
153
182
  ),
154
183
  ],
155
184
  ),
@@ -161,6 +190,7 @@ built_in_models: List[KilnModel] = [
161
190
  providers=[
162
191
  KilnModelProvider(
163
192
  name=ModelProviderName.openrouter,
193
+ structured_output_mode=StructuredOutputMode.function_calling,
164
194
  provider_options={"model": "anthropic/claude-3-5-haiku"},
165
195
  ),
166
196
  ],
@@ -173,10 +203,54 @@ built_in_models: List[KilnModel] = [
173
203
  providers=[
174
204
  KilnModelProvider(
175
205
  name=ModelProviderName.openrouter,
206
+ structured_output_mode=StructuredOutputMode.function_calling,
176
207
  provider_options={"model": "anthropic/claude-3.5-sonnet"},
177
208
  ),
178
209
  ],
179
210
  ),
211
+ # DeepSeek 3
212
+ KilnModel(
213
+ family=ModelFamily.deepseek,
214
+ name=ModelName.deepseek_3,
215
+ friendly_name="DeepSeek v3",
216
+ providers=[
217
+ KilnModelProvider(
218
+ name=ModelProviderName.openrouter,
219
+ provider_options={"model": "deepseek/deepseek-chat"},
220
+ structured_output_mode=StructuredOutputMode.function_calling,
221
+ ),
222
+ ],
223
+ ),
224
+ # DeepSeek R1
225
+ KilnModel(
226
+ family=ModelFamily.deepseek,
227
+ name=ModelName.deepseek_r1,
228
+ friendly_name="DeepSeek R1",
229
+ providers=[
230
+ KilnModelProvider(
231
+ name=ModelProviderName.openrouter,
232
+ provider_options={"model": "deepseek/deepseek-r1"},
233
+ # No custom parser -- openrouter implemented it themselves
234
+ structured_output_mode=StructuredOutputMode.json_instructions,
235
+ reasoning_capable=True,
236
+ ),
237
+ KilnModelProvider(
238
+ name=ModelProviderName.fireworks_ai,
239
+ provider_options={"model": "accounts/fireworks/models/deepseek-r1"},
240
+ parser=ModelParserID.r1_thinking,
241
+ structured_output_mode=StructuredOutputMode.json_instructions,
242
+ reasoning_capable=True,
243
+ ),
244
+ KilnModelProvider(
245
+ # I want your RAM
246
+ name=ModelProviderName.ollama,
247
+ provider_options={"model": "deepseek-r1:671b"},
248
+ parser=ModelParserID.r1_thinking,
249
+ structured_output_mode=StructuredOutputMode.json_instructions,
250
+ reasoning_capable=True,
251
+ ),
252
+ ],
253
+ ),
180
254
  # Gemini 1.5 Pro
181
255
  KilnModel(
182
256
  family=ModelFamily.gemini,
@@ -185,9 +259,8 @@ built_in_models: List[KilnModel] = [
185
259
  providers=[
186
260
  KilnModelProvider(
187
261
  name=ModelProviderName.openrouter,
188
- supports_structured_output=False, # it should, but doesn't work on openrouter
189
- supports_data_gen=False, # doesn't work on openrouter
190
262
  provider_options={"model": "google/gemini-pro-1.5"},
263
+ structured_output_mode=StructuredOutputMode.json_schema,
191
264
  ),
192
265
  ],
193
266
  ),
@@ -199,8 +272,8 @@ built_in_models: List[KilnModel] = [
199
272
  providers=[
200
273
  KilnModelProvider(
201
274
  name=ModelProviderName.openrouter,
202
- supports_data_gen=False,
203
275
  provider_options={"model": "google/gemini-flash-1.5"},
276
+ structured_output_mode=StructuredOutputMode.json_schema,
204
277
  ),
205
278
  ],
206
279
  ),
@@ -212,9 +285,21 @@ built_in_models: List[KilnModel] = [
212
285
  providers=[
213
286
  KilnModelProvider(
214
287
  name=ModelProviderName.openrouter,
215
- supports_structured_output=False,
216
- supports_data_gen=False,
217
288
  provider_options={"model": "google/gemini-flash-1.5-8b"},
289
+ structured_output_mode=StructuredOutputMode.json_mode,
290
+ ),
291
+ ],
292
+ ),
293
+ # Gemini 2.0 Flash
294
+ KilnModel(
295
+ family=ModelFamily.gemini,
296
+ name=ModelName.gemini_2_0_flash,
297
+ friendly_name="Gemini 2.0 Flash",
298
+ providers=[
299
+ KilnModelProvider(
300
+ name=ModelProviderName.openrouter,
301
+ structured_output_mode=StructuredOutputMode.json_schema,
302
+ provider_options={"model": "google/gemini-2.0-flash-001"},
218
303
  ),
219
304
  ],
220
305
  ),
@@ -244,7 +329,7 @@ built_in_models: List[KilnModel] = [
244
329
  ),
245
330
  KilnModelProvider(
246
331
  name=ModelProviderName.amazon_bedrock,
247
- supports_structured_output=False,
332
+ structured_output_mode=StructuredOutputMode.json_schema,
248
333
  supports_data_gen=False,
249
334
  provider_options={
250
335
  "model": "meta.llama3-1-8b-instruct-v1:0",
@@ -253,7 +338,7 @@ built_in_models: List[KilnModel] = [
253
338
  ),
254
339
  KilnModelProvider(
255
340
  name=ModelProviderName.ollama,
256
- supports_data_gen=False,
341
+ structured_output_mode=StructuredOutputMode.json_schema,
257
342
  provider_options={
258
343
  "model": "llama3.1:8b",
259
344
  "model_aliases": ["llama3.1"], # 8b is default
@@ -261,14 +346,14 @@ built_in_models: List[KilnModel] = [
261
346
  ),
262
347
  KilnModelProvider(
263
348
  name=ModelProviderName.openrouter,
264
- supports_structured_output=False,
265
349
  supports_data_gen=False,
350
+ structured_output_mode=StructuredOutputMode.function_calling,
266
351
  provider_options={"model": "meta-llama/llama-3.1-8b-instruct"},
267
352
  ),
268
353
  KilnModelProvider(
269
354
  name=ModelProviderName.fireworks_ai,
270
- supports_structured_output=False,
271
- supports_data_gen=False,
355
+ # JSON mode not ideal (no schema), but tool calling doesn't work on 8b
356
+ structured_output_mode=StructuredOutputMode.json_mode,
272
357
  provider_finetune_id="accounts/fireworks/models/llama-v3p1-8b-instruct",
273
358
  provider_options={
274
359
  "model": "accounts/fireworks/models/llama-v3p1-8b-instruct"
@@ -282,14 +367,9 @@ built_in_models: List[KilnModel] = [
282
367
  name=ModelName.llama_3_1_70b,
283
368
  friendly_name="Llama 3.1 70B",
284
369
  providers=[
285
- KilnModelProvider(
286
- name=ModelProviderName.groq,
287
- provider_options={"model": "llama-3.1-70b-versatile"},
288
- ),
289
370
  KilnModelProvider(
290
371
  name=ModelProviderName.amazon_bedrock,
291
- # AWS 70b not working as well as the others.
292
- supports_structured_output=False,
372
+ structured_output_mode=StructuredOutputMode.json_schema,
293
373
  supports_data_gen=False,
294
374
  provider_options={
295
375
  "model": "meta.llama3-1-70b-instruct-v1:0",
@@ -298,14 +378,19 @@ built_in_models: List[KilnModel] = [
298
378
  ),
299
379
  KilnModelProvider(
300
380
  name=ModelProviderName.openrouter,
381
+ supports_data_gen=False,
382
+ structured_output_mode=StructuredOutputMode.function_calling,
301
383
  provider_options={"model": "meta-llama/llama-3.1-70b-instruct"},
302
384
  ),
303
385
  KilnModelProvider(
304
386
  name=ModelProviderName.ollama,
387
+ structured_output_mode=StructuredOutputMode.json_schema,
305
388
  provider_options={"model": "llama3.1:70b"},
306
389
  ),
307
390
  KilnModelProvider(
308
391
  name=ModelProviderName.fireworks_ai,
392
+ # Tool calling forces schema -- fireworks doesn't support json_schema, just json_mode
393
+ structured_output_mode=StructuredOutputMode.function_calling,
309
394
  provider_finetune_id="accounts/fireworks/models/llama-v3p1-70b-instruct",
310
395
  provider_options={
311
396
  "model": "accounts/fireworks/models/llama-v3p1-70b-instruct"
@@ -321,6 +406,7 @@ built_in_models: List[KilnModel] = [
321
406
  providers=[
322
407
  KilnModelProvider(
323
408
  name=ModelProviderName.amazon_bedrock,
409
+ structured_output_mode=StructuredOutputMode.json_schema,
324
410
  supports_data_gen=False,
325
411
  provider_options={
326
412
  "model": "meta.llama3-1-405b-instruct-v1:0",
@@ -329,15 +415,18 @@ built_in_models: List[KilnModel] = [
329
415
  ),
330
416
  KilnModelProvider(
331
417
  name=ModelProviderName.ollama,
418
+ structured_output_mode=StructuredOutputMode.json_schema,
332
419
  provider_options={"model": "llama3.1:405b"},
333
420
  ),
334
421
  KilnModelProvider(
335
422
  name=ModelProviderName.openrouter,
423
+ structured_output_mode=StructuredOutputMode.function_calling,
336
424
  provider_options={"model": "meta-llama/llama-3.1-405b-instruct"},
337
425
  ),
338
426
  KilnModelProvider(
339
427
  name=ModelProviderName.fireworks_ai,
340
428
  # No finetune support. https://docs.fireworks.ai/fine-tuning/fine-tuning-models
429
+ structured_output_mode=StructuredOutputMode.function_calling,
341
430
  provider_options={
342
431
  "model": "accounts/fireworks/models/llama-v3p1-405b-instruct"
343
432
  },
@@ -353,6 +442,7 @@ built_in_models: List[KilnModel] = [
353
442
  KilnModelProvider(
354
443
  name=ModelProviderName.openrouter,
355
444
  provider_options={"model": "mistralai/mistral-nemo"},
445
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
356
446
  ),
357
447
  ],
358
448
  ),
@@ -364,6 +454,7 @@ built_in_models: List[KilnModel] = [
364
454
  providers=[
365
455
  KilnModelProvider(
366
456
  name=ModelProviderName.amazon_bedrock,
457
+ structured_output_mode=StructuredOutputMode.json_schema,
367
458
  provider_options={
368
459
  "model": "mistral.mistral-large-2407-v1:0",
369
460
  "region_name": "us-west-2", # only in west-2
@@ -371,10 +462,12 @@ built_in_models: List[KilnModel] = [
371
462
  ),
372
463
  KilnModelProvider(
373
464
  name=ModelProviderName.openrouter,
465
+ structured_output_mode=StructuredOutputMode.json_schema,
374
466
  provider_options={"model": "mistralai/mistral-large"},
375
467
  ),
376
468
  KilnModelProvider(
377
469
  name=ModelProviderName.ollama,
470
+ structured_output_mode=StructuredOutputMode.json_schema,
378
471
  provider_options={"model": "mistral-large"},
379
472
  ),
380
473
  ],
@@ -385,10 +478,16 @@ built_in_models: List[KilnModel] = [
385
478
  name=ModelName.llama_3_2_1b,
386
479
  friendly_name="Llama 3.2 1B",
387
480
  providers=[
481
+ KilnModelProvider(
482
+ name=ModelProviderName.groq,
483
+ provider_options={"model": "llama-3.2-1b-preview"},
484
+ supports_data_gen=False,
485
+ ),
388
486
  KilnModelProvider(
389
487
  name=ModelProviderName.openrouter,
390
488
  supports_structured_output=False,
391
489
  supports_data_gen=False,
490
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
392
491
  provider_options={"model": "meta-llama/llama-3.2-1b-instruct"},
393
492
  ),
394
493
  KilnModelProvider(
@@ -397,15 +496,6 @@ built_in_models: List[KilnModel] = [
397
496
  supports_data_gen=False,
398
497
  provider_options={"model": "llama3.2:1b"},
399
498
  ),
400
- KilnModelProvider(
401
- name=ModelProviderName.fireworks_ai,
402
- provider_finetune_id="accounts/fireworks/models/llama-v3p2-1b-instruct",
403
- supports_structured_output=False,
404
- supports_data_gen=False,
405
- provider_options={
406
- "model": "accounts/fireworks/models/llama-v3p2-1b-instruct"
407
- },
408
- ),
409
499
  ],
410
500
  ),
411
501
  # Llama 3.2 3B
@@ -414,23 +504,27 @@ built_in_models: List[KilnModel] = [
414
504
  name=ModelName.llama_3_2_3b,
415
505
  friendly_name="Llama 3.2 3B",
416
506
  providers=[
507
+ KilnModelProvider(
508
+ name=ModelProviderName.groq,
509
+ provider_options={"model": "llama-3.2-3b-preview"},
510
+ supports_data_gen=False,
511
+ ),
417
512
  KilnModelProvider(
418
513
  name=ModelProviderName.openrouter,
419
514
  supports_structured_output=False,
420
515
  supports_data_gen=False,
516
+ structured_output_mode=StructuredOutputMode.json_schema,
421
517
  provider_options={"model": "meta-llama/llama-3.2-3b-instruct"},
422
518
  ),
423
519
  KilnModelProvider(
424
520
  name=ModelProviderName.ollama,
425
- supports_structured_output=False,
426
521
  supports_data_gen=False,
427
522
  provider_options={"model": "llama3.2"},
428
523
  ),
429
524
  KilnModelProvider(
430
525
  name=ModelProviderName.fireworks_ai,
431
526
  provider_finetune_id="accounts/fireworks/models/llama-v3p2-3b-instruct",
432
- supports_structured_output=False,
433
- supports_data_gen=False,
527
+ structured_output_mode=StructuredOutputMode.json_mode,
434
528
  provider_options={
435
529
  "model": "accounts/fireworks/models/llama-v3p2-3b-instruct"
436
530
  },
@@ -443,19 +537,18 @@ built_in_models: List[KilnModel] = [
443
537
  name=ModelName.llama_3_2_11b,
444
538
  friendly_name="Llama 3.2 11B",
445
539
  providers=[
540
+ KilnModelProvider(
541
+ name=ModelProviderName.groq,
542
+ provider_options={"model": "llama-3.2-11b-vision-preview"},
543
+ ),
446
544
  KilnModelProvider(
447
545
  name=ModelProviderName.openrouter,
546
+ structured_output_mode=StructuredOutputMode.json_schema,
448
547
  provider_options={"model": "meta-llama/llama-3.2-11b-vision-instruct"},
449
- adapter_options={
450
- "langchain": {
451
- "with_structured_output_options": {"method": "json_mode"}
452
- }
453
- },
454
548
  ),
455
549
  KilnModelProvider(
456
550
  name=ModelProviderName.ollama,
457
- supports_structured_output=False,
458
- supports_data_gen=False,
551
+ structured_output_mode=StructuredOutputMode.json_schema,
459
552
  provider_options={"model": "llama3.2-vision"},
460
553
  ),
461
554
  KilnModelProvider(
@@ -464,11 +557,7 @@ built_in_models: List[KilnModel] = [
464
557
  provider_options={
465
558
  "model": "accounts/fireworks/models/llama-v3p2-11b-vision-instruct"
466
559
  },
467
- adapter_options={
468
- "langchain": {
469
- "with_structured_output_options": {"method": "json_mode"}
470
- }
471
- },
560
+ structured_output_mode=StructuredOutputMode.json_mode,
472
561
  ),
473
562
  ],
474
563
  ),
@@ -478,17 +567,18 @@ built_in_models: List[KilnModel] = [
478
567
  name=ModelName.llama_3_2_90b,
479
568
  friendly_name="Llama 3.2 90B",
480
569
  providers=[
570
+ KilnModelProvider(
571
+ name=ModelProviderName.groq,
572
+ provider_options={"model": "llama-3.2-90b-vision-preview"},
573
+ ),
481
574
  KilnModelProvider(
482
575
  name=ModelProviderName.openrouter,
576
+ structured_output_mode=StructuredOutputMode.json_schema,
483
577
  provider_options={"model": "meta-llama/llama-3.2-90b-vision-instruct"},
484
- adapter_options={
485
- "langchain": {
486
- "with_structured_output_options": {"method": "json_mode"}
487
- }
488
- },
489
578
  ),
490
579
  KilnModelProvider(
491
580
  name=ModelProviderName.ollama,
581
+ structured_output_mode=StructuredOutputMode.json_schema,
492
582
  provider_options={"model": "llama3.2-vision:90b"},
493
583
  ),
494
584
  KilnModelProvider(
@@ -497,11 +587,7 @@ built_in_models: List[KilnModel] = [
497
587
  provider_options={
498
588
  "model": "accounts/fireworks/models/llama-v3p2-90b-vision-instruct"
499
589
  },
500
- adapter_options={
501
- "langchain": {
502
- "with_structured_output_options": {"method": "json_mode"}
503
- }
504
- },
590
+ structured_output_mode=StructuredOutputMode.json_mode,
505
591
  ),
506
592
  ],
507
593
  ),
@@ -514,14 +600,10 @@ built_in_models: List[KilnModel] = [
514
600
  KilnModelProvider(
515
601
  name=ModelProviderName.openrouter,
516
602
  provider_options={"model": "meta-llama/llama-3.3-70b-instruct"},
517
- # Openrouter not supporing tools yet. Once they do probably can remove. JSON mode sometimes works, but not consistently.
603
+ structured_output_mode=StructuredOutputMode.json_schema,
604
+ # Openrouter not working with json_schema or tools. JSON_schema sometimes works so force that, but not consistently so still not recommended.
518
605
  supports_structured_output=False,
519
606
  supports_data_gen=False,
520
- adapter_options={
521
- "langchain": {
522
- "with_structured_output_options": {"method": "json_mode"}
523
- }
524
- },
525
607
  ),
526
608
  KilnModelProvider(
527
609
  name=ModelProviderName.groq,
@@ -531,14 +613,15 @@ built_in_models: List[KilnModel] = [
531
613
  ),
532
614
  KilnModelProvider(
533
615
  name=ModelProviderName.ollama,
616
+ structured_output_mode=StructuredOutputMode.json_schema,
534
617
  provider_options={"model": "llama3.3"},
535
618
  ),
536
619
  KilnModelProvider(
537
620
  name=ModelProviderName.fireworks_ai,
538
621
  # Finetuning not live yet
539
622
  # provider_finetune_id="accounts/fireworks/models/llama-v3p3-70b-instruct",
540
- supports_structured_output=True,
541
- supports_data_gen=True,
623
+ # Tool calling forces schema -- fireworks doesn't support json_schema, just json_mode
624
+ structured_output_mode=StructuredOutputMode.function_calling,
542
625
  provider_options={
543
626
  "model": "accounts/fireworks/models/llama-v3p3-70b-instruct"
544
627
  },
@@ -550,10 +633,10 @@ built_in_models: List[KilnModel] = [
550
633
  family=ModelFamily.phi,
551
634
  name=ModelName.phi_3_5,
552
635
  friendly_name="Phi 3.5",
553
- supports_structured_output=False,
554
636
  providers=[
555
637
  KilnModelProvider(
556
638
  name=ModelProviderName.ollama,
639
+ structured_output_mode=StructuredOutputMode.json_schema,
557
640
  supports_structured_output=False,
558
641
  supports_data_gen=False,
559
642
  provider_options={"model": "phi3.5"},
@@ -563,28 +646,47 @@ built_in_models: List[KilnModel] = [
563
646
  supports_structured_output=False,
564
647
  supports_data_gen=False,
565
648
  provider_options={"model": "microsoft/phi-3.5-mini-128k-instruct"},
649
+ structured_output_mode=StructuredOutputMode.json_schema,
566
650
  ),
567
651
  KilnModelProvider(
568
652
  name=ModelProviderName.fireworks_ai,
569
- supports_structured_output=False,
570
- supports_data_gen=False,
571
653
  # No finetune support. https://docs.fireworks.ai/fine-tuning/fine-tuning-models
654
+ structured_output_mode=StructuredOutputMode.json_mode,
655
+ supports_data_gen=False,
572
656
  provider_options={
573
657
  "model": "accounts/fireworks/models/phi-3-vision-128k-instruct"
574
658
  },
575
659
  ),
576
660
  ],
577
661
  ),
662
+ # Phi 4
663
+ KilnModel(
664
+ family=ModelFamily.phi,
665
+ name=ModelName.phi_4,
666
+ friendly_name="Phi 4",
667
+ providers=[
668
+ KilnModelProvider(
669
+ name=ModelProviderName.ollama,
670
+ structured_output_mode=StructuredOutputMode.json_schema,
671
+ provider_options={"model": "phi4"},
672
+ ),
673
+ KilnModelProvider(
674
+ name=ModelProviderName.openrouter,
675
+ # JSON mode not consistent enough to enable in UI
676
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
677
+ supports_data_gen=False,
678
+ provider_options={"model": "microsoft/phi-4"},
679
+ ),
680
+ ],
681
+ ),
578
682
  # Gemma 2 2.6b
579
683
  KilnModel(
580
684
  family=ModelFamily.gemma,
581
685
  name=ModelName.gemma_2_2b,
582
686
  friendly_name="Gemma 2 2B",
583
- supports_structured_output=False,
584
687
  providers=[
585
688
  KilnModelProvider(
586
689
  name=ModelProviderName.ollama,
587
- supports_structured_output=False,
588
690
  supports_data_gen=False,
589
691
  provider_options={
590
692
  "model": "gemma2:2b",
@@ -597,7 +699,6 @@ built_in_models: List[KilnModel] = [
597
699
  family=ModelFamily.gemma,
598
700
  name=ModelName.gemma_2_9b,
599
701
  friendly_name="Gemma 2 9B",
600
- supports_structured_output=False,
601
702
  providers=[
602
703
  KilnModelProvider(
603
704
  name=ModelProviderName.ollama,
@@ -608,6 +709,7 @@ built_in_models: List[KilnModel] = [
608
709
  ),
609
710
  KilnModelProvider(
610
711
  name=ModelProviderName.openrouter,
712
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
611
713
  supports_data_gen=False,
612
714
  provider_options={"model": "google/gemma-2-9b-it"},
613
715
  ),
@@ -619,7 +721,6 @@ built_in_models: List[KilnModel] = [
619
721
  family=ModelFamily.gemma,
620
722
  name=ModelName.gemma_2_27b,
621
723
  friendly_name="Gemma 2 27B",
622
- supports_structured_output=False,
623
724
  providers=[
624
725
  KilnModelProvider(
625
726
  name=ModelProviderName.ollama,
@@ -630,6 +731,7 @@ built_in_models: List[KilnModel] = [
630
731
  ),
631
732
  KilnModelProvider(
632
733
  name=ModelProviderName.openrouter,
734
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
633
735
  supports_data_gen=False,
634
736
  provider_options={"model": "google/gemma-2-27b-it"},
635
737
  ),
@@ -644,16 +746,11 @@ built_in_models: List[KilnModel] = [
644
746
  KilnModelProvider(
645
747
  name=ModelProviderName.openrouter,
646
748
  provider_options={"model": "mistralai/mixtral-8x7b-instruct"},
647
- adapter_options={
648
- "langchain": {
649
- "with_structured_output_options": {"method": "json_mode"}
650
- }
651
- },
749
+ supports_data_gen=False,
750
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
652
751
  ),
653
752
  KilnModelProvider(
654
753
  name=ModelProviderName.ollama,
655
- supports_structured_output=False,
656
- supports_data_gen=False,
657
754
  provider_options={"model": "mixtral"},
658
755
  ),
659
756
  ],
@@ -667,14 +764,7 @@ built_in_models: List[KilnModel] = [
667
764
  KilnModelProvider(
668
765
  name=ModelProviderName.openrouter,
669
766
  provider_options={"model": "qwen/qwen-2.5-7b-instruct"},
670
- # Tool calls not supported. JSON doesn't error, but fails.
671
- supports_structured_output=False,
672
- supports_data_gen=False,
673
- adapter_options={
674
- "langchain": {
675
- "with_structured_output_options": {"method": "json_mode"}
676
- }
677
- },
767
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
678
768
  ),
679
769
  KilnModelProvider(
680
770
  name=ModelProviderName.ollama,
@@ -694,11 +784,7 @@ built_in_models: List[KilnModel] = [
694
784
  # Not consistent with structure data. Works sometimes but not often
695
785
  supports_structured_output=False,
696
786
  supports_data_gen=False,
697
- adapter_options={
698
- "langchain": {
699
- "with_structured_output_options": {"method": "json_mode"}
700
- }
701
- },
787
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
702
788
  ),
703
789
  KilnModelProvider(
704
790
  name=ModelProviderName.ollama,
@@ -711,11 +797,154 @@ built_in_models: List[KilnModel] = [
711
797
  },
712
798
  # Fireworks will start tuning, but it never finishes.
713
799
  # provider_finetune_id="accounts/fireworks/models/qwen2p5-72b-instruct",
714
- adapter_options={
715
- "langchain": {
716
- "with_structured_output_options": {"method": "json_mode"}
717
- }
718
- },
800
+ # Tool calling forces schema -- fireworks doesn't support json_schema, just json_mode
801
+ structured_output_mode=StructuredOutputMode.function_calling,
802
+ ),
803
+ ],
804
+ ),
805
+ # Mistral Small 3
806
+ KilnModel(
807
+ family=ModelFamily.mistral,
808
+ name=ModelName.mistral_small_3,
809
+ friendly_name="Mistral Small 3",
810
+ providers=[
811
+ KilnModelProvider(
812
+ name=ModelProviderName.openrouter,
813
+ structured_output_mode=StructuredOutputMode.json_instruction_and_object,
814
+ provider_options={"model": "mistralai/mistral-small-24b-instruct-2501"},
815
+ ),
816
+ KilnModelProvider(
817
+ name=ModelProviderName.ollama,
818
+ provider_options={"model": "mistral-small:24b"},
819
+ ),
820
+ ],
821
+ ),
822
+ # DeepSeek R1 Distill Qwen 32B
823
+ KilnModel(
824
+ family=ModelFamily.deepseek,
825
+ name=ModelName.deepseek_r1_distill_qwen_32b,
826
+ friendly_name="DeepSeek R1 Distill Qwen 32B",
827
+ providers=[
828
+ KilnModelProvider(
829
+ name=ModelProviderName.openrouter,
830
+ reasoning_capable=True,
831
+ structured_output_mode=StructuredOutputMode.json_instructions,
832
+ provider_options={"model": "deepseek/deepseek-r1-distill-qwen-32b"},
833
+ ),
834
+ KilnModelProvider(
835
+ name=ModelProviderName.ollama,
836
+ parser=ModelParserID.r1_thinking,
837
+ reasoning_capable=True,
838
+ structured_output_mode=StructuredOutputMode.json_instructions,
839
+ provider_options={"model": "deepseek-r1:32b"},
840
+ ),
841
+ ],
842
+ ),
843
+ # DeepSeek R1 Distill Llama 70B
844
+ KilnModel(
845
+ family=ModelFamily.deepseek,
846
+ name=ModelName.deepseek_r1_distill_llama_70b,
847
+ friendly_name="DeepSeek R1 Distill Llama 70B",
848
+ providers=[
849
+ KilnModelProvider(
850
+ name=ModelProviderName.openrouter,
851
+ reasoning_capable=True,
852
+ structured_output_mode=StructuredOutputMode.json_instructions,
853
+ provider_options={"model": "deepseek/deepseek-r1-distill-llama-70b"},
854
+ ),
855
+ KilnModelProvider(
856
+ name=ModelProviderName.ollama,
857
+ supports_data_gen=False,
858
+ parser=ModelParserID.r1_thinking,
859
+ reasoning_capable=True,
860
+ structured_output_mode=StructuredOutputMode.json_instructions,
861
+ provider_options={"model": "deepseek-r1:70b"},
862
+ ),
863
+ ],
864
+ ),
865
+ # DeepSeek R1 Distill Qwen 14B
866
+ KilnModel(
867
+ family=ModelFamily.deepseek,
868
+ name=ModelName.deepseek_r1_distill_qwen_14b,
869
+ friendly_name="DeepSeek R1 Distill Qwen 14B",
870
+ providers=[
871
+ KilnModelProvider(
872
+ name=ModelProviderName.openrouter,
873
+ supports_data_gen=False,
874
+ reasoning_capable=True,
875
+ structured_output_mode=StructuredOutputMode.json_instructions,
876
+ provider_options={"model": "deepseek/deepseek-r1-distill-qwen-14b"},
877
+ ),
878
+ KilnModelProvider(
879
+ name=ModelProviderName.ollama,
880
+ supports_data_gen=False,
881
+ parser=ModelParserID.r1_thinking,
882
+ reasoning_capable=True,
883
+ structured_output_mode=StructuredOutputMode.json_instructions,
884
+ provider_options={"model": "deepseek-r1:14b"},
885
+ ),
886
+ ],
887
+ ),
888
+ # DeepSeek R1 Distill Llama 8B
889
+ KilnModel(
890
+ family=ModelFamily.deepseek,
891
+ name=ModelName.deepseek_r1_distill_llama_8b,
892
+ friendly_name="DeepSeek R1 Distill Llama 8B",
893
+ providers=[
894
+ KilnModelProvider(
895
+ name=ModelProviderName.openrouter,
896
+ supports_data_gen=False,
897
+ reasoning_capable=True,
898
+ structured_output_mode=StructuredOutputMode.json_instructions,
899
+ provider_options={"model": "deepseek/deepseek-r1-distill-llama-8b"},
900
+ ),
901
+ KilnModelProvider(
902
+ name=ModelProviderName.ollama,
903
+ supports_data_gen=False,
904
+ parser=ModelParserID.r1_thinking,
905
+ reasoning_capable=True,
906
+ structured_output_mode=StructuredOutputMode.json_instructions,
907
+ provider_options={"model": "deepseek-r1:8b"},
908
+ ),
909
+ ],
910
+ ),
911
+ # DeepSeek R1 Distill Qwen 7B
912
+ KilnModel(
913
+ family=ModelFamily.deepseek,
914
+ name=ModelName.deepseek_r1_distill_qwen_7b,
915
+ friendly_name="DeepSeek R1 Distill Qwen 7B",
916
+ providers=[
917
+ KilnModelProvider(
918
+ name=ModelProviderName.ollama,
919
+ supports_data_gen=False,
920
+ parser=ModelParserID.r1_thinking,
921
+ reasoning_capable=True,
922
+ structured_output_mode=StructuredOutputMode.json_instructions,
923
+ provider_options={"model": "deepseek-r1:7b"},
924
+ ),
925
+ ],
926
+ ),
927
+ # DeepSeek R1 Distill Qwen 1.5B
928
+ KilnModel(
929
+ family=ModelFamily.deepseek,
930
+ name=ModelName.deepseek_r1_distill_qwen_1p5b,
931
+ friendly_name="DeepSeek R1 Distill Qwen 1.5B",
932
+ providers=[
933
+ KilnModelProvider(
934
+ name=ModelProviderName.openrouter,
935
+ supports_structured_output=False,
936
+ supports_data_gen=False,
937
+ reasoning_capable=True,
938
+ structured_output_mode=StructuredOutputMode.json_instructions,
939
+ provider_options={"model": "deepseek/deepseek-r1-distill-qwen-1.5b"},
940
+ ),
941
+ KilnModelProvider(
942
+ name=ModelProviderName.ollama,
943
+ supports_data_gen=False,
944
+ parser=ModelParserID.r1_thinking,
945
+ reasoning_capable=True,
946
+ structured_output_mode=StructuredOutputMode.json_instructions,
947
+ provider_options={"model": "deepseek-r1:1.5b"},
719
948
  ),
720
949
  ],
721
950
  ),