Browse Source

change download model

master
godo 7 months ago
parent
commit
77b19beab2
  1. 7
      frontend/src/assets/list.scss
  2. 54
      frontend/src/components/ai/aimodel.vue
  3. 161
      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; // 增大字体大小

54
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) {
modelData.isLoading = 1; if(msg.total == msg.completed){
modelData.progress = Math.ceil((msg.completed / msg.total) * 100); msg.status = "success"
}else{
modelData.isLoading = 1;
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)"

161
frontend/src/stores/model.ts

@ -5,8 +5,8 @@ import { aiLabels } from "./labels/index.ts"
const modelEngines = [ const modelEngines = [
{ {
name: "ollama", name: "ollama",
cpp:"llama.cpp", cpp: "llama.cpp",
needQuant : true needQuant: true
}, },
{ {
name: "sd", name: "sd",
@ -46,50 +46,50 @@ export const useModelStore = defineStore('modelStore', () => {
const modelList: any = ref([]) const modelList: any = ref([])
const downList: any = ref([]) const downList: any = ref([])
const chatConfig: any = ref({ const chatConfig: any = ref({
chat : { chat: {
key:"chat", key: "chat",
contextLength: 10, contextLength: 10,
num_keep: 5, //保留多少个最有可能的预测结果。这与top_k一起使用,决定模型在生成下一个词时考虑的词汇范围。 num_keep: 5, //保留多少个最有可能的预测结果。这与top_k一起使用,决定模型在生成下一个词时考虑的词汇范围。
num_predict: 3, //生成多少个预测结果 num_predict: 3, //生成多少个预测结果
top_p: 0.95, top_p: 0.95,
top_k: 40, //影响生成的随机性。较高的top_k值将使模型考虑更多的词汇 top_k: 40, //影响生成的随机性。较高的top_k值将使模型考虑更多的词汇
temperature: 0.7, //影响生成的随机性。较低的温度产生更保守的输出,较高的温度产生更随机的输出。 temperature: 0.7, //影响生成的随机性。较低的温度产生更保守的输出,较高的温度产生更随机的输出。
}, },
translation: { translation: {
key:"translation", key: "translation",
num_keep: 5, num_keep: 5,
num_predict: 1, num_predict: 1,
top_k: 40, top_k: 40,
top_p: 0.95, top_p: 0.95,
temperature: 0.2, temperature: 0.2,
}, },
creation:{ creation: {
key:"creation", key: "creation",
num_keep: 3, num_keep: 3,
num_predict: 1, num_predict: 1,
top_k: 40, top_k: 40,
top_p: 0.95, top_p: 0.95,
temperature: 0.2, temperature: 0.2,
}, },
knowledge:{ knowledge: {
key:"knowledge", key: "knowledge",
contextLength: 10, contextLength: 10,
num_keep: 5, num_keep: 5,
num_predict: 1, num_predict: 1,
top_k: 40, top_k: 40,
top_p: 0.95, top_p: 0.95,
temperature: 0.2, temperature: 0.2,
}, },
spoken:{ spoken: {
key:"spoken", key: "spoken",
contextLength: 10, contextLength: 10,
num_keep: 5, num_keep: 5,
num_predict: 1, num_predict: 1,
top_k: 40, top_k: 40,
top_p: 0.95, top_p: 0.95,
temperature: 0.2, temperature: 0.2,
} }
}) })
async function getLabelCate(cateName: string) { async function getLabelCate(cateName: string) {
const list = await getLabelList() const list = await getLabelList()
@ -145,31 +145,45 @@ export const useModelStore = defineStore('modelStore', () => {
downList.value[index].isLoading = 0 downList.value[index].isLoading = 0
}) })
} }
async function setCurrentModel(action:string, model:string) { async function setCurrentModel(action: string, model: string) {
await db.modify("modelslist", "action", action, { isdef: 0 }) await db.modify("modelslist", "action", action, { isdef: 0 })
return await db.modify("modelslist", "model", model, { isdef: 1 }) return await db.modify("modelslist", "model", model, { isdef: 1 })
} }
function getCurrentModelList(modelList: any, action:string){ function getCurrentModelList(modelList: any, action: string) {
return modelList.filter((d: any) => d.action == action) return modelList.filter((d: any) => d.action == action)
} }
async function addDownList(data: any) { async function addDownList(data: any) {
console.log(data); console.log(data);
//modelList.value.unshift(data)
// const has = modelList.value.find((d: any) => d.model == data.model)
// //console.log(has)
// if (!has) {
// //data = toRaw(data)
// const save = await getBaseModelInfo(data.model)
// //console.log(save)
// if (save) {
// modelList.value.unshift(save)
// return await db.addOne("modelslist", save)
// } else {
// console.log("not get model" + data.model)
// }
// } modelList.value.unshift(data)
const has = modelList.value.find((d: any) => d.model == data.model)
//console.log(has)
if (!has) {
//data = toRaw(data)
const save = await getBaseModelInfo(data.model)
//console.log(save)
if (save) {
//modelList.value.unshift(save)
return await db.addOne("modelslist", save)
} else {
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,13 +235,13 @@ 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) {
return undefined; return undefined;
} }
} }
function parseMsg(str: string) { function parseMsg(str: string) {
const nres = { status: "" } const nres = { status: "" }
try { try {
@ -238,19 +252,23 @@ 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[] = [];
if (msg) { rt.forEach((d: string) => {
return msg const msg = parseJson(d);
if (msg) {
res.push(msg);
}
});
if (res.length > 0) {
return res[res.length - 1]
} else { } else {
msg = parseJson(rt.pop()) return nres
return msg
} }
//return JSON.parse(rt.pop())
} else { } else {
return nres return nres;
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@ -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