(\ _ /)
( ・-・)
/っ 总而言之魔改 NextChat+WebDAV 多端同步用得好好的 懒得换,然后 改客户端太麻烦了 让 AI 简单糊个中转好了反正现在国内的还不稳定就备用。
- DeepSeek 官方 API 响应最慢但吐字最快,硅基赠金版吐字龟速。
- DeepSeek 官方 API 屏蔽了境外 IP,得国内再做一次转发,硅基不用。
- 国内其他渠道同硅基流动。
Cloudflare Worker 源码
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 处理 CORS 预检请求
if (request.method === 'OPTIONS') {
return new Response(null, {
status: 204,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': '*'
}
})
}
// 解析请求 URL 中的目标 API 地址
const url = new URL(request.url)
const targetUrl = url.searchParams.get('r')
if (!targetUrl) {
return new Response('Missing target URL', { status: 400 })
}
// 构建转发请求
const forwardRequest = new Request(targetUrl, {
method: request.method,
headers: request.headers,
body: request.body
})
try {
const response = await fetch(forwardRequest)
// 如果不是流式响应,直接返回
if (!response.headers.get('content-type')?.includes('text/event-stream')) {
return new Response(response.body, {
status: response.status,
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': response.headers.get('content-type') || 'application/json'
}
})
}
// 处理流式响应
const { readable, writable } = new TransformStream()
const writer = writable.getWriter()
const encoder = new TextEncoder()
const decoder = new TextDecoder()
let isThinking = false
let buffer = ''
response.body.pipeTo(new WritableStream({
async write(chunk) {
buffer += decoder.decode(chunk, { stream: true })
const lines = buffer.split('\n')
buffer = lines.pop() || ''
for (const line of lines) {
if (line.startsWith('data: ')) {
try {
const data = JSON.parse(line.slice(6))
const { choices } = data
if (choices && choices[0] && choices[0].delta) {
const { content, reasoning_content } = choices[0].delta
if (reasoning_content !== null && reasoning_content !== undefined) {
if (!isThinking) {
isThinking = true
data.choices[0].delta.content = `<think>\n${reasoning_content}`
} else {
data.choices[0].delta.content = reasoning_content
}
delete data.choices[0].delta.reasoning_content
} else if (content !== null && content !== undefined) {
if (isThinking) {
isThinking = false
data.choices[0].delta.content = `</think>\n\n${content}`
}
}
}
await writer.write(encoder.encode(`data: ${JSON.stringify(data)}\n\n`))
} catch (error) {
console.error('Error processing line:', error)
await writer.write(encoder.encode(line + '\n'))
}
} else {
await writer.write(encoder.encode(line + '\n'))
}
}
},
close() {
writer.close()
}
}))
return new Response(readable, {
headers: {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Access-Control-Allow-Origin': '*'
}
})
} catch (error) {
return new Response(`Error: ${error.message}`, { status: 500 })
}
}
↑ 部署和其他 Worker 完全一样,不展开说了,现在还用 NextChat 的基本都是爱折腾的佬,图省事的直接 Cherry Studio 等紧跟时事更新的客户端原生支持无需折腾。
啊把最重要的一张忘了好像
这样用,红线是你自己的域名 (境外vps 的话直接贴 worker 的域名也行国内是墙的) ,
?r=
的参数是原来的接口。