feat(playground): add types.ts with static provider pricing table

Re-exports all playground types and adds static MODEL_PRICING_TABLE with
8-10 popular models labeled (estimated) for client-side cost estimation (D13).
Exports getModelPricing and getProviderPricing helpers.
This commit is contained in:
diegosouzapw
2026-05-27 21:28:57 -03:00
parent bda03ce5dc
commit 3c3a02ed42

114
src/lib/playground/types.ts Normal file
View File

@@ -0,0 +1,114 @@
// src/lib/playground/types.ts
// Re-exports from codeExport + standalone pricing table
export type {
PlaygroundEndpoint,
ExportLanguage,
ChatMessage,
ToolDefinition,
PlaygroundState,
} from "./codeExport";
export { PlaygroundStateSchema, API_KEY_PLACEHOLDER, exportCode, exportAllLanguages, endpointToPath } from "./codeExport";
export type { ImprovePromptRequest, ImprovePromptResult } from "./promptImprover";
export {
ImprovePromptRequestSchema,
META_SYSTEM_PROMPT,
buildImproveChatBody,
parseImprovedContent,
} from "./promptImprover";
/**
* Pricing entry for a model.
* Label "(estimated)" indicates these are approximate values for UI display (D13).
*/
export interface ProviderPricing {
/** Cost per 1k input tokens in USD. */
inUsdPer1k: number;
/** Cost per 1k output tokens in USD. */
outUsdPer1k: number;
/** Display label — always includes "(estimated)". */
label: string;
}
/**
* Static inline pricing table for popular models.
* Used in client-side cost estimation (D13).
* DO NOT use for billing — always labeled "(estimated)".
*
* Prices are approximate as of 2025. For real billing see /api/usage.
*/
export const MODEL_PRICING_TABLE: Record<string, ProviderPricing> = {
"gpt-4o": {
inUsdPer1k: 0.0025,
outUsdPer1k: 0.01,
label: "(estimated)",
},
"gpt-4o-mini": {
inUsdPer1k: 0.00015,
outUsdPer1k: 0.0006,
label: "(estimated)",
},
"claude-sonnet-4-6": {
inUsdPer1k: 0.003,
outUsdPer1k: 0.015,
label: "(estimated)",
},
"claude-opus-4-7": {
inUsdPer1k: 0.015,
outUsdPer1k: 0.075,
label: "(estimated)",
},
"claude-haiku-4-5": {
inUsdPer1k: 0.0008,
outUsdPer1k: 0.004,
label: "(estimated)",
},
"gemini-2.5-pro": {
inUsdPer1k: 0.00125,
outUsdPer1k: 0.01,
label: "(estimated)",
},
"gemini-2.0-flash": {
inUsdPer1k: 0.0001,
outUsdPer1k: 0.0004,
label: "(estimated)",
},
"deepseek-chat": {
inUsdPer1k: 0.00014,
outUsdPer1k: 0.00028,
label: "(estimated)",
},
"llama-3.3-70b": {
inUsdPer1k: 0.00059,
outUsdPer1k: 0.00079,
label: "(estimated)",
},
"mistral-large": {
inUsdPer1k: 0.002,
outUsdPer1k: 0.006,
label: "(estimated)",
},
};
/**
* Look up pricing for a model by name.
* Returns null if not found (use upstream usage data instead).
*/
export function getModelPricing(model: string): ProviderPricing | null {
return MODEL_PRICING_TABLE[model] ?? null;
}
/**
* Look up pricing for a model — alias with explicit `estimated: true` in return type.
* Required by §3 contract: `getProviderPricing(model): { inUsdPer1k, outUsdPer1k, estimated: true } | null`.
*/
export function getProviderPricing(
model: string,
): { inUsdPer1k: number; outUsdPer1k: number; estimated: true } | null {
const entry = MODEL_PRICING_TABLE[model];
if (!entry) return null;
return { inUsdPer1k: entry.inUsdPer1k, outUsdPer1k: entry.outUsdPer1k, estimated: true };
}