kiln-ai 0.12.0__py3-none-any.whl → 0.13.2__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.
- kiln_ai/adapters/__init__.py +4 -0
- kiln_ai/adapters/adapter_registry.py +157 -28
- kiln_ai/adapters/eval/__init__.py +28 -0
- kiln_ai/adapters/eval/eval_runner.py +4 -1
- kiln_ai/adapters/eval/g_eval.py +19 -3
- kiln_ai/adapters/eval/test_base_eval.py +1 -0
- kiln_ai/adapters/eval/test_eval_runner.py +1 -0
- kiln_ai/adapters/eval/test_g_eval.py +13 -7
- kiln_ai/adapters/fine_tune/base_finetune.py +16 -2
- kiln_ai/adapters/fine_tune/finetune_registry.py +2 -0
- kiln_ai/adapters/fine_tune/fireworks_finetune.py +8 -1
- kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +19 -0
- kiln_ai/adapters/fine_tune/test_together_finetune.py +533 -0
- kiln_ai/adapters/fine_tune/together_finetune.py +327 -0
- kiln_ai/adapters/ml_model_list.py +638 -155
- kiln_ai/adapters/model_adapters/__init__.py +2 -4
- kiln_ai/adapters/model_adapters/base_adapter.py +14 -11
- kiln_ai/adapters/model_adapters/litellm_adapter.py +391 -0
- kiln_ai/adapters/model_adapters/litellm_config.py +13 -0
- kiln_ai/adapters/model_adapters/test_litellm_adapter.py +407 -0
- kiln_ai/adapters/model_adapters/test_structured_output.py +23 -5
- kiln_ai/adapters/ollama_tools.py +3 -2
- kiln_ai/adapters/parsers/r1_parser.py +19 -14
- kiln_ai/adapters/parsers/test_r1_parser.py +17 -5
- kiln_ai/adapters/provider_tools.py +52 -60
- kiln_ai/adapters/repair/test_repair_task.py +3 -3
- kiln_ai/adapters/run_output.py +1 -1
- kiln_ai/adapters/test_adapter_registry.py +17 -20
- kiln_ai/adapters/test_generate_docs.py +2 -2
- kiln_ai/adapters/test_prompt_adaptors.py +30 -19
- kiln_ai/adapters/test_provider_tools.py +27 -82
- kiln_ai/datamodel/basemodel.py +2 -0
- kiln_ai/datamodel/datamodel_enums.py +2 -0
- kiln_ai/datamodel/json_schema.py +1 -1
- kiln_ai/datamodel/task_output.py +13 -6
- kiln_ai/datamodel/test_basemodel.py +9 -0
- kiln_ai/datamodel/test_datasource.py +19 -0
- kiln_ai/utils/config.py +46 -0
- kiln_ai/utils/dataset_import.py +232 -0
- kiln_ai/utils/test_dataset_import.py +596 -0
- {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.2.dist-info}/METADATA +51 -7
- {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.2.dist-info}/RECORD +44 -41
- kiln_ai/adapters/model_adapters/langchain_adapters.py +0 -309
- kiln_ai/adapters/model_adapters/openai_compatible_config.py +0 -10
- kiln_ai/adapters/model_adapters/openai_model_adapter.py +0 -289
- kiln_ai/adapters/model_adapters/test_langchain_adapter.py +0 -343
- kiln_ai/adapters/model_adapters/test_openai_model_adapter.py +0 -216
- {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.2.dist-info}/WHEEL +0 -0
- {kiln_ai-0.12.0.dist-info → kiln_ai-0.13.2.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=
|
|
3
|
-
kiln_ai/adapters/adapter_registry.py,sha256=
|
|
4
|
-
kiln_ai/adapters/ml_model_list.py,sha256=
|
|
5
|
-
kiln_ai/adapters/ollama_tools.py,sha256=
|
|
2
|
+
kiln_ai/adapters/__init__.py,sha256=XjGmWagEyOEVwVIAxjN5rYNsQWIEACT5DB7MMTxdPss,1005
|
|
3
|
+
kiln_ai/adapters/adapter_registry.py,sha256=KmMHYQ3mxpjVLE6D-hMNWCGt6Cw9JvnFn6nMb48GE8Y,9166
|
|
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=
|
|
8
|
-
kiln_ai/adapters/run_output.py,sha256=
|
|
9
|
-
kiln_ai/adapters/test_adapter_registry.py,sha256=
|
|
10
|
-
kiln_ai/adapters/test_generate_docs.py,sha256=
|
|
7
|
+
kiln_ai/adapters/provider_tools.py,sha256=UL3XEnnxs1TrbqPPxxHSvnL7aBd84ggh38lI0yEsX6A,14725
|
|
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=
|
|
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=
|
|
14
|
+
kiln_ai/adapters/test_provider_tools.py,sha256=mzMubpUupQu8pXhjDTj0_Kgrr-xcu_crj9xpcgcAzzA,26671
|
|
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=
|
|
21
|
-
kiln_ai/adapters/eval/g_eval.py,sha256=
|
|
21
|
+
kiln_ai/adapters/eval/eval_runner.py,sha256=h3DvRFM5J5LDJqaLzNJ-q9i5LRycv2J9Ev5nw1mUDUQ,10806
|
|
22
|
+
kiln_ai/adapters/eval/g_eval.py,sha256=d3UcBsZWeDt7cWp4uvDcfG7qdGLsGaZEBsIEqkpiWh4,15253
|
|
22
23
|
kiln_ai/adapters/eval/registry.py,sha256=gZ_s0VgEx79Fswkgi1tS4yOl7lzpkvUBJZ62RldhM_w,626
|
|
23
|
-
kiln_ai/adapters/eval/test_base_eval.py,sha256=
|
|
24
|
-
kiln_ai/adapters/eval/test_eval_runner.py,sha256=
|
|
25
|
-
kiln_ai/adapters/eval/test_g_eval.py,sha256
|
|
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=-Stx7E0D-WAH1HWrRSp48CiGsf-no1SHeFF9IqVXeMI,16433
|
|
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=
|
|
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=
|
|
31
|
-
kiln_ai/adapters/fine_tune/fireworks_finetune.py,sha256=
|
|
31
|
+
kiln_ai/adapters/fine_tune/finetune_registry.py,sha256=CvcEVxtKwjgCMA-oYH9Tpjn1DVWmMzgHpXJOZ0YQA8k,610
|
|
32
|
+
kiln_ai/adapters/fine_tune/fireworks_finetune.py,sha256=ZBS45ji9j88fFd3O9OentAUflAz716YEmz9176Ln7bU,14284
|
|
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
|
-
kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py,sha256=
|
|
36
|
+
kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py,sha256=vBvkbTYVvsimxM6fTSeOnVdFldovV5flc1qT9QjPuNE,18961
|
|
36
37
|
kiln_ai/adapters/fine_tune/test_openai_finetune.py,sha256=H63Xk2PNHbt5Ev5IQpdR9JZ4uz-Huo2gfuC4mHHqe0w,20011
|
|
37
|
-
kiln_ai/adapters/
|
|
38
|
-
kiln_ai/adapters/
|
|
39
|
-
kiln_ai/adapters/model_adapters/
|
|
40
|
-
kiln_ai/adapters/model_adapters/
|
|
41
|
-
kiln_ai/adapters/model_adapters/
|
|
38
|
+
kiln_ai/adapters/fine_tune/test_together_finetune.py,sha256=BUJFsyq_g77gU0JN3hg6FMBvqb0DIyTeAek-wxomKIg,18090
|
|
39
|
+
kiln_ai/adapters/fine_tune/together_finetune.py,sha256=EbMPsTyKMubfwOalkFLiNFlMFIRKxLibzMTyLeUkle4,14010
|
|
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/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
60
|
-
kiln_ai/datamodel/datamodel_enums.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
92
|
+
kiln_ai/utils/config.py,sha256=kAgb_4nSnb-IWbLVS4FBygYmnHypJADjDEk_Fh-eLeg,8479
|
|
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.
|
|
98
|
-
kiln_ai-0.
|
|
99
|
-
kiln_ai-0.
|
|
100
|
-
kiln_ai-0.
|
|
100
|
+
kiln_ai-0.13.2.dist-info/METADATA,sha256=VVYhbE6IrTwP496RZ4ZcMizIJFW6Sur7a3qlwiUD3D4,12231
|
|
101
|
+
kiln_ai-0.13.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
102
|
+
kiln_ai-0.13.2.dist-info/licenses/LICENSE.txt,sha256=_NA5pnTYgRRr4qH6lE3X-TuZJ8iRcMUi5ASoGr-lEx8,1209
|
|
103
|
+
kiln_ai-0.13.2.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}")
|