|
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 |
|
|
|
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(): |
|
|
|
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: |
|
|
|
prompts = get_prompts() |
|
if evt.index[0] < len(prompts): |
|
prompt_id = prompts[evt.index[0]][0] |
|
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 |
|
) |