zerogpu-cli 2.2.0 → 2.4.0
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/README.md +3 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +5 -3
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/chatThinking.d.ts.map +1 -1
- package/dist/commands/chatThinking.js +5 -3
- package/dist/commands/chatThinking.js.map +1 -1
- package/dist/commands/classifyIab.d.ts.map +1 -1
- package/dist/commands/classifyIab.js +5 -3
- package/dist/commands/classifyIab.js.map +1 -1
- package/dist/commands/classifyIabEnriched.d.ts.map +1 -1
- package/dist/commands/classifyIabEnriched.js +5 -3
- package/dist/commands/classifyIabEnriched.js.map +1 -1
- package/dist/commands/classifyStructured.d.ts.map +1 -1
- package/dist/commands/classifyStructured.js +5 -3
- package/dist/commands/classifyStructured.js.map +1 -1
- package/dist/commands/classifyZeroShot.d.ts.map +1 -1
- package/dist/commands/classifyZeroShot.js +5 -3
- package/dist/commands/classifyZeroShot.js.map +1 -1
- package/dist/commands/costSavings.d.ts +3 -0
- package/dist/commands/costSavings.d.ts.map +1 -0
- package/dist/commands/costSavings.js +23 -0
- package/dist/commands/costSavings.js.map +1 -0
- package/dist/commands/extractEntities.d.ts.map +1 -1
- package/dist/commands/extractEntities.js +5 -3
- package/dist/commands/extractEntities.js.map +1 -1
- package/dist/commands/extractJson.d.ts.map +1 -1
- package/dist/commands/extractJson.js +5 -3
- package/dist/commands/extractJson.js.map +1 -1
- package/dist/commands/extractPii.d.ts.map +1 -1
- package/dist/commands/extractPii.js +5 -3
- package/dist/commands/extractPii.js.map +1 -1
- package/dist/commands/generateFollowups.d.ts.map +1 -1
- package/dist/commands/generateFollowups.js +5 -3
- package/dist/commands/generateFollowups.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +26 -23
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/redactPii.d.ts.map +1 -1
- package/dist/commands/redactPii.js +5 -3
- package/dist/commands/redactPii.js.map +1 -1
- package/dist/commands/summarize.d.ts.map +1 -1
- package/dist/commands/summarize.js +5 -3
- package/dist/commands/summarize.js.map +1 -1
- package/dist/lib/responses.d.ts +13 -0
- package/dist/lib/responses.d.ts.map +1 -1
- package/dist/lib/savings.d.ts +40 -0
- package/dist/lib/savings.d.ts.map +1 -0
- package/dist/lib/savings.js +229 -0
- package/dist/lib/savings.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFollowups.d.ts","sourceRoot":"","sources":["../../src/commands/generateFollowups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"generateFollowups.d.ts","sourceRoot":"","sources":["../../src/commands/generateFollowups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgEvE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getApiKey, getProjectId } from "../lib/auth.js";
|
|
2
2
|
import { RESPONSES_ENDPOINT, } from "../lib/responses.js";
|
|
3
|
+
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
3
4
|
const MODEL = "zlm-v1-followup-questions-edge";
|
|
4
5
|
export function registerGenerateFollowupsCommand(program) {
|
|
5
6
|
program
|
|
@@ -9,8 +10,8 @@ export function registerGenerateFollowupsCommand(program) {
|
|
|
9
10
|
.action(async (text) => {
|
|
10
11
|
const apiKey = getApiKey();
|
|
11
12
|
const projectId = getProjectId();
|
|
12
|
-
if (!apiKey
|
|
13
|
-
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key.");
|
|
14
15
|
process.exit(1);
|
|
15
16
|
}
|
|
16
17
|
let response;
|
|
@@ -20,7 +21,7 @@ export function registerGenerateFollowupsCommand(program) {
|
|
|
20
21
|
headers: {
|
|
21
22
|
"content-type": "application/json",
|
|
22
23
|
"x-api-key": apiKey.apiKey,
|
|
23
|
-
"x-project-id": projectId.projectId,
|
|
24
|
+
...(projectId ? { "x-project-id": projectId.projectId } : {}),
|
|
24
25
|
},
|
|
25
26
|
body: JSON.stringify({
|
|
26
27
|
model: MODEL,
|
|
@@ -54,6 +55,7 @@ export function registerGenerateFollowupsCommand(program) {
|
|
|
54
55
|
catch {
|
|
55
56
|
console.log(content);
|
|
56
57
|
}
|
|
58
|
+
recordAndMaybeNotify({ model: MODEL, usage: data.usage });
|
|
57
59
|
});
|
|
58
60
|
}
|
|
59
61
|
//# sourceMappingURL=generateFollowups.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFollowups.js","sourceRoot":"","sources":["../../src/commands/generateFollowups.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"generateFollowups.js","sourceRoot":"","sources":["../../src/commands/generateFollowups.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2CpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6F3D"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { validateApiKey, validateProjectId } from "../lib/auth.js";
|
|
3
3
|
import { writeConfig, readConfig } from "../lib/config.js";
|
|
4
|
-
import { promptMasked
|
|
4
|
+
import { promptMasked } from "../lib/prompt.js";
|
|
5
5
|
import { upsertEnvExport } from "../lib/shellEnv.js";
|
|
6
6
|
const DASHBOARD_URL = "https://platform.zerogpu.ai/dashboard";
|
|
7
7
|
function openBrowser(url) {
|
|
@@ -41,17 +41,17 @@ export function registerLoginCommand(program) {
|
|
|
41
41
|
.command("login")
|
|
42
42
|
.description("Sign in to ZeroGPU with your API key.")
|
|
43
43
|
.option("--api-key <key>", "Provide your API key directly (skips the prompt).")
|
|
44
|
-
.option("--project-id <id>", "
|
|
44
|
+
.option("--project-id <id>", "Optionally pin a ZeroGPU project ID. If omitted, the project is derived from your API key.")
|
|
45
45
|
.action(async (options) => {
|
|
46
46
|
let rawKey = options.apiKey;
|
|
47
|
-
|
|
48
|
-
if (!rawKey
|
|
47
|
+
const rawProjectId = options.projectId;
|
|
48
|
+
if (!rawKey) {
|
|
49
49
|
const opened = await openBrowser(DASHBOARD_URL);
|
|
50
50
|
if (opened) {
|
|
51
|
-
console.log(`Opening ${DASHBOARD_URL} in your browser — grab your
|
|
51
|
+
console.log(`Opening ${DASHBOARD_URL} in your browser — grab your API Key from there.`);
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
|
-
console.log(`Tip: open ${DASHBOARD_URL} in your browser to grab your
|
|
54
|
+
console.log(`Tip: open ${DASHBOARD_URL} in your browser to grab your API Key.`);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
if (!rawKey) {
|
|
@@ -69,27 +69,30 @@ export function registerLoginCommand(program) {
|
|
|
69
69
|
console.error("Your key should start with \"zgpu-api-\". Please try again.");
|
|
70
70
|
process.exit(1);
|
|
71
71
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
// Project ID is optional — the backend derives the project from the API key.
|
|
73
|
+
// Validate and store it only when the caller explicitly provided one.
|
|
74
|
+
let projectId;
|
|
75
|
+
if (rawProjectId) {
|
|
76
|
+
const projectResult = validateProjectId(rawProjectId);
|
|
77
|
+
if (!projectResult.ok) {
|
|
78
|
+
console.error(`That doesn't look like a valid project ID — ${projectResult.reason}`);
|
|
79
|
+
console.error("It should be a UUID like 4ed3e5bb-c2ed-4d4a-8a66-2b161a27fd1a. Please try again.");
|
|
78
80
|
process.exit(1);
|
|
79
81
|
}
|
|
80
|
-
|
|
81
|
-
const projectResult = validateProjectId(rawProjectId ?? "");
|
|
82
|
-
if (!projectResult.ok) {
|
|
83
|
-
console.error(`That doesn't look like a valid project ID — ${projectResult.reason}`);
|
|
84
|
-
console.error("It should be a UUID like 4ed3e5bb-c2ed-4d4a-8a66-2b161a27fd1a. Please try again.");
|
|
85
|
-
process.exit(1);
|
|
82
|
+
projectId = projectResult.key;
|
|
86
83
|
}
|
|
87
84
|
const existing = readConfig();
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
// Re-login clears any previously pinned project ID; it is restored only
|
|
86
|
+
// when --project-id is passed this run, so login without it returns to the
|
|
87
|
+
// unpinned (derive-from-key) state.
|
|
88
|
+
const next = { ...existing, apiKey: result.key };
|
|
89
|
+
if (projectId) {
|
|
90
|
+
next.projectId = projectId;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
delete next.projectId;
|
|
94
|
+
}
|
|
95
|
+
writeConfig(next);
|
|
93
96
|
const env = upsertEnvExport("ZEROGPU_API_KEY", result.key);
|
|
94
97
|
process.env["ZEROGPU_API_KEY"] = result.key;
|
|
95
98
|
console.log("You're logged in. Your API key has been saved.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redactPii.d.ts","sourceRoot":"","sources":["../../src/commands/redactPii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"redactPii.d.ts","sourceRoot":"","sources":["../../src/commands/redactPii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoE/D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getApiKey, getProjectId } from "../lib/auth.js";
|
|
2
2
|
import { RESPONSES_ENDPOINT, } from "../lib/responses.js";
|
|
3
|
+
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
3
4
|
const MODEL = "gliner-multi-pii-v1";
|
|
4
5
|
export function registerRedactPiiCommand(program) {
|
|
5
6
|
program
|
|
@@ -9,8 +10,8 @@ export function registerRedactPiiCommand(program) {
|
|
|
9
10
|
.action(async (text) => {
|
|
10
11
|
const apiKey = getApiKey();
|
|
11
12
|
const projectId = getProjectId();
|
|
12
|
-
if (!apiKey
|
|
13
|
-
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key
|
|
13
|
+
if (!apiKey) {
|
|
14
|
+
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key.");
|
|
14
15
|
process.exit(1);
|
|
15
16
|
}
|
|
16
17
|
let response;
|
|
@@ -20,7 +21,7 @@ export function registerRedactPiiCommand(program) {
|
|
|
20
21
|
headers: {
|
|
21
22
|
"content-type": "application/json",
|
|
22
23
|
"x-api-key": apiKey.apiKey,
|
|
23
|
-
"x-project-id": projectId.projectId,
|
|
24
|
+
...(projectId ? { "x-project-id": projectId.projectId } : {}),
|
|
24
25
|
},
|
|
25
26
|
body: JSON.stringify({
|
|
26
27
|
model: MODEL,
|
|
@@ -58,6 +59,7 @@ export function registerRedactPiiCommand(program) {
|
|
|
58
59
|
catch {
|
|
59
60
|
console.log(content);
|
|
60
61
|
}
|
|
62
|
+
recordAndMaybeNotify({ model: MODEL, usage: data.usage });
|
|
61
63
|
});
|
|
62
64
|
}
|
|
63
65
|
//# sourceMappingURL=redactPii.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redactPii.js","sourceRoot":"","sources":["../../src/commands/redactPii.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"redactPii.js","sourceRoot":"","sources":["../../src/commands/redactPii.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAEpC,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,mBAAmB,CAAC;SAC5B,KAAK,CAAC,YAAY,CAAC;SACnB,WAAW,CACV,gFAAgF,CACjF;SACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,0EAA0E,CAC3E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE;gBACzC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,MAAM,CAAC,MAAM;oBAC1B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9D;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,QAAQ;qBAClB;iBACF,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YAChE,IAAI,IAAI;gBAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAChC,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D/D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getApiKey, getProjectId } from "../lib/auth.js";
|
|
2
2
|
import { RESPONSES_ENDPOINT, } from "../lib/responses.js";
|
|
3
|
+
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
3
4
|
const MODEL = "llama-3.1-8b-instruct-fast";
|
|
4
5
|
export function registerSummarizeCommand(program) {
|
|
5
6
|
program
|
|
@@ -8,8 +9,8 @@ export function registerSummarizeCommand(program) {
|
|
|
8
9
|
.action(async (text) => {
|
|
9
10
|
const apiKey = getApiKey();
|
|
10
11
|
const projectId = getProjectId();
|
|
11
|
-
if (!apiKey
|
|
12
|
-
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key.");
|
|
13
14
|
process.exit(1);
|
|
14
15
|
}
|
|
15
16
|
let response;
|
|
@@ -19,7 +20,7 @@ export function registerSummarizeCommand(program) {
|
|
|
19
20
|
headers: {
|
|
20
21
|
"content-type": "application/json",
|
|
21
22
|
"x-api-key": apiKey.apiKey,
|
|
22
|
-
"x-project-id": projectId.projectId,
|
|
23
|
+
...(projectId ? { "x-project-id": projectId.projectId } : {}),
|
|
23
24
|
},
|
|
24
25
|
body: JSON.stringify({
|
|
25
26
|
model: MODEL,
|
|
@@ -53,6 +54,7 @@ export function registerSummarizeCommand(program) {
|
|
|
53
54
|
catch {
|
|
54
55
|
console.log(content);
|
|
55
56
|
}
|
|
57
|
+
recordAndMaybeNotify({ model: MODEL, usage: data.usage });
|
|
56
58
|
});
|
|
57
59
|
}
|
|
58
60
|
//# sourceMappingURL=summarize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/commands/summarize.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/responses.d.ts
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
export declare const RESPONSES_ENDPOINT = "https://api.zerogpu.ai/v1/responses";
|
|
2
|
+
export interface ResponsesUsage {
|
|
3
|
+
input_tokens?: number;
|
|
4
|
+
output_tokens?: number;
|
|
5
|
+
total_tokens?: number;
|
|
6
|
+
input_tokens_details?: {
|
|
7
|
+
cached_tokens?: number;
|
|
8
|
+
};
|
|
9
|
+
output_tokens_details?: {
|
|
10
|
+
reasoning_tokens?: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
2
13
|
export interface ResponsesApiResponse {
|
|
14
|
+
model?: string;
|
|
15
|
+
usage?: ResponsesUsage;
|
|
3
16
|
output?: Array<{
|
|
4
17
|
content?: Array<{
|
|
5
18
|
type?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,wCAAwC,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,wCAAwC,CAAC;AAExE,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,qBAAqB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ResponsesUsage } from "./responses.js";
|
|
2
|
+
export interface ModelSavings {
|
|
3
|
+
requests: number;
|
|
4
|
+
savingsUsd: number;
|
|
5
|
+
tokens: number;
|
|
6
|
+
}
|
|
7
|
+
export interface SavingsState {
|
|
8
|
+
version: number;
|
|
9
|
+
totalSavingsUsd: number;
|
|
10
|
+
totalTokens: number;
|
|
11
|
+
totalRequests: number;
|
|
12
|
+
firstRecordedAt: string | null;
|
|
13
|
+
lastRecordedAt: string | null;
|
|
14
|
+
byModel: Record<string, ModelSavings>;
|
|
15
|
+
notice: {
|
|
16
|
+
lastShownAtRequest: number;
|
|
17
|
+
lastMilestoneUsd: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function savingsPath(): string;
|
|
21
|
+
export declare function resolveBaselineModel(): string;
|
|
22
|
+
export declare function estimateTokens(text: string | undefined): number;
|
|
23
|
+
export declare function computeCallSavings(inputTokens: number, outputTokens: number, baseline: string, zgpuModel: string): {
|
|
24
|
+
tokens: number;
|
|
25
|
+
savingsUsd: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function readSavings(): SavingsState;
|
|
28
|
+
export declare function writeSavings(state: SavingsState): void;
|
|
29
|
+
export declare function resetSavings(): void;
|
|
30
|
+
export declare function shouldShowNotice(state: SavingsState, random?: () => number): boolean;
|
|
31
|
+
export interface RecordInput {
|
|
32
|
+
model: string;
|
|
33
|
+
usage?: ResponsesUsage;
|
|
34
|
+
inputText?: string;
|
|
35
|
+
outputText?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function recordAndMaybeNotify(input: RecordInput): void;
|
|
38
|
+
export declare function formatNotice(state: SavingsState): string;
|
|
39
|
+
export declare function formatReport(state: SavingsState): string;
|
|
40
|
+
//# sourceMappingURL=savings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.d.ts","sourceRoot":"","sources":["../../src/lib/savings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAyCrD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,MAAM,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CAClE;AAeD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAYxC;AAED,wBAAgB,WAAW,IAAI,YAAY,CAW1C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAGtD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAWD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,MAAM,GAAE,MAAM,MAAoB,GACjC,OAAO,CAQT;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,cAAc,CAAC;IAEvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAgD7D;AAkCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAQxD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAwDxD"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { configDir } from "./config.js";
|
|
4
|
+
// What the offloaded work would have cost on Claude, per 1M tokens (in / out).
|
|
5
|
+
// Tweak these in one place if Anthropic pricing changes.
|
|
6
|
+
const CLAUDE_PRICING = {
|
|
7
|
+
"claude-opus-4-8": { in: 5, out: 25 },
|
|
8
|
+
"claude-opus-4-7": { in: 5, out: 25 },
|
|
9
|
+
"claude-opus-4-6": { in: 5, out: 25 },
|
|
10
|
+
"claude-sonnet-4-6": { in: 3, out: 15 },
|
|
11
|
+
"claude-haiku-4-5": { in: 1, out: 5 },
|
|
12
|
+
"claude-fable-5": { in: 10, out: 50 },
|
|
13
|
+
};
|
|
14
|
+
const DEFAULT_BASELINE = "claude-opus-4-8";
|
|
15
|
+
// Actual ZeroGPU pricing per 1M tokens (in / out), per model.
|
|
16
|
+
// Source: https://docs.zerogpu.ai model catalog.
|
|
17
|
+
const ZGPU_PRICING = {
|
|
18
|
+
"llama-3.1-8b-instruct-fast": { in: 0.02, out: 0.05 },
|
|
19
|
+
"zlm-v1-iab-classify-edge": { in: 0.05, out: 0.4 },
|
|
20
|
+
"zlm-v1-iab-classify-edge-enriched": { in: 0.05, out: 0.4 },
|
|
21
|
+
"zlm-v1-followup-questions-edge": { in: 0.05, out: 0.4 },
|
|
22
|
+
"gliner-multi-pii-v1": { in: 0.05, out: 0.4 },
|
|
23
|
+
"gliner2-base-v1": { in: 0.05, out: 0.4 },
|
|
24
|
+
"deberta-v3-small": { in: 0.04, out: 0.1 },
|
|
25
|
+
"LFM2.5-1.2B-Thinking": { in: 0.02, out: 0.1 },
|
|
26
|
+
"LFM2.5-1.2B-Instruct": { in: 0.02, out: 0.1 },
|
|
27
|
+
};
|
|
28
|
+
// Conservative fallback for any model id not in the table above.
|
|
29
|
+
const ZGPU_FALLBACK = { in: 0.05, out: 0.4 };
|
|
30
|
+
// Cadence: aim to show the savings note roughly once every 2–3 routed calls,
|
|
31
|
+
// never twice in a row, and guaranteed within a bounded window.
|
|
32
|
+
const MIN_GAP = 2; // never show within this many calls of the last one
|
|
33
|
+
const MAX_GAP = 4; // guaranteed by here
|
|
34
|
+
const SHOW_PROBABILITY = 0.6; // per eligible call between MIN_GAP and MAX_GAP
|
|
35
|
+
// Force a celebratory note when cumulative savings crosses one of these dollar
|
|
36
|
+
// thresholds (subject to a small anti-clustering cooldown).
|
|
37
|
+
const MILESTONES_USD = [0.5, 1, 2, 5, 10, 25, 50, 100, 250, 500, 1000];
|
|
38
|
+
function freshState() {
|
|
39
|
+
return {
|
|
40
|
+
version: 1,
|
|
41
|
+
totalSavingsUsd: 0,
|
|
42
|
+
totalTokens: 0,
|
|
43
|
+
totalRequests: 0,
|
|
44
|
+
firstRecordedAt: null,
|
|
45
|
+
lastRecordedAt: null,
|
|
46
|
+
byModel: {},
|
|
47
|
+
notice: { lastShownAtRequest: 0, lastMilestoneUsd: 0 },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function savingsPath() {
|
|
51
|
+
return join(configDir(), "savings.json");
|
|
52
|
+
}
|
|
53
|
+
export function resolveBaselineModel() {
|
|
54
|
+
const override = process.env["ZEROGPU_SAVINGS_MODEL"];
|
|
55
|
+
if (override && CLAUDE_PRICING[override])
|
|
56
|
+
return override;
|
|
57
|
+
return DEFAULT_BASELINE;
|
|
58
|
+
}
|
|
59
|
+
function pricingFor(model) {
|
|
60
|
+
return CLAUDE_PRICING[model] ?? CLAUDE_PRICING[DEFAULT_BASELINE];
|
|
61
|
+
}
|
|
62
|
+
// Fallback only — the API returns real token counts in `usage`.
|
|
63
|
+
export function estimateTokens(text) {
|
|
64
|
+
return Math.max(1, Math.ceil((text?.length ?? 0) / 4));
|
|
65
|
+
}
|
|
66
|
+
export function computeCallSavings(inputTokens, outputTokens, baseline, zgpuModel) {
|
|
67
|
+
const claude = pricingFor(baseline);
|
|
68
|
+
const zgpu = ZGPU_PRICING[zgpuModel] ?? ZGPU_FALLBACK;
|
|
69
|
+
const claudeCost = (inputTokens * claude.in) / 1_000_000 +
|
|
70
|
+
(outputTokens * claude.out) / 1_000_000;
|
|
71
|
+
const zgpuCost = (inputTokens * zgpu.in) / 1_000_000 + (outputTokens * zgpu.out) / 1_000_000;
|
|
72
|
+
return {
|
|
73
|
+
tokens: inputTokens + outputTokens,
|
|
74
|
+
savingsUsd: Math.max(0, claudeCost - zgpuCost),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function readSavings() {
|
|
78
|
+
const path = savingsPath();
|
|
79
|
+
if (!existsSync(path))
|
|
80
|
+
return freshState();
|
|
81
|
+
try {
|
|
82
|
+
const raw = readFileSync(path, "utf8");
|
|
83
|
+
const parsed = JSON.parse(raw);
|
|
84
|
+
if (!parsed || typeof parsed !== "object")
|
|
85
|
+
return freshState();
|
|
86
|
+
return { ...freshState(), ...parsed, notice: { ...freshState().notice, ...parsed.notice } };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return freshState();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export function writeSavings(state) {
|
|
93
|
+
mkdirSync(configDir(), { recursive: true, mode: 0o700 });
|
|
94
|
+
writeFileSync(savingsPath(), JSON.stringify(state, null, 2), { mode: 0o600 });
|
|
95
|
+
}
|
|
96
|
+
export function resetSavings() {
|
|
97
|
+
writeSavings(freshState());
|
|
98
|
+
}
|
|
99
|
+
function highestMilestoneCrossed(usd) {
|
|
100
|
+
let crossed = 0;
|
|
101
|
+
for (const m of MILESTONES_USD) {
|
|
102
|
+
if (usd >= m)
|
|
103
|
+
crossed = m;
|
|
104
|
+
}
|
|
105
|
+
return crossed;
|
|
106
|
+
}
|
|
107
|
+
// Decide whether to surface the note for the just-recorded state.
|
|
108
|
+
export function shouldShowNotice(state, random = Math.random) {
|
|
109
|
+
const gap = state.totalRequests - state.notice.lastShownAtRequest;
|
|
110
|
+
const milestoneCrossed = highestMilestoneCrossed(state.totalSavingsUsd) > state.notice.lastMilestoneUsd;
|
|
111
|
+
if (milestoneCrossed && gap >= 2)
|
|
112
|
+
return true;
|
|
113
|
+
if (gap < MIN_GAP)
|
|
114
|
+
return false;
|
|
115
|
+
if (gap >= MAX_GAP)
|
|
116
|
+
return true;
|
|
117
|
+
return random() < SHOW_PROBABILITY;
|
|
118
|
+
}
|
|
119
|
+
// Best-effort: records the call and prints the savings note to stderr when the
|
|
120
|
+
// cadence says so. Never throws — savings tracking must not affect command
|
|
121
|
+
// output or exit codes.
|
|
122
|
+
export function recordAndMaybeNotify(input) {
|
|
123
|
+
try {
|
|
124
|
+
const inputTokens = input.usage?.input_tokens ?? estimateTokens(input.inputText);
|
|
125
|
+
const outputTokens = input.usage?.output_tokens ?? estimateTokens(input.outputText);
|
|
126
|
+
const baseline = resolveBaselineModel();
|
|
127
|
+
const { tokens, savingsUsd } = computeCallSavings(inputTokens, outputTokens, baseline, input.model);
|
|
128
|
+
const state = readSavings();
|
|
129
|
+
const now = new Date().toISOString();
|
|
130
|
+
state.totalSavingsUsd += savingsUsd;
|
|
131
|
+
state.totalTokens += tokens;
|
|
132
|
+
state.totalRequests += 1;
|
|
133
|
+
state.firstRecordedAt = state.firstRecordedAt ?? now;
|
|
134
|
+
state.lastRecordedAt = now;
|
|
135
|
+
const m = (state.byModel[input.model] ??= {
|
|
136
|
+
requests: 0,
|
|
137
|
+
savingsUsd: 0,
|
|
138
|
+
tokens: 0,
|
|
139
|
+
});
|
|
140
|
+
m.requests += 1;
|
|
141
|
+
m.savingsUsd += savingsUsd;
|
|
142
|
+
m.tokens += tokens;
|
|
143
|
+
const show = shouldShowNotice(state);
|
|
144
|
+
if (show) {
|
|
145
|
+
state.notice.lastShownAtRequest = state.totalRequests;
|
|
146
|
+
state.notice.lastMilestoneUsd = Math.max(state.notice.lastMilestoneUsd, highestMilestoneCrossed(state.totalSavingsUsd));
|
|
147
|
+
}
|
|
148
|
+
writeSavings(state);
|
|
149
|
+
if (show)
|
|
150
|
+
process.stderr.write(formatNotice(state) + "\n");
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// swallow — never break a command over savings bookkeeping
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ── formatting ──────────────────────────────────────────────────────────────
|
|
157
|
+
const MONTHS = [
|
|
158
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
159
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
160
|
+
];
|
|
161
|
+
// Call-to-action appended to every savings message.
|
|
162
|
+
const CTA_NOTICE = " → https://platform.zerogpu.ai for your detailed savings report · https://zerogpu.ai to learn more";
|
|
163
|
+
const CTA_REPORT = "→ See your detailed savings report at https://platform.zerogpu.ai\n→ Learn more at https://zerogpu.ai";
|
|
164
|
+
function fmtUsd(n) {
|
|
165
|
+
if (n >= 0.01)
|
|
166
|
+
return `~$${n.toFixed(2)}`;
|
|
167
|
+
return `~$${n.toFixed(4)}`;
|
|
168
|
+
}
|
|
169
|
+
function fmtTokensShort(n) {
|
|
170
|
+
if (n >= 1_000_000)
|
|
171
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
172
|
+
if (n >= 1_000)
|
|
173
|
+
return `${Math.round(n / 1_000)}K`;
|
|
174
|
+
return String(n);
|
|
175
|
+
}
|
|
176
|
+
function fmtDate(iso, withYear) {
|
|
177
|
+
if (!iso)
|
|
178
|
+
return "today";
|
|
179
|
+
const d = new Date(iso);
|
|
180
|
+
if (Number.isNaN(d.getTime()))
|
|
181
|
+
return "today";
|
|
182
|
+
const base = `${MONTHS[d.getMonth()]} ${d.getDate()}`;
|
|
183
|
+
return withYear ? `${base}, ${d.getFullYear()}` : base;
|
|
184
|
+
}
|
|
185
|
+
export function formatNotice(state) {
|
|
186
|
+
return (`💰 ZeroGPU savings so far: ${fmtUsd(state.totalSavingsUsd)} ` +
|
|
187
|
+
`(≈ ${fmtTokensShort(state.totalTokens)} Claude tokens offloaded across ` +
|
|
188
|
+
`${state.totalRequests} routed call${state.totalRequests === 1 ? "" : "s"} ` +
|
|
189
|
+
`since ${fmtDate(state.firstRecordedAt, false)})\n` +
|
|
190
|
+
CTA_NOTICE);
|
|
191
|
+
}
|
|
192
|
+
export function formatReport(state) {
|
|
193
|
+
const baseline = resolveBaselineModel();
|
|
194
|
+
const lines = [];
|
|
195
|
+
lines.push("💰 ZeroGPU Cost Savings");
|
|
196
|
+
lines.push("───────────────────────");
|
|
197
|
+
if (state.totalRequests === 0) {
|
|
198
|
+
lines.push("No routed calls recorded yet.");
|
|
199
|
+
lines.push("");
|
|
200
|
+
lines.push("Run a ZeroGPU task (chat, classify, extract, redact, summarize…) and your");
|
|
201
|
+
lines.push("savings will start accumulating here.");
|
|
202
|
+
lines.push("");
|
|
203
|
+
lines.push(CTA_REPORT);
|
|
204
|
+
return lines.join("\n");
|
|
205
|
+
}
|
|
206
|
+
const avg = state.totalSavingsUsd / state.totalRequests;
|
|
207
|
+
lines.push(`Saved so far: ${fmtUsd(state.totalSavingsUsd)}`);
|
|
208
|
+
lines.push(`Tokens offloaded: ≈ ${state.totalTokens.toLocaleString("en-US")} Claude tokens`);
|
|
209
|
+
lines.push(`Routed calls: ${state.totalRequests}`);
|
|
210
|
+
lines.push(`Avg per call: ${fmtUsd(avg)}`);
|
|
211
|
+
lines.push(`Since: ${fmtDate(state.firstRecordedAt, true)}`);
|
|
212
|
+
const models = Object.entries(state.byModel).sort((a, b) => b[1].savingsUsd - a[1].savingsUsd);
|
|
213
|
+
if (models.length > 0) {
|
|
214
|
+
lines.push("");
|
|
215
|
+
lines.push("By model:");
|
|
216
|
+
for (const [name, m] of models) {
|
|
217
|
+
lines.push(` ${name} — ${m.requests} call${m.requests === 1 ? "" : "s"}, ` +
|
|
218
|
+
`${fmtUsd(m.savingsUsd)}, ${fmtTokensShort(m.tokens)} tok`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
lines.push("");
|
|
222
|
+
lines.push("Token counts and ZeroGPU costs are actual. Dollar savings estimate the Claude");
|
|
223
|
+
lines.push(`spend avoided: what these exact tokens would have cost on ${baseline}, minus the`);
|
|
224
|
+
lines.push("real ZeroGPU cost. Set ZEROGPU_SAVINGS_MODEL to compare against another Claude model.");
|
|
225
|
+
lines.push("");
|
|
226
|
+
lines.push(CTA_REPORT);
|
|
227
|
+
return lines.join("\n");
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=savings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/lib/savings.ts"],"names":[],"mappings":"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"}
|