Revert "Upgrade linter and formatter to Ultracite" (#1226)
This commit is contained in:
parent
0e320b391d
commit
1aff7d9868
177 changed files with 8334 additions and 6943 deletions
|
|
@ -1,19 +1,19 @@
|
|||
import { createUIMessageStream, JsonToSseTransformStream } from "ai";
|
||||
import { differenceInSeconds } from "date-fns";
|
||||
import { auth } from "@/app/(auth)/auth";
|
||||
import { auth } from '@/app/(auth)/auth';
|
||||
import {
|
||||
getChatById,
|
||||
getMessagesByChatId,
|
||||
getStreamIdsByChatId,
|
||||
} from "@/lib/db/queries";
|
||||
import type { Chat } from "@/lib/db/schema";
|
||||
import { ChatSDKError } from "@/lib/errors";
|
||||
import type { ChatMessage } from "@/lib/types";
|
||||
import { getStreamContext } from "../../route";
|
||||
} from '@/lib/db/queries';
|
||||
import type { Chat } from '@/lib/db/schema';
|
||||
import { ChatSDKError } from '@/lib/errors';
|
||||
import type { ChatMessage } from '@/lib/types';
|
||||
import { createUIMessageStream, JsonToSseTransformStream } from 'ai';
|
||||
import { getStreamContext } from '../../route';
|
||||
import { differenceInSeconds } from 'date-fns';
|
||||
|
||||
export async function GET(
|
||||
_: Request,
|
||||
{ params }: { params: Promise<{ id: string }> }
|
||||
{ params }: { params: Promise<{ id: string }> },
|
||||
) {
|
||||
const { id: chatId } = await params;
|
||||
|
||||
|
|
@ -25,13 +25,13 @@ export async function GET(
|
|||
}
|
||||
|
||||
if (!chatId) {
|
||||
return new ChatSDKError("bad_request:api").toResponse();
|
||||
return new ChatSDKError('bad_request:api').toResponse();
|
||||
}
|
||||
|
||||
const session = await auth();
|
||||
|
||||
if (!session?.user) {
|
||||
return new ChatSDKError("unauthorized:chat").toResponse();
|
||||
return new ChatSDKError('unauthorized:chat').toResponse();
|
||||
}
|
||||
|
||||
let chat: Chat | null;
|
||||
|
|
@ -39,36 +39,35 @@ export async function GET(
|
|||
try {
|
||||
chat = await getChatById({ id: chatId });
|
||||
} catch {
|
||||
return new ChatSDKError("not_found:chat").toResponse();
|
||||
return new ChatSDKError('not_found:chat').toResponse();
|
||||
}
|
||||
|
||||
if (!chat) {
|
||||
return new ChatSDKError("not_found:chat").toResponse();
|
||||
return new ChatSDKError('not_found:chat').toResponse();
|
||||
}
|
||||
|
||||
if (chat.visibility === "private" && chat.userId !== session.user.id) {
|
||||
return new ChatSDKError("forbidden:chat").toResponse();
|
||||
if (chat.visibility === 'private' && chat.userId !== session.user.id) {
|
||||
return new ChatSDKError('forbidden:chat').toResponse();
|
||||
}
|
||||
|
||||
const streamIds = await getStreamIdsByChatId({ chatId });
|
||||
|
||||
if (!streamIds.length) {
|
||||
return new ChatSDKError("not_found:stream").toResponse();
|
||||
return new ChatSDKError('not_found:stream').toResponse();
|
||||
}
|
||||
|
||||
const recentStreamId = streamIds.at(-1);
|
||||
|
||||
if (!recentStreamId) {
|
||||
return new ChatSDKError("not_found:stream").toResponse();
|
||||
return new ChatSDKError('not_found:stream').toResponse();
|
||||
}
|
||||
|
||||
const emptyDataStream = createUIMessageStream<ChatMessage>({
|
||||
// biome-ignore lint/suspicious/noEmptyBlockStatements: "Needs to exist"
|
||||
execute: () => {},
|
||||
});
|
||||
|
||||
const stream = await streamContext.resumableStream(recentStreamId, () =>
|
||||
emptyDataStream.pipeThrough(new JsonToSseTransformStream())
|
||||
emptyDataStream.pipeThrough(new JsonToSseTransformStream()),
|
||||
);
|
||||
|
||||
/*
|
||||
|
|
@ -83,7 +82,7 @@ export async function GET(
|
|||
return new Response(emptyDataStream, { status: 200 });
|
||||
}
|
||||
|
||||
if (mostRecentMessage.role !== "assistant") {
|
||||
if (mostRecentMessage.role !== 'assistant') {
|
||||
return new Response(emptyDataStream, { status: 200 });
|
||||
}
|
||||
|
||||
|
|
@ -96,7 +95,7 @@ export async function GET(
|
|||
const restoredStream = createUIMessageStream<ChatMessage>({
|
||||
execute: ({ writer }) => {
|
||||
writer.write({
|
||||
type: "data-appendMessage",
|
||||
type: 'data-appendMessage',
|
||||
data: JSON.stringify(mostRecentMessage),
|
||||
transient: true,
|
||||
});
|
||||
|
|
@ -105,7 +104,7 @@ export async function GET(
|
|||
|
||||
return new Response(
|
||||
restoredStream.pipeThrough(new JsonToSseTransformStream()),
|
||||
{ status: 200 }
|
||||
{ status: 200 },
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import { geolocation } from "@vercel/functions";
|
||||
import {
|
||||
convertToModelMessages,
|
||||
createUIMessageStream,
|
||||
|
|
@ -6,27 +5,9 @@ import {
|
|||
smoothStream,
|
||||
stepCountIs,
|
||||
streamText,
|
||||
} from "ai";
|
||||
import { unstable_cache as cache } from "next/cache";
|
||||
import { after } from "next/server";
|
||||
import {
|
||||
createResumableStreamContext,
|
||||
type ResumableStreamContext,
|
||||
} from "resumable-stream";
|
||||
import type { ModelCatalog } from "tokenlens/core";
|
||||
import { fetchModels } from "tokenlens/fetch";
|
||||
import { getUsage } from "tokenlens/helpers";
|
||||
import { auth, type UserType } from "@/app/(auth)/auth";
|
||||
import type { VisibilityType } from "@/components/visibility-selector";
|
||||
import { entitlementsByUserType } from "@/lib/ai/entitlements";
|
||||
import type { ChatModel } from "@/lib/ai/models";
|
||||
import { type RequestHints, systemPrompt } from "@/lib/ai/prompts";
|
||||
import { myProvider } from "@/lib/ai/providers";
|
||||
import { createDocument } from "@/lib/ai/tools/create-document";
|
||||
import { getWeather } from "@/lib/ai/tools/get-weather";
|
||||
import { requestSuggestions } from "@/lib/ai/tools/request-suggestions";
|
||||
import { updateDocument } from "@/lib/ai/tools/update-document";
|
||||
import { isProductionEnvironment } from "@/lib/constants";
|
||||
} from 'ai';
|
||||
import { auth, type UserType } from '@/app/(auth)/auth';
|
||||
import { type RequestHints, systemPrompt } from '@/lib/ai/prompts';
|
||||
import {
|
||||
createStreamId,
|
||||
deleteChatById,
|
||||
|
|
@ -35,14 +16,33 @@ import {
|
|||
getMessagesByChatId,
|
||||
saveChat,
|
||||
saveMessages,
|
||||
updateChatLastContextById,
|
||||
} from "@/lib/db/queries";
|
||||
import { ChatSDKError } from "@/lib/errors";
|
||||
import type { ChatMessage } from "@/lib/types";
|
||||
import type { AppUsage } from "@/lib/usage";
|
||||
import { convertToUIMessages, generateUUID } from "@/lib/utils";
|
||||
import { generateTitleFromUserMessage } from "../../actions";
|
||||
import { type PostRequestBody, postRequestBodySchema } from "./schema";
|
||||
} from '@/lib/db/queries';
|
||||
import { updateChatLastContextById } from '@/lib/db/queries';
|
||||
import { convertToUIMessages, generateUUID } from '@/lib/utils';
|
||||
import { generateTitleFromUserMessage } from '../../actions';
|
||||
import { createDocument } from '@/lib/ai/tools/create-document';
|
||||
import { updateDocument } from '@/lib/ai/tools/update-document';
|
||||
import { requestSuggestions } from '@/lib/ai/tools/request-suggestions';
|
||||
import { getWeather } from '@/lib/ai/tools/get-weather';
|
||||
import { isProductionEnvironment } from '@/lib/constants';
|
||||
import { myProvider } from '@/lib/ai/providers';
|
||||
import { entitlementsByUserType } from '@/lib/ai/entitlements';
|
||||
import { postRequestBodySchema, type PostRequestBody } from './schema';
|
||||
import { geolocation } from '@vercel/functions';
|
||||
import {
|
||||
createResumableStreamContext,
|
||||
type ResumableStreamContext,
|
||||
} from 'resumable-stream';
|
||||
import { after } from 'next/server';
|
||||
import { ChatSDKError } from '@/lib/errors';
|
||||
import type { ChatMessage } from '@/lib/types';
|
||||
import type { ChatModel } from '@/lib/ai/models';
|
||||
import type { VisibilityType } from '@/components/visibility-selector';
|
||||
import { unstable_cache as cache } from 'next/cache';
|
||||
import { fetchModels } from 'tokenlens/fetch';
|
||||
import { getUsage } from 'tokenlens/helpers';
|
||||
import type { ModelCatalog } from 'tokenlens/core';
|
||||
import type { AppUsage } from '@/lib/usage';
|
||||
|
||||
export const maxDuration = 60;
|
||||
|
||||
|
|
@ -54,14 +54,14 @@ const getTokenlensCatalog = cache(
|
|||
return await fetchModels();
|
||||
} catch (err) {
|
||||
console.warn(
|
||||
"TokenLens: catalog fetch failed, using default catalog",
|
||||
err
|
||||
'TokenLens: catalog fetch failed, using default catalog',
|
||||
err,
|
||||
);
|
||||
return; // tokenlens helpers will fall back to defaultCatalog
|
||||
return undefined; // tokenlens helpers will fall back to defaultCatalog
|
||||
}
|
||||
},
|
||||
["tokenlens-catalog"],
|
||||
{ revalidate: 24 * 60 * 60 } // 24 hours
|
||||
['tokenlens-catalog'],
|
||||
{ revalidate: 24 * 60 * 60 }, // 24 hours
|
||||
);
|
||||
|
||||
export function getStreamContext() {
|
||||
|
|
@ -71,9 +71,9 @@ export function getStreamContext() {
|
|||
waitUntil: after,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.message.includes("REDIS_URL")) {
|
||||
if (error.message.includes('REDIS_URL')) {
|
||||
console.log(
|
||||
" > Resumable streams are disabled due to missing REDIS_URL"
|
||||
' > Resumable streams are disabled due to missing REDIS_URL',
|
||||
);
|
||||
} else {
|
||||
console.error(error);
|
||||
|
|
@ -91,7 +91,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 ChatSDKError('bad_request:api').toResponse();
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
@ -103,14 +103,14 @@ export async function POST(request: Request) {
|
|||
}: {
|
||||
id: string;
|
||||
message: ChatMessage;
|
||||
selectedChatModel: ChatModel["id"];
|
||||
selectedChatModel: ChatModel['id'];
|
||||
selectedVisibilityType: VisibilityType;
|
||||
} = requestBody;
|
||||
|
||||
const session = await auth();
|
||||
|
||||
if (!session?.user) {
|
||||
return new ChatSDKError("unauthorized:chat").toResponse();
|
||||
return new ChatSDKError('unauthorized:chat').toResponse();
|
||||
}
|
||||
|
||||
const userType: UserType = session.user.type;
|
||||
|
|
@ -121,16 +121,12 @@ export async function POST(request: Request) {
|
|||
});
|
||||
|
||||
if (messageCount > entitlementsByUserType[userType].maxMessagesPerDay) {
|
||||
return new ChatSDKError("rate_limit:chat").toResponse();
|
||||
return new ChatSDKError('rate_limit:chat').toResponse();
|
||||
}
|
||||
|
||||
const chat = await getChatById({ id });
|
||||
|
||||
if (chat) {
|
||||
if (chat.userId !== session.user.id) {
|
||||
return new ChatSDKError("forbidden:chat").toResponse();
|
||||
}
|
||||
} else {
|
||||
if (!chat) {
|
||||
const title = await generateTitleFromUserMessage({
|
||||
message,
|
||||
});
|
||||
|
|
@ -141,6 +137,10 @@ export async function POST(request: Request) {
|
|||
title,
|
||||
visibility: selectedVisibilityType,
|
||||
});
|
||||
} else {
|
||||
if (chat.userId !== session.user.id) {
|
||||
return new ChatSDKError('forbidden:chat').toResponse();
|
||||
}
|
||||
}
|
||||
|
||||
const messagesFromDb = await getMessagesByChatId({ id });
|
||||
|
|
@ -160,7 +160,7 @@ export async function POST(request: Request) {
|
|||
{
|
||||
chatId: id,
|
||||
id: message.id,
|
||||
role: "user",
|
||||
role: 'user',
|
||||
parts: message.parts,
|
||||
attachments: [],
|
||||
createdAt: new Date(),
|
||||
|
|
@ -181,15 +181,15 @@ export async function POST(request: Request) {
|
|||
messages: convertToModelMessages(uiMessages),
|
||||
stopWhen: stepCountIs(5),
|
||||
experimental_activeTools:
|
||||
selectedChatModel === "chat-model-reasoning"
|
||||
selectedChatModel === 'chat-model-reasoning'
|
||||
? []
|
||||
: [
|
||||
"getWeather",
|
||||
"createDocument",
|
||||
"updateDocument",
|
||||
"requestSuggestions",
|
||||
'getWeather',
|
||||
'createDocument',
|
||||
'updateDocument',
|
||||
'requestSuggestions',
|
||||
],
|
||||
experimental_transform: smoothStream({ chunking: "word" }),
|
||||
experimental_transform: smoothStream({ chunking: 'word' }),
|
||||
tools: {
|
||||
getWeather,
|
||||
createDocument: createDocument({ session, dataStream }),
|
||||
|
|
@ -201,7 +201,7 @@ export async function POST(request: Request) {
|
|||
},
|
||||
experimental_telemetry: {
|
||||
isEnabled: isProductionEnvironment,
|
||||
functionId: "stream-text",
|
||||
functionId: 'stream-text',
|
||||
},
|
||||
onFinish: async ({ usage }) => {
|
||||
try {
|
||||
|
|
@ -210,29 +210,23 @@ export async function POST(request: Request) {
|
|||
myProvider.languageModel(selectedChatModel).modelId;
|
||||
if (!modelId) {
|
||||
finalMergedUsage = usage;
|
||||
dataStream.write({
|
||||
type: "data-usage",
|
||||
data: finalMergedUsage,
|
||||
});
|
||||
dataStream.write({ type: 'data-usage', data: finalMergedUsage });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!providers) {
|
||||
finalMergedUsage = usage;
|
||||
dataStream.write({
|
||||
type: "data-usage",
|
||||
data: finalMergedUsage,
|
||||
});
|
||||
dataStream.write({ type: 'data-usage', data: finalMergedUsage });
|
||||
return;
|
||||
}
|
||||
|
||||
const summary = getUsage({ modelId, usage, providers });
|
||||
finalMergedUsage = { ...usage, ...summary, modelId } as AppUsage;
|
||||
dataStream.write({ type: "data-usage", data: finalMergedUsage });
|
||||
dataStream.write({ type: 'data-usage', data: finalMergedUsage });
|
||||
} catch (err) {
|
||||
console.warn("TokenLens enrichment failed", err);
|
||||
console.warn('TokenLens enrichment failed', err);
|
||||
finalMergedUsage = usage;
|
||||
dataStream.write({ type: "data-usage", data: finalMergedUsage });
|
||||
dataStream.write({ type: 'data-usage', data: finalMergedUsage });
|
||||
}
|
||||
},
|
||||
});
|
||||
|
|
@ -242,16 +236,16 @@ export async function POST(request: Request) {
|
|||
dataStream.merge(
|
||||
result.toUIMessageStream({
|
||||
sendReasoning: true,
|
||||
})
|
||||
}),
|
||||
);
|
||||
},
|
||||
generateId: generateUUID,
|
||||
onFinish: async ({ messages }) => {
|
||||
await saveMessages({
|
||||
messages: messages.map((currentMessage) => ({
|
||||
id: currentMessage.id,
|
||||
role: currentMessage.role,
|
||||
parts: currentMessage.parts,
|
||||
messages: messages.map((message) => ({
|
||||
id: message.id,
|
||||
role: message.role,
|
||||
parts: message.parts,
|
||||
createdAt: new Date(),
|
||||
attachments: [],
|
||||
chatId: id,
|
||||
|
|
@ -265,12 +259,12 @@ export async function POST(request: Request) {
|
|||
context: finalMergedUsage,
|
||||
});
|
||||
} catch (err) {
|
||||
console.warn("Unable to persist last usage for chat", id, err);
|
||||
console.warn('Unable to persist last usage for chat', id, err);
|
||||
}
|
||||
}
|
||||
},
|
||||
onError: () => {
|
||||
return "Oops, an error occurred!";
|
||||
return 'Oops, an error occurred!';
|
||||
},
|
||||
});
|
||||
|
||||
|
|
@ -279,12 +273,12 @@ export async function POST(request: Request) {
|
|||
if (streamContext) {
|
||||
return new Response(
|
||||
await streamContext.resumableStream(streamId, () =>
|
||||
stream.pipeThrough(new JsonToSseTransformStream())
|
||||
)
|
||||
stream.pipeThrough(new JsonToSseTransformStream()),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return new Response(stream.pipeThrough(new JsonToSseTransformStream()));
|
||||
}
|
||||
|
||||
return new Response(stream.pipeThrough(new JsonToSseTransformStream()));
|
||||
} catch (error) {
|
||||
if (error instanceof ChatSDKError) {
|
||||
return error.toResponse();
|
||||
|
|
@ -294,35 +288,35 @@ export async function POST(request: Request) {
|
|||
if (
|
||||
error instanceof Error &&
|
||||
error.message?.includes(
|
||||
"AI Gateway requires a valid credit card on file to service requests"
|
||||
'AI Gateway requires a valid credit card on file to service requests',
|
||||
)
|
||||
) {
|
||||
return new ChatSDKError("bad_request:activate_gateway").toResponse();
|
||||
return new ChatSDKError('bad_request:activate_gateway').toResponse();
|
||||
}
|
||||
|
||||
console.error("Unhandled error in chat API:", error);
|
||||
return new ChatSDKError("offline:chat").toResponse();
|
||||
console.error('Unhandled error in chat API:', error);
|
||||
return new ChatSDKError('offline:chat').toResponse();
|
||||
}
|
||||
}
|
||||
|
||||
export async function DELETE(request: Request) {
|
||||
const { searchParams } = new URL(request.url);
|
||||
const id = searchParams.get("id");
|
||||
const id = searchParams.get('id');
|
||||
|
||||
if (!id) {
|
||||
return new ChatSDKError("bad_request:api").toResponse();
|
||||
return new ChatSDKError('bad_request:api').toResponse();
|
||||
}
|
||||
|
||||
const session = await auth();
|
||||
|
||||
if (!session?.user) {
|
||||
return new ChatSDKError("unauthorized:chat").toResponse();
|
||||
return new ChatSDKError('unauthorized:chat').toResponse();
|
||||
}
|
||||
|
||||
const chat = await getChatById({ id });
|
||||
|
||||
if (chat?.userId !== session.user.id) {
|
||||
return new ChatSDKError("forbidden:chat").toResponse();
|
||||
return new ChatSDKError('forbidden:chat').toResponse();
|
||||
}
|
||||
|
||||
const deletedChat = await deleteChatById({ id });
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import { z } from "zod";
|
||||
import { z } from 'zod';
|
||||
|
||||
const textPartSchema = z.object({
|
||||
type: z.enum(["text"]),
|
||||
type: z.enum(['text']),
|
||||
text: z.string().min(1).max(2000),
|
||||
});
|
||||
|
||||
const filePartSchema = z.object({
|
||||
type: z.enum(["file"]),
|
||||
mediaType: z.enum(["image/jpeg", "image/png"]),
|
||||
type: z.enum(['file']),
|
||||
mediaType: z.enum(['image/jpeg', 'image/png']),
|
||||
name: z.string().min(1).max(100),
|
||||
url: z.string().url(),
|
||||
});
|
||||
|
|
@ -18,11 +18,11 @@ export const postRequestBodySchema = z.object({
|
|||
id: z.string().uuid(),
|
||||
message: z.object({
|
||||
id: z.string().uuid(),
|
||||
role: z.enum(["user"]),
|
||||
role: z.enum(['user']),
|
||||
parts: z.array(partSchema),
|
||||
}),
|
||||
selectedChatModel: z.enum(["chat-model", "chat-model-reasoning"]),
|
||||
selectedVisibilityType: z.enum(["public", "private"]),
|
||||
selectedChatModel: z.enum(['chat-model', 'chat-model-reasoning']),
|
||||
selectedVisibilityType: z.enum(['public', 'private']),
|
||||
});
|
||||
|
||||
export type PostRequestBody = z.infer<typeof postRequestBodySchema>;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue