Skip to content

Commit 1b11247

Browse files
committed
feat: added checkbox to filter out models based on default runtime
Signed-off-by: Evzen Gasta <[email protected]>
1 parent df86e95 commit 1b11247

File tree

4 files changed

+46
-28
lines changed

4 files changed

+46
-28
lines changed

packages/backend/src/registries/ConfigurationRegistry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class ConfigurationRegistry extends Publisher<ExtensionConfiguration> imp
5555
modelsPath: this.getModelsPath(),
5656
experimentalGPU: this.#configuration.get<boolean>('experimentalGPU') ?? false,
5757
apiPort: this.#configuration.get<number>('apiPort') ?? API_PORT_DEFAULT,
58-
inferenceRuntime: this.#configuration.get<string>('inferenceRuntime') ?? 'none',
58+
inferenceRuntime: this.#configuration.get<string>('inferenceRuntime') ?? '',
5959
experimentalTuning: this.#configuration.get<boolean>('experimentalTuning') ?? false,
6060
modelUploadDisabled: this.#configuration.get<boolean>('modelUploadDisabled') ?? false,
6161
showGPUPromotion: this.#configuration.get<boolean>('showGPUPromotion') ?? true,

packages/frontend/src/lib/select/ModelSelect.spec.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -121,26 +121,6 @@ test('ModelSelect should list all models provided', async () => {
121121
expect(items[1]).toHaveTextContent(fakeRemoteModel.name);
122122
});
123123

124-
test('ModelSelect should list all models based on selected runtime', async () => {
125-
const { container } = render(ModelSelect, {
126-
value: undefined,
127-
disabled: undefined,
128-
models: [fakeRecommendedModel, fakeRemoteModelWhisper, fakeRemoteModel, fakeRemoteModelNone],
129-
recommended: [],
130-
});
131-
132-
// first get the select input
133-
const input = within(container).getByLabelText('Select Model');
134-
await fireEvent.pointerUp(input); // they are using the pointer up event instead of click.
135-
136-
// get all options available
137-
const items = container.querySelectorAll('div[class~="list-item"]');
138-
// ensure we have two options
139-
expect(items.length).toBe(2);
140-
expect(items[0]).toHaveTextContent(fakeRecommendedModel.name);
141-
expect(items[1]).toHaveTextContent(fakeRemoteModel.name);
142-
});
143-
144124
test('ModelSelect should set star icon next to recommended model', async () => {
145125
const { container } = render(ModelSelect, {
146126
value: undefined,
@@ -194,6 +174,7 @@ test('ModelSelect should filter out models based on selected default runtime', a
194174
fakeRecommendedRemoteModel,
195175
],
196176
recommended: [],
177+
showPreferredRuntime: true,
197178
});
198179

199180
// first get the select input
@@ -208,3 +189,23 @@ test('ModelSelect should filter out models based on selected default runtime', a
208189
expect(items[1]).toHaveTextContent(fakeRemoteModel.name);
209190
expect(items[2]).toHaveTextContent(fakeRecommendedRemoteModel.name);
210191
});
192+
193+
test('ModelSelect should list all models when is showPreferedRuntime set to false', async () => {
194+
const { container } = render(ModelSelect, {
195+
value: undefined,
196+
disabled: undefined,
197+
models: [fakeRecommendedModel, fakeRemoteModel],
198+
recommended: [],
199+
});
200+
201+
// first get the select input
202+
const input = within(container).getByLabelText('Select Model');
203+
await fireEvent.pointerUp(input); // they are using the pointer up event instead of click.
204+
205+
// get all options available
206+
const items = container.querySelectorAll('div[class~="list-item"]');
207+
// ensure we have two options
208+
expect(items.length).toBe(2);
209+
expect(items[0]).toHaveTextContent(fakeRecommendedModel.name);
210+
expect(items[1]).toHaveTextContent(fakeRemoteModel.name);
211+
});

packages/frontend/src/lib/select/ModelSelect.svelte

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@ interface Props {
2020
* Current value selected
2121
*/
2222
value: ModelInfo | undefined;
23+
/**
24+
* Filters out prefered runtime based on preferences
25+
*/
26+
showPreferredRuntime?: boolean;
2327
}
2428
25-
let { disabled = false, recommended, models, value = $bindable() }: Props = $props();
29+
let { disabled = false, recommended, models, value = $bindable(), showPreferredRuntime = false }: Props = $props();
2630
2731
function getModelSortingScore(modelInfo: ModelInfo): number {
2832
let score: number = 0;
@@ -51,15 +55,16 @@ let defaultRuntime: string | undefined = $state();
5155
5256
onMount(() => {
5357
return configuration.subscribe(values => {
54-
if (values?.inferenceRuntime) {
58+
if (values?.inferenceRuntime && values?.inferenceRuntime !== '') {
5559
defaultRuntime = values.inferenceRuntime;
5660
}
5761
});
5862
});
5963
6064
function filterModel(model: ModelInfo): boolean {
6165
// If the defaultRuntime is undefined we should not filter any model
62-
if (!defaultRuntime) return true;
66+
// Or if the user does not want to filter preferred runtime
67+
if (!defaultRuntime || !showPreferredRuntime) return true;
6368
6469
return model.backend === defaultRuntime;
6570
}

packages/frontend/src/pages/StartRecipe.svelte

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { LocalRepository } from '@shared/models/ILocalRepository';
77
import { findLocalRepositoryByRecipeId } from '/@/utils/localRepositoriesUtils';
88
import { localRepositories } from '/@/stores/localRepositories';
99
import { modelsInfo } from '/@/stores/modelsInfo';
10-
import { Button, ErrorMessage, FormPage } from '@podman-desktop/ui-svelte';
10+
import { Button, Checkbox, ErrorMessage, FormPage } from '@podman-desktop/ui-svelte';
1111
import type { ModelInfo } from '@shared/models/IModelInfo';
1212
import { InferenceType } from '@shared/models/IInference';
1313
import { studioClient } from '/@/utils/client';
@@ -52,6 +52,7 @@ let loading = $state(false);
5252
let completed: boolean = $state(false);
5353
5454
let errorMsg: string | undefined = $state(undefined);
55+
let showPreferredRuntime: boolean = $state(false);
5556
5657
$effect(() => {
5758
// Select default connection
@@ -185,9 +186,20 @@ function handleOnClick(): void {
185186
{/if}
186187

187188
<!-- model form -->
188-
<label for="select-model" class="pt-4 block mb-2 font-bold text-[var(--pd-content-card-header-text)]"
189-
>Model</label>
190-
<ModelSelect bind:value={model} disabled={loading} recommended={recipe.recommended} models={models} />
189+
<div class="flex w-full pt-4">
190+
<label for="select-model" class="pt-0 block mb-2 font-bold text-[var(--pd-content-card-header-text)]"
191+
>Model</label>
192+
<Checkbox
193+
class="text-[var(--pd-label-text)] pt-0 mb-2 ml-auto"
194+
bind:checked={showPreferredRuntime}
195+
title="Show only preferred runtime">Show only preferred runtime</Checkbox>
196+
</div>
197+
<ModelSelect
198+
bind:value={model}
199+
disabled={loading}
200+
recommended={recipe.recommended}
201+
models={models}
202+
showPreferredRuntime={showPreferredRuntime} />
191203
{#if model && model.file === undefined}
192204
<div class="text-gray-800 text-sm flex items-center">
193205
<Fa class="mr-2" icon={faWarning} />

0 commit comments

Comments
 (0)