Tool call audit log for the Vercel AI SDK
Pass your tools through wrapTools and each execute call is written as a signed, chained record: a decision before the tool runs and an outcome after it. TypeScript and JavaScript.
Full steps: Vercel AI SDK quickstart. What recording covers and where it stops: Tool coverage.
The change #
One call where generateText or streamText gets its tools. wrapTools takes the object you already pass, and each key is the recorded tool name. The ai package is not a dependency of the SDK.
TypeScript
import { wrapTools } from "signafaide";
import { generateText, stepCountIs } from "ai";
const tools = wrapTools(
{ lookup_order: lookupOrder, refund },
{ agent: "support-bot" },
);
const result = await generateText({
model,
tools,
stopWhen: stepCountIs(3),
prompt: "Refund order A-1001",
});A verify run #
Run the agent once, then npx signafaide verify. This is a local run in which the model asked for refund once: three records for the tool list, one decision and one outcome.
$ npx signafaide verify
local state: /home/dev/support-agent/.signafaide
1. Envelope schema PASS 5 records
2. Record hashes NOT CHECKED 0 records; 5 not yet shipped (no receipt); nothing co-signed yet
3. Client signatures PASS 5 records
4. Agent chains PASS 5 records
5. Merkle proofs NOT CHECKED 0 records; nothing co-signed yet
6. Batch hashes and signatures NOT CHECKED 0 batches; nothing co-signed yet
7. Batch chain NOT CHECKED 0 batches; nothing co-signed yet
8. Signed heads NOT CHECKED 0 heads; nothing co-signed yet
9. drand rounds NOT CHECKED 0 rounds
10. Anchors NOT CHECKED 0 anchors; local state holds no anchors
11. OpenTimestamps NOT CHECKED 0 proofs
12. Content hashes PASS 5 records
coverage: _pending/nokey/support-bot: all 2 declared tools are recorded
checked here: signatures, chain links and content hashes of all 5 records, using this machine's keys
co-signature, public timestamp: not yet. Run `signafaide init` to send hashes, or self-host (SIGNAFAIDE_URL)
PASS: 4 of 12 checks passed, 8 not checked (nothing co-signed yet)What is recorded and what is not #
- Recorded. Every
execute(input)of a wrapped tool: the tool name and input, then the output or the error. Inputs and outputs stay in.signafaide/on your machine. Nothing is sent until you runnpx signafaide init, and then only salted hashes. - Not recorded. The options argument of
execute(the messages and the abort signal) is not recorded. A tool with noexecutefunction cannot be wrapped, and a tool you did not wrap leaves no record. Give the full list todeclareToolsandsignafaide verifynames the tools that are not recorded. - Evidence, not certification. Records prove integrity and timing, not that a decision was right. The eight checks not run above need a witness: the co-signature and the public timestamp come after
npx signafaide init.
Next: install, wrap, verify and send hashes, step by step. Vercel AI SDK quickstart