Spaces:
Build error
Build error
| import json | |
| import logging | |
| import os | |
| from abc import ABC, abstractmethod | |
| from utils import load_file | |
| LOGGER = logging.getLogger('MINT') | |
| class Task(ABC): | |
| """Base class for a task instance.""" | |
| task_name: str = 'base' | |
| in_context_example_dir = os.path.join( | |
| os.path.dirname(os.path.abspath(__file__)), | |
| 'in_context_examples', | |
| ) | |
| def __init__(self, **kwargs) -> None: | |
| if 'loaded_history' in kwargs: | |
| self.loaded_history = kwargs['loaded_history'] | |
| else: | |
| self.loaded_history = None | |
| # pre-load the in-context example | |
| task_dir = os.path.join(self.in_context_example_dir, self.task_name) | |
| self._in_context_example = { | |
| 'with_tool': load_file(os.path.join(task_dir, 'with_tool.txt')), | |
| } | |
| self.metadata = {} | |
| def task_id(self) -> str: | |
| """Return the task id.""" | |
| assert hasattr(self, '_id'), 'Task does not have an id.' | |
| return self._id | |
| def in_context_example( | |
| self, use_tool: bool = True, with_feedback: bool = False | |
| ) -> str: | |
| """Return the in-context example for the task.""" | |
| if use_tool and not with_feedback: | |
| return self._in_context_example['with_tool'] | |
| else: | |
| raise NotImplementedError | |
| def prompt(self) -> str: | |
| """Return the task prompt.""" | |
| assert hasattr(self, '_prompt'), 'Task does not have a prompt.' | |
| return self._prompt | |
| def reference(self) -> str: | |
| """Return the reference solution for the task.""" | |
| assert hasattr(self, '_reference'), 'Task does not have a reference solution.' | |
| return self._reference | |
| def extract_answer(self, solution: str) -> str | None: | |
| """Extract the answer from the given solution.""" | |
| pass | |
| def success(self, solution: str) -> bool: | |
| """This checks whether the given solution can complete the current task. | |
| Can be used to provide binary feedback. | |
| """ | |
| answer = self.extract_answer(solution) | |
| return answer == self.reference | |
| def load_tasks(cls, path: str) -> tuple[list['Task'], int]: | |
| """Load all the tasks from a given jsonl file.""" | |
| assert path.endswith('.jsonl') or path.endswith('.json') | |
| with open(path, 'r') as f: | |
| tasks = [cls(**json.loads(line)) for line in f.readlines()] | |
| LOGGER.info(f'Loaded {len(tasks)} tasks from {path}') | |
| return tasks, len(tasks) | |
| def to_dict(self) -> dict: | |
| """Convert the task to a dictionary.""" | |
| return { | |
| 'task_name': self.task_name, | |
| 'task_id': self.task_id, | |
| 'prompt': self.prompt, | |
| 'reference': self.reference, | |
| 'metadata': self.metadata, | |
| } | |