kiln-ai 0.20.1__py3-none-any.whl → 0.22.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 (133) hide show
  1. kiln_ai/adapters/__init__.py +6 -0
  2. kiln_ai/adapters/adapter_registry.py +43 -226
  3. kiln_ai/adapters/chunkers/__init__.py +13 -0
  4. kiln_ai/adapters/chunkers/base_chunker.py +42 -0
  5. kiln_ai/adapters/chunkers/chunker_registry.py +16 -0
  6. kiln_ai/adapters/chunkers/fixed_window_chunker.py +39 -0
  7. kiln_ai/adapters/chunkers/helpers.py +23 -0
  8. kiln_ai/adapters/chunkers/test_base_chunker.py +63 -0
  9. kiln_ai/adapters/chunkers/test_chunker_registry.py +28 -0
  10. kiln_ai/adapters/chunkers/test_fixed_window_chunker.py +346 -0
  11. kiln_ai/adapters/chunkers/test_helpers.py +75 -0
  12. kiln_ai/adapters/data_gen/test_data_gen_task.py +9 -3
  13. kiln_ai/adapters/embedding/__init__.py +0 -0
  14. kiln_ai/adapters/embedding/base_embedding_adapter.py +44 -0
  15. kiln_ai/adapters/embedding/embedding_registry.py +32 -0
  16. kiln_ai/adapters/embedding/litellm_embedding_adapter.py +199 -0
  17. kiln_ai/adapters/embedding/test_base_embedding_adapter.py +283 -0
  18. kiln_ai/adapters/embedding/test_embedding_registry.py +166 -0
  19. kiln_ai/adapters/embedding/test_litellm_embedding_adapter.py +1149 -0
  20. kiln_ai/adapters/eval/eval_runner.py +6 -2
  21. kiln_ai/adapters/eval/test_base_eval.py +1 -3
  22. kiln_ai/adapters/eval/test_g_eval.py +1 -1
  23. kiln_ai/adapters/extractors/__init__.py +18 -0
  24. kiln_ai/adapters/extractors/base_extractor.py +72 -0
  25. kiln_ai/adapters/extractors/encoding.py +20 -0
  26. kiln_ai/adapters/extractors/extractor_registry.py +44 -0
  27. kiln_ai/adapters/extractors/extractor_runner.py +112 -0
  28. kiln_ai/adapters/extractors/litellm_extractor.py +406 -0
  29. kiln_ai/adapters/extractors/test_base_extractor.py +244 -0
  30. kiln_ai/adapters/extractors/test_encoding.py +54 -0
  31. kiln_ai/adapters/extractors/test_extractor_registry.py +181 -0
  32. kiln_ai/adapters/extractors/test_extractor_runner.py +181 -0
  33. kiln_ai/adapters/extractors/test_litellm_extractor.py +1290 -0
  34. kiln_ai/adapters/fine_tune/test_dataset_formatter.py +2 -2
  35. kiln_ai/adapters/fine_tune/test_fireworks_tinetune.py +2 -6
  36. kiln_ai/adapters/fine_tune/test_together_finetune.py +2 -6
  37. kiln_ai/adapters/ml_embedding_model_list.py +494 -0
  38. kiln_ai/adapters/ml_model_list.py +876 -18
  39. kiln_ai/adapters/model_adapters/litellm_adapter.py +40 -75
  40. kiln_ai/adapters/model_adapters/test_litellm_adapter.py +79 -1
  41. kiln_ai/adapters/model_adapters/test_litellm_adapter_tools.py +119 -5
  42. kiln_ai/adapters/model_adapters/test_saving_adapter_results.py +9 -3
  43. kiln_ai/adapters/model_adapters/test_structured_output.py +9 -10
  44. kiln_ai/adapters/ollama_tools.py +69 -12
  45. kiln_ai/adapters/provider_tools.py +190 -46
  46. kiln_ai/adapters/rag/deduplication.py +49 -0
  47. kiln_ai/adapters/rag/progress.py +252 -0
  48. kiln_ai/adapters/rag/rag_runners.py +844 -0
  49. kiln_ai/adapters/rag/test_deduplication.py +195 -0
  50. kiln_ai/adapters/rag/test_progress.py +785 -0
  51. kiln_ai/adapters/rag/test_rag_runners.py +2376 -0
  52. kiln_ai/adapters/remote_config.py +80 -8
  53. kiln_ai/adapters/test_adapter_registry.py +579 -86
  54. kiln_ai/adapters/test_ml_embedding_model_list.py +239 -0
  55. kiln_ai/adapters/test_ml_model_list.py +202 -0
  56. kiln_ai/adapters/test_ollama_tools.py +340 -1
  57. kiln_ai/adapters/test_prompt_builders.py +1 -1
  58. kiln_ai/adapters/test_provider_tools.py +199 -8
  59. kiln_ai/adapters/test_remote_config.py +551 -56
  60. kiln_ai/adapters/vector_store/__init__.py +1 -0
  61. kiln_ai/adapters/vector_store/base_vector_store_adapter.py +83 -0
  62. kiln_ai/adapters/vector_store/lancedb_adapter.py +389 -0
  63. kiln_ai/adapters/vector_store/test_base_vector_store.py +160 -0
  64. kiln_ai/adapters/vector_store/test_lancedb_adapter.py +1841 -0
  65. kiln_ai/adapters/vector_store/test_vector_store_registry.py +199 -0
  66. kiln_ai/adapters/vector_store/vector_store_registry.py +33 -0
  67. kiln_ai/datamodel/__init__.py +16 -13
  68. kiln_ai/datamodel/basemodel.py +201 -4
  69. kiln_ai/datamodel/chunk.py +158 -0
  70. kiln_ai/datamodel/datamodel_enums.py +27 -0
  71. kiln_ai/datamodel/embedding.py +64 -0
  72. kiln_ai/datamodel/external_tool_server.py +206 -54
  73. kiln_ai/datamodel/extraction.py +317 -0
  74. kiln_ai/datamodel/project.py +33 -1
  75. kiln_ai/datamodel/rag.py +79 -0
  76. kiln_ai/datamodel/task.py +5 -0
  77. kiln_ai/datamodel/task_output.py +41 -11
  78. kiln_ai/datamodel/test_attachment.py +649 -0
  79. kiln_ai/datamodel/test_basemodel.py +270 -14
  80. kiln_ai/datamodel/test_chunk_models.py +317 -0
  81. kiln_ai/datamodel/test_dataset_split.py +1 -1
  82. kiln_ai/datamodel/test_datasource.py +50 -0
  83. kiln_ai/datamodel/test_embedding_models.py +448 -0
  84. kiln_ai/datamodel/test_eval_model.py +6 -6
  85. kiln_ai/datamodel/test_external_tool_server.py +534 -152
  86. kiln_ai/datamodel/test_extraction_chunk.py +206 -0
  87. kiln_ai/datamodel/test_extraction_model.py +501 -0
  88. kiln_ai/datamodel/test_rag.py +641 -0
  89. kiln_ai/datamodel/test_task.py +35 -1
  90. kiln_ai/datamodel/test_tool_id.py +187 -1
  91. kiln_ai/datamodel/test_vector_store.py +320 -0
  92. kiln_ai/datamodel/tool_id.py +58 -0
  93. kiln_ai/datamodel/vector_store.py +141 -0
  94. kiln_ai/tools/base_tool.py +12 -3
  95. kiln_ai/tools/built_in_tools/math_tools.py +12 -4
  96. kiln_ai/tools/kiln_task_tool.py +158 -0
  97. kiln_ai/tools/mcp_server_tool.py +2 -2
  98. kiln_ai/tools/mcp_session_manager.py +51 -22
  99. kiln_ai/tools/rag_tools.py +164 -0
  100. kiln_ai/tools/test_kiln_task_tool.py +527 -0
  101. kiln_ai/tools/test_mcp_server_tool.py +4 -15
  102. kiln_ai/tools/test_mcp_session_manager.py +187 -227
  103. kiln_ai/tools/test_rag_tools.py +929 -0
  104. kiln_ai/tools/test_tool_registry.py +290 -7
  105. kiln_ai/tools/tool_registry.py +69 -16
  106. kiln_ai/utils/__init__.py +3 -0
  107. kiln_ai/utils/async_job_runner.py +62 -17
  108. kiln_ai/utils/config.py +2 -2
  109. kiln_ai/utils/env.py +15 -0
  110. kiln_ai/utils/filesystem.py +14 -0
  111. kiln_ai/utils/filesystem_cache.py +60 -0
  112. kiln_ai/utils/litellm.py +94 -0
  113. kiln_ai/utils/lock.py +100 -0
  114. kiln_ai/utils/mime_type.py +38 -0
  115. kiln_ai/utils/open_ai_types.py +19 -2
  116. kiln_ai/utils/pdf_utils.py +59 -0
  117. kiln_ai/utils/test_async_job_runner.py +151 -35
  118. kiln_ai/utils/test_env.py +142 -0
  119. kiln_ai/utils/test_filesystem_cache.py +316 -0
  120. kiln_ai/utils/test_litellm.py +206 -0
  121. kiln_ai/utils/test_lock.py +185 -0
  122. kiln_ai/utils/test_mime_type.py +66 -0
  123. kiln_ai/utils/test_open_ai_types.py +88 -12
  124. kiln_ai/utils/test_pdf_utils.py +86 -0
  125. kiln_ai/utils/test_uuid.py +111 -0
  126. kiln_ai/utils/test_validation.py +524 -0
  127. kiln_ai/utils/uuid.py +9 -0
  128. kiln_ai/utils/validation.py +90 -0
  129. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/METADATA +9 -1
  130. kiln_ai-0.22.0.dist-info/RECORD +213 -0
  131. kiln_ai-0.20.1.dist-info/RECORD +0 -138
  132. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/WHEEL +0 -0
  133. {kiln_ai-0.20.1.dist-info → kiln_ai-0.22.0.dist-info}/licenses/LICENSE.txt +0 -0
@@ -206,7 +206,7 @@ def test_generate_chat_message_toolcall(mock_training_chat_two_step_json):
206
206
 
207
207
  def test_generate_chat_message_toolcall_invalid_json(mock_training_chat_two_step_json):
208
208
  mock_training_chat_two_step_json[-1].content = "invalid json"
209
- with pytest.raises(ValueError, match="^Last message is not JSON"):
209
+ with pytest.raises(ValueError, match=r"^Last message is not JSON"):
210
210
  generate_chat_message_toolcall(mock_training_chat_two_step_json)
211
211
 
212
212
 
@@ -536,7 +536,7 @@ def test_generate_huggingface_chat_template_toolcall_invalid_json(
536
536
  ):
537
537
  mock_training_chat_two_step_json[-1].content = "invalid json"
538
538
 
539
- with pytest.raises(ValueError, match="^Last message is not JSON"):
539
+ with pytest.raises(ValueError, match=r"^Last message is not JSON"):
540
540
  generate_huggingface_chat_template_toolcall(mock_training_chat_two_step_json)
541
541
 
542
542
 
@@ -14,11 +14,7 @@ from kiln_ai.adapters.fine_tune.fireworks_finetune import (
14
14
  DeployStatus,
15
15
  FireworksFinetune,
16
16
  )
17
- from kiln_ai.datamodel import (
18
- DatasetSplit,
19
- StructuredOutputMode,
20
- Task,
21
- )
17
+ from kiln_ai.datamodel import DatasetSplit, StructuredOutputMode, Task
22
18
  from kiln_ai.datamodel import Finetune as FinetuneModel
23
19
  from kiln_ai.datamodel.datamodel_enums import ChatStrategy
24
20
  from kiln_ai.datamodel.dataset_split import Train80Test20SplitDefinition
@@ -1053,7 +1049,7 @@ async def test_fetch_all_deployments_invalid_json(fireworks_finetune, mock_api_k
1053
1049
 
1054
1050
  with pytest.raises(
1055
1051
  ValueError,
1056
- match="Invalid response from Fireworks. Expected list of deployments in 'deployments' key",
1052
+ match=r"Invalid response from Fireworks. Expected list of deployments in 'deployments' key",
1057
1053
  ):
1058
1054
  await fireworks_finetune._fetch_all_deployments()
1059
1055
 
@@ -17,11 +17,7 @@ from kiln_ai.adapters.fine_tune.together_finetune import (
17
17
  _pending_statuses,
18
18
  _running_statuses,
19
19
  )
20
- from kiln_ai.datamodel import (
21
- DatasetSplit,
22
- StructuredOutputMode,
23
- Task,
24
- )
20
+ from kiln_ai.datamodel import DatasetSplit, StructuredOutputMode, Task
25
21
  from kiln_ai.datamodel import Finetune as FinetuneModel
26
22
  from kiln_ai.datamodel.dataset_split import Train80Test20SplitDefinition
27
23
  from kiln_ai.utils.config import Config
@@ -105,7 +101,7 @@ def mock_api_key():
105
101
  def test_init_missing_api_key(finetune):
106
102
  with patch.object(Config, "shared") as mock_config:
107
103
  mock_config.return_value.together_api_key = None
108
- with pytest.raises(ValueError, match="Together.ai API key not set"):
104
+ with pytest.raises(ValueError, match=r"Together.ai API key not set"):
109
105
  TogetherFinetune(datamodel=finetune)
110
106
 
111
107
 
@@ -0,0 +1,494 @@
1
+ from enum import Enum
2
+ from typing import List
3
+
4
+ from pydantic import BaseModel, Field
5
+
6
+ from kiln_ai.datamodel.datamodel_enums import ModelProviderName
7
+
8
+
9
+ class KilnEmbeddingModelFamily(str, Enum):
10
+ """
11
+ Enumeration of supported embedding model families.
12
+ """
13
+
14
+ # for bespoke proprietary models, the family tends to be the same
15
+ # as provider name, but it does not have to be
16
+ openai = "openai"
17
+ gemini = "gemini"
18
+ gemma = "gemma"
19
+ nomic = "nomic"
20
+ qwen = "qwen"
21
+ baai = "baai"
22
+ modernbert = "modernbert"
23
+ intfloat = "intfloat"
24
+ together = "together"
25
+ thenlper = "thenlper"
26
+ where_is_ai = "where_is_ai"
27
+ mixedbread = "mixedbread"
28
+ netease = "netease"
29
+
30
+
31
+ class EmbeddingModelName(str, Enum):
32
+ """
33
+ Enumeration of specific model versions supported by the system.
34
+ """
35
+
36
+ # Embedding model names are often generic (e.g., "text-embedding"),
37
+ # so we prefix them with the provider name (e.g., "openai_") to ensure
38
+ # uniqueness across providers now and in the future
39
+ openai_text_embedding_3_small = "openai_text_embedding_3_small"
40
+ openai_text_embedding_3_large = "openai_text_embedding_3_large"
41
+ gemini_text_embedding_004 = "gemini_text_embedding_004"
42
+ gemini_embedding_001 = "gemini_embedding_001"
43
+ embedding_gemma_300m = "embedding_gemma_300m"
44
+ nomic_text_embedding_v1_5 = "nomic_text_embedding_v1_5"
45
+ qwen_3_embedding_0p6b = "qwen_3_embedding_0p6b"
46
+ qwen_3_embedding_4b = "qwen_3_embedding_4b"
47
+ qwen_3_embedding_8b = "qwen_3_embedding_8b"
48
+ baai_bge_small_1_5 = "baai_bge_small_1_5"
49
+ baai_bge_base_1_5 = "baai_bge_base_1_5"
50
+ baai_bge_large_1_5 = "baai_bge_large_1_5"
51
+ m2_bert_retrieval_32k = "m2_bert_retrieval_32k"
52
+ gte_modernbert_base = "gte_modernbert_base"
53
+ multilingual_e5_large_instruct = "multilingual_e5_large_instruct"
54
+ thenlper_gte_large = "thenlper_gte_large"
55
+ thenlper_gte_base = "thenlper_gte_base"
56
+ where_is_ai_uae_large_v1 = "where_is_ai_uae_large_v1"
57
+ mixedbread_ai_mxbai_embed_large_v1 = "mixedbread_ai_mxbai_embed_large_v1"
58
+ netease_youdao_bce_embedding_base_v1 = "netease_youdao_bce_embedding_base_v1"
59
+
60
+
61
+ class KilnEmbeddingModelProvider(BaseModel):
62
+ name: ModelProviderName
63
+
64
+ model_id: str = Field(
65
+ description="The model ID for the embedding model. This is the ID used to identify the model in the provider's API.",
66
+ )
67
+
68
+ max_input_tokens: int | None = Field(
69
+ default=None,
70
+ description="The maximum number of tokens that can be input to the model.",
71
+ )
72
+
73
+ n_dimensions: int = Field(
74
+ description="The number of dimensions in the output embedding.",
75
+ )
76
+
77
+ supports_custom_dimensions: bool = Field(
78
+ default=False,
79
+ description="Whether the model supports setting a custom output dimension. If true, the user can set the output dimension in the UI.",
80
+ )
81
+
82
+ suggested_for_chunk_embedding: bool = Field(
83
+ default=False,
84
+ description="Whether the model is particularly good for chunk embedding.",
85
+ )
86
+
87
+ ollama_model_aliases: List[str] | None = None
88
+
89
+
90
+ class KilnEmbeddingModel(BaseModel):
91
+ """
92
+ Configuration for a specific embedding model.
93
+ """
94
+
95
+ family: str
96
+ name: str
97
+ friendly_name: str
98
+ providers: List[KilnEmbeddingModelProvider]
99
+
100
+
101
+ built_in_embedding_models: List[KilnEmbeddingModel] = [
102
+ # OpenAI Text Embedding 3 Large
103
+ KilnEmbeddingModel(
104
+ family=KilnEmbeddingModelFamily.openai,
105
+ name=EmbeddingModelName.openai_text_embedding_3_large,
106
+ friendly_name="Text Embedding 3 Large",
107
+ providers=[
108
+ KilnEmbeddingModelProvider(
109
+ name=ModelProviderName.openai,
110
+ model_id="text-embedding-3-large",
111
+ n_dimensions=3072,
112
+ max_input_tokens=8192,
113
+ supports_custom_dimensions=True,
114
+ suggested_for_chunk_embedding=True,
115
+ ),
116
+ ],
117
+ ),
118
+ # OpenAI Text Embedding 3 Small
119
+ KilnEmbeddingModel(
120
+ family=KilnEmbeddingModelFamily.openai,
121
+ name=EmbeddingModelName.openai_text_embedding_3_small,
122
+ friendly_name="Text Embedding 3 Small",
123
+ providers=[
124
+ KilnEmbeddingModelProvider(
125
+ name=ModelProviderName.openai,
126
+ model_id="text-embedding-3-small",
127
+ n_dimensions=1536,
128
+ max_input_tokens=8192,
129
+ supports_custom_dimensions=True,
130
+ ),
131
+ ],
132
+ ),
133
+ # Gemini Embedding 001
134
+ KilnEmbeddingModel(
135
+ family=KilnEmbeddingModelFamily.gemini,
136
+ name=EmbeddingModelName.gemini_embedding_001,
137
+ friendly_name="Gemini Embedding 001",
138
+ providers=[
139
+ KilnEmbeddingModelProvider(
140
+ name=ModelProviderName.gemini_api,
141
+ model_id="gemini-embedding-001",
142
+ n_dimensions=3072,
143
+ max_input_tokens=2048,
144
+ supports_custom_dimensions=True,
145
+ suggested_for_chunk_embedding=True,
146
+ ),
147
+ ],
148
+ ),
149
+ # Gemini Text Embedding 004
150
+ KilnEmbeddingModel(
151
+ family=KilnEmbeddingModelFamily.gemini,
152
+ name=EmbeddingModelName.gemini_text_embedding_004,
153
+ friendly_name="Text Embedding 004",
154
+ providers=[
155
+ KilnEmbeddingModelProvider(
156
+ name=ModelProviderName.gemini_api,
157
+ model_id="text-embedding-004",
158
+ n_dimensions=768,
159
+ max_input_tokens=2048,
160
+ ),
161
+ ],
162
+ ),
163
+ # Embedding Gemma 300m
164
+ KilnEmbeddingModel(
165
+ family=KilnEmbeddingModelFamily.gemma,
166
+ name=EmbeddingModelName.embedding_gemma_300m,
167
+ friendly_name="Embedding Gemma 300m",
168
+ providers=[
169
+ KilnEmbeddingModelProvider(
170
+ name=ModelProviderName.ollama,
171
+ model_id="embeddinggemma:300m",
172
+ n_dimensions=768,
173
+ max_input_tokens=2048,
174
+ # the model itself does support custom dimensions, but not working
175
+ # because litellm rejects the param:
176
+ # https://github.com/BerriAI/litellm/issues/11940
177
+ supports_custom_dimensions=False,
178
+ ollama_model_aliases=["embeddinggemma"],
179
+ ),
180
+ ],
181
+ ),
182
+ # Nomic Embed Text v1.5
183
+ KilnEmbeddingModel(
184
+ family=KilnEmbeddingModelFamily.nomic,
185
+ name=EmbeddingModelName.nomic_text_embedding_v1_5,
186
+ friendly_name="Nomic Embed Text v1.5",
187
+ providers=[
188
+ KilnEmbeddingModelProvider(
189
+ name=ModelProviderName.ollama,
190
+ model_id="nomic-embed-text:v1.5",
191
+ n_dimensions=768,
192
+ max_input_tokens=8192,
193
+ # the model itself does support custom dimensions, but not working
194
+ # because litellm rejects the param:
195
+ # https://github.com/BerriAI/litellm/issues/11940
196
+ supports_custom_dimensions=False,
197
+ ollama_model_aliases=["nomic-embed-text"],
198
+ ),
199
+ KilnEmbeddingModelProvider(
200
+ name=ModelProviderName.fireworks_ai,
201
+ model_id="nomic-ai/nomic-embed-text-v1.5",
202
+ n_dimensions=768,
203
+ max_input_tokens=8192,
204
+ supports_custom_dimensions=True,
205
+ ),
206
+ ],
207
+ ),
208
+ # Qwen3 Embedding 8B
209
+ KilnEmbeddingModel(
210
+ family=KilnEmbeddingModelFamily.qwen,
211
+ name=EmbeddingModelName.qwen_3_embedding_8b,
212
+ friendly_name="Qwen 3 Embedding 8B",
213
+ providers=[
214
+ KilnEmbeddingModelProvider(
215
+ name=ModelProviderName.ollama,
216
+ model_id="qwen3-embedding:8b",
217
+ n_dimensions=4096,
218
+ max_input_tokens=32_000,
219
+ # the model itself does support custom dimensions, but not working
220
+ # because litellm rejects the param:
221
+ # https://github.com/BerriAI/litellm/issues/11940
222
+ supports_custom_dimensions=False,
223
+ ollama_model_aliases=[
224
+ # 8b is default
225
+ "qwen3-embedding",
226
+ ],
227
+ ),
228
+ KilnEmbeddingModelProvider(
229
+ name=ModelProviderName.fireworks_ai,
230
+ model_id="accounts/fireworks/models/qwen3-embedding-8b",
231
+ n_dimensions=4096,
232
+ max_input_tokens=32_000,
233
+ # the model itself does support custom dimensions, but not working
234
+ supports_custom_dimensions=True,
235
+ ),
236
+ KilnEmbeddingModelProvider(
237
+ name=ModelProviderName.siliconflow_cn,
238
+ model_id="Qwen/Qwen3-Embedding-8B",
239
+ n_dimensions=4096,
240
+ max_input_tokens=32_000,
241
+ # the model itself does support custom dimensions, but not working
242
+ # because litellm rejects the param:
243
+ # https://github.com/BerriAI/litellm/issues/11940
244
+ supports_custom_dimensions=False,
245
+ ),
246
+ ],
247
+ ),
248
+ # Qwen3 Embedding 4B
249
+ KilnEmbeddingModel(
250
+ family=KilnEmbeddingModelFamily.qwen,
251
+ name=EmbeddingModelName.qwen_3_embedding_4b,
252
+ friendly_name="Qwen 3 Embedding 4B",
253
+ providers=[
254
+ KilnEmbeddingModelProvider(
255
+ name=ModelProviderName.ollama,
256
+ model_id="qwen3-embedding:4b",
257
+ n_dimensions=2560,
258
+ max_input_tokens=32_000,
259
+ # the model itself does support custom dimensions, but not working
260
+ # because litellm rejects the param:
261
+ # https://github.com/BerriAI/litellm/issues/11940
262
+ supports_custom_dimensions=False,
263
+ ),
264
+ KilnEmbeddingModelProvider(
265
+ name=ModelProviderName.siliconflow_cn,
266
+ model_id="Qwen/Qwen3-Embedding-4B",
267
+ n_dimensions=2560,
268
+ max_input_tokens=32_000,
269
+ # the model itself does support custom dimensions, but not working
270
+ # because litellm rejects the param:
271
+ # https://github.com/BerriAI/litellm/issues/11940
272
+ supports_custom_dimensions=False,
273
+ ),
274
+ ],
275
+ ),
276
+ # Qwen3 Embedding 0.6B
277
+ KilnEmbeddingModel(
278
+ family=KilnEmbeddingModelFamily.qwen,
279
+ name=EmbeddingModelName.qwen_3_embedding_0p6b,
280
+ friendly_name="Qwen 3 Embedding 0.6B",
281
+ providers=[
282
+ KilnEmbeddingModelProvider(
283
+ name=ModelProviderName.ollama,
284
+ model_id="qwen3-embedding:0.6b",
285
+ n_dimensions=1024,
286
+ max_input_tokens=32_000,
287
+ # the model itself does support custom dimensions, but not working
288
+ # because litellm rejects the param:
289
+ # https://github.com/BerriAI/litellm/issues/11940
290
+ supports_custom_dimensions=False,
291
+ ),
292
+ KilnEmbeddingModelProvider(
293
+ name=ModelProviderName.siliconflow_cn,
294
+ model_id="Qwen/Qwen3-Embedding-0.6B",
295
+ n_dimensions=1024,
296
+ max_input_tokens=32_000,
297
+ # the model itself does support custom dimensions, but not working
298
+ # because litellm rejects the param:
299
+ # https://github.com/BerriAI/litellm/issues/11940
300
+ supports_custom_dimensions=False,
301
+ ),
302
+ ],
303
+ ),
304
+ # BAAI-Bge-Large-1.5
305
+ KilnEmbeddingModel(
306
+ family=KilnEmbeddingModelFamily.baai,
307
+ name=EmbeddingModelName.baai_bge_large_1_5,
308
+ friendly_name="BAAI Bge Large 1.5",
309
+ providers=[
310
+ KilnEmbeddingModelProvider(
311
+ name=ModelProviderName.together_ai,
312
+ model_id="BAAI/bge-large-en-v1.5",
313
+ n_dimensions=1024,
314
+ max_input_tokens=512,
315
+ supports_custom_dimensions=False,
316
+ ),
317
+ ],
318
+ ),
319
+ # BAAI-Bge-Base-1.5
320
+ KilnEmbeddingModel(
321
+ family=KilnEmbeddingModelFamily.baai,
322
+ name=EmbeddingModelName.baai_bge_base_1_5,
323
+ friendly_name="BAAI Bge Base 1.5",
324
+ providers=[
325
+ KilnEmbeddingModelProvider(
326
+ name=ModelProviderName.fireworks_ai,
327
+ model_id="BAAI/bge-base-en-v1.5",
328
+ n_dimensions=768,
329
+ max_input_tokens=512,
330
+ supports_custom_dimensions=False,
331
+ ),
332
+ KilnEmbeddingModelProvider(
333
+ name=ModelProviderName.together_ai,
334
+ model_id="BAAI/bge-base-en-v1.5",
335
+ n_dimensions=768,
336
+ max_input_tokens=512,
337
+ supports_custom_dimensions=False,
338
+ ),
339
+ ],
340
+ ),
341
+ # BAAI-Bge-Small-1.5
342
+ KilnEmbeddingModel(
343
+ family=KilnEmbeddingModelFamily.baai,
344
+ name=EmbeddingModelName.baai_bge_small_1_5,
345
+ friendly_name="BAAI Bge Small 1.5",
346
+ providers=[
347
+ KilnEmbeddingModelProvider(
348
+ name=ModelProviderName.fireworks_ai,
349
+ model_id="BAAI/bge-small-en-v1.5",
350
+ n_dimensions=384,
351
+ max_input_tokens=512,
352
+ supports_custom_dimensions=False,
353
+ ),
354
+ ],
355
+ ),
356
+ # M2-BERT-Retrieval-32k
357
+ KilnEmbeddingModel(
358
+ family=KilnEmbeddingModelFamily.together,
359
+ name=EmbeddingModelName.m2_bert_retrieval_32k,
360
+ friendly_name="M2 BERT Retrieval 32k",
361
+ providers=[
362
+ KilnEmbeddingModelProvider(
363
+ name=ModelProviderName.together_ai,
364
+ model_id="togethercomputer/m2-bert-80M-32k-retrieval",
365
+ n_dimensions=768,
366
+ max_input_tokens=32_768,
367
+ supports_custom_dimensions=False,
368
+ ),
369
+ ],
370
+ ),
371
+ # Gte Modernbert Base
372
+ KilnEmbeddingModel(
373
+ family=KilnEmbeddingModelFamily.modernbert,
374
+ name=EmbeddingModelName.gte_modernbert_base,
375
+ friendly_name="Gte Modernbert Base",
376
+ providers=[
377
+ KilnEmbeddingModelProvider(
378
+ name=ModelProviderName.together_ai,
379
+ model_id="Alibaba-NLP/gte-modernbert-base",
380
+ n_dimensions=768,
381
+ max_input_tokens=8192,
382
+ supports_custom_dimensions=False,
383
+ ),
384
+ ],
385
+ ),
386
+ # Multilingual E5 Large Instruct
387
+ KilnEmbeddingModel(
388
+ family=KilnEmbeddingModelFamily.intfloat,
389
+ name=EmbeddingModelName.multilingual_e5_large_instruct,
390
+ friendly_name="Multilingual E5 Large Instruct",
391
+ providers=[
392
+ KilnEmbeddingModelProvider(
393
+ name=ModelProviderName.together_ai,
394
+ model_id="intfloat/multilingual-e5-large-instruct",
395
+ n_dimensions=1024,
396
+ max_input_tokens=512,
397
+ supports_custom_dimensions=False,
398
+ ),
399
+ ],
400
+ ),
401
+ # Thenlper Gte Large
402
+ KilnEmbeddingModel(
403
+ family=KilnEmbeddingModelFamily.thenlper,
404
+ name=EmbeddingModelName.thenlper_gte_large,
405
+ friendly_name="Thenlper Gte Large",
406
+ providers=[
407
+ KilnEmbeddingModelProvider(
408
+ name=ModelProviderName.fireworks_ai,
409
+ model_id="thenlper/gte-large",
410
+ n_dimensions=1024,
411
+ max_input_tokens=512,
412
+ supports_custom_dimensions=False,
413
+ ),
414
+ ],
415
+ ),
416
+ # Thenlper Gte Base
417
+ KilnEmbeddingModel(
418
+ family=KilnEmbeddingModelFamily.thenlper,
419
+ name=EmbeddingModelName.thenlper_gte_base,
420
+ friendly_name="Thenlper Gte Base",
421
+ providers=[
422
+ KilnEmbeddingModelProvider(
423
+ name=ModelProviderName.fireworks_ai,
424
+ model_id="thenlper/gte-base",
425
+ n_dimensions=768,
426
+ max_input_tokens=512,
427
+ supports_custom_dimensions=False,
428
+ ),
429
+ ],
430
+ ),
431
+ # Where Is AI UAE Large V1
432
+ KilnEmbeddingModel(
433
+ family=KilnEmbeddingModelFamily.where_is_ai,
434
+ name=EmbeddingModelName.where_is_ai_uae_large_v1,
435
+ friendly_name="Where Is AI UAE Large V1",
436
+ providers=[
437
+ KilnEmbeddingModelProvider(
438
+ name=ModelProviderName.fireworks_ai,
439
+ model_id="WhereIsAI/UAE-Large-V1",
440
+ n_dimensions=1024,
441
+ max_input_tokens=512,
442
+ supports_custom_dimensions=False,
443
+ ),
444
+ ],
445
+ ),
446
+ # Mixedbread AI Mxbai Embed Large V1
447
+ KilnEmbeddingModel(
448
+ family=KilnEmbeddingModelFamily.mixedbread,
449
+ name=EmbeddingModelName.mixedbread_ai_mxbai_embed_large_v1,
450
+ friendly_name="Mixedbread AI Mxbai Embed Large V1",
451
+ providers=[
452
+ KilnEmbeddingModelProvider(
453
+ name=ModelProviderName.fireworks_ai,
454
+ model_id="mixedbread-ai/mxbai-embed-large-v1",
455
+ n_dimensions=1024,
456
+ max_input_tokens=512,
457
+ supports_custom_dimensions=False,
458
+ ),
459
+ ],
460
+ ),
461
+ # Netease Youdao Bce Embedding Base V1
462
+ KilnEmbeddingModel(
463
+ family=KilnEmbeddingModelFamily.netease,
464
+ name=EmbeddingModelName.netease_youdao_bce_embedding_base_v1,
465
+ friendly_name="Netease Youdao Bce Embedding Base V1",
466
+ providers=[
467
+ KilnEmbeddingModelProvider(
468
+ name=ModelProviderName.siliconflow_cn,
469
+ model_id="netease-youdao/bce-embedding-base_v1",
470
+ n_dimensions=768,
471
+ max_input_tokens=512,
472
+ supports_custom_dimensions=False,
473
+ ),
474
+ ],
475
+ ),
476
+ ]
477
+
478
+
479
+ def get_model_by_name(name: EmbeddingModelName) -> KilnEmbeddingModel:
480
+ for model in built_in_embedding_models:
481
+ if model.name == name:
482
+ return model
483
+ raise ValueError(f"Embedding model {name} not found in the list of built-in models")
484
+
485
+
486
+ def built_in_embedding_models_from_provider(
487
+ provider_name: ModelProviderName, model_name: str
488
+ ) -> KilnEmbeddingModelProvider | None:
489
+ for model in built_in_embedding_models:
490
+ if model.name == model_name:
491
+ for p in model.providers:
492
+ if p.name == provider_name:
493
+ return p
494
+ return None