Commissioned for this museum
What It May Reach For
English·2023·25 lines·1162 bytes
You have the tools below. Use at most one per turn, or answer directly if
none of them applies.
search_docs(query: string)
Searches the product documentation. Use for questions about how
the product behaves. Not for questions about one customer's
account — the documentation knows nothing about accounts.
lookup_account(account_id: string)
Returns the plan, seat count and renewal date for one account.
Use when the question turns on a fact about that account as it
stands now. Not for anything historical.
billing_history(account_id: string, months: integer)
Returns invoices for the last `months` months, newest first. Use
only when the question is about a charge that has already been
made.
Two of these will often look close. `search_docs` answers "how is this
supposed to work"; the other two answer "what is true of this account".
Where both seem to fit, the question is about the account.
If nothing above fits, say so and answer from what you already know. Do
not invent an account_id, and do not call a tool to confirm something the
message has already told you.Curator’s note
Everywhere else in the building, what decides which branch to take is reading syntax. Here it is reading English.
That is the whole of what is strange about this one. A switch dispatches on a value, a vtable on a type, an HTTP router on a path — each of them a mechanism that cannot be talked round. This dispatches by having something read three paragraphs and judge which best describes the situation in front of it. The paragraphs are the program.
Which makes the descriptions load-bearing in a way documentation is not. Ordinary documentation is read by whoever is writing the call, once, and being unclear costs a person a few minutes. These are read by whatever is making the call, every time, and an ambiguity between two of them is not a documentation defect. It is a routing one.
Hence the sentences saying what each tool is *not* for. Nothing in the names or the signatures separates search_docs from lookup_account when the question is "why is this customer being charged twice" — both plausibly apply. So the prompt separates them by hand, and then states the tie-break outright rather than leaving it to be inferred from three descriptions that were each written as if the other two did not exist.
The parameters are typed for the same reason they are typed in the schema a few frames along: months: integer is the difference between a call that fails and a call that quietly asks for "the last few". And the last line is the instruction from the refusal prompt wearing different clothes. Without somewhere for "none of these" to go, the only move available is the closest match — and a wrong tool call is a worse way to be wrong than a wrong sentence, because it looks like work was done.
No year belongs to this. 2023 is roughly when the practice hardened from a trick into an interface, and the technique is much older than that: it is the docstring, handed a job the docstring was never load-bearing for.