diff --git a/src/backend/src/modules/puterai/OpenRouterService.js b/src/backend/src/modules/puterai/OpenRouterService.js index f952b91b..8e7883d8 100644 --- a/src/backend/src/modules/puterai/OpenRouterService.js +++ b/src/backend/src/modules/puterai/OpenRouterService.js @@ -22,7 +22,6 @@ const APIError = require("../../api/APIError"); const BaseService = require("../../services/BaseService"); const OpenAIUtil = require("./lib/OpenAIUtil"); const { Context } = require("../../util/context"); -const { default: ml } = require("../../../../gui/src/i18n/translations/ml"); /** * XAIService class - Provides integration with X.AI's API for chat completions @@ -39,9 +38,6 @@ class OpenRouterService extends BaseService { axios: require('axios'), }; - /** @type {import('../../services/abuse-prevention/MeteringService/MeteringService').MeteringAndBillingService} */ - meteringAndBillingService; - /** * Gets the system prompt used for AI interactions * @returns {string} The base system prompt that identifies the AI as running on Puter @@ -50,6 +46,9 @@ class OpenRouterService extends BaseService { return model; } + /** @type {import('../../services/abuse-prevention/MeteringService/MeteringService').MeteringAndBillingService} */ + meteringAndBillingService; + /** * Initializes the XAI service by setting up the OpenAI client and registering with the AI chat provider * @private @@ -142,7 +141,7 @@ class OpenRouterService extends BaseService { const modelDetails = (await this.models_()).find(m => m.id === 'openrouter:' + model); return OpenAIUtil.handle_completion_output({ - usage_calculator: async ({ usage }) => { + usage_calculator: ({ usage }) => { const trackedUsage = OpenAIUtil.extractMeteredUsage(usage); this.meteringAndBillingService.utilRecordUsageObject(trackedUsage, actor, modelDetails.id); const legacyCostCalculator = OpenAIUtil.create_usage_calculator({ diff --git a/src/backend/src/modules/puterai/lib/OpenAIUtil.js b/src/backend/src/modules/puterai/lib/OpenAIUtil.js index 3fb44744..0d8371d2 100644 --- a/src/backend/src/modules/puterai/lib/OpenAIUtil.js +++ b/src/backend/src/modules/puterai/lib/OpenAIUtil.js @@ -92,6 +92,7 @@ const create_chat_stream_handler = ({ deviations, completion, usage_calculator, + usage_promise, }) => async ({ chatStream }) => { deviations = Object.assign({ // affected by: Groq @@ -153,6 +154,9 @@ const create_chat_stream_handler = ({ } } } + + usage_promise.resolve(last_usage); + if ( mode === 'text' ) textblock.end(); if ( mode === 'tool' ) toolblock.end(); message.end(); diff --git a/src/backend/src/services/abuse-prevention/MeteringService/MeteringService.ts b/src/backend/src/services/abuse-prevention/MeteringService/MeteringService.ts index d7d8b839..fa6e009f 100644 --- a/src/backend/src/services/abuse-prevention/MeteringService/MeteringService.ts +++ b/src/backend/src/services/abuse-prevention/MeteringService/MeteringService.ts @@ -39,10 +39,6 @@ const METRICS_PREFIX = 'metering'; const POLICY_PREFIX = 'policy'; const PERIOD_ESCAPE = '_dot_'; // to replace dots in usage types for kvstore paths -type AllPrefixes = - T extends `${infer C}${infer R}` - ? `${P}${C}` | AllPrefixes - : P; /** * Handles usage metering and supports stubbs for billing methods for current scoped actor */