| 19 | |
| 20 | |
| 21 | class OpenAITaskDraftGenerator: |
| 22 | def __init__( |
| 23 | self, |
| 24 | *, |
| 25 | model: str = "gpt-4o", |
| 26 | api_key: str | None = None, |
| 27 | base_url: str | None = None, |
| 28 | temperature: float = 0.2, |
| 29 | max_tokens: int = 4000, |
| 30 | client: object | None = None, |
| 31 | ) -> None: |
| 32 | self.model = model |
| 33 | self.temperature = float(temperature) |
| 34 | self.max_tokens = int(max_tokens) |
| 35 | self.client = client if client is not None else self._init_client(api_key=api_key, base_url=base_url) |
| 36 | |
| 37 | def generate_task_draft( |
| 38 | self, |
| 39 | *, |
| 40 | template: TaskTemplateSpec, |
| 41 | guidance: str, |
| 42 | ) -> TaskDraftGenerationResult: |
| 43 | prompt_bundle = build_task_draft_prompt_bundle(template=template, guidance=guidance) |
| 44 | response = self.client.chat.completions.create( |
| 45 | model=self.model, |
| 46 | messages=[ |
| 47 | {"role": "system", "content": prompt_bundle.system_prompt}, |
| 48 | {"role": "user", "content": prompt_bundle.user_prompt}, |
| 49 | ], |
| 50 | temperature=self.temperature, |
| 51 | max_tokens=self.max_tokens, |
| 52 | response_format={"type": "json_object"}, |
| 53 | ) |
| 54 | raw_response_text = _extract_response_text(response) |
| 55 | try: |
| 56 | json_text = extract_json_object_text(raw_response_text) |
| 57 | draft = task_draft_from_json(json_text, guidance_override=guidance) |
| 58 | except Exception as exc: |
| 59 | tb = traceback.format_exc().strip() |
| 60 | snippet = raw_response_text[:4000] |
| 61 | print("Task draft generation parse failure.", file=sys.stderr) |
| 62 | print("Raw model response:\n" + snippet, file=sys.stderr) |
| 63 | print("Traceback:\n" + tb, file=sys.stderr) |
| 64 | raise ValueError( |
| 65 | f"{exc}\n\nModel raw response:\n{snippet}\n\nTraceback:\n{tb}" |
| 66 | ) from exc |
| 67 | return TaskDraftGenerationResult( |
| 68 | prompt_bundle=prompt_bundle, |
| 69 | raw_response_text=raw_response_text, |
| 70 | draft=draft, |
| 71 | ) |
| 72 | |
| 73 | def generate_task_authoring_bundle( |
| 74 | self, |
| 75 | *, |
| 76 | task_id: str, |
| 77 | template: TaskTemplateSpec, |
| 78 | guidance: str, |