プロジェクト

全般

プロフィール

機能 #193

未完了

Redmine左ナビ AIチャット機能追加 - チャット一覧・1ペイン表示・履歴管理

Redmine Admin さんが4日前に追加. 4日前に更新.

ステータス:
新規
優先度:
高め
担当者:
開始日:
2025-06-04
期日:
進捗率:

0%

予定工数:

説明

機能要望概要

対象箇所: Redmine左ナビゲーションメニュー
要望内容: AIチャット機能をメインナビゲーションに追加
配置位置: カレンダーの位置(カレンダー削除後)

機能仕様

1. 左ナビゲーション追加

メニュー構成:

📊 ダッシュボード
🎫 チケット  
🏗️ プロジェクト管理
📰 ニュース
📄 ドキュメント
🤖 AIチャット ← 新規追加(カレンダー位置)

2. AIチャット機能構成

A. チャット一覧表示

  • 既存チャット履歴の表示
  • チャット件名(タイトル)一覧
  • 最終更新日時
  • チャット状態(アクティブ/非アクティブ)

B. 新規チャット作成

  • 「新規チャット」ボタン
  • 1ペインでのチャット画面起動
  • フルページでのチャット体験

C. 既存チャット再開

  • 件名クリックでチャット画面表示
  • 過去の会話履歴継続
  • 1ペインでのWEB UI利用

UI/UX設計

1. ナビゲーションメニュー

<nav className="sidebar-nav">
  {/* 既存メニュー */}
  <NavItem icon="📊" label="ダッシュボード" to="/dashboard" />
  <NavItem icon="🎫" label="チケット" to="/tickets" />
  <NavItem icon="🏗️" label="プロジェクト管理" to="/projects" />
  <NavItem icon="📰" label="ニュース" to="/news" />
  <NavItem icon="📄" label="ドキュメント" to="/documents" />
  
  {/* 新規追加 */}
  <NavItem icon="🤖" label="AIチャット" to="/ai-chat" />
</nav>

2. AIチャット一覧ページ (/ai-chat)

<div className="ai-chat-list-page">
  {/* ヘッダー */}
  <div className="page-header">
    <h1 className="text-2xl font-bold">AIチャット</h1>
    <button className="btn btn-primary">
      ➕ 新規チャット
    </button>
  </div>
  
  {/* チャット一覧 */}
  <div className="chat-list">
    {chatHistory.map(chat => (
      <div key={chat.id} className="chat-item">
        <div className="chat-title">
          <a href={`/ai-chat/${chat.id}`}>{chat.title}</a>
        </div>
        <div className="chat-meta">
          <span className="last-updated">{chat.lastUpdated}</span>
          <span className="message-count">{chat.messageCount}</span>
        </div>
      </div>
    ))}
  </div>
</div>

3. 1ペインチャット画面 (/ai-chat/new, /ai-chat/:id)

<div className="ai-chat-fullpage">
  {/* チャットヘッダー */}
  <div className="chat-header">
    <button className="back-btn">← 一覧に戻る</button>
    <h2 className="chat-title">{chatTitle || "新規チャット"}</h2>
    <div className="chat-actions">
      <button className="save-btn">💾 保存</button>
      <button className="delete-btn">🗑️ 削除</button>
    </div>
  </div>
  
  {/* チャットエリア */}
  <div className="chat-messages-area">
    {messages.map(message => (
      <ChatMessage key={message.id} message={message} />
    ))}
  </div>
  
  {/* 入力エリア */}
  <div className="chat-input-area">
    <input 
      type="text" 
      placeholder="メッセージを入力..."
      className="chat-input"
    />
    <button className="send-btn">送信</button>
  </div>
</div>

データ管理仕様

1. チャット履歴保存

// チャットデータ構造
const chatSession = {
  id: 'chat_uuid_001',
  title: 'Redmine設定について',
  createdAt: '2025-06-04T18:30:00Z',
  lastUpdated: '2025-06-04T19:15:00Z',
  messageCount: 12,
  messages: [
    {
      id: 'msg_001',
      role: 'user',
      content: 'Redmineの設定方法を教えて',
      timestamp: '2025-06-04T18:30:00Z'
    },
    {
      id: 'msg_002', 
      role: 'assistant',
      content: 'Redmineの設定について説明します...',
      timestamp: '2025-06-04T18:30:15Z'
    }
  ],
  context: {
    url: 'https://task.call2arm.com/settings',
    pageContent: '...'
  }
};

2. 永続化ストレージ

  • ローカルストレージ: ブラウザでの一時保存
  • サーバーサイド: データベースでの永続保存
  • セッション管理: ユーザー別のチャット履歴

技術実装要件

1. ルーティング追加

// React Router設定
<Routes>
  {/* 既存ルート */}
  <Route path="/dashboard" element={<Dashboard />} />
  <Route path="/tickets" element={<Tickets />} />
  <Route path="/projects" element={<Projects />} />
  
  {/* 新規追加 */}
  <Route path="/ai-chat" element={<AIchatList />} />
  <Route path="/ai-chat/new" element={<AIchatFullpage />} />
  <Route path="/ai-chat/:chatId" element={<AIchatFullpage />} />
</Routes>

2. API エンドポイント

# チャット管理API
GET    /api/ai-chat/sessions          # チャット一覧取得
POST   /api/ai-chat/sessions          # 新規チャット作成
GET    /api/ai-chat/sessions/:id      # 特定チャット取得
PUT    /api/ai-chat/sessions/:id      # チャット更新
DELETE /api/ai-chat/sessions/:id      # チャット削除

# メッセージ管理API
POST   /api/ai-chat/sessions/:id/messages  # メッセージ送信
GET    /api/ai-chat/sessions/:id/messages  # メッセージ履歴取得

3. 状態管理

// Zustand/Redux での状態管理
const useAIChatStore = create((set, get) => ({
  chatSessions: [],
  currentChat: null,
  
  loadChatSessions: async () => {
    const sessions = await fetchChatSessions();
    set({ chatSessions: sessions });
  },
  
  createNewChat: async (initialMessage) => {
    const newChat = await createChatSession(initialMessage);
    set(state => ({
      chatSessions: [newChat, ...state.chatSessions],
      currentChat: newChat
    }));
  },
  
  loadChat: async (chatId) => {
    const chat = await fetchChatSession(chatId);
    set({ currentChat: chat });
  }
}));

期待効果

  • アクセス性向上: AIチャットへの直接アクセス
  • 履歴管理: 過去の相談内容の再参照
  • 作業継続性: 中断したチャットの再開
  • 統合体験: Redmine内でのシームレスなAI活用

関連チケット

  • #190: カレンダー機能削除(前提条件)
  • #191: Claude API接続問題(解決必要)
  • #192: AIアシスタント機能拡張(統合可能)

優先度

  • 緊急度: 中(UI改善・機能追加)
  • 重要度: 高(AI統合の中核機能)

他の形式にエクスポート: Atom PDF