from typing import List from langchain_openai import ChatOpenAI from pydantic import BaseModel, Field from crewai.utilities import Converter from crewai.utilities.pydantic_schema_parser import PydanticSchemaParser class Entity(BaseModel): name: str = Field(description="The name of the entity.") type: str = Field(description="The type of the entity.") description: str = Field(description="Description of the entity.") relationships: List[str] = Field(description="Relationships of the entity.") class TaskEvaluation(BaseModel): suggestions: List[str] = Field( description="Suggestions to improve future similar tasks." ) quality: float = Field( description="A score from 0 to 10 evaluating on completion, quality, and overall performance, all taking into account the task description, expected output, and the result of the task." ) entities: List[Entity] = Field( description="Entities extracted from the task output." ) class TaskEvaluator: def __init__(self, original_agent): self.llm = original_agent.llm def evaluate(self, task, ouput) -> TaskEvaluation: evaluation_query = ( f"Assess the quality of the task completed based on the description, expected output, and actual results.\n\n" f"Task Description:\n{task.description}\n\n" f"Expected Output:\n{task.expected_output}\n\n" f"Actual Output:\n{ouput}\n\n" "Please provide:\n" "- Bullet points suggestions to improve future similar tasks\n" "- A score from 0 to 10 evaluating on completion, quality, and overall performance" "- Entities extracted from the task output, if any, their type, description, and relationships" ) instructions = "I'm gonna convert this raw text into valid JSON." if not self._is_gpt(self.llm): model_schema = PydanticSchemaParser(model=TaskEvaluation).get_schema() instructions = f"{instructions}\n\nThe json should have the following structure, with the following keys:\n{model_schema}" converter = Converter( llm=self.llm, text=evaluation_query, model=TaskEvaluation, instructions=instructions, ) return converter.to_pydantic() def _is_gpt(self, llm) -> bool: return isinstance(llm, ChatOpenAI) and llm.openai_api_base == None