Skip to content

Commit 12b91fd

Browse files
committed
feature: dashboard makes call to /embedding_models route
1 parent 3243b68 commit 12b91fd

File tree

6 files changed

+151
-116
lines changed

6 files changed

+151
-116
lines changed

frontends/dashboard/src/components/NewDatasetModal.tsx

Lines changed: 76 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Accessor, createMemo, createSignal, useContext, For } from "solid-js";
1+
import { Accessor, createMemo, createSignal, createEffect, useContext, For } from "solid-js";
2+
import { AiOutlineWarning } from "solid-icons/ai";
23
import {
34
Dialog,
45
DialogPanel,
@@ -12,7 +13,6 @@ import { useNavigate } from "@solidjs/router";
1213
import {
1314
ServerEnvsConfiguration,
1415
availableDistanceMetrics,
15-
availableEmbeddingModels,
1616
} from "shared/types";
1717
import { defaultServerEnvsConfiguration } from "../pages/Dashboard/Dataset/DatasetSettingsPage";
1818
import { createToast } from "./ShowToasts";
@@ -35,6 +35,20 @@ export const NewDatasetModal = (props: NewDatasetModalProps) => {
3535
const [isLoading, setIsLoading] = createSignal(false);
3636
const [fillWithExampleData, setFillWithExampleData] = createSignal(false);
3737

38+
const api_host = import.meta.env.VITE_API_HOST as unknown as string;
39+
40+
const [availableEmbeddingModels, setAvailableEmbeddingModels] =
41+
createSignal<any>([]);
42+
43+
createEffect(() => {
44+
fetch(`${api_host}/embedding_models`)
45+
.then((resp) => resp.json())
46+
.then((json) => {
47+
console.log(json.models);
48+
setAvailableEmbeddingModels(json.models)
49+
})
50+
});
51+
3852
const selectedOrgnaization = createMemo(() => {
3953
const selectedOrgId = userContext.selectedOrganizationId?.();
4054
if (!selectedOrgId) return null;
@@ -186,51 +200,69 @@ export const NewDatasetModal = (props: NewDatasetModalProps) => {
186200
>
187201
Embedding Model
188202
</label>
189-
<select
190-
id="embeddingSize"
191-
name="embeddingSize"
192-
class="col-span-2 block w-full rounded-md border-[0.5px] border-neutral-300 bg-white px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
193-
value={
194-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
195-
availableEmbeddingModels.find(
196-
(model) =>
203+
<Show when={availableEmbeddingModels().length > 0}>
204+
<select
205+
id="embeddingSize"
206+
name="embeddingSize"
207+
class="col-span-2 block w-full rounded-md border-[0.5px] border-neutral-300 bg-white px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
208+
value={
209+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
210+
availableEmbeddingModels().find(
211+
(model) =>
212+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
213+
model.id ===
214+
serverConfig().EMBEDDING_MODEL_NAME,
197215
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
198-
model.id ===
199-
serverConfig().EMBEDDING_MODEL_NAME,
200-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
201-
)?.name ?? availableEmbeddingModels[0].name
202-
}
203-
onChange={(e) => {
204-
const selectedModel = availableEmbeddingModels.find(
205-
(model) => model.name === e.currentTarget.value,
206-
);
216+
)?.display_name ??
217+
availableEmbeddingModels()[0]?.display_name
218+
}
219+
onChange={(e) => {
220+
const selectedModel =
221+
availableEmbeddingModels()?.find(
222+
(model) =>
223+
model.display_name === e.currentTarget.value,
224+
);
207225

208-
const embeddingSize =
209-
selectedModel?.dimension ?? 1536;
226+
const embeddingSize =
227+
selectedModel?.dimension ?? 1536;
210228

211-
setServerConfig((prev) => {
212-
return {
213-
...prev,
214-
EMBEDDING_SIZE: embeddingSize,
215-
EMBEDDING_MODEL_NAME:
216-
selectedModel?.id ?? "jina-base-en",
217-
EMBEDDING_QUERY_PREFIX:
218-
selectedModel?.id === "jina-base-en"
219-
? "Search for:"
220-
: "",
221-
EMBEDDING_BASE_URL:
222-
selectedModel?.url ??
223-
"https://api.openai.com/v1",
224-
};
225-
});
226-
}}
227-
>
228-
<For each={availableEmbeddingModels}>
229-
{(model) => (
230-
<option value={model.name}>{model.name}</option>
231-
)}
232-
</For>
233-
</select>
229+
setServerConfig((prev) => {
230+
return {
231+
...prev,
232+
EMBEDDING_SIZE: embeddingSize,
233+
EMBEDDING_MODEL_NAME:
234+
selectedModel?.id ?? "jina-base-en",
235+
EMBEDDING_QUERY_PREFIX:
236+
selectedModel?.id === "jina-base-en"
237+
? "Search for:"
238+
: "",
239+
EMBEDDING_BASE_URL:
240+
selectedModel?.url ??
241+
"https://api.openai.com/v1",
242+
};
243+
});
244+
}}
245+
>
246+
<For each={availableEmbeddingModels()}>
247+
{(model) => (
248+
<option value={model.display_name}>{model.display_name}</option>
249+
)}
250+
</For>
251+
</select>
252+
</Show>
253+
<Show when={availableEmbeddingModels().length == 0}>
254+
<div class="col-span-2 flex items-center space-x-2">
255+
<AiOutlineWarning class="h-5 w-5 text-yellow-400" />
256+
<div class="flex flex-col space-y-1">
257+
<div class="w-full text-base text-neutral-800 sm:text-sm sm:leading-6">
258+
No Embedding Models available
259+
</div>
260+
<div class="w-full text-xs">
261+
Check server settings
262+
</div>
263+
</div>
264+
</div>
265+
</Show>
234266
</div>
235267

236268
<div class="content-center py-4 sm:grid sm:grid-cols-3 sm:items-start sm:gap-4">

frontends/dashboard/src/pages/Dashboard/Dataset/DatasetSettingsPage.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import { DatasetContext } from "../../../contexts/DatasetContext";
1212
import {
1313
ServerEnvsConfiguration,
1414
availableDistanceMetrics,
15-
availableEmbeddingModels,
1615
} from "shared/types";
1716
import { createToast } from "../../../components/ShowToasts";
1817
import { AiOutlineInfoCircle } from "solid-icons/ai";
@@ -56,6 +55,21 @@ export const ServerSettingsForm = (props: {
5655
config: (prev: ServerEnvsConfiguration) => ServerEnvsConfiguration,
5756
) => void;
5857
}) => {
58+
59+
const api_host = import.meta.env.VITE_API_HOST as unknown as string;
60+
61+
const [availableEmbeddingModels, setAvailableEmbeddingModels] =
62+
createSignal<any>([]);
63+
64+
createEffect(() => {
65+
fetch(`${api_host}/embedding_models`)
66+
.then((resp) => resp.json())
67+
.then((json) => {
68+
console.log(json.models);
69+
setAvailableEmbeddingModels(json.models)
70+
})
71+
});
72+
5973
return (
6074
<form class="flex flex-col gap-3">
6175
{/* General LLM Settings */}
@@ -554,14 +568,14 @@ export const ServerSettingsForm = (props: {
554568
name="embeddingSize"
555569
class="col-span-2 block w-full cursor-not-allowed rounded-md border-[0.5px] border-neutral-300 bg-white px-3 py-1.5 shadow-sm placeholder:text-neutral-400 focus:outline-magenta-500 sm:text-sm sm:leading-6"
556570
value={
557-
availableEmbeddingModels.find(
571+
availableEmbeddingModels().find(
558572
(model) =>
559573
model.id === props.serverConfig().EMBEDDING_MODEL_NAME,
560-
)?.name ?? availableEmbeddingModels[0].name
574+
)?.display_name ?? availableEmbeddingModels()[0]?.display_name
561575
}
562576
>
563-
<For each={availableEmbeddingModels}>
564-
{(model) => <option value={model.name}>{model.name}</option>}
577+
<For each={availableEmbeddingModels()}>
578+
{(model) => <option value={model.display_name}>{model.display_name}</option>}
565579
</For>
566580
</select>
567581
</div>
@@ -622,7 +636,7 @@ export const ServerSettingsForm = (props: {
622636
availableDistanceMetrics.find(
623637
(metric) =>
624638
metric.id === props.serverConfig().DISTANCE_METRIC,
625-
)?.name ?? availableEmbeddingModels[0].name
639+
)?.name ?? availableDistanceMetrics[0].name
626640
}
627641
>
628642
<For each={availableDistanceMetrics}>

frontends/dashboard/src/types/apiTypes.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -256,39 +256,6 @@ export interface ApiKeyRespBody {
256256
updated_at: string;
257257
}
258258

259-
export const availableEmbeddingModels = [
260-
{
261-
id: "jina-base-en",
262-
name: "jina-base-en (securely hosted by Trieve)",
263-
url: "https://embedding.trieve.ai",
264-
dimension: 768,
265-
},
266-
{
267-
id: "bge-m3",
268-
name: "bge-m3 (securely hosted by Trieve)",
269-
url: "https://embedding.trieve.ai/bge-m3",
270-
dimension: 1024,
271-
},
272-
{
273-
id: "jina-embeddings-v2-base-code",
274-
name: "jina-embeddings-v2-base-code (securely hosted by Trieve)",
275-
url: "https://embedding.trieve.ai/jina-code",
276-
dimension: 768,
277-
},
278-
{
279-
id: "text-embedding-3-small",
280-
name: "text-embedding-3-small (hosted by OpenAI)",
281-
url: "https://api.openai.com/v1",
282-
dimension: 1536,
283-
},
284-
{
285-
id: "text-embedding-3-large",
286-
name: "text-embedding-3-large (hosted by OpenAI)",
287-
url: "https://api.openai.com/v1",
288-
dimension: 3072,
289-
},
290-
];
291-
292259
export interface EventDTO {
293260
events: Event[];
294261
page_count: number;

frontends/shared/types.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -266,39 +266,6 @@ export interface ApiKeyRespBody {
266266
updated_at: string;
267267
}
268268

269-
export const availableEmbeddingModels = [
270-
{
271-
id: "jina-base-en",
272-
name: "jina-base-en (securely hosted by Trieve)",
273-
url: "https://embedding.trieve.ai",
274-
dimension: 768,
275-
},
276-
{
277-
id: "bge-m3",
278-
name: "bge-m3 (securely hosted by Trieve)",
279-
url: "https://embedding.trieve.ai/bge-m3",
280-
dimension: 1024,
281-
},
282-
{
283-
id: "jina-embeddings-v2-base-code",
284-
name: "jina-embeddings-v2-base-code (securely hosted by Trieve)",
285-
url: "https://embedding.trieve.ai/jina-code",
286-
dimension: 768,
287-
},
288-
{
289-
id: "text-embedding-3-small",
290-
name: "text-embedding-3-small (hosted by OpenAI)",
291-
url: "https://api.openai.com/v1",
292-
dimension: 1536,
293-
},
294-
{
295-
id: "text-embedding-3-large",
296-
name: "text-embedding-3-large (hosted by OpenAI)",
297-
url: "https://api.openai.com/v1",
298-
dimension: 3072,
299-
},
300-
];
301-
302269
export const availableDistanceMetrics = [
303270
{
304271
id: "cosine",

server/src/handlers/chunk_handler.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2634,3 +2634,55 @@ pub fn check_completion_param_validity(
26342634

26352635
Ok(())
26362636
}
2637+
2638+
#[derive(Serialize, Deserialize, Debug, Clone, ToSchema)]
2639+
pub struct AvailableModelResponse {
2640+
models: Vec<EmbeddingModel>,
2641+
}
2642+
2643+
#[derive(Serialize, Deserialize, Debug, Clone, ToSchema)]
2644+
pub struct EmbeddingModel {
2645+
id: String,
2646+
display_name: String,
2647+
url: String,
2648+
dimension: u32,
2649+
}
2650+
2651+
pub async fn get_available_models() -> Result<HttpResponse, ServiceError> {
2652+
let avail_models = AvailableModelResponse {
2653+
models: vec![
2654+
EmbeddingModel {
2655+
id: "jina-base-en".into(),
2656+
display_name: "jina-base-en (securely hosted by Trieve)".into(),
2657+
url: "https://embedding.trieve.ai".into(),
2658+
dimension: 768,
2659+
},
2660+
EmbeddingModel {
2661+
id: "bge-m3".into(),
2662+
display_name: "bge-m3 (securely hosted by Trieve)".into(),
2663+
url: "https://embedding.trieve.ai/bge-m3".into(),
2664+
dimension: 1024,
2665+
},
2666+
EmbeddingModel {
2667+
id: "jina-embeddings-v2-base-code".into(),
2668+
display_name: "jina-embeddings-v2-base-code (securely hosted by Trieve)".into(),
2669+
url: "https://embedding.trieve.ai/jina-code".into(),
2670+
dimension: 768,
2671+
},
2672+
EmbeddingModel {
2673+
id: "text-embedding-3-small".into(),
2674+
display_name: "text-embedding-3-small (hosted by OpenAI)".into(),
2675+
url: "https://api.openai.com/v1".into(),
2676+
dimension: 1536,
2677+
},
2678+
EmbeddingModel {
2679+
id: "text-embedding-3-large".into(),
2680+
display_name: "text-embedding-3-large (hosted by OpenAI)".into(),
2681+
url: "https://api.openai.com/v1".into(),
2682+
dimension: 3072,
2683+
},
2684+
],
2685+
};
2686+
2687+
Ok(HttpResponse::Ok().json(avail_models))
2688+
}

server/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,6 +1127,9 @@ pub fn main() -> std::io::Result<()> {
11271127
.route(web::put().to(handlers::analytics_handler::send_ctr_data))
11281128
.route(web::post().to(handlers::analytics_handler::get_ctr_analytics)),
11291129
)
1130+
).service(
1131+
web::resource("/embedding_models")
1132+
.route(web::get().to(handlers::chunk_handler::get_available_models))
11301133
),
11311134
)
11321135
})

0 commit comments

Comments
 (0)