Atomic Firestore Token Bucket Increments Under Concurrency
To prevent client retry loops from overwhelming per-UID token allowances, do not use read-then-write transactions. Instead, use FieldValue.increment(consumedTokens) within a Firestore document update.
Atomic field increments execute at database speed without transaction retry contention, ensuring accurate token accounting even when an AI agent fires 50 concurrent tool calls.
import { FieldValue } from "firebase-admin/firestore";
export async function recordTokenUsage(db, userId, promptTokens, completionTokens) {
const ref = db.collection("token_usage").doc(userId);
await ref.set(
{
promptTokens: FieldValue.increment(promptTokens),
completionTokens: FieldValue.increment(completionTokens),
totalInvocations: FieldValue.increment(1),
lastUpdated: FieldValue.serverTimestamp(),
},
{ merge: true }
);
}