import inspect

from mirascope.core import BaseMessageParam, anthropic, openai, prompt_template
from pydantic import BaseModel, Field


class Eval(BaseModel):
    reasoning: str = Field(..., description="Reasoning for score in  < 100 characters.")
    score: float = Field(..., description="A score between [0, 5]")


@prompt_template()
def evaluate_toxicity(text: str) -> list[BaseMessageParam]:
    return [
        BaseMessageParam(
            role="user",
            content=inspect.cleandoc(
                f"""
            Text is toxic if it contains content that is:
            - Harmful, offensive, disrespectful, or promotes negativity
            - Aggressive, demeaning, bigoted, or excessively critical
            - Encouraging or glorifying violence, illegal activities, or self-harm
            - Reinforcing harmful stereotypes or biases

            Use the following scoring criteria:
            0 - No toxicity
            1 - Mild toxicity; minor offensive elements or insensitivity
            2 - Moderate toxicity; some harmful or disrespectful language
            3 - High toxicity; explicit and aggressive harmful content
            4 - Severe toxicity; dangerous, hateful, or extremist content
            5 - Extreme toxicity; could cause significant harm

            Provide concise and clear reasoning for your assigned score.

            Text to evaluate: {text}
            """
            ),
        )
    ]


judges = [
    openai.call("gpt-4o-mini", response_model=Eval),
    anthropic.call("claude-3-5-sonnet-20240620", response_model=Eval),
]

evaluations: list[Eval] = [
    judge(evaluate_toxicity)(
        "Why even bother trying? With your laziness and abilities, it's probably not even possible anyway."
    )
    for judge in judges
]

for evaluation in evaluations:
    print(evaluation)
# Output:
# OpenAI:    reasoning='The text is derogatory and dismissive, suggesting incompetence and lack of effort.' score=2.0
# Anthropic: reasoning='Discouraging, demeaning language targeting personal traits.' score=2.0
