Vercel AI SDK tools for the UniRate currency-exchange API.
Drop four ready-made tool() definitions into any AI SDK agent so your model can convert currencies, look up exchange rates, list supported currencies, and fetch VAT rates. Mirrors the @unirate/langchain-js package.
UniRate API · 593+ fiat, crypto & commodity instruments · Free tier available
npm install @unirate/ai-sdk ai zodai and zod are peer dependencies — install them alongside this package. Compatible with AI SDK v4 and v5 (each tool ships both the v4 parameters and v5 inputSchema field).
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { createUniRateTools } from "@unirate/ai-sdk";
const tools = createUniRateTools({ apiKey: process.env.UNIRATE_API_KEY });
const { text } = await generateText({
model: openai("gpt-4o"),
tools,
maxSteps: 5,
prompt: "Convert 250 USD to JPY, then tell me Germany's VAT rate.",
});
console.log(text);createUniRateTools() returns a record keyed by tool name — exactly the shape the AI SDK's generateText / streamText expect for their tools option.
createUniRateTools() returns:
| Key | Purpose | Input |
|---|---|---|
unirate_exchange |
Convert an amount between two currencies | from_currency, to_currency, amount? |
unirate_rate |
Current rate for a pair, or all rates from a base | from_currency, to_currency? |
unirate_currencies |
List all supported currency codes | — |
unirate_vat |
VAT rate for a country, or all countries | country? |
Each tool is also available as an individual factory:
import {
createExchangeTool,
createRateTool,
createCurrenciesTool,
createVatTool,
} from "@unirate/ai-sdk";
const tools = {
fx: createExchangeTool({ apiKey: process.env.UNIRATE_API_KEY }),
vat: createVatTool({ apiKey: process.env.UNIRATE_API_KEY }),
};// model input: { from_currency: "USD", to_currency: "EUR", amount: 100 }
// tool output: "100 USD = 92.5 EUR (UniRate latest rate)"// { from_currency: "USD", to_currency: "EUR" }
// → "1 USD = 0.925 EUR (UniRate latest rate)"
// { from_currency: "USD" } (omit target)
// → "Rates from USD (first 10): EUR: 0.925, GBP: 0.79, ..."// {}
// → "UniRate supports 593 currencies: USD, EUR, GBP, ..."// { country: "DE" }
// → "Germany (DE) VAT rate: 19%"
// {} (omit country)
// → "VAT rates for 50 countries (first 10): AT: 20%, BE: 21%, ..."The wrapper class is exported for use outside an agent context (or to share one client instance across tools):
import { UniRateAPIWrapper, createUniRateTools } from "@unirate/ai-sdk";
const wrapper = new UniRateAPIWrapper(); // reads UNIRATE_API_KEY from env
const tools = createUniRateTools(wrapper); // shares the wrapper
console.log(await wrapper.getRate("USD", "EUR")); // 0.925
console.log(await wrapper.convert("USD", "EUR", 100)); // 92.5
console.log(await wrapper.listCurrencies()); // ["USD", "EUR", ...]
console.log(await wrapper.getVatRate("DE")); // { country_code: "DE", country_name: "Germany", vat_rate: 19 }All errors extend UniRateError:
| HTTP | Class | Meaning |
|---|---|---|
| 400 | InvalidRequestError |
Bad parameters |
| 401 | AuthenticationError |
Missing/invalid API key |
| 403 | ProRequiredError |
Endpoint requires a Pro subscription |
| 404 | InvalidCurrencyError |
Unknown currency |
| 429 | RateLimitError |
Rate limit exceeded |
| 503 / other | UniRateError |
Service unavailable / generic (carries .status) |
Errors surface through the tool's execute — handle them in your agent loop as you would any tool error.
- Zero runtime dependencies;
aiandzodare peers provided by your app. - Native
fetchonly — no transitive HTTP-client supply-chain surface. - API key never leaves the server; tools are designed for server-side agent use.
- Published to npm with provenance attestation.
Official UniRate clients & framework integrations: Python · Node · React · Vue · Nuxt · Next.js · SvelteKit · NestJS · Remix · Angular · Astro · Eleventy · LangChain (Python) · LangChain.js · MCP server
MIT © Unirate Team