@frostfrazer/auditthread
v0.1.1
Published
Track AI spend across OpenAI, Anthropic, and Google — in one line.
Downloads
13
Maintainers
Readme
auditthread
Track AI spend across OpenAI, Anthropic, and Google — in one line.
Install
npm install @frostfrazer/auditthreadQuick start
import { AuditThread } from 'auditthread'
import OpenAI from 'openai'
import Anthropic from '@anthropic-ai/sdk'
const at = new AuditThread({ apiKey: 'at_your_key' })
// ── OpenAI ─────────────────────────────────────────────
const openai = at.wrapOpenAI(new OpenAI({ apiKey: process.env.OPENAI_API_KEY }))
// All calls tracked automatically from here
const res = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'Hello' }],
})
// ── Anthropic ──────────────────────────────────────────
const anthropic = at.wrapAnthropic(new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }))
const msg = await anthropic.messages.create({
model: 'claude-sonnet-4-5-20250929',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Hello' }],
})
// ── Google Gemini ──────────────────────────────────────
import { GoogleGenerativeAI } from '@google/generative-ai'
const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY!)
const model = at.wrapGemini(
genAI.getGenerativeModel({ model: 'gemini-1.5-flash' }),
'gemini-1.5-flash'
)
// ── Manual tracking (any provider) ────────────────────
await at.track({
provider: 'mistral',
model: 'mistral-large-latest',
prompt_tokens: 500,
completion_tokens: 200,
})Options
| Option | Type | Default | Description |
|---|---|---|---|
| apiKey | string | required | Your at_... key from the dashboard |
| baseUrl | string | https://app.auditthread.com/api/spend/ingest | Custom ingest endpoint |
| agentId | string | — | Tag all events with an agent name |
| mode | "immediate" \| "batch" | "immediate" | Send on every call or queue and flush |
| batchIntervalMs | number | 5000 | Flush interval in batch mode |
| batchSize | number | 50 | Max events per flush |
| debug | boolean | false | Log to console |
Per-agent tagging
// Default agent for all calls
const at = new AuditThread({ apiKey: 'at_...', agentId: 'email-responder' })
// Override per wrapper
const openai = at.wrapOpenAI(new OpenAI(...), { agentId: 'code-assistant' })Batch mode (high-throughput)
const at = new AuditThread({
apiKey: 'at_...',
mode: 'batch',
batchIntervalMs: 10_000,
batchSize: 100,
})
// Flush manually before shutdown
await at.flush()
at.destroy()