Technical Stack
A full‑stack boilerplate using Next.js App Router with AI SDK for model calls and a persistent token usage tracker backed by PostgreSQL + Drizzle ORM. Every AI operation (e.g., chat, embeddings) is recorded with tokens, cost, provider, model, and latency, enabling accurate FinOps and observability from day one.
Features
- AI SDK integration for server-side model calls (chat/completions/embeddings).
- Usage tracking persisted to
token_usages(tokens, cost, duration, operation). - Cost accounting with per‑provider/model price map (input/output/total).
- Latency metrics (
durationInMs) captured around each model call. - Indexed analytics (provider, model, operation, created_at) for fast queries.
- Type-safe DB via Drizzle ORM on PostgreSQL.
- Ready for dashboards (weekly/monthly cost, top models, $/request).
Technical Stack
- Frontend: Next.js (App Router)
- Server: Next.js (App Routes) with AI SDK
- Database: PostgreSQL + Drizzle ORM (
packages/db) - Language: TypeScript
Data Model
token_usages (Drizzle)
provider(tokenUsageProviderEnum)model(tokenUsageModelEnum)operation(tokenUsageOperationEnum) — e.g.,chat,embedinputTokens,outputTokens,totalTokensinputCost,outputCost,totalCost(DECIMAL(10,6))durationInMs- Timestamps (
createdAt,updatedAt) - Indexes on
provider,model,operation,createdAt
Drizzle ORM Table:
export const tokenUsages = pgTable( 'token_usages', { ...id, provider: tokenUsageProviderEnum('provider').notNull(), model: tokenUsageModelEnum('model').notNull(), operation: tokenUsageOperationEnum('operation').notNull(), inputTokens: integer('input_tokens').notNull(), outputTokens: integer('output_tokens').notNull(), totalTokens: integer('total_tokens').notNull(), inputCost: decimal('input_cost', { precision: 10, scale: 6 }).notNull(), outputCost: decimal('output_cost', { precision: 10, scale: 6 }).notNull(), totalCost: decimal('total_cost', { precision: 10, scale: 6 }).notNull(), durationInMs: integer('duration_in_ms').notNull(), ...timestamps, }, (t) => [ index('token_usage_provider_idx').on(t.provider), index('token_usage_model_idx').on(t.model), index('token_usage_operation_idx').on(t.operation), index('token_usage_created_at_idx').on(t.createdAt), ], )
How It Works
- Call the model via AI SDK in a App Route.
- Measure & extract: tokens (input/output), usage metadata, and elapsed time.
- Compute cost from a price map keyed by {provider, model} (input/output rates).
- Persist a row into token_usages with provider, model, operation, tokens, costs, and durationInMs.
Use Case
Perfect for teams who need transparent AI costs and reliable usage analytics in SaaS products. Track spend per customer/feature, compare models, and surface cost per request and latency to guide optimization and budgeting. 🚀
Boilerplate details
Last update
3 months agoBoilerplate age
3 months ago