get_cost_analytics
Retrieve detailed cost analytics data over time to analyze spending patterns, track total costs, and calculate averages per request for API usage monitoring.
Instructions
Retrieve detailed cost analytics data over time, including total costs and averages per request
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| time_of_generation_min | Yes | Start time for the analytics period (ISO8601 format, e.g., '2024-01-01T00:00:00Z') | |
| time_of_generation_max | Yes | End time for the analytics period (ISO8601 format, e.g., '2024-02-01T00:00:00Z') | |
| total_units_min | No | Minimum number of total tokens to filter by | |
| total_units_max | No | Maximum number of total tokens to filter by | |
| cost_min | No | Minimum cost in cents to filter by | |
| cost_max | No | Maximum cost in cents to filter by | |
| prompt_token_min | No | Minimum number of prompt tokens | |
| prompt_token_max | No | Maximum number of prompt tokens | |
| completion_token_min | No | Minimum number of completion tokens | |
| completion_token_max | No | Maximum number of completion tokens | |
| status_code | No | Filter by specific HTTP status codes (comma-separated) | |
| weighted_feedback_min | No | Minimum weighted feedback score (-10 to 10) | |
| weighted_feedback_max | No | Maximum weighted feedback score (-10 to 10) | |
| virtual_keys | No | Filter by specific virtual key slugs (comma-separated) | |
| configs | No | Filter by specific config slugs (comma-separated) | |
| workspace_slug | No | Filter by specific workspace | |
| api_key_ids | No | Filter by specific API key UUIDs (comma-separated) | |
| metadata | No | Filter by metadata (stringified JSON object) | |
| ai_org_model | No | Filter by AI provider and model (comma-separated, use __ as separator) | |
| trace_id | No | Filter by trace IDs (comma-separated) | |
| span_id | No | Filter by span IDs (comma-separated) |
Implementation Reference
- src/index.ts:272-327 (registration)MCP tool registration for 'get_cost_analytics', including input schema (Zod), description, and handler function that delegates to PortkeyServiceserver.tool( "get_cost_analytics", "Retrieve detailed cost analytics data over time, including total costs and averages per request", { time_of_generation_min: z.string().describe("Start time for the analytics period (ISO8601 format, e.g., '2024-01-01T00:00:00Z')"), time_of_generation_max: z.string().describe("End time for the analytics period (ISO8601 format, e.g., '2024-02-01T00:00:00Z')"), total_units_min: z.number().positive().optional().describe("Minimum number of total tokens to filter by"), total_units_max: z.number().positive().optional().describe("Maximum number of total tokens to filter by"), cost_min: z.number().positive().optional().describe("Minimum cost in cents to filter by"), cost_max: z.number().positive().optional().describe("Maximum cost in cents to filter by"), prompt_token_min: z.number().positive().optional().describe("Minimum number of prompt tokens"), prompt_token_max: z.number().positive().optional().describe("Maximum number of prompt tokens"), completion_token_min: z.number().positive().optional().describe("Minimum number of completion tokens"), completion_token_max: z.number().positive().optional().describe("Maximum number of completion tokens"), status_code: z.string().optional().describe("Filter by specific HTTP status codes (comma-separated)"), weighted_feedback_min: z.number().min(-10).max(10).optional().describe("Minimum weighted feedback score (-10 to 10)"), weighted_feedback_max: z.number().min(-10).max(10).optional().describe("Maximum weighted feedback score (-10 to 10)"), virtual_keys: z.string().optional().describe("Filter by specific virtual key slugs (comma-separated)"), configs: z.string().optional().describe("Filter by specific config slugs (comma-separated)"), workspace_slug: z.string().optional().describe("Filter by specific workspace"), api_key_ids: z.string().optional().describe("Filter by specific API key UUIDs (comma-separated)"), metadata: z.string().optional().describe("Filter by metadata (stringified JSON object)"), ai_org_model: z.string().optional().describe("Filter by AI provider and model (comma-separated, use __ as separator)"), trace_id: z.string().optional().describe("Filter by trace IDs (comma-separated)"), span_id: z.string().optional().describe("Filter by span IDs (comma-separated)") }, async (params) => { try { const analytics = await portkeyService.getCostAnalytics(params); return { content: [{ type: "text", text: JSON.stringify({ summary: { total_cost: analytics.summary.total, average_cost_per_request: analytics.summary.avg }, data_points: analytics.data_points.map(point => ({ timestamp: point.timestamp, total_cost: point.total, average_cost: point.avg })), object: analytics.object }, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Error fetching cost analytics: ${error instanceof Error ? error.message : 'Unknown error'}` }] }; } } );
- src/services/portkey.service.ts:470-516 (handler)Core handler function in PortkeyService that constructs query parameters and fetches cost analytics data from Portkey API endpoint /analytics/graphs/costasync getCostAnalytics(params: CostAnalyticsParams): Promise<CostAnalyticsResponse> { try { const queryParams = new URLSearchParams({ time_of_generation_min: params.time_of_generation_min, time_of_generation_max: params.time_of_generation_max, ...(params.total_units_min && { total_units_min: params.total_units_min.toString() }), ...(params.total_units_max && { total_units_max: params.total_units_max.toString() }), ...(params.cost_min && { cost_min: params.cost_min.toString() }), ...(params.cost_max && { cost_max: params.cost_max.toString() }), ...(params.prompt_token_min && { prompt_token_min: params.prompt_token_min.toString() }), ...(params.prompt_token_max && { prompt_token_max: params.prompt_token_max.toString() }), ...(params.completion_token_min && { completion_token_min: params.completion_token_min.toString() }), ...(params.completion_token_max && { completion_token_max: params.completion_token_max.toString() }), ...(params.status_code && { status_code: params.status_code }), ...(params.weighted_feedback_min && { weighted_feedback_min: params.weighted_feedback_min.toString() }), ...(params.weighted_feedback_max && { weighted_feedback_max: params.weighted_feedback_max.toString() }), ...(params.virtual_keys && { virtual_keys: params.virtual_keys }), ...(params.configs && { configs: params.configs }), ...(params.workspace_slug && { workspace_slug: params.workspace_slug }), ...(params.api_key_ids && { api_key_ids: params.api_key_ids }), ...(params.metadata && { metadata: params.metadata }), ...(params.ai_org_model && { ai_org_model: params.ai_org_model }), ...(params.trace_id && { trace_id: params.trace_id }), ...(params.span_id && { span_id: params.span_id }) }); const response = await fetch( `${this.baseUrl}/analytics/graphs/cost?${queryParams.toString()}`, { method: 'GET', headers: { 'x-portkey-api-key': this.apiKey, 'Accept': 'application/json' } } ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json() as CostAnalyticsResponse; } catch (error) { console.error('PortkeyService Error:', error); throw new Error('Failed to fetch cost analytics from Portkey API'); } }
- TypeScript interfaces defining input parameters (CostAnalyticsParams), response (CostAnalyticsResponse), data points, and summary for cost analyticsinterface CostDataPoint { timestamp: string; total: number; avg: number; } interface CostSummary { total: number; avg: number; } interface CostAnalyticsResponse { object: 'analytics-graph'; data_points: CostDataPoint[]; summary: CostSummary; } interface CostAnalyticsParams { time_of_generation_min: string; // ISO8601 format time_of_generation_max: string; // ISO8601 format total_units_min?: number; total_units_max?: number; cost_min?: number; cost_max?: number; prompt_token_min?: number; prompt_token_max?: number; completion_token_min?: number; completion_token_max?: number; status_code?: string; weighted_feedback_min?: number; weighted_feedback_max?: number; virtual_keys?: string; configs?: string; workspace_slug?: string; api_key_ids?: string; metadata?: string; ai_org_model?: string; trace_id?: string; span_id?: string; }
- src/index.ts:275-297 (schema)Zod schema for input validation of the 'get_cost_analytics' tool parameters in MCP registration{ time_of_generation_min: z.string().describe("Start time for the analytics period (ISO8601 format, e.g., '2024-01-01T00:00:00Z')"), time_of_generation_max: z.string().describe("End time for the analytics period (ISO8601 format, e.g., '2024-02-01T00:00:00Z')"), total_units_min: z.number().positive().optional().describe("Minimum number of total tokens to filter by"), total_units_max: z.number().positive().optional().describe("Maximum number of total tokens to filter by"), cost_min: z.number().positive().optional().describe("Minimum cost in cents to filter by"), cost_max: z.number().positive().optional().describe("Maximum cost in cents to filter by"), prompt_token_min: z.number().positive().optional().describe("Minimum number of prompt tokens"), prompt_token_max: z.number().positive().optional().describe("Maximum number of prompt tokens"), completion_token_min: z.number().positive().optional().describe("Minimum number of completion tokens"), completion_token_max: z.number().positive().optional().describe("Maximum number of completion tokens"), status_code: z.string().optional().describe("Filter by specific HTTP status codes (comma-separated)"), weighted_feedback_min: z.number().min(-10).max(10).optional().describe("Minimum weighted feedback score (-10 to 10)"), weighted_feedback_max: z.number().min(-10).max(10).optional().describe("Maximum weighted feedback score (-10 to 10)"), virtual_keys: z.string().optional().describe("Filter by specific virtual key slugs (comma-separated)"), configs: z.string().optional().describe("Filter by specific config slugs (comma-separated)"), workspace_slug: z.string().optional().describe("Filter by specific workspace"), api_key_ids: z.string().optional().describe("Filter by specific API key UUIDs (comma-separated)"), metadata: z.string().optional().describe("Filter by metadata (stringified JSON object)"), ai_org_model: z.string().optional().describe("Filter by AI provider and model (comma-separated, use __ as separator)"), trace_id: z.string().optional().describe("Filter by trace IDs (comma-separated)"), span_id: z.string().optional().describe("Filter by span IDs (comma-separated)") },