GitHub Actions
🚀 Auto-deploy from GitHub Actions
fabbc69
"""
システム統合管理ダッシュボード
GPT-ENGINEERで生成されたシステムの統合管理
"""
import gradio as gr
import sqlite3
import os
from pathlib import Path
import json
from datetime import datetime
from typing import Dict, List
class SystemDashboard:
"""システム統合管理ダッシュボード"""
def __init__(self, db_path: str = "prompts.db"):
self.db_path = db_path
self.workspace_root = Path("/workspaces/fastapi_django_main_live")
def get_system_overview(self) -> Dict:
"""システム全体の概要を取得"""
try:
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()
# 基本統計
cursor.execute('SELECT COUNT(*) FROM prompts')
total_prompts = cursor.fetchone()[0]
cursor.execute('SELECT COUNT(*) FROM prompts WHERE execution_status = "completed"')
completed_systems = cursor.fetchone()[0]
cursor.execute('SELECT COUNT(*) FROM prompts WHERE execution_status = "running"')
running_systems = cursor.fetchone()[0]
cursor.execute('SELECT COUNT(*) FROM prompts WHERE execution_status = "failed"')
failed_systems = cursor.fetchone()[0]
# システムタイプ別統計
cursor.execute('''
SELECT system_type, COUNT(*)
FROM prompts
GROUP BY system_type
''')
system_types = dict(cursor.fetchall())
# 最近の実行履歴
cursor.execute('''
SELECT title, execution_status, created_at
FROM prompts
ORDER BY created_at DESC
LIMIT 10
''')
recent_executions = cursor.fetchall()
conn.close()
return {
'total_prompts': total_prompts,
'completed_systems': completed_systems,
'running_systems': running_systems,
'failed_systems': failed_systems,
'system_types': system_types,
'recent_executions': recent_executions,
'success_rate': (completed_systems / total_prompts * 100) if total_prompts > 0 else 0
}
except Exception as e:
return {'error': str(e)}
def scan_generated_systems(self) -> List[Dict]:
"""生成されたシステムをスキャン"""
systems = []
# Controllers ディレクトリをスキャン
controllers_dir = self.workspace_root / "controllers"
if controllers_dir.exists():
for subdir in controllers_dir.iterdir():
if subdir.is_dir() and not subdir.name.startswith('.'):
py_files = list(subdir.glob("*.py"))
if py_files:
systems.append({
'name': subdir.name,
'type': 'controller',
'path': str(subdir),
'files': len(py_files),
'size': sum(f.stat().st_size for f in py_files if f.exists())
})
# Routers ディレクトリをスキャン
routers_dir = self.workspace_root / "routers"
if routers_dir.exists():
for py_file in routers_dir.glob("*.py"):
if py_file.name != "__init__.py":
systems.append({
'name': py_file.stem,
'type': 'router',
'path': str(py_file),
'files': 1,
'size': py_file.stat().st_size if py_file.exists() else 0
})
return systems
def get_system_health(self) -> Dict:
"""システムヘルス状態を取得"""
health = {
'database': False,
'workspace': False,
'git': False,
'dependencies': False
}
try:
# データベース接続確認
conn = sqlite3.connect(self.db_path)
conn.close()
health['database'] = True
except:
pass
# ワークスペースディレクトリ確認
health['workspace'] = self.workspace_root.exists()
# Git確認
try:
os.system('git --version > /dev/null 2>&1')
health['git'] = True
except:
pass
# 依存関係確認
try:
import gradio, sqlite3, requests
health['dependencies'] = True
except:
pass
return health
def create_dashboard_interface():
"""ダッシュボードのGradioインターフェース"""
dashboard = SystemDashboard()
def refresh_overview():
"""概要情報を更新"""
overview = dashboard.get_system_overview()
if 'error' in overview:
return f"❌ エラー: {overview['error']}", "", ""
# 基本統計
stats = f"""📊 **システム統計**
- 📝 総プロンプト数: {overview['total_prompts']}
- ✅ 完了済みシステム: {overview['completed_systems']}
- 🚀 実行中: {overview['running_systems']}
- ❌ 失敗: {overview['failed_systems']}
- 📈 成功率: {overview['success_rate']:.1f}%
"""
# システムタイプ別統計
types_stats = "🏗️ **システムタイプ別**\n"
type_icons = {
'web_system': '🌐',
'api_system': '🔗',
'interface_system': '🖥️',
'line_system': '📱',
'ai_generated': '🤖',
'general': '📄'
}
for system_type, count in overview['system_types'].items():
icon = type_icons.get(system_type, '📄')
types_stats += f"- {icon} {system_type}: {count}件\n"
# 最近の実行履歴
recent = "📅 **最近の実行履歴**\n"
for title, status, created_at in overview['recent_executions']:
status_icon = {'pending': '⏳', 'running': '🚀', 'completed': '✅', 'failed': '❌'}.get(status, '⏳')
date_str = created_at[:16] if created_at else ""
recent += f"- {status_icon} {title[:30]}... ({date_str})\n"
return stats, types_stats, recent
def refresh_systems():
"""生成されたシステム一覧を更新"""
systems = dashboard.scan_generated_systems()
if not systems:
return [["システムが見つかりません", "", "", "", ""]]
table_data = []
for system in systems:
size_mb = system['size'] / (1024 * 1024)
table_data.append([
system['name'],
system['type'],
str(system['files']),
f"{size_mb:.2f} MB",
system['path']
])
return table_data
def refresh_health():
"""システムヘルス状態を更新"""
health = dashboard.get_system_health()
health_status = "🏥 **システムヘルス**\n"
for component, status in health.items():
icon = "✅" if status else "❌"
health_status += f"- {icon} {component}: {'正常' if status else '異常'}\n"
overall_health = sum(health.values()) / len(health) * 100
health_status += f"\n📊 **総合ヘルス: {overall_health:.1f}%**"
return health_status
with gr.Blocks(title="🚀 システム統合管理ダッシュボード") as interface:
gr.Markdown("# 🚀 システム統合管理ダッシュボード")
gr.Markdown("GPT-ENGINEERで生成されたシステムの統合管理・監視")
with gr.Row():
refresh_btn = gr.Button("🔄 全体更新", variant="primary")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("## 📊 システム概要")
overview_stats = gr.Markdown("読み込み中...")
gr.Markdown("## 🏗️ システムタイプ")
system_types = gr.Markdown("読み込み中...")
gr.Markdown("## 🏥 システムヘルス")
health_status = gr.Markdown("読み込み中...")
with gr.Column(scale=2):
gr.Markdown("## 📅 最近の実行履歴")
recent_executions = gr.Markdown("読み込み中...")
gr.Markdown("## 💾 生成されたシステム一覧")
systems_table = gr.Dataframe(
headers=["システム名", "タイプ", "ファイル数", "サイズ", "パス"],
datatype=["str", "str", "str", "str", "str"],
value=[],
interactive=False
)
with gr.Row():
gr.Markdown("## 📋 クイックアクション")
with gr.Column():
backup_btn = gr.Button("💾 データベースバックアップ")
cleanup_btn = gr.Button("🧹 不要ファイル削除")
export_btn = gr.Button("📤 システムエクスポート")
# イベントハンドラー
def full_refresh():
stats, types, recent = refresh_overview()
systems = refresh_systems()
health = refresh_health()
return stats, types, recent, systems, health
refresh_btn.click(
fn=full_refresh,
outputs=[overview_stats, system_types, recent_executions, systems_table, health_status]
)
# 初期読み込み
interface.load(
fn=full_refresh,
outputs=[overview_stats, system_types, recent_executions, systems_table, health_status]
)
return interface
# ダッシュボードインターフェースを作成
dashboard_interface = create_dashboard_interface()