【寄了】接力v佬,aipro流式支持(移步reno佬的真流式 https://linux.do/t/topic/65696)

改接口 搞!

啊,刚看到,还没用上就没了吗

佬,你太高估我了,原谅我一个javaer,前端js纯菜鸟改起来费劲。ps:有哪里可以参考过cf盾的方法吗?

看这个

yep,来晚了,车都已经开停了

看这个

okok,我看看

期待ing

我去,血亏

这个接口有佬做了
https://linux.do/t/topic/65696

流式的还能用 https://linux.do/t/topic/65696

1 个赞

小白终于进阶了 :rofl:

哈哈哈,另一方面来说我们也是帮助他进步 :joy:

嗯,谢谢分享,这就去看看 尴尬,看不了

是 Reno佬的,感谢他就行

啊,那就算了吧,估计也快G了,论坛还有很多4可用的

嗯,好的,谢谢

我用不了!不知道为啥

真流式的那个用不了吗?用下面这个试试

addEventListener('fetch', event => {
  const url = new URL(event.request.url);
  if (url.pathname === '/v1/chat/completions' && (event.request.method === 'POST' || event.request.method === 'OPTIONS')) {
    event.respondWith(handleStream(event.request));
  } else {
    event.respondWith(new Response('Not found', { status: 404 }));
  }
});

async function handleStream(request) {
  if (request.method === "OPTIONS") {
    return new Response(null, {
      headers: {
        'Access-Control-Allow-Origin': '*',
        "Access-Control-Allow-Headers": '*'
      }, status: 204
    })
  }
  const authHeader = request.headers.get('Authorization');
  // Verify if the Authorization header matches "Bearer 960712phh"
  if (authHeader !== "Bearer none") {
    return new Response('Unauthorized access', { status: 401 });
  }

  const incomingData = await request.json();
  const userMessage = incomingData.messages[incomingData.messages.length - 1].content;
  const userModel = incomingData.model;

  const data = JSON.stringify({
    text: userMessage,
    endpoint: "openAI",
    model: userModel
  });

  const headers = new Headers({
    "Content-Type": "application/json",
  });

  const response = await fetch('https://chatpro.ai-pro.org/api/ask/openAI', {
    method: 'POST',
    headers: headers,
    body: data
  });

  if (response.status !== 200) {
    return response;
  }

  const { readable, writable } = new TransformStream();
  const writer = writable.getWriter();

  const currentTimestamp = Math.floor(Date.now() / 1000);

  if (incomingData.stream === false) {
    const responseData = await response.json();
    const modifiedData = {
      id: `chatcmpl-${currentTimestamp}`,
      object: "chat.completion",
      created: currentTimestamp,
      model: userModel,
      choices: [{
        index: 0,
        message: {
          role: "assistant",
          content: responseData.text || responseData.error
        },
        logprobs: null,
        finish_reason: "stop"
      }],
      usage: {
        prompt_tokens: 0,
        completion_tokens: 0,
        total_tokens: 0
      },
      system_fingerprint: null
    };
    return new Response(JSON.stringify(modifiedData), {
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': '*',
        'Content-Type': 'application/json; charset=UTF-8'
      },
      status: response.status
    });
  }

  const reader = response.body.getReader();
  let buffer = '';
  let lastLineWasEvent = false;
  let finishReason = null;
  let lastText = "";

  async function push() {
    const { done, value } = await reader.read();
    if (done) {
      await writer.close();
      return;
    }
    buffer += new TextDecoder("utf-8").decode(value);
    let position;

    while ((position = buffer.indexOf('\n')) !== -1) {
      let line = buffer.substring(0, position).trim();
      buffer = buffer.substring(position + 1);

      if (line.startsWith('event: message')) {
        lastLineWasEvent = true;
      } else if (lastLineWasEvent && line.startsWith('data: ')) {
        const dataContent = JSON.parse(line.substring(5));
        const text = dataContent.text || "";
        const textDifference = text.replace(lastText, '');
        lastText = text;
        if (textDifference === "") {
          finishReason = "stop";
        } else {
          finishReason = null;
        }
        const modifiedData = {
          id: `chatcmpl-${currentTimestamp}`,
          created: currentTimestamp,
          object: "chat.completion.chunk",
          model: userModel,
          choices: [{
            delta: { content: textDifference },
            index: 0,
            finish_reason: finishReason
          }]
        };
        const dataString = JSON.stringify(modifiedData);
        await writer.write(new TextEncoder().encode(`data: ${dataString}\n\n`));
        lastLineWasEvent = false;
      } else {
        lastLineWasEvent = false;
      }
    }
    push();
  }

  push();

  return new Response(readable, {
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Headers': '*',
      'Content-Type': 'text/event-stream; charset=UTF-8'
    },
    status: response.status
  });
}

貌似NextChat都不支持?