import os from pydantic import BaseModel from openai import OpenAI client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) class EvaluationResult(BaseModel): result: str feedback: str def router_llm(user_input): messages = [ {"role": "system", "content": ( "You are a router. Decide which task the following input is for:\n" "- Math: If it's a math question.\n" "- Translate: If it's a translation request.\n" "- Summarize: If it's a request to summarize text.\n" "Reply with only one word: Math, Translate, or Summarize." )}, {"role": "user", "content": user_input} ] response = client.chat.completions.create( model="gpt-3.5-turbo", messages=messages, temperature=0 ) return response.choices[0].message.content.strip().lower() def math_llm(user_input): messages = [ {"role": "system", "content": "You are a helpful math assistant."}, {"role": "user", "content": f"Solve the following math problem: {user_input}"} ] response = client.chat.completions.create( model="gpt-3.5-turbo", messages=messages, temperature=0 ) return response.choices[0].message.content.strip() def translate_llm(user_input): messages = [ {"role": "system", "content": "You are a helpful translator from English to French."}, {"role": "user", "content": f"Translate this to French: {user_input}"} ] response = client.chat.completions.create( model="gpt-3.5-turbo", messages=messages, temperature=0 ) return response.choices[0].message.content.strip() def summarize_llm(user_input): messages = [ {"role": "system", "content": "You are a helpful summarizer."}, {"role": "user", "content": f"Summarize this: {user_input}"} ] response = client.chat.completions.create( model="gpt-3.5-turbo", messages=messages, temperature=0 ) return response.choices[0].message.content.strip() def evaluator_llm(task, user_input, solution): """ Evaluates the solution. Returns (result: bool, feedback: str) """ messages = [ {"role": "system", "content": ( f"You are an expert evaluator for the task: {task}.\n" "Given the user's request and the solution, decide if the solution is correct and helpful.\n" "Please evaluate the response, replying with whether it is right or wrong and your feedback for improvement." )}, {"role": "user", "content": f"User request: {user_input}\nSolution: {solution}"} ] response = client.beta.chat.completions.parse( model="gpt-4o-2024-08-06", messages=messages, response_format=EvaluationResult ) return response.choices[0].message.parsed def generate_solution(task, user_input, feedback=None): """ Calls the appropriate generator LLM, optionally with feedback. """ if feedback: user_input = f"{user_input}\n[Evaluator feedback: {feedback}]" if "math" in task: return math_llm(user_input) elif "translate" in task: return translate_llm(user_input) elif "summarize" in task: return summarize_llm(user_input) else: return "Sorry, I couldn't determine the task." def main(): user_input = input("Enter your request: ") task = router_llm(user_input) max_attempts = 3 feedback = None for attempt in range(max_attempts): solution = generate_solution(task, user_input, feedback) response = evaluator_llm(task, user_input, solution) if response.result.lower() == "right": print(f"Result (accepted on attempt {attempt+1}):\n{solution}") break else: print(f"Attempt {attempt+1} rejected. Feedback: {response.feedback}") else: print("Failed to generate an accepted solution after several attempts.") print(f"Last attempt:\n{solution}") if __name__ == "__main__": main()