fastapi_django_main_live / controllers /example_gradio_interface_fixed.py
GitHub Actions
🚀 Auto-deploy from GitHub Actions
fabbc69
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**: ファイル管理
- **🌐 Html**: HTML表示
- **🌤️ Weather**: 天気予報機能
- **🎨 Frontend**: フロントエンド生成
- **🖼️ Multimodal**: マルチモーダル機能
## 🚀 使用方法:
1. 上部のタブから使用したい機能を選択
2. 各インターフェースの指示に従って操作
3. 必要に応じてファイルのアップロードや設定を行う
## 📞 サポート:
問題が発生した場合は、各インターフェースのドキュメントを参照するか、
開発チームにお問い合わせください。
""")
with gr.Row():
with gr.Column():
gr.Markdown("### 📊 システム情報")
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:
gr.Markdown(f"""
# ❌ エラーが発生しました
```
{error_message}
```
## 📝 解決方法:
1. **依存関係の確認**: 必要なパッケージがインストールされているか確認
2. **ファイルパス**: contbkフォルダーのパスが正しいか確認
3. **権限**: ファイルアクセス権限を確認
4. **再起動**: アプリケーションを再起動してみる
## 📞 サポート:
問題が解決しない場合は、開発チームにお問い合わせください。
""")
return error
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 ダッシュボード (エラー)"
)
# スタンドアロン実行用(テスト用)
if __name__ == "__main__":
print("🚀 ContBK ダッシュボードを起動中...")
gradio_interface = create_tabbed_interface() # テスト実行時のみ作成
gradio_interface.launch(
server_name="0.0.0.0",
server_port=7861, # メインアプリと被らないポート
share=False,
debug=True
)