PythonとOpenAI APIでお祝いアプリを作ろう!-streamlit 実装
これを、streamlit cloud で実装しよう。(初チャレンジ)
1. chatGPTによるコーディング
notebookをコピペして、chatGPTにstramlitのコードを書いてもらった。
Streamlitアプリコード
必要なライブラリをインストール
Streamlitアプリを実装
まず、必要なライブラリをインストールします。
Streamlitアプリコード
必要なライブラリをインストール
Streamlitアプリを実装
まず、必要なライブラリをインストールします。
次に、以下のコードを app.py などのファイルに保存して、Streamlitアプリを実行してください。
import streamlit as st
from datetime import datetime
import openai
import random
# OpenAI API Key
openai.api_key = st.secrets["OPENAI_API_KEY"]
# チャット関数の定義
def chat(message):
response = openai.ChatCompletion.create(
model="gpt-4", # モデルは適宜調整
messages=[
{
"role": "user",
"content": message
}
],
temperature=1,
max_tokens=200,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
return response.choices[0].message["content"]
# アプリのレイアウト
st.title("🎉 誕生日お祝いアプリ 🎉")
st.write("あなたの誕生日から今日までの日数を計算し、お祝いメッセージを送ります。")
# 誕生日の入力
birthday_input = st.text_input("誕生日をYYYY-MM-DD形式で入力してください:")
# 日数計算とお祝いメッセージ生成
if birthday_input:
try:
birthday_date = datetime.strptime(birthday_input, "%Y-%m-%d")
today = datetime.now()
days_since_birth = (today - birthday_date).days
# メッセージスタイルと引用の選択
styles = {
"1": "丁寧なアナウンサー",
"2": "大阪のおばちゃん",
"3": "体育会系熱血先生",
"4": "プロレスアナウンサー",
"5": "田舎のおばあちゃん"
}
quotes = {
"1": "聖書",
"2": "日本のことわざ、慣用句",
"3": "中国の古典",
"4": "古今東西の名言",
"5": "歌詞の一フレーズ"
}
style_choice = styles[str(random.randint(1, 5))]
quote_choice = quotes[str(random.randint(1, 5))]
# お祝いメッセージの生成
message = f"今日は、私が生まれてから{days_since_birth}日目です。{quote_choice}を引用して、{style_choice}の口調でお祝いしてください!"
celebration_message = chat(message)
# 出力
st.write(f"**誕生日から今日までの日数:** {days_since_birth}日")
st.write("🎉 お祝いメッセージ 🎉")
st.write(celebration_message)
except ValueError:
st.error("日付の形式が正しくありません。YYYY-MM-DD形式で入力してください。")
実行手順
このコードを app.py として保存します。
ターミナルまたはコマンドラインで以下のコマンドを実行してアプリを起動します。
streamlit run app.py
2. 初めてのデプロイ、試行錯誤のメモ
さて、streamlit cloud で初めてアプリをデプロイするので、chatGPTに手順を教えてもらい、助けてもらいながら、助けてもらえないところは自力で試行錯誤して、デプロイした。
ローカルで動作確認したら動かない-1
ローカルで動かしてみたら、chatのところで、エラーになった。chatGPTが書いたコードは、古いAPIバージョンのコードだったので、現状のAPIのコードに書き直した。
ローカルで動作確認したら動かない-2
次は、api key が正しくないというエラーが出た。
.streamlit/secrets.tomlに以下のように記述して、
[openai]
OPENAI_API_KEY = "I have my api key here"
このようにkeyを読み出したんだけど、うまくいかない。
openai_api_key = st.secrets["OPENAI_API_KEY"]
chatGPTに聞いても、解消できなかったので、web検索で対応を見つけた。
secret.tomlの書き方と、st.secretsの呼び出し方が合っていないことがわかった。secret.tomlを修正、[openai]を削除。
参考した投稿(感謝)
GitHubのリポリトジトリでコンフリクト
なんとかローカルで動いた(ちょっと感動)ので、streamlit cloudでデプロイするために、GitHubにrイポリトジを作って、コード類をプッシュしよう。
で、プッシュしたら、コンフリクトで、プッシュできなかった。
chatGPTに聞きながら、あれこれやったけど、GitHubにリポリトジを作るときに、readmeを作る設定にしたのが原因のようだったので、readmeなしで再作成して、再度プッシュ。
うまく行った!!
streamlitクラウドに登録して実行したらエラー
いよいよ、streamlitクラウドに、作成したGitHubのリポリトジを登録して、アプリを起動。
したら、pipでエラーになった。
依存関係に問題があるようだ。
chatGPT に聞いて試行錯誤しても解決しない。
requirements.txtに、
openai
streamlit
のパッケージのバージョン指定していたのだけど、それが良くないのかと思い、消してみたら、うまく行った。
streamlit cloudを使うときは、バージョン指定すると、streamlit cloud 内ので依存関係に問題が起こるのだと思う。
3. デプロイしたコード
import streamlit as st
from datetime import datetime
from openai import OpenAI
import random
# OpenAI API Key
openai_api_key = st.secrets["OPENAI_API_KEY"]
client = OpenAI(api_key=openai_api_key)
# チャット関数の定義
def chat(message):
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": message
}
]
}
],
temperature=1,
max_tokens=200,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
response_format={
"type": "text"
}
)
return response.choices[0].message.content
# アプリのレイアウト
st.title("🎉 誕生日お祝いアプリ 🎉")
st.write("あなたの誕生日から今日までの日数を計算し、お祝いメッセージを送ります。")
# 誕生日の入力
birthday_input = st.text_input("誕生日をYYYY-MM-DD形式で入力してください:")
# 日数計算とお祝いメッセージ生成
if birthday_input:
try:
birthday_date = datetime.strptime(birthday_input, "%Y-%m-%d")
today = datetime.now()
days_since_birth = (today - birthday_date).days
# メッセージスタイルと引用の選択
styles = {
"1": "丁寧なアナウンサー",
"2": "大阪のおばちゃん",
"3": "体育会系熱血先生",
"4": "プロレスアナウンサー",
"5": "田舎のおばあちゃん"
}
quotes = {
"1": "聖書",
"2": "日本のことわざ、慣用句",
"3": "中国の古典",
"4": "古今東西の名言",
"5": "歌詞の一フレーズ"
}
style_choice = styles[str(random.randint(1, 5))]
quote_choice = quotes[str(random.randint(1, 5))]
# お祝いメッセージの生成
message = f"今日は、私が生まれてから{days_since_birth}日目です。{quote_choice}を引用して、\
{style_choice}の口調で、心に染み渡る、短めのメッセージでお祝いしてください!"
celebration_message = chat(message)
# 出力
st.write(f"**誕生日から今日までの日数:** {days_since_birth}日")
st.write("🎉 お祝いメッセージ 🎉")
st.write(celebration_message)
except ValueError:
st.error("日付の形式が正しくありません。YYYY-MM-DD形式で入力してください。")
アプリへのリンク
初めてなので、あれこれ時間がかかりましたが、ようやくできました。
アプリのリンクです。
よかったら動かしてみてください。