Spaces:
Sleeping
Sleeping
import gradio as gr | |
from groq import Groq | |
import os | |
api_key = os.getenv("KnowledgeQuest") | |
# Initialize the Groq client with the API key | |
client = Groq(api_key= api_key) | |
# List to maintain the conversation history, starting with a default prompt | |
conversation_history = [ | |
{"role": "system", "content": "You are an experienced fact-checker and facts curator with over 30 years of experience in gathering and verifying facts. You will present a fact/claim and ask the user to verify if it is true or false. The fact or false claim must be concise and you will award points for each correct answer."} | |
] | |
# Function to count tokens (approximation) | |
def count_tokens(messages): | |
return sum(len(message["content"].split()) for message in messages) | |
# Function to get the initial LLM output and start the conversation | |
def start_trivia_game(): | |
# Initial message to start the game | |
initial_message = "You will present a fact or false claim randomly and ask me to verify if it is true or false. The fact or false claim must be concise. On inputing stop, show the total score and percentage score concisely. Let the question be a mix of facts and false claims randomly presented." | |
# Add the initial message to the conversation history | |
conversation_history.append({"role": "user", "content": initial_message}) | |
# Get completion from the LLM for the initial question | |
completion = client.chat.completions.create( | |
model="llama-3.1-70b-versatile", | |
messages=conversation_history, | |
temperature=0.6, | |
max_tokens=8000, | |
top_p=1, | |
stream=True, | |
stop=None, | |
) | |
llm_output = "" | |
for chunk in completion: | |
llm_output += chunk.choices[0].delta.content or "" | |
# Add the assistant's response to the conversation history | |
conversation_history.append({"role": "assistant", "content": llm_output}) | |
return llm_output | |
# Function to handle user response and continue the conversation | |
def continue_trivia_game(user_response): | |
# Add user's response to the conversation history | |
conversation_history.append({"role": "user", "content": user_response}) | |
# Token limit management | |
max_tokens = 2048 # Maximum token limit for the LLM (example value) | |
current_tokens = count_tokens(conversation_history) | |
while current_tokens > max_tokens: | |
# Remove the oldest user-assistant pair | |
if len(conversation_history) > 2: | |
conversation_history.pop(1) # Removing the second item as the first is the system message | |
conversation_history.pop(1) # Remove the corresponding assistant response | |
current_tokens = count_tokens(conversation_history) | |
# Get completion from the LLM for the user's response | |
try: | |
completion = client.chat.completions.create( | |
model="llama-3.1-70b-versatile", | |
messages=conversation_history, | |
temperature=0.6, | |
max_tokens=8000, | |
top_p=1, | |
stream=True, | |
stop=None, | |
) | |
llm_output = "" | |
for chunk in completion: | |
llm_output += chunk.choices[0].delta.content or "" | |
# Add the assistant's response to the conversation history | |
conversation_history.append({"role": "assistant", "content": llm_output}) | |
return llm_output | |
except Exception as e: | |
# Check for specific rate limit error | |
if "rate_limit_exceeded" in str(e): | |
return "You've reached the maximum number of requests. Please wait a few minutes before trying again." | |
else: | |
return f"An error occurred Try again in 10 minutes: {str(e)}" | |
# Start the game and get the initial LLM output | |
initial_output = start_trivia_game() | |
# Using gr.Blocks to create the interface | |
with gr.Blocks() as demo: | |
# Title and Description | |
gr.Markdown("# Knowledge Quest\nA trivia game to test your knowledge by verifying if the given claims are true or false. Points are awarded for each correct answer. Type 'Stop' to end the game and see your score. Bored of this? Type: Start a new game and the system will initiate a new facts-based game") | |
# LLM Output Textbox | |
llm_output = gr.Textbox(label="LLM Output", placeholder="", lines=10, value=initial_output) | |
# User Response Textbox | |
user_response = gr.Textbox(label="Your Response", placeholder="Type your response here", lines=3) | |
# Button to submit the user's response and update the LLM output | |
submit_button = gr.Button("Submit") | |
# Function to update the LLM output upon submission | |
def update_llm_output(user_input): | |
return continue_trivia_game(user_input) | |
# Define interactions | |
submit_button.click(fn=update_llm_output, inputs=user_response, outputs=llm_output) | |
# Launch the Gradio app | |
demo.launch() | |