Skip to main content
The TypeScript SDK ships as @agentmeter/sdk. It auto-instruments supported provider clients and emits server-priced telemetry to AgentMeter.
pnpm add @agentmeter/sdk

Initialize

import agentmeter from "@agentmeter/sdk";

agentmeter.init({
  apiKey: process.env.AGENTMETER_API_KEY!,
});
You can pass endpoint for self-hosted deployments. Omit it for AgentMeter Cloud.

Auto-instrumentation

Importing the SDK patches supported provider clients in the host process. Current coverage:
  • OpenAI.
  • Anthropic.
  • Vercel AI.
Captured fields include provider, model, tokens in, tokens out, latency, status, customer_id, and step_name when a tracking context is active.

Tracking context

import { track } from "@agentmeter/sdk";

await track(
  { customer_id: "acme-corp", step_name: "draft_reply" },
  async () => {
    return openai.chat.completions.create({
      model: "gpt-4o-mini",
      messages,
    });
  },
);
track uses async context so metadata follows nested awaits without manual argument threading.

Non-LLM usage

import { reportUsage } from "@agentmeter/sdk";

reportUsage({
  customer_id: "acme-corp",
  step_name: "speak_answer",
  metric: "characters",
  metric_value: 4200,
});
Report raw usage, not dollars. AgentMeter applies pricing on the server.

Budget hard stops

import agentmeter, { AgentMeterBudgetExceeded } from "@agentmeter/sdk";

agentmeter.init({ apiKey: process.env.AGENTMETER_API_KEY! });

try {
  await openai.chat.completions.create({ model, messages });
} catch (err) {
  if (err instanceof AgentMeterBudgetExceeded) {
    return cachedOrSmallerResponse();
  }
  throw err;
}
SDK errors fail open unless an active, cached rule intentionally blocks the call.

Webhook verification

import { verifyWebhook } from "@agentmeter/sdk";

const ok = verifyWebhook(
  rawBody,
  signatureHeader,
  process.env.AGENTMETER_WEBHOOK_SECRET!,
  timestampHeader,
);
The helper accepts raw hex signatures and sha256= prefixed signatures.