我正在使用OpenAI API来创建一个使用react typescript和next.js的聊天机器人。我试图在UI中与聊天机器人交互,但每当我单击send(按钮)时,什么都没有发生。我尝试添加console.logs,但即使是这些也没有显示在控制台中。关于导致这一情况的原因,有什么建议吗?
下面是我的src/app/API/route.ts中的代码:
import { NextResponse } from "next/server";
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
export async function POST(req: Request, res: NextResponse) {
const body = await req.json();
const completion = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [{ role: "user", content: body.messages }],
});
console.log(completion.choices[0].message);
const theResponse = completion.choices[0].message;
return NextResponse.json({ output: theResponse }, { status: 200 });
}
字符串
这是我的src/app/page.tsx:
"use client";
import { useState } from "react";
export default function Home() {
const [theInput, setTheInput] = useState("");
const [isLoading, setIsLoading] = useState(false);
const [messages, setMessages] = useState([
{
role: "assistant",
content: "Yo, this is ChatterBot! How can I help you today?",
},
]);
// below this
const callGetResponse = async () => {
setIsLoading(true);
let temp = messages;
temp.push({ role: "user", content: theInput });
setMessages(temp);
setTheInput("");
console.log("Calling OpenAI...");
const response = await fetch("/api", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ messages }),
});
const data = await response.json();
const { output } = data;
console.log("OpenAI replied...", output.content);
setMessages((prevMessages) => [...prevMessages, output]);
setIsLoading(false);
};
const Submit = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (event.key === "Enter") {
event.preventDefault();
callGetResponse();
}
};
return (
<main className="flex min-h-screen flex-col items-center justify-between px-24 py-5">
<h1 className="text-5xl font-sans">ChatterBot</h1>
<div className="flex h-[35rem] w-[40rem] flex-col items-center bg-gray-600 rounded-xl">
<div className=" h-full flex flex-col gap-2 overflow-y-auto py-8 px-3 w-full">
{messages.map((e) => {
return (
<div
key={e.content}
className={`w-max max-w-[18rem] rounded-md px-4 py-3 h-min ${
e.role === "assistant"
? "self-start bg-gray-200 text-gray-800"
: "self-end bg-gray-800 text-gray-50"
} `}
>
{e.content}
</div>
);
})}
{isLoading ? (
<div className="self-start bg-gray-200 text-gray-800 w-max max-w-[18rem] rounded-md px-4 py-3 h-min">
*thinking*
</div>
) : (
""
)}
</div>
<div className="relative w-[80%] bottom-4 flex justify-center">
<textarea
value={theInput}
onChange={(event) => setTheInput(event.target.value)}
className="w-[85%] h-10 px-3 py-2
resize-none overflow-y-auto text-black bg-gray-300 rounded-l outline-none"
onKeyDown={Submit}
/>
<button
onClick={callGetResponse}
className="w-[15%] bg-blue-500 px-4 py-2 rounded-r"
>
send
</button>
</div>
</div>
<div></div>
</main>
);
}
型
1条答案
按热度按时间yshpjwxd1#
在API路由中,您在传递提示消息时出错,由于请求体中有助理和用户消息,您应该直接将请求消息传递给聊天完成创建API。
这是工作版本。
字符串
更新API路由后,代码工作正常。