import gradio as gr from mysite.libs.utilities import chat_with_interpreter, completion, process_file, no_process_file from interpreter import interpreter import mysite.interpreter.interpreter_config # インポートするだけで設定が適用されます import sqlite3 import os from datetime import datetime from typing import List, Tuple, Optional # データベース設定 DB_PATH = "prompts.db" def init_db(): """プロンプトデータベースの初期化""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS prompts ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, url TEXT, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') # デフォルトプロンプトの追加(初回のみ) cursor.execute('SELECT COUNT(*) FROM prompts') if cursor.fetchone()[0] == 0: default_prompt = """# gradio で miiboのナレッジに登録する画面の作成 gradio_interface interfacec name # fastapi gradio apiに接続するAPI router で作成 1ファイルで作成 仕様書の作成 plantumlで図にする #sample fastapi import requests import json import os from fastapi import APIRouter, HTTPException from gradio_client import Client router = APIRouter(prefix="/gradio", tags=["gradio"]) @router.get("/route/gradio") def get_senario(id,res): table = "LOG" client = Client("kenken999/fastapi_django_main_live") result = client.predict( message="Hello!!", request=0.95, param_3=512, api_name="/chat" ) return result """ cursor.execute( 'INSERT INTO prompts (title, url, content) VALUES (?, ?, ?)', ('デフォルト:Gradio + FastAPI作成', 'https://example.com', default_prompt) ) conn.commit() conn.close() print("✅ データベース初期化完了") except Exception as e: print(f"❌ データベース初期化エラー: {e}") def save_prompt(title: str, url: str, content: str) -> str: """プロンプトを保存""" try: if not title.strip() or not content.strip(): return "❌ タイトルとプロンプト内容は必須です" conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute( 'INSERT INTO prompts (title, url, content) VALUES (?, ?, ?)', (title.strip(), url.strip(), content.strip()) ) conn.commit() conn.close() print(f"✅ プロンプト保存: {title}") return f"✅ プロンプト '{title}' を保存しました!" except Exception as e: print(f"❌ 保存エラー: {e}") return f"❌ エラー: {str(e)}" def get_prompts() -> List[Tuple]: """全プロンプトを取得""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT id, title, url, created_at FROM prompts ORDER BY created_at DESC') prompts = cursor.fetchall() conn.close() print(f"✅ プロンプト取得: {len(prompts)}件") return prompts except Exception as e: print(f"❌ プロンプト取得エラー: {e}") return [] def get_prompt_content(prompt_id: int) -> str: """指定IDのプロンプト内容を取得""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('SELECT content FROM prompts WHERE id = ?', (prompt_id,)) result = cursor.fetchone() conn.close() return result[0] if result else "" except Exception as e: print(f"❌ プロンプト内容取得エラー: {e}") return "" def delete_prompt(prompt_id: int) -> str: """プロンプトを削除""" try: conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute('DELETE FROM prompts WHERE id = ?', (prompt_id,)) if cursor.rowcount > 0: conn.commit() conn.close() print(f"✅ プロンプト削除: ID {prompt_id}") return "✅ プロンプトを削除しました" else: conn.close() return "❌ プロンプトが見つかりません" except Exception as e: print(f"❌ 削除エラー: {e}") return f"❌ 削除エラー: {str(e)}" # データベース初期化 print("🗄️ データベースを初期化中...") init_db() def refresh_prompt_list(): """プロンプト一覧を更新""" prompts = get_prompts() choices = [] for prompt in prompts: id_, title, url, created_at = prompt display_text = f"[{id_}] {title} ({created_at[:10]})" choices.append((display_text, str(id_))) return choices # Gradioインターフェース作成 with gr.Blocks(title="🚀 プロンプト管理 & コード生成", theme=gr.themes.Soft()) as gradio_interface: gr.Markdown("# 🚀 プロンプト管理 & ドキュメントからコード生成") with gr.Tabs(): # タブ1: プロンプト管理 with gr.TabItem("📝 プロンプト管理"): gr.Markdown("## プロンプトの保存・管理") with gr.Row(): with gr.Column(scale=1): # プロンプト保存フォーム save_title = gr.Textbox(label="📋 タイトル", placeholder="例: FastAPI + Gradio作成プロンプト") save_url = gr.Textbox(label="🔗 参考URL (任意)", placeholder="https://example.com") save_content = gr.Textbox( label="📝 プロンプト内容", lines=10, placeholder="プロンプトの内容を入力してください..." ) save_btn = gr.Button("💾 プロンプトを保存", variant="primary") save_status = gr.Textbox(label="保存結果", interactive=False) with gr.Column(scale=1): # プロンプト一覧 prompt_dropdown = gr.Dropdown( choices=[], label="📋 保存済みプロンプト一覧", interactive=True ) refresh_btn = gr.Button("🔄 一覧を更新") load_btn = gr.Button("📥 選択したプロンプトを読み込み", variant="secondary") delete_btn = gr.Button("🗑️ 選択したプロンプトを削除", variant="stop") delete_status = gr.Textbox(label="削除結果", interactive=False) # タブ2: コード生成 with gr.TabItem("⚡ コード生成"): gr.Markdown("## ドキュメントからコード生成") with gr.Row(): with gr.Column(): # ファイルアップロード input_file = gr.File(label="📄 ドキュメントファイル") # プロンプト表示・編集エリア current_prompt = gr.Textbox( label="📝 現在のプロンプト", lines=15, value="", placeholder="上のタブでプロンプトを選択するか、直接入力してください..." ) with gr.Column(): # 生成設定 folder_name = gr.Textbox(label="📁 出力フォルダ名", value="generated_code") github_token = gr.Textbox(label="🔑 GitHub Token (任意)", type="password", value="") # 生成ボタン generate_btn = gr.Button("🚀 コード生成実行", variant="primary", size="lg") # 結果表示 result_output = gr.Textbox(label="📤 生成結果", lines=10, interactive=False) # イベントハンドラー def handle_save_prompt(title, url, content): result = save_prompt(title, url, content) return result def handle_refresh_list(): choices = refresh_prompt_list() return gr.Dropdown(choices=choices, value=None) def handle_load_prompt(selected_prompt): if selected_prompt: try: prompt_id = selected_prompt.split(']')[0][1:] # [1] から ] までを取得してIDを抽出 content = get_prompt_content(int(prompt_id)) return content except Exception as e: print(f"❌ プロンプト読み込みエラー: {e}") return "" return "" def handle_delete_prompt(selected_prompt): if selected_prompt: try: prompt_id = selected_prompt.split(']')[0][1:] # IDを抽出 return delete_prompt(int(prompt_id)) except Exception as e: print(f"❌ プロンプト削除エラー: {e}") return f"❌ エラー: {str(e)}" return "❌ プロンプトが選択されていません" def handle_generate_code(file, prompt, folder, token): if not prompt.strip(): return "❌ プロンプトが入力されていません" try: return process_file(file, prompt, folder, token) except Exception as e: return f"❌ コード生成エラー: {str(e)}" # イベント接続 save_btn.click( handle_save_prompt, inputs=[save_title, save_url, save_content], outputs=[save_status] ) refresh_btn.click( handle_refresh_list, outputs=[prompt_dropdown] ) load_btn.click( handle_load_prompt, inputs=[prompt_dropdown], outputs=[current_prompt] ) delete_btn.click( handle_delete_prompt, inputs=[prompt_dropdown], outputs=[delete_status] ) generate_btn.click( handle_generate_code, inputs=[input_file, current_prompt, folder_name, github_token], outputs=[result_output] ) # ページ読み込み時にプロンプト一覧を初期化 gradio_interface.load( handle_refresh_list, outputs=[prompt_dropdown] )