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

chore: update

上级 e5337a88
VITE_API_URL_WORD = https://zijingebook.ezijing.com/api
# VITE_API_URL_WORD = https://zijingebook.ezijing.com/api
VITE_API_URL_WORD = https://book-admin-web.ezijing.com/api
# VITE_API_URL_WORD = http://ebook-pc.ezijing.com:7419
VITE_API_BASE_API_PREFFIX = /api
......
import axios from '@/utils/axios';
import fetchEventSource from '@/utils/fetchEventSource';
import axios from '@/utils/axios'
import fetchEventSource from '@/utils/fetchEventSource'
// 流式编辑接口
export function aiEdit(options) {
return fetchEventSource('/api/ai/sky3/edit', options);
return fetchEventSource('/api/ai/sky3/edit', options)
}
// 流式对话接口
export function aiChat(data) {
return axios.post('/api/ai/sky3/chat', data);
return axios.post('/api/ai/sky3/chat', data)
}
// 文本生成图片接口
export function aiGenerateImage(data) {
return axios.post('/api/ai/sky3/generateImage', data);
return axios.post('/api/ai/sky3/generateImage', data)
}
// 百度聊天接口
export function baiduAIChat(data) {
return axios.post('/api/ai/baidubce/chat', data)
}
import { useEffect, useState } from 'react';
import { Modal, Input, Button, Flex, Spin } from 'antd';
import { useAIEdit } from '@/hooks/useAI';
const { TextArea } = Input;
import { useEffect, useState } from 'react'
import { Modal, Input, Button, Flex, Spin } from 'antd'
import { useAIEdit } from '@/hooks/useBaiduAI'
const { TextArea } = Input
const actionMap = {
rewrite: '改写',
expand: '扩写',
abbreviate: '缩写',
summary: '总结',
};
rewrite: { name: '改写', prompt: '帮我改写以下文字内容:' },
expand: { name: '扩写', prompt: '帮我在以下文字内容基础上进行扩写:' },
abbreviate: { name: '缩写', prompt: '帮我缩写以下文字内容:' },
summary: { name: '缩写', prompt: '帮我总结以下文字内容:' }
}
export default function AIWrite({ editor, docAction, ...rest }) {
const [content, setContent] = useState('');
const { text, fetch, isLoading } = useAIEdit();
const actionText = actionMap[docAction];
const [selectionText, setSelectionText] = useState('');
const [content, setContent] = useState('')
const { text, fetch, isLoading } = useAIEdit()
const actionText = actionMap[docAction]?.name
const [selectionText, setSelectionText] = useState('')
useEffect(() => {
if (rest.open) {
const selection = editor.getSelectionText();
const selection = editor.getSelectionText()
if (selection) {
setSelectionText(selection);
setContent(selection);
fetch({ content: selection, doc_action: docAction, full_text: false });
setSelectionText(selection)
setContent(selection)
fetch({ messages: [{ role: 'user', content: actionMap[docAction].prompt + selection }] })
}
}
}, [rest.open]);
}, [rest.open])
useEffect(() => {
setContent(text);
}, [text]);
setContent(text)
}, [text])
const handleFetch = () => {
fetch({ content: selectionText, doc_action: docAction, full_text: false });
};
fetch({ messages: [{ role: 'user', content: actionMap[docAction].prompt + selectionText }] })
}
const handlePrimary = () => {
editor.restoreSelection();
editor.insertText(text);
rest.onCancel();
};
editor.restoreSelection()
editor.insertText(text)
rest.onCancel()
}
return (
<Modal
......@@ -48,28 +48,23 @@ export default function AIWrite({ editor, docAction, ...rest }) {
classNames={{
header: 'editor-header-customer',
body: 'editor-body-customer',
wrapper: 'editor-wrapper-customer',
}}
>
wrapper: 'editor-wrapper-customer'
}}>
<Spin spinning={isLoading}>
<TextArea
autoSize={{ minRows: 4 }}
value={content}
onChange={(e) => setContent(e.target.value)}
/>
<TextArea autoSize={{ minRows: 4 }} value={content} onChange={e => setContent(e.target.value)} />
</Spin>
<br />
<Flex gap='small' justify='center'>
<Button type='primary' onClick={handlePrimary}>
<Flex gap="small" justify="center">
<Button type="primary" onClick={handlePrimary}>
替换内容
</Button>
<Button type='primary' onClick={handleFetch}>
<Button type="primary" onClick={handleFetch}>
重新{actionText}
</Button>
<Button type='primary' onClick={rest.onCancel}>
<Button type="primary" onClick={rest.onCancel}>
取消
</Button>
</Flex>
</Modal>
);
)
}
import { useState } from 'react';
import { aiEdit, aiChat, aiGenerateImage } from '@/api/ai';
import { useState } from 'react'
import { aiEdit, aiChat, aiGenerateImage } from '@/api/ai'
export function useAIEdit() {
const [messages, setMessages] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const latestMessage = messages[messages.length - 1] || {};
const { text = '' } = latestMessage;
const [messages, setMessages] = useState([])
const [isLoading, setIsLoading] = useState(false)
const latestMessage = messages[messages.length - 1] || {}
const { text = '' } = latestMessage
const fetch = async (params) => {
setIsLoading(true);
const fetch = async params => {
setIsLoading(true)
try {
const res = await aiEdit({
body: JSON.stringify({ params }),
onmessage: (res) => {
let message = JSON.parse(res.data);
message = { ...message.data, request_id: message.request_id };
setMessages((prevMessages) => {
const messageIndex = prevMessages.findIndex((m) => m.request_id === message.request_id);
onmessage: res => {
let message = JSON.parse(res.data)
message = { ...message.data, request_id: message.request_id }
setMessages(prevMessages => {
const messageIndex = prevMessages.findIndex(m => m.request_id === message.request_id)
if (messageIndex === -1) {
return [...prevMessages, message];
return [...prevMessages, message]
} else {
return prevMessages.map((m) => (m.request_id === message.request_id ? message : m));
return prevMessages.map(m => (m.request_id === message.request_id ? message : m))
}
});
},
});
})
}
})
} catch (error) {
console.error('Error fetching AI edit:', error);
console.error('Error fetching AI edit:', error)
} finally {
setIsLoading(false);
setIsLoading(false)
}
};
}
return { messages, text, setMessages, fetch, isLoading };
return { messages, text, setMessages, fetch, isLoading }
}
export function useAIChat() {
const [messages, setMessages] = useState([]);
const fetch = async (params) => {
const [messages, setMessages] = useState([])
const fetch = async params => {
const res = await aiChat({
body: JSON.stringify({ params }),
onmessage: (res) => {
const message = JSON.parse(res.data);
console.log(message);
setMessages((messages) => [...messages, message]);
},
});
};
onmessage: res => {
const message = JSON.parse(res.data)
console.log(message)
setMessages(messages => [...messages, message])
}
})
}
}
export function useAIGenerateImage() {
const [messages, setMessages] = useState([]);
const fetch = async (params) => {
const res = await aiGenerateImage(params);
setMessages(res);
};
const [messages, setMessages] = useState([])
const fetch = async params => {
const res = await aiGenerateImage(params)
setMessages(res)
}
}
import { useState, useCallback } from 'react'
import { baiduAIChat } from '@/api/ai'
export function useAIEdit() {
const [messages, setMessages] = useState([])
const [isLoading, setIsLoading] = useState(false)
const latestMessage = messages[messages.length - 1] || {}
const text = latestMessage?.content || ''
const fetch = useCallback(async params => {
setIsLoading(true)
try {
const defaultParams = { ernie_name: 'ERNIE-4.0-8K', stream: false }
const res = await baiduAIChat({ ...defaultParams, params })
const message = { role: 'assistant', content: res.data.result }
setMessages(prevMessages => [...prevMessages, message])
} catch (error) {
console.error('Error fetching data:', error)
} finally {
setIsLoading(false)
}
}, [])
return { text, messages, isLoading, fetch }
}
import { useEffect, useState } from 'react';
import { fetchEventSource } from '@fortaine/fetch-event-source';
import { useEffect, useState, useCallback } from 'react'
import { fetchEventSource } from '@fortaine/fetch-event-source'
// 获取本地存储中的令牌
function getToken() {
return window.localStorage.getItem('kiwi.token') || '';
return window.localStorage.getItem('kiwi.token') || ''
}
// 生成请求头部信息
const getHeaders = () => {
const token = getToken();
const appId = 'TzEU5jPk2tu80266';
const appSecret = '0a006048a4480481b18fef1405120b83';
const timestamp = Math.floor(Date.now() / 1000);
const token = getToken()
const appId = 'TzEU5jPk2tu80266'
const appSecret = '0a006048a4480481b18fef1405120b83'
const timestamp = Math.floor(Date.now() / 1000)
return {
Authorization: token,
AppId: appId,
AppSecret: appSecret,
Timestamp: timestamp,
'Content-Type': 'application/json',
};
};
'Content-Type': 'application/json'
}
}
const defaultOnOpen = async (response) => {
// 默认的响应打开处理函数
const defaultOnOpen = async response => {
if (!response.ok) {
throw response;
throw response
}
return response;
};
return response
}
const defaultOnMessage = (setMessages) => (res) => {
const message = JSON.parse(res.data);
setMessages((prevMessages) => [...prevMessages, message]);
};
// 默认的消息处理函数
const defaultOnMessage = setMessages => res => {
const message = JSON.parse(res.data)
setMessages(prevMessages => [...prevMessages, message])
}
// 自定义 Hook,用于使用 Fetch 事件源
export function useFetchEventSource(url, options = {}) {
const [isLoading, setLoading] = useState(false);
const [messages, setMessages] = useState([]);
const [error, setError] = useState(null);
const [isLoading, setLoading] = useState(false)
const [messages, setMessages] = useState([])
const [error, setError] = useState(null)
const fetch = () => {
setLoading(true);
const headers = getHeaders();
// 定义 fetch 函数
const fetch = useCallback(() => {
setLoading(true)
const headers = getHeaders()
const defaultOptions = {
method: 'POST',
headers,
onopen: defaultOnOpen,
onmessage: defaultOnMessage(setMessages),
onerror: (err) => setError(err),
};
onerror: err => setError(err)
}
fetchEventSource(url, { ...defaultOptions, ...options }).finally(() => setLoading(false));
};
fetchEventSource(url, { ...defaultOptions, ...options })
.catch(err => setError(err))
.finally(() => setLoading(false))
}, [url, options])
// 在组件挂载时执行 fetch 函数
useEffect(() => {
fetch();
}, [url, options]);
fetch()
}, [fetch])
return { isLoading, error, messages };
return { isLoading, error, messages, fetch }
}
......@@ -18,22 +18,15 @@ export default async function fetchEventSourceFn(url, options) {
Timestamp: timestamp,
'Content-Type': 'application/json'
}
const messages = []
const defaultOptions = {
method: 'POST',
headers: { ...defaultHeaders },
async onopen(response) {
if (response.ok) {
return response
} else {
throw response
}
},
onmessage(res) {
const message = JSON.parse(res.data)
console.log(res.data)
messages.push(message)
}
}
await fetchEventSource(url, { ...defaultOptions, ...options })
return await fetchEventSource(url, { ...defaultOptions, ...options }).then(() => messages)
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论