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
,embed
inputTokens
,outputTokens
,totalTokens
inputCost
,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
1 month agoBoilerplate age
1 month ago