Stop 21 · Build AI Engineer Portfolio ProjectsProjects · 4/8

AI Agent that Automates a Real Workflow

Part of the AI Engineer Roadmap

In short

A chatbot talks. An agent does things: checks a calendar, sends an email, updates a sheet. Build one that safely finishes a real chore end to end, and employers will notice.

An agent that performs an actual multi-step task end-to-end (not a toy demo) — shows you can build something that takes real, useful action.

The purple blob juggles a phone, a calendar and a ticket while ticking off a checklist.

Think of it like this

A sharp personal assistant

Tell a good PA "set up three interviews next week". They check your calendar, message the candidates, book a room and come back with a summary. Before anything risky, like cancelling a meeting, they ask you first. An AI agent is that PA: a goal, a set of tools and good judgement on when to check.

Watch it happen

Booking interview slots

You
Agent
LLM
Tools

"Book 3 interviews"

1/7You give the agent a goal, not a step-by-step script.

The big ideas

What you need to know

Pick a real, boring chore

Sorting invoices, triaging support emails, updating a tracker. Real and repetitive beats flashy and fake.

Small, well-described tools

Each tool does one thing with clear inputs. Good tool descriptions matter as much as the prompt.

Guardrails built in

A step limit, human approval for anything that sends, pays or deletes, and logs of every action.

Measure task success

Run 20 realistic tasks and count how many finish correctly. Show the failures in your write-up.

See it in code

Walk through the code

python
1TOOLS = {"get_calendar": get_calendar, "send_invite": send_invite}2NEEDS_APPROVAL = {"send_invite"}3 4def run_agent(goal, max_steps=8):5    messages = [{"role": "user", "content": goal}]6    for _ in range(max_steps):7        action = llm_decide(messages, tools=list(TOOLS))   # your LLM call, returns a dict8        if action["type"] == "final":9            return action["text"]10        name, args = action["tool"], action["args"]11        if name in NEEDS_APPROVAL and input(f"Run {name}({args})? y/n ") != "y":12            messages.append({"role": "user", "content": f"{name} was not approved"})13            continue14        result = TOOLS[name](**args)15        messages.append({"role": "tool", "content": str(result)})16    return "Stopped: step limit reached"

1/4A fixed menu of tools, and the ones that need a human yes.

The agent loop with two safety rails: a step limit and approval for risky tools. llm_decide wraps your provider's tool-calling API; get_calendar and send_invite are your own functions.

Save yourself the pain

Common mistakes

Oops

Letting the agent send emails or delete files with no confirmation step.

Do this instead

Start read-only. Add write actions one at a time, each behind approval, and log everything it does.

Oops

Demoing one perfect run and calling the agent done.

Do this instead

Run it on 20 varied tasks, count successes, and write up the failure patterns you found.

Your mission

Milestone one: a read-only agent

~45 min

Quick check

Why does the agent loop have a max_steps limit?

Go deeper

  1. 1Pick a workflow you personally find tedious and automate it with an agent.
  2. 2Add guardrails and logging so the agent's actions are safe and auditable.
  3. 3Record a short demo video — agents are hard to appreciate from a README alone.

More projects at this stop

Stuck on this topic? Ask an Insider

Get 1:1 guidance from people who've walked this exact path — on the InsideEdge app.

Download
InsideEdge