diff --git a/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py b/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py index 54dd00740..2ef814c06 100644 --- a/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py +++ b/backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py @@ -70,7 +70,7 @@ def migrate_modelfile_to_model(migrator: Migrator, database: pw.Database): # Insert the processed data into the 'model' table Model.create( - id=modelfile.tag_name, + id=f"ollama-{modelfile.tag_name}", user_id=modelfile.user_id, base_model_id=info.get("base_model_id"), name=modelfile.modelfile.get("title"), diff --git a/backend/main.py b/backend/main.py index dca90fc09..aa3004865 100644 --- a/backend/main.py +++ b/backend/main.py @@ -314,10 +314,12 @@ async def get_all_models(): model["name"] = custom_model.name model["info"] = custom_model.model_dump() else: - owned_by = "openai" for model in models: - if custom_model.base_model_id == model["id"]: + if ( + custom_model.base_model_id == model["id"] + or custom_model.base_model_id == model["id"].split(":")[0] + ): owned_by = model["owned_by"] break @@ -329,6 +331,7 @@ async def get_all_models(): "created": custom_model.created_at, "owned_by": owned_by, "info": custom_model.model_dump(), + "preset": True, } ) diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index 6a122f4dc..88c1db3cd 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -27,7 +27,23 @@ export const getModels = async (token: string = '') => { let models = res?.data ?? []; - models = models.filter((models) => models).sort((a, b) => (a.name > b.name ? 1 : -1)); + models = models + .filter((models) => models) + .sort((a, b) => { + // Compare case-insensitively + const lowerA = a.name.toLowerCase(); + const lowerB = b.name.toLowerCase(); + + if (lowerA < lowerB) return -1; + if (lowerA > lowerB) return 1; + + // If same case-insensitively, sort by original strings, + // lowercase will come before uppercase due to ASCII values + if (a < b) return -1; + if (a > b) return 1; + + return 0; // They are equal + }); console.log(models); return models; diff --git a/src/lib/components/chat/Settings/Advanced.svelte b/src/lib/components/chat/Settings/Advanced.svelte index 4e0a1ca56..e13a8babc 100644 --- a/src/lib/components/chat/Settings/Advanced.svelte +++ b/src/lib/components/chat/Settings/Advanced.svelte @@ -11,7 +11,7 @@ let requestFormat = ''; let keepAlive = null; - let options = { + let params = { // Advanced seed: 0, temperature: '', @@ -44,14 +44,14 @@ requestFormat = settings.requestFormat ?? ''; keepAlive = settings.keepAlive ?? null; - options.seed = settings.seed ?? 0; - options.temperature = settings.temperature ?? ''; - options.repeat_penalty = settings.repeat_penalty ?? ''; - options.top_k = settings.top_k ?? ''; - options.top_p = settings.top_p ?? ''; - options.num_ctx = settings.num_ctx ?? ''; - options = { ...options, ...settings.options }; - options.stop = (settings?.options?.stop ?? []).join(','); + params.seed = settings.seed ?? 0; + params.temperature = settings.temperature ?? ''; + params.repeat_penalty = settings.repeat_penalty ?? ''; + params.top_k = settings.top_k ?? ''; + params.top_p = settings.top_p ?? ''; + params.num_ctx = settings.num_ctx ?? ''; + params = { ...params, ...settings.params }; + params.stop = (settings?.params?.stop ?? []).join(','); }); @@ -59,7 +59,7 @@
{$i18n.t('Parameters')}
- +
@@ -128,20 +128,20 @@ class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg" on:click={() => { saveSettings({ - options: { - seed: (options.seed !== 0 ? options.seed : undefined) ?? undefined, - stop: options.stop !== '' ? options.stop.split(',').filter((e) => e) : undefined, - temperature: options.temperature !== '' ? options.temperature : undefined, - repeat_penalty: options.repeat_penalty !== '' ? options.repeat_penalty : undefined, - repeat_last_n: options.repeat_last_n !== '' ? options.repeat_last_n : undefined, - mirostat: options.mirostat !== '' ? options.mirostat : undefined, - mirostat_eta: options.mirostat_eta !== '' ? options.mirostat_eta : undefined, - mirostat_tau: options.mirostat_tau !== '' ? options.mirostat_tau : undefined, - top_k: options.top_k !== '' ? options.top_k : undefined, - top_p: options.top_p !== '' ? options.top_p : undefined, - tfs_z: options.tfs_z !== '' ? options.tfs_z : undefined, - num_ctx: options.num_ctx !== '' ? options.num_ctx : undefined, - num_predict: options.num_predict !== '' ? options.num_predict : undefined + params: { + seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined, + stop: params.stop !== '' ? params.stop.split(',').filter((e) => e) : undefined, + temperature: params.temperature !== '' ? params.temperature : undefined, + repeat_penalty: params.repeat_penalty !== '' ? params.repeat_penalty : undefined, + repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined, + mirostat: params.mirostat !== '' ? params.mirostat : undefined, + mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined, + mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined, + top_k: params.top_k !== '' ? params.top_k : undefined, + top_p: params.top_p !== '' ? params.top_p : undefined, + tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined, + num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined, + num_predict: params.num_predict !== '' ? params.num_predict : undefined }, keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined }); diff --git a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte index 6eaf82da8..04b64812e 100644 --- a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte +++ b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte @@ -3,7 +3,7 @@ const i18n = getContext('i18n'); - export let options = { + export let params = { // Advanced seed: 0, stop: '', @@ -17,40 +17,82 @@ top_p: '', tfs_z: '', num_ctx: '', - num_predict: '' + num_predict: '', + template: null }; + + let customFieldName = ''; + let customFieldValue = '';
-
-
-
{$i18n.t('Seed')}
-
- -
+
+
+
{$i18n.t('Seed')}
+ +
+ + {#if (params?.seed ?? null) !== null} +
+
+ +
+
+ {/if}
-
-
-
{$i18n.t('Stop Sequence')}
-
- -
+
+
+
{$i18n.t('Stop Sequence')}
+ +
+ + {#if (params?.stop ?? null) !== null} +
+
+ +
+
+ {/if}
@@ -61,10 +103,10 @@ class="p-1 px-3 text-xs flex rounded transition" type="button" on:click={() => { - options.temperature = options.temperature === '' ? 0.8 : ''; + params.temperature = (params?.temperature ?? '') === '' ? 0.8 : ''; }} > - {#if options.temperature === ''} + {#if (params?.temperature ?? '') === ''} {$i18n.t('Default')} {:else} {$i18n.t('Custom')} @@ -72,7 +114,7 @@
- {#if options.temperature !== ''} + {#if (params?.temperature ?? '') !== ''}
{ - options.mirostat = options.mirostat === '' ? 0 : ''; + params.mirostat = (params?.mirostat ?? '') === '' ? 0 : ''; }} > - {#if options.mirostat === ''} + {#if (params?.mirostat ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.mirostat !== ''} + {#if (params?.mirostat ?? '') !== ''}
{ - options.mirostat_eta = options.mirostat_eta === '' ? 0.1 : ''; + params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : ''; }} > - {#if options.mirostat_eta === ''} + {#if (params?.mirostat_eta ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.mirostat_eta !== ''} + {#if (params?.mirostat_eta ?? '') !== ''}
{ - options.mirostat_tau = options.mirostat_tau === '' ? 5.0 : ''; + params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : ''; }} > - {#if options.mirostat_tau === ''} + {#if (params?.mirostat_tau ?? '') === ''} {$i18n.t('Default')} {:else} {$i18n.t('Custom')} @@ -210,7 +252,7 @@
- {#if options.mirostat_tau !== ''} + {#if (params?.mirostat_tau ?? '') !== ''}
{ - options.top_k = options.top_k === '' ? 40 : ''; + params.top_k = (params?.top_k ?? '') === '' ? 40 : ''; }} > - {#if options.top_k === ''} + {#if (params?.top_k ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.top_k !== ''} + {#if (params?.top_k ?? '') !== ''}
{ - options.top_p = options.top_p === '' ? 0.9 : ''; + params.top_p = (params?.top_p ?? '') === '' ? 0.9 : ''; }} > - {#if options.top_p === ''} + {#if (params?.top_p ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.top_p !== ''} + {#if (params?.top_p ?? '') !== ''}
{ - options.repeat_penalty = options.repeat_penalty === '' ? 1.1 : ''; + params.repeat_penalty = (params?.repeat_penalty ?? '') === '' ? 1.1 : ''; }} > - {#if options.repeat_penalty === ''} + {#if (params?.repeat_penalty ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.repeat_penalty !== ''} + {#if (params?.repeat_penalty ?? '') !== ''}
{ - options.repeat_last_n = options.repeat_last_n === '' ? 64 : ''; + params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : ''; }} > - {#if options.repeat_last_n === ''} + {#if (params?.repeat_last_n ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.repeat_last_n !== ''} + {#if (params?.repeat_last_n ?? '') !== ''}
{ - options.tfs_z = options.tfs_z === '' ? 1 : ''; + params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : ''; }} > - {#if options.tfs_z === ''} + {#if (params?.tfs_z ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.tfs_z !== ''} + {#if (params?.tfs_z ?? '') !== ''}
{ - options.num_ctx = options.num_ctx === '' ? 2048 : ''; + params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : ''; }} > - {#if options.num_ctx === ''} + {#if (params?.num_ctx ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.num_ctx !== ''} + {#if (params?.num_ctx ?? '') !== ''}
{ - options.num_predict = options.num_predict === '' ? 128 : ''; + params.num_predict = (params?.num_predict ?? '') === '' ? 128 : ''; }} > - {#if options.num_predict === ''} + {#if (params?.num_predict ?? '') === ''} {$i18n.t('Default')} {:else} - {$i18n.t('Default')} + {$i18n.t('Custom')} {/if}
- {#if options.num_predict !== ''} + {#if (params?.num_predict ?? '') !== ''}
{/if}
+
+
+
{$i18n.t('Template')}
+ + +
+ + {#if (params?.template ?? null) !== null} +
+
+