提交 ba40826a authored 作者: 王鹏飞's avatar 王鹏飞

feat: integrate @ezijing/ai-core for AI image generation and update dependencies

上级 08a7b6a5
......@@ -11,6 +11,7 @@
"@chuangkit/chuangkit-design": "^2.0.5",
"@dagrejs/dagre": "^1.1.3",
"@element-plus/icons-vue": "^2.3.1",
"@ezijing/ai-core": "^1.0.0",
"@fortaine/fetch-event-source": "^3.0.6",
"@tinymce/tinymce-vue": "^5.0.1",
"@vue-flow/controls": "^1.1.2",
......@@ -1111,6 +1112,16 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@ezijing/ai-core": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@ezijing/ai-core/-/ai-core-1.0.0.tgz",
"integrity": "sha512-vTYGVrMcRhx5JcK4KwczOw8cHXGHwckxHKtSIkyH6zaUpy221orLFbIpL3AugI/Fjd39FjaRadKeqa6FUjJZGA==",
"license": "MIT",
"dependencies": {
"axios": "^1.6.0",
"eventsource-parser": "^3.0.3"
}
},
"node_modules/@floating-ui/core": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.0.5.tgz",
......@@ -5456,12 +5467,12 @@
}
},
"node_modules/eventsource-parser": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.2.tgz",
"integrity": "sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz",
"integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==",
"license": "MIT",
"engines": {
"node": ">=18.0.0"
"node": ">=20.0.0"
}
},
"node_modules/evp_bytestokey": {
......
......@@ -18,6 +18,7 @@
"@chuangkit/chuangkit-design": "^2.0.5",
"@dagrejs/dagre": "^1.1.3",
"@element-plus/icons-vue": "^2.3.1",
"@ezijing/ai-core": "^1.0.0",
"@fortaine/fetch-event-source": "^3.0.6",
"@tinymce/tinymce-vue": "^5.0.1",
"@vue-flow/controls": "^1.1.2",
......
......@@ -2,8 +2,9 @@ import md5 from 'blueimp-md5'
import { useStorage } from '@vueuse/core'
import { fetchEventSource } from '@fortaine/fetch-event-source'
import axios from 'axios'
import { getAIUsage, postGenerateImage } from '@/api/ai'
import { getAIUsage } from '@/api/ai'
import { ElMessage } from 'element-plus'
import { createAIService } from '@ezijing/ai-core'
export function useAI(config) {
// AI 配置列表
......@@ -299,13 +300,14 @@ export function useAI(config) {
// 生成图片
async function generateImage(data) {
const ai = createAIService('volcano')
isLoading.value = true
try {
const res = await postGenerateImage({ ...config, ...data })
if (res.data.detail.image_url) {
messages.value.push({ type: 'image', role: 'assistant', ...res.data.detail })
const res = await ai.generateImage({ prompt: data.content, watermark: false })
if (res.url) {
messages.value.push({ type: 'image', role: 'assistant', image_url: res.url, content: data.content })
} else {
ElMessage.error(res.data.detail.failure_reason)
ElMessage.error(res.error)
}
fetchUsages()
} catch (error) {
......
import { fetchEventSource } from '@fortaine/fetch-event-source'
import { getAIUsage, postGenerateImage } from '../api'
import type { Message } from '../types'
import { ElMessage } from 'element-plus'
export function useChat(options: any) {
const messages = ref<Message[]>([])
const chatId = ref<string | null>(null)
const isLoading = ref(false)
const usages = ref({
chart_count: 0,
ai_creation_count: 2,
ai_polish_count: 0,
ai_expand_count: 0,
ai_refresh_count: 0,
experiment_id: 121,
chart_max_count: 20,
ai_creation_max_count: 5,
ai_polish_max_count: 5,
ai_expand_max_count: 5,
ai_refresh_max_count: 5
})
async function fetchUsages() {
const res = await getAIUsage(options)
usages.value = res.data.detail
}
onMounted(() => {
fetchUsages()
})
async function post(data: any) {
if (options.fileType == 1) {
await generateText(data)
} else {
await generateImage(data)
}
}
// 生成文本
// async function generateText(data: any) {
// isLoading.value = true
// await fetchEventSource('/api/lab/v1/experiment/marketing-ai/sky-agents-chat', {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify({ ...options, ...data, context: data.content, chart_id: chatId.value }),
// async onopen(response) {
// if (response.ok) {
// return
// } else {
// throw response
// }
// },
// onmessage(res) {
// const message = JSON.parse(res.data)
// if (message.code === 0) {
// ElMessage.error(message.message)
// return
// }
// chatId.value = message.chatId + ''
// const conversationId = message.conversationId
// const messageIndex = messages.value.findIndex(session => session.conversationId === conversationId)
// const content = message.content || ''
// // if (message.content === '\n') content = '<br/>'
// if (messageIndex === -1) {
// messages.value.push({ conversationId, role: 'bot', content, input: data.context })
// } else {
// messages.value[messageIndex].content = messages.value[messageIndex].content + content
// }
// isLoading.value = false
// },
// onclose() {
// fetchUsages()
// isLoading.value = false
// },
// onerror(err) {
// console.log(err)
// isLoading.value = false
// throw err
// }
// })
// }
async function generateText(data: any) {
isLoading.value = true
let params = {}
if (data.type === '1') {
params = {
chat_history: messages.value
}
} else {
const docAction: any = {
2: 'write',
3: 'rewrite',
4: 'expand',
5: 'rewrite',
7: 'abbreviate',
8: 'summary'
}
params = {
content: data.content,
doc_action: docAction[data.type],
full_text: !!(data.type === 2)
}
}
await fetchEventSource('/api/lab/v1/experiment/marketing-ai/sky-agent3-chat', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
...options, ...data, api_type: parseInt(data.type) === 1 ? 1 : 2, context: data.content, params: params
}),
async onopen(response) {
if (response.ok) {
return
} else {
throw response
}
},
onmessage(res) {
const message = JSON.parse(res.data)
// 聊天返回内容
if (data.type === '1') {
if (message.code === 0) {
ElMessage.error(message.message)
return
}
const conversationId = message.conversation_id
const messageIndex = messages.value.findIndex(session => session.conversationId === conversationId)
const content = message?.arguments?.reduce((a: any, b: any) => {
a = b?.messages[0]?.text || ''
return a
}, '')
if (messageIndex === -1) {
messages.value.push({ conversationId, role: 'bot', content, input: data.context })
} else {
if (content) {
messages.value[messageIndex].content = content
}
}
} else {
// 按钮功能返回内容
const requestId = message.request_id
const messageIndex = messages.value.findIndex(session => session.conversationId === requestId)
if (messageIndex === -1) {
messages.value.push({ conversationId: requestId, role: 'bot', content: message.data?.text || '', input: data.context })
} else {
messages.value[messageIndex].content = message.data?.text
}
}
isLoading.value = false
},
onclose() {
fetchUsages()
isLoading.value = false
},
onerror(err) {
console.log(err)
isLoading.value = false
throw err
}
})
}
// 生成图片
async function generateImage(data: any) {
isLoading.value = true
try {
const res = await postGenerateImage({ ...options, ...data })
if (res.data.detail.image_url) {
messages.value.push({ type: 'image', role: 'bot', ...res.data.detail })
} else {
ElMessage.error(res.data.detail.failure_reason)
}
fetchUsages()
} catch (error) {
console.log(error)
}
isLoading.value = false
}
return { usages, chatId, messages, post, generateImage, isLoading }
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论