kiln-ai 0.12.0__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 (47) hide show
  1. kiln_ai/adapters/__init__.py +4 -0
  2. kiln_ai/adapters/adapter_registry.py +153 -28
  3. kiln_ai/adapters/eval/__init__.py +28 -0
  4. kiln_ai/adapters/eval/eval_runner.py +4 -1
  5. kiln_ai/adapters/eval/g_eval.py +2 -1
  6. kiln_ai/adapters/eval/test_base_eval.py +1 -0
  7. kiln_ai/adapters/eval/test_eval_runner.py +1 -0
  8. kiln_ai/adapters/eval/test_g_eval.py +1 -0
  9. kiln_ai/adapters/fine_tune/base_finetune.py +16 -2
  10. kiln_ai/adapters/fine_tune/finetune_registry.py +2 -0
  11. kiln_ai/adapters/fine_tune/test_together_finetune.py +531 -0
  12. kiln_ai/adapters/fine_tune/together_finetune.py +325 -0
  13. kiln_ai/adapters/ml_model_list.py +638 -155
  14. kiln_ai/adapters/model_adapters/__init__.py +2 -4
  15. kiln_ai/adapters/model_adapters/base_adapter.py +14 -11
  16. kiln_ai/adapters/model_adapters/litellm_adapter.py +391 -0
  17. kiln_ai/adapters/model_adapters/litellm_config.py +13 -0
  18. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +407 -0
  19. kiln_ai/adapters/model_adapters/test_structured_output.py +23 -5
  20. kiln_ai/adapters/ollama_tools.py +3 -2
  21. kiln_ai/adapters/parsers/r1_parser.py +19 -14
  22. kiln_ai/adapters/parsers/test_r1_parser.py +17 -5
  23. kiln_ai/adapters/provider_tools.py +50 -58
  24. kiln_ai/adapters/repair/test_repair_task.py +3 -3
  25. kiln_ai/adapters/run_output.py +1 -1
  26. kiln_ai/adapters/test_adapter_registry.py +17 -20
  27. kiln_ai/adapters/test_generate_docs.py +2 -2
  28. kiln_ai/adapters/test_prompt_adaptors.py +30 -19
  29. kiln_ai/adapters/test_provider_tools.py +26 -81
  30. kiln_ai/datamodel/basemodel.py +2 -0
  31. kiln_ai/datamodel/datamodel_enums.py +2 -0
  32. kiln_ai/datamodel/json_schema.py +1 -1
  33. kiln_ai/datamodel/task_output.py +13 -6
  34. kiln_ai/datamodel/test_basemodel.py +9 -0
  35. kiln_ai/datamodel/test_datasource.py +19 -0
  36. kiln_ai/utils/config.py +37 -0
  37. kiln_ai/utils/dataset_import.py +232 -0
  38. kiln_ai/utils/test_dataset_import.py +596 -0
  39. {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.0.dist-info}/METADATA +51 -7
  40. {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.0.dist-info}/RECORD +42 -39
  41. kiln_ai/adapters/model_adapters/langchain_adapters.py +0 -309
  42. kiln_ai/adapters/model_adapters/openai_compatible_config.py +0 -10
  43. kiln_ai/adapters/model_adapters/openai_model_adapter.py +0 -289
  44. kiln_ai/adapters/model_adapters/test_langchain_adapter.py +0 -343
  45. kiln_ai/adapters/model_adapters/test_openai_model_adapter.py +0 -216
  46. {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.0.dist-info}/WHEEL +0 -0
  47. {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,68 +1,69 @@
1
1
  kiln_ai/__init__.py,sha256=Sc4z8LRVFMwJUoc_DPVUriSXTZ6PO9MaJ80PhRbKyB8,34
2
- kiln_ai/adapters/__init__.py,sha256=4qEnFkkRSHPKDU7AvYNkqXECjZO_K7PzDCK3HbsY7o4,902
3
- kiln_ai/adapters/adapter_registry.py,sha256=o7JhzL627W3WMvpztsI_D0pqLPXP-IgIf3e-o7DAVxE,3720
4
- kiln_ai/adapters/ml_model_list.py,sha256=IzxswO2zORd7bsovswvRpZMwIs1BZcMtPcnhLZ7xzkk,40969
5
- kiln_ai/adapters/ollama_tools.py,sha256=ZkiGCaocKTMsb1JoySupv9a1OQuE72CCuKsNpyp6jNU,3551
2
+ kiln_ai/adapters/__init__.py,sha256=XjGmWagEyOEVwVIAxjN5rYNsQWIEACT5DB7MMTxdPss,1005
3
+ kiln_ai/adapters/adapter_registry.py,sha256=rOIL8xMm_REVO92iDphj_cBwhDOZVyS5ST-nHk4_6pA,8955
4
+ kiln_ai/adapters/ml_model_list.py,sha256=u1nFkJm_UD1IZjBBoynmWnhx_aPkuvSuHVI69Thma3w,58939
5
+ kiln_ai/adapters/ollama_tools.py,sha256=uObtLWfqKb9RXHN-TGGw2Y1FQlEMe0u8FgszI0zQn6U,3550
6
6
  kiln_ai/adapters/prompt_builders.py,sha256=LYHTIaisQMBFtWDRIGo1QJgOsmQ-NBpQ8fI4eImHxaQ,15269
7
- kiln_ai/adapters/provider_tools.py,sha256=CGNLW0xhFyj93HFwznCoDrrbyQbQAaS2mJuOKaMB6gU,14435
8
- kiln_ai/adapters/run_output.py,sha256=_WVNqJ9cQehgEJR3Jy5_Pp29QnurpmEf-S6UU6WAegE,271
9
- kiln_ai/adapters/test_adapter_registry.py,sha256=opowxLBWm0lZTPL9S4qEaOS8HB82dTpZeNuhpE_cNHU,6379
10
- kiln_ai/adapters/test_generate_docs.py,sha256=RQ5flkg4fbosj_fB3RiRZyXSqD_UtOHNBYJsne6UkzU,2782
7
+ kiln_ai/adapters/provider_tools.py,sha256=pVLziYwHQxOZODil3iyn-BnW8CyCYnFsSdjerliWqvs,14671
8
+ kiln_ai/adapters/run_output.py,sha256=RAi2Qp6dmqJVNm3CxbNTdAuhitHfH5NiUGbf6ygUP-k,257
9
+ kiln_ai/adapters/test_adapter_registry.py,sha256=eDLHqv9mwgdde221pa47bTV87vCXwkUyjqsas-iFUrY,6123
10
+ kiln_ai/adapters/test_generate_docs.py,sha256=M-uKcgF3hQmlEFOJ0o7DyL-9RgitGzkfROV-Dxtooec,2770
11
11
  kiln_ai/adapters/test_ollama_tools.py,sha256=xAUzL0IVmmXadVehJu1WjqbhpKEYGAgGt3pWx7hrubc,2514
12
- kiln_ai/adapters/test_prompt_adaptors.py,sha256=CKyToDKS4v-tQO9pq4tiq_ypnY4ePhY9yrRAtG-58p0,7516
12
+ kiln_ai/adapters/test_prompt_adaptors.py,sha256=J1ZGZ8GG7SxP3_J3Zw0e6XmZY4NyPmUGX3IPgjh2LD8,7767
13
13
  kiln_ai/adapters/test_prompt_builders.py,sha256=5Xvfr-oQg_LLrle6UqfpRHWcPUYa8ywG3aL1rM7q1Jw,22054
14
- kiln_ai/adapters/test_provider_tools.py,sha256=DtnC6oFuiBvvbhD-kdCcWzEYqXZfMBM_DexuQdyAVR8,28664
14
+ kiln_ai/adapters/test_provider_tools.py,sha256=T2t99i4LnH4xilmyV4przff3MnTdDvAnTmaiYhFPShE,26621
15
15
  kiln_ai/adapters/data_gen/__init__.py,sha256=QTZWaf7kq5BorhPvexJfwDEKmjRmIbhwW9ei8LW2SIs,276
16
16
  kiln_ai/adapters/data_gen/data_gen_prompts.py,sha256=kudjHnAz7L3q0k_NLyTlaIV7M0uRFrxXNcfcnjOE2uc,5810
17
17
  kiln_ai/adapters/data_gen/data_gen_task.py,sha256=0PuYCcj09BtpgNj23mKj_L45mKZBdV5VreUeZ-Tj_xM,6642
18
18
  kiln_ai/adapters/data_gen/test_data_gen_task.py,sha256=cRKUKMvC0uVompbmPTKwbnQ_N3c0cQDm4J_9H4Y5U18,10129
19
+ kiln_ai/adapters/eval/__init__.py,sha256=0ptbK0ZxWuraxGn_WMgmE1tcaq0k5t-g-52kVohvWCg,693
19
20
  kiln_ai/adapters/eval/base_eval.py,sha256=jVXMiVBC07ZnLEuZVAjUAYewsnuV99put39n_GZcG1M,7261
20
- kiln_ai/adapters/eval/eval_runner.py,sha256=A8GhVEt4J_p2-EZlN592blVxY0anKiMiLgac155pcfQ,10688
21
- kiln_ai/adapters/eval/g_eval.py,sha256=VXYZi-5WG8Go4E2shaOL4D3V2cL_c2zmEno2N1b2WPM,14295
21
+ kiln_ai/adapters/eval/eval_runner.py,sha256=h3DvRFM5J5LDJqaLzNJ-q9i5LRycv2J9Ev5nw1mUDUQ,10806
22
+ kiln_ai/adapters/eval/g_eval.py,sha256=muJuolDz3SSJNcruqkMmgo8P3sX5Pzm6XD7vtfiVeX4,14298
22
23
  kiln_ai/adapters/eval/registry.py,sha256=gZ_s0VgEx79Fswkgi1tS4yOl7lzpkvUBJZ62RldhM_w,626
23
- kiln_ai/adapters/eval/test_base_eval.py,sha256=AGq09bziZm9zh_37PP59AzpkWW7hQU1o7vHSiDsObhY,10723
24
- kiln_ai/adapters/eval/test_eval_runner.py,sha256=58jRE_2qHZmsDlMj41DrbgE8w9PKC9wwAT-vbi_R4Ec,18567
25
- kiln_ai/adapters/eval/test_g_eval.py,sha256=wcR56b3vSKn88JeCCQz92p8TMgZlgSP1ged_XlFrYlg,16162
24
+ kiln_ai/adapters/eval/test_base_eval.py,sha256=_1CiOUOiBt1R_gGYMcRblrPkHf-H4uIlvfcHj5-Wh7o,10724
25
+ kiln_ai/adapters/eval/test_eval_runner.py,sha256=82WPE_frNRTSQ2lylqT0inkqcDgM72nWt8GEuoDkJ7w,18568
26
+ kiln_ai/adapters/eval/test_g_eval.py,sha256=XSZ12BEqhzYLOfCg1VFZwu2DkbI9h4kVCqOFgzp9gX8,16163
26
27
  kiln_ai/adapters/eval/test_g_eval_data.py,sha256=8caiZfLWnXVX8alrBPrH7L7gqqSS9vO7u6PzcHurQcA,27769
27
28
  kiln_ai/adapters/fine_tune/__init__.py,sha256=DxdTR60chwgck1aEoVYWyfWi6Ed2ZkdJj0lar-SEAj4,257
28
- kiln_ai/adapters/fine_tune/base_finetune.py,sha256=n3mfE_3bhhzmN_MQxO5qNezN-qpl4WFamZ3ih41dx4o,6069
29
+ kiln_ai/adapters/fine_tune/base_finetune.py,sha256=MxSnBiapWfZQw5UmkYAtC0QXj2zDeF9Ows0k0g3p1IA,6455
29
30
  kiln_ai/adapters/fine_tune/dataset_formatter.py,sha256=qRhSSkMhTWn13OMb6LKPVwAU7uY4bB49GDiVSuhDkNg,14449
30
- kiln_ai/adapters/fine_tune/finetune_registry.py,sha256=H1B-opCTlIyd9JlIFTKsY_ctxUX9ziEc49_gnmg1SZg,483
31
+ kiln_ai/adapters/fine_tune/finetune_registry.py,sha256=CvcEVxtKwjgCMA-oYH9Tpjn1DVWmMzgHpXJOZ0YQA8k,610
31
32
  kiln_ai/adapters/fine_tune/fireworks_finetune.py,sha256=6IfTDn_8tg6PR0OFudRx6V7Wjvf4P7t0fm_xyRwII68,13978
32
33
  kiln_ai/adapters/fine_tune/openai_finetune.py,sha256=Dz9E_0BWfrIkvv8ArZe-RKPwbIKPZ3v8rfbc3JELyTY,8571
33
34
  kiln_ai/adapters/fine_tune/test_base_finetune.py,sha256=0zWxFYrDGVuoQNQmi9vVUEkBc4mstfHnsUjQmiJA-sE,10864
34
35
  kiln_ai/adapters/fine_tune/test_dataset_formatter.py,sha256=T3jbFZooLVBaGCE0LUVxwPxzM3l8IY41zUj3jPk-Zi8,24027
35
36
  kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py,sha256=e88z5-KtU9Y7frXqCVy6r6iE6S-tInn5oMOqmSnbR2I,18144
36
37
  kiln_ai/adapters/fine_tune/test_openai_finetune.py,sha256=H63Xk2PNHbt5Ev5IQpdR9JZ4uz-Huo2gfuC4mHHqe0w,20011
37
- kiln_ai/adapters/model_adapters/__init__.py,sha256=FyNq-twr1zQR55Hd_sDlTcVZ8JsZ9jrIBBURtZNjlss,272
38
- kiln_ai/adapters/model_adapters/base_adapter.py,sha256=tY67FJlWzYY-Ha1FyBMes3KacklFfTSqvU6-crILQsc,9597
39
- kiln_ai/adapters/model_adapters/langchain_adapters.py,sha256=LVggQGeg_fIol1uYo375JHmjh7pwDhCACVe1K7lh28Y,12996
40
- kiln_ai/adapters/model_adapters/openai_compatible_config.py,sha256=oxiUUESM9f5EVMePDSJI7s6YaMmmBkFMCEdxA50mwgw,241
41
- kiln_ai/adapters/model_adapters/openai_model_adapter.py,sha256=KuCPFuNZ5aZwymLL8k87PNjUVOs9JyR91W7VKtw9yN8,11438
38
+ kiln_ai/adapters/fine_tune/test_together_finetune.py,sha256=YHtOHi2bsZcUDVHY62DTRKF3ZQry3Dv-qeW8povyR1o,17991
39
+ kiln_ai/adapters/fine_tune/together_finetune.py,sha256=kp-60ClwUimtjhRDsvPErS5whLDsBHGZhw8ITQ9JWCM,13868
40
+ kiln_ai/adapters/model_adapters/__init__.py,sha256=m5GRtOHwVVvp_XDOss8c1X3NFf1wQQlC2eBgI4tXQhM,212
41
+ kiln_ai/adapters/model_adapters/base_adapter.py,sha256=ifPJMg0nEKamfOSmBIsnp_MRFfBs47FLeQrLbav34yA,9872
42
+ kiln_ai/adapters/model_adapters/litellm_adapter.py,sha256=c4J_tIpM96KWS2qzoPaQmBj7X7mHyRMShdkmEh7_EHM,16129
43
+ kiln_ai/adapters/model_adapters/litellm_config.py,sha256=7-tIh5cuVu23Uy2Sd6q7UCT_4VgevBsAzVhQMj6Svgw,425
42
44
  kiln_ai/adapters/model_adapters/test_base_adapter.py,sha256=uQyKrHLN3Jha6R-6SWkEME6brQecVFdPTSXogo-xpt0,6556
43
- kiln_ai/adapters/model_adapters/test_langchain_adapter.py,sha256=PArWTKytzUoM9Lc9Q0bEOcvZDNTF2SzfR9ln8sf0Hzg,11884
44
- kiln_ai/adapters/model_adapters/test_openai_model_adapter.py,sha256=CV6a3Sf3f3szpk1MLBoAjcuL5B5-4n86j8tMlEA-Bhg,6844
45
+ kiln_ai/adapters/model_adapters/test_litellm_adapter.py,sha256=QpnzuReNeBzvvRYnNj_5c8l1PS7NyrDDUQx_o21IIH4,13731
45
46
  kiln_ai/adapters/model_adapters/test_saving_adapter_results.py,sha256=1XFQQxdSIbqSoQEdxHOYJcY0cMb59qpTDPOmL9bW4B8,7870
46
- kiln_ai/adapters/model_adapters/test_structured_output.py,sha256=7N5xniBWXDxwb4gvV8k0bbrlTir2kWBE6Q_z2azBJvs,11865
47
+ kiln_ai/adapters/model_adapters/test_structured_output.py,sha256=lHZSuPyvr--WCCEIik5OFqfvufmooPBbbUlSMUVvqmE,12516
47
48
  kiln_ai/adapters/parsers/__init__.py,sha256=TGJS_8JhjUwg5Bnq4cDmwt5eIRo4vowmcL2A72L1Hzk,202
48
49
  kiln_ai/adapters/parsers/base_parser.py,sha256=DaoZVEOOuFTMZd5ZTpl_as6-xc9NPWGP2fAmP12J58M,389
49
50
  kiln_ai/adapters/parsers/json_parser.py,sha256=IszrBrhIFrrVr76UZsuejkBdqpZG27mU72264HVgVzE,1274
50
51
  kiln_ai/adapters/parsers/parser_registry.py,sha256=G9bAZrnWrR0a82JAQHsSqA2o7-CjrZUBANZljY_6ZxE,623
51
- kiln_ai/adapters/parsers/r1_parser.py,sha256=9nMEWDAbRSTFuu_--0HMVfVg9IYSoUNQHHw9OxETlRw,2558
52
+ kiln_ai/adapters/parsers/r1_parser.py,sha256=XHc_dKxiQjj8wG1w__rTmJVqa4fIg5L1g-igbv5Rl_g,2965
52
53
  kiln_ai/adapters/parsers/test_json_parser.py,sha256=9kdWe_vRC5wjP8A1Ym6Zu6enDIz4ARCNiRpcZr7_3ak,1971
53
54
  kiln_ai/adapters/parsers/test_parser_registry.py,sha256=S4MdX7cnhCbmeKq8tZwMwRdGWr-019Z-fw5zey9Wm08,1043
54
- kiln_ai/adapters/parsers/test_r1_parser.py,sha256=Ys1ICRNVgt54rf8IEKNav5sz9zHYvvcVAUuoSwwftg8,4517
55
+ kiln_ai/adapters/parsers/test_r1_parser.py,sha256=VvCT_qCAfIbutFsxnpEzyZg-m5XLg7hI-Sorh2PplYw,4898
55
56
  kiln_ai/adapters/repair/__init__.py,sha256=dOO9MEpEhjiwzDVFg3MNfA2bKMPlax9iekDatpTkX8E,217
56
57
  kiln_ai/adapters/repair/repair_task.py,sha256=iW0bHWQq6Tir6ULTATWFS0zpwNji8Tbwhm2lZu52RsM,3342
57
- kiln_ai/adapters/repair/test_repair_task.py,sha256=iY7h-o-hnB0zwlkX--WuQlCsd5sKbhksS0hIIPCxt7E,7944
58
+ kiln_ai/adapters/repair/test_repair_task.py,sha256=2jO0_aDPzbmZHC0skZBcKp3t9K4gISko3iSGCFHhQRs,7945
58
59
  kiln_ai/datamodel/__init__.py,sha256=GbRfDrdSq9d_-HxzmFIicTmLO3qz-O3XGvSwDPh3XCk,1957
59
- kiln_ai/datamodel/basemodel.py,sha256=TwMBfNFJ7-5bp2QOoTQUl_YVrF0pkDAk5Rdk6EWEXxI,22143
60
- kiln_ai/datamodel/datamodel_enums.py,sha256=w8aJeuLWdrH6ZCZ0y2-o0IOmXcl7qXpOMHyrHHoJmkA,2040
60
+ kiln_ai/datamodel/basemodel.py,sha256=Qsr3Kxq5B5rfPZxQFrfOMTGwInnfYy5srd8nK0nwOs0,22204
61
+ kiln_ai/datamodel/datamodel_enums.py,sha256=HUnGI_ZGQqyOicqEFFutZRWSANlQRQwfBu3XhVQFQSc,2270
61
62
  kiln_ai/datamodel/dataset_filters.py,sha256=hWKxGJ-mSl4y0igyNcpmRoRYCiGrf0_uN4MMU9Fe_ng,3180
62
63
  kiln_ai/datamodel/dataset_split.py,sha256=q4l4SlUvjLV547bzk7Z-fbmj_o26GDcYOZ2rA5RPh3c,5612
63
64
  kiln_ai/datamodel/eval.py,sha256=kio2LqQ87MsP75DJTiIVdVfopTZXH4xjGN9g11V1mUU,13826
64
65
  kiln_ai/datamodel/finetune.py,sha256=TYoNVRAfbjqvrY-1YmHwG6xSoDljiJWuuVcTbvQAJL4,4569
65
- kiln_ai/datamodel/json_schema.py,sha256=sjc2LkbWWFhlqX5QOvLeWrovkmoX_tn3iQquxKDA8Pk,2990
66
+ kiln_ai/datamodel/json_schema.py,sha256=qIlR8btXhN-8Yj5GhwebzPLUHPw2sJC3uM1axV2xV7w,3032
66
67
  kiln_ai/datamodel/model_cache.py,sha256=9X4aAigbkFdytckgw8InCMh86uBna0ME_1HJSeMPEn0,4495
67
68
  kiln_ai/datamodel/project.py,sha256=uVH2_3TDFtsG_tpts81A-zbd9uPDFxAwMCKZt_km3IE,727
68
69
  kiln_ai/datamodel/prompt.py,sha256=70JPYHfgyX18cHW_DXoMzIOA28Jbaz6gyabElmpycyc,1161
@@ -70,12 +71,12 @@ kiln_ai/datamodel/prompt_id.py,sha256=eU2TV0RZapn-BgnZ4sOSNOOVEQ3aPaLzW4YSYCd3OB
70
71
  kiln_ai/datamodel/registry.py,sha256=XwGFXJFKZtOpR1Z9ven6SftggfADdZRm8TFxCEVtfUQ,957
71
72
  kiln_ai/datamodel/strict_mode.py,sha256=sm4Xka8mnJHCShtbh6MMU5dDQv-cLj8lHgHkmFKpsl0,849
72
73
  kiln_ai/datamodel/task.py,sha256=r-_zgrQCIiIkN8gvBISdU449Z9oKp7E1XL0lkik_rVI,7036
73
- kiln_ai/datamodel/task_output.py,sha256=0h4QvzV-hksE_AGHWsUHbYf5F95Zn7uU7WFbeIbAEck,12507
74
+ kiln_ai/datamodel/task_output.py,sha256=uIYR8EyWv8Bbl60gPRuTIUSvfGGzP9Ltc5P280HyTpY,12931
74
75
  kiln_ai/datamodel/task_run.py,sha256=yquE0jyr_9WzcvrMsEmZfXUnn8zZDEZIXZhVcVBMrT8,7038
75
- kiln_ai/datamodel/test_basemodel.py,sha256=KJLJf0stuQq4ksOtoPM_w1VQrGz2FGdOT6cdrMkib9s,17750
76
+ kiln_ai/datamodel/test_basemodel.py,sha256=sJ8wXGef2WxzbrbMTYgrOwmkd5J6sHkly-cQBO2IZh4,18126
76
77
  kiln_ai/datamodel/test_dataset_filters.py,sha256=v88QPkIsq4diUmoUF3-qj5KAW2rLRp0KDAm_pexbFy4,1894
77
78
  kiln_ai/datamodel/test_dataset_split.py,sha256=5CHO1Lq4xQBB72tV2SPER7OZODJNvj15qxi_cYBV2Rs,11157
78
- kiln_ai/datamodel/test_datasource.py,sha256=Pzh1l20__xObgdBaIMNJarG-jwmEsujRFkRmUBLuK0g,3220
79
+ kiln_ai/datamodel/test_datasource.py,sha256=H4Kc-Im9eM7WnADWZXdoiOIrOl05RtkyuhTCKiRimyU,3905
79
80
  kiln_ai/datamodel/test_eval_model.py,sha256=J7MqwWBgPpeXGqh3IacVUUHdZFJSZ2MgTsUNu-hNOJw,19528
80
81
  kiln_ai/datamodel/test_example_models.py,sha256=fpqh0u7zFhWHcRHgtxCjX8RD2oKHYOP_mJJymaUhEZU,20944
81
82
  kiln_ai/datamodel/test_json_schema.py,sha256=UgKwAFcdrJTq2byh7Yf-HoSAtiHiGAsNZxfkIvoMxIg,3915
@@ -88,13 +89,15 @@ kiln_ai/datamodel/test_prompt_id.py,sha256=ihyXVPQi0dSLGnBM7rTXRnVaiWXhh7HJmSy4n
88
89
  kiln_ai/datamodel/test_registry.py,sha256=PhS4anLi5Bf_023obuTlO5DALhtPB8WIc_bX12Yg6Po,2705
89
90
  kiln_ai/datamodel/test_task.py,sha256=FYyoEqJXQIy8rcBsLTdki4-1z9COnZQk1-aoS3ZoNuU,5307
90
91
  kiln_ai/utils/__init__.py,sha256=PTD0MwBCKAMIOGsTAwsFaJOusTJJoRFTfOGqRvCaU-E,142
91
- kiln_ai/utils/config.py,sha256=9navMS2ooSviz74Bq8raf5-01DFfDf9SSVfpasIIPlo,6993
92
+ kiln_ai/utils/config.py,sha256=IKPk9dMecDbqoBkfj52GT9xeity_y_sGP-vdm9CcKe4,8201
93
+ kiln_ai/utils/dataset_import.py,sha256=HvTCdK9OO8WE3Runn8_Vsks5KpCTckGIzAA7JKe-cWI,6956
92
94
  kiln_ai/utils/exhaustive_error.py,sha256=TkkRixIAR3CPEKHeAJzyv0mtxp6BxUBKMvobA3vzQug,262
93
95
  kiln_ai/utils/formatting.py,sha256=VtB9oag0lOGv17dwT7OPX_3HzBfaU9GsLH-iLete0yM,97
94
96
  kiln_ai/utils/name_generator.py,sha256=v26TgpCwQbhQFcZvzgjZvURinjrOyyFhxpsI6NQrHKc,1914
95
97
  kiln_ai/utils/test_config.py,sha256=Jw3nMFeIgZUsZDRJJY2HpB-2EkR2NoZ-rDe_o9oA7ws,9174
98
+ kiln_ai/utils/test_dataset_import.py,sha256=ZZOt7zqtaEIlMMx0VNXyRegDvnVqbWY2bcz-iMY_Oag,17427
96
99
  kiln_ai/utils/test_name_geneator.py,sha256=9-hSTBshyakqlPbFnNcggwLrL7lcPTitauBYHg9jFWI,1513
97
- kiln_ai-0.12.0.dist-info/METADATA,sha256=CnOHwkyknO0XqFIRL65XVEQl_375cHnvMneIy8J3PWE,10656
98
- kiln_ai-0.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
99
- kiln_ai-0.12.0.dist-info/licenses/LICENSE.txt,sha256=_NA5pnTYgRRr4qH6lE3X-TuZJ8iRcMUi5ASoGr-lEx8,1209
100
- kiln_ai-0.12.0.dist-info/RECORD,,
100
+ kiln_ai-0.13.0.dist-info/METADATA,sha256=csSjOcBVu_PrMLFU16V54GmCmibcfCoeCWV0fWydbEA,12238
101
+ kiln_ai-0.13.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
102
+ kiln_ai-0.13.0.dist-info/licenses/LICENSE.txt,sha256=_NA5pnTYgRRr4qH6lE3X-TuZJ8iRcMUi5ASoGr-lEx8,1209
103
+ kiln_ai-0.13.0.dist-info/RECORD,,
@@ -1,309 +0,0 @@
1
- import os
2
- from typing import Any, Dict
3
-
4
- from langchain_aws import ChatBedrockConverse
5
- from langchain_core.language_models import LanguageModelInput
6
- from langchain_core.language_models.chat_models import BaseChatModel
7
- from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
8
- from langchain_core.messages.base import BaseMessage
9
- from langchain_core.runnables import Runnable
10
- from langchain_fireworks import ChatFireworks
11
- from langchain_groq import ChatGroq
12
- from langchain_ollama import ChatOllama
13
- from pydantic import BaseModel
14
-
15
- import kiln_ai.datamodel as datamodel
16
- from kiln_ai.adapters.ml_model_list import (
17
- KilnModelProvider,
18
- ModelProviderName,
19
- StructuredOutputMode,
20
- )
21
- from kiln_ai.adapters.model_adapters.base_adapter import (
22
- COT_FINAL_ANSWER_PROMPT,
23
- AdapterConfig,
24
- BaseAdapter,
25
- RunOutput,
26
- )
27
- from kiln_ai.adapters.ollama_tools import (
28
- get_ollama_connection,
29
- ollama_base_url,
30
- ollama_model_installed,
31
- )
32
- from kiln_ai.datamodel import PromptId
33
- from kiln_ai.datamodel.task import RunConfig
34
- from kiln_ai.utils.config import Config
35
- from kiln_ai.utils.exhaustive_error import raise_exhaustive_enum_error
36
-
37
- LangChainModelType = BaseChatModel | Runnable[LanguageModelInput, Dict | BaseModel]
38
-
39
-
40
- class LangchainAdapter(BaseAdapter):
41
- _model: LangChainModelType | None = None
42
-
43
- def __init__(
44
- self,
45
- kiln_task: datamodel.Task,
46
- custom_model: BaseChatModel | None = None,
47
- model_name: str | None = None,
48
- provider: str | None = None,
49
- prompt_id: PromptId | None = None,
50
- base_adapter_config: AdapterConfig | None = None,
51
- ):
52
- if custom_model is not None:
53
- self._model = custom_model
54
-
55
- # Attempt to infer model provider and name from custom model
56
- if provider is None:
57
- provider = "custom.langchain:" + custom_model.__class__.__name__
58
-
59
- if model_name is None:
60
- model_name = "custom.langchain:unknown_model"
61
- if hasattr(custom_model, "model_name") and isinstance(
62
- getattr(custom_model, "model_name"), str
63
- ):
64
- model_name = "custom.langchain:" + getattr(
65
- custom_model, "model_name"
66
- )
67
- if hasattr(custom_model, "model") and isinstance(
68
- getattr(custom_model, "model"), str
69
- ):
70
- model_name = "custom.langchain:" + getattr(custom_model, "model")
71
- elif model_name is not None:
72
- # default provider name if not provided
73
- provider = provider or "custom.langchain.default_provider"
74
- else:
75
- raise ValueError(
76
- "model_name and provider must be provided if custom_model is not provided"
77
- )
78
-
79
- if model_name is None:
80
- raise ValueError("model_name must be provided")
81
-
82
- run_config = RunConfig(
83
- task=kiln_task,
84
- model_name=model_name,
85
- model_provider_name=provider,
86
- prompt_id=prompt_id or datamodel.PromptGenerators.SIMPLE,
87
- )
88
-
89
- super().__init__(
90
- run_config=run_config,
91
- config=base_adapter_config,
92
- )
93
-
94
- async def model(self) -> LangChainModelType:
95
- # cached model
96
- if self._model:
97
- return self._model
98
-
99
- self._model = await self.langchain_model_from()
100
-
101
- # Decide if we want to use Langchain's structured output:
102
- # 1. Only for structured tasks
103
- # 2. Only if the provider's mode isn't json_instructions (only mode that doesn't use an API option for structured output capabilities)
104
- provider = self.model_provider()
105
- use_lc_structured_output = (
106
- self.has_structured_output()
107
- and provider.structured_output_mode
108
- != StructuredOutputMode.json_instructions
109
- )
110
-
111
- if use_lc_structured_output:
112
- if not hasattr(self._model, "with_structured_output") or not callable(
113
- getattr(self._model, "with_structured_output")
114
- ):
115
- raise ValueError(
116
- f"model {self._model} does not support structured output, cannot use output_json_schema"
117
- )
118
- # Langchain expects title/description to be at top level, on top of json schema
119
- output_schema = self.task().output_schema()
120
- if output_schema is None:
121
- raise ValueError(
122
- f"output_json_schema is not valid json: {self.task().output_json_schema}"
123
- )
124
- output_schema["title"] = "task_response"
125
- output_schema["description"] = "A response from the task"
126
- with_structured_output_options = self.get_structured_output_options(
127
- self.run_config.model_name, self.run_config.model_provider_name
128
- )
129
- self._model = self._model.with_structured_output(
130
- output_schema,
131
- include_raw=True,
132
- **with_structured_output_options,
133
- )
134
- return self._model
135
-
136
- async def _run(self, input: Dict | str) -> RunOutput:
137
- if self.base_adapter_config.top_logprobs is not None:
138
- raise ValueError(
139
- "Kiln's Langchain adapter does not support logprobs/top_logprobs. Select a model from an OpenAI compatible provider (openai, openrouter, etc) instead."
140
- )
141
-
142
- provider = self.model_provider()
143
- model = await self.model()
144
- chain = model
145
- intermediate_outputs = {}
146
-
147
- prompt = self.build_prompt()
148
- user_msg = self.prompt_builder.build_user_message(input)
149
- messages = [
150
- SystemMessage(content=prompt),
151
- HumanMessage(content=user_msg),
152
- ]
153
-
154
- run_strategy, cot_prompt = self.run_strategy()
155
-
156
- if run_strategy == "cot_as_message":
157
- if not cot_prompt:
158
- raise ValueError("cot_prompt is required for cot_as_message strategy")
159
- messages.append(SystemMessage(content=cot_prompt))
160
- elif run_strategy == "cot_two_call":
161
- if not cot_prompt:
162
- raise ValueError("cot_prompt is required for cot_two_call strategy")
163
- messages.append(
164
- SystemMessage(content=cot_prompt),
165
- )
166
-
167
- # Base model (without structured output) used for COT message
168
- base_model = await self.langchain_model_from()
169
-
170
- cot_messages = [*messages]
171
- cot_response = await base_model.ainvoke(cot_messages)
172
- intermediate_outputs["chain_of_thought"] = cot_response.content
173
- messages.append(AIMessage(content=cot_response.content))
174
- messages.append(HumanMessage(content=COT_FINAL_ANSWER_PROMPT))
175
-
176
- response = await chain.ainvoke(messages)
177
-
178
- # Langchain may have already parsed the response into structured output, so use that if available.
179
- # However, a plain string may still be fixed at the parsing layer, so not being structured isn't a critical failure (yet)
180
- if (
181
- self.has_structured_output()
182
- and isinstance(response, dict)
183
- and "parsed" in response
184
- and isinstance(response["parsed"], dict)
185
- ):
186
- structured_response = response["parsed"]
187
- return RunOutput(
188
- output=self._munge_response(structured_response),
189
- intermediate_outputs=intermediate_outputs,
190
- )
191
-
192
- if not isinstance(response, BaseMessage):
193
- raise RuntimeError(f"response is not a BaseMessage: {response}")
194
-
195
- text_content = response.content
196
- if not isinstance(text_content, str):
197
- raise RuntimeError(f"response is not a string: {text_content}")
198
-
199
- return RunOutput(
200
- output=text_content,
201
- intermediate_outputs=intermediate_outputs,
202
- )
203
-
204
- def adapter_name(self) -> str:
205
- return "kiln_langchain_adapter"
206
-
207
- def _munge_response(self, response: Dict) -> Dict:
208
- # Mistral Large tool calling format is a bit different. Convert to standard format.
209
- if (
210
- "name" in response
211
- and response["name"] == "task_response"
212
- and "arguments" in response
213
- ):
214
- return response["arguments"]
215
- return response
216
-
217
- def get_structured_output_options(
218
- self, model_name: str, model_provider_name: str
219
- ) -> Dict[str, Any]:
220
- provider = self.model_provider()
221
- if not provider:
222
- return {}
223
-
224
- options = {}
225
- # We may need to add some provider specific logic here if providers use different names for the same mode, but everyone is copying openai for now
226
- match provider.structured_output_mode:
227
- case StructuredOutputMode.function_calling_weak:
228
- # Langchaing doesn't handle weak/strict separately
229
- options["method"] = "function_calling"
230
- case StructuredOutputMode.function_calling:
231
- options["method"] = "function_calling"
232
- case StructuredOutputMode.json_mode:
233
- options["method"] = "json_mode"
234
- case StructuredOutputMode.json_instruction_and_object:
235
- # We also pass instructions
236
- options["method"] = "json_mode"
237
- case StructuredOutputMode.json_schema:
238
- options["method"] = "json_schema"
239
- case StructuredOutputMode.json_instructions:
240
- # JSON done via instructions in prompt, not via API
241
- pass
242
- case StructuredOutputMode.default:
243
- if provider.name == ModelProviderName.ollama:
244
- # Ollama has great json_schema support, so use that: https://ollama.com/blog/structured-outputs
245
- options["method"] = "json_schema"
246
- else:
247
- # Let langchain decide the default
248
- pass
249
- case _:
250
- raise_exhaustive_enum_error(provider.structured_output_mode)
251
-
252
- return options
253
-
254
- async def langchain_model_from(self) -> BaseChatModel:
255
- provider = self.model_provider()
256
- return await langchain_model_from_provider(provider, self.run_config.model_name)
257
-
258
-
259
- async def langchain_model_from_provider(
260
- provider: KilnModelProvider, model_name: str
261
- ) -> BaseChatModel:
262
- if provider.name == ModelProviderName.openai:
263
- # We use the OpenAICompatibleAdapter for OpenAI
264
- raise ValueError("OpenAI is not supported in Langchain adapter")
265
- elif provider.name == ModelProviderName.openai_compatible:
266
- # We use the OpenAICompatibleAdapter for OpenAI compatible
267
- raise ValueError("OpenAI compatible is not supported in Langchain adapter")
268
- elif provider.name == ModelProviderName.groq:
269
- api_key = Config.shared().groq_api_key
270
- if api_key is None:
271
- raise ValueError(
272
- "Attempted to use Groq without an API key set. "
273
- "Get your API key from https://console.groq.com/keys"
274
- )
275
- return ChatGroq(**provider.provider_options, groq_api_key=api_key) # type: ignore[arg-type]
276
- elif provider.name == ModelProviderName.amazon_bedrock:
277
- api_key = Config.shared().bedrock_access_key
278
- secret_key = Config.shared().bedrock_secret_key
279
- # langchain doesn't allow passing these, so ugly hack to set env vars
280
- os.environ["AWS_ACCESS_KEY_ID"] = api_key
281
- os.environ["AWS_SECRET_ACCESS_KEY"] = secret_key
282
- return ChatBedrockConverse(
283
- **provider.provider_options,
284
- )
285
- elif provider.name == ModelProviderName.fireworks_ai:
286
- api_key = Config.shared().fireworks_api_key
287
- return ChatFireworks(**provider.provider_options, api_key=api_key)
288
- elif provider.name == ModelProviderName.ollama:
289
- # Ollama model naming is pretty flexible. We try a few versions of the model name
290
- potential_model_names = []
291
- if "model" in provider.provider_options:
292
- potential_model_names.append(provider.provider_options["model"])
293
- if "model_aliases" in provider.provider_options:
294
- potential_model_names.extend(provider.provider_options["model_aliases"])
295
-
296
- # Get the list of models Ollama supports
297
- ollama_connection = await get_ollama_connection()
298
- if ollama_connection is None:
299
- raise ValueError("Failed to connect to Ollama. Ensure Ollama is running.")
300
-
301
- for model_name in potential_model_names:
302
- if ollama_model_installed(ollama_connection, model_name):
303
- return ChatOllama(model=model_name, base_url=ollama_base_url())
304
-
305
- raise ValueError(f"Model {model_name} not installed on Ollama")
306
- elif provider.name == ModelProviderName.openrouter:
307
- raise ValueError("OpenRouter is not supported in Langchain adapter")
308
- else:
309
- raise ValueError(f"Invalid model or provider: {model_name} - {provider.name}")
@@ -1,10 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
-
4
- @dataclass
5
- class OpenAICompatibleConfig:
6
- api_key: str
7
- model_name: str
8
- provider_name: str
9
- base_url: str | None = None # Defaults to OpenAI
10
- default_headers: dict[str, str] | None = None