Return a short preview of the plan for user approval.
(self, max_steps: int = 10)
| 35 | return "Plan is valid — parsed successfully." |
| 36 | |
| 37 | def preview(self, max_steps: int = 10) -> str: |
| 38 | """Return a short preview of the plan for user approval.""" |
| 39 | if not self.is_valid or not self.plan_data: |
| 40 | return self.summary() |
| 41 | data = self.plan_data |
| 42 | lines = [ |
| 43 | f"Name: {data.get('name', '(unnamed)')}", |
| 44 | f"Goal: {data.get('goal', '(no goal)')}", |
| 45 | ] |
| 46 | config = data.get("config") |
| 47 | if config: |
| 48 | model = config.get("model", config.get("model_name")) |
| 49 | if model: |
| 50 | lines.append(f"Model: {model}") |
| 51 | params = data.get("parameters") |
| 52 | if params: |
| 53 | lines.append(f"Parameters: {', '.join(str(k) for k in params.keys())}") |
| 54 | workflow = data.get("workflow", []) |
| 55 | lines.append(f"Steps: {len(workflow)}") |
| 56 | for i, step in enumerate(workflow[:max_steps]): |
| 57 | step_type = next( |
| 58 | (k for k in step if k in _STEP_TYPES), |
| 59 | list(step.keys())[0] if step else "?", |
| 60 | ) |
| 61 | name = "" |
| 62 | body = step.get(step_type) |
| 63 | if isinstance(body, dict): |
| 64 | name = body.get("name", "") |
| 65 | label = f" {i + 1}. {step_type}" |
| 66 | if name: |
| 67 | label += f": {name}" |
| 68 | lines.append(label) |
| 69 | if len(workflow) > max_steps: |
| 70 | lines.append(f" ... and {len(workflow) - max_steps} more steps") |
| 71 | return "\n".join(lines) |
| 72 | |
| 73 | |
| 74 | _STEP_TYPES = { |