fastapi_django_main_live / controllers /example_gradio_interface_fixed.py
GitHub Actions
🚀 Auto-deploy from GitHub Actions
fabbc69
raw
history blame
7.64 kB
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
)