fix: make AI polish neutral

This commit is contained in:
2026-05-26 10:06:47 +08:00
parent c415cd0aba
commit 509bd9b594
8 changed files with 71 additions and 29 deletions

View File

@@ -15,12 +15,18 @@ export const chatCompletions = (data) =>
// 流式对话补全
export const streamChatCompletions = async function* (data, signal, options = {}) {
const text = data?.messages?.at?.(-1)?.content || data?.goal || ''
const response = await fetch('/api/creative/copy', {
const systemPrompt = data?.messages?.find?.((message) => message?.role === 'system')?.content || ''
const response = await fetch('/api/prompt/polish', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ goal: typeof text === 'string' ? text : JSON.stringify(text), seconds: 15 }),
body: JSON.stringify({
text: typeof text === 'string' ? text : JSON.stringify(text),
system_prompt: systemPrompt,
mode: 'chat',
target_language: 'keep'
}),
signal
})
@@ -30,6 +36,5 @@ export const streamChatCompletions = async function* (data, signal, options = {}
}
const json = await response.json()
const variant = json.variants?.[0]
yield variant?.image_prompt_en || variant?.video_prompt_en || ''
yield json.text || ''
}

View File

@@ -695,7 +695,9 @@ const formatOptions = [
const chatHook = computed(() => {
return useChat({
systemPrompt: systemPrompt.value,
model: model.value
model: model.value,
mode: 'chat',
targetLanguage: 'keep'
})
})
@@ -838,7 +840,9 @@ const handleGenerate = async () => {
const { send } = useChat({
systemPrompt: resolvedSystemPrompt,
model: model.value
model: model.value,
mode: 'chat',
targetLanguage: 'keep'
})
// 如果 user 消息为空,使用简单提示

View File

@@ -116,8 +116,10 @@ const isApiConfigured = computed(() => !!modelStore.currentApiKey)
// Chat hook for polish | 润色用的 Chat hook
const { send: sendChat } = useChat({
systemPrompt: '你是一个专业的AI绘画提示词专家。将用户输入的内容美化成高质量的生图提示词,包含风格、光线、構图、细节等要素。直接返回提示词,不要其他解释。',
model: 'gpt-4o-mini'
systemPrompt: '你是一个专业的 AI 绘画提示词编辑。只优化用户已经给出的主体、风格、光线、构图和细节,不添加用户没有提到的品牌、产品或营销话术。直接返回提示词,不要其他解释。',
model: 'gpt-4o-mini',
mode: 'image',
targetLanguage: 'en'
})
// Local content state | 本地内容状态

View File

@@ -127,7 +127,7 @@ export const useApiState = () => {
return { loading, error, status, reset, setLoading, setError, setSuccess }
}
export const useChat = () => {
export const useChat = (options = {}) => {
const { loading, error, status, reset, setLoading, setError, setSuccess } = useApiState()
const messages = ref([])
const currentResponse = ref('')
@@ -137,12 +137,17 @@ export const useChat = () => {
setLoading(true)
stopped = false
try {
const response = await requestJson('/creative/copy', {
const mode = options.mode || 'chat'
const response = await requestJson('/prompt/polish', {
method: 'POST',
body: JSON.stringify({ goal: content, seconds: 15 })
body: JSON.stringify({
text: content,
system_prompt: options.systemPrompt || '',
mode,
target_language: options.targetLanguage || (mode === 'chat' ? 'keep' : 'en')
})
})
const variant = response.variants?.[0]
const result = variant?.image_prompt_en || variant?.video_prompt_en || content
const result = response.text || content
if (!stopped) {
currentResponse.value = result
messages.value.push({ role: 'user', content })

View File

@@ -299,12 +299,12 @@ onMounted(() => {
const CHAT_TEMPLATES = {
imagePrompt: {
name: '生图提示词',
systemPrompt: '你是一个专业的AI绘画提示词专家。将用户输入的内容美化成高质量的生图提示词,包含风格、光线、構图、细节等要素。直接返回提示词,不要其他解释。',
systemPrompt: '你是一个专业的 AI 绘画提示词编辑。只优化用户已经给出的主体、风格、光线、构图和细节,不添加用户没有提到的品牌、产品或营销话术。直接返回提示词,不要其他解释。',
model: 'gpt-4o-mini'
},
videoPrompt: {
name: '视频提示词',
systemPrompt: '你是一个专业的AI视频提示词专家。将用户输入的内容美化成高质量的视频生成提示词,包含运动、场景、镜头等要素。直接返回提示词,不要其他解释。',
systemPrompt: '你是一个专业的 AI 视频提示词编辑。只优化用户已经给出的主体、动作、场景、镜头和节奏,不添加用户没有提到的品牌、产品或营销话术。直接返回提示词,不要其他解释。',
model: 'gpt-4o-mini'
}
}
@@ -320,7 +320,9 @@ const {
send: sendChat
} = useChat({
systemPrompt: CHAT_TEMPLATES.imagePrompt.systemPrompt,
model: CHAT_TEMPLATES.imagePrompt.model
model: CHAT_TEMPLATES.imagePrompt.model,
mode: 'image',
targetLanguage: 'en'
})
// Workflow orchestrator hook | 工作流编排 hook