Skip to content
文章摘要

前端接入科大讯飞星火认知大模型API

讯飞星火认知大模型,拥有跨领域的知识和语言理解能力,完成问答对话和文学创作等任务。持续从海量文本数据和大规模语法知识中学习进化,实现从提出问题、规划问题到解决问题的全流程闭环。

先看效果

接入流程

  • 注册账号

讯飞开放平台官网:https://www.xfyun.cn/,具体怎么注册不赘述了,手机号邮箱绑定一下就完了。

  • 获取APPID和API_KEY

进入控制台去创建一个应用

点进去查看我能接入的哪些应用,然后点击星火认知大模型下面的星火大模型1.0/2.0/3.0,然后点击应用详情,就能看到APPID和API_KEY了。

  • 接入SDK

我当时接的时候才更新到2.0,所以就直接用2.0的SDK了,现在已经更新到3.0了,可以直接选择3.0的套餐免费包个人认证版进行购买,有200万的免费tokens一年使用期,相当于是给你免费用一年的意思了,这里我们直接接入web API即可:

js
ws(s)://spark-api.xf-yun.com/v2.1/chat
ws(s)://spark-api.xf-yun.com/v3.1/chat

3.1和2.1版本接入方式一致,看个人选择,推荐接最新的版本,功能肯定更强大,也修复了很多原有的bug。

  • vue3接入示例

安装crypto-js,用来加密生成最终请求的鉴权url

bash
npm install crypto-js --save
cnpm install crypto-js --save
yarn add crypto-js

鉴权url生成示例

js
const requestObj = {
  APPID: '你的appid',
  APISecret: '你的apisecret',
  APIKey: '你的apikey',
  Uid: 'xzm', // 说明下uid自己定,唯一就行
  sparkResult: '', // 这里放你获取到的结果
}

// 鉴权url地址
const getWebsocketUrl = () => {
  return new Promise((resovle, reject) => {
    // let url = "wss://spark-api.xf-yun.com/v1.1/chat";
    let url = 'wss://spark-api.xf-yun.com/v2.1/chat' // 可以改成2.1的接口
    let host = 'spark-api.xf-yun.com' // 主机地址
    let apiKeyName = 'api_key' // API密钥的参数名
    let date = new Date().toGMTString() // 当前时间的GMT字符串表示
    let algorithm = 'hmac-sha256'// 使用的哈希算法
    let headers = 'host date request-line' // 鉴权所需的头部信息
    // let signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v1.1/chat HTTP/1.1`;
    let signatureOrigin = `host: ${host}\ndate: ${date}\nGET /v2.1/chat HTTP/1.1` // 构建用于生成签名的原始字符串
    // 加密方法
    let signatureSha = CryptoJs.HmacSHA256(
      signatureOrigin,
      requestObj.APISecret
    )
    // 生成的加密签名
    let signature = CryptoJs.enc.Base64.stringify(signatureSha)
    // 构建鉴权头部信息
    let authorizationOrigin = `${apiKeyName}="${requestObj.APIKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`
    let authorization = base64.encode(authorizationOrigin)
    // 构建最终的 WebSocket URL
    url = `${url}?authorization=${authorization}&date=${encodeURI(
      date
    )}&host=${host}`
    resovle(url)
  })
}

最关键的鉴权信息完成,接下来的就是利用websocket向api发送请求就可以了

js
// 发送消息
const sendMsg = async () => {
  // 获取请求地址
  const myUrl = await getWebsocketUrl()
  // 获取输入框中的内容
  // 每次发送问题 都是一个新的websocket请求
  let socket = new WebSocket(myUrl)
  // 监听websocket的各阶段事件 并做相应处理
  socket.addEventListener('open', (event) => {
    console.log('开启连接!!', event)
    // 发送消息
    let params = {
      header: {
        app_id: requestObj.APPID,
        uid: requestObj.Uid,
      },
      parameter: {
        chat: {
          // "domain": "general",
          domain: 'generalv2',
          temperature: 0.5,
          max_tokens: 1024,
        },
      },
      payload: {
        message: {
          // 如果想获取结合上下文的回答,需要开发者每次将历史问答信息一起传给服务端,如下示例
          // 注意:text里面的所有content内容加一起的tokens需要控制在8192以内,开发者如有较长对话需求,需要适当裁剪历史信息
          text: [
            { role: 'user', content: inputVal.value }, //# 最新的一条问题,如无需上下文,可只传最新一条问题
          ],
        },
      },
    }
    socket.send(JSON.stringify(params))
  })
  socket.addEventListener('message', (event) => {
    let data = JSON.parse(event.data)
    console.log('收到消息!!', data)
    requestObj.sparkResult += data.payload.choices.text[0].content
    if (data.header.code !== 0) {
      console.log('出错了', data.header.code, ':', data.header.message)
      // 出错了"手动关闭连接"
      socket.close()
    }
    if (data.header.code === 0) {
      // 对话已经完成
      if (data.payload.choices.text && data.header.status === 2) {
        requestObj.sparkResult += data.payload.choices.text[0].content
        setTimeout(() => {
          // "对话完成,手动关闭连接"
          socket.close()
        }, 3000)
      }
    }
    addMsgToTextarea(requestObj.sparkResult)
  })
  socket.addEventListener('close', (event) => {
    inputVal.value = ''
    console.log('连接关闭!!', event)
    // 对话完成后socket会关闭,将聊天记录换行处理
    requestObj.sparkResult = requestObj.sparkResult + '\n\n'
    addMsgToTextarea(requestObj.sparkResult)
    btnDisable.value = false
    // 清空输入框
  })
  socket.addEventListener('error', (event) => {})
}

// 这就是我们最终获取到的结果,输出在我们的页面上即可
const addMsgToTextarea = (text) => {
  sparkResult.value = text
}

总结

这样我们就接入了星火大模型,实现了对话功能,easy,快点击右下角机器人按钮去使用吧!↬

评论
-