結論から言うと 可能です。しかも、あなたの既存の geminis/ 構造に自然に追加できます。
いまの Flask 構成(controllers / templates / static)に index.py(Blueprint)+ page.html(テンプレート) を追加し、prompts/ フォルダ内の複数プロンプトファイルを GUI で択一選択 → Gemini に送信 という流れを作れます。


🎯 まず「何を作るか」を明確化

あなたが求めているのは次の 3 点です。

  1. GUI メニュー(トップページ)
    → index.py(Blueprint)+ page.html(テンプレート)

  2. prompts/ フォルダ内の複数ファイルを一覧表示
    → 例: prompts/prompt1.txt, prompts/prompt2.txt, …

  3. ユーザーが選んだプロンプトを Gemini に送る
    → 既存の gemini_controller に渡すだけで OK


📁 追加するファイル構造(提案)

geminis/
└── src
    ├── controllers
    │   ├── index_controller.py   ← 新規
    │   ├── prompt_controller.py
    │   ├── gemini_controller.py
    │   └── batch_controller.py
    ├── templates
    │   ├── page.html             ← 新規
    │   ├── base.html
    │   ├── prompt_input.html
    │   ├── batch_list.html
    │   └── batch_detail.html

✅ index_controller.py(新規 Blueprint)

# src/controllers/index_controller.py
import os
from flask import Blueprint, render_template, request, redirect, url_for

index_bp = Blueprint('index', __name__)

PROMPT_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "prompts")

@index_bp.route("/")
def index():
    # prompts フォルダ内のファイル一覧を取得
    files = [f for f in os.listdir(PROMPT_DIR) if f.endswith(".txt")]
    return render_template("page.html", files=files)

@index_bp.route("/select_prompt", methods=["POST"])
def select_prompt():
    filename = request.form.get("prompt_file")
    if not filename:
        return redirect(url_for("index.index"))

    # ファイル内容を読み込む
    filepath = os.path.join(PROMPT_DIR, filename)
    with open(filepath, "r", encoding="utf-8") as f:
        prompt_text = f.read()

    # prompt_controller に渡す(DB に保存 → gemini_controller に進む)
    from controllers.prompt_controller import save_prompt_text
    prompt_id = save_prompt_text(prompt_text)

    return redirect(url_for("gemini.call_gemini", prompt_id=prompt_id))

✅ page.html(新規 GUI メニュー)

{% extends "base.html" %}
{% block content %}

<h2>プロンプト選択メニュー</h2>

<form action="{{ url_for('index.select_prompt') }}" method="POST">
    <label>使用するプロンプトファイルを選択:</label><br><br>

    <select name="prompt_file" style="width: 300px; padding: 5px;">
        {% for f in files %}
            <option value="{{ f }}">{{ f }}</option>
        {% endfor %}
    </select>

    <br><br>
    <button type="submit">このプロンプトで Gemini を実行</button>
</form>

{% endblock %}

✅ prompt_controller.py に追加(DB 保存用)

あなたの既存コードに合わせて、関数として切り出すだけ

# src/controllers/prompt_controller.py
from db.db2 import get_db

def save_prompt_text(text):
    db = get_db()
    cursor = db.cursor()
    cursor.execute("INSERT INTO prompts (prompt_text) VALUES (%s)", (text,))
    db.commit()
    return cursor.lastrowid

✅ flask_server.py に Blueprint を登録

from controllers.index_controller import index_bp

app.register_blueprint(index_bp)

🎉 これでできること

  • / にアクセスすると プロンプト選択 GUI が表示される
  • prompts/ 内のファイルが自動で一覧化
  • 選んだプロンプトを DB に保存
  • そのまま /gemini/call/<prompt_id> に進み Gemini 実行
  • 既存の batch_list / batch_detail に自然に流れる

🔥 あなたの OS 設計思想にも合う理由

あなたの OS 設計は 「明確な境界」「フォルダ単位の責務」「選択 → 実行 → 保存の deterministic flow」 を重視している。

今回の追加はまさに:

  • prompts/ = データソース
  • index_controller = 選択 UI
  • prompt_controller = 保存
  • gemini_controller = 実行
  • batch_controller = 結果管理

という 完全に分離された deterministic pipeline になっている。


次の一手(あなたに選んでほしい)

どれを進めますか。

  1. 実際に動く完全版コード一式を生成(全ファイル)
  2. ページデザイン(CSS)を強化してメニューを美しくする
  3. プロンプトのプレビュー機能を追加する
  4. 複数プロンプトを結合して送る UI を作る
  5. プロンプトのカテゴリ分け(フォルダ分類)を導入する

どれを進めたいか教えてください。