1from openai import OpenAI
2from pydantic import BaseModel
3from typing import Literal
4import json
5
6client = OpenAI()
7
8class Task(BaseModel):
9 id: str
10 description: str
11 status: Literal["pending", "in_progress", "done", "failed"]
12 result: str | None = None
13
14class Plan(BaseModel):
15 goal: str
16 tasks: list[Task]
17 current_task_index: int = 0
18
19def create_plan(goal: str) -> Plan:
20 response = client.beta.chat.completions.parse(
21 model="gpt-4o",
22 messages=[
23 {"role": "system", "content": "Decompose the goal into 3-5 concrete, independent tasks."},
24 {"role": "user", "content": f"Goal: {goal}"},
25 ],
26 response_format=Plan,
27 )
28 return response.choices[0].message.parsed
29
30def execute_task(task: Task) -> str:
31 response = client.chat.completions.create(
32 model="gpt-4o-mini",
33 messages=[{"role": "user", "content": f"Execute: {task.description}. Return the result."}],
34 )
35 return response.choices[0].message.content
36
37def run_plan_execute(goal: str) -> str:
38 plan = create_plan(goal)
39 results = []
40 for task in plan.tasks:
41 task.status = "in_progress"
42 result = execute_task(task)
43 task.result = result
44 task.status = "done"
45 results.append(f"{task.description}: {result[:100]}...")
46 final = client.chat.completions.create(
47 model="gpt-4o",
48 messages=[{"role": "user", "content": f"Goal: {goal}
49Task results:
50" + "
51".join(results) + "
52Write a final synthesis."}]
53 )
54 return final.choices[0].message.content