# Pydantic response model
class TaskDetails(BaseModel):
    classes: list[Intents]

# Mirascope template
class TaskExtractor(OpenAIExtractor[TaskDetails]):
    extract_schema: Type[TaskDetails] = TaskDetails
    prompt_template = """
    Classify the following text: {text_to_classify}
    """
    text_to_classify: str = ""

TaskExtractor.call_params = OpenAICallParams(model="gpt-3.5-turbo-0125")
extractor = TaskExtractor()
@experiment(n_runs=20, expected_response=expected_response)
def run_mirascope_classification_experiment(text_to_classify: str):
    extractor.text_to_classify = text_to_classify
    task_details = extractor.extract(retries=2)
    return {cat.value for cat in task_details.classes}


predictions, percent_successful, accuracy = run_mirascope_classification_experiment(
    text_to_classify
)

print(f"Percent of successful API calls: {percent_successful:.4f}")
print(f"Accuracy: {accuracy:.4f}")

# 100%|██████████| 20/20 [00:38<00:00,  1.93s/it]
# Percent of successful API calls: 1.0000
# Accuracy: 1.0000