
npm install neutral-costThis component makes it easy to define and track AI costs and tool costs, giving you visibility into:
Knowing your costs is the foundation for building your business AND your business model.
Found a bug? Feature request? File it here.
You'll need an existing Convex project to use the component. Convex is a hosted backend platform, including a database, serverless functions, and a ton more you can learn about here.
Run npm create convex or follow any of the quickstarts to set one up.
Install the component package:
npm install neutral-cost
Create a convex.config.ts file in your app's convex/ folder and install the component by calling use:
// convex/convex.config.ts
import { defineApp } from "convex/server";
import costComponent from "neutral-cost/convex.config";
const app = defineApp();
app.use(costComponent);
export default app;
import { components } from "./_generated/api";
import { CostComponent } from "neutral-cost";
const costs = new CostComponent(components.costComponent, {
// Optional: Configure markup multipliers per provider, model, or tool
providerMarkupMultiplier: [
{ providerId: "openai", multiplier: 1.5 }, // 50% markup on OpenAI
],
modelMarkupMultiplier: [
{ modelId: "gpt-4", multiplier: 2.0 }, // 100% markup on GPT-4
],
toolMarkupMultiplier: [
{ toolId: "web-search", multiplier: 1.25 }, // 25% markup on web search
],
});
// In an action
const result = await costs.addAICost(ctx, {
messageId: "msg_123",
userId: "user_456",
threadId: "thread_789",
usage: { promptTokens: 100, completionTokens: 50, totalTokens: 150 },
modelId: "gpt-4",
providerId: "openai",
});
// In an action
const result = await costs.addToolCost(ctx, {
messageId: "msg_123",
userId: "user_456",
threadId: "thread_789",
providerId: "tavily",
toolId: "web-search",
usage: { calls: 1 },
});
// Get costs by thread or user
const threadCosts = await costs.getAICostsByThread(ctx, "thread_789");
const userCosts = await costs.getTotalAICostsByUser(ctx, "user_456");
// Get tool costs
const toolCosts = await costs.getToolCostsByUser(ctx, "user_456");
Easily expose cost queries to your frontend:
// convex/costs.ts
import { components } from "./_generated/api";
import { CostComponent } from "neutral-cost";
const costs = new CostComponent(components.costComponent);
export const {
getAICostsByThread,
getAICostsByUser,
getTotalAICostsByUser,
getTotalAICostsByThread,
getToolCostsByThread,
getToolCostsByUser,
getTotalToolCostsByUser,
getTotalToolCostsByThread,
getAllPricing,
addAICost,
addToolCost,
updatePricingData,
} = costs.clientApi();
See more example usage in example.ts.