🛠️ DeepSeek R1 将 reasoning_content 转回 <think>\n 的 Worker。。

(\ _ /)
( ・-・)
/っ :coffee: 总而言之魔改 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 等紧跟时事更新的客户端原生支持无需折腾。


啊把最重要的一张忘了好像 :down_left_arrow:

:up_right_arrow: 这样用,红线是你自己的域名 (境外vps 的话直接贴 worker 的域名也行国内是墙的)?r= 的参数是原来的接口。

17 个赞

cloudflare 有超时时间,就爱折腾 nextchat :laughing:

5 个赞

用 markdown 语法给它折起来

2 个赞

能是能,但是为了和其他 Azure、Together 那些不经过中转的外观一致就用原始的样式,然后我觉得 R1 的思考过程和最终答案一样重要。

1 个赞

没有吧,我还能请求啊

1 个赞

_(:з」∠)_ 我的洛杉鸡瓦工请求 403,用国内阿里鸡又转了一遍才正常。

搞不好是asn或者ip段被ban,我这个是美国Virginia的ip

不清楚,可能是 GFW 拉的清单,我这瓦工被 Ban 过几次又解封了后来全程套 CF 才没再被 Ban。

太强了,大佬

1 个赞

嘿嘿,前几天才看到一个

https://linux.do/t/topic/418374?u=openai

我是日本的机器,没有屏蔽境外IP…这是为啥,用的官方API直连

:tieba_087: 那就是我的鸡被屏蔽了。

1 个赞

:tieba_087: 我也收藏了这个贴,但我不知道 Cloudflare Functions 是啥,Worker 一直用着就写个 Worker 的了。

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。