使用背景:react\ts\antd pro\alibaba-chatUI\openai-api
效果图:
1.引入chatUI进行页面开发
chatUI:https://chatui.io/sdk/message
import Chat, { Bubble, useMessages } from '@chatui/core'; import '@chatui/core/dist/index.css'; import styles from './index.less'; import './chatui-theme.css'; import axios from 'axios'; import { useState } from 'react'; const initialMessages = [ { type: 'text', content: { text: '您好,我是智能助理,您的贴心小助手~' }, user: { avatar: '/logo.svg' }, }, { type: 'image', content: { picUrl: '//img.alicdn.com/tfs/TB1p_nirYr1gK0jSZR0XXbP8XXa-300-300.png', }, }, ]; // 默认快捷短语,可选 const defaultQuickReplies = [ { icon: 'message', name: '联系人工服务', isNew: true, isHighlight: true, }, // { // name: '短语1', // isNew: true, // }, // { // name: '短语2', // isHighlight: true, // }, // { // name: '短语3', // }, ]; const ChatBot = () => { // 消息列表 const { messages, appendMsg, setTyping } = useMessages(initialMessages); const [chatMessage, setChatMessage] = useState([]); // 发送回调 function handleSend(type, val) { if (type === 'text' && val.trim()) { // TODO: 发送请求 appendMsg({ type: 'text', content: { text: val }, position: 'right', }); //模拟回复 appendMsg({ type: 'text', content: { text: "你好,请问我有什么可以帮你"}, user: { avatar: '/logo.svg' }, }); // 快捷短语回调,可根据 item 数据做出不同的操作,这里以发送文本消息为例 function handleQuickReplyClick(item) { handleSend('text', item.name); } function renderMessageContent(msg) { const { type, content } = msg; // 根据消息类型来渲染 switch (type) { case 'text': return <Bubble content={content.text} />; case 'image': return ( <Bubble type="image"> <img src={content.picUrl} alt="" /> </Bubble> ); default: return null; } } return ( <div id={styles.chatBotContainer}> <Chat navbar={{ title: '小知了' }} messages={messages} renderMessageContent={renderMessageContent} quickReplies={defaultQuickReplies} onQuickReplyClick={handleQuickReplyClick} onSend={handleSend} /> </div> ); }; export default ChatBot;
复制
2.调用openAI的api
axios .post( 'https://api.openai.com/v1/chat/completions', { messages: [...chatMessage, { content: val, role: 'user' }], max_tokens: 150, n: 1, temperature: 0.5, // stop: ['\n'], model: 'gpt-3.5-turbo',//可调用不同的模型,具体见官网参数 }, { headers: { 'Content-Type': 'application/json', Authorization: 'Bearer 你的api-key', }, }, ) .then((res) => { const response = res.data.choices[0].message.content.trim(); const newMessages = [ ...chatMessage, { content: val, role: 'user' }, { content: response, role: 'system' }, ]; setChatMessage(newMessages as any); //结合chatUi做展示 appendMsg({ type: 'text', content: { text: response }, user: { avatar: '/logo.svg' }, }); }) .catch((err) => console.log(err));
复制
注意接口的messages字段我将上文也一起传过去了,为了它能回答问题的时候,回顾上下文
完整代码:
import Chat, { Bubble, useMessages } from '@chatui/core'; import '@chatui/core/dist/index.css'; import styles from './index.less'; import './chatui-theme.css'; import axios from 'axios'; import { useState } from 'react'; const initialMessages = [ { type: 'text', content: { text: '您好,我是智能助理,您的贴心小助手~' }, user: { avatar: '/logo.svg' }, }, { type: 'image', content: { picUrl: '//img.alicdn.com/tfs/TB1p_nirYr1gK0jSZR0XXbP8XXa-300-300.png', }, }, ]; // 默认快捷短语,可选 const defaultQuickReplies = [ { icon: 'message', name: '联系人工服务', isNew: true, isHighlight: true, }, // { // name: '短语1', // isNew: true, // }, // { // name: '短语2', // isHighlight: true, // }, // { // name: '短语3', // }, ]; const ChatBot = () => { // 消息列表 const { messages, appendMsg, setTyping } = useMessages(initialMessages); const [chatMessage, setChatMessage] = useState([]); // 发送回调 function handleSend(type, val) { if (type === 'text' && val.trim()) { // TODO: 发送请求 appendMsg({ type: 'text', content: { text: val }, position: 'right', }); axios .post( 'https://api.openai.com/v1/chat/completions', { messages: [...chatMessage, { content: val, role: 'user' }], max_tokens: 150, n: 1, temperature: 0.5, // stop: ['\n'], model: 'gpt-3.5-turbo', }, { headers: { 'Content-Type': 'application/json', Authorization: 'Bearer 你的api-key', }, }, ) .then((res) => { const response = res.data.choices[0].message.content.trim(); const newMessages = [ ...chatMessage, { content: val, role: 'user' }, { content: response, role: 'system' }, ]; setChatMessage(newMessages as any); appendMsg({ type: 'text', content: { text: response }, user: { avatar: '/logo.svg' }, }); }) .catch((err) => console.log(err)); setTyping(true); } } // 快捷短语回调,可根据 item 数据做出不同的操作,这里以发送文本消息为例 function handleQuickReplyClick(item) { handleSend('text', item.name); } function renderMessageContent(msg) { const { type, content } = msg; // 根据消息类型来渲染 switch (type) { case 'text': return <Bubble content={content.text} />; case 'image': return ( <Bubble type="image"> <img src={content.picUrl} alt="" /> </Bubble> ); default: return null; } } return ( <div id={styles.chatBotContainer}> <Chat navbar={{ title: '小知了' }} messages={messages} renderMessageContent={renderMessageContent} quickReplies={defaultQuickReplies} onQuickReplyClick={handleQuickReplyClick} onSend={handleSend} /> </div> ); }; export default ChatBot;
复制