ЁЯПл The SchoolтА║ЁЯУЛ AI AgentsтА║ЁЯз░ рдзрдбрд╛ 03 тАФ Tools: agent рдЪреЗ рд╣рд╛рдд
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯз░ рдзрдбрд╛ 03 тАФ Tools: agent рдЪреЗ рд╣рд╛рдд

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 8 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-the-loop ┬╖ рдкреБрдвреЗ: lesson-04-memory


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ ACT рдареЛрдХрд╛ рддрдкрд╢реАрд▓рд╛рдд: tool рдореНрд╣рдгрдЬреЗ рдиреЗрдордХреЗ рдХрд╛рдп, model рддреЗ рдХрд╕реЗ рдирд┐рд╡рдбрддреЗ, рдЖрдгрд┐ рддреБрдордЪрд╛ agent рдЪрд╛рд▓реЗрд▓ рдХреА рдирд╛рд╣реА рд╣реЗ рдард░рд╡рдгрд╛рд░реЗ design рдЪреЗ рдирд┐рдпрдо.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдХрд░реНрддрд╛-рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдПрдХ рдЫреЛрдЯрд╛ toolbelt ЁЯз░ рдмрд╛рд│рдЧрддреЛ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ tool рд╡рд░ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рд╕рд╛рдареАрдЪ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдПрдХ рд▓реЗрдмрд▓ рдЕрд╕рддреЗ:

lookup {"topic": тАж} тАФ рд╢рд╛рд│реЗрдЪреНрдпрд╛ office рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛ calc {"expression": тАж} тАФ calculator write_note {"text": тАж} тАФ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдбрд╛рдпрд░реАрдд рд▓рд┐рд╣рд╛ (рдЧреЛрд╖реНрдЯреА рдмрджрд▓рддреЗ!)

рдкрдЯреНрдЯреНрдпрд╛рдмрджреНрджрд▓ рддреАрди рддрдереНрдпреЗ:

  1. рд▓реЗрдмрд▓реЗ рдореНрд╣рдгрдЬреЗ рдЕрд░реНрдзреА рдмреБрджреНрдзрд┐рдорддреНрддрд╛. model tools рдЪреА рдирд╛рд╡реЗ, рд╡рд░реНрдгрдиреЗ рдЖрдгрд┐ argument рдЪреЗ рд╕реНрд╡рд░реВрдк рд╡рд╛рдЪреВрдирдЪ tools рдирд┐рд╡рдбрддреЗ. рдЕрд╕реНрдкрд╖реНрдЯ рд▓реЗрдмрд▓ тЖТ рдЪреБрдХреАрдЪреЗ tool, рдЪреБрдХреАрдЪреЗ arguments, рдХрд┐рдВрд╡рд╛ call рдЪ рдирд╛рд╣реА. tool рдЪреА рд╡рд░реНрдгрдиреЗ рд▓рд┐рд╣рд┐рдгреЗ рдореНрд╣рдгрдЬреЗ screwdriver рдШреЗрдКрди рдХреЗрд▓реЗрд▓реЗ prompt engineering.
  2. model рдХрдзреАрдЪ tool рд▓рд╛ рд╣рд╛рдд рд▓рд╛рд╡рдд рдирд╛рд╣реА. рддреЗ рдПрдХ request рд▓рд┐рд╣рд┐рддреЗ ("calc: ceil(23/3)"); harness рддреЗ рдЪрд╛рд▓рд╡рддреЛ рдЖрдгрд┐ рдирд┐рдХрд╛рд▓ рдкрд░рдд рджреЗрддреЛ тАФ MCP рд╢рд╛рд│рд╛ L02 рдордзрд▓реАрдЪ model-proposes/harness-disposes рд╡рд┐рднрд╛рдЧрдгреА. рдореНрд╣рдгреВрдирдЪтАж
  3. tools рдЪреЗ reads рдЖрдгрд┐ writes рдЕрд╕реЗ рджреЛрди рднрд╛рдЧ рдкрдбрддрд╛рдд. lookup рдХреБрдгрд╛рд▓рд╛рд╣реА рдЗрдЬрд╛ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА тАФ рддреНрдпрд╛рд▓рд╛ рдореЛрдХрд│реЗ рдЪрд╛рд▓реВ рджреНрдпрд╛. write_note рдЬрдЧ рдмрджрд▓рддреЗ тАФ рдЖрдкрд▓реНрдпрд╛ code рдордзреНрдпреЗ рддреНрдпрд╛рд╡рд░ "writes": True рдЕрд╕реЗ рд▓реЗрдмрд▓ рдЖрд╣реЗ рдЖрдгрд┐ harness рддреНрдпрд╛рд▓рд╛ GATE рдХрд░рддреЛ (рдзрдбрд╛ 05). рдЖрдкрд▓реНрдпрд╛ tools рдЪреА рдпрд╛ рджреЛрди рдЧрдЯрд╛рдВрдд рд╡рд┐рднрд╛рдЧрдгреА рдХрд░рдгреЗ рд╣рд╛рдЪ рдкрд╣рд┐рд▓рд╛ security review рдЖрд╣реЗ, рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдд рдЭрд╛рд▓реЗрд▓рд╛.

рдЖрдгрд┐ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдкрдЯреНрдЯреЗ рдпреЗрддрд╛рдд рдХреБрдареВрди? MCP тАФ standard socket (рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реА рд╢рд╛рд│рд╛): servers рдЬреЛрдбрд╛, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА tools рдЖрдкреЛрдЖрдк рдкрдЯреНрдЯреНрдпрд╛рд╡рд░ рджрд┐рд╕рддрд╛рдд.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    subgraph belt["ЁЯз░ the toolbelt (agent.py TOOLS)"]
        r1["lookup - READ<br/>'ask the school office'"]
        r2["calc - READ<br/>'safe math, ceil() allowed'"]
        w1["write_note - WRITE ЁЯЪз<br/>'changes the diary!'"]
    end
    m["ЁЯза model - picks by<br/>READING the labels"]
    h["ЁЯПл harness - executes<br/>(gates the writes)"]
    world["ЁЯМН the world"]
    m -->|"1 writes a request"| h -->|"2 runs the tool"| world
    world -->|"3 observation тЖТ desk"| m
    belt -.->|"labels shown to the model"| m

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

agent рдЪреА рдЧреБрдгрд╡рддреНрддрд╛ model рдЪреНрдпрд╛ рдЧреБрдгрд╡рддреНрддреЗрдкреЗрдХреНрд╖рд╛ tools рдЪреНрдпрд╛ рдЧреБрдгрд╡рддреНрддреЗрд╡рд░ рдЬрд╛рд╕реНрдд рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ. рдкрд╛рдЪ рдиреЗрдЯрдХреНрдпрд╛, рдЪрд╛рдВрдЧрд▓реА рд▓реЗрдмрд▓реЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛, рдорд░реНрдпрд╛рджрд┐рдд рд╡реНрдпрд╛рдкреНрддреАрдЪреНрдпрд╛ tools рд╕рд╣ рд╕рд╛рдзрд╛рд░рдг model, do_stuff(anything) рдЕрд╕рд▓реЗрд▓реНрдпрд╛ frontier model рд▓рд╛ рдорд╛рдЧреЗ рдЯрд╛рдХрддреЗ. рддреБрдордЪрд╛ agent рдзрдбрдкрдбрдд рдЕрд╕реЗрд▓, рддрд░ рддреНрдпрд╛рдЪреНрдпрд╛ tool labels рдореЛрдареНрдпрд╛рдиреЗ рд╡рд╛рдЪрд╛ тАФ рдХреЛрдгрддреЗ рдирд┐рд╡рдбрд╛рдпрдЪреЗ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛рдЪ рдХрд│рдд рдирд╕реЗрд▓, рддрд░ model рд▓рд╛рд╣реА рдХрд│рдгрд╛рд░ рдирд╛рд╣реА.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 agent/agent.py --drive
# your move> calc {"expression": "ceil((12+11)/3)"}
# your move> calc {"expression": "__import__('os')"}     тЖР try to break it ЁЯШИ

рджреБрд╕рд░рд╛ call рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрддреЛ тАФ рдХрд╛ рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА agent.py рдордзрд▓реЗ _safe_eval рд╡рд╛рдЪрд╛. рдордЧ рдХрд╛рдЧрджрд╛рд╡рд░ рддреБрдордЪреНрдпрд╛ рдХрд╛рдорд╛рд╕рд╛рдареА toolbelt design рдХрд░рд╛: рдкрд╛рдЪ tools, рдкреНрд░рддреНрдпреЗрдХреА рдПрдХ рдУрд│, READ рдХрд┐рдВрд╡рд╛ WRITE рдЕрд╢реА рдЦреВрдг рдХреЗрд▓реЗрд▓реА. рддреЛ рджрд╕реНрддрдРрд╡рдЬ рдореНрд╣рдгрдЬреЗ agent spec рдЪрд╛ 80% рднрд╛рдЧ.

тПня╕П рдкреБрдвреЗ

рдареЛрдХреНрдпрд╛рдВрдордзрд▓реЗ desk: memory тАФ scratchpads, context рдЪреНрдпрд╛ рдорд░реНрдпрд╛рджрд╛, рдЖрдгрд┐ рд▓рд╛рдВрдм рдХрд╛рдорд╛рдВрдирд╛ рдбрд╛рдпрд░реА рдХрд╛ рд▓рд╛рдЧрддреЗ.

git checkout lesson-04-memory

ЁЯз░ Lesson 03 тАФ Tools: the agent's hands

ЁЯУН You are here: Lesson 03 of 8 ┬╖ Previous: lesson-02-the-loop ┬╖ Next: lesson-04-memory


ЁЯУж What's in this branch

Lessons 01тАУ02, plus the ACT beat in detail: what a tool IS, how the model chooses one, and the design rules that decide whether your agent works.

ЁЯзТ Explain like I'm 5

The doer-student carries a small toolbelt ЁЯз░, and each tool has a label written FOR the student:

lookup {"topic": тАж} тАФ ask the school office calc {"expression": тАж} тАФ the calculator write_note {"text": тАж} тАФ write in the class diary (changes things!)

Three facts about the belt:

  1. The labels are half the intelligence. The model picks tools by READING their names, descriptions and argument forms. Vague label тЖТ wrong tool, wrong arguments, or no call at all. Writing tool descriptions is prompt engineering with a screwdriver.
  2. The model never touches the tool. It writes a request ("calc: ceil(23/3)"); the harness executes and returns the result тАФ the same model-proposes/harness-disposes split as MCP school L02. Which is whyтАж
  3. Tools split into reads and writes. lookup can't hurt anyone тАФ let it flow. write_note changes the world тАФ it's labeled "writes": True in our code and the harness GATES it (lesson 05). Sorting your tools into these two buckets is the first security review, done in one minute.

And where do belts come from at scale? MCP тАФ the standard socket (the whole other school): plug in servers, and their tools appear on the belt automatically.

ЁЯЧ║я╕П Diagram

flowchart LR
    subgraph belt["ЁЯз░ the toolbelt (agent.py TOOLS)"]
        r1["lookup - READ<br/>'ask the school office'"]
        r2["calc - READ<br/>'safe math, ceil() allowed'"]
        w1["write_note - WRITE ЁЯЪз<br/>'changes the diary!'"]
    end
    m["ЁЯза model - picks by<br/>READING the labels"]
    h["ЁЯПл harness - executes<br/>(gates the writes)"]
    world["ЁЯМН the world"]
    m -->|"1 writes a request"| h -->|"2 runs the tool"| world
    world -->|"3 observation тЖТ desk"| m
    belt -.->|"labels shown to the model"| m

тЭУ What

ЁЯдФ Why

Agent quality tracks tool quality more than model quality. A mediocre model with five crisp, well-labeled, well-scoped tools beats a frontier model with do_stuff(anything). When your agent flails, read it your tool labels out loud тАФ if YOU wouldn't know which to pick, neither does the model.

ЁЯзк Try it

python3 agent/agent.py --drive
# your move> calc {"expression": "ceil((12+11)/3)"}
# your move> calc {"expression": "__import__('os')"}     тЖР try to break it ЁЯШИ

The second call fails safely тАФ read _safe_eval in agent.py to see why. Then design, on paper, the toolbelt for YOUR job: five tools, one line each, marked READ or WRITE. That artifact is 80% of an agent spec.

тПня╕П Next

The desk between the beats: memory тАФ scratchpads, context limits, and why long tasks need a diary.

git checkout lesson-04-memory
тЖР Previousthe loopNext тЖТmemory

This page is the lesson's README from the lesson-03-tools branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.