better-chatbot-patterns について
AIチャットボットを開発する方向けのスキルです。サーバーアクション、ツール抽象化、複数のAIプロバイダー、状態管理、バリデーションに使える調整可能なパターンをまとめています。
主な機能
- 01サーバーアクションの認証・検証パターン
- 02拡張可能な複数型ツールの抽象化
- 03複数AIプロバイダーの設定とフォールバック
- 04Zustandによる状態管理パターン
- 05Zodによるフィールド間検証
活用シーン
- 01フォーム操作に認証と権限チェックを追加
- 02MCPツールとワークフローに対応するシステムの構築
- 03AIプロバイダーの切り替えやフォールバックの設定
- 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.txtreferences/example-reference.mdprovider-integration-patterns.mdserver-action-patterns.mdstate-validation-patterns.mdtool-abstraction-patterns.mdscripts/example-script.sh詳細
better-chatbot-patterns
ステータス: 本番環境対応 最終更新日: 2025-11-21 依存関係: なし 最新バージョン: [email protected], [email protected], [email protected], [email protected]
概要
このスキルでは、better-chatbot プロジェクトから再利用可能なパターンを抽出し、カスタム AI チャットボットの実装に活用します。プロジェクトの規約を説明する better-chatbot スキルとは異なり、このスキルでは、あらゆるプロジェクトに合わせて調整できる移植可能なテンプレートを提供します。
含まれるパターン:
- サーバーアクションのバリデーター(認証、バリデーション、FormData)
- ツールの抽象化システム(複数タイプのツール処理)
- 複数の AI プロバイダーのセットアップ
- ワークフローの実行パターン
- 状態管理の規約
パターン 1: サーバーアクションのバリデーター
完全な実装について: サーバーアクションのバリデーター、認証バリデーション、または FormData の解析を実装する際は、references/server-action-patterns.md を読み込んでください。
解決する課題: 一貫性のない認証チェック、繰り返し発生する FormData 解析の定型コード、標準化されていないエラー処理、サーバーアクションにおける型安全性の問題です。
3 つのバリデーターパターン:
validatedAction- シンプルなバリデーション(認証なし)validatedActionWithUser- ユーザーコンテキストあり(認証が必要)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 ストア、ワークフローの状態、または複雑なネストされた状態管理を実装する際は、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
}))
}))
含まれるパターン: 複数ストアの構成、Immer との連携、persist ミドルウェア。
パターン 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() など)を調整してください。
依存関係
必須:
- [email protected] - バリデーション(すべてのパターン)
- [email protected] - 状態管理(パターン 4)
- [email protected] - Vercel AI SDK(パターン 3)
任意(使用するパターンによる):
- @ai-sdk/openai - OpenAI プロバイダー
- @ai-sdk/anthropic - Anthropic プロバイダー
- @ai-sdk/google - Google プロバイダー
公式ドキュメント
- Vercel AI SDK:https://sdk.vercel.ai/docs
- Zod:https://zod.dev
- Zustand:https://zustand-demo.pmnd.rs
- better-chatbot(ソース):https://github.com/cgoinglove/better-chatbot
本番環境での使用例
これらのパターンは better-chatbot から抽出されています:
- 稼働中:https://betterchatbot.vercel.app
- テスト:48 件以上の E2E テストが成功
- エラー:0 件(本番環境で実証済みのパターン)
- 検証:✅ 複数ユーザー、複数プロバイダー、ワークフロー実行
トークン効率:約 65% 削減 | 防止したエラー:5 件 | 本番環境で検証済み:はい