AIKit
AIKit ·

Atomic Design の原則に基づいて構築された、AI チャット用の UI コンポーネントライブラリです。
説明
@gravity-ui/aikit は、あらゆる複雑さの AI チャットを構築するための、柔軟で拡張性の高い React コンポーネントライブラリです。このライブラリは、そのまま使用することも、ニーズに合わせてカスタマイズすることもできる、すぐに使えるコンポーネントセットを提供します。
主な特徴
- 🎨 Atomic Design — アトムからページまで、明確なコンポーネント階層
- 🔧 SDK 非依存 — 特定の AI SDK に依存しない
- 🎭 二段階アプローチ — すぐに使えるコンポーネント + カスタマイズ用のフック
- 🎨 CSS 変数 — コンポーネントのオーバーライドなしで簡単なテーマ設定
- 📦 TypeScript — 最初から完全な型安全性
- 🔌 拡張可能 — カスタムメッセージタイプの登録システム
プロジェクト構造
src/
├── components/
│ ├── atoms/ # 基本的な分割不可能な UI 要素
│ ├── molecules/ # アトムの簡単なグループ
│ ├── organisms/ # ロジックを持つ複雑なコンポーネント
│ ├── templates/ # 完全なレイアウト
│ └── pages/ # データとの完全な統合
├── hooks/ # 一般的な目的のフック
├── types/ # TypeScript の型
├── utils/ # ユーティリティ
└── themes/ # CSS テーマと変数
インストール
npm install @gravity-ui/aikit
クイックスタート
import { ChatContainer } from '@gravity-ui/aikit';
import type { ChatType, TChatMessage } from '@gravity-ui/aikit';
function App() {
const [messages, setMessages] = useState<TChatMessage[]>([]);
const [chats, setChats] = useState<ChatType[]>([]);
const [activeChat, setActiveChat] = useState<ChatType | null>(null);
return (
<ChatContainer
chats={chats}
activeChat={activeChat}
messages={messages}
onSendMessage={async (data) => {
// 送信ロジックをここに記述
console.log('Message:', data.content);
}}
onSelectChat={setActiveChat}
onCreateChat={() => {
// 新しいチャットを作成
}}
onDeleteChat={(chat) => {
// チャットを削除
}}
/>
);
}
アーキテクチャ
このライブラリは Atomic Design の原則に基づいて構築されています。
🔹 アトム (Atoms)
ビジネスロジックを持たない、基本的な分割不可能な UI 要素です。
ActionButton— ツールチップが統合されたボタンAlert— バリアントを持つアラートメッセージChatDate— 相対日付での日付フォーマットContextIndicator— トークンコンテキストの使用状況インジケーターContextItem— 削除アクション付きのコンテキストラベルDiffStat— コード変更統計の表示Disclaimer— 注意書きテキストコンポーネントInlineCitation— テキストの引用Loader— ローディングインジケーターMarkdownRenderer— Yandex Flavored Markdown レンダラーMessageBalloon— メッセージラッパーShimmer— ローディングアニメーション効果SubmitButton— ステータス付きの送信ボタンToolIndicator— ツール実行ステータスインジケーター
🔸 モレキュール (Molecules)
アトムの簡単な組み合わせです。
BaseMessage— すべてのメッセージタイプの基本ラッパーButtonGroup— 方向サポート付きのボタングループInputContext— コンテキスト管理PromptInputBody— 自動拡張可能なテキストエリアPromptInputFooter— アクションアイコンと送信ボタン付きのフッターPromptInputHeader— コンテキストアイテムとインジケーター付きのヘッダーPromptInputPanel— カスタムコンテンツ用のパネルコンテナSuggestions— クリック可能な提案ボタンTabs— 削除機能付きのナビゲーションタブToolFooter— アクション付きのツールメッセージフッターToolHeader— アイコンとアクション付きのツールメッセージヘッダー
🔶 オーガニズム (Organisms)
内部ロジックを持つ複雑なコンポーネントです。
AssistantMessage— AI アシスタントメッセージHeader— チャットヘッダーMessageList— メッセージリストPromptInput— メッセージ入力フィールドThinkingMessage— AI の思考プロセスToolMessage— ツールの実行UserMessage— ユーザーメッセージ
📄 テンプレート (Templates)
完全なレイアウトです。
ChatContent— メインのチャットコンテンツEmptyContainer— 空の状態History— チャット履歴
📱 ページ (Pages)
完全な統合です。
ChatContainer— 完全に組み立てられたチャット
ドキュメント
テスト
このプロジェクトでは、ビジュアルリグレッションテストのために Playwright Component Testing を使用しています。
テストの実行
重要: すべてのテストは、環境間で一貫したスクリーンショットを保証するために、Docker 経由で実行する必要があります。
# Docker ですべてのコンポーネントテストを実行 (推奨)
npm run playwright:docker
# Docker でスクリーンショットのベースラインを更新
npm run playwright:docker:update
# Docker で grep パターンを使用して特定のテストを実行
npm run playwright:docker -- --grep "@ComponentName"
# 必要に応じて Docker キャッシュをクリア
npm run playwright:docker:clear-cache
ローカルテスト (Linux のみ)
Linux を使用している場合は、ローカルでテストを実行できます。
# Playwright ブラウザをインストール (一度実行)
npm run playwright:install
# すべてのコンポーネントテストを実行
npm run playwright
# スクリーンショットのベースラインを更新
npm run playwright:update
詳細なテストドキュメントについては、Playwright ガイドを参照してください。
開発
開発およびコントリビューションに関する指示は、CONTRIBUTING.md で確認できます。
ライセンス
MIT
AI エージェント向け
Atomic Design (アトム → モレキュール → オーガニズム → テンプレート → ページ) に従って整理された、AI チャットインターフェース構築のための React コンポーネントライブラリです。SDK に依存しないため、これらのプリミティブを @gravity-ui/uikit で手動で構成する代わりに、チャット UI (メッセージリスト、プロンプト入力、ツール呼び出し、添付ファイル) を組み立てるために使用できます。
使用する場面
- AI/LLM チャット UI (アシスタント/ユーザー/ツールメッセージ、提案付きプロンプト入力、添付ファイルのアップロード、思考状態) の構築。
- すぐに使用できるチャットレイアウト (
ChatContainer、MessageList、PromptInput) と、動作をカスタマイズするためのフックが必要な場合。 - CSS 変数によるテーマの共有で、Gravity UI エコシステムに組み込む場合。
使用しない場面
- 一般的な UI プリミティブ (ボタン、入力、モーダル) の場合、
@gravity-ui/uikitを直接使用してください。AIKit はチャット固有のニーズのためにそれを基盤として構築されています。 - メッセージ内のリッチマークダウンをレンダリングする場合、AIKit の
MarkdownRendererは@gravity-ui/markdown-editorをラップしています。スタンドアロンのマークダウンレンダリングには、そのパッケージを直接使用してください。 - チャットオーケストレーションなしの単一のチャットバブルの場合、uikit の
MarkdownRenderer/テキストブロックは、AIKit の完全なメッセージパイプラインよりも軽量です。
よくある落とし穴
- AI SDK のインポートを誤解する - AIKit は SDK に依存しません。コンポーネント/フックを提供し、LLM クライアントは提供しません。独自のデータソースを用意し、props を介してメッセージをフィードしてください。
<Chat>/<AIChat>を探す - ページレベルのエクスポートはChatContainer(およびAIStudioChat) です。文字通りChatという名前のコンポーネントはありません。- カスタムタイプのメッセージタイプ登録をスキップする - カスタムメッセージの種類は、メッセージタイプシステムに登録する必要があります。そうしないと、不明としてレンダリングされます。
- ベースコンポーネントを編集してフックを使用しない - 2 レベルのデザインでは、フック/コンポジションによるカスタマイズが期待されています。内部を直接オーバーライドすると、アップグレード時に問題が発生します。
AI エージェント向けドキュメント
インストールされているバージョン向けの、エージェントが読み取れるドキュメントは、node_modules/@gravity-ui/aikit/build/docs/INDEX.md にあります。