File size: 13,709 Bytes
7cd8277 |
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 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
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 duckdb
import gradio as gr
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
#from controllers.gra_04_database.rides import test_set_lide
import requests
import sqlite3
import os
from datetime import datetime
# データベース設定
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_prompts = [
("社員プロフィールシステム", "", val),
("FastAPI + SQLAlchemy", "", "FastAPIとSQLAlchemyを使用したAPIの作成\n- ユーザー管理\n- 認証機能\n- CRUD操作"),
("Gradio Interface", "", "Gradioインターフェースの作成\n- ファイルアップロード\n- チャット機能\n- データ表示"),
]
for title, url, content in default_prompts:
cursor.execute(
'INSERT INTO prompts (title, url, content) VALUES (?, ?, ?)',
(title, url, content)
)
conn.commit()
conn.close()
print("✅ プロンプトデータベース初期化完了")
except Exception as e:
print(f"❌ データベース初期化エラー: {e}")
def save_prompt(title: 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(), "", content.strip())
)
conn.commit()
conn.close()
print(f"✅ プロンプト保存: {title}")
return f"✅ プロンプト「{title}」を保存しました"
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, 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 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, created_at in prompts:
# 日時の表示を短くする
date_str = created_at[:16] if created_at else ""
table_data.append([prompt_id, title, 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):
result = process_nofile(*args, **kwargs)
send_to_google_chat(result)
# プロンプト実行後、内容をデータベースに保存
try:
prompt_content = args[0] if args else ""
if prompt_content.strip():
# 実行されたプロンプトのタイトルを生成(最初の行または最初の50文字)
title_lines = prompt_content.strip().split('\n')
title = title_lines[0][:50] if title_lines[0] else "実行されたプロンプト"
if title.startswith('#'):
title = title[1:].strip()
save_prompt(f"実行履歴: {title}", prompt_content)
except Exception as e:
print(f"実行履歴保存エラー: {e}")
return result
def load_prompt_to_textbox(evt: gr.SelectData):
"""テーブルクリック時にプロンプト内容をテキストボックスに読み込む"""
try:
if evt.index is not None and len(evt.index) >= 2:
# テーブルの行インデックスから prompt_id を取得
prompts = get_prompts()
if evt.index[0] < len(prompts):
prompt_id = prompts[evt.index[0]][0] # 最初の列がID
content = get_prompt_content(prompt_id)
return content
except Exception as e:
print(f"プロンプト読み込みエラー: {e}")
return ""
# データベース初期化
init_db()
with gr.Blocks() as gradio_interface:
gr.Markdown("# プロンプト管理システム")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("## 📚 プロンプト一覧")
# プロンプト一覧テーブル
prompt_table = gr.Dataframe(
headers=["ID", "タイトル", "作成日時"],
datatype=["number", "str", "str"],
value=update_prompt_display(),
interactive=False,
height=300
)
# 更新ボタン
refresh_btn = gr.Button("🔄 一覧更新", variant="secondary")
# プロンプト保存エリア
gr.Markdown("## 💾 プロンプト保存")
with gr.Row():
save_title = gr.Textbox(label="タイトル", placeholder="プロンプトのタイトルを入力")
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=15,
value=val,
placeholder="プロンプトを入力するか、左の一覧からクリックして選択してください"
)
with gr.Row():
folder_name = gr.Textbox(label="フォルダ名", value="test_folders")
github_token = gr.Textbox(label="GitHub Token", value="***********************", type="password")
execute_btn = gr.Button("🚀 実行", variant="primary", size="lg")
result_output = gr.Textbox(label="実行結果", lines=10, interactive=False)
# イベントハンドラー
prompt_table.select(
fn=load_prompt_to_textbox,
outputs=prompt_input
)
refresh_btn.click(
fn=update_prompt_display,
outputs=prompt_table
)
save_btn.click(
fn=lambda title, content: save_prompt(title, content),
inputs=[save_title, prompt_input],
outputs=save_result
).then(
fn=update_prompt_display,
outputs=prompt_table
).then(
fn=lambda: "",
outputs=save_title
)
execute_btn.click(
fn=process_file_and_notify,
inputs=[prompt_input, folder_name, github_token],
outputs=result_output
).then(
fn=update_prompt_display,
outputs=prompt_table
) |