HAGAKUREプログラミング塾 2025.08.17
画面共有は見えていますか?
音声ははっきりと聞こえていますか?
チャットはSlackの方でお願いします。
佐賀県産業スマート化センターさまのコミュニティ支援にて、
ZOOMの有料プランを提供いただき、利用させていただいております。
https://www.saga-smart.jp/
APIキーを安全に管理し、最小→環境変数→エラーハンドリング→ストリーミングまで体験する
PythonでOpenAI APIの基礎を一気に!
OpenAI Platform での手順
注意:APIキーは公開しない/ソース管理(Git等)にコミットしない
インストール(pip)
# bash pip install --upgrade openai python-dotenv
まずは直書きで動かす
from openai import OpenAI client = OpenAI(api_key="sk-xxxxx_your_key_here") response = client.responses.create( model="gpt-4o-mini", input="Write a short bedtime story about a unicorn." ) print(response.output_text)
.env の例
# .env OPENAI_API_KEY=sk-xxxxx_your_key_here OPENAI_MODEL=gpt-4o-mini
config.py
import os from dotenv import load_dotenv load_dotenv() API_KEY = os.environ.get("OPENAI_API_KEY") MODEL = os.environ.get("OPENAI_MODEL", "gpt-4o-mini") if not API_KEY: raise RuntimeError("環境変数 OPENAI_API_KEY が設定されていません。")
.env + config.py を利用
from openai import OpenAI from config import API_KEY, MODEL client = OpenAI(api_key=API_KEY) response = client.responses.create( model=MODEL, input="日本語で、このSDKの最短使用例を1行で説明して。" ) print(response.output_text)
from openai import OpenAI from openai import AuthenticationError, RateLimitError, APIConnectionError, APIStatusError from config import API_KEY, MODEL client = OpenAI(api_key=API_KEY) try: response = client.responses.create( model=MODEL, input="テスト" ) print(response.output_text) except AuthenticationError: print("認証エラー: APIキーを確認してください。") except RateLimitError: print("レート制限: しばらく待って再試行してください。") except APIConnectionError: print("接続エラー: ネットワークやDNSを確認してください。") except APIStatusError as e: print(f"APIステータスエラー: {e.status_code} {e.response}") except Exception as e: print(f"不明なエラー: {e}")
from openai import OpenAI from config import API_KEY, MODEL client = OpenAI(api_key=API_KEY) with client.responses.stream( model=MODEL, input="200文字で自己紹介をストリーム出力してください。" ) as stream: for event in stream: if event.type == "response.output_text.delta": print(event.delta, end="", flush=True) elif event.type == "response.error": print("\nError:", event.error) final = stream.get_final_response() print("\n---\nFinal:", final.output_text)
from openai import OpenAI from dataclasses import dataclass, field from typing import List, Dict class ChatSession: def __init__(self, client: OpenAI, model: str): self.client = client self.model = model self.messages: List[Dict[str, str]] = [] # {role, content} def send(self, user_input: str) -> str: self.messages.append({"role": "user", "content": user_input}) history_text = "\n".join(f"{m['role']}: {m['content']}" for m in self.messages) response = self.client.responses.create(model=self.model, input=history_text) assistant = response.output_text.strip() self.messages.append({"role": "assistant", "content": assistant}) return assistant # 使い方 from config import API_KEY, MODEL client = OpenAI(api_key=API_KEY) chat = ChatSession(client, MODEL) print(chat.send("自己紹介して")) print(chat.send("今の回答を短く3箇条で")) print(chat.send("最後に一言メッセージを"))
# 上の ChatSession を使って、対話CLIを実装 from openai import OpenAI from config import API_KEY, MODEL client = OpenAI(api_key=API_KEY) chat = ChatSession(client, MODEL) print("対話を開始します。終了は 'exit' または 'quit'。") while True: try: user_input = input("You> ").strip() except (EOFError, KeyboardInterrupt): print("\n終了します。") break if user_input.lower() in ("exit", "quit"): print("終了します。") break reply = chat.send(user_input) print("Assistant>", reply)