diff --git a/README.md b/README.md
index 4df063825a..13060cebe8 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,14 @@
-
- Chat SDK
+
+ OpenChat
- Chat SDK is a free, open-source template built with Next.js and the AI SDK that helps you quickly build powerful chatbot applications. + OpenChat (formerly AI Chatbot) is a free, open-source template built with Next.js and the AI SDK that helps you quickly build powerful chatbot applications.
- Read Docs · + Read Docs · Features · Model Providers · Deploy Your Own · @@ -48,13 +48,13 @@ With the [AI SDK](https://ai-sdk.dev/docs/introduction), you can also switch to ## Deploy Your Own -You can deploy your own version of the Next.js AI Chatbot to Vercel with one click: +You can deploy your own version of OpenChat to Vercel with one click: -[](https://vercel.com/templates/next.js/nextjs-ai-chatbot) +[](https://vercel.com/templates/next.js/openchat) ## Running locally -You will need to use the environment variables [defined in `.env.example`](.env.example) to run Next.js AI Chatbot. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/projects/environment-variables) for this, but a `.env` file is all that is necessary. +You will need to use the environment variables [defined in `.env.example`](.env.example) to run OpenChat. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/projects/environment-variables) for this, but a `.env` file is all that is necessary. > Note: You should not commit your `.env` file or it will expose secrets that will allow others to control access to your various AI and authentication provider accounts. diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 36458196dc..a659bdf3fd 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -30,7 +30,7 @@ import { updateMessage, } from "@/lib/db/queries"; import type { DBMessage } from "@/lib/db/schema"; -import { ChatSDKError } from "@/lib/errors"; +import { OpenChatError } from "@/lib/errors"; import type { ChatMessage } from "@/lib/types"; import { convertToUIMessages, generateUUID } from "@/lib/utils"; import { generateTitleFromUserMessage } from "../../actions"; @@ -55,7 +55,7 @@ export async function POST(request: Request) { const json = await request.json(); requestBody = postRequestBodySchema.parse(json); } catch (_) { - return new ChatSDKError("bad_request:api").toResponse(); + return new OpenChatError("bad_request:api").toResponse(); } try { @@ -65,7 +65,7 @@ export async function POST(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:chat").toResponse(); + return new OpenChatError("unauthorized:chat").toResponse(); } const userType: UserType = session.user.type; @@ -76,7 +76,7 @@ export async function POST(request: Request) { }); if (messageCount > entitlementsByUserType[userType].maxMessagesPerDay) { - return new ChatSDKError("rate_limit:chat").toResponse(); + return new OpenChatError("rate_limit:chat").toResponse(); } const isToolApprovalFlow = Boolean(messages); @@ -87,7 +87,7 @@ export async function POST(request: Request) { if (chat) { if (chat.userId !== session.user.id) { - return new ChatSDKError("forbidden:chat").toResponse(); + return new OpenChatError("forbidden:chat").toResponse(); } if (!isToolApprovalFlow) { messagesFromDb = await getMessagesByChatId({ id }); @@ -244,7 +244,7 @@ export async function POST(request: Request) { } catch (error) { const vercelId = request.headers.get("x-vercel-id"); - if (error instanceof ChatSDKError) { + if (error instanceof OpenChatError) { return error.toResponse(); } @@ -254,11 +254,11 @@ export async function POST(request: Request) { "AI Gateway requires a valid credit card on file to service requests" ) ) { - return new ChatSDKError("bad_request:activate_gateway").toResponse(); + return new OpenChatError("bad_request:activate_gateway").toResponse(); } console.error("Unhandled error in chat API:", error, { vercelId }); - return new ChatSDKError("offline:chat").toResponse(); + return new OpenChatError("offline:chat").toResponse(); } } @@ -267,19 +267,19 @@ export async function DELETE(request: Request) { const id = searchParams.get("id"); if (!id) { - return new ChatSDKError("bad_request:api").toResponse(); + return new OpenChatError("bad_request:api").toResponse(); } const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:chat").toResponse(); + return new OpenChatError("unauthorized:chat").toResponse(); } const chat = await getChatById({ id }); if (chat?.userId !== session.user.id) { - return new ChatSDKError("forbidden:chat").toResponse(); + return new OpenChatError("forbidden:chat").toResponse(); } const deletedChat = await deleteChatById({ id }); diff --git a/app/(chat)/api/document/route.ts b/app/(chat)/api/document/route.ts index 0ea78ff553..2caa241f6e 100644 --- a/app/(chat)/api/document/route.ts +++ b/app/(chat)/api/document/route.ts @@ -5,14 +5,14 @@ import { getDocumentsById, saveDocument, } from "@/lib/db/queries"; -import { ChatSDKError } from "@/lib/errors"; +import { OpenChatError } from "@/lib/errors"; export async function GET(request: Request) { const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (!id) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter id is missing" ).toResponse(); @@ -21,7 +21,7 @@ export async function GET(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:document").toResponse(); + return new OpenChatError("unauthorized:document").toResponse(); } const documents = await getDocumentsById({ id }); @@ -29,11 +29,11 @@ export async function GET(request: Request) { const [document] = documents; if (!document) { - return new ChatSDKError("not_found:document").toResponse(); + return new OpenChatError("not_found:document").toResponse(); } if (document.userId !== session.user.id) { - return new ChatSDKError("forbidden:document").toResponse(); + return new OpenChatError("forbidden:document").toResponse(); } return Response.json(documents, { status: 200 }); @@ -44,7 +44,7 @@ export async function POST(request: Request) { const id = searchParams.get("id"); if (!id) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter id is required." ).toResponse(); @@ -53,7 +53,7 @@ export async function POST(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("not_found:document").toResponse(); + return new OpenChatError("not_found:document").toResponse(); } const { @@ -69,7 +69,7 @@ export async function POST(request: Request) { const [doc] = documents; if (doc.userId !== session.user.id) { - return new ChatSDKError("forbidden:document").toResponse(); + return new OpenChatError("forbidden:document").toResponse(); } } @@ -90,14 +90,14 @@ export async function DELETE(request: Request) { const timestamp = searchParams.get("timestamp"); if (!id) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter id is required." ).toResponse(); } if (!timestamp) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter timestamp is required." ).toResponse(); @@ -106,7 +106,7 @@ export async function DELETE(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:document").toResponse(); + return new OpenChatError("unauthorized:document").toResponse(); } const documents = await getDocumentsById({ id }); @@ -114,7 +114,7 @@ export async function DELETE(request: Request) { const [document] = documents; if (document.userId !== session.user.id) { - return new ChatSDKError("forbidden:document").toResponse(); + return new OpenChatError("forbidden:document").toResponse(); } const documentsDeleted = await deleteDocumentsByIdAfterTimestamp({ diff --git a/app/(chat)/api/history/route.ts b/app/(chat)/api/history/route.ts index 23615e305a..c7223ec260 100644 --- a/app/(chat)/api/history/route.ts +++ b/app/(chat)/api/history/route.ts @@ -1,7 +1,7 @@ import type { NextRequest } from "next/server"; import { auth } from "@/app/(auth)/auth"; import { deleteAllChatsByUserId, getChatsByUserId } from "@/lib/db/queries"; -import { ChatSDKError } from "@/lib/errors"; +import { OpenChatError } from "@/lib/errors"; export async function GET(request: NextRequest) { const { searchParams } = request.nextUrl; @@ -11,7 +11,7 @@ export async function GET(request: NextRequest) { const endingBefore = searchParams.get("ending_before"); if (startingAfter && endingBefore) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Only one of starting_after or ending_before can be provided." ).toResponse(); @@ -20,7 +20,7 @@ export async function GET(request: NextRequest) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:chat").toResponse(); + return new OpenChatError("unauthorized:chat").toResponse(); } const chats = await getChatsByUserId({ @@ -37,7 +37,7 @@ export async function DELETE() { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:chat").toResponse(); + return new OpenChatError("unauthorized:chat").toResponse(); } const result = await deleteAllChatsByUserId({ userId: session.user.id }); diff --git a/app/(chat)/api/suggestions/route.ts b/app/(chat)/api/suggestions/route.ts index 8801004eff..054994b09b 100644 --- a/app/(chat)/api/suggestions/route.ts +++ b/app/(chat)/api/suggestions/route.ts @@ -1,13 +1,13 @@ import { auth } from "@/app/(auth)/auth"; import { getSuggestionsByDocumentId } from "@/lib/db/queries"; -import { ChatSDKError } from "@/lib/errors"; +import { OpenChatError } from "@/lib/errors"; export async function GET(request: Request) { const { searchParams } = new URL(request.url); const documentId = searchParams.get("documentId"); if (!documentId) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter documentId is required." ).toResponse(); @@ -16,7 +16,7 @@ export async function GET(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:suggestions").toResponse(); + return new OpenChatError("unauthorized:suggestions").toResponse(); } const suggestions = await getSuggestionsByDocumentId({ @@ -30,7 +30,7 @@ export async function GET(request: Request) { } if (suggestion.userId !== session.user.id) { - return new ChatSDKError("forbidden:api").toResponse(); + return new OpenChatError("forbidden:api").toResponse(); } return Response.json(suggestions, { status: 200 }); diff --git a/app/(chat)/api/vote/route.ts b/app/(chat)/api/vote/route.ts index 2c0ce3f788..d2c8ce170a 100644 --- a/app/(chat)/api/vote/route.ts +++ b/app/(chat)/api/vote/route.ts @@ -1,13 +1,13 @@ import { auth } from "@/app/(auth)/auth"; import { getChatById, getVotesByChatId, voteMessage } from "@/lib/db/queries"; -import { ChatSDKError } from "@/lib/errors"; +import { OpenChatError } from "@/lib/errors"; export async function GET(request: Request) { const { searchParams } = new URL(request.url); const chatId = searchParams.get("chatId"); if (!chatId) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameter chatId is required." ).toResponse(); @@ -16,17 +16,17 @@ export async function GET(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:vote").toResponse(); + return new OpenChatError("unauthorized:vote").toResponse(); } const chat = await getChatById({ id: chatId }); if (!chat) { - return new ChatSDKError("not_found:chat").toResponse(); + return new OpenChatError("not_found:chat").toResponse(); } if (chat.userId !== session.user.id) { - return new ChatSDKError("forbidden:vote").toResponse(); + return new OpenChatError("forbidden:vote").toResponse(); } const votes = await getVotesByChatId({ id: chatId }); @@ -43,7 +43,7 @@ export async function PATCH(request: Request) { await request.json(); if (!chatId || !messageId || !type) { - return new ChatSDKError( + return new OpenChatError( "bad_request:api", "Parameters chatId, messageId, and type are required." ).toResponse(); @@ -52,17 +52,17 @@ export async function PATCH(request: Request) { const session = await auth(); if (!session?.user) { - return new ChatSDKError("unauthorized:vote").toResponse(); + return new OpenChatError("unauthorized:vote").toResponse(); } const chat = await getChatById({ id: chatId }); if (!chat) { - return new ChatSDKError("not_found:vote").toResponse(); + return new OpenChatError("not_found:vote").toResponse(); } if (chat.userId !== session.user.id) { - return new ChatSDKError("forbidden:vote").toResponse(); + return new OpenChatError("forbidden:vote").toResponse(); } await voteMessage({ diff --git a/app/(chat)/opengraph-image.png b/app/(chat)/opengraph-image.png index e367f341a0..73bc344d60 100644 Binary files a/app/(chat)/opengraph-image.png and b/app/(chat)/opengraph-image.png differ diff --git a/components/app-sidebar.tsx b/components/app-sidebar.tsx index ec3f27356a..ff9c2f0105 100644 --- a/components/app-sidebar.tsx +++ b/components/app-sidebar.tsx @@ -72,7 +72,7 @@ export function AppSidebar({ user }: { user: User | undefined }) { }} > - Chatbot + OpenChat