いまのままだと、毎回サイドバーでAPIキーを入力する必要があって少し面倒ですよね。
ここで、前のレッスンと同じ手順(環境変数 OPENAI_API_KEY
を読む)に揃え、サイドバーでの入力をやめるように直します。ライブラリの追加は不要です。
変更方針(最小差分)
os
をインポートget_openai_client()
を用意して、環境変数からキーを読み込む- OpenAIクライアントを作っている箇所を すべて
get_openai_client()
に統一 - サイドバーのAPIキー入力UIを削除
- 各ページで、環境変数が未設定なら警告を出す
差分(パッチ形式)
1) インポートと共通クライアント
+import os
import streamlit as st
from PyPDF2 import PdfReader
from openai import OpenAI
...
+# 前と同じ:環境変数から読む
+def get_openai_client():
+ return OpenAI(api_key=os.environ["OPENAI_API_KEY"])
2) OpenAIクライアントの呼び出しを統一
def create_embeddings(texts, api_key):
- client = OpenAI(api_key=api_key)
+ client = get_openai_client()
...
def answer_query(query, api_key, top_k=5, max_context_tokens=2000, temperature=0.2):
- client = OpenAI(api_key=api_key)
+ client = get_openai_client()
...
※ 関数引数
api_key
は互換のため残してOK(無視されます)。気になる場合は後で整理できます。
3) サイドバーのAPI入力UIを削除し、環境変数チェックに変更
def page_pdf_upload():
st.title("📄 PDF Upload")
st.markdown("""...""")
- # APIキーの入力(サイドバー)
- with st.sidebar:
- st.header("⚙️ 設定")
- api_key = st.text_input("OpenAI APIキー", type="password", placeholder="sk-...")
- if api_key:
- os.environ["OPENAI_API_KEY"] = api_key
- st.success("✅ APIキー設定完了")
- else:
- st.warning("⚠️ APIキーを入力してください")
+ # 環境変数に統一(未設定なら警告)
+ api_key_effective = os.getenv("OPENAI_API_KEY")
+ if not api_key_effective:
+ st.warning("⚠️ OPENAI_API_KEY が未設定です。下の『セットアップ方法』を参考に設定してください。")
st.markdown("---")
pdf_text = get_pdf_text()
- if pdf_text and api_key:
+ if pdf_text and os.getenv("OPENAI_API_KEY"):
...
- elif pdf_text and not api_key:
+ elif pdf_text and not os.getenv("OPENAI_API_KEY"):
st.warning("⚠️ OPENAI_API_KEY を設定してから実行してください")
「Ask My PDF(s)」ページも同様に、環境変数の有無だけを見ればOKです(既に os.getenv("OPENAI_API_KEY")
チェックがある場合はそのままでOK)。
セットアップ方法(ローカルで永続化)
サイドバーを無くしたので、一度設定すれば次回以降もずっと有効なやり方にします。お好みの方法を選んでください。
A. シェルに環境変数を設定(シンプルでおすすめ)
macOS / Linux(bash, zsh)
echo 'export OPENAI_API_KEY="sk-xxxxx"' >> ~/.zshrc # または ~/.bashrc
source ~/.zshrc
Windows PowerShell
[Environment]::SetEnvironmentVariable("OPENAI_API_KEY","sk-xxxxx","User")
# 新しいPowerShellで streamlit run app.py
B. Streamlit の Secrets(ローカルでも可)
.streamlit/secrets.toml
をプロジェクト直下に作成(Gitにはコミットしない)
OPENAI_API_KEY = "sk-xxxxx"
起動時に次の1行をどこか早い段階で実行して環境変数へ反映しておくやり方もあります(任意):
import os, streamlit as st
os.environ.setdefault("OPENAI_API_KEY", st.secrets["OPENAI_API_KEY"])
将来、Streamlit Cloud へデプロイする際は「Advanced settings → Environment variables」で
OPENAI_API_KEY
を設定するだけ。コードはそのまま使えます。
これで何が変わる?
- ✅ 毎回の手入力なし:一度環境変数を設定すれば、次からはそのまま動きます
- ✅ デプロイと同じ方式:本番も
OPENAI_API_KEY
を設定するだけ - ✅ ライブラリ追加なし:前と同じやり方のまま