fixed keling model selection

This commit is contained in:
RockYang 2025-03-04 21:21:28 +08:00
parent 4dcb0d850c
commit 393bfa137e
3 changed files with 56 additions and 22 deletions

View File

@ -123,7 +123,7 @@ func (h *VideoHandler) KeLingCreate(c *gin.Context) {
var data struct { var data struct {
Channel string `json:"channel"` Channel string `json:"channel"`
TaskType string `json:"task_type"` // 任务类型: text2video/image2video TaskType string `json:"task_type"` // 任务类型: text2video/image2video
Model string `json:"model"` // 模型: default/anime Model string `json:"model"` // 模型: kling-v1-5,kling-v1-6
Prompt string `json:"prompt"` // 视频描述 Prompt string `json:"prompt"` // 视频描述
NegPrompt string `json:"negative_prompt"` // 负面提示词 NegPrompt string `json:"negative_prompt"` // 负面提示词
CfgScale float64 `json:"cfg_scale"` // 相关性系数(0-1) CfgScale float64 `json:"cfg_scale"` // 相关性系数(0-1)
@ -145,7 +145,14 @@ func (h *VideoHandler) KeLingCreate(c *gin.Context) {
return return
} }
if user.Power < h.App.SysConfig.LumaPower { // 计算当前任务所需算力
key := fmt.Sprintf("%s_%s_%s", data.Model, data.Mode, data.Duration)
power := h.App.SysConfig.KeLingPowers[key]
if power == 0 {
resp.ERROR(c, "当前模型暂不支持")
return
}
if user.Power < power {
resp.ERROR(c, "您的算力不足,请充值后再试!") resp.ERROR(c, "您的算力不足,请充值后再试!")
return return
} }

View File

@ -43,9 +43,8 @@
<!-- 模型选择 --> <!-- 模型选择 -->
<div class="param-line"> <div class="param-line">
<el-form-item label="模型选择"> <el-form-item label="模型选择">
<el-select v-model="params.model" placeholder="请选择模型"> <el-select v-model="params.model" placeholder="请选择模型" @change="updateModelPower">
<el-option label="默认模型" value="default" /> <el-option v-for="item in models" :key="item.value" :label="item.text" :value="item.value" />
<el-option label="动漫风格" value="anime" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
@ -53,7 +52,7 @@
<!-- 视频时长 --> <!-- 视频时长 -->
<div class="param-line"> <div class="param-line">
<el-form-item label="视频时长"> <el-form-item label="视频时长">
<el-select v-model="params.duration" placeholder="请选择时长"> <el-select v-model="params.duration" placeholder="请选择时长" @change="updateModelPower">
<el-option label="5秒" value="5" /> <el-option label="5秒" value="5" />
<el-option label="10秒" value="10" /> <el-option label="10秒" value="10" />
</el-select> </el-select>
@ -63,7 +62,7 @@
<!-- 生成模式 --> <!-- 生成模式 -->
<div class="param-line"> <div class="param-line">
<el-form-item label="生成模式"> <el-form-item label="生成模式">
<el-select v-model="params.mode" placeholder="请选择模式"> <el-select v-model="params.mode" placeholder="请选择模式" @change="updateModelPower">
<el-option label="标准模式" value="std" /> <el-option label="标准模式" value="std" />
<el-option label="专业模式" value="pro" /> <el-option label="专业模式" value="pro" />
</el-select> </el-select>
@ -83,10 +82,10 @@
</div> </div>
<!-- 运镜控制 --> <!-- 运镜控制 -->
<div class="param-line"> <div class="param-line" v-if="showCameraControl">
<div class="param-line pt"> <div class="param-line pt">
<span>运镜控制</span> <span>运镜控制</span>
<el-tooltip content="生成画面的运镜效果" placement="right"> <el-tooltip content="生成画面的运镜效果,仅 1.5的高级模式可用" placement="right">
<el-icon> <el-icon>
<InfoFilled /> <InfoFilled />
</el-icon> </el-icon>
@ -94,7 +93,7 @@
</div> </div>
<!-- 添加运镜类型选择 --> <!-- 添加运镜类型选择 -->
<el-form-item label="运镜类型"> <div class="param-line">
<el-select <el-select
v-model="params.camera_control.type" v-model="params.camera_control.type"
placeholder="请选择运镜类型" placeholder="请选择运镜类型"
@ -106,7 +105,7 @@
<el-option label="右旋推进" value="right_turn_forward" /> <el-option label="右旋推进" value="right_turn_forward" />
<el-option label="左旋推进" value="left_turn_forward" /> <el-option label="左旋推进" value="left_turn_forward" />
</el-select> </el-select>
</el-form-item> </div>
<!-- 仅在simple模式下显示详细配置 --> <!-- 仅在simple模式下显示详细配置 -->
<div <div
@ -533,7 +532,7 @@ import {
} from "@element-plus/icons-vue"; } from "@element-plus/icons-vue";
import { httpGet, httpPost, httpDownload } from "@/utils/http"; import { httpGet, httpPost, httpDownload } from "@/utils/http";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import { getClientId, checkSession } from "@/store/cache"; import {checkSession, getSystemInfo} from "@/store/cache";
import Clipboard from "clipboard"; import Clipboard from "clipboard";
import { import {
@ -544,11 +543,24 @@ import {
} from "@/utils/dialog"; } from "@/utils/dialog";
import { replaceImg } from "@/utils/libs"; import { replaceImg } from "@/utils/libs";
const models = ref([
{
text: "可灵 1.6",
value: "kling-v1-6",
},
{
text: "可灵 1.5",
value: "kling-v1-5",
},
{
text: "可灵 1.0",
value: "kling-v1",
},
]);
// //
const params = reactive({ const params = reactive({
// client_id: getClientId(),
task_type: "text2video", task_type: "text2video",
model: "default", model: models.value[0].value,
prompt: "", prompt: "",
negative_prompt: "", negative_prompt: "",
cfg_scale: 0.7, cfg_scale: 0.7,
@ -591,6 +603,7 @@ const changeRate = (item) => {
params.aspect_ratio = item.value; params.aspect_ratio = item.value;
}; };
// //
let pollTimer = null; let pollTimer = null;
const generating = ref(false); const generating = ref(false);
@ -600,7 +613,6 @@ const availablePower = ref(100);
const taskFilter = ref("all"); const taskFilter = ref("all");
const runningTasks = ref([]); const runningTasks = ref([]);
const finishedTasks = ref([]); const finishedTasks = ref([]);
const total = ref(0);
const pageSize = ref(4); const pageSize = ref(4);
const currentPage = ref(1); const currentPage = ref(1);
const previewVisible = ref(false); const previewVisible = ref(false);
@ -608,9 +620,17 @@ const currentVideo = ref("");
const isOver = ref(false); const isOver = ref(false);
const pullTask = ref(true); const pullTask = ref(true);
const waterfallKey = ref(Date.now()); const waterfallKey = ref(Date.now());
const showCameraControl = ref(false);
const keLingPowers = ref({});
//
const updateModelPower = () => {
showCameraControl.value = params.model === "kling-v1-5" && params.mode === "pro";
powerCost.value = keLingPowers.value[`${params.model}_${params.mode}_${params.duration}`];
};
// //
const tabChange = (tab) => { const tabChange = (tab) => {
params.task_type = tab; params.task_type = tab;
}; };
@ -789,10 +809,10 @@ const fetchTasks = async () => {
} }
}; };
// // //
const checkAllCompleted = () => { // const checkAllCompleted = () => {
return runningTasks.value.length === 0; // return runningTasks.value.length === 0;
}; // };
const previewVideo = (task) => { const previewVideo = (task) => {
currentVideo.value = task.video_url; currentVideo.value = task.video_url;
@ -830,8 +850,9 @@ const clipboard = ref(null);
// //
onMounted(async () => { onMounted(async () => {
checkSession() checkSession()
.then(async () => { .then(async (u) => {
isLogin.value = true; isLogin.value = true;
availablePower.value = u.power;
console.log("mounted-isLogin-可以继续", isLogin.value); console.log("mounted-isLogin-可以继续", isLogin.value);
await fetchTasks(); await fetchTasks();
@ -854,6 +875,10 @@ onMounted(async () => {
clipboard.value.on("error", () => { clipboard.value.on("error", () => {
ElMessage.error("复制失败!"); ElMessage.error("复制失败!");
}); });
//
getSystemInfo().then((res) => {
keLingPowers.value = res.data.keling_powers;
});
}); });
onUnmounted(() => { onUnmounted(() => {
clearInterval(pollTimer); clearInterval(pollTimer);

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="login flex w-full flex-col place-content-center h-lvh"> <div class="login flex w-full flex-col place-content-center h-lvh">
<el-image src="/images/logo.png" class="w-1/2 mx-auto logo" /> <el-image :src="logo" class="w-1/2 mx-auto logo" />
<div class="title text-center text-3xl font-bold mt-8">{{ title }}</div> <div class="title text-center text-3xl font-bold mt-8">{{ title }}</div>
<div class="w-full p-8"> <div class="w-full p-8">
<login-dialog @success="loginSuccess" /> <login-dialog @success="loginSuccess" />
@ -16,6 +16,7 @@ import { ref, onMounted } from "vue";
const router = useRouter(); const router = useRouter();
const title = ref("登录"); const title = ref("登录");
const logo = ref("");
const loginSuccess = () => { const loginSuccess = () => {
router.back(); router.back();
@ -24,6 +25,7 @@ const loginSuccess = () => {
onMounted(() => { onMounted(() => {
getSystemInfo().then((res) => { getSystemInfo().then((res) => {
title.value = res.data.title; title.value = res.data.title;
logo.value = res.data.logo;
}); });
}); });
</script> </script>