From 692f6bcfcd37d086ee45f654e457cdf3bc12a550 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:34:55 +0000 Subject: [PATCH 1/2] Initial plan From 0276dd131ebc86f1f26e9204c7d765ce7a48b478 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:46:12 +0000 Subject: [PATCH 2/2] fix: use floating point for PRU computation in extractPremiumRequestCount - Update regex patterns to match decimal numbers (e.g., 0.33, 2.5) using \d+(?:\.\d+)? instead of \d+ - Replace parseInt with parseFloat for correct fractional PRU parsing - Add tests for decimal PRU values in multiple log format variants Fixes models like gemini-3-flash-preview that consume 0.33 PRU per request being incorrectly counted as 1 premium request Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> Agent-Logs-Url: https://github.com/github/gh-aw/sessions/b69733e2-c34e-426f-9da6-68164229a326 --- actions/setup/js/parse_copilot_log.cjs | 5 +++-- actions/setup/js/parse_copilot_log.test.cjs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/actions/setup/js/parse_copilot_log.cjs b/actions/setup/js/parse_copilot_log.cjs index 48223d8a005..f070c749b8c 100644 --- a/actions/setup/js/parse_copilot_log.cjs +++ b/actions/setup/js/parse_copilot_log.cjs @@ -17,12 +17,13 @@ const main = createEngineLogParser({ */ function extractPremiumRequestCount(logContent) { // Try various patterns that might appear in the Copilot CLI output - const patterns = [/premium\s+requests?\s+consumed:?\s*(\d+)/i, /(\d+)\s+premium\s+requests?\s+consumed/i, /consumed\s+(\d+)\s+premium\s+requests?/i]; + // Use \d+(?:\.\d+)? to match both integers and decimals (e.g., 1, 0.33, 2.5) + const patterns = [/premium\s+requests?\s+consumed:?\s*(\d+(?:\.\d+)?)/i, /(\d+(?:\.\d+)?)\s+premium\s+requests?\s+consumed/i, /consumed\s+(\d+(?:\.\d+)?)\s+premium\s+requests?/i]; for (const pattern of patterns) { const match = logContent.match(pattern); if (match && match[1]) { - const count = parseInt(match[1], 10); + const count = parseFloat(match[1]); if (!isNaN(count) && count > 0) { return count; } diff --git a/actions/setup/js/parse_copilot_log.test.cjs b/actions/setup/js/parse_copilot_log.test.cjs index 241707af18e..1e2a262af7a 100644 --- a/actions/setup/js/parse_copilot_log.test.cjs +++ b/actions/setup/js/parse_copilot_log.test.cjs @@ -232,6 +232,22 @@ describe("parse_copilot_log.cjs", () => { it("should ignore invalid numbers", () => { expect(extractPremiumRequestCount("Premium requests: abc")).toBe(1); }); + + it("should parse integer premium request count", () => { + expect(extractPremiumRequestCount("premium requests consumed: 2")).toBe(2); + }); + + it("should parse decimal premium request count (e.g. gemini-3-flash-preview)", () => { + expect(extractPremiumRequestCount("premium requests consumed: 0.33")).toBe(0.33); + }); + + it("should parse decimal in alternate format", () => { + expect(extractPremiumRequestCount("0.33 premium requests consumed")).toBe(0.33); + }); + + it("should parse decimal in consumed-first format", () => { + expect(extractPremiumRequestCount("consumed 0.5 premium requests")).toBe(0.5); + }); }); describe("main function integration", () => {