@@ -330,8 +347,6 @@ const { isIntl, isProductPro } = useGlobalStore();
const connectionMode = ref<'manual' | 'local'>('manual');
const loadingEngines = ref(false);
const enginesLoadFailed = ref(false);
-const loadingLocalModels = ref(false);
-const localModelsLoadFailed = ref(false);
const localEngines = ref
>([]);
const form = reactive({
@@ -366,10 +381,7 @@ const localModelOptions = computed(() =>
const disabled = computed(
() =>
connectionMode.value === 'local' &&
- (loadingEngines.value ||
- loadingLocalModels.value ||
- localModelsLoadFailed.value ||
- !localEngines.value.some((item) => item.id === form.localEngineId)),
+ (loadingEngines.value || !localEngines.value.some((item) => item.id === form.localEngineId)),
);
const selectedAPIConfig = computed(() =>
selectedProvider.value?.apiTypes.find((item) => item.apiType === form.apiType),
@@ -858,12 +870,14 @@ watch([open, () => form.provider, connectionMode], async ([visible, provider, mo
const { data: item } = await checkAppInstalled('ollama', '');
if (cancelled) return;
if (item.isExist) {
+ const models = await readPages((page) => searchOllamaModel(page));
+ if (cancelled) return;
engines = [
{
id: item.appInstallId,
name: item.name,
baseURL: item.modelAccountBaseURL || `http://${item.containerName}:11434/v1`,
- models: [],
+ models: models.filter((model) => model.status === 'Success').map((model) => model.name),
},
];
}
@@ -876,31 +890,6 @@ watch([open, () => form.provider, connectionMode], async ([visible, provider, mo
}
});
-watch(
- [open, () => form.provider, connectionMode, () => form.localEngineId],
- async ([visible, provider, mode, engineId], _, onCleanup) => {
- let cancelled = false;
- onCleanup(() => (cancelled = true));
- loadingLocalModels.value = false;
- localModelsLoadFailed.value = false;
- if (!visible || provider !== 'ollama' || mode !== 'local') return;
- const engine = localEngines.value.find((item) => item.id === engineId);
- if (!engine) return;
- loadingLocalModels.value = true;
- try {
- const models = await readPages((page) => searchOllamaModel(page));
- if (cancelled) return;
- engine.models = models.filter((model) => model.status === 'Success').map((model) => model.name);
- resetManualModels();
- } catch {
- if (!cancelled) localModelsLoadFailed.value = true;
- } finally {
- if (!cancelled) loadingLocalModels.value = false;
- }
- },
- { flush: 'sync' },
-);
-
const handleAPITypeChange = () => {
const config = selectedAPIConfig.value;
if (!config) {
@@ -951,6 +940,50 @@ defineExpose({
}
}
+.local-engine-option {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ min-width: 0;
+
+ &__name {
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ &__model {
+ max-width: 55%;
+ min-width: 0;
+
+ :deep(.el-tag__content) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ }
+
+ &__more {
+ flex-shrink: 0;
+ }
+}
+
+.local-engine-models {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ max-height: 240px;
+ overflow: auto;
+
+ .el-tag {
+ height: auto;
+ padding: 4px 6px;
+ white-space: normal;
+ overflow-wrap: anywhere;
+ max-width: 100%;
+ }
+}
+
.base-url-warning {
margin-top: 8px;
}
diff --git a/frontend/src/views/ai/model/ollama/add/index.vue b/frontend/src/views/ai/model/ollama/add/index.vue
index c2e0b57e4..fa8e2290c 100644
--- a/frontend/src/views/ai/model/ollama/add/index.vue
+++ b/frontend/src/views/ai/model/ollama/add/index.vue
@@ -1,5 +1,5 @@
-
+
@@ -32,7 +32,7 @@
-
+