Solutions · Financial services
An agent that classifies money movements by choosing from a closed list, not by writing a sentence that someone then interprets.
In a financial organisation, a useful agent does not give advice and does not approve anything: it reads documents and transactions, places them into a category from a fixed set, says how confident it is and is allowed to answer “I do not know”. The rest — the decision, the approval, the policy — remains with people.
An offer, with conditionsWe do not write “delivered”, because we do not have an agent of this kind put into production at a client in the financial sector. What we do have, and show exactly as such, is our own ingestion pipeline running on our data: five Python modules, 1,526 lines, which read bank notifications from e-mail and PDF statements, classify each transaction with tools and write it into PostgreSQL with deduplication, plus four automation flows for webhooks from three payment processors. The real state, said in the same sentence: the repository is not under git, the `tests/` and `webhook-server/` directories are empty, and approximate counterparty-name matching uses an n-gram heuristic marked in code as “to be replaced with an embedding service before production”. The financial-platform part in production — request flow, contract, payment schedule, audit — is a separate work, with its own evidence, and there we write “delivered”.
Requests for AI agents in financial services almost always come in the form of “to answer clients’ questions about our products”. It is a legitimate request, but that is not where time is saved. Time is lost elsewhere: someone opens dozens of bank notifications and statements every day, looks at a description like a string of capitals with a code and decides whether it is a client payment, a salary, a tax, an instalment to a lender or an operating expense. The work is repetitive, dull and, precisely for that reason, full of mistakes.
A language model is good at it, with one condition: it must not be asked to write a free-text answer. If you ask it for a sentence, you will parse it yourself, and you will parse it wrongly. In our pipeline, the model does not write: it receives seven tools and must call exactly one — client payment, salary, tax, payment to creditor, operating expense, bank fee or unknown. Each tool requires, in addition to the counterparty name or category, a confidence score between 0 and 1. “Unknown” requires a written reason. The output is a structure, not an opinion.
The second rule is that nothing goes in twice. Each transaction extracted from a notification or a statement receives an external identifier calculated as the first 16 characters of a SHA-256 fingerprint over its fields, the column is unique in the table, and insertion is done with `ON CONFLICT (external_id) DO NOTHING`. The practical consequence: the mailbox can be reread as many times as you want, and the balance does not double. Without this rule, any financial ingestion pipeline ends up, by the third week, producing duplicates that someone cleans up manually.
What such an agent does not do, and why it is important to say this on the page: it does not approve a payment, does not make a credit decision, does not give investment recommendations and does not answer the client on behalf of the institution. The confidence score it returns is the model’s own assessment of itself, not a measurement of accuracy made by us — that distinction is the difference between a tool and an illusion of control.