mcpField
B
better-chatbot-patterns

better-chatbot-patterns

github.com/secondsky开发240128 次安装5 周前更新
代码仓库

关于 better-chatbot-patterns

面向构建 AI 聊天机器人的开发者,提供可移植并可按项目调整的实现模式,涵盖服务端操作、工具抽象、多 AI 提供商、状态管理与验证。

主要功能

  1. 01服务端操作的认证与验证模式
  2. 02可扩展的多类型工具抽象
  3. 03多 AI 提供商配置与回退
  4. 04Zustand 状态管理模式
  5. 05Zod 跨字段验证

适用场景

  1. 01为表单操作加入认证与权限检查
  2. 02构建支持 MCP 工具和工作流的系统
  3. 03在多个 AI 提供商间切换或设置回退
  4. 04管理复杂工作流状态并验证关联字段

MCP 相关

提供 MCP 工具抽象与集成的实现模式,供开发者用于构建聊天机器人中的工具系统。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill better-chatbot-patterns

安装后在 Claude Code 中输入/better-chatbot-patterns确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
example-template.txt
references/
example-reference.md
provider-integration-patterns.md
server-action-patterns.md
state-validation-patterns.md
tool-abstraction-patterns.md
scripts/
example-script.sh

详细介绍

better-chatbot-patterns

状态:生产就绪 最后更新:2025-11-21 依赖项:无 最新版本:[email protected]、[email protected]、[email protected]、[email protected]


概述

此技能从 better-chatbot 项目中提取可复用的模式,供自定义 AI 聊天机器人实现使用。与 better-chatbot 技能(讲解项目约定)不同,此技能提供了可移植的模板,你可以将其调整到任何项目中。

包含的模式:

  1. 服务端操作验证器(身份验证、验证、FormData)
  2. 工具抽象系统(多类型工具处理)
  3. 多 AI 提供商设置
  4. 工作流执行模式
  5. 状态管理约定

模式 1:服务端操作验证器

完整实现:实现服务端操作验证器、身份验证验证或 FormData 解析时,加载 references/server-action-patterns.md。

解决的问题:身份验证检查不一致、重复的 FormData 解析样板代码、非标准错误处理,以及服务端操作中的类型安全问题。

三种验证器模式:

  1. validatedAction - 简单验证(无身份验证)
  2. validatedActionWithUser - 带用户上下文(需要身份验证)
  3. validatedActionWithPermission - 带权限检查(基于角色)

快速示例:

// Server action with automatic auth + validation
export const updateProfile = validatedActionWithUser(
  z.object({ name: z.string(), email: z.string().email() }),
  async (data, formData, user) => {
    // user is authenticated, data is validated
    await db.update(users).set(data).where(eq(users.id, user.id))
    return { success: true }
  }
)

适配你的身份验证系统:Better Auth、Clerk、Auth.js 或自定义身份验证系统。


模式 2:工具抽象系统

完整实现:构建多类型工具系统、MCP 集成或可扩展的工具架构时,加载 references/tool-abstraction-patterns.md。

解决的问题:运行时类型不匹配、重复的类型检查样板代码,以及难以添加新工具类型(TypeScript 无法强制执行运行时类型)。

工作原理:品牌化类型标签可在确保完整 TypeScript 安全性的同时,实现运行时类型收窄。

快速示例:

// Runtime type checking with branded tags
async function executeTool(tool: unknown) {
  if (VercelAIMcpToolTag.isMaybe(tool)) {
    return await tool.execute() // TypeScript knows tool is MCPTool
  } else if (VercelAIWorkflowToolTag.isMaybe(tool)) {
    return await executeWorkflow(tool.nodes) // TypeScript knows tool is WorkflowTool
  }
  throw new Error("Unknown tool type")
}

// Create tagged tools
const mcpTool = VercelAIMcpToolTag.create({
  type: "mcp",
  name: "search",
  execute: async () => { /* ... */ }
})

可扩展:添加新的工具类型,而不会破坏现有代码。


模式 3:多 AI 提供商设置

完整实现:设置多 AI 提供商支持、配置 Vercel AI SDK 或实现提供商回退时,加载 references/provider-integration-patterns.md。

解决的问题:不同的 SDK 初始化模式、特定于提供商的配置,以及用于在运行时切换提供商的统一接口。

支持的提供商:OpenAI、Anthropic(Claude)、Google(Gemini)、xAI(Grok)、Groq。

快速示例:

// Provider registry in lib/ai/providers.ts
export const providers = {
  openai: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),
  anthropic: createAnthropic({ apiKey: process.env.ANTHROPIC_API_KEY }),
  google: createGoogleGenerativeAI({ apiKey: process.env.GOOGLE_API_KEY })
}

// API route with user provider selection
export async function POST(req: Request) {
  const { messages, provider, model } = await req.json()
  const selectedModel = getModel(provider, model)

  return streamText({ model: selectedModel, messages }).toDataStreamResponse()
}

功能:回退策略、健康检查、成本感知型选择。


模式 4:状态管理(Zustand)

完整实现:实现 Zustand store、工作流状态或复杂的嵌套状态管理时,加载 references/state-validation-patterns.md。

解决的问题:无需变更即可管理复杂的嵌套状态、避免重新渲染问题,并防止状态更新错误。

快速示例:

// Zustand store with shallow update pattern
export const useWorkflowStore = create<WorkflowStore>((set) => ({
  workflow: null,
  // Shallow update - no deep mutation
  updateNodeStatus: (nodeId, status) =>
    set(state => ({
      workflow: state.workflow ? {
        ...state.workflow,
        nodes: state.workflow.nodes.map(node =>
          node.id === nodeId ? { ...node, status } : node
        )
      } : null
    }))
}))

包含的模式:多 store 组织、Immer 集成、持久化中间件。


模式 5:跨字段验证(Zod)

完整实现:实现跨字段验证、密码确认或日期范围时,加载 references/state-validation-patterns.md。

解决的问题:使用一致的错误消息和业务规则验证相关字段(密码确认、日期范围、条件要求)。

快速示例:

// Zod superRefine for cross-field validation
const passwordSchema = z.object({
  password: z.string().min(8),
  confirmPassword: z.string()
}).superRefine((data, ctx) => {
  if (data.password !== data.confirmPassword) {
    ctx.addIssue({
      path: ["confirmPassword"],
      code: z.ZodIssueCode.custom,
      message: "Passwords must match"
    })
  }
})

用例:密码匹配、日期范围、条件字段、业务规则、数组验证。


何时加载参考资料

实现特定的聊天机器人模式时,加载参考文件:

server-action-patterns.md

在以下情况下加载:

  • 基于模式:实现服务端操作验证器、身份验证验证、FormData 解析
  • 基于身份验证:设置身份验证检查、用户上下文、权限系统
  • 基于验证:构建表单验证、模式验证、错误处理
  • 基于适配:将模式适配到 Better Auth、Clerk、Auth.js 或自定义身份验证系统
tool-abstraction-patterns.md

加载时机:

  • 基于工具:构建多类型工具系统、MCP 集成、工作流工具
  • 基于类型:实现运行时类型检查、品牌类型、类型收窄
  • 基于执行:创建工具执行器、工具分发器、可扩展工具系统
  • 基于扩展:向现有系统添加新的工具类型
provider-integration-patterns.md

加载时机:

  • 基于提供方:设置多 AI 提供方支持(OpenAI、Anthropic、Google、xAI、Groq)
  • 基于集成:配置 Vercel AI SDK、提供方 SDK、模型注册表
  • 基于切换:实现提供方回退、用户模型选择、动态模型加载
  • 基于配置:管理 API 密钥、基础 URL、提供方专属设置
state-validation-patterns.md

加载时机:

  • 基于状态:实现 Zustand 存储、工作流状态、复杂的嵌套状态
  • 基于更新:构建浅层更新模式、无变更更新、状态同步
  • 基于验证:创建跨字段验证、密码确认、日期范围验证
  • 基于工作流:管理工作流执行状态、节点状态跟踪、动态数据更新

关键规则

始终遵循

✅ 根据你的身份验证系统(Better Auth、Clerk、Auth.js 等)调整模式 ✅ 使用品牌类型标签进行运行时类型检查 ✅ 对嵌套的 Zustand 状态使用浅层更新 ✅ 使用 Zod superRefine 进行跨字段验证 ✅ 正确地为工具抽象添加类型

绝不

❌ 不调整代码以适配你的身份验证/角色系统就直接复制 ❌ 未进行运行时检查就假定工具类型 ❌ 直接修改 Zustand 状态 ❌ 对相关字段使用单独的验证器 ❌ 在可扩展系统中省略类型品牌标记


预防已知问题

此技能可预防 5 个常见问题:

问题 #1:身份验证检查不一致

预防措施:使用 validatedActionWithUser 模式(根据你的身份验证系统进行调整)

问题 #2:工具类型不匹配

预防措施:使用带 .isMaybe() 检查的品牌类型标签

问题 #3:状态变更错误

预防措施:使用 Zustand 浅层更新模式

问题 #4:跨字段验证失败

预防措施:使用 Zod superRefine 验证相关字段

问题 #5:提供方配置错误

预防措施:使用统一接口的提供方注册表


使用捆绑资源

模板(templates/)
  • templates/action-utils.ts - 完整的服务端操作验证器
  • templates/tool-tags.ts - 完整的工具抽象系统
  • templates/providers.ts - 多 AI 提供方设置
  • templates/workflow-store.ts - Zustand 工作流存储

复制到你的项目中,并调整占位符(getUser()、checkPermission() 等)


依赖项

必需:

可选(取决于所用模式):

  • @ai-sdk/openai - OpenAI 提供方
  • @ai-sdk/anthropic - Anthropic 提供方
  • @ai-sdk/google - Google 提供方

官方文档


生产环境示例

这些模式摘自 better-chatbot:

  • 在线体验:https://betterchatbot.vercel.app
  • 测试:48+ 项 E2E 测试通过
  • 错误:0(已在生产环境验证)
  • 验证:✅ 多用户、多提供方、工作流执行

Token 效率:约节省 65% | 预防错误数:5 | 已通过生产环境验证:是

评论

支持 Markdown