@jeffreycao/copilot-api 1.10.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +1 -1
- package/dist/{server-BnKth1Jp.js → server-DpVPS3zt.js} +116 -30
- package/dist/server-DpVPS3zt.js.map +1 -0
- package/dist/{start-1KA2mHVS.js → start-DDII-0ML.js} +2 -2
- package/dist/{start-1KA2mHVS.js.map → start-DDII-0ML.js.map} +1 -1
- package/package.json +1 -1
- package/pages/index.html +432 -10
- package/dist/server-BnKth1Jp.js.map +0 -1
package/dist/main.js
CHANGED
|
@@ -42,7 +42,7 @@ bindElectronFetch();
|
|
|
42
42
|
const { auth } = await import("./auth-D7YCTWpx.js");
|
|
43
43
|
const { checkUsage } = await import("./check-usage-Dgg0nNEw.js");
|
|
44
44
|
const { debug } = await import("./debug-C_TBkyUw.js");
|
|
45
|
-
const { start } = await import("./start-
|
|
45
|
+
const { start } = await import("./start-DDII-0ML.js");
|
|
46
46
|
await runMain(defineCommand({
|
|
47
47
|
meta: {
|
|
48
48
|
name: "copilot-api",
|
|
@@ -504,19 +504,14 @@ async function flushTokenUsageEvents() {
|
|
|
504
504
|
}
|
|
505
505
|
function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
|
|
506
506
|
const start = new Date(now);
|
|
507
|
+
start.setHours(0, 0, 0, 0);
|
|
507
508
|
switch (period) {
|
|
508
|
-
case "day":
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
case "week": {
|
|
512
|
-
const daysSinceMonday = (start.getDay() + 6) % 7;
|
|
513
|
-
start.setDate(start.getDate() - daysSinceMonday);
|
|
514
|
-
start.setHours(0, 0, 0, 0);
|
|
509
|
+
case "day": break;
|
|
510
|
+
case "week":
|
|
511
|
+
start.setDate(start.getDate() - 6);
|
|
515
512
|
break;
|
|
516
|
-
}
|
|
517
513
|
case "month":
|
|
518
|
-
start.setDate(
|
|
519
|
-
start.setHours(0, 0, 0, 0);
|
|
514
|
+
start.setDate(start.getDate() - 29);
|
|
520
515
|
break;
|
|
521
516
|
default: break;
|
|
522
517
|
}
|
|
@@ -529,7 +524,7 @@ function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
|
|
|
529
524
|
end.setDate(end.getDate() + 7);
|
|
530
525
|
break;
|
|
531
526
|
case "month":
|
|
532
|
-
end.
|
|
527
|
+
end.setDate(end.getDate() + 30);
|
|
533
528
|
break;
|
|
534
529
|
default: break;
|
|
535
530
|
}
|
|
@@ -538,6 +533,26 @@ function getPeriodRange(period, now = /* @__PURE__ */ new Date()) {
|
|
|
538
533
|
startMs: start.getTime()
|
|
539
534
|
};
|
|
540
535
|
}
|
|
536
|
+
function formatLocalDate(date) {
|
|
537
|
+
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
|
|
538
|
+
}
|
|
539
|
+
function createDailyIntervals(range) {
|
|
540
|
+
const intervals = [];
|
|
541
|
+
const cursor = new Date(range.startMs);
|
|
542
|
+
while (cursor.getTime() < range.endMs) {
|
|
543
|
+
const startMs = cursor.getTime();
|
|
544
|
+
const next = new Date(cursor);
|
|
545
|
+
next.setDate(next.getDate() + 1);
|
|
546
|
+
const endMs = Math.min(next.getTime(), range.endMs);
|
|
547
|
+
intervals.push({
|
|
548
|
+
date: formatLocalDate(cursor),
|
|
549
|
+
endMs,
|
|
550
|
+
startMs
|
|
551
|
+
});
|
|
552
|
+
cursor.setTime(endMs);
|
|
553
|
+
}
|
|
554
|
+
return intervals;
|
|
555
|
+
}
|
|
541
556
|
function createEmptyTotals() {
|
|
542
557
|
return {
|
|
543
558
|
cache_creation_input_tokens: 0,
|
|
@@ -548,6 +563,14 @@ function createEmptyTotals() {
|
|
|
548
563
|
total_tokens: 0
|
|
549
564
|
};
|
|
550
565
|
}
|
|
566
|
+
function addTotals(target, next) {
|
|
567
|
+
target.cache_creation_input_tokens += next.cache_creation_input_tokens;
|
|
568
|
+
target.cache_read_input_tokens += next.cache_read_input_tokens;
|
|
569
|
+
target.input_tokens += next.input_tokens;
|
|
570
|
+
target.output_tokens += next.output_tokens;
|
|
571
|
+
target.request_count += next.request_count;
|
|
572
|
+
target.total_tokens += next.total_tokens;
|
|
573
|
+
}
|
|
551
574
|
function createEmptySummary(period) {
|
|
552
575
|
const range = getPeriodRange(period);
|
|
553
576
|
return {
|
|
@@ -562,6 +585,27 @@ function createEmptySummary(period) {
|
|
|
562
585
|
totals: createEmptyTotals()
|
|
563
586
|
};
|
|
564
587
|
}
|
|
588
|
+
function createEmptyDailySummary(period) {
|
|
589
|
+
const range = getPeriodRange(period);
|
|
590
|
+
return {
|
|
591
|
+
byModel: [],
|
|
592
|
+
days: createDailyIntervals(range).map((interval) => ({
|
|
593
|
+
byModel: [],
|
|
594
|
+
date: interval.date,
|
|
595
|
+
end_ms: interval.endMs,
|
|
596
|
+
start_ms: interval.startMs,
|
|
597
|
+
totals: createEmptyTotals()
|
|
598
|
+
})),
|
|
599
|
+
period,
|
|
600
|
+
range: {
|
|
601
|
+
end_ms: range.endMs,
|
|
602
|
+
end_utc: new Date(range.endMs).toISOString(),
|
|
603
|
+
start_ms: range.startMs,
|
|
604
|
+
start_utc: new Date(range.startMs).toISOString()
|
|
605
|
+
},
|
|
606
|
+
totals: createEmptyTotals()
|
|
607
|
+
};
|
|
608
|
+
}
|
|
565
609
|
function createEmptyEventsPage(input) {
|
|
566
610
|
const range = getPeriodRange(input.period);
|
|
567
611
|
return {
|
|
@@ -579,6 +623,14 @@ function createEmptyEventsPage(input) {
|
|
|
579
623
|
total_pages: 1
|
|
580
624
|
};
|
|
581
625
|
}
|
|
626
|
+
function rangePayload(range) {
|
|
627
|
+
return {
|
|
628
|
+
end_ms: range.endMs,
|
|
629
|
+
end_utc: new Date(range.endMs).toISOString(),
|
|
630
|
+
start_ms: range.startMs,
|
|
631
|
+
start_utc: new Date(range.startMs).toISOString()
|
|
632
|
+
};
|
|
633
|
+
}
|
|
582
634
|
function numberFromRow(row, key) {
|
|
583
635
|
const value = row?.[key];
|
|
584
636
|
return typeof value === "number" && Number.isFinite(value) ? value : 0;
|
|
@@ -593,6 +645,12 @@ function totalsFromRow(row) {
|
|
|
593
645
|
total_tokens: numberFromRow(row, "total_tokens")
|
|
594
646
|
};
|
|
595
647
|
}
|
|
648
|
+
function modelSummaryFromRow(row) {
|
|
649
|
+
return {
|
|
650
|
+
...totalsFromRow(row),
|
|
651
|
+
model: typeof row.model === "string" ? row.model : "unknown"
|
|
652
|
+
};
|
|
653
|
+
}
|
|
596
654
|
function stringFromRow(row, key) {
|
|
597
655
|
const value = row[key];
|
|
598
656
|
return typeof value === "string" ? value : "";
|
|
@@ -620,12 +678,8 @@ function usageEventFromRow(row) {
|
|
|
620
678
|
user_id: stringFromRow(row, "user_id")
|
|
621
679
|
};
|
|
622
680
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
await flushTokenUsageEvents();
|
|
626
|
-
const range = getPeriodRange(period);
|
|
627
|
-
const db = await getDb();
|
|
628
|
-
const totalsRow = db.prepare(`
|
|
681
|
+
function getTotalsRow(db, range) {
|
|
682
|
+
return db.prepare(`
|
|
629
683
|
SELECT
|
|
630
684
|
COUNT(*) AS request_count,
|
|
631
685
|
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
@@ -636,8 +690,9 @@ async function getTokenUsageSummary(period) {
|
|
|
636
690
|
FROM token_usage_events
|
|
637
691
|
WHERE created_at_ms >= ? AND created_at_ms < ?
|
|
638
692
|
`).get(range.startMs, range.endMs);
|
|
639
|
-
|
|
640
|
-
|
|
693
|
+
}
|
|
694
|
+
function getModelRows(db, range) {
|
|
695
|
+
return db.prepare(`
|
|
641
696
|
SELECT
|
|
642
697
|
model,
|
|
643
698
|
COUNT(*) AS request_count,
|
|
@@ -652,20 +707,47 @@ async function getTokenUsageSummary(period) {
|
|
|
652
707
|
ORDER BY
|
|
653
708
|
total_tokens DESC,
|
|
654
709
|
model ASC
|
|
655
|
-
`).all(range.startMs, range.endMs)
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
710
|
+
`).all(range.startMs, range.endMs);
|
|
711
|
+
}
|
|
712
|
+
function createDailyBucket(interval, rows) {
|
|
713
|
+
const byModel = rows.map((row) => modelSummaryFromRow(row));
|
|
714
|
+
const totals = createEmptyTotals();
|
|
715
|
+
for (const model of byModel) addTotals(totals, model);
|
|
716
|
+
return {
|
|
717
|
+
byModel,
|
|
718
|
+
date: interval.date,
|
|
719
|
+
end_ms: interval.endMs,
|
|
720
|
+
start_ms: interval.startMs,
|
|
721
|
+
totals
|
|
722
|
+
};
|
|
723
|
+
}
|
|
724
|
+
async function getTokenUsageSummary(period) {
|
|
725
|
+
if (!isTokenUsageStorageEnabled()) return createEmptySummary(period);
|
|
726
|
+
await flushTokenUsageEvents();
|
|
727
|
+
const range = getPeriodRange(period);
|
|
728
|
+
const db = await getDb();
|
|
729
|
+
const totalsRow = getTotalsRow(db, range);
|
|
730
|
+
return {
|
|
731
|
+
byModel: getModelRows(db, range).map((row) => modelSummaryFromRow(row)),
|
|
659
732
|
period,
|
|
660
|
-
range:
|
|
661
|
-
end_ms: range.endMs,
|
|
662
|
-
end_utc: new Date(range.endMs).toISOString(),
|
|
663
|
-
start_ms: range.startMs,
|
|
664
|
-
start_utc: new Date(range.startMs).toISOString()
|
|
665
|
-
},
|
|
733
|
+
range: rangePayload(range),
|
|
666
734
|
totals: totalsFromRow(totalsRow)
|
|
667
735
|
};
|
|
668
736
|
}
|
|
737
|
+
async function getTokenUsageDailySummary(period) {
|
|
738
|
+
if (!isTokenUsageStorageEnabled()) return createEmptyDailySummary(period);
|
|
739
|
+
await flushTokenUsageEvents();
|
|
740
|
+
const range = getPeriodRange(period);
|
|
741
|
+
const db = await getDb();
|
|
742
|
+
const intervals = createDailyIntervals(range);
|
|
743
|
+
return {
|
|
744
|
+
byModel: getModelRows(db, range).map((row) => modelSummaryFromRow(row)),
|
|
745
|
+
days: intervals.map((interval) => createDailyBucket(interval, getModelRows(db, interval))),
|
|
746
|
+
period,
|
|
747
|
+
range: rangePayload(range),
|
|
748
|
+
totals: totalsFromRow(getTotalsRow(db, range))
|
|
749
|
+
};
|
|
750
|
+
}
|
|
669
751
|
async function getTokenUsageEventsPage(input) {
|
|
670
752
|
if (!isTokenUsageStorageEnabled()) return createEmptyEventsPage(input);
|
|
671
753
|
await flushTokenUsageEvents();
|
|
@@ -4580,6 +4662,10 @@ tokenUsageRoute.get("/", async (c) => {
|
|
|
4580
4662
|
const summary = await getTokenUsageSummary(parsePeriod(c.req.query("period")));
|
|
4581
4663
|
return c.json(summary);
|
|
4582
4664
|
});
|
|
4665
|
+
tokenUsageRoute.get("/daily", async (c) => {
|
|
4666
|
+
const summary = await getTokenUsageDailySummary(parsePeriod(c.req.query("period")));
|
|
4667
|
+
return c.json(summary);
|
|
4668
|
+
});
|
|
4583
4669
|
tokenUsageRoute.get("/events", async (c) => {
|
|
4584
4670
|
const period = parsePeriod(c.req.query("period"));
|
|
4585
4671
|
const eventsPage = await getTokenUsageEventsPage({
|
|
@@ -4649,4 +4735,4 @@ server.route("/:provider/v1/models", providerModelRoutes);
|
|
|
4649
4735
|
//#endregion
|
|
4650
4736
|
export { server };
|
|
4651
4737
|
|
|
4652
|
-
//# sourceMappingURL=server-
|
|
4738
|
+
//# sourceMappingURL=server-DpVPS3zt.js.map
|