kiln-ai 0.11.1__py3-none-any.whl → 0.13.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 (80) hide show
  1. kiln_ai/adapters/__init__.py +4 -0
  2. kiln_ai/adapters/adapter_registry.py +163 -39
  3. kiln_ai/adapters/data_gen/data_gen_task.py +18 -0
  4. kiln_ai/adapters/eval/__init__.py +28 -0
  5. kiln_ai/adapters/eval/base_eval.py +164 -0
  6. kiln_ai/adapters/eval/eval_runner.py +270 -0
  7. kiln_ai/adapters/eval/g_eval.py +368 -0
  8. kiln_ai/adapters/eval/registry.py +16 -0
  9. kiln_ai/adapters/eval/test_base_eval.py +325 -0
  10. kiln_ai/adapters/eval/test_eval_runner.py +641 -0
  11. kiln_ai/adapters/eval/test_g_eval.py +498 -0
  12. kiln_ai/adapters/eval/test_g_eval_data.py +4 -0
  13. kiln_ai/adapters/fine_tune/base_finetune.py +16 -2
  14. kiln_ai/adapters/fine_tune/finetune_registry.py +2 -0
  15. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +4 -1
  16. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +1 -1
  17. kiln_ai/adapters/fine_tune/test_openai_finetune.py +1 -1
  18. kiln_ai/adapters/fine_tune/test_together_finetune.py +531 -0
  19. kiln_ai/adapters/fine_tune/together_finetune.py +325 -0
  20. kiln_ai/adapters/ml_model_list.py +758 -163
  21. kiln_ai/adapters/model_adapters/__init__.py +2 -4
  22. kiln_ai/adapters/model_adapters/base_adapter.py +61 -43
  23. kiln_ai/adapters/model_adapters/litellm_adapter.py +391 -0
  24. kiln_ai/adapters/model_adapters/litellm_config.py +13 -0
  25. kiln_ai/adapters/model_adapters/test_base_adapter.py +22 -13
  26. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +407 -0
  27. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +41 -19
  28. kiln_ai/adapters/model_adapters/test_structured_output.py +59 -35
  29. kiln_ai/adapters/ollama_tools.py +3 -3
  30. kiln_ai/adapters/parsers/r1_parser.py +19 -14
  31. kiln_ai/adapters/parsers/test_r1_parser.py +17 -5
  32. kiln_ai/adapters/prompt_builders.py +80 -42
  33. kiln_ai/adapters/provider_tools.py +50 -58
  34. kiln_ai/adapters/repair/repair_task.py +9 -21
  35. kiln_ai/adapters/repair/test_repair_task.py +6 -6
  36. kiln_ai/adapters/run_output.py +3 -0
  37. kiln_ai/adapters/test_adapter_registry.py +26 -29
  38. kiln_ai/adapters/test_generate_docs.py +4 -4
  39. kiln_ai/adapters/test_ollama_tools.py +0 -1
  40. kiln_ai/adapters/test_prompt_adaptors.py +47 -33
  41. kiln_ai/adapters/test_prompt_builders.py +91 -31
  42. kiln_ai/adapters/test_provider_tools.py +26 -81
  43. kiln_ai/datamodel/__init__.py +50 -952
  44. kiln_ai/datamodel/basemodel.py +2 -0
  45. kiln_ai/datamodel/datamodel_enums.py +60 -0
  46. kiln_ai/datamodel/dataset_filters.py +114 -0
  47. kiln_ai/datamodel/dataset_split.py +170 -0
  48. kiln_ai/datamodel/eval.py +298 -0
  49. kiln_ai/datamodel/finetune.py +105 -0
  50. kiln_ai/datamodel/json_schema.py +7 -1
  51. kiln_ai/datamodel/project.py +23 -0
  52. kiln_ai/datamodel/prompt.py +37 -0
  53. kiln_ai/datamodel/prompt_id.py +83 -0
  54. kiln_ai/datamodel/strict_mode.py +24 -0
  55. kiln_ai/datamodel/task.py +181 -0
  56. kiln_ai/datamodel/task_output.py +328 -0
  57. kiln_ai/datamodel/task_run.py +164 -0
  58. kiln_ai/datamodel/test_basemodel.py +19 -11
  59. kiln_ai/datamodel/test_dataset_filters.py +71 -0
  60. kiln_ai/datamodel/test_dataset_split.py +32 -8
  61. kiln_ai/datamodel/test_datasource.py +22 -2
  62. kiln_ai/datamodel/test_eval_model.py +635 -0
  63. kiln_ai/datamodel/test_example_models.py +9 -13
  64. kiln_ai/datamodel/test_json_schema.py +23 -0
  65. kiln_ai/datamodel/test_models.py +2 -2
  66. kiln_ai/datamodel/test_prompt_id.py +129 -0
  67. kiln_ai/datamodel/test_task.py +159 -0
  68. kiln_ai/utils/config.py +43 -1
  69. kiln_ai/utils/dataset_import.py +232 -0
  70. kiln_ai/utils/test_dataset_import.py +596 -0
  71. {kiln_ai-0.11.1.dist-info → kiln_ai-0.13.0.dist-info}/METADATA +86 -6
  72. kiln_ai-0.13.0.dist-info/RECORD +103 -0
  73. kiln_ai/adapters/model_adapters/langchain_adapters.py +0 -302
  74. kiln_ai/adapters/model_adapters/openai_compatible_config.py +0 -11
  75. kiln_ai/adapters/model_adapters/openai_model_adapter.py +0 -246
  76. kiln_ai/adapters/model_adapters/test_langchain_adapter.py +0 -350
  77. kiln_ai/adapters/model_adapters/test_openai_model_adapter.py +0 -225
  78. kiln_ai-0.11.1.dist-info/RECORD +0 -76
  79. {kiln_ai-0.11.1.dist-info → kiln_ai-0.13.0.dist-info}/WHEEL +0 -0
  80. {kiln_ai-0.11.1.dist-info → kiln_ai-0.13.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -17,12 +17,11 @@ from kiln_ai.adapters.provider_tools import (
17
17
  finetune_provider_model,
18
18
  get_model_and_provider,
19
19
  kiln_model_provider_from,
20
- openai_compatible_config,
21
- openai_compatible_provider_model,
20
+ lite_llm_config,
21
+ lite_llm_provider_model,
22
22
  parse_custom_model_id,
23
23
  provider_enabled,
24
24
  provider_name_from_id,
25
- provider_options_for_custom_model,
26
25
  provider_warnings,
27
26
  )
28
27
  from kiln_ai.datamodel import Finetune, StructuredOutputMode, Task
@@ -186,7 +185,7 @@ def test_get_model_and_provider_valid():
186
185
  assert provider is not None
187
186
  assert model.name == ModelName.phi_3_5
188
187
  assert provider.name == ModelProviderName.ollama
189
- assert provider.provider_options["model"] == "phi3.5"
188
+ assert provider.model_id == "phi3.5"
190
189
 
191
190
 
192
191
  def test_get_model_and_provider_invalid_model():
@@ -227,7 +226,7 @@ def test_get_model_and_provider_multiple_providers():
227
226
  assert provider is not None
228
227
  assert model.name == ModelName.llama_3_3_70b
229
228
  assert provider.name == ModelProviderName.groq
230
- assert provider.provider_options["model"] == "llama-3.3-70b-versatile"
229
+ assert provider.model_id == "llama-3.3-70b-versatile"
231
230
 
232
231
 
233
232
  @pytest.mark.asyncio
@@ -324,59 +323,7 @@ async def test_kiln_model_provider_from_custom_model_valid(mock_config):
324
323
  assert provider.supports_structured_output is False
325
324
  assert provider.supports_data_gen is False
326
325
  assert provider.untested_model is True
327
- assert "model" in provider.provider_options
328
- assert provider.provider_options["model"] == "custom_model"
329
-
330
-
331
- def test_provider_options_for_custom_model_basic():
332
- """Test basic case with custom model name"""
333
- options = provider_options_for_custom_model(
334
- "custom_model_name", ModelProviderName.openai
335
- )
336
- assert options == {"model": "custom_model_name"}
337
-
338
-
339
- def test_provider_options_for_custom_model_bedrock():
340
- """Test Amazon Bedrock provider options"""
341
- options = provider_options_for_custom_model(
342
- ModelName.llama_3_1_8b, ModelProviderName.amazon_bedrock
343
- )
344
- assert options == {"model": ModelName.llama_3_1_8b, "region_name": "us-west-2"}
345
-
346
-
347
- @pytest.mark.parametrize(
348
- "provider",
349
- [
350
- ModelProviderName.openai,
351
- ModelProviderName.ollama,
352
- ModelProviderName.fireworks_ai,
353
- ModelProviderName.openrouter,
354
- ModelProviderName.groq,
355
- ],
356
- )
357
- def test_provider_options_for_custom_model_simple_providers(provider):
358
- """Test providers that just need model name"""
359
-
360
- options = provider_options_for_custom_model(ModelName.llama_3_1_8b, provider)
361
- assert options == {"model": ModelName.llama_3_1_8b}
362
-
363
-
364
- def test_provider_options_for_custom_model_kiln_fine_tune():
365
- """Test that kiln_fine_tune raises appropriate error"""
366
- with pytest.raises(ValueError) as exc_info:
367
- provider_options_for_custom_model(
368
- "model_name", ModelProviderName.kiln_fine_tune
369
- )
370
- assert (
371
- str(exc_info.value)
372
- == "Fine tuned models should populate provider options via another path"
373
- )
374
-
375
-
376
- def test_provider_options_for_custom_model_invalid_enum():
377
- """Test handling of invalid enum value"""
378
- with pytest.raises(ValueError):
379
- provider_options_for_custom_model("model_name", "invalid_enum_value")
326
+ assert provider.model_id == "custom_model"
380
327
 
381
328
 
382
329
  @pytest.mark.asyncio
@@ -393,7 +340,7 @@ async def test_kiln_model_provider_from_custom_registry(mock_config):
393
340
  assert provider.supports_structured_output is False
394
341
  assert provider.supports_data_gen is False
395
342
  assert provider.untested_model is True
396
- assert provider.provider_options == {"model": "gpt-4-turbo"}
343
+ assert provider.model_id == "gpt-4-turbo"
397
344
 
398
345
 
399
346
  @pytest.mark.asyncio
@@ -412,7 +359,7 @@ async def test_builtin_model_from_valid_model_default_provider(mock_config):
412
359
 
413
360
  assert provider is not None
414
361
  assert provider.name == ModelProviderName.ollama
415
- assert provider.provider_options["model"] == "phi3.5"
362
+ assert provider.model_id == "phi3.5"
416
363
 
417
364
 
418
365
  @pytest.mark.asyncio
@@ -426,7 +373,7 @@ async def test_builtin_model_from_valid_model_specific_provider(mock_config):
426
373
 
427
374
  assert provider is not None
428
375
  assert provider.name == ModelProviderName.groq
429
- assert provider.provider_options["model"] == "llama-3.3-70b-versatile"
376
+ assert provider.model_id == "llama-3.3-70b-versatile"
430
377
 
431
378
 
432
379
  @pytest.mark.asyncio
@@ -477,7 +424,7 @@ def test_finetune_provider_model_success(mock_project, mock_task, mock_finetune)
477
424
  provider = finetune_provider_model(model_id)
478
425
 
479
426
  assert provider.name == ModelProviderName.openai
480
- assert provider.provider_options == {"model": "ft:gpt-3.5-turbo:custom:model-123"}
427
+ assert provider.model_id == "ft:gpt-3.5-turbo:custom:model-123"
481
428
  assert provider.structured_output_mode == StructuredOutputMode.json_schema
482
429
 
483
430
 
@@ -573,7 +520,7 @@ def test_finetune_provider_model_structured_mode(
573
520
  provider = finetune_provider_model("project-123::task-456::finetune-789")
574
521
 
575
522
  assert provider.name == provider_name
576
- assert provider.provider_options == {"model": "fireworks-model-123"}
523
+ assert provider.model_id == "fireworks-model-123"
577
524
  assert provider.structured_output_mode == expected_mode
578
525
 
579
526
 
@@ -581,69 +528,67 @@ def test_openai_compatible_provider_config(mock_shared_config):
581
528
  """Test successful creation of an OpenAI compatible provider"""
582
529
  model_id = "test_provider::gpt-4"
583
530
 
584
- config = openai_compatible_config(model_id)
531
+ config = lite_llm_config(model_id)
585
532
 
586
533
  assert config.provider_name == ModelProviderName.openai_compatible
587
534
  assert config.model_name == "gpt-4"
588
- assert config.api_key == "test-key"
535
+ assert config.additional_body_options == {"api_key": "test-key"}
589
536
  assert config.base_url == "https://api.test.com"
590
537
 
591
538
 
592
- def test_openai_compatible_provider_model_success(mock_shared_config):
539
+ def test_litellm_provider_model_success(mock_shared_config):
593
540
  """Test successful creation of an OpenAI compatible provider"""
594
541
  model_id = "test_provider::gpt-4"
595
542
 
596
- provider = openai_compatible_provider_model(model_id)
543
+ provider = lite_llm_provider_model(model_id)
597
544
 
598
545
  assert provider.name == ModelProviderName.openai_compatible
599
- assert provider.provider_options == {
600
- "model": model_id,
601
- }
546
+ assert provider.model_id == model_id
602
547
  assert provider.supports_structured_output is False
603
548
  assert provider.supports_data_gen is False
604
549
  assert provider.untested_model is True
605
550
 
606
551
 
607
- def test_openai_compatible_config_no_api_key(mock_shared_config):
552
+ def test_lite_llm_config_no_api_key(mock_shared_config):
608
553
  """Test provider creation without API key (should work as some providers don't require it)"""
609
554
  model_id = "no_key_provider::gpt-4"
610
555
 
611
- config = openai_compatible_config(model_id)
556
+ config = lite_llm_config(model_id)
612
557
 
613
558
  assert config.provider_name == ModelProviderName.openai_compatible
614
559
  assert config.model_name == "gpt-4"
615
- assert config.api_key is None
560
+ assert config.additional_body_options == {"api_key": None}
616
561
  assert config.base_url == "https://api.nokey.com"
617
562
 
618
563
 
619
- def test_openai_compatible_config_invalid_id():
564
+ def test_lite_llm_config_invalid_id():
620
565
  """Test handling of invalid model ID format"""
621
566
  with pytest.raises(ValueError) as exc_info:
622
- openai_compatible_config("invalid-id-format")
567
+ lite_llm_config("invalid-id-format")
623
568
  assert (
624
569
  str(exc_info.value) == "Invalid openai compatible model ID: invalid-id-format"
625
570
  )
626
571
 
627
572
 
628
- def test_openai_compatible_config_no_providers(mock_shared_config):
573
+ def test_lite_llm_config_no_providers(mock_shared_config):
629
574
  """Test handling when no providers are configured"""
630
575
  mock_shared_config.return_value.openai_compatible_providers = None
631
576
 
632
577
  with pytest.raises(ValueError) as exc_info:
633
- openai_compatible_config("test_provider::gpt-4")
578
+ lite_llm_config("test_provider::gpt-4")
634
579
  assert str(exc_info.value) == "OpenAI compatible provider test_provider not found"
635
580
 
636
581
 
637
- def test_openai_compatible_config_provider_not_found(mock_shared_config):
582
+ def test_lite_llm_config_provider_not_found(mock_shared_config):
638
583
  """Test handling of non-existent provider"""
639
584
  with pytest.raises(ValueError) as exc_info:
640
- openai_compatible_config("unknown_provider::gpt-4")
585
+ lite_llm_config("unknown_provider::gpt-4")
641
586
  assert (
642
587
  str(exc_info.value) == "OpenAI compatible provider unknown_provider not found"
643
588
  )
644
589
 
645
590
 
646
- def test_openai_compatible_config_no_base_url(mock_shared_config):
591
+ def test_lite_llm_config_no_base_url(mock_shared_config):
647
592
  """Test handling of provider without base URL"""
648
593
  mock_shared_config.return_value.openai_compatible_providers = [
649
594
  {
@@ -653,7 +598,7 @@ def test_openai_compatible_config_no_base_url(mock_shared_config):
653
598
  ]
654
599
 
655
600
  with pytest.raises(ValueError) as exc_info:
656
- openai_compatible_config("test_provider::gpt-4")
601
+ lite_llm_config("test_provider::gpt-4")
657
602
  assert (
658
603
  str(exc_info.value)
659
604
  == "OpenAI compatible provider test_provider has no base URL"