当前位置: 首页 > article >正文

claude-3-7-sonnet-20250219 支持深度思考,流式输出

 

node代码(美国服务器):

const chatAnthropicAiOnAzureForStream = async (req, res) => {
  let { messages, apiKey = 'sk-xxx', type = '1', thinking = false } = req.body

  res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')
  res.setHeader('Cache-Control', 'no-cache')
  res.setHeader('Connection', 'keep-alive')
  if (apiKey === apiKeyOnServer) {
    if (type === '1') {
      try {
        try {
          const stream = await anthropic.messages.stream({
            model: 'claude-3-7-sonnet-20250219',
            max_tokens: 20000,
            thinking: thinking
              ? {
                  type: 'enabled',
                  budget_tokens: 16000,
                }
              : undefined,
            messages,
          })

          for await (const event of stream) {
            if (event.type === 'content_block_start') {
              // console.log(`\n开始 ${event.content_block.type} 块...`)
              // let headerData = {
              //   type: '1',
              //   value: event.content_block.type,
              // }
              // headerData = JSON.stringify(headerData)
              // res.write(`start852${headerData}end852`)
              // res.flush()
            } else if (event.type === 'content_block_delta') {
              if (event.delta.type === 'thinking_delta') {
                // console.log(`思维: ${event.delta.thinking}`)
                let headerData = {
                  type: '2',
                  value: event.delta.thinking,
                }
                headerData = JSON.stringify(headerData)
                res.write(`start852${headerData}end852`)
                res.flush()
              } else if (event.delta.type === 'text_delta') {
                // console.log(`响应: ${event.delta.text}`)
                let headerData = {
                  type: '3',
                  value: event.delta.text,
                }
                headerData = JSON.stringify(headerData)
                res.write(`start852${headerData}end852`)
                res.flush()
              }
            } else if (event.type === 'content_block_stop') {
              // console.log('\n块完成。')
              // let headerData = {
              //   type: '4',
              //   value: '完成',
              // }
              // headerData = JSON.stringify(headerData)
              // res.write(`start852${headerData}end852`)
              // res.flush()
            }
          }
          res.end()
        } catch (error) {
          let headerData = {
            type: '-1',
            msg: error,
          }
          headerData = JSON.stringify(headerData)
          res.write(`start852${headerData}end852`)
          res.end()
          customSendEmail({
            subject: 'claude3.7.0流式接口报错,on azure',
            html: `error:${error},messages:${JSON.stringify(messages)}`,
          })
        }
      } catch (error) {
        let headerData = {
          type: '-1',
          msg: error,
        }
        headerData = JSON.stringify(headerData)
        res.write(`start852${headerData}end852`)
        res.end()
      }
    } else {
      let headerData = {
        type: '-1',
        msg: '失败:参数type',
      }
      headerData = JSON.stringify(headerData)
      res.write(`start852${headerData}end852`)
      res.end()
    }
  } else {
    let headerData = {
      type: '-1',
      msg: '失败:参数apiKey',
    }
    headerData = JSON.stringify(headerData)
    res.write(`start852${headerData}end852`)
    res.end()
  }
}

node代码(阿里云国内服务器):

if (platform === 'anthropicAi') {
        if (params.stream === true) {
          res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')
          res.setHeader('Cache-Control', 'no-cache')
          res.setHeader('Connection', 'keep-alive')
          const uidForRobot = uuidv4()
          const uidForFuntionCalling = uuidv4()
          let robotMessage = ''
          let robotMessageForThinking = ''
          let functionContent = ''
          let imgList = []
          let imgListOriginalData = []
          let dallE3Params = {}
          // eslint-disable-next-line
          if (global.isLocal && false) {
            let headerData = {
              robotMessage: '',
              chatGPTVersion,
              uidForPeopleMesssage: uid,
              uidForRobotMessage: uidForRobot,
              value: '',
              type: '1',
            }
            headerData = JSON.stringify(headerData)
            res.write(`start852${headerData}end852`)
            res.flush()
            await sleep(100)

            headerData = {
              robotMessage: '',
              chatGPTVersion,
              uidForPeopleMesssage: uid,
              uidForRobotMessage: uidForRobot,
              value: '【模式数据】【流式】思考',
              type: '2',
            }
            headerData = JSON.stringify(headerData)
            res.write(`start852${headerData}end852`)
            res.flush()
            robotMessageForThinking = '【模式数据】【流式】思考'
            await sleep(100)

            headerData = {
              robotMessage: '',
              chatGPTVersion,
              uidForPeopleMesssage: uid,
              uidForRobotMessage: uidForRobot,
              value: '【模式数据】【流式】你好',
              type: '3',
            }
            headerData = JSON.stringify(headerData)
            res.write(`start852${headerData}end852`)
            res.flush()
            robotMessage = '【模式数据】【流式】你好'
            await sleep(100)

            headerData = {
              robotMessage: '',
              chatGPTVersion,
              uidForPeopleMesssage: uid,
              uidForRobotMessage: uidForRobot,
              value: '完成',
              type: '2',
            }
            headerData = JSON.stringify(headerData)
            res.write(`start852${headerData}end852`)
            res.flush()
            await sleep(100)

            res.end()
          } else {
            if (isNeedHeaderData) {
              let headerData = {
                robotMessage: '',
                chatGPTVersion,
                uidForPeopleMesssage: uid,
                uidForRobotMessage: uidForRobot,
                type: '1', //消息id等有用信息
              }
              headerData = JSON.stringify(headerData)
              res.write(`start852${headerData}end852`)
              res.flush()
            }

            let messagesValue = messages.map((item) => {
              let role
              if (item.role === 'user' || item.role === 'system') {
                role = 'user'
              } else if (item.role === 'assistant') {
                role = 'assistant'
              }
              return {
                role,
                content: item.content,
              }
            })

            let result = await axios({
              url: `${baseURL}/api/light/chat/anthropicAiOnAzureForStream`,
              data: {
                model,
                messages: messagesValue,
                apiKey: apiKeyOnServer,
                params,
                thinking: isThinking,
              },
              method: 'post',
              responseType: 'stream',
              headers: {
                'Content-Type': 'application/json',
                Accept: 'text/event-stream',
              },
            })

            const completion = result.data

            for await (const chunk of completion) {
              let text = chunk.toString()
              res.write(text)
              res.flush()

              //#region 解析流式返回的数据用于存入数据库
              let start852Index = text.indexOf('start852')
              let end852Index = text.indexOf('end852')
              let end852start852 = text.indexOf('end852start852')

              if (
                start852Index >= 0 &&
                end852Index >= 0 &&
                end852start852 < 0
              ) {
                let headerData = text.slice(start852Index + 8, end852Index)
                try {
                  let headerDataObj = JSON.parse(headerData)
                    ? JSON.parse(headerData)
                    : {}

                  if (headerDataObj.type === '1') {
                  } else if (headerDataObj.type === '2') {
                    robotMessageForThinking += headerDataObj.value
                  } else if (headerDataObj.type === '3') {
                    robotMessage += headerDataObj.value
                  } else if (headerDataObj.type === '4') {
                  }
                } catch (error) {
                  console.log(error)
                }
              } else if (
                start852Index >= 0 &&
                end852Index >= 0 &&
                end852start852 > 0
              ) {
                let textArr = text.split('end852start852')
                textArr.forEach((item) => {
                  let headerData = item
                    .replace('start852', '')
                    .replace('end852', '')
                  try {
                    let headerDataObj = JSON.parse(headerData)
                      ? JSON.parse(headerData)
                      : {}

                    if (headerDataObj.type === '1') {
                    } else if (headerDataObj.type === '2') {
                      robotMessageForThinking += headerDataObj.value
                    } else if (headerDataObj.type === '3') {
                      robotMessage += headerDataObj.value
                    } else if (headerDataObj.type === '4') {
                    }
                  } catch (error) {
                    console.log(error)
                  }
                })
              }
              //#endregion
            }
            res.flush()
            res.end()
          }
          if (robotMessage) {
            await addMessageToDb({
              robotMessage,
              robotMessageForThinking,
              imgList,
              imgListOriginalData,
              dallE3Params,
              uidForRobot,
              uidForFuntionCalling,
              functionContent,
            })
          } else {
            customSendEmail({
              subject: 'stream模式,机器人回答的内容为空',
              html: `${JSON.stringify(messages)}, user:${JSON.stringify(user)}`,
            })
          }
        } else {
          let imgList = []
          let imgListOriginalData = []
          let dallE3Params = {}
          let functionContent = ''
          let result = {}
          // eslint-disable-next-line
          if (global.isLocal && false) {
            result = {
              data: {
                code: 200,
                data: {
                  response: {
                    id: 'msg_016To9e6pECv9M9NhDLWW9vM',
                    type: 'message',
                    role: 'assistant',
                    content: [
                      {
                        type: 'text',
                        text: '【模拟数据】你好!很高兴见到你。我是一个人工智能助手,我的名字叫Claude。请问有什么我可以帮助你的吗?无论是日常生活中的问题,还是专业领域的疑问,我都非常乐意尽我所能为你解答。让我们开始愉快的交流吧!',
                      },
                    ],
                    model: 'claude-3-opus-20240229',
                    stop_reason: 'end_turn',
                    stop_sequence: null,
                    usage: {
                      input_tokens: 10,
                      output_tokens: 104,
                    },
                  },
                },
              },
            }
          } else {
            let messagesValue = messages.map((item) => {
              let role
              if (item.role === 'user' || item.role === 'system') {
                role = 'user'
              } else if (item.role === 'assistant') {
                role = 'assistant'
              }
              return {
                role,
                content: item.content,
              }
            })

            result = await axios.post(
              `${baseURL}/api/light/chat/anthropicAiOnAzure`,
              {
                type: '1',
                apiKey: apiKeyOnServer,
                messages: messagesValue,
                thinking: isThinking,
              }
            )
          }
          if (result.data.code === 200) {
            let responseContent = result.data.data.response.content
            if (Array.isArray(responseContent) && responseContent.length > 0) {
              let resultIndex = responseContent.findIndex(
                (item) => item.type === 'text'
              )
              let resultThinkingIndex = responseContent.findIndex(
                (item) => item.type === 'thinking'
              )
              if (resultIndex >= 0) {
                let robotMessage = responseContent[resultIndex].text
                robotMessage = robotMessage
                  .replace(/^\n/, '')
                  .replace(/^\n/, '')
                let robotMessageForThinking
                if (resultThinkingIndex >= 0) {
                  robotMessageForThinking =
                    responseContent[resultThinkingIndex].thinking
                  robotMessageForThinking = robotMessageForThinking
                    .replace(/^\n/, '')
                    .replace(/^\n/, '')
                }

                const uidForRobot = uuidv4()
                const uidForFuntionCalling = uuidv4()
                res.send({
                  code: 200,
                  data: {
                    robotMessage,
                    robotMessageForThinking,
                    imgList,
                    imgListOriginalData,
                    model: 'claude3', //claude-3-opus-20240229
                    chatGPTVersion,
                    uidForPeopleMesssage: uid,
                    uidForRobotMessage: uidForRobot,
                    isBindWX,
                  },
                  message: '添加成功',
                })

                await addMessageToDb({
                  robotMessage,
                  robotMessageForThinking,
                  imgList,
                  imgListOriginalData,
                  dallE3Params,
                  uidForRobot,
                  uidForFuntionCalling,
                  functionContent,
                })
              } else {
                res.send({
                  code: 400,
                  data: {
                    error: result.data.data.error,
                  },
                  message: '失败,anthropicAi,没有回复type=text的内容 ',
                })
              }
            } else {
              res.send({
                code: 400,
                data: {
                  error: result.data.data.error,
                },
                message: '失败,anthropicAi,responseContent不是数组 ',
              })
            }
          } else {
            res.send({
              code: 400,
              data: {
                error: result.data.data.error,
              },
              message: `失败,Anthropic Ai,错误信息:\n${result.data.message}`,
            })
            if (contextChatList.length > 0) {
              let result = await axios.post(
                `http://${global.host}:${global.port}/api/light/chat/editForNewTalk`,
                {
                  uid: contextChatList[contextChatList.length - 1].uid,
                }
              )
              console.log(result.data)
            }
          }
        }
      }

人工智能学习网站

https://chat.xutongbao.top


http://www.kler.cn/a/599910.html

相关文章:

  • docker重装环境失败,可能是缓存问题
  • 【赵渝强老师】达梦数据库的物理存储结构
  • React组件复用
  • PTA 1097-矩阵行平移
  • 『 C++ 』原生字符串:让字符串处理更轻松
  • LabVIEW液压振动锤控制系统
  • Pytest的参数化测试
  • 23 种设计模式中的模板模式
  • 穿越之程序员周树人的狂人日记Part3__人机共生纪元
  • 淘宝API关键词接口详解(实战案例)
  • Android 13组合键截屏功能的彻底移除实战
  • IDI_APPLICATION 与 IDC_ARROW资源存放在工程的哪个路径?
  • 基于简单神经网络的线性回归
  • F#语言的游戏优化
  • Stable Diffusion教程:图生图_stable diffusion 图生图
  • vue 事件修饰符
  • 【cuda学习日记】8.2 GPU加速库 --cuBLAS
  • 初始OpenCV
  • C#中值类型与引用类型是直观使用示例
  • 使用腾讯云大模型知识引擎×DeepSeek打造自己的私人家教