mirror of
https://github.com/QuivrHQ/quivr.git
synced 2024-12-16 01:55:15 +03:00
64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
|
import tempfile
|
||
|
|
||
|
import chainlit as cl
|
||
|
from quivr_core import Brain
|
||
|
|
||
|
|
||
|
@cl.on_chat_start
|
||
|
async def on_chat_start():
|
||
|
files = None
|
||
|
|
||
|
# Wait for the user to upload a file
|
||
|
while files is None:
|
||
|
files = await cl.AskFileMessage(
|
||
|
content="Please upload a text .txt file to begin!",
|
||
|
accept=["text/plain"],
|
||
|
max_size_mb=20,
|
||
|
timeout=180,
|
||
|
).send()
|
||
|
|
||
|
file = files[0]
|
||
|
|
||
|
msg = cl.Message(content=f"Processing `{file.name}`...", disable_feedback=True)
|
||
|
await msg.send()
|
||
|
|
||
|
with open(file.path, "r", encoding="utf-8") as f:
|
||
|
text = f.read()
|
||
|
|
||
|
with tempfile.NamedTemporaryFile(
|
||
|
mode="w", suffix=".txt", delete=False
|
||
|
) as temp_file:
|
||
|
temp_file.write(text)
|
||
|
temp_file.flush()
|
||
|
temp_file_path = temp_file.name
|
||
|
|
||
|
brain = Brain.from_files(name="user_brain", file_paths=[temp_file_path])
|
||
|
|
||
|
# Store the file path in the session
|
||
|
cl.user_session.set("file_path", temp_file_path)
|
||
|
|
||
|
# Let the user know that the system is ready
|
||
|
msg.content = f"Processing `{file.name}` done. You can now ask questions!"
|
||
|
await msg.update()
|
||
|
|
||
|
cl.user_session.set("brain", brain)
|
||
|
|
||
|
|
||
|
@cl.on_message
|
||
|
async def main(message: cl.Message):
|
||
|
brain = cl.user_session.get("brain") # type: Brain
|
||
|
|
||
|
if brain is None:
|
||
|
await cl.Message(content="Please upload a file first.").send()
|
||
|
return
|
||
|
|
||
|
# Prepare the message for streaming
|
||
|
msg = cl.Message(content="")
|
||
|
await msg.send()
|
||
|
|
||
|
# Use the ask_stream method for streaming responses
|
||
|
async for chunk in brain.ask_streaming(message.content):
|
||
|
await msg.stream_token(chunk.answer)
|
||
|
|
||
|
await msg.send()
|