首页 前端知识 前端react如何引入chatgpt实现智能客服

前端react如何引入chatgpt实现智能客服

2024-04-20 17:04:00 前端知识 前端哥 153 188 我要收藏

 

使用背景: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;

转载请注明出处或者链接地址:https://www.qianduange.cn//article/5477.html
评论
发布的文章

JQuery中的load()、$

2024-05-10 08:05:15

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!