@fidacy/langchain
Gate LangChain tool calls behind a signed Fidacy verdict. A denied payment never
executes.
npm i @fidacy/langchain @langchain/core
import { guardTools } from "@fidacy/langchain";
const tools = guardTools([payTool, searchTool], { apiKey: process.env.FIDACY_ENGINE_API_KEY });
Free engine key, no card: https://fidacy.com/claim
Why not a callback handler
LangChain callbacks (handleToolStart and friends) are observational. They fire
around the call and cannot cancel it, so a guardrail built on them watches the
money leave. This replaces the tool's own execution path, which is the only place
that can actually stop a payment.
Fail-closed
If the engine is unreachable, the key is wrong, or the request times out, the call
is denied. A payment firewall that opens when it breaks is not a firewall.
review also blocks by default. Set reviewIsDeny: false to let it through.
What a denial looks like
guardTool throws FidacyDenied with the signed proof attached:
try {
await tools[0].invoke({ payee: "acme", amount: 5000 });
} catch (e) {
if (e instanceof FidacyDenied) {
e.decision;
e.verdict?.riskPayloadJws;
e.verdict?.assessmentId;
}
}
Options
apiKey | FIDACY_ENGINE_API_KEY | Engine credential |
engineUrl | https://api.fidacy.com | Engine base URL |
client | built from apiKey | Bring your own @fidacy/sdk client |
isPayment | name heuristic | Which tools guardTools gates |
toMandate | payee/amount/currency + raw args | Build the mandate the engine assesses |
reviewIsDeny | true | Whether review blocks |
onDecision | none | Observe every decision, including approvals |
guardTool(tool, opts) gates one tool unconditionally. guardTools(list, opts)
gates only the ones isPayment matches and returns the rest by identity, so
non-payment tools carry no cost.
The wrapped tool keeps its name, description and schema, so the model sees no
difference.
Apache-2.0 · https://fidacy.com