next.js 如何从服务器动作流?

hxzsmxv2  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(130)

我使用Next.js服务器操作而不是API路由向OpenAI发出请求:
lib/gpt.ts

export async function getAISuggestion(session: Session) {
  const prompt = ...

  const { stream, handlers } = LangChainStream();

  chatModel.predictMessages(prompt, {callbacks: [handlers]});

  return stream;
}

字符串
服务器操作调用它:
actions.ts

export async function getSuggestion(): Promise<
  ServerActionResponse<ReadableStream<Uint8Array>>
> {
  try {
    [...]

    const stream = await GPT.getAISuggestion(session);
    
    return { data: stream };
  } catch (error) {
    console.error(error);
    [...]
  }
}


我正在尝试从客户端组件调用此服务器操作:
ClientComponent.tsx

"use client";

[...]

function foo {
    [...]

    const { data, error } = await getSugestion();
    
    if (data) {
      const reader = data.getReader(); 
      const decoder = new TextDecoder();
      let done = false;
      let text ="";      
      while (!done) {
        const { value, done: readerDone } = await reader.read();
        console.log("reading", value);
        done = readerDone;
        text += decoder.decode(value);
        setAiSuggestionsText(text);
      }
    } else {
      setError(error);
    }
}


但显然,您不能将流从服务器操作发送到客户端组件:
警告:只能将普通对象从服务器组件传递到客户端组件。不支持ReadableStream对象。{data:ReadableStream}

ui7jx7zq

ui7jx7zq1#

不幸的是,Next.js似乎不支持从服务器操作返回HTTP响应。如果你想返回一个响应对象,你需要使用Route-handler

相关问题