Lesson 8 / 25

Structured Output via Tools

Force a tool call to get guaranteed-shape JSON instead of parsing prose.

A tool you never run

Need clean JSON, such as an extracted invoice? Define a tool whose input schema is the shape you want (record_invoice with fields for vendor, date and total) and force it with tool_choice. The model fills the arguments, which arrive as a parsed object. You do not actually run anything; the arguments are the result. Still validate values, because the schema controls shape, not truth.

Forcing the extraction tool

INVOICE_TOOL is a schema like the earlier examples. The structured data is in block.input.

reply = client.messages.create(
    model=MODEL, max_tokens=512,
    tools=[INVOICE_TOOL],
    tool_choice={"type": "tool", "name": "record_invoice"},
    messages=[{"role": "user", "content": invoice_text}],
)
block = next(b for b in reply.content if b.type == "tool_use")
data = block.input        # {"vendor": ..., "date": ..., "total": ...}

Keep extraction schemas small

A schema with forty fields invites mistakes. Extract a few well-named fields per call, mark uncertain ones as optional, and let the model return null instead of inventing a value.

Quick check: Does a schema guarantee the extracted values are correct?

  • Yes, always
  • Only for numbers
  • No, it fixes the shape, so you still validate the values
  • Only in Hindi
Answer

No, it fixes the shape, so you still validate the values — A well-formed object can still hold a wrong date or total.