Initial commit: EGBE chatbot template
Stripped from vercel/chatbot (Apache 2.0): - Dropped @vercel/* packages and AI Gateway - Removed artifacts feature (code/text/sheet/image side panel) - Switched AI provider to @ai-sdk/openai-compatible -> EGBE LiteLLM - Replaced Vercel Blob upload with data URLs - Dropped Redis resumable streams and rate limiter (in-memory now) - Added Dockerfile (Next.js standalone) + entrypoint that runs migrations - Wired DATABASE_URL, EGBE_AI_API_URL/KEY, NEXT_PUBLIC_BASE_URL for app-deploy.sh
This commit is contained in:
commit
3e21c2334c
129 changed files with 21913 additions and 0 deletions
27
lib/ratelimit.ts
Normal file
27
lib/ratelimit.ts
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
import { isProductionEnvironment } from "@/lib/constants";
|
||||
import { ChatbotError } from "@/lib/errors";
|
||||
|
||||
const MAX_MESSAGES = 30;
|
||||
const TTL_MS = 60 * 60 * 1000;
|
||||
|
||||
const ipCounts = new Map<string, { count: number; resetAt: number }>();
|
||||
|
||||
export async function checkIpRateLimit(ip: string | undefined) {
|
||||
if (!isProductionEnvironment || !ip) {
|
||||
return;
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const entry = ipCounts.get(ip);
|
||||
|
||||
if (!entry || entry.resetAt < now) {
|
||||
ipCounts.set(ip, { count: 1, resetAt: now + TTL_MS });
|
||||
return;
|
||||
}
|
||||
|
||||
entry.count += 1;
|
||||
|
||||
if (entry.count > MAX_MESSAGES) {
|
||||
throw new ChatbotError("rate_limit:chat");
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue