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. 02MCPツールとワークフローに対応するシステムの構築
  3. 03AIプロバイダーの切り替えやフォールバックの設定
  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 解析の定型コード、標準化されていないエラー処理、サーバーアクションにおける型安全性の問題です。

3 つのバリデーターパターン:

  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 ストア、ワークフローの状態、または複雑なネストされた状態管理を実装する際は、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() など)を調整してください。


依存関係

必須:

任意(使用するパターンによる):

  • @ai-sdk/openai - OpenAI プロバイダー
  • @ai-sdk/anthropic - Anthropic プロバイダー
  • @ai-sdk/google - Google プロバイダー

公式ドキュメント


本番環境での使用例

これらのパターンは better-chatbot から抽出されています:

  • 稼働中:https://betterchatbot.vercel.app
  • テスト:48 件以上の E2E テストが成功
  • エラー:0 件(本番環境で実証済みのパターン)
  • 検証:✅ 複数ユーザー、複数プロバイダー、ワークフロー実行

トークン効率:約 65% 削減 | 防止したエラー:5 件 | 本番環境で検証済み:はい

コメント