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