[メモ]ChatGPT APIを使用してPythonでStream出力する方法
async with aiohttp.ClientSession() as session:
async with session.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data) as response:
if response.status == 200:
result_area = st.empty()
generated_text = ""
async for chunk in response.content.iter_chunked(1024):
chunk = chunk.decode('utf-8')
lines = chunk.split('\n')
for line in lines:
if line.strip() == "":
continue
if line.startswith("data:"):
try:
data = json.loads(line[5:])
if data["choices"][0]["finish_reason"] is None:
delta = data["choices"][0]["delta"].get("content", "")
generated_text += delta
result_area.markdown(generated_text)
else:
break
except json.JSONDecodeError as e:
print(f"JSONDecodeError: {e}")
continue
return generated_text
else:
raise Exception(f"API request failed with status code {response.status}: {await response.text()}")
このコードは、非同期HTTP POSTリクエストを使用してOpenAIのAPIにアクセスし、応答を受け取って処理するPythonスクリプトの一部です。具体的には、以下の処理を行っています:
1. aiohttp.ClientSession()を使用して非同期HTTPセッションを開始します。
2. session.post()を使用して、指定されたURL(https://api.openai.com/v1/chat/completions)に対してPOSTリクエストを送信します。このリクエストには、ヘッダーとJSON形式のデータが含まれます。
3. 応答ステータスが200(成功)の場合、応答の内容を非同期に読み取り、処理します。
応答から受け取ったデータはチャンク(1024バイト単位)で処理され、デコードされてJSONオブジェクトに変換されます。
JSONオブジェクトから特定のデータ(data["choices"][0]["delta"].get("content", ""))を抽出し、それをgenerated_textに追加しています。
このデータは、result_area.markdown(generated_text)を使用してマークダウン形式で表示されます。
4. すべてのデータが処理された後、generated_textが返されます。
5. 応答ステータスが200以外の場合、エラーが発生したことを示す例外が発生します。
このコードは、OpenAIのAPIから非同期にデータを取得し、そのデータを処理してユーザーに表示するために使用されます。