Commit f6a8833c authored by 周成波's avatar 周成波

按需求对接llm模型,人工匹配角色关键词

parent 76fbfb23
......@@ -4,11 +4,11 @@
import request from '@/api/request'
export default {
submitGpt(prompt: string): Promise<string> {
submitGpt(prompt: string, llm: string = "gpt"): Promise<string> {
if (!prompt) {
return Promise.reject("输入不能为空");
}
const post_data = { source_text: prompt, llm: 'tyqw' }
const post_data = { source_text: prompt, llm: llm }
return request.post('/text2video/text2gpt', post_data)
.then((res: any) => {
// console.log(res);
......@@ -21,7 +21,7 @@ export default {
})
.catch((err: any) => {
console.log(err);
return Promise.reject("chatgpt通讯失败");
return Promise.reject("与LLM通讯失败");
});
},
......
......@@ -27,6 +27,16 @@ const form = reactive({
const sd_prompt_prefix = default_data.sd_prompt_prefix;
const sd_negative_prompt_prefix = default_data.sd_negative_prompt_prefix;
const wenan_llm = "langchain"
const wenan_llm_name = "baichuan2-7b"
const role_llm = "langchain"
const role_llm_name = "baichuan2-7b"
const tuili_llm = "langchain"
const tuili_llm_name = "baichuan2-7b"
const fanyi_llm = "langchain"
const fanyi_llm_name = "baichuan2-7b"
onMounted(() => {
// 初始化示例数据
onChangeScreen(form.screen);
......@@ -34,7 +44,7 @@ onMounted(() => {
const onSubmitGpt = () => {
text2videoService
.submitGpt(form.chatgpt_prompt)
.submitGpt(form.chatgpt_prompt, wenan_llm)
.then((result: string) => {
console.log(form.chatgpt_prompt);
console.log(result);
......@@ -68,19 +78,26 @@ const onAdaptRoles = async () => {
要求:
角色和角色关键词要对应。
严格以如下格式返回:[{"角色":"","角色关键词":""}]`;
const keywords = await text2videoService.submitGpt(form.chatgpt_answer + "\n" + adapt_restrict);
const keywords = await text2videoService.submitGpt(form.chatgpt_answer + "\n" + adapt_restrict, role_llm);
console.log(keywords)
const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, ''))
console.log(keywords_obj)
form.chatgpt_answer_roles = []
for (let item of keywords_obj) {
let newObjItem = {
"角色": JSON.stringify(item["角色"]).replace(/"/g, ''),
"角色关键词": JSON.stringify(item["角色关键词"]).replace(/"/g, '')
};
form.chatgpt_answer_roles.push(newObjItem);
if ('error' in keywords_obj) {
ElMessage({
message: "未解析到角色",
type: "error",
});
} else {
for (let item of keywords_obj) {
let newObjItem = {
"角色": JSON.stringify(item["角色"]).replace(/"/g, ''),
"角色关键词": JSON.stringify(item["角色关键词"]).replace(/"/g, '')
};
form.chatgpt_answer_roles.push(newObjItem);
}
console.log(form.chatgpt_answer_roles)
}
console.log(form.chatgpt_answer_roles)
} catch (error) {
ElMessage({
message: String(error),
......@@ -127,7 +144,7 @@ const onAdapt = async () => {
async function processScenes() {
for (const item of form.adapt_result_json) {
await onAdaptOne(item);
await delay(1000);
await delay(100);
await onDrawOne(item);
}
}
......@@ -164,25 +181,44 @@ const onAdaptOne = async (item: any) => {
指令:
请理解这个故事,针对其中的这个场景:“${item.场景描述}”,给出这个场景的:
场景关键词(年代,空间,时间段,地理环境,天气,物品,人物,镜头角度)、
角色(从所有角色中选择本场景的角色)、
角色关键词(从所有角色中选择本场景的角色关键字,原样拷贝)。
角色(从所有角色中选择本场景的角色)。
要求:
角色和角色关键词要对应。
严格以如下格式返回:[{"场景关键词":"(多个词以逗号分隔)","角色":"(角色以逗号分隔)","角色关键词":"(分别给予对应角色的关键词,多个词以逗号分隔)"}]
严格以如下格式返回:[{"场景关键词":"(多个词以逗号分隔)","角色":"(角色以逗号分隔)"}]
除了按格式返回的内容之外,不要添加其他的任何说明。`;
const keywords = await text2videoService.submitGpt("故事:\n" + form.chatgpt_answer + "\n所有角色:\n"+ JSON.stringify(form.chatgpt_answer_roles)+"\n" + adapt_restrict);
const keywords = await text2videoService.submitGpt("故事:\n" + form.chatgpt_answer + "\n所有角色:\n"+ JSON.stringify(form.chatgpt_answer_roles)+"\n" + adapt_restrict, tuili_llm);
// console.log(keywords)
const keywords_obj = utils.formatJsonObj(keywords.replace(/```json/g, '').replace(/```/g, ''))
// console.log(keywords_obj)
item.场景关键词 = JSON.stringify(keywords_obj[0].场景关键词).replace(/"/g, '');
if (form.chatgpt_answer_roles.length === 0) {
// 总角色为空
item.角色 = '';
item.角色关键词 = '';
if ('error' in keywords_obj) {
ElMessage({
message: `分镜 ${item.编号} 推理关键词失败,请重试`,
type: "error",
});
} else {
// 总角色不为空
item.角色 = JSON.stringify(keywords_obj[0].角色).replace(/"/g, '');
item.角色关键词 = JSON.stringify(keywords_obj[0].角色关键词).replace(/"/g, '');
item.场景关键词 = JSON.stringify(keywords_obj[0].场景关键词).replace(/"/g, '');
if (form.chatgpt_answer_roles.length === 0) {
// 总角色为空
item.角色 = '';
item.角色关键词 = '';
} else {
// 总角色不为空
// item.角色 = JSON.stringify(keywords_obj[0].角色).replace(/"/g, '');
// item.角色关键词 = JSON.stringify(keywords_obj[0].角色关键词).replace(/"/g, '');
const item_roles = JSON.stringify(keywords_obj[0].角色).replace(/"/g, '');
item.角色 = item_roles;
let role_kws = ""
const item_roles_arr = item_roles.split(/[,,]/);
item_roles_arr.forEach( one_item_role => {
// 人工指定角色关键词,包含则取
form.chatgpt_answer_roles.forEach(i => {
if (i["角色"].includes(one_item_role.trim()) || one_item_role.includes(i["角色"].trim())) {
role_kws = `${role_kws}${i["角色"]}${i["角色关键词"]}】`
}
})
})
item.角色关键词 = role_kws;
}
}
} catch (error) {
ElMessage({
......@@ -214,7 +250,7 @@ const onDrawOne = async (item: any) => {
const sd_describe = await text2videoService.submitGpt(
`${temp_prompt}
指令:
请理解以上内容,并返回一段英文的描述。`
请理解以上内容,并返回一段英文的描述。`, fanyi_llm
);
item.画面描述词 = sd_describe;
const sd_prompt = item.画面描述词 + "," + sd_prompt_prefix;
......@@ -380,14 +416,14 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
<el-input v-model="form.chatgpt_prompt" :autosize="true" type="textarea" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmitGpt">生成文案</el-button>
<el-button type="primary" @click="onSubmitGpt">生成文案{{wenan_llm_name}}</el-button>
</el-form-item>
<el-form-item label="文案">
<el-input v-model="form.chatgpt_answer" :autosize="true" type="textarea" />
</el-form-item>
<!-- 角色 -->
<el-form-item>
<el-button type="primary" @click="onAdaptRoles">推理所有角色</el-button>
<el-button type="primary" @click="onAdaptRoles">推理所有角色{{role_llm_name}}</el-button>
<el-button plain @click="clean_roles">清空总角色列表</el-button>
</el-form-item>
<el-form-item label="角色">
......@@ -406,7 +442,7 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
</el-form-item>
<!-- 分镜 -->
<el-form-item>
<el-button type="primary" @click="onAdapt">分镜、推理关键词、绘图</el-button>
<el-button type="primary" @click="onAdapt">分镜、推理关键词({{tuili_llm_name}})、翻译({{fanyi_llm_name}})、绘图</el-button>
</el-form-item>
<el-form-item label="分镜">
<el-table :data="form.adapt_result_json" border style="width: 100%; z-index: calc(var(--el-table-index) -1)">
......@@ -447,8 +483,8 @@ const handleExceed: UploadProps['onExceed'] = (files) => {
</template>
-->
<template v-slot="scope">
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onAdaptOne(scope.row)">重新推理<br />关键字</el-button></div>
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onDrawOne(scope.row)">重绘本镜</el-button></div>
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onAdaptOne(scope.row)">推理关键词</el-button></div>
<div style="margin: 10px 0"><el-button type="primary" size="default" @click="onDrawOne(scope.row)">翻译、绘图</el-button></div>
<el-upload
class="upload-demo"
ref="upload"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment