|
""" |
|
会話履歴システム - 統合デモ |
|
========================== |
|
|
|
GitHub Copilotとの会話を自動記録し、 |
|
履歴を美しく表示するデモシステム |
|
|
|
このファイルは: |
|
1. 会話履歴の自動記録デモ |
|
2. リアルタイム会話ログ機能 |
|
3. 履歴検索・エクスポート機能 |
|
を提供します |
|
""" |
|
|
|
import gradio as gr |
|
import datetime |
|
import uuid |
|
from typing import List, Tuple |
|
import json |
|
|
|
|
|
from controllers.conversation_logger import ( |
|
conversation_logger, |
|
log_this_conversation, |
|
start_new_conversation_session, |
|
get_current_session_info |
|
) |
|
from controllers.conversation_history import conversation_manager |
|
|
|
|
|
interface_title = "🎯 会話履歴統合デモ" |
|
interface_description = "GitHub Copilotとの会話履歴を自動記録・管理するデモシステム" |
|
|
|
def simulate_conversation_logging(user_input: str, context: str = "", tags: str = "") -> Tuple[str, str, str]: |
|
""" |
|
会話ログのシミュレーション |
|
実際のCopilot会話を模擬して記録 |
|
""" |
|
if not user_input.strip(): |
|
return "❓ ユーザー入力を入力してください", "", "" |
|
|
|
|
|
assistant_responses = { |
|
"contbk": "ContBK統合システムは、contbkフォルダーにある全てのGradioインターフェースを美しい絵文字タイトル付きで統合表示するシステムです。🎯", |
|
"履歴": "会話履歴システムにより、GitHub Copilotとの全ての会話がSQLiteデータベースに自動保存され、検索・分析が可能になります。💬", |
|
"gradio": "Gradioを使用することで、PythonコードをWebインターフェースとして簡単に公開できます。🌐", |
|
"デフォルト": f"「{user_input}」について説明いたします。この機能により、より効率的な開発が可能になります。✨" |
|
} |
|
|
|
|
|
assistant_response = assistant_responses["デフォルト"] |
|
for keyword, response in assistant_responses.items(): |
|
if keyword in user_input.lower(): |
|
assistant_response = response |
|
break |
|
|
|
|
|
tag_list = [tag.strip() for tag in tags.split(",") if tag.strip()] if tags else [] |
|
tag_list.append("デモ") |
|
|
|
|
|
tools_used = [] |
|
if "ファイル" in user_input or "作成" in user_input: |
|
tools_used.append("create_file") |
|
if "編集" in user_input or "修正" in user_input: |
|
tools_used.append("edit_file") |
|
if "検索" in user_input: |
|
tools_used.append("search") |
|
|
|
|
|
conversation_id = log_this_conversation( |
|
user_msg=user_input, |
|
assistant_msg=assistant_response, |
|
context=context, |
|
files=["controllers/conversation_demo.py"], |
|
tools=tools_used, |
|
tags=tag_list |
|
) |
|
|
|
|
|
log_result = f"✅ 会話を記録しました (ID: {conversation_id})" |
|
session_info = get_current_session_info() |
|
session_display = f""" |
|
## 🎯 現在のセッション情報 |
|
- **セッションID:** {session_info.get('session_id', 'N/A')[:8]}... |
|
- **会話数:** {session_info.get('conversation_count', 0)} |
|
- **経過時間:** {session_info.get('duration_minutes', 0):.1f}分 |
|
""" |
|
|
|
return assistant_response, log_result, session_display |
|
|
|
def load_recent_conversations(limit: int = 10) -> str: |
|
"""最近の会話履歴を表示""" |
|
try: |
|
conversations = conversation_manager.get_conversations(limit=limit) |
|
|
|
if not conversations: |
|
return "📭 まだ会話履歴がありません。上記で会話をシミュレートしてください。" |
|
|
|
display_text = "# 📚 最近の会話履歴\n\n" |
|
|
|
for i, conv in enumerate(conversations, 1): |
|
timestamp = conv['timestamp'] |
|
user_msg = conv['user_message'][:80] + "..." if len(conv['user_message']) > 80 else conv['user_message'] |
|
assistant_resp = conv['assistant_response'][:120] + "..." if len(conv['assistant_response']) > 120 else conv['assistant_response'] |
|
|
|
display_text += f""" |
|
### 🔹 会話 {i} - {timestamp} |
|
**👤 ユーザー:** {user_msg} |
|
**🤖 アシスタント:** {assistant_resp} |
|
**🏷️ タグ:** {conv.get('tags', 'なし')} |
|
|
|
--- |
|
""" |
|
|
|
return display_text |
|
|
|
except Exception as e: |
|
return f"❌ 履歴読み込みエラー: {str(e)}" |
|
|
|
def search_conversations(query: str, limit: int = 5) -> str: |
|
"""会話履歴を検索""" |
|
if not query.strip(): |
|
return "🔍 検索クエリを入力してください" |
|
|
|
try: |
|
conversations = conversation_manager.get_conversations( |
|
limit=limit, |
|
search_query=query |
|
) |
|
|
|
if not conversations: |
|
return f"📭 「{query}」に関する会話が見つかりませんでした" |
|
|
|
display_text = f"# 🔍 検索結果: 「{query}」\n\n" |
|
|
|
for i, conv in enumerate(conversations, 1): |
|
timestamp = conv['timestamp'] |
|
display_text += f""" |
|
### 🎯 検索結果 {i} - {timestamp} |
|
**👤 ユーザー:** {conv['user_message']} |
|
**🤖 アシスタント:** {conv['assistant_response']} |
|
**🏷️ タグ:** {conv.get('tags', 'なし')} |
|
|
|
--- |
|
""" |
|
|
|
return display_text |
|
|
|
except Exception as e: |
|
return f"❌ 検索エラー: {str(e)}" |
|
|
|
def get_conversation_statistics() -> str: |
|
"""会話統計を取得""" |
|
try: |
|
stats = conversation_manager.get_statistics() |
|
|
|
stats_text = f""" |
|
# 📊 会話統計ダッシュボード |
|
|
|
## 📈 基本統計 |
|
- **📚 総会話数:** {stats['total_conversations']} |
|
- **🎯 総セッション数:** {stats['total_sessions']} |
|
- **📅 今日の会話数:** {stats['today_conversations']} |
|
|
|
## 🔧 よく使用されるツール |
|
""" |
|
|
|
if stats['top_tools']: |
|
for tool, count in stats['top_tools']: |
|
stats_text += f"- **{tool}:** {count}回\n" |
|
else: |
|
stats_text += "- まだツール使用履歴がありません\n" |
|
|
|
stats_text += f""" |
|
## ⏰ 最終更新 |
|
{datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |
|
""" |
|
|
|
return stats_text |
|
|
|
except Exception as e: |
|
return f"❌ 統計取得エラー: {str(e)}" |
|
|
|
def start_new_session_demo(session_name: str = "") -> str: |
|
"""新しいセッションを開始""" |
|
try: |
|
session_id = start_new_conversation_session( |
|
session_name if session_name.strip() else None |
|
) |
|
return f"🆕 新しいセッションを開始しました\n**セッションID:** {session_id[:8]}..." |
|
except Exception as e: |
|
return f"❌ セッション開始エラー: {str(e)}" |
|
|
|
|
|
def create_demo_interface(): |
|
"""会話履歴統合デモインターフェースを作成""" |
|
|
|
with gr.Blocks(title="🎯 会話履歴統合デモ", theme=gr.themes.Soft()) as interface: |
|
gr.Markdown("# 🎯 会話履歴統合デモシステム") |
|
gr.Markdown("GitHub Copilotとの会話を自動記録し、履歴管理を行うデモです") |
|
|
|
with gr.Tab("💬 会話シミュレーション"): |
|
gr.Markdown("## ✍️ 会話ログ記録デモ") |
|
gr.Markdown("実際のGitHub Copilotとの会話をシミュレートして記録します") |
|
|
|
with gr.Row(): |
|
user_input = gr.Textbox( |
|
label="👤 ユーザーメッセージ", |
|
placeholder="ContBK統合システムについて教えて...", |
|
lines=2 |
|
) |
|
|
|
with gr.Row(): |
|
context_input = gr.Textbox( |
|
label="📝 コンテキスト情報", |
|
placeholder="開発中の機能、作業内容など...", |
|
value="" |
|
) |
|
tags_input = gr.Textbox( |
|
label="🏷️ タグ (カンマ区切り)", |
|
placeholder="contbk, gradio, 統合システム", |
|
value="" |
|
) |
|
|
|
simulate_btn = gr.Button("🚀 会話シミュレート & 記録", variant="primary") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=2): |
|
assistant_output = gr.Textbox( |
|
label="🤖 アシスタント応答", |
|
lines=3, |
|
interactive=False |
|
) |
|
with gr.Column(scale=1): |
|
log_output = gr.Textbox( |
|
label="💾 記録結果", |
|
lines=2, |
|
interactive=False |
|
) |
|
|
|
session_info_display = gr.Markdown("## 🎯 セッション情報") |
|
|
|
with gr.Tab("📚 履歴閲覧"): |
|
gr.Markdown("## 📖 最近の会話履歴") |
|
|
|
with gr.Row(): |
|
refresh_btn = gr.Button("🔄 最新履歴を読み込み", variant="primary") |
|
limit_slider = gr.Slider( |
|
label="📊 表示件数", |
|
minimum=5, |
|
maximum=20, |
|
value=10, |
|
step=1 |
|
) |
|
|
|
conversation_list = gr.Markdown( |
|
value="🔄 「最新履歴を読み込み」ボタンを押してください" |
|
) |
|
|
|
with gr.Tab("🔍 履歴検索"): |
|
gr.Markdown("## 🕵️ 会話履歴検索") |
|
|
|
with gr.Row(): |
|
search_query = gr.Textbox( |
|
label="🔍 検索キーワード", |
|
placeholder="contbk, gradio, システム...", |
|
value="" |
|
) |
|
search_limit = gr.Slider( |
|
label="📊 検索結果数", |
|
minimum=3, |
|
maximum=10, |
|
value=5, |
|
step=1 |
|
) |
|
|
|
search_btn = gr.Button("🔍 検索実行", variant="primary") |
|
|
|
search_results = gr.Markdown( |
|
value="🔍 検索キーワードを入力して検索ボタンを押してください" |
|
) |
|
|
|
with gr.Tab("📊 統計・分析"): |
|
gr.Markdown("## 📈 会話統計ダッシュボード") |
|
|
|
stats_refresh_btn = gr.Button("📊 統計更新", variant="primary") |
|
|
|
statistics_display = gr.Markdown( |
|
value="📊 「統計更新」ボタンを押してください" |
|
) |
|
|
|
with gr.Tab("🎯 セッション管理"): |
|
gr.Markdown("## 🆕 新しいセッション管理") |
|
|
|
session_name_input = gr.Textbox( |
|
label="📝 セッション名", |
|
placeholder="例: ContBK機能追加, バグ修正作業...", |
|
value="" |
|
) |
|
|
|
new_session_btn = gr.Button("🆕 新しいセッション開始", variant="primary") |
|
|
|
session_result = gr.Textbox( |
|
label="📋 セッション管理結果", |
|
lines=3, |
|
interactive=False |
|
) |
|
|
|
current_session_display = gr.Markdown("## 🎯 現在のセッション") |
|
|
|
|
|
simulate_btn.click( |
|
fn=simulate_conversation_logging, |
|
inputs=[user_input, context_input, tags_input], |
|
outputs=[assistant_output, log_output, session_info_display] |
|
) |
|
|
|
refresh_btn.click( |
|
fn=load_recent_conversations, |
|
inputs=[limit_slider], |
|
outputs=[conversation_list] |
|
) |
|
|
|
search_btn.click( |
|
fn=search_conversations, |
|
inputs=[search_query, search_limit], |
|
outputs=[search_results] |
|
) |
|
|
|
stats_refresh_btn.click( |
|
fn=get_conversation_statistics, |
|
outputs=[statistics_display] |
|
) |
|
|
|
new_session_btn.click( |
|
fn=start_new_session_demo, |
|
inputs=[session_name_input], |
|
outputs=[session_result] |
|
) |
|
|
|
|
|
interface.load( |
|
fn=lambda: ( |
|
load_recent_conversations(10), |
|
get_conversation_statistics(), |
|
get_current_session_info() |
|
), |
|
outputs=[conversation_list, statistics_display, current_session_display] |
|
) |
|
|
|
return interface |
|
|
|
|
|
gradio_interface = create_demo_interface |
|
|
|
if __name__ == "__main__": |
|
print("🎯 会話履歴統合デモ起動中...") |
|
interface = create_demo_interface() |
|
interface.launch( |
|
server_port=7873, |
|
share=False, |
|
debug=True |
|
) |
|
|