|
import gradio as gr
|
|
import sys
|
|
import os
|
|
|
|
|
|
project_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
sys.path.append(project_root)
|
|
|
|
from mysite.libs.utilities import chat_with_interpreter, completion, process_file,no_process_file
|
|
from interpreter import interpreter
|
|
import mysite.interpreter.interpreter_config
|
|
import duckdb
|
|
import psycopg2
|
|
from dataclasses import dataclass, field
|
|
from typing import List, Optional, Tuple
|
|
from mysite.interpreter.process import no_process_file,process_file,process_nofile
|
|
|
|
import requests
|
|
import sqlite3
|
|
import os
|
|
from datetime import datetime
|
|
from controllers.gra_03_programfromdocs.system_automation import SystemAutomation
|
|
|
|
|
|
try:
|
|
from config.database import get_db_path
|
|
DB_PATH = get_db_path('prompts')
|
|
except ImportError:
|
|
|
|
DB_PATH = os.path.join(project_root, "database", "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,
|
|
github_url TEXT,
|
|
repository_name TEXT,
|
|
system_type TEXT DEFAULT 'general',
|
|
content TEXT NOT NULL,
|
|
execution_status TEXT DEFAULT 'pending',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
''')
|
|
|
|
|
|
cursor.execute('SELECT COUNT(*) FROM prompts')
|
|
if cursor.fetchone()[0] == 0:
|
|
default_prompts = [
|
|
("社員プロフィールシステム", "", "", "web_system", "社員プロフィール管理システム\n- ユーザー登録\n- プロフィール編集\n- 検索機能\n- 管理機能"),
|
|
("FastAPI + SQLAlchemy", "", "", "api_system", "FastAPIとSQLAlchemyを使用したAPIの作成\n- ユーザー管理\n- 認証機能\n- CRUD操作"),
|
|
("Gradio Interface", "", "", "interface_system", "Gradioインターフェースの作成\n- ファイルアップロード\n- チャット機能\n- データ表示"),
|
|
("LINE画像検索システム", "", "", "line_system", "LINEからの画像を検索するシステム\n- doPost受信\n- 画像保存\n- S3アップロード\n- シークレット管理"),
|
|
]
|
|
|
|
for title, github_url, repo_name, system_type, content in default_prompts:
|
|
cursor.execute(
|
|
'INSERT INTO prompts (title, github_url, repository_name, system_type, content) VALUES (?, ?, ?, ?, ?)',
|
|
(title, github_url, repo_name, system_type, content)
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
print("✅ プロンプトデータベース初期化完了")
|
|
|
|
except Exception as e:
|
|
print(f"❌ データベース初期化エラー: {e}")
|
|
|
|
def save_prompt(title: str, content: str, github_url: str = "", system_type: str = "general") -> str:
|
|
"""プロンプトを保存"""
|
|
try:
|
|
if not title.strip() or not content.strip():
|
|
return "❌ タイトルと内容は必須です"
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
|
|
repo_name = ""
|
|
if github_url:
|
|
repo_name = github_url.split('/')[-1].replace('.git', '') if github_url.endswith('.git') else github_url.split('/')[-1]
|
|
|
|
cursor.execute(
|
|
'INSERT INTO prompts (title, github_url, repository_name, system_type, content) VALUES (?, ?, ?, ?, ?)',
|
|
(title.strip(), github_url.strip(), repo_name, system_type, content.strip())
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
print(f"✅ プロンプト保存: {title} (GitHub: {github_url})")
|
|
return f"✅ プロンプト「{title}」を保存しました\n📁 リポジトリ: {repo_name}"
|
|
|
|
except Exception as e:
|
|
print(f"❌ プロンプト保存エラー: {e}")
|
|
return f"❌ 保存エラー: {e}"
|
|
|
|
def get_prompts() -> List[Tuple]:
|
|
"""全プロンプトを取得"""
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute('''
|
|
SELECT id, title, system_type, repository_name, execution_status, 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()
|
|
|
|
if result:
|
|
print(f"✅ プロンプト内容取得: ID {prompt_id}")
|
|
return result[0]
|
|
else:
|
|
print(f"❌ プロンプトが見つかりません: ID {prompt_id}")
|
|
return ""
|
|
|
|
except Exception as e:
|
|
print(f"❌ プロンプト内容取得エラー: {e}")
|
|
return ""
|
|
|
|
def get_prompt_details(prompt_id: int) -> Tuple[str, str, str, str]:
|
|
"""指定IDのプロンプト詳細を取得"""
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute('''
|
|
SELECT content, github_url, system_type, repository_name
|
|
FROM prompts WHERE id = ?
|
|
''', (prompt_id,))
|
|
result = cursor.fetchone()
|
|
|
|
conn.close()
|
|
|
|
if result:
|
|
return result
|
|
else:
|
|
return "", "", "", ""
|
|
|
|
except Exception as e:
|
|
print(f"❌ プロンプト詳細取得エラー: {e}")
|
|
return "", "", "", ""
|
|
|
|
def update_execution_status(prompt_id: int, status: str) -> None:
|
|
"""実行ステータスを更新"""
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
cursor.execute(
|
|
'UPDATE prompts SET execution_status = ?, updated_at = ? WHERE id = ?',
|
|
(status, datetime.now().isoformat(), prompt_id)
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
print(f"✅ ステータス更新: ID {prompt_id} -> {status}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ ステータス更新エラー: {e}")
|
|
|
|
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 f"✅ プロンプト ID {prompt_id} を削除しました"
|
|
else:
|
|
conn.close()
|
|
return f"❌ プロンプト ID {prompt_id} が見つかりません"
|
|
|
|
except Exception as e:
|
|
print(f"❌ プロンプト削除エラー: {e}")
|
|
return f"❌ 削除エラー: {e}"
|
|
|
|
def update_prompt_display():
|
|
"""プロンプト一覧の表示を更新"""
|
|
prompts = get_prompts()
|
|
if prompts:
|
|
|
|
table_data = []
|
|
for prompt_id, title, system_type, repo_name, status, created_at in prompts:
|
|
|
|
date_str = created_at[:16] if created_at else ""
|
|
|
|
type_icon = {
|
|
'web_system': '🌐',
|
|
'api_system': '🔗',
|
|
'interface_system': '🖥️',
|
|
'line_system': '📱',
|
|
'general': '📄'
|
|
}.get(system_type, '📄')
|
|
|
|
|
|
status_icon = {
|
|
'pending': '⏳',
|
|
'running': '🚀',
|
|
'completed': '✅',
|
|
'failed': '❌'
|
|
}.get(status, '⏳')
|
|
|
|
table_data.append([
|
|
prompt_id,
|
|
f"{type_icon} {title}",
|
|
repo_name or "未設定",
|
|
f"{status_icon} {status}",
|
|
date_str
|
|
])
|
|
return table_data
|
|
return []
|
|
|
|
val = """
|
|
# 社員がプロフィールを登録・公開し、お互いに参照できるシステム
|
|
|
|
## 機能
|
|
|
|
## LINEのクレーム対応システムの作成
|
|
- クレームがあった用語をAPIでナレッジに登録するシステム
|
|
- APIキー agentキーをいれ
|
|
- 否定語に対する 文言に隊しての設定をする
|
|
|
|
### ユーザー登録
|
|
|
|
- ユーザー登録画面で、ユーザー名とパスワードを入力して登録ボタンを押すことにより、新規ユーザーを登録することができる。
|
|
- ユーザー名は、既存のユーザーと重複してはいけない。
|
|
- ユーザー登録に成功したら、ログイン済み状態として、ユーザー一覧画面へ遷移する。
|
|
|
|
### ログイン
|
|
|
|
- ログイン画面で、ユーザー名とパスワードを入力してログインボタンを押すことにより、ログインすることができる。
|
|
- ログインに成功したら、ユーザー一覧画面へ遷移する。
|
|
|
|
### チーム一覧・作成
|
|
|
|
- チームの一覧が、チームの作成日時降順で表示される。
|
|
- チーム名を入力して作成ボタンを押すと、チームが作成される。
|
|
- チームの作成後、本画面が再表示される。
|
|
|
|
### プロフィール編集
|
|
|
|
- 自身の`所属チーム`・`プロフィール`・`タグ`を編集できる。
|
|
- 所属チームは、既存チームからの選択式とする。
|
|
- プロフィールは自由入力とする。
|
|
- タグは自由入力で、複数入力できるようにする。
|
|
|
|
### ユーザー一覧・検索
|
|
|
|
- デフォルトでは全てのユーザーが一覧表示される。
|
|
- 検索条件を入力して検索ボタンを押すと、検索条件がプロフィールに部分一致するユーザーのみにフィルタリングできる。
|
|
- 一覧は、ユーザー登録日時の降順で表示される。
|
|
- 表示内容は、`ユーザー名`・`プロフィール`で、`プロフィール`は先頭10文字と三点リーダーを表示する。
|
|
- ユーザー名をクリックすると、そのユーザーのユーザー詳細画面へ遷移する。
|
|
- `チーム一覧へ`をクリックすると、チーム一覧画面へ遷移する。
|
|
|
|
### ユーザー詳細画面
|
|
|
|
- 特定のユーザーの、`ユーザー名`・`所属チーム`・`プロフィール`・`タグ`が表示される。
|
|
- プロフィールの表示はマークダウンに対応させる。
|
|
- `一覧へ`リンクをクリックすると、ユーザー一覧画面へ遷移する。
|
|
|
|
## あなたが作成するもの
|
|
|
|
バックエンドのプログラム一式を作成してください。
|
|
フロントエンドのプログラムは不要です。
|
|
|
|
- `/api`ディレクトリ以下に作成。
|
|
- Python/FastAPI/SQLAlchemyを使う。
|
|
- DBはSQLiteを使う。
|
|
- 必要に応じて外部ライブラリを使う。
|
|
- クラウドや外部サービス(外部API)は使わない。
|
|
- .gitignoreを含めること。
|
|
- バックエンド
|
|
@app.post("
|
|
def lumbda_function():
|
|
|
|
gradio_interface でメイン関数から読み込めるようにして
|
|
|
|
googleappsscript
|
|
ラインの画像検索システム
|
|
|
|
ファイルは1ファイルで作成して。
|
|
1ファイル1機能で難しくしたくない
|
|
|
|
1,lineからデータがくる
|
|
2,doPostで取得
|
|
3.typeがイメージの場合はドライブに保存
|
|
4,保存したデータをS3にアップロード
|
|
5.データはシークレットから取得
|
|
6,plantumlでフローの作成
|
|
7,システムドキュメントの作成
|
|
|
|
gradio は gradio_interface というBlock名で作成
|
|
fastapiはrouter の作成
|
|
|
|
"""
|
|
|
|
def send_to_google_chat(message: str):
|
|
webhook_url = 'https://chat.googleapis.com/v1/spaces/AAAANwDF_KE/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=qSigSPSbTINJITgO30iGKnyeY48emcUJd9LST7FBLLY'
|
|
headers = {'Content-Type': 'application/json; charset=UTF-8'}
|
|
data = {'text': message}
|
|
response = requests.post(webhook_url, headers=headers, json=data)
|
|
response.raise_for_status()
|
|
|
|
def process_file_and_notify(*args, **kwargs):
|
|
|
|
try:
|
|
prompt_content = args[0] if args else ""
|
|
if prompt_content.strip():
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
result = cursor.fetchone()
|
|
if result:
|
|
update_execution_status(result[0], 'running')
|
|
conn.close()
|
|
except Exception as e:
|
|
print(f"実行前ステータス更新エラー: {e}")
|
|
|
|
|
|
result = process_nofile(*args, **kwargs)
|
|
|
|
|
|
send_to_google_chat(f"🚀 システム生成完了\n```\n{result[:500]}...\n```")
|
|
|
|
|
|
try:
|
|
prompt_content = args[0] if args else ""
|
|
if prompt_content.strip():
|
|
|
|
title_lines = prompt_content.strip().split('\n')
|
|
title = title_lines[0][:50] if title_lines[0] else "実行されたプロンプト"
|
|
if title.startswith('#'):
|
|
title = title[1:].strip()
|
|
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
existing = cursor.fetchone()
|
|
|
|
if existing:
|
|
|
|
update_execution_status(existing[0], 'completed')
|
|
else:
|
|
|
|
save_prompt(f"実行履歴: {title}", prompt_content, "", "execution_log")
|
|
|
|
conn.close()
|
|
except Exception as e:
|
|
print(f"実行履歴保存エラー: {e}")
|
|
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
result = cursor.fetchone()
|
|
if result:
|
|
update_execution_status(result[0], 'failed')
|
|
conn.close()
|
|
except:
|
|
pass
|
|
|
|
return result
|
|
|
|
def process_file_and_notify_enhanced(*args, **kwargs):
|
|
"""拡張版: プロンプト実行 + 自動GitHub連携"""
|
|
|
|
try:
|
|
prompt_content = args[0] if args else ""
|
|
folder_name = args[1] if len(args) > 1 else "generated_systems"
|
|
github_token = args[2] if len(args) > 2 else ""
|
|
|
|
if prompt_content.strip():
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
result = cursor.fetchone()
|
|
if result:
|
|
update_execution_status(result[0], 'running')
|
|
conn.close()
|
|
except Exception as e:
|
|
print(f"実行前ステータス更新エラー: {e}")
|
|
|
|
|
|
result = process_nofile(*args, **kwargs)
|
|
|
|
|
|
enhanced_result = result
|
|
if github_token and len(github_token) > 10:
|
|
try:
|
|
automation = SystemAutomation(github_token)
|
|
|
|
|
|
title_lines = prompt_content.strip().split('\n')
|
|
repo_name = title_lines[0][:30] if title_lines[0] else "generated-system"
|
|
repo_name = repo_name.replace('#', '').strip().replace(' ', '-').lower()
|
|
|
|
|
|
generated_folder = os.path.join(project_root, folder_name)
|
|
|
|
|
|
automation_result = automation.full_automation_pipeline(
|
|
generated_folder,
|
|
repo_name,
|
|
f"GPT-ENGINEERで生成されたシステム: {repo_name}"
|
|
)
|
|
|
|
if automation_result['success']:
|
|
enhanced_result += f"\n\n🚀 自動化完了!\n"
|
|
enhanced_result += f"📁 GitHub: {automation_result['github_repo']['url']}\n"
|
|
enhanced_result += f"🔧 統合されたController: {len(automation_result.get('controllers_found', []))}件"
|
|
|
|
|
|
send_to_google_chat(f"""🎉 システム自動生成・統合完了!
|
|
|
|
📊 **生成システム**: {repo_name}
|
|
🔗 **GitHub**: {automation_result['github_repo']['url']}
|
|
🔧 **Controller統合**: {len(automation_result.get('controllers_found', []))}件
|
|
📱 **ステータス**: 運用準備完了
|
|
""")
|
|
else:
|
|
enhanced_result += f"\n\n⚠️ 自動化エラー: {automation_result.get('error', '不明')}"
|
|
|
|
except Exception as e:
|
|
enhanced_result += f"\n\n❌ 自動化エラー: {str(e)}"
|
|
else:
|
|
|
|
send_to_google_chat(f"🚀 システム生成完了\n```\n{result[:500]}...\n```")
|
|
|
|
|
|
try:
|
|
prompt_content = args[0] if args else ""
|
|
if prompt_content.strip():
|
|
|
|
title_lines = prompt_content.strip().split('\n')
|
|
title = title_lines[0][:50] if title_lines[0] else "実行されたプロンプト"
|
|
if title.startswith('#'):
|
|
title = title[1:].strip()
|
|
|
|
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
existing = cursor.fetchone()
|
|
|
|
if existing:
|
|
|
|
update_execution_status(existing[0], 'completed')
|
|
else:
|
|
|
|
save_prompt(f"実行履歴: {title}", prompt_content, "", "execution_log")
|
|
|
|
conn.close()
|
|
except Exception as e:
|
|
print(f"実行履歴保存エラー: {e}")
|
|
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
cursor.execute('SELECT id FROM prompts WHERE content = ?', (prompt_content,))
|
|
result = cursor.fetchone()
|
|
if result:
|
|
update_execution_status(result[0], 'failed')
|
|
conn.close()
|
|
except:
|
|
pass
|
|
|
|
return enhanced_result
|
|
|
|
|
|
|
|
def load_prompt_to_textbox(evt: gr.SelectData):
|
|
"""テーブルクリック時にプロンプト内容をテキストボックスに読み込む"""
|
|
try:
|
|
if evt.index is not None and len(evt.index) >= 2:
|
|
|
|
prompts = get_prompts()
|
|
if evt.index[0] < len(prompts):
|
|
prompt_id = prompts[evt.index[0]][0]
|
|
content, github_url, system_type, repo_name = get_prompt_details(prompt_id)
|
|
return content, github_url, system_type
|
|
except Exception as e:
|
|
print(f"プロンプト読み込みエラー: {e}")
|
|
return "", "", "general"
|
|
|
|
|
|
interface_title = "💾 プロンプト管理システム"
|
|
interface_description = "SQLite3ベースのプロンプト管理とコード生成"
|
|
|
|
|
|
ai_system_prompts = {
|
|
"microservice_api": """
|
|
# 高性能マイクロサービスAPI設計
|
|
|
|
## 要件
|
|
- FastAPI + SQLAlchemy + Alembic
|
|
- JWT認証、RBAC権限管理
|
|
- OpenAPI仕様書自動生成
|
|
- Redis キャッシュ、Celery非同期処理
|
|
- Docker コンテナ化
|
|
- CI/CD パイプライン(GitHub Actions)
|
|
- 監視・ログ・メトリクス(Prometheus + Grafana)
|
|
|
|
## アーキテクチャ
|
|
- Clean Architecture パターン
|
|
- Repository パターン
|
|
- 依存性注入(DI)
|
|
- イベント駆動設計
|
|
|
|
## セキュリティ
|
|
- OWASP準拠
|
|
- SQL injection防止
|
|
- CORS設定
|
|
- Rate limiting
|
|
|
|
## テスト
|
|
- 単体テスト(pytest)
|
|
- 統合テスト
|
|
- E2Eテスト
|
|
- カバレッジ90%以上
|
|
|
|
作成してください。
|
|
""",
|
|
|
|
"ai_chat_system": """
|
|
# AI チャットシステム(RAG対応)
|
|
|
|
## 機能
|
|
- リアルタイムチャット(WebSocket)
|
|
- AI応答(OpenAI API, Claude API)
|
|
- RAG(Retrieval-Augmented Generation)
|
|
- ベクトルデータベース(Chroma, Pinecone)
|
|
- ファイルアップロード・解析
|
|
- 会話履歴管理
|
|
- ユーザー管理・認証
|
|
|
|
## 技術スタック
|
|
- Frontend: React + TypeScript + Tailwind CSS
|
|
- Backend: FastAPI + SQLAlchemy
|
|
- Vector DB: Chroma
|
|
- Cache: Redis
|
|
- Queue: Celery
|
|
|
|
## AI機能
|
|
- 文書の埋め込み生成
|
|
- セマンティック検索
|
|
- コンテキスト理解
|
|
- マルチモーダル対応(画像、PDF)
|
|
|
|
gradio_interface として作成してください。
|
|
""",
|
|
|
|
"blockchain_dapp": """
|
|
# ブロックチェーン DApp開発
|
|
|
|
## 要件
|
|
- Solidity スマートコントラクト
|
|
- Web3.js フロントエンド
|
|
- MetaMask連携
|
|
- IPFS ファイルストレージ
|
|
- OpenZeppelin セキュリティ
|
|
- Hardhat 開発環境
|
|
|
|
## 機能
|
|
- NFT マーケットプレイス
|
|
- DAO ガバナンス
|
|
- DeFi プロトコル
|
|
- ステーキング機能
|
|
|
|
## セキュリティ
|
|
- リエントランシー攻撃防止
|
|
- オーバーフロー対策
|
|
- アクセス制御
|
|
|
|
作成してください。
|
|
""",
|
|
|
|
"devops_infrastructure": """
|
|
# DevOps インフラストラクチャ
|
|
|
|
## 要件
|
|
- Kubernetes クラスター設計
|
|
- Terraform インフラコード
|
|
- Ansible 設定管理
|
|
- CI/CD パイプライン
|
|
- 監視・アラート
|
|
- ログ集約
|
|
- セキュリティ
|
|
|
|
## 技術
|
|
- AWS/GCP/Azure
|
|
- Docker/Podman
|
|
- GitLab/GitHub Actions
|
|
- Prometheus/Grafana
|
|
- ELK Stack
|
|
- Helm Charts
|
|
|
|
## セキュリティ
|
|
- Secret管理(Vault)
|
|
- ネットワークセキュリティ
|
|
- コンプライアンス
|
|
|
|
作成してください。
|
|
"""
|
|
}
|
|
|
|
def add_ai_system_prompts():
|
|
"""AI用の高度なシステムプロンプトを追加"""
|
|
try:
|
|
conn = sqlite3.connect(DB_PATH)
|
|
cursor = conn.cursor()
|
|
|
|
for title, content in ai_system_prompts.items():
|
|
|
|
cursor.execute('SELECT id FROM prompts WHERE title LIKE ?', (f"%{title}%",))
|
|
if not cursor.fetchone():
|
|
system_type = "ai_generated"
|
|
github_url = f"https://github.com/ai-systems/{title.replace('_', '-')}"
|
|
|
|
cursor.execute(
|
|
'INSERT INTO prompts (title, github_url, repository_name, system_type, content) VALUES (?, ?, ?, ?, ?)',
|
|
(f"🤖 AI: {title}", github_url, title.replace('_', '-'), system_type, content)
|
|
)
|
|
print(f"✅ AI プロンプト追加: {title}")
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
except Exception as e:
|
|
print(f"❌ AI プロンプト追加エラー: {e}")
|
|
|
|
|
|
init_db()
|
|
|
|
add_ai_system_prompts()
|
|
|
|
with gr.Blocks() as gradio_interface:
|
|
gr.Markdown("# 🚀 プロンプト管理&自動システム生成")
|
|
gr.Markdown("プロンプトでGPT-ENGINEERを使ってシステムを作成し、GitHubにアップして自動化")
|
|
|
|
with gr.Row():
|
|
with gr.Column(scale=1):
|
|
gr.Markdown("## 📚 プロンプト一覧")
|
|
|
|
|
|
prompt_table = gr.Dataframe(
|
|
headers=["ID", "タイトル", "リポジトリ", "ステータス", "作成日時"],
|
|
datatype=["number", "str", "str", "str", "str"],
|
|
value=update_prompt_display(),
|
|
interactive=False
|
|
)
|
|
|
|
|
|
refresh_btn = gr.Button("🔄 一覧更新", variant="secondary")
|
|
|
|
|
|
gr.Markdown("## 💾 プロンプト保存")
|
|
with gr.Row():
|
|
save_title = gr.Textbox(label="タイトル", placeholder="プロンプトのタイトルを入力")
|
|
with gr.Row():
|
|
github_url_input = gr.Textbox(label="GitHub URL", placeholder="https://github.com/username/repository")
|
|
system_type_dropdown = gr.Dropdown(
|
|
choices=["general", "web_system", "api_system", "interface_system", "line_system"],
|
|
value="general",
|
|
label="システムタイプ"
|
|
)
|
|
with gr.Row():
|
|
save_btn = gr.Button("💾 保存", variant="primary")
|
|
save_result = gr.Textbox(label="保存結果", interactive=False)
|
|
|
|
with gr.Column(scale=2):
|
|
gr.Markdown("## ⚡ プロンプト実行・システム生成")
|
|
|
|
|
|
prompt_input = gr.Textbox(
|
|
label="プロンプト内容",
|
|
lines=12,
|
|
value=val,
|
|
placeholder="プロンプトを入力するか、左の一覧からクリックして選択してください"
|
|
)
|
|
|
|
with gr.Row():
|
|
selected_github_url = gr.Textbox(label="選択中のGitHub URL", interactive=False)
|
|
selected_system_type = gr.Textbox(label="システムタイプ", interactive=False)
|
|
|
|
with gr.Row():
|
|
folder_name = gr.Textbox(label="フォルダ名", value="generated_systems")
|
|
github_token = gr.Textbox(label="GitHub Token", value="***********************", type="password")
|
|
|
|
execute_btn = gr.Button("🚀 システム生成実行", variant="primary", size="lg")
|
|
|
|
with gr.Row():
|
|
auto_github_checkbox = gr.Checkbox(label="🔄 GitHub自動連携", value=True)
|
|
auto_integrate_checkbox = gr.Checkbox(label="🔧 Controller自動統合", value=True)
|
|
|
|
result_output = gr.Textbox(label="実行結果", lines=8, interactive=False)
|
|
|
|
gr.Markdown("## 📋 システム生成フロー")
|
|
gr.Markdown("""
|
|
1. **プロンプト入力** → GPT-ENGINEERでシステム生成
|
|
2. **GitHubアップ** → 指定リポジトリに自動プッシュ
|
|
3. **Controller自動認識** → 新しいRouterが自動で利用可能に
|
|
4. **Google Chat通知** → 生成完了をチームに通知
|
|
""")
|
|
|
|
|
|
prompt_table.select(
|
|
fn=load_prompt_to_textbox,
|
|
outputs=[prompt_input, selected_github_url, selected_system_type]
|
|
)
|
|
|
|
refresh_btn.click(
|
|
fn=update_prompt_display,
|
|
outputs=prompt_table
|
|
)
|
|
|
|
save_btn.click(
|
|
fn=lambda title, content, github_url, system_type: save_prompt(title, content, github_url, system_type),
|
|
inputs=[save_title, prompt_input, github_url_input, system_type_dropdown],
|
|
outputs=save_result
|
|
).then(
|
|
fn=update_prompt_display,
|
|
outputs=prompt_table
|
|
).then(
|
|
fn=lambda: ("", "", "general"),
|
|
outputs=[save_title, github_url_input, system_type_dropdown]
|
|
)
|
|
|
|
execute_btn.click(
|
|
fn=process_file_and_notify_enhanced,
|
|
inputs=[prompt_input, folder_name, github_token],
|
|
outputs=result_output
|
|
).then(
|
|
fn=update_prompt_display,
|
|
outputs=prompt_table
|
|
) |