zerogpu-cli 3.1.0 → 3.3.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 +29 -1
- 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 +61 -13
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/classifyDomain.d.ts +3 -0
- package/dist/commands/classifyDomain.d.ts.map +1 -0
- package/dist/commands/classifyDomain.js +59 -0
- package/dist/commands/classifyDomain.js.map +1 -0
- package/dist/commands/classifyIabEnriched.js +1 -1
- package/dist/commands/costSavings.js +1 -1
- package/dist/commands/costSavings.js.map +1 -1
- package/dist/lib/chatCompletions.d.ts +22 -0
- package/dist/lib/chatCompletions.d.ts.map +1 -0
- package/dist/lib/chatCompletions.js +12 -0
- package/dist/lib/chatCompletions.js.map +1 -0
- package/dist/lib/responses.d.ts +11 -6
- package/dist/lib/responses.d.ts.map +1 -1
- package/dist/lib/responses.js +12 -0
- package/dist/lib/responses.js.map +1 -1
- package/dist/lib/savings.d.ts.map +1 -1
- package/dist/lib/savings.js +26 -30
- package/dist/lib/savings.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -25,6 +25,7 @@ The official command-line interface for [ZeroGPU](https://zerogpu.ai) — run fa
|
|
|
25
25
|
- [Classification](#classification)
|
|
26
26
|
- [`classify_iab`](#classify_iab)
|
|
27
27
|
- [`classify_iab_enriched`](#classify_iab_enriched)
|
|
28
|
+
- [`classify_domain`](#classify_domain)
|
|
28
29
|
- [`classify_structured`](#classify_structured)
|
|
29
30
|
- [`classify_zero_shot`](#classify_zero_shot)
|
|
30
31
|
- [Extraction](#extraction)
|
|
@@ -122,16 +123,33 @@ zerogpu status
|
|
|
122
123
|
|
|
123
124
|
#### `chat`
|
|
124
125
|
|
|
125
|
-
Chat with
|
|
126
|
+
Chat with a ZeroGPU text-generation model. Defaults to **LFM2.5-1.2B-Instruct**; use `--model` to reach for a larger reasoning model.
|
|
126
127
|
|
|
127
128
|
```bash
|
|
128
129
|
zerogpu chat "Explain edge inference in one sentence."
|
|
129
130
|
zerogpu chat "Translate to French: Good morning." -i "You are a precise translator."
|
|
131
|
+
|
|
132
|
+
# Frontier-grade reasoning, with the trace printed alongside the answer
|
|
133
|
+
zerogpu chat "Why does my API keep getting rate-limited?" -m gpt-oss-120b -r
|
|
134
|
+
|
|
135
|
+
# Multilingual reasoning
|
|
136
|
+
zerogpu chat "Explique la mise en cache en une phrase." -m qwen3-30b-a3b-fp8
|
|
130
137
|
```
|
|
131
138
|
|
|
132
139
|
| Option | Description |
|
|
133
140
|
|---|---|
|
|
134
141
|
| `-i, --instructions <text>` | System instructions that steer the assistant's behavior. |
|
|
142
|
+
| `-m, --model <model>` | Model to use (default `LFM2.5-1.2B-Instruct`). |
|
|
143
|
+
| `-r, --reasoning` | Also print the reasoning trace, for models that return one. |
|
|
144
|
+
|
|
145
|
+
| Model | Notes |
|
|
146
|
+
|---|---|
|
|
147
|
+
| `LFM2.5-1.2B-Instruct` | Default. Fast edge chat. |
|
|
148
|
+
| `LFM2.5-1.2B-Thinking` | Compact reasoning model. |
|
|
149
|
+
| `gpt-oss-120b` | 117B MoE, 131K context, reasoning + function calling. |
|
|
150
|
+
| `qwen3-30b-a3b-fp8` | 30.5B MoE, 100+ languages, reasoning + function calling. |
|
|
151
|
+
|
|
152
|
+
`qwen3-30b-a3b-fp8` is served by the Chat Completions API rather than the Responses API; the CLI routes it automatically.
|
|
135
153
|
|
|
136
154
|
#### `chat_thinking`
|
|
137
155
|
|
|
@@ -177,6 +195,16 @@ Same as `classify_iab` but returns enriched output: audience, topics, keywords,
|
|
|
177
195
|
zerogpu classify_iab_enriched "Best running shoes for marathon training."
|
|
178
196
|
```
|
|
179
197
|
|
|
198
|
+
#### `classify_domain`
|
|
199
|
+
|
|
200
|
+
Classify a **domain name** against the IAB taxonomy using the ZeroGPU domain edge model. Takes only the hostname — no page fetch or body text — so it suits bidstream enrichment and inventory-level targeting.
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
zerogpu classify_domain nytimes.com
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Returns scored content categories plus topics, keywords, and inferred user intent for the domain. When you have the page text and need per-URL precision, use `classify_iab` instead.
|
|
207
|
+
|
|
180
208
|
#### `classify_structured`
|
|
181
209
|
|
|
182
210
|
Classify text against a **structured schema** of categories and allowed labels using GLiNER2.
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmFpC,wBAAgB,YAAY,IAAI,OAAO,CA0BtC;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAIxC"}
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,7 @@ import { Command } from "commander";
|
|
|
5
5
|
import updateNotifier from "update-notifier";
|
|
6
6
|
import { registerChatCommand } from "./commands/chat.js";
|
|
7
7
|
import { registerChatThinkingCommand } from "./commands/chatThinking.js";
|
|
8
|
+
import { registerClassifyDomainCommand } from "./commands/classifyDomain.js";
|
|
8
9
|
import { registerClassifyIabCommand } from "./commands/classifyIab.js";
|
|
9
10
|
import { registerClassifyIabEnrichedCommand } from "./commands/classifyIabEnriched.js";
|
|
10
11
|
import { registerClassifyStructuredCommand } from "./commands/classifyStructured.js";
|
|
@@ -82,6 +83,7 @@ export function buildProgram() {
|
|
|
82
83
|
registerStatusCommand(program);
|
|
83
84
|
registerClassifyIabCommand(program);
|
|
84
85
|
registerClassifyIabEnrichedCommand(program);
|
|
86
|
+
registerClassifyDomainCommand(program);
|
|
85
87
|
registerClassifyStructuredCommand(program);
|
|
86
88
|
registerClassifyZeroShotCommand(program);
|
|
87
89
|
registerGenerateFollowupsCommand(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8H1D"}
|
package/dist/commands/chat.js
CHANGED
|
@@ -1,27 +1,57 @@
|
|
|
1
1
|
import { getApiKey } from "../lib/auth.js";
|
|
2
|
-
import {
|
|
2
|
+
import { CHAT_COMPLETIONS_ENDPOINT, toResponsesUsage, } from "../lib/chatCompletions.js";
|
|
3
|
+
import { RESPONSES_ENDPOINT, extractOutputText, extractReasoningText, } from "../lib/responses.js";
|
|
3
4
|
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
4
|
-
const
|
|
5
|
+
const DEFAULT_MODEL = "LFM2.5-1.2B-Instruct";
|
|
6
|
+
// Text-generation models `--model` accepts, and the API each one speaks.
|
|
7
|
+
// qwen3-30b-a3b-fp8 is Chat Completions only — it has no Responses endpoint.
|
|
8
|
+
// Source: https://docs.zerogpu.ai/docs/text-generation
|
|
9
|
+
const CHAT_MODELS = {
|
|
10
|
+
"LFM2.5-1.2B-Instruct": "responses",
|
|
11
|
+
"LFM2.5-1.2B-Thinking": "responses",
|
|
12
|
+
"gpt-oss-120b": "responses",
|
|
13
|
+
"qwen3-30b-a3b-fp8": "chat-completions",
|
|
14
|
+
};
|
|
15
|
+
// Model ids are case-sensitive to the API but not to the person typing them.
|
|
16
|
+
function resolveModel(name) {
|
|
17
|
+
return Object.keys(CHAT_MODELS).find((id) => id.toLowerCase() === name.toLowerCase());
|
|
18
|
+
}
|
|
5
19
|
export function registerChatCommand(program) {
|
|
6
20
|
program
|
|
7
21
|
.command("chat <text>")
|
|
8
|
-
.description(
|
|
22
|
+
.description(`Chat with a ZeroGPU text-generation model (default ${DEFAULT_MODEL}).`)
|
|
9
23
|
.option("-i, --instructions <instructions>", "System instructions that steer the assistant's behavior.")
|
|
24
|
+
.option("-m, --model <model>", `Model to use: ${Object.keys(CHAT_MODELS).join(", ")}.`, DEFAULT_MODEL)
|
|
25
|
+
.option("-r, --reasoning", "Also print the reasoning trace, for models that return one.")
|
|
10
26
|
.action(async (text, opts) => {
|
|
27
|
+
const model = resolveModel(opts.model);
|
|
28
|
+
if (!model) {
|
|
29
|
+
console.error(`Unknown model '${opts.model}'. Available models: ${Object.keys(CHAT_MODELS).join(", ")}.`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
11
32
|
const apiKey = getApiKey();
|
|
12
33
|
if (!apiKey) {
|
|
13
34
|
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key.");
|
|
14
35
|
process.exit(1);
|
|
15
36
|
}
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
37
|
+
const useChatCompletions = CHAT_MODELS[model] === "chat-completions";
|
|
38
|
+
const body = useChatCompletions
|
|
39
|
+
? {
|
|
40
|
+
model,
|
|
41
|
+
messages: [
|
|
42
|
+
...(opts.instructions
|
|
43
|
+
? [{ role: "system", content: opts.instructions }]
|
|
44
|
+
: []),
|
|
45
|
+
{ role: "user", content: text },
|
|
46
|
+
],
|
|
47
|
+
}
|
|
48
|
+
: { model, input: text };
|
|
49
|
+
if (!useChatCompletions && opts.instructions) {
|
|
21
50
|
body.instructions = opts.instructions;
|
|
51
|
+
}
|
|
22
52
|
let response;
|
|
23
53
|
try {
|
|
24
|
-
response = await fetch(RESPONSES_ENDPOINT, {
|
|
54
|
+
response = await fetch(useChatCompletions ? CHAT_COMPLETIONS_ENDPOINT : RESPONSES_ENDPOINT, {
|
|
25
55
|
method: "POST",
|
|
26
56
|
headers: {
|
|
27
57
|
"content-type": "application/json",
|
|
@@ -42,13 +72,31 @@ export function registerChatCommand(program) {
|
|
|
42
72
|
console.error(errBody);
|
|
43
73
|
process.exit(1);
|
|
44
74
|
}
|
|
45
|
-
const
|
|
46
|
-
|
|
75
|
+
const payload = await response.json();
|
|
76
|
+
let content;
|
|
77
|
+
let reasoning;
|
|
78
|
+
let usage;
|
|
79
|
+
if (useChatCompletions) {
|
|
80
|
+
const data = payload;
|
|
81
|
+
const message = data.choices?.[0]?.message;
|
|
82
|
+
content = message?.content;
|
|
83
|
+
reasoning = message?.reasoning;
|
|
84
|
+
usage = toResponsesUsage(data.usage);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const data = payload;
|
|
88
|
+
content = extractOutputText(data);
|
|
89
|
+
reasoning = extractReasoningText(data);
|
|
90
|
+
usage = data.usage;
|
|
91
|
+
}
|
|
47
92
|
if (!content) {
|
|
48
93
|
console.error("Response did not contain any chat content.");
|
|
49
|
-
console.error(JSON.stringify(
|
|
94
|
+
console.error(JSON.stringify(payload, null, 2));
|
|
50
95
|
process.exit(1);
|
|
51
96
|
}
|
|
97
|
+
if (opts.reasoning && reasoning) {
|
|
98
|
+
console.log(`Reasoning:\n${reasoning}\n`);
|
|
99
|
+
}
|
|
52
100
|
try {
|
|
53
101
|
const parsed = JSON.parse(content);
|
|
54
102
|
console.log(JSON.stringify(parsed, null, 2));
|
|
@@ -56,7 +104,7 @@ export function registerChatCommand(program) {
|
|
|
56
104
|
catch {
|
|
57
105
|
console.log(content);
|
|
58
106
|
}
|
|
59
|
-
recordAndMaybeNotify({ model
|
|
107
|
+
recordAndMaybeNotify({ model, usage });
|
|
60
108
|
});
|
|
61
109
|
}
|
|
62
110
|
//# sourceMappingURL=chat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyDomain.d.ts","sourceRoot":"","sources":["../../src/commands/classifyDomain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4DpE"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getApiKey } from "../lib/auth.js";
|
|
2
|
+
import { RESPONSES_ENDPOINT, extractOutputText, } from "../lib/responses.js";
|
|
3
|
+
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
4
|
+
const MODEL = "zlm-v1-iab-domain-classifier";
|
|
5
|
+
export function registerClassifyDomainCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("classify_domain <domain>")
|
|
8
|
+
.alias("classify-domain")
|
|
9
|
+
.description("Classify a domain name with the IAB domain edge model (content, topics, keywords, intent).")
|
|
10
|
+
.action(async (domain) => {
|
|
11
|
+
const apiKey = getApiKey();
|
|
12
|
+
if (!apiKey) {
|
|
13
|
+
console.error("You're not fully signed in yet. Run 'zerogpu login' to set your API key.");
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
let response;
|
|
17
|
+
try {
|
|
18
|
+
response = await fetch(RESPONSES_ENDPOINT, {
|
|
19
|
+
method: "POST",
|
|
20
|
+
headers: {
|
|
21
|
+
"content-type": "application/json",
|
|
22
|
+
"x-api-key": apiKey.apiKey,
|
|
23
|
+
},
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
model: MODEL,
|
|
26
|
+
input: domain,
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
console.error(`Request failed: ${message}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const body = await response.text();
|
|
37
|
+
console.error(`Request failed with status ${response.status}.`);
|
|
38
|
+
if (body)
|
|
39
|
+
console.error(body);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
const content = extractOutputText(data);
|
|
44
|
+
if (!content) {
|
|
45
|
+
console.error("Response did not contain any classification content.");
|
|
46
|
+
console.error(JSON.stringify(data, null, 2));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const parsed = JSON.parse(content);
|
|
51
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
console.log(content);
|
|
55
|
+
}
|
|
56
|
+
recordAndMaybeNotify({ model: MODEL, usage: data.usage });
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=classifyDomain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifyDomain.js","sourceRoot":"","sources":["../../src/commands/classifyDomain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,KAAK,GAAG,8BAA8B,CAAC;AAE7C,MAAM,UAAU,6BAA6B,CAAC,OAAgB;IAC5D,OAAO;SACJ,OAAO,CAAC,0BAA0B,CAAC;SACnC,KAAK,CAAC,iBAAiB,CAAC;SACxB,WAAW,CACV,4FAA4F,CAC7F;SACA,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,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;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,MAAM;iBACd,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,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YACtE,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,7 +1,7 @@
|
|
|
1
1
|
import { getApiKey } from "../lib/auth.js";
|
|
2
2
|
import { RESPONSES_ENDPOINT, } from "../lib/responses.js";
|
|
3
3
|
import { recordAndMaybeNotify } from "../lib/savings.js";
|
|
4
|
-
const MODEL = "zlm-
|
|
4
|
+
const MODEL = "zlm-v2-iab-classify-edge-enriched";
|
|
5
5
|
export function registerClassifyIabEnrichedCommand(program) {
|
|
6
6
|
program
|
|
7
7
|
.command("classify_iab_enriched <text>")
|
|
@@ -3,7 +3,7 @@ export function registerCostSavingsCommand(program) {
|
|
|
3
3
|
program
|
|
4
4
|
.command("cost_savings")
|
|
5
5
|
.alias("cost-savings")
|
|
6
|
-
.description("Show how much you've saved by routing tasks to ZeroGPU instead of
|
|
6
|
+
.description("Show how much you've saved by routing tasks to ZeroGPU instead of your frontier model.")
|
|
7
7
|
.option("--json", "Output the raw savings data as JSON.")
|
|
8
8
|
.option("--reset", "Clear all recorded savings and start over.")
|
|
9
9
|
.action((opts) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"costSavings.js","sourceRoot":"","sources":["../../src/commands/costSavings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE5E,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,KAAK,CAAC,cAAc,CAAC;SACrB,WAAW,CACV,
|
|
1
|
+
{"version":3,"file":"costSavings.js","sourceRoot":"","sources":["../../src/commands/costSavings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE5E,MAAM,UAAU,0BAA0B,CAAC,OAAgB;IACzD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,KAAK,CAAC,cAAc,CAAC;SACrB,WAAW,CACV,wFAAwF,CACzF;SACA,MAAM,CAAC,QAAQ,EAAE,sCAAsC,CAAC;SACxD,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;SAC/D,MAAM,CAAC,CAAC,IAAyC,EAAE,EAAE;QACpD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ResponsesUsage } from "./responses.js";
|
|
2
|
+
export declare const CHAT_COMPLETIONS_ENDPOINT = "https://api.zerogpu.ai/v1/chat/completions";
|
|
3
|
+
export interface ChatCompletionsUsage {
|
|
4
|
+
prompt_tokens?: number;
|
|
5
|
+
completion_tokens?: number;
|
|
6
|
+
total_tokens?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ChatCompletionsApiResponse {
|
|
9
|
+
model?: string;
|
|
10
|
+
usage?: ChatCompletionsUsage;
|
|
11
|
+
choices?: Array<{
|
|
12
|
+
index?: number;
|
|
13
|
+
finish_reason?: string;
|
|
14
|
+
message?: {
|
|
15
|
+
role?: string;
|
|
16
|
+
content?: string;
|
|
17
|
+
reasoning?: string;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function toResponsesUsage(usage: ChatCompletionsUsage | undefined): ResponsesUsage | undefined;
|
|
22
|
+
//# sourceMappingURL=chatCompletions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatCompletions.d.ts","sourceRoot":"","sources":["../../src/lib/chatCompletions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,yBAAyB,+CACQ,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YAEjB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC,CAAC;CACJ;AAGD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,oBAAoB,GAAG,SAAS,GACtC,cAAc,GAAG,SAAS,CAO5B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const CHAT_COMPLETIONS_ENDPOINT = "https://api.zerogpu.ai/v1/chat/completions";
|
|
2
|
+
// Savings bookkeeping speaks the Responses API's token names.
|
|
3
|
+
export function toResponsesUsage(usage) {
|
|
4
|
+
if (!usage)
|
|
5
|
+
return undefined;
|
|
6
|
+
return {
|
|
7
|
+
input_tokens: usage.prompt_tokens,
|
|
8
|
+
output_tokens: usage.completion_tokens,
|
|
9
|
+
total_tokens: usage.total_tokens,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=chatCompletions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatCompletions.js","sourceRoot":"","sources":["../../src/lib/chatCompletions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GACpC,4CAA4C,CAAC;AAuB/C,8DAA8D;AAC9D,MAAM,UAAU,gBAAgB,CAC9B,KAAuC;IAEvC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO;QACL,YAAY,EAAE,KAAK,CAAC,aAAa;QACjC,aAAa,EAAE,KAAK,CAAC,iBAAiB;QACtC,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC"}
|
package/dist/lib/responses.d.ts
CHANGED
|
@@ -10,14 +10,19 @@ export interface ResponsesUsage {
|
|
|
10
10
|
reasoning_tokens?: number;
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
+
export interface ResponsesContentPart {
|
|
14
|
+
type?: string;
|
|
15
|
+
text?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ResponsesOutputItem {
|
|
18
|
+
type?: string;
|
|
19
|
+
content?: ResponsesContentPart[];
|
|
20
|
+
}
|
|
13
21
|
export interface ResponsesApiResponse {
|
|
14
22
|
model?: string;
|
|
15
23
|
usage?: ResponsesUsage;
|
|
16
|
-
output?:
|
|
17
|
-
content?: Array<{
|
|
18
|
-
type?: string;
|
|
19
|
-
text?: string;
|
|
20
|
-
}>;
|
|
21
|
-
}>;
|
|
24
|
+
output?: ResponsesOutputItem[];
|
|
22
25
|
}
|
|
26
|
+
export declare function extractOutputText(data: ResponsesApiResponse): string | undefined;
|
|
27
|
+
export declare function extractReasoningText(data: ResponsesApiResponse): string | undefined;
|
|
23
28
|
//# sourceMappingURL=responses.d.ts.map
|
|
@@ -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,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,
|
|
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,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAID,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,oBAAoB,GACzB,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,oBAAoB,GACzB,MAAM,GAAG,SAAS,CAIpB"}
|
package/dist/lib/responses.js
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
1
|
export const RESPONSES_ENDPOINT = "https://api.zerogpu.ai/v1/responses";
|
|
2
|
+
// Reasoning models (gpt-oss-120b) emit a `reasoning` item ahead of the
|
|
3
|
+
// assistant message, so the answer is not always output[0].
|
|
4
|
+
export function extractOutputText(data) {
|
|
5
|
+
const items = data.output ?? [];
|
|
6
|
+
const message = items.find((item) => item.type === "message") ?? items[0];
|
|
7
|
+
const parts = message?.content ?? [];
|
|
8
|
+
return parts.find((p) => p.type === "output_text")?.text ?? parts[0]?.text;
|
|
9
|
+
}
|
|
10
|
+
export function extractReasoningText(data) {
|
|
11
|
+
const parts = data.output?.find((item) => item.type === "reasoning")?.content ?? [];
|
|
12
|
+
return parts.find((p) => p.type === "reasoning_text")?.text ?? parts[0]?.text;
|
|
13
|
+
}
|
|
2
14
|
//# sourceMappingURL=responses.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/lib/responses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AA0BxE,uEAAuE;AACvE,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB,CAC/B,IAA0B;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAA0B;IAE1B,MAAM,KAAK,GACT,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;AAChF,CAAC"}
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"savings.d.ts","sourceRoot":"","sources":["../../src/lib/savings.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA6CrD,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;AAoCD,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAQxD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAyCxD"}
|
package/dist/lib/savings.js
CHANGED
|
@@ -15,18 +15,22 @@ const DEFAULT_BASELINE = "claude-opus-4-8";
|
|
|
15
15
|
// Actual ZeroGPU pricing per 1M tokens (in / out), per model.
|
|
16
16
|
// Source: https://docs.zerogpu.ai model catalog.
|
|
17
17
|
const ZGPU_PRICING = {
|
|
18
|
+
"gpt-oss-120b": { in: 0.03, out: 0.1 },
|
|
19
|
+
"qwen3-30b-a3b-fp8": { in: 0.05, out: 0.3 },
|
|
18
20
|
"llama-3.1-8b-instruct-fast": { in: 0.02, out: 0.05 },
|
|
19
|
-
"zlm-v1-iab-classify-edge": { in: 0.
|
|
20
|
-
"zlm-
|
|
21
|
-
"zlm-v1-
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"LFM2.5-1.2B-
|
|
21
|
+
"zlm-v1-iab-classify-edge": { in: 0.02, out: 0.05 },
|
|
22
|
+
"zlm-v2-iab-classify-edge-enriched": { in: 0.02, out: 0.05 },
|
|
23
|
+
"zlm-v1-iab-domain-classifier": { in: 0.02, out: 0.05 },
|
|
24
|
+
"zlm-v1-followup-questions-edge": { in: 0.02, out: 0.05 },
|
|
25
|
+
"gliner-multi-pii-v1": { in: 0.02, out: 0.05 },
|
|
26
|
+
"gliner2-base-v1": { in: 0.02, out: 0.05 },
|
|
27
|
+
"deberta-v3-small": { in: 0.02, out: 0.05 },
|
|
28
|
+
"LFM2.5-1.2B-Thinking": { in: 0.02, out: 0.05 },
|
|
29
|
+
"LFM2.5-1.2B-Instruct": { in: 0.02, out: 0.05 },
|
|
27
30
|
};
|
|
28
|
-
// Conservative fallback for any model id not in the table above
|
|
29
|
-
|
|
31
|
+
// Conservative fallback for any model id not in the table above: the priciest
|
|
32
|
+
// published rate, so an unlisted model never overstates savings.
|
|
33
|
+
const ZGPU_FALLBACK = { in: 0.05, out: 0.3 };
|
|
30
34
|
// Cadence: aim to show the savings note roughly once every 2–3 routed calls,
|
|
31
35
|
// never twice in a row, and guaranteed within a bounded window.
|
|
32
36
|
const MIN_GAP = 2; // never show within this many calls of the last one
|
|
@@ -161,10 +165,12 @@ const MONTHS = [
|
|
|
161
165
|
// Call-to-action appended to every savings message.
|
|
162
166
|
const CTA_NOTICE = " → https://platform.zerogpu.ai for your detailed savings report · https://zerogpu.ai to learn more";
|
|
163
167
|
const CTA_REPORT = "→ See your detailed savings report at https://platform.zerogpu.ai\n→ Learn more at https://zerogpu.ai";
|
|
168
|
+
// Deliberately coarse: the dollar figure is an estimate (it assumes a baseline
|
|
169
|
+
// model), so we round to whole dollars and never imply cent-level precision.
|
|
164
170
|
function fmtUsd(n) {
|
|
165
|
-
if (n >=
|
|
166
|
-
return
|
|
167
|
-
return
|
|
171
|
+
if (n >= 1)
|
|
172
|
+
return `≈ $${Math.round(n)}`;
|
|
173
|
+
return "under $1";
|
|
168
174
|
}
|
|
169
175
|
function fmtTokensShort(n) {
|
|
170
176
|
if (n >= 1_000_000)
|
|
@@ -184,7 +190,7 @@ function fmtDate(iso, withYear) {
|
|
|
184
190
|
}
|
|
185
191
|
export function formatNotice(state) {
|
|
186
192
|
return (`💰 ZeroGPU savings so far: ${fmtUsd(state.totalSavingsUsd)} ` +
|
|
187
|
-
`(≈ ${fmtTokensShort(state.totalTokens)}
|
|
193
|
+
`(≈ ${fmtTokensShort(state.totalTokens)} frontier-model tokens offloaded across ` +
|
|
188
194
|
`${state.totalRequests} routed call${state.totalRequests === 1 ? "" : "s"} ` +
|
|
189
195
|
`since ${fmtDate(state.firstRecordedAt, false)})\n` +
|
|
190
196
|
CTA_NOTICE);
|
|
@@ -203,25 +209,15 @@ export function formatReport(state) {
|
|
|
203
209
|
lines.push(CTA_REPORT);
|
|
204
210
|
return lines.join("\n");
|
|
205
211
|
}
|
|
206
|
-
|
|
207
|
-
lines.push(`
|
|
208
|
-
lines.push(`Tokens offloaded: ≈ ${state.totalTokens.toLocaleString("en-US")} Claude tokens`);
|
|
212
|
+
lines.push(`Saved so far: ${fmtUsd(state.totalSavingsUsd)} (vs baseline ${baseline})`);
|
|
213
|
+
lines.push(`Tokens offloaded: ≈ ${state.totalTokens.toLocaleString("en-US")} frontier-model tokens`);
|
|
209
214
|
lines.push(`Routed calls: ${state.totalRequests}`);
|
|
210
|
-
lines.push(`Avg per call: ${fmtUsd(avg)}`);
|
|
211
215
|
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
216
|
lines.push("");
|
|
222
|
-
lines.push("Token counts
|
|
223
|
-
lines.push(`spend avoided
|
|
224
|
-
lines.push(
|
|
217
|
+
lines.push("Token counts are actual (from the API). The dollar figure is a rounded");
|
|
218
|
+
lines.push(`estimate of the frontier-model spend avoided — what these exact tokens would`);
|
|
219
|
+
lines.push(`have cost on ${baseline}, minus the real ZeroGPU cost. Set ZEROGPU_SAVINGS_MODEL`);
|
|
220
|
+
lines.push("to compare against another baseline model.");
|
|
225
221
|
lines.push("");
|
|
226
222
|
lines.push(CTA_REPORT);
|
|
227
223
|
return lines.join("\n");
|
package/dist/lib/savings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/lib/savings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,+EAA+E;AAC/E,yDAAyD;AACzD,MAAM,cAAc,GAAgD;IAClE,iBAAiB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IACrC,iBAAiB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IACrC,iBAAiB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IACrC,mBAAmB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;IACvC,kBAAkB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;IACrC,gBAAgB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;CACtC,CAAC;AAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAE3C,8DAA8D;AAC9D,iDAAiD;AACjD,MAAM,YAAY,GAAgD;IAChE,4BAA4B,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;IACrD,0BAA0B,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/lib/savings.ts"],"names":[],"mappings":"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"}
|