feat(ai-review 使用量): 新增多平台 AI 助理使用量統計與剩餘可用百分比

This commit is contained in:
Jeffery
2026-06-23 12:58:43 +08:00
parent e6d1a17b78
commit 1151535161
4 changed files with 278 additions and 7 deletions
+11 -1
View File
@@ -5,6 +5,7 @@ import { getPRDiff, postComment, getCommitMessageBySha, getBotReviewOutcome, sho
import { analyzeWithRole, loadOldFindings, mergeFindings, sortByLevel, deduplicateWithAI, loadExclusions, applyExclusions, filterFalsePositivesWithAI } from './findings.js';
import { reconcileConversations, dropResolvedFindings, addCarriedFindings } from './resolve.js';
import { saveFindings, postFindingsReview, formatFindingsStatsLine } from './comments.js';
import { getRunUsage, getRateLimit, fetchAccountQuota, formatUsageStats, formatUsageStatsLine } from './usage.js';
import { cloneRepo, commitAndPush, getRepoState } from './git.js';
import { validateJSONArrayFile, ensureJSONArrayFileExists } from './json.js';
import { runPreflight } from './preflight.js';
@@ -53,7 +54,7 @@ async function main() {
warn(`Step2 對話收斂失敗(繼續執行): ${e.message}`);
}
const { provider, baseURL, model } = getLLMConfig();
const { provider, apiKeys, baseURL, model } = getLLMConfig();
if (!provider) {
error('未設定任何 LLM API Key,請檢查 action inputs');
process.exit(1);
@@ -137,6 +138,14 @@ async function main() {
step('Step6', 'Findings 寫入與 Review 發布');
const reviewDir = repoDir || WORKSPACE;
saveFindings(WORKSPACE, filtered, reviewDir);
// 蒐集 AI 助理使用量:本次 token 消耗 + 剩餘可用百分比(帳號額度優先,否則用回應 header 的速率配額;皆失敗時降級為「無法計算」,不中斷流程)
const runUsage = getRunUsage();
const quota = await fetchAccountQuota(provider, { apiKeys, baseURL });
const rate = getRateLimit();
const usageSection = formatUsageStats(provider, model, runUsage, quota, rate);
line(`使用量統計: ${formatUsageStatsLine(provider, model, runUsage, quota, rate)}`);
try {
logFindingsStats('Step6 儲存 findings 統計', filtered);
logFindingsStats('Step6 review summary 統計', filtered);
@@ -144,6 +153,7 @@ async function main() {
await postFindingsReview(filtered, {
summaryFindings: filtered,
commentFindings: filtered,
usageSection,
});
ok('Step6 完成');
} catch (e) {