diff --git a/app/(main)/chats/[id]/chat-box.tsx b/app/(main)/chats/[id]/chat-box.tsx index bbd73ba1c..1c56a725e 100644 --- a/app/(main)/chats/[id]/chat-box.tsx +++ b/app/(main)/chats/[id]/chat-box.tsx @@ -2,7 +2,6 @@ import ArrowRightIcon from "@/components/icons/arrow-right"; import Spinner from "@/components/spinner"; -import assert from "assert"; import { useRouter } from "next/navigation"; import { useEffect, useRef, useState, useTransition } from "react"; import { createMessage } from "../../actions"; diff --git a/app/(main)/chats/[id]/page.client.tsx b/app/(main)/chats/[id]/page.client.tsx index 5464b1ca9..67df119a2 100644 --- a/app/(main)/chats/[id]/page.client.tsx +++ b/app/(main)/chats/[id]/page.client.tsx @@ -67,6 +67,9 @@ export default function PageClient({ chat }: { chat: Chat }) { setActiveTab("preview"); } }) + .on("error", (error) => { + console.error("Stream error:", error); + }) .on("finalContent", async (finalText) => { startTransition(async () => { const message = await createMessage( diff --git a/app/api/get-next-completion-stream-promise/route.ts b/app/api/get-next-completion-stream-promise/route.ts index 4d897d9a1..5f9346f5c 100644 --- a/app/api/get-next-completion-stream-promise/route.ts +++ b/app/api/get-next-completion-stream-promise/route.ts @@ -3,6 +3,8 @@ import { PrismaNeon } from "@prisma/adapter-neon"; import { Pool } from "@neondatabase/serverless"; import { z } from "zod"; import Together from "together-ai"; +import { ChatCompletionStream } from "together-ai/lib/ChatCompletionStream.mjs"; +import { after } from "next/server"; export async function POST(req: Request) { const neon = new Pool({ connectionString: process.env.DATABASE_URL }); @@ -57,8 +59,44 @@ export async function POST(req: Request) { max_tokens: 9000, }); - return new Response(res.toReadableStream()); + const stream = res.toReadableStream(); + + const [s1, s2] = stream.tee(); + + let unlock: () => void; + const promise = new Promise((resolve) => { + unlock = () => { + resolve(); + }; + }); + + console.log("last message:", messages.at(-1)); + + ChatCompletionStream.fromReadableStream(s1) + .on("content", (delta) => { + // console.log("Stream content:", delta); + }) + .on("error", (error) => { + console.error("Stream error:", error); + unlock(); + }) + .on("finalChatCompletion", (finalChunk) => { + console.log("Final Chat Completion:", finalChunk); + }) + .on("finalContent", (finalText) => { + console.log("Final content hook called"); + }) + .on("end", () => { + console.log("Stream ended"); + unlock(); + }); + + after(async () => { + await promise; + console.log("exiting after hook"); + }); + + return new Response(s2); } -export const runtime = "edge"; -export const maxDuration = 45; +export const maxDuration = 240; diff --git a/package-lock.json b/package-lock.json index fa16af236..930bf74da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,7 @@ "sonner": "^1.7.2", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", - "together-ai": "^0.11.1", + "together-ai": "^0.20.0", "use-stick-to-bottom": "^1.0.43", "vaul": "^1.1.2", "zod": "^3.24.1" @@ -10566,9 +10566,10 @@ } }, "node_modules/together-ai": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/together-ai/-/together-ai-0.11.1.tgz", - "integrity": "sha512-SK+sOT1qPnaNxWFUGy2CHD588ALSmPKd4RgNSD2FXIVAy69R/JrgISV/gj+1LqBnuBDCSBIQMxX2j20bJSs/UQ==", + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/together-ai/-/together-ai-0.20.0.tgz", + "integrity": "sha512-TPijoMHi/OY+IcNtzTlrkte0hT/OHnSaQCeCVTgn8LyQ9T7Y4rnl39h91w/x9WbZHirDK1gmYaFjvoAan3a+3g==", + "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", diff --git a/package.json b/package.json index 52d72f498..e296c75ac 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "sonner": "^1.7.2", "tailwind-merge": "^2.6.0", "tailwindcss-animate": "^1.0.7", - "together-ai": "^0.11.1", + "together-ai": "^0.20.0", "use-stick-to-bottom": "^1.0.43", "vaul": "^1.1.2", "zod": "^3.24.1"