def executor_agent(step: Dict[str, Any], context: Dict[str, Any]) -> StepResult:
step_id = int(step.get("id", 0))
title = step.get("title", f"Step {step_id}")
instrument = step.get("instrument", "llm")
ctx_compact = {
"purpose": context.get("purpose"),
"assumptions": context.get("assumptions", []),
"prior_results": [
{"step_id": r.step_id, "title": r.title, "tool": r.tool, "output": r.output[:1500]}
for r in context.get("outcomes", [])
],
}
if instrument == "python":
code = llm_chat(
EXECUTOR_SYSTEM,
person=(
f"Step:n{json.dumps(step, indent=2)}nn"
f"Context:n{json.dumps(ctx_compact, indent=2)}nn"
f"Write Python code that completes the step. Output ONLY code."
),
max_new_tokens=700,
temperature=0.2,
)
py = run_python(code)
out = []
out.append("PYTHON_CODE:n" + code)
out.append("nEXECUTION_OK: " + str(py["ok"]))
if py["stdout"]:
out.append("nSTDOUT:n" + py["stdout"])
if py["error"]:
out.append("nERROR:n" + py["error"])
return StepResult(step_id=step_id, title=title, instrument=instrument, output="n".be part of(out))
result_text = llm_chat(
EXECUTOR_SYSTEM,
person=(
f"Step:n{json.dumps(step, indent=2)}nn"
f"Context:n{json.dumps(ctx_compact, indent=2)}nn"
f"Return the step outcome."
),
max_new_tokens=700,
temperature=0.3,
)
return StepResult(step_id=step_id, title=title, instrument=instrument, output=result_text)
def aggregator_agent(job: str, plan: Dict[str, Any], outcomes: Listing[StepResult]) -> str:
payload = {
"job": job,
"plan": plan,
"outcomes": [{"step_id": r.step_id, "title": r.title, "tool": r.tool, "output": r.output[:2500]} for r in outcomes],
}
return llm_chat(
AGGREGATOR_SYSTEM,
person=f"Mix the whole lot into the ultimate reply.nnINPUT:n{json.dumps(payload, indent=2)}",
max_new_tokens=900,
temperature=0.2,
)
def run_hierarchical_agent(job: str, verbose: bool = True) -> Dict[str, Any]:
plan = planner_agent(job)
if verbose:
print("n====================")
print("PLAN (from Planner)")
print("====================")
print(json.dumps(plan, indent=2))
context = {
"purpose": plan.get("purpose", job),
"assumptions": plan.get("assumptions", []),
"outcomes": [],
}
outcomes: Listing[StepResult] = []
for step in plan.get("steps", []):
res = executor_agent(step, context)
outcomes.append(res)
context["results"].append(res)
if verbose:
print("n--------------------")
print(f"STEP {res.step_id}: {res.title} [tool={res.tool}]")
print("--------------------")
print(res.output)
last = aggregator_agent(job, plan, outcomes)
if verbose:
print("n====================")
print("FINAL (from Aggregator)")
print("====================")
print(last)
return {"job": job, "plan": plan, "outcomes": outcomes, "last": last}
demo_task = """
Create a sensible guidelines to launch a small multi-agent system in Python for coordinating logistics:
- One planner agent that decomposes duties
- Two executor brokers (routing + stock)
- A easy reminiscence retailer for previous choices
Hold it light-weight and runnable in Colab.
"""
_ = run_hierarchical_agent(demo_task, verbose=True)
print("nnType your individual job (or press Enter to skip):")
user_task = enter().strip()
if user_task:
_ = run_hierarchical_agent(user_task, verbose=True)









