Browse Source

change download model

master
godo 7 months ago
parent
commit
77b19beab2
  1. 7
      frontend/src/assets/list.scss
  2. 50
      frontend/src/components/ai/aimodel.vue
  3. 63
      frontend/src/stores/model.ts
  4. 2
      godo/model/data.go

7
frontend/src/assets/list.scss

@ -54,7 +54,12 @@ $shadow-color: rgba(0, 0, 0, 0.1); // 阴影颜色
margin-left: 24px; margin-left: 24px;
margin-right: 24px; // 增加外边距 margin-right: 24px; // 增加外边距
} }
.ml-10{
margin-left: 10px;
}
.mr-10{
margin-right: 10px;
}
.font-weight-bold { .font-weight-bold {
font-weight: bold; font-weight: bold;
font-size: 18px; // 增大字体大小 font-size: 18px; // 增大字体大小

50
frontend/src/components/ai/aimodel.vue

@ -18,10 +18,6 @@ const labelId = ref(0);
const searchKey = ref(""); const searchKey = ref("");
const currentCate = ref("all"); const currentCate = ref("all");
const help_label = ref();
const help_adddown = ref();
const help_addlabel = ref();
const help_showdown = ref();
const showDetail = ref(false); const showDetail = ref(false);
const detailModel = ref("") const detailModel = ref("")
let downloadAbort:any = {}; let downloadAbort:any = {};
@ -40,15 +36,17 @@ function downAddUpdate(val:any) {
} }
async function downLabel(modelData:any, labelData:any) { async function downLabel(modelData:any, labelData:any) {
labelData = toRaw(labelData); labelData = toRaw(labelData);
modelData = toRaw(modelData);
//console.log(modelData, labelData)
const saveData = { const saveData = {
model: modelData.model, model: modelData.model,
label: labelData.name, label: labelData.name,
action: labelData.action, action: labelData.action,
engine: labelData.engine, engine: modelData.info.engine,
url: modelData.url ?? [], url: modelData.info.url ?? [],
from: modelData.from ? modelData.from : labelData.from, from: modelData.info.from,
type: modelData.type ?? "", type: modelData.type ?? "",
file_name: modelData.file_name ?? "", file_name: modelData.info.file_name ?? "",
//options: modelData.options ?? {}, //options: modelData.options ?? {},
params: modelData.params ?? {}, params: modelData.params ?? {},
info: modelData.info ?? {}, info: modelData.info ?? {},
@ -66,7 +64,7 @@ async function saveBox(modelData: any) {
async function download(saveData:any) { async function download(saveData:any) {
saveData = toRaw(saveData); saveData = toRaw(saveData);
saveData.info = toRaw(saveData.info); saveData.info = toRaw(saveData.info);
saveData.url = toRaw(saveData.url); //saveData.url = toRaw(saveData.url);
saveData.params = toRaw(saveData.params); saveData.params = toRaw(saveData.params);
downAdd.value = false; downAdd.value = false;
downLeft.value = true; downLeft.value = true;
@ -76,7 +74,7 @@ async function download(saveData:any) {
return; return;
} }
//console.log(saveData); //console.log(saveData);
const downUrl = config.modelDownApi; const downUrl = config.apiUrl + "/ai/download";
try { try {
const completion = await fetch(downUrl, { const completion = await fetch(downUrl, {
@ -126,6 +124,7 @@ async function handleDown(modelData:any, completion:any) {
const rawjson = new TextDecoder().decode(value); const rawjson = new TextDecoder().decode(value);
//console.log(rawjson); //console.log(rawjson);
const msg = modelStore.parseMsg(rawjson); const msg = modelStore.parseMsg(rawjson);
//console.log(msg)
if(msg.message && msg.code) { if(msg.message && msg.code) {
notifyError(msg.message); notifyError(msg.message);
break; break;
@ -134,9 +133,14 @@ async function handleDown(modelData:any, completion:any) {
continue; continue;
} }
modelData.status = msg.status; modelData.status = msg.status;
if (msg.total && msg.completed && msg.total > 0) { if (msg.total && msg.completed && msg.total > 0) {
if(msg.total == msg.completed){
msg.status = "success"
}else{
modelData.isLoading = 1; modelData.isLoading = 1;
modelData.progress = Math.ceil((msg.completed / msg.total) * 100); modelData.progress = Math.ceil((msg.completed / msg.total) * 100);
}
} else { } else {
modelData.progress = 0; modelData.progress = 0;
} }
@ -165,13 +169,9 @@ async function deleteModel(modelData: any) {
//return //return
const postData = { const postData = {
method: "POST", method: "POST",
body: JSON.stringify({ body: JSON.stringify(modelData.info),
url: modelData.url,
model: modelData.model,
engine: modelData.engine,
}),
}; };
const delUrl = config.modelDeleteApi; const delUrl = config.apiUrl + "/ai/delete";
const completion = await fetch(delUrl, postData); const completion = await fetch(delUrl, postData);
if (completion.status === 404) { if (completion.status === 404) {
notifyError(completion.statusText); notifyError(completion.statusText);
@ -246,7 +246,7 @@ function showModel(model: string) {
<div class="card-header"> <div class="card-header">
<span>{{ val.model }}</span> <span>{{ val.model }}</span>
</div> </div>
<div class="text item" v-if="val.progress && val.progress > 0"> <div class="text item" v-if="val.progress && val.isLoading > 0">
<el-progress <el-progress
:text-inside="true" :text-inside="true"
:stroke-width="15" :stroke-width="15"
@ -254,14 +254,14 @@ function showModel(model: string) {
/> />
</div> </div>
<div class="drawer-model-actions" style="margin-top: 10px"> <div class="drawer-model-actions" style="margin-top: 10px">
<el-tag size="small">{{ val.status }}</el-tag> <el-tag size="small" v-if="val.isLoading > 0">{{ val.status }}</el-tag>
<el-icon :size="18" color="red" @click="cancelDownload(val.model)"> <el-icon :size="18" color="red" @click="cancelDownload(val.model)">
<Delete /> <Delete />
</el-icon> </el-icon>
<el-icon <el-icon
:size="18" :size="18"
color="blue" color="blue"
v-if="val.progress > 0 && val.isLoading < 1 && val.status != 'success'" v-if="val.isLoading < 1 && val.status != 'success'"
@click="download(toRaw(val))" @click="download(toRaw(val))"
> >
<VideoPlay /> <VideoPlay />
@ -310,15 +310,19 @@ function showModel(model: string) {
@click.stop="downLeft = !downLeft" @click.stop="downLeft = !downLeft"
icon="Menu" icon="Menu"
circle circle
ref="help_showdown"
/> />
<el-button @click.stop="downAdd = true" icon="Plus" circle ref="help_adddown" /> <el-button @click.stop="downAdd = true" icon="Plus" circle />
<el-button <el-button
@click.stop="labelShow(0)" @click.stop="labelShow(0)"
icon="CollectionTag" icon="CollectionTag"
circle circle
ref="help_addlabel"
/> />
<el-button
@click.stop="modelStore.refreshOllama"
icon="RefreshRight"
circle
/>
</template> </template>
<template #extra> <template #extra>
<el-space class="mr-10"> <el-space class="mr-10">
@ -334,7 +338,7 @@ function showModel(model: string) {
</el-page-header> </el-page-header>
<div class="flex-fill ml-10 mr-10"> <div class="flex-fill ml-10 mr-10">
<el-tabs v-model="currentCate" @tab-click="showCate" ref="help_label"> <el-tabs v-model="currentCate" @tab-click="showCate">
<el-tab-pane :label="t('model.all')" name="all" /> <el-tab-pane :label="t('model.all')" name="all" />
<el-tab-pane <el-tab-pane
:label="t('model.' + item)" :label="t('model.' + item)"

63
frontend/src/stores/model.ts

@ -155,21 +155,35 @@ export const useModelStore = defineStore('modelStore', () => {
async function addDownList(data: any) { async function addDownList(data: any) {
console.log(data); console.log(data);
//modelList.value.unshift(data) modelList.value.unshift(data)
// const has = modelList.value.find((d: any) => d.model == data.model) const has = modelList.value.find((d: any) => d.model == data.model)
// //console.log(has) //console.log(has)
// if (!has) { if (!has) {
// //data = toRaw(data) //data = toRaw(data)
// const save = await getBaseModelInfo(data.model) const save = await getBaseModelInfo(data.model)
// //console.log(save) //console.log(save)
// if (save) { if (save) {
//modelList.value.unshift(save) //modelList.value.unshift(save)
// return await db.addOne("modelslist", save) return await db.addOne("modelslist", save)
// } else { } else {
// console.log("not get model" + data.model) console.log("not get model" + data.model)
// } }
}
}
async function getBaseModelInfo(model: string) {
const baseModel = await db.get("modelslist", { model: model })
if (baseModel) {
return baseModel
}
const modelInfo = await db.get("modelslist", { model: model.split(":")[0] })
if (modelInfo) {
return modelInfo
}
return null
}
async function refreshOllama() {
// }
} }
async function deleteModelList(data: any) { async function deleteModelList(data: any) {
//console.log(data) //console.log(data)
@ -221,7 +235,7 @@ export const useModelStore = defineStore('modelStore', () => {
} }
} }
} }
function parseJson(str: string) { function parseJson(str: string): any {
try { try {
return JSON.parse(str); return JSON.parse(str);
} catch (e) { } catch (e) {
@ -238,20 +252,24 @@ export const useModelStore = defineStore('modelStore', () => {
const raw: any = str.split("\n") const raw: any = str.split("\n")
if (raw.length < 1) return nres if (raw.length < 1) return nres
// deno-lint-ignore no-explicit-any // deno-lint-ignore no-explicit-any
const rt: any = raw.filter((d: any) => d.trim() != "") const rt: string[] = raw.filter((d: string) => d.trim() !== "");
//console.log(rt) //console.log(rt)
if (rt.length > 0) { if (rt.length > 0) {
let msg = parseJson(rt.pop()) let res: any[] = [];
rt.forEach((d: string) => {
const msg = parseJson(d);
if (msg) { if (msg) {
return msg res.push(msg);
} else {
msg = parseJson(rt.pop())
return msg
} }
//return JSON.parse(rt.pop()) });
if (res.length > 0) {
return res[res.length - 1]
} else { } else {
return nres return nres
} }
} else {
return nres;
}
} catch (error) { } catch (error) {
console.log(error); console.log(error);
return nres return nres
@ -288,7 +306,8 @@ export const useModelStore = defineStore('modelStore', () => {
initModel, initModel,
setCurrentModel, setCurrentModel,
getCurrentModelList, getCurrentModelList,
parseMsg parseMsg,
refreshOllama
} }
}, { }, {

2
godo/model/data.go

@ -19,7 +19,7 @@ func GetConfigFile() (string, error) {
if !libs.PathExists(modelDir) { if !libs.PathExists(modelDir) {
os.MkdirAll(modelDir, 0755) os.MkdirAll(modelDir, 0755)
} }
configFile := filepath.Join(modelDir, "model.json") configFile := filepath.Join(modelDir, "aimodel.json")
if !libs.PathExists(configFile) { if !libs.PathExists(configFile) {
// 如果文件不存在,则创建一个空的配置文件 // 如果文件不存在,则创建一个空的配置文件
err := os.WriteFile(configFile, []byte("[]"), 0644) err := os.WriteFile(configFile, []byte("[]"), 0644)

Loading…
Cancel
Save