| # Chatbot / Events/ Stop | |
| # Use this card for chatbot interactions. Streaming can be stopped by the user. | |
| # #chatbot #events #stop | |
| # --- | |
| from h2o_wave import main, app, Q, ui, data | |
| import asyncio | |
| async def stream_message(q): | |
| stream = '' | |
| q.page['example'].data += [stream, False] | |
| # Show the "Stop generating" button | |
| q.page['example'].generating = True | |
| for w in 'I am a fake chatbot. Sorry, I cannot help you.'.split(): | |
| await asyncio.sleep(0.3) | |
| stream += w + ' ' | |
| q.page['example'].data[-1] = [stream, False] | |
| await q.page.save() | |
| # Hide the "Stop generating" button | |
| q.page['example'].generating = False | |
| await q.page.save() | |
| async def serve(q: Q): | |
| if not q.client.initialized: | |
| q.page['example'] = ui.chatbot_card( | |
| box='1 1 5 5', | |
| data=data(fields='content from_user', t='list'), | |
| name='chatbot', | |
| events=['stop'] | |
| ) | |
| q.client.initialized = True | |
| # Handle the stop event. | |
| if q.events.chatbot and q.events.chatbot.stop: | |
| # Cancel the streaming task. | |
| q.client.task.cancel() | |
| # Hide the "Stop generating" button. | |
| q.page['example'].generating = False | |
| # A new message arrived. | |
| elif q.args.chatbot: | |
| # Append user message. | |
| q.page['example'].data += [q.args.chatbot, True] | |
| # Run the streaming within cancelable asyncio task. | |
| q.client.task = asyncio.create_task(stream_message(q)) | |
| await q.page.save() | |