環境
- python = 3.10
- nicegui = 1.3.13
- openai = 0.28.0
実装
NiceGUIで、上記の図のようにChatGPTの出力結果をStreamで表示するには、次のようにします。
from nicegui import ui
import openai
input_text = ui.input(label="入力")
result = ui.label()
async def generate(e):
input_text = e.sender.value
completion = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": input_text}],
max_tokens=100,
stream=True,
)
async for chunk in completion:
next = chunk['choices'][0]['delta'].get('content', '')
result.text += next
input_text.on("keydown.enter", generate)
ui.run()
NiceGUIは、非同期でイベントハンドラーを定義しないと表示の更新がブロックされてしまいます。ChatCompletion
で、create()
ではなくacreate()
を使い、stream=True
とすることで非同期ジェネレータで返却されるため、これを扱うことでストリームを表示できます。