| 54 | |
| 55 | @dataclass |
| 56 | class TaskDataSpec: |
| 57 | task_name: Optional[str] = None |
| 58 | # prompt |
| 59 | prompt_file: Optional[PathLike] = None |
| 60 | |
| 61 | system_prompt_file: Optional[PathLike] = None |
| 62 | |
| 63 | def __post_init__(self) -> None: |
| 64 | def load_prompt_file( |
| 65 | prompt_file: Optional[PathLike], |
| 66 | ) -> Optional[str]: |
| 67 | """Load prompt from file if it exists, otherwise return as is.""" |
| 68 | if prompt_file is None: |
| 69 | return None |
| 70 | if os.path.exists(prompt_file): |
| 71 | with open(prompt_file, "r", encoding="utf-8") as f: |
| 72 | return f.read() |
| 73 | else: |
| 74 | raise FileNotFoundError(f"Prompt file {prompt_file} not found") |
| 75 | |
| 76 | # Load prompts from files if they exist |
| 77 | self.system_prompt = load_prompt_file(self.system_prompt_file) |
| 78 | self.prompt = load_prompt_file(self.prompt_file) |
| 79 | |
| 80 | def copy_defaults(self, from_spec: "TaskDataSpec") -> None: |
| 81 | """Apply default values from another Task instance for any None attributes.""" |
| 82 | default_attrs = { |
| 83 | "system_prompt": from_spec.system_prompt, |
| 84 | "prompt": from_spec.prompt, |
| 85 | } |
| 86 | |
| 87 | for attr_name, default_value in default_attrs.items(): |
| 88 | if getattr(self, attr_name) is None: |
| 89 | setattr(self, attr_name, default_value) |
| 90 | |
| 91 | |
| 92 | class TaskDataProcessFnCallable(Protocol): |
no outgoing calls