File size: 7,308 Bytes
70766d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import gradio as gr
import importlib
import os
import sys
import traceback
from typing import List, Tuple, Dict, Any

def load_contbk_interfaces() -> Tuple[List[Any], List[str]]:
    """
    contbkフォルダーから全てのgradio_interfaceを動的に読み込み
    Returns:
        Tuple[List[gradio.Interface], List[str]]: インターフェースとその名前のリスト
    """
    interfaces = []
    names = []
    contbk_path = "/workspaces/fastapi_django_main_live/contbk"
    main_path = "/workspaces/fastapi_django_main_live"
    
    # 必要なパスをsys.pathに追加
    if contbk_path not in sys.path:
        sys.path.insert(0, contbk_path)
    if main_path not in sys.path:
        sys.path.insert(0, main_path)
    
    # contbkフォルダー内の各サブディレクトリをチェック
    for item in os.listdir(contbk_path):
        item_path = os.path.join(contbk_path, item)
        
        # ディレクトリかつ特定の命名規則に従っている場合のみ処理
        if os.path.isdir(item_path) and item.startswith('gra_'):
            try:
                # Pythonファイルを探索
                for file in os.listdir(item_path):
                    if file.endswith('.py') and file != '__init__.py':
                        module_name = f"{item}.{file[:-3]}"
                        
                        try:
                            print(f"🔍 Loading {module_name}...")
                            
                            # モジュールを動的にインポート
                            module = importlib.import_module(module_name)
                            
                            # gradio_interfaceが存在するかチェック
                            if hasattr(module, 'gradio_interface'):
                                interface = module.gradio_interface
                                interface_name = f"{item.replace('gra_', '').replace('_', ' ').title()}"
                                
                                interfaces.append(interface)
                                names.append(interface_name)
                                
                                print(f"✅ Successfully loaded: {interface_name}")
                                break  # 1つのフォルダーから1つのインターフェースのみ
                                
                        except Exception as e:
                            print(f"⚠️ Failed to load {module_name}: {str(e)}")
                            continue
                            
            except Exception as e:
                print(f"❌ Error processing {item}: {str(e)}")
                continue
    
    print(f"📊 Total interfaces loaded: {len(interfaces)}")
    return interfaces, names

def create_welcome_tab() -> gr.Blocks:
    """ウェルカムタブを作成"""
    with gr.Blocks() as welcome:
        gr.Markdown("""
        # 🎯 ContBK インターフェース ダッシュボード
        
        このダッシュボードでは、`contbk`フォルダーにある全ての Gradio インターフェースにアクセスできます。
        
        ## 📋 利用可能な機能:
        
        各タブには以下のような機能が含まれています:
        
        - **💬 Chat**: チャット機能
        - **🤖 Open Interpreter**: オープンインタープリター
        - **📄 Program From Doc**: ドキュメントからプログラム生成
        - **🗄️ Database**: データベース操作
        - **📁 Files**: ファイル管理
        - **🎥 Video**: 動画処理
        - **🌤️ Weather**: 天気予報
        - **🎨 Frontend**: フロントエンド生成
        - **🖼️ Multimodal**: マルチモーダル機能
        
        ## 🚀 使い方:
        1. 上部のタブから使いたい機能を選択
        2. 各タブの指示に従って操作
        3. 必要に応じて設定やパラメータを調整
        
        ## 📞 サポート:
        - 各機能の詳細は対応するタブで確認できます
        - 問題が発生した場合は、エラーメッセージを確認してください
        """)
        
        # システム情報を表示
        with gr.Accordion("🔧 システム情報", open=False):
            def get_system_status():
                return f"""
                **Python バージョン**: {sys.version}
                **ContBK パス**: /workspaces/fastapi_django_main_live/contbk
                **利用可能なインターフェース数**: {len(load_contbk_interfaces()[0])}
                """
            
            gr.Markdown(get_system_status())
    
    return welcome

def create_error_tab(error_message: str) -> gr.Blocks:
    """エラータブを作成"""
    with gr.Blocks() as error_tab:
        gr.Markdown(f"""
        # ❌ エラーが発生しました
        
        ```
        {error_message}
        ```
        
        ## 🔧 トラブルシューティング:
        1. contbkフォルダーが存在することを確認
        2. 各モジュールが正しくインストールされていることを確認
        3. Pythonパスが正しく設定されていることを確認
        """)
    return error_tab

def create_tabbed_interface() -> gr.TabbedInterface:
    """
    contbkフォルダーのインターフェースを統合したタブ表示を作成
    """
    try:
        # contbkからインターフェースを読み込み
        interfaces, names = load_contbk_interfaces()
        
        # ウェルカムタブを先頭に追加
        welcome_tab = create_welcome_tab()
        all_interfaces = [welcome_tab] + interfaces
        all_names = ["🏠 Welcome"] + names
        
        if len(interfaces) == 0:
            # インターフェースが見つからない場合
            error_tab = create_error_tab("contbkフォルダーからインターフェースが見つかりませんでした。")
            all_interfaces = [welcome_tab, error_tab]
            all_names = ["🏠 Welcome", "❌ Error"]
        
        # タブ付きインターフェースを作成
        tabs = gr.TabbedInterface(
            all_interfaces,
            all_names,
            title="🎯 ContBK ダッシュボード"
        )
        
        return tabs
        
    except Exception as e:
        print(f"❌ Failed to create tabbed interface: {str(e)}")
        traceback.print_exc()
        
        # エラーの場合、基本的なインターフェースを返す
        error_tab = create_error_tab(str(e))
        welcome_tab = create_welcome_tab()
        
        return gr.TabbedInterface(
            [welcome_tab, error_tab],
            ["🏠 Welcome", "❌ Error"],
            title="🎯 ContBK ダッシュボード (エラー)"
        )

# メインのgradio_interfaceを作成
gradio_interface = create_tabbed_interface()

# スタンドアロン実行用(テスト用)
if __name__ == "__main__":
    print("🚀 ContBK ダッシュボードを起動中...")
    gradio_interface.launch(
        server_name="0.0.0.0",
        server_port=7861,  # メインアプリと被らないポート
        share=False,
        debug=True
    )