|
|
|
|
|
from openai import OpenAI |
|
import anthropic |
|
from together import Together |
|
import json |
|
import re |
|
from atla import Atla |
|
|
|
from dotenv import load_dotenv |
|
load_dotenv() |
|
|
|
|
|
anthropic_client = anthropic.Anthropic() |
|
openai_client = OpenAI() |
|
together_client = Together() |
|
atla_client = Atla() |
|
|
|
SYSTEM_PROMPT = """Please act as an impartial judge and evaluate based on the user's instruction. Your output format should strictly adhere to JSON as follows: {"feedback": "<write feedback>", "result": <numerical score>}. Ensure the output is valid JSON, without additional formatting or explanations.""" |
|
|
|
def get_openai_response(model_name, prompt): |
|
"""Get response from OpenAI API""" |
|
try: |
|
response = openai_client.chat.completions.create( |
|
model=model_name, |
|
messages=[ |
|
{"role": "system", "content": SYSTEM_PROMPT}, |
|
{"role": "user", "content": prompt}, |
|
], |
|
) |
|
return response.choices[0].message.content |
|
except Exception as e: |
|
return f"Error with OpenAI model {model_name}: {str(e)}" |
|
|
|
|
|
def get_anthropic_response(model_name, prompt): |
|
"""Get response from Anthropic API""" |
|
try: |
|
response = anthropic_client.messages.create( |
|
model=model_name, |
|
max_tokens=1000, |
|
temperature=0, |
|
system=SYSTEM_PROMPT, |
|
messages=[{"role": "user", "content": [{"type": "text", "text": prompt}]}], |
|
) |
|
return response.content[0].text |
|
except Exception as e: |
|
return f"Error with Anthropic model {model_name}: {str(e)}" |
|
|
|
|
|
def get_together_response(model_name, prompt): |
|
"""Get response from Together API""" |
|
try: |
|
response = together_client.chat.completions.create( |
|
model=model_name, |
|
messages=[ |
|
{"role": "system", "content": SYSTEM_PROMPT}, |
|
{"role": "user", "content": prompt}, |
|
], |
|
stream=False, |
|
) |
|
return response.choices[0].message.content |
|
except Exception as e: |
|
return f"Error with Together model {model_name}: {str(e)}" |
|
|
|
|
|
def get_atla_response(model_name, model_input, model_output, model_context, expected_output, evaluation_criteria): |
|
"""Get response from Atla API""" |
|
try: |
|
response = atla_client.evaluation.create( |
|
model_id=model_name, |
|
model_input=model_input, |
|
model_output=model_output, |
|
model_context=model_context, |
|
expected_model_output=expected_output, |
|
evaluation_criteria=evaluation_criteria, |
|
) |
|
|
|
return { |
|
"score": response.result.evaluation.score, |
|
"critique": response.result.evaluation.critique |
|
} |
|
except Exception as e: |
|
return f"Error with Atla model {model_name}: {str(e)}" |
|
|
|
|
|
def get_model_response(model_name, model_info, prompt=None, **kwargs): |
|
"""Get response from appropriate API based on model organization""" |
|
if not model_info: |
|
return "Model not found or unsupported." |
|
|
|
api_model = model_info["api_model"] |
|
organization = model_info["organization"] |
|
|
|
try: |
|
if organization == "Atla": |
|
return get_atla_response( |
|
api_model, |
|
kwargs.get('model_input'), |
|
kwargs.get('model_output'), |
|
kwargs.get('model_context'), |
|
kwargs.get('expected_output'), |
|
kwargs.get('evaluation_criteria') |
|
) |
|
elif organization == "OpenAI": |
|
return get_openai_response(api_model, prompt) |
|
elif organization == "Anthropic": |
|
return get_anthropic_response(api_model, prompt) |
|
else: |
|
|
|
return get_together_response(api_model, prompt) |
|
except Exception as e: |
|
return f"Error with {organization} model {model_name}: {str(e)}" |
|
|
|
|
|
def parse_model_response(response): |
|
try: |
|
|
|
print(f"Raw model response: {response}") |
|
|
|
|
|
try: |
|
data = json.loads(response) |
|
return str(data.get("result", "N/A")), data.get("feedback", "N/A") |
|
except json.JSONDecodeError: |
|
|
|
json_match = re.search(r"{.*}", response) |
|
if json_match: |
|
data = json.loads(json_match.group(0)) |
|
return str(data.get("result", "N/A")), data.get("feedback", "N/A") |
|
else: |
|
return "Error", f"Failed to parse response: {response}" |
|
|
|
except Exception as e: |
|
|
|
print(f"Failed to parse response: {str(e)}") |
|
return "Error", f"Failed to parse response: {response}" |