Spaces:
Runtime error
Runtime error
import json | |
from openai import OpenAI | |
#from dotenv import load_dotenv | |
import os | |
import gradio as gr | |
from gradio import ChatMessage | |
import time | |
import logging | |
# Configure logging | |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') | |
#load_dotenv() | |
#use openai API key | |
# api_key = os.getenv("OPENAI_API_KEY") | |
# client = OpenAI(api_key=api_key) | |
#model="gpt-4.1" | |
#use gemini API key | |
api_key = os.getenv('GEMINI_API_KEY') | |
if api_key: | |
logging.info("API Key Loaded Successfully!") | |
else: | |
logging.info("API Key Missing!") | |
client = OpenAI(api_key=api_key, | |
base_url="https://generativelanguage.googleapis.com/v1beta/openai/" | |
) | |
model="gemini-2.0-flash" | |
system_prompt = """ | |
You are an AI assistant who is expert in breaking down complex problems into smaller, manageable parts. | |
Your task is to assist the user with their questions about Maths. | |
For the given user input, analyse the input and break down the problem step by step | |
Atleast 5-6 steps are required to solve the problem. | |
The steps are you get a user input, you analyse, you think, | |
you think again for several times and then return an output | |
with explanation and then finally you validate the output as well | |
before returning the final output. | |
Rules: | |
1. Follow the strict JSON output as per output schema | |
2. Always perform one step at a time and wait for next input | |
3. Carefully analyse the user query | |
4. Makes sure not to give same answer in multiple steps. Analyse the context to see what answers were provided earlier by the assistant and avoid repeating answers! We need to make progress towards final answer. | |
Output format: | |
{{'step':"string", 'content':"string"}} | |
Example: | |
Input: What is 2 + 2. | |
Output: {{'step':"analyse",'content':"The user is asking for the sum of 2 and 2."}} | |
{{'step':"think",'content':"To find the sum, I need to add the two numbers together."}} | |
{{'step':"output",'content':"2 + 2 = 4."}} | |
{{'step':"validate",'content':"The answer is correct because 2 added to 2 equals 4."}} | |
{{'step':"result",'content':"2+2=4 and that is calculated by adding all the numbers"}} | |
""" | |
#Create a list of messages | |
#Using ChatML format with Gemini | |
history=[ | |
{"role": "system", "content": system_prompt} | |
] | |
def llm_response(message, history): | |
if(len(history) ==0): | |
history=[{"role": "system", "content": system_prompt}] | |
history.append({"role": "user", "content": message}) | |
response = ChatMessage(content="", metadata={"title": "_Thinking_ step-by-step", "id": 0, "status": "pending"}) | |
yield response | |
accumulated_thoughts = "" | |
start_time = time.time() | |
while True: | |
llm_response = client.chat.completions.create( | |
model=model, | |
response_format={"type": "json_object"}, | |
messages= history) | |
parsed_response = json.loads(llm_response.choices[0].message.content) | |
logging.info("________________________________") | |
logging.info(parsed_response) | |
logging.info("________________________________") | |
time.sleep(5) | |
history.append({"role": "assistant", "content": parsed_response['content']}) | |
if parsed_response['step'] == 'result': | |
#We print how much time it took to get the final result | |
response.metadata["status"] = "done" | |
response.metadata["duration"] = time.time() - start_time | |
yield response | |
#And here is the final result | |
thought = f"🤖Final Result: {parsed_response['content']}" | |
response = [ | |
response, | |
ChatMessage( | |
content=thought | |
) | |
] | |
yield response | |
break | |
else: #we have not reached final result yet | |
thought = (parsed_response["step"], parsed_response["content"]) | |
accumulated_thoughts += f"**{thought[0]}**: {thought[1]}\n" | |
response.content = accumulated_thoughts.strip() | |
yield response | |
demo = gr.ChatInterface( | |
llm_response, | |
title="Chain of Thought based LLM Chat Interface 🤔- amitguptaforwork@gmail.com", | |
type="messages", | |
theme='amitguptaforwork/blue_professional', | |
examples=["how to calculate 2^2 + 5^2", "What is pythagorus theorem", "What is 2+5*6"], | |
) | |
demo.launch() | |