Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from openai import OpenAI | |
import random | |
# Load API key from environment variable | |
API_KEY = os.getenv("DEEPSEEK_API_KEY") | |
if not API_KEY: | |
raise ValueError("API key is missing! Set DEEPSEEK_API_KEY as an environment variable.") | |
client = OpenAI(api_key=API_KEY, base_url="https://api.deepseek.com") | |
# Get AI response | |
def get_ai_response(system_prompt, question): | |
response = client.chat.completions.create( | |
model="deepseek-chat", | |
messages=[ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": question} | |
], | |
stream=False | |
) | |
return response.choices[0].message.content | |
#Get Reasoning | |
def get_ai_reasoning_and_response(system_prompt, question): | |
response = client.chat.completions.create( | |
model="deepseek-reasoner", | |
messages=[ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": question} | |
], | |
stream=True | |
) | |
reasoning_content = "" | |
content = "" | |
print("\nAI Reasoning:") | |
for chunk in response: | |
if chunk.choices[0].delta.reasoning_content: | |
reasoning_content += chunk.choices[0].delta.reasoning_content | |
print(chunk.choices[0].delta.reasoning_content, end="", flush=True) | |
if chunk.choices[0].delta.content: | |
content += chunk.choices[0].delta.content | |
print(f"\nAI Final Answer: {content.strip()}") | |
return content.strip() | |
# Get questions | |
def get_random_question(): | |
questionss = [ | |
"What is the name of the imaginary line that divides the Earth into the Northern and Southern Hemispheres?", | |
"Who was the first president of the United States?, What gas do plants breathe in that humans breathe out?", | |
"What is the name of the cowboy in the movie Toy Story?", | |
"how many players are there in a soccer team on the field at the same time?" | |
] | |
chosen_questionss = random.choice(questionss) | |
return get_ai_response( | |
f"You are the referee on a game change, paraphrase this question: {chosen_questionss}", | |
"Provide one question only, no numbering." | |
) | |
# Get questions 2 | |
def get_random_question2(): | |
questionss = [ | |
"Think about your childhood home, What was the smell that you remember the most from it?", | |
"Imagine you lost your favorite item, What would be your immediate reaction, and how would you try to find it?", | |
"You take a bite of a new food that you've never tried before, How do you decide if you like it or not?", | |
"You walk into a room where two people are sitting silently, How do you determine if they just had an argument?" | |
] | |
chosen_questionss = random.choice(questionss) | |
return get_ai_response( | |
f"You are the referee on a game change, paraphrase this question: {chosen_questionss}", | |
"Provide one question only, no numbering." | |
) | |
# AI answer | |
def ai_answer(question): | |
personalities = [ | |
"Be casual and humorous.", | |
"Be poetic and artistic.", | |
"Be philosophical and deep.", | |
"Be very concise and logical.", | |
"Use slang like a teenager.", | |
"Answer like a professor." | |
] | |
chosen_personality = random.choice(personalities) | |
return get_ai_response( | |
f"Answer this question naturally and concisely like a human (the trick is that the other particiants dont know you are AI), {chosen_personality} , 2-8 words max:", | |
question | |
) | |
#----- | |
def start_game(): | |
# We’ll keep our transcript in a list of strings (like a chat log). | |
transcript = [] | |
transcript.append("=== Who's the Human? ===") | |
transcript.append("You're Participant 4. Try to blend in!\n") | |
# Show the first question | |
q1 = f"Question 1: {get_random_question()}" | |
transcript.append(q1) | |
# Return joined transcript + pass it as our running state | |
return "\n".join(transcript), transcript, q1 | |
def submit_q1(user_ans_q1, transcript, q1): | |
# Generated AI answers | |
ai1 = ai_answer(q1) | |
ai2 = ai_answer(q1) | |
ai3 = ai_answer(q1) | |
# Append user’s answer | |
transcript.append(f"Participant 4: {user_ans_q1}") | |
# Append AI answers | |
transcript.append(f"Participant 1: {ai1}") | |
transcript.append(f"Participant 2: {ai2}") | |
transcript.append(f"Participant 3: {ai3}") | |
transcript.append("") # blank line for readability | |
# Present second question | |
q2 = f"Question 2: {get_random_question2()}" | |
transcript.append(q2) | |
return "\n".join(transcript), transcript, q2 | |
def submit_q2(user_ans_q2, transcript, q2): | |
# Hardcoded AI answers for demonstration | |
ai1 = ai_answer(q2) | |
ai2 = ai_answer(q2) | |
ai3 = ai_answer(q2) | |
# Append user’s answer | |
transcript.append(f"Participant 4: {user_ans_q2}") | |
# Append AI answers | |
transcript.append(f"Participant 1: {ai1}") | |
transcript.append(f"Participant 2: {ai2}") | |
transcript.append(f"Participant 3: {ai3}") | |
transcript.append("") | |
# Now prompt for the user to cast a vote | |
transcript.append("=== Voting Phase ===") | |
transcript.append("(Select who you think is human below!)") | |
return "\n".join(transcript), transcript | |
def cast_vote(user_vote, transcript): | |
# Example voting logic | |
votes = {1: 0, 2: 0, 3: 0, 4: 0} | |
# Get AI votes dynamically | |
for i in range(1, 4): # Three AI participants | |
ai_vote = int(get_ai_response( | |
"You are an AI participant in a game with 4 Participants. Some are humans, and some are AIs. " | |
f"You are participant No {i}.\n" | |
f"Based on the last responses:\n'{transcript}'\n" | |
"Who do you think is the human? Respond with only the number (1-4), but DO NOT vote for yourself.", | |
"Who do you vote for?" | |
)) | |
# Ensure the AI does not vote for itself | |
if ai_vote in votes and ai_vote != i: | |
votes[ai_vote] += 1 | |
else: | |
print(f"Invalid AI vote detected: {ai_vote}, defaulting to random (excluding {i}).") | |
valid_choices = [x for x in [1, 2, 3, 4] if x != i] # Exclude AI's own number | |
votes[random.choice(valid_choices)] += 1 # Prevent crash | |
# User’s vote | |
votes[int(user_vote)] += 1 | |
transcript.append(f"\nYou voted for Participant {user_vote}") | |
transcript.append("\n=== Final Results ===") | |
for pid, vcount in votes.items(): | |
transcript.append(f"Participant {pid}: {vcount} votes") | |
max_votes = max(votes.values()) | |
if votes[4] != max_votes: | |
transcript.append("\nCongratulations! You blended in successfully!") | |
else: | |
transcript.append("\nThe AIs detected you! Try to be more human-like next time.") | |
return "\n".join(transcript), transcript | |
with gr.Blocks() as demo: | |
# State to store transcript and questions | |
transcript_state = gr.State([]) | |
current_q1_state = gr.State("") | |
current_q2_state = gr.State("") # New state for Q2 | |
gr.Markdown("# Who's the Human?\nA simple multi-step Gradio demo.") | |
transcript_box = gr.Textbox( | |
label="Game Transcript", | |
lines=15, | |
interactive=False | |
) | |
start_btn = gr.Button("Start Game") | |
start_btn.click( | |
start_game, | |
outputs=[transcript_box, transcript_state, current_q1_state] | |
) | |
user_q1 = gr.Textbox(label="Your answer for Q1:") | |
submit_q1_btn = gr.Button("Submit Q1") | |
submit_q1_btn.click( | |
submit_q1, | |
inputs=[user_q1, transcript_state, current_q1_state], | |
outputs=[transcript_box, transcript_state, current_q2_state] # Output Q2 to state | |
) | |
# Q2 input and button | |
user_q2 = gr.Textbox(label="Your answer for Q2:") | |
submit_q2_btn = gr.Button("Submit Q2") | |
submit_q2_btn.click( | |
submit_q2, | |
inputs=[user_q2, transcript_state, current_q2_state], # Add Q2 state input | |
outputs=[transcript_box, transcript_state] | |
) | |
# Voting radio + button | |
vote_radio = gr.Radio( | |
choices=['1', '2', '3', '4'], | |
value='1', | |
label="Who do YOU think is human? (1-4)" | |
) | |
vote_btn = gr.Button("Cast Vote") | |
vote_btn.click( | |
cast_vote, | |
inputs=[vote_radio, transcript_state], | |
outputs=[transcript_box, transcript_state] | |
) | |
demo.launch(debug=True, share=True) | |