見出し画像

ChatGPTにo3-miniが来たのでSlackアプリを一発だししてもらって完成した

慣れ親しんだSlackアプリですが、最近あんまり作れていないのでせっかくだしということでやってみました。
結論から言うと、結構難しいです。一発だしはほぼ出来るとは言えるのですが、一発だしに至るまでに何度もプロンプトを改良しています
なんかちょっとウケるよね。
これも、今まで言ってきたようなAIに合わせるって奴なのでしょう。結局のところ6hはかけてると思う。初学者が一発だし出来るかというと無理だと思う。

何が難しいのか

今回はChatGPTから使った。APIだとお金かかっちゃうしね。
そうするとコピペする羽目になるのである。これまで何度か生成AIを使ったプログラミングにチャレンジしているのだけど、このコピペでミスるということが少なくない。Pythonの場合は特にインデントが大事だったりするので、修正部分だけペースとしていけるかっていうと微妙なのだ。
そういう特性もあって、今回は毎回修正ファイルは全部出力させてまるっとコピーするようにしてある。
これはCursor使ったりCline使ったりすることによって不要になる部分ではあるのだが、一旦は全出力に振った

プロンプト

実際に使ったプロンプトは以下の通り

Slackアプリを作りたい
Slack上で2名以上が参加する対戦ゲーム
1. トリビアバトル
概要:
Slack Botが出題するクイズに、参加者がリアルタイムで回答して競い合うゲームです。

特徴・仕組み:
- 問題出題:
	-- Botがチャンネルまたは専用ゲームルームで、複数選択肢のトリビア問題を投稿します。
	-- クイズについてはOpenAI APIを使って作成し、出力するように変更してください
		--- APIキーは環境変数に登録する形で構いません
		--- モデルはgpt-4o-miniをつかってください

以下の条件でコードを書いてください
- Webソケットは使わないで実装すること
- アプリはHeroku上にデプロイすることを前提で実装すること
- Bolt for Pythonを使って実装すること
- インストール後のトークン等の保存についてはBolt for Pythonの標準に従ってください
- DBはPostgreSQLを利用します
- ORMはSQLAlchemyを利用
- Flaskを使って稼働させる
	-- DBはFlask-Migrateをつかってマイグレーションする
	-- DB名はtrivia
	-- DBのURLが書かれた環境変数名はDATABASE_URLではなくSQLALCHEMY_DATABASE_URIを使うこと
- Pythonのバージョンは3.13.0
- アプリの挙動について
 -- アプリをインストールしたら、チャンネルにアプリを追加する
 -- アプリに誰かがメンションすると、トリビアバトルを開始します!という言葉といくつかのボタンを表示する
 	--- ボタンには、トリビアのテーマを4つ考えて表示してください
 -- 以降の問題提出/答えの紹介などは最初にメンションされたスレッドで進行してください
 -- テーマ選択ボタンを押したあとにアプリがクイズを出します
  --- クイズの答えは4択にして、参加者はボタンを押す
  --- 基本的に早押しだが、不正解の場合は続行
  --- 正解者が出たタイミングで締め切りと答えの説明を出す
  --- 回答が終わったタイミングで、それまでの回答履歴の集計結果も出す
   ---- 次の問題をスタートするボタンと終了ボタンも同時に出す
  --- 正解者のポイントを積算しておく
  --- お手つきした場合はマイナスポイントをつける
 -- アプリのホーム画面(app_home_opened)を開いた時にこれまでのゲームの履歴が確認できるような機能を実装してください
 	--- htmlで実装するのではなく、Slackアプリのホーム画面を開いたときに実行されるものです
 		---- app_home_openedイベントが呼ばれます
 	--- ゲームが開催されたチャンネル、日時、勝者のリストで、詳細ボタンを押すとモーダルで参加者一覧およびポイントが表示されるようなイメージです
- よりゲームが盛り上がるような実装アイデアがあればそれを含めてもらって構いません
- Slackアプリが必要とするSCOPEを実装のアイデアに合わせて適切に設定してください
	-- アプリのインストール時に必要となるはずなので、それは環境変数にいれる前提でコードを書いてください
- SlackのメッセージにはblocksというJSONで定義されます
	- action_idはJSON全体を通して一意である必要があることに注意してください
- actionなどの受け取り方のコツ
	-- action_idに、プリフィクスを付けて、その後ろに独自名をつけるような書き方をします
	-- そういった際に、アクションを受け取るエンドポイントはこのように書いてください
		--- @bolt_app.action(re.compile(r"^select_theme_"))



各ユーザーが自分のワークスペースにインストールするSlackアプリを設計する場合はこのようなパラメータが必要になります。これに準じてください
SLACK_BOT_TOKENは、ワークスペースにインストールした際にslack_installationsというテーブルに格納されるものを使うようになります

client_id, client_secret, signing_secret = (
    os.environ["SLACK_CLIENT_ID"],
    os.environ["SLACK_CLIENT_SECRET"],
    os.environ["SLACK_SIGNING_SECRET"],
)

- SQLAlchemyを使ったOAuthアプリの実装例はこちらを参照
"""
import logging

logging.basicConfig(level=logging.DEBUG)
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)

import os
from slack_bolt import App
from slack_bolt.adapter.flask import SlackRequestHandler
from slack_bolt.oauth.oauth_settings import OAuthSettings
from slack_sdk.oauth.installation_store.sqlalchemy import SQLAlchemyInstallationStore
from slack_sdk.oauth.state_store.sqlalchemy import SQLAlchemyOAuthStateStore

import sqlalchemy
from sqlalchemy.engine import Engine

database_url = "sqlite:///slackapp.db"
# database_url = "postgresql://localhost/slackapp"  # pip install psycopg2

logger = logging.getLogger(__name__)
client_id, client_secret, signing_secret = (
    os.environ["SLACK_CLIENT_ID"],
    os.environ["SLACK_CLIENT_SECRET"],
    os.environ["SLACK_SIGNING_SECRET"],
)

engine: Engine = sqlalchemy.create_engine(database_url)
installation_store = SQLAlchemyInstallationStore(
    client_id=client_id,
    engine=engine,
    logger=logger,
)
oauth_state_store = SQLAlchemyOAuthStateStore(
    expiration_seconds=120,
    engine=engine,
    logger=logger,
)

try:
    engine.execute("select count(*) from slack_bots")
except Exception as e:
    installation_store.metadata.create_all(engine)
    oauth_state_store.metadata.create_all(engine)

app = App(
    logger=logger,
    signing_secret=signing_secret,
    installation_store=installation_store,
    oauth_settings=OAuthSettings(
        client_id=client_id,
        client_secret=client_secret,
        state_store=oauth_state_store,
    ),
)


@app.event("app_mention")
def handle_command(say):
    say("Hi!")


from flask import Flask, request

flask_app = Flask(__name__)
handler = SlackRequestHandler(app)


@flask_app.route("/slack/events", methods=["POST"])
def slack_events():
    return handler.handle(request)


@flask_app.route("/slack/install", methods=["GET"])
def install():
    return handler.handle(request)


@flask_app.route("/slack/oauth_redirect", methods=["GET"])
def oauth_redirect():
    return handler.handle(request)


# pip install -r requirements.txt

# # -- OAuth flow -- #
# export SLACK_SIGNING_SECRET=***
# export SLACK_BOT_TOKEN=xoxb-***
# export SLACK_CLIENT_ID=111.111
# export SLACK_CLIENT_SECRET=***
# export SLACK_SCOPES=app_mentions:read,chat:write

# FLASK_APP=oauth_app.py FLASK_ENV=development flask run -p 3000
"""

- 出力するときは、ファイル構造を表すツリーを必ず出してください
- ファイルは必ず完全なコードとして出力してください
- デプロイ手順を解説してください
	-- その際に、models.pyで設定したテーブルが作られるように最初の手順も示してください
	-- Bolt for Pythonも以下のinit slack boltの形でDBにテーブルを追加します。これとも整合性をとるようにしてください
	-- flask db init で以下のエラーが出ないようにしてください
		--- Error: No such command 'db'.

``` init slack bolt
with engine.connect() as connection:
    try:
        connection.execute("select count(*) from slack_bots")
    except Exception as e:
        installation_store.metadata.create_all(engine)
        oauth_state_store.metadata.create_all(engine)
```

OpenAI APIの使い方のサンプルはこちらです
新しいライブラリのバージョンで呼び出し方が変わっているので注意してください
"""
from openai import OpenAI 
import os

## Set the API key and model name
MODEL="gpt-4o-mini"
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))

completion = client.chat.completions.create(
  model=MODEL,
  messages=[
    {"role": "system", "content": "You are a helpful assistant. Help me with my math homework!"}, # <-- This is the system message that provides context to the model
    {"role": "user", "content": "Hello! Could you solve 2+2?"}  # <-- This is the user message for which the model will generate a response
  ]
)

print("Assistant: " + completion.choices[0].message.content)
"""

	
以上です
Bolt for pythonについてわからない場合は検索してもらって構いません

こんな感じにした
一応検索もONにしてあるのだが、これだけ長いと検索はしてないぽいので、直接参考コードをプロンプトに入れたほうが効果が高そうだ

どんなアプリ?

挙動はこんなかんじです

メンションするとアプリが反応し、テーマを選択するとクイズをだしてくれます。一人でやるというよりは、みんなでやる形のアプリです。

インストールはこちらから

無料でご利用可能です。
個人情報などの取得は全くありませんので、遊んでやってくださいまし。
OpenAIのAPIキーは弊社提供となってます

いいなと思ったら応援しよう!

George Yoshida/吉田丈治
noteにはこれまでの経験を綴っていこうかと思います。サポートによって思い出すモチベーションが上がるかもしれない。いや、上がるはずです。