Zhangchun5558 发表于 2023-6-26 10:07:05

OpenAI官方发布ChatGPT API接口gpt-3.5-turbo

​免费chatGPT体验入口:
http://chat.xutongbao.top/
目录

一、介绍
二、官方使用案例
三、我写的案例(撑持上下文)
<hr/>
一、介绍

https://platform.openai.com/docs/models/overview

http://pic4.zhimg.com/v2-d337b3969265626db43eeb8b7b4feb2b_r.jpg


二、官方使用案例



http://pic4.zhimg.com/v2-308892ae37e8fae128ff8d19f51872b7_r.jpg

const { Configuration, OpenAIApi } = require(”openai”);

const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

const completion = await openai.createChatCompletion({
model: ”gpt-3.5-turbo”,
messages: [{role: ”user”, content: ”Hello world”}],
});
console.log(completion.data.choices.message);


三、我写的案例(撑持上下文)

let openAiType = 2 //1达芬奇 2turbo

const chatAdd = async (req, res) => {
const {
    talkId = &#39;&#39;,
    name = &#39;&#39;,
    messageType = &#39;1&#39;,
    message = &#39;&#39;,
    modelType = &#39;1&#39;,
    promptType = &#39;1&#39;,
    isNeedContext = true,
} = req.body

    let prompt = &#39;&#39;
      let messages = []
      if (openAiType === 1) {
      if (promptType === &#39;1&#39;) {
          if (currentChatList.length > 0 && isNeedContext === true) {
            let shotChatList = currentChatList
            if (currentChatList.length > 6) {
            shotChatList = currentChatList.slice(currentChatList.length - 6)
            }
            shotChatList.forEach((item) => {
            let { messageType, message } = item
            if (messageType === &#39;1&#39;) {
                prompt += `YOU:${message}\n`
            } else if (messageType === &#39;2&#39;) {
                //message = encodeURIComponent(message)
                prompt += `AI:${message}\n`
            }
            })
          }
          prompt += `YOU:${message}\nAI:`
      } else if (promptType === &#39;2&#39;) {
          if (currentChatList.length > 0 && isNeedContext === true) {
            let shotChatList = currentChatList
            if (currentChatList.length > 6) {
            shotChatList = currentChatList.slice(currentChatList.length - 6)
            }
            shotChatList.forEach((item) => {
            const { messageType, message } = item
            if (messageType === &#39;1&#39;) {
                prompt += `\n/* Command: ${message} */\n`
            } else if (messageType === &#39;2&#39;) {
                //message = encodeURIComponent(message)
                prompt += `${message}\n`
            }
            })
          }
          prompt += `<|endoftext|>/* I start with a blank HTML page, and incrementally modif it via <script> injection. Written for Chrome. */\n/* Command: Add ”Hello World”, by adding an HTML DOM node */\nvar helloWorld = document.createElement(&#39;div&#39;);\nhelloWorld.innerHTML = &#39;Hello World&#39;;\ndocument.body.appendChild(helloWorld);\n/* Command: Clear the page. */\nwhile (document.body.firstChild) {\ndocument.body.removeChild(document.body.firstChild);\n}\n\n/* Command: ${message} */\n`
      }
      } else if (openAiType === 2) {
      if (currentChatList.length > 0 && isNeedContext === true) {
          let shotChatList = currentChatList
          if (currentChatList.length > 6) {
            shotChatList = currentChatList.slice(currentChatList.length - 6)
          }
          shotChatList.forEach((item) => {
            let { messageType, message } = item
            if (messageType === &#39;1&#39;) {
            messages = [...messages, { role: &#39;user&#39;, content: message }]
            } else if (messageType === &#39;2&#39;) {
            messages = [...messages, { role: &#39;assistant&#39;, content: message }]
            }
          })
      }
      messages = [...messages, { role: &#39;user&#39;, content: message }]
      }

      let completion
      let historyAccountIndex = currentAccountIndex
      let errorData = &#39;&#39;
      try {
      if (openAiType === 1) {
          let hooks = [
            {
            value: &#39;1&#39;,
            lable: &#39;text-davinci-003&#39;,
            },
            {
            value: &#39;2&#39;,
            lable: &#39;code-davinci-002&#39;,
            },
          ]
          let resultIndex = hooks.findIndex((item) => item.value === modelType)
          let model = &#39;text-davinci-003&#39;
          if (resultIndex >= 0) {
            model = hooks.lable
          }
          const completionRes = await openai
            .createCompletion({
            model,
            // prompt:
            //   &#39;YOU:你好\n你好。很高兴见到你。\nYOU:你叫什么名字\n我叫小爱。很高兴见到你!\nYOU:介绍一下元宵节\n&#39;,
            prompt,
            max_tokens: 2048,
            })
            .catch((err) => {
            errorData = err
            if (err?.response?.data?.error?.type === &#39;insufficient_quota&#39;) {
                console.log(&#39;配额不足,已经自动更新账号&#39;)
                const hostname = os.hostname()
                if (hostname !== &#39;LAPTOP-4KDIA4A3&#39;) {
                  customSendEmail({
                  subject: &#39;配额不足,已经自动更新账号&#39;,
                  html: `historyAccountIndex:${historyAccountIndex},currentAccountIndex: ${currentAccountIndex}`,
                  })
                }
                changeOpenAI()
            }
            })
          completion = completionRes.data
      } else if (openAiType === 2) {
          const completionRes = await openai
            .createChatCompletion({
            model: &#39;gpt-3.5-turbo&#39;,
            messages,
            })
            .catch((err) => {
            errorData = err
            if (err?.response?.data?.error?.type === &#39;insufficient_quota&#39;) {
                console.log(&#39;配额不足,已经自动更新账号&#39;)
                const hostname = os.hostname()
                if (hostname !== &#39;LAPTOP-4KDIA4A3&#39;) {
                  customSendEmail({
                  subject: &#39;配额不足,已经自动更新账号&#39;,
                  html: `historyAccountIndex:${historyAccountIndex},currentAccountIndex: ${currentAccountIndex}`,
                  })
                }
                changeOpenAI()
            }
            })
          completion = completionRes.data
      }
      } catch (error) {
      res.send({
          code: 200,
          data: {
            historyAccountIndex,
            currentAccountIndex,
            isRobotBusy: true,
            errorData,
          },
          message: &#39;掉败-机器人无应答【1】&#39;,
      })
      return
      }

      if (
      Array.isArray(completion.choices) &&
      completion.choices.length > 0 &&
      (completion.choices.text ||
          (completion.choices.message &&
            completion.choices.message.content))
      ) {
      const values = []
      let robotMessage
      if (openAiType === 1) {
          robotMessage = completion.choices.text
          robotMessage = robotMessage.replace(/\n/, &#39;&#39;)
      } else if (openAiType === 2) {
          robotMessage = completion.choices.message.content
          robotMessage = robotMessage.replace(/\n/, &#39;&#39;).replace(/\n/, &#39;&#39;)
      }

      //robotMessage = decodeURIComponent(robotMessage)
      values.push(`(
          &#39;${uid}&#39;,
          &#39;${talkId}&#39;,
          &#39;${name}&#39;,
          &#39;${messageType}&#39;,
          &#39;${message}&#39;,
          &#39;${now}&#39;,
          &#39;${now}&#39;,
          &#39;新增&#39;
      )`)
      const uidForRobot = uuidv4()
      values.push(`(
          &#39;${uidForRobot}&#39;,
          &#39;${talkId}&#39;,
          &#39;robot&#39;,
          &#39;2&#39;,
          &#39;${robotMessage}&#39;,
          &#39;${now + 1000}&#39;,
          &#39;${now + 1000}&#39;,
          &#39;新增&#39;
      )`)
      const valuesStr = values.join(&#39;,&#39;)

      let err = await runSql(
          `INSERT INTO chat (
            uid,
            talkId,
            name,
            messageType,
            message,
            createTime,
            updateTime,
            remarks
      )
      VALUES ${valuesStr}`
      )
      if (err) {
          res.send({
            code: 400,
            data: {
            err: err.stack,
            },
            message: &#39;添加掉败&#39;,
          })
      } else {
          await refreshRedis({ tableName: &#39;chat&#39; })
          res.send({
            code: 200,
            data: {
            robotMessage,
            },
            message: &#39;添加成功&#39;,
          })
      }
      } else {
      res.send({
          code: 400,
          data: {
            currentAccountIndex,
            completion,
          },
          message: &#39;掉败-机器人无应答【2】&#39;,
      })
      }
}

参考链接:
ChatGPT学习心得一(使用node+react做了一个案例)_徐同保的博客-CSDN博客
页: [1]
查看完整版本: OpenAI官方发布ChatGPT API接口gpt-3.5-turbo