Loading...
Loading...
Compare original and translation side by side
/ai-sdk-6/ai-elements/nextjs-shadcnc:\hh-tyo\fair\helpdesk-chatbot/ai-sdk-6/ai-elements/nextjs-shadcnc:\hh-tyo\fair\helpdesk-chatbotgpt-5.4reasoningEffort: "none"ai@6ToolLoopAgentcreateAgentUIStreamResponse/ai-elements/ai-elements/fair-helpdeskgpt-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"]
}
}
}.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// 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>;@ai-sdk/devtoolsdevToolsMiddleware()createAgent// 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
},
});
}// app/api/chat/route.ts
export const maxDuration = 60;
export async function POST(request: Request) {
const { messages, chatId, ...consentData } = await request.json();
// 1. 验证同意信息——若未同意则拦截
if (!consentData.consentAccepted) {
return new Response(JSON.stringify({ error: "Consent required" }), { status: 403 });
}
// 2. 插入或更新会话——必须在流开始前等待该操作完成
await db.insert(chatSessions).values({ id: chatId, ... })
.onConflictDoUpdate({ target: chatSessions.id, set: { updatedAt: sql`now()` } });
// 3. 流式传输
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 }) => {
// 流结束后保存到数据库——请查看persistence.md
},
});
}lib/ai/tools/my-tool.tstool()ailib/ai/tools/index.tstoolsinstructionschat-message.tsxtool-myToolaitool()lib/ai/tools/my-tool.tslib/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.ts/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.tsneedsApprovalbun devSELECT * FROM chat_sessionschat_messagesbun devSELECT * FROM chat_sessionschat_messagesneedsApproval: truerenderToolState<T>needsApproval: 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 |
| 技能 | 适用场景 |
|---|---|
| 人工介入(HITL)审批、会话数据库、反馈重试、SQL搜索、按工具渲染UI |
| 通用SDK操作: |
| 聊天UI组件: |
| Next.js应用搭建、shadcn组件、路由、布局 |
| 高级搜索:混合全文搜索+向量检索、BM25、重排序、HNSW调优 |