Finance agents that use the number finance actually signed off
There are four versions of Q3 revenue in your drive: the forecast, the flash, the restated figure and the board deck. An agent that picks one at random is worse than no agent.
The mixture
- 01 · Persistent memory
- Light
- 02 · Current context
- Leads
- 03 · Traceable decisions
- Uses
- 04 · Shared context
- Uses
- 05 · Scoped retrieval
- Uses
Every number has three drafts
Finance agents rarely fail at arithmetic. They fail at choosing which number to do the arithmetic on.
- 01
Forecasts outrank actuals
The forecast was discussed in forty emails. The actual was posted once. Retrieval weighs volume, so the agent quotes the number everyone talked about, not the one that closed.
- 02
Revenue means five things
Sales says bookings, finance says recognised revenue, the board says ARR. The agent reads all three as "revenue" and adds them up.
- 03
Restatements do not propagate
Q2 was restated after audit. Every agent built before the restatement still reconciles against the original figure, and nothing tells them otherwise.
Mostly current context. Then three others.
Every application on Alchemyst is a different mixture of the same five jobs. That mixture is what makes this a different piece of software from the one next to it, even though the API underneath is identical.
Only the version in force reaches the window
Every figure is stored with its period, its status (forecast, flash, final, restated) and what it replaces. Superseded figures are subtracted, so the agent reconciles against the final number unless you explicitly ask for the forecast.
- Final beats forecast unless you ask otherwise.
- Restatements replace, they do not coexist.
- Every figure carries its period and status.
Uses · Shared context
One definition of revenue
Semantic consensus pins "revenue" to the definition finance owns, for every agent.
Uses · Traceable decisions
Where the number came from
Each reconciliation carries the file, period and status of the figure it used.
Uses · Scoped retrieval
This entity, this period
Entity and period scopes are intersected before ranking.
That is four of the five. The fifth, persistent memory (preferences and corrections survive the session, the handoff and the model swap), is what leads in Assistant agents, Commerce agents and EdTech & tutoring instead. Same API, different mixture.
The sources you already have
Bring sources in through the data-source integrations (PostgreSQL, MongoDB, Google Docs, Google Sheets, Amazon S3), an n8n workflow, or a direct context.add call. Each one lands scoped, so retrieval can intersect it with everything else.
01 · Ingest
Scope what you ingest
Every document lands with a groupName: the sets it belongs to. Those sets are what retrieval intersects later, so the structure you choose here is the precision you get there.
context.addimport AlchemystAI from "@alchemystai/sdk";const client = new AlchemystAI(); // reads ALCHEMYST_AI_API_KEYawait client.v1.context.add({ context_type: "resource", scope: "internal", source: "gl-close", documents: [{ content: "Q3 FY26 recognised revenue, final after close: $4.82M. Supersedes flash estimate of $4.95M.", }], metadata: { fileName: "q3-2026-revenue-final.csv", groupName: ["finance", "fy26", "q3", "final"], // the sets this belongs to },});02 · Write
Replace the figure when it is restated
A restatement is a new version of the truth. Store it with what it supersedes, and move the old figure out of the final scope so nothing reconciles against it again.
context.addawait client.v1.context.add({ context_type: "resource", scope: "internal", source: "gl-close", documents: [{ content: "Q2 FY26 revenue restated after audit: $4.41M (previously $4.57M).", status: "restated", supersedes: "q2-2026-revenue-final.csv", }], metadata: { fileName: "q2-2026-revenue-restated.csv", groupName: ["finance", "fy26", "q2", "final"], lastModified: "2026-08-19T00:00:00Z", },});03 · Search
Search before reconciling
Search intersects the scopes, subtracts superseded and duplicate content, and ranks what survives. Only that reaches the model, and the whole decision is recorded as a Context Trace.
context.searchconst { contexts } = await client.v1.context.search({ query: "Reconcile Q3 revenue against the board deck", scope: "internal", similarity_threshold: 0.8, minimum_similarity_threshold: 0.5, metadata: { groupName: ["finance", "fy26", "q3", "final"] }, // ∩ narrow scope});// − superseded, deduplicated → ranked → into the window// Every search is recorded as a Context Trace.const reply = await llm.respond(message, { context: contexts });
npm install @alchemystai/sdk or pip install alchemystai, both ship the same client. Full reference in the docs.
Unreleased numbers are material information
Pre-close figures, forecasts and board materials are some of the most sensitive data a company holds. Keep them in scopes only finance agents can read, with every retrieval traced for audit.
Security & complianceManaged cloud
Encrypted in transit and at rest, isolated per organization, and scoped at write time.
Dedicated infrastructure
EnterpriseSingle-tenant, with VPC peering when your data cannot share a network boundary.
Self-hosted
On-premiseRun the context layer on your own infrastructure, with OpenTelemetry for observability.
The same API, a different mixture
Each of these leads with a different job, pulls from a different set of sources and needs a different call. All of them, by job.
Bring the reconciliation that does not tie out.
The one where the agent used a number nobody signed off.