Spaces:
Sleeping
Sleeping
import streamlit as st | |
from llama_cpp import Llama | |
import os | |
import json | |
import time | |
# Function to convert message history to prompt | |
def prompt_from_messages(messages): | |
prompt = '' | |
for message in messages: | |
prompt += f"<|start_header_id|>{message['role']}<|end_header_id|>\n\n" | |
prompt += f"{message['content']}<|eot_id|>" | |
prompt = prompt[:-10] | |
return prompt | |
# Initialize the Llama model | |
llm = Llama.from_pretrained( | |
repo_id='gallen881/Llama-3-8B-Physics_Master-GGUF', | |
filename='unsloth.Q4_K_M.gguf', | |
n_ctx=2048, | |
verbose=False | |
) | |
# Set up Streamlit App Layout | |
st.title("Physics Master Chatbot") | |
st.markdown("Ask **Physics Master** any physics-related question.") | |
# Initialize chat history in session state | |
if 'messages' not in st.session_state: | |
st.session_state.messages = [ | |
{ | |
'role': 'system', | |
'content': 'You are a professional physics master. Answer physics questions directly without using any external resources.' | |
} | |
] | |
st.session_state.chat_time = time.time() | |
# Display chat history | |
for message in st.session_state.messages: | |
if message['role'] == 'user': | |
st.write(f"**You:** {message['content']}") | |
else: | |
st.write(f"**Physics Master:** {message['content']}") | |
# Use a form to manage user input and submission | |
with st.form(key="input_form", clear_on_submit=True): | |
user_input = st.text_input("Ask a question", key="user_input") | |
submit_button = st.form_submit_button(label="Send") | |
if submit_button and user_input: | |
# Append user message | |
user_message = {'role': 'user', 'content': user_input} | |
st.session_state.messages.append(user_message) | |
# Prepare to get the response from Physics Master | |
st.write('Physics Master is thinking...') | |
# Initialize an empty string to accumulate the response | |
full_response = "" | |
# Fetch response tokens and accumulate them | |
response = llm.create_chat_completion( | |
messages=st.session_state.messages, | |
stream=True | |
) | |
for chunk in response: | |
delta = chunk['choices'][0]['delta'] | |
if 'role' in delta: | |
st.session_state.messages.append({'role': delta['role'], 'content': ''}) | |
elif 'content' in delta: | |
token = delta['content'] | |
# Accumulate tokens into the full response | |
full_response += token | |
# Once the full response is received, append it to the chat history | |
st.session_state.messages[-1]['content'] = full_response | |
# Display the full response as a paragraph | |
st.write(f"**Physics Master:** {full_response}") | |
# Save the chat history to a JSON file | |
with open('chat_history.json', 'w', encoding='utf8') as file: | |
json.dump(st.session_state.messages, file, indent=4) | |