Loading...
Loading...
Production-grade Next.js chatbot builder. Covers tool calling with human-in-the-loop (HITL) approval, PostgreSQL session persistence, GDPR consent gating, SQL-first search, per-tool UI rendering, message feedback, and follow-up suggestions. Use when building chat apps, conversational AI interfaces, customer support bots, or any chatbot needing database-backed sessions, tool approval workflows, consent gating, or custom tool output components. Reference implementation: fair-helpdesk project.
npx skill4agent add laguagu/claude-code-nextjs-skills nextjs-chatbot/ai-sdk-6/ai-elements/nextjs-shadcnc:\hh-tyo\fair\helpdesk-chatbotgpt-5.4reasoningEffort: "none"ai@6ToolLoopAgentcreateAgentUIStreamResponse/ai-elements/ai-elements/fair-helpdesk.claude/settings.json{
"mcpServers": {
"next-devtools": {
"command": "npx",
"args": ["-y", "next-devtools-mcp@latest"]
},
"ai-elements": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://registry.ai-sdk.dev/api/mcp"]
}
}
}// lib/ai/my-agent.ts
import { openai } from "@ai-sdk/openai";
import { ToolLoopAgent, InferAgentUIMessage, stepCountIs } from "ai";
export function createAgent(opts?: { model?: LanguageModel }) {
return new ToolLoopAgent({
model: opts?.model ?? openai("gpt-5.4"),
instructions, // system prompt string
providerOptions: { openai: { reasoningEffort: "none" } },
tools, // { toolName: tool(...) }
stopWhen: stepCountIs(10),
});
}
export const agent = createAgent();
export type AgentUIMessage = InferAgentUIMessage<typeof agent>;devToolsMiddleware()@ai-sdk/devtoolscreateAgent// app/api/chat/route.ts
export const maxDuration = 60;
export async function POST(request: Request) {
const { messages, chatId, ...consentData } = await request.json();
// 1. Validate consent — block if missing
if (!consentData.consentAccepted) {
return new Response(JSON.stringify({ error: "Consent required" }), { status: 403 });
}
// 2. Upsert session — MUST be awaited before streaming starts
await db.insert(chatSessions).values({ id: chatId, ... })
.onConflictDoUpdate({ target: chatSessions.id, set: { updatedAt: sql`now()` } });
// 3. Stream
return createAgentUIStreamResponse({
agent,
uiMessages: messages,
generateMessageId: createIdGenerator({ prefix: "msg", size: 16 }),
consumeSseStream: ({ stream }) => consumeStream({ stream }),
experimental_transform: smoothStream({ delayInMs: 15, chunking: "word" }),
onFinish: async ({ messages: finished }) => {
// Save to DB after stream — see persistence.md
},
});
}lib/ai/tools/my-tool.tstool()ailib/ai/tools/index.tstoolsinstructionschat-message.tsxtool-myTool/ai-appbunx --bun shadcn@latest createbun add ai @ai-sdk/react @ai-sdk/openai zod drizzle-orm postgresbunx --bun ai-elements@latestlib/ai/agent.tsapp/api/chat/route.tsbun devSELECT * FROM chat_sessionschat_messagesneedsApproval: truerenderToolState<T>| Skill | Use for |
|---|---|
| HITL approval, session DB, feedback retry, SQL search, per-tool UI |
| General SDK: |
| Chat UI components: |
| Next.js app setup, shadcn components, routing, layouts |
| Advanced search: hybrid FTS+vector, BM25, reranking, HNSW tuning |