llm-speed-bench 1.0.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 ADDED
@@ -0,0 +1,198 @@
1
+ # LLM Speed Bench
2
+
3
+ `llm-speed-bench` is a command-line interface (CLI) tool for benchmarking the performance of Large Language Model (LLM) providers that offer an OpenAI-compatible API.
4
+
5
+ It is designed to provide detailed, actionable data on the output speed and latency characteristics of different models and providers. It measures key performance indicators from the moment a request is sent until the final token of the response is received, with a focus on streaming APIs.
6
+
7
+ ## Features
8
+
9
+ * **OpenAI-Compatible:** Works with any API that adheres to the OpenAI specification for streaming chat completions.
10
+ * **Streaming First:** Benchmarks performance by leveraging the provider's streaming API to get detailed timing data.
11
+ * **Detailed Performance Metrics:** Collects and calculates a comprehensive set of metrics, including token counts, time to first token, inter-token latency, and overall throughput.
12
+ * **Flexible Configuration:** Manage inputs via both command-line arguments and environment variables.
13
+ * **Multiple Output Formats:** Presents results in a clean, human-readable format, with an option for machine-readable JSON.
14
+
15
+ ## Installation
16
+
17
+ 1. **Clone the repository:**
18
+ ```bash
19
+ git clone https://github.com/your-username/llm-speed-bench.git
20
+ cd llm-speed-bench
21
+ ```
22
+
23
+ 2. **Install dependencies:**
24
+ ```bash
25
+ npm install
26
+ ```
27
+
28
+ 3. **Build the project:**
29
+ ```bash
30
+ npm run build
31
+ ```
32
+ This will compile the TypeScript code into JavaScript and place the executable in the `dist/` directory.
33
+
34
+ ## Usage
35
+
36
+ You can run the tool using the compiled executable located at `dist/index.js`. Configuration can be provided through command-line arguments or environment variables.
37
+
38
+ ### Configuration
39
+
40
+ The tool requires four pieces of information to run:
41
+
42
+ | Parameter | CLI Argument | Environment Variable | Required | Description |
43
+ | :--- | :--- | :--- | :--- | :--- |
44
+ | API Base URL | `--api-base-url <url>` | `LLM_API_BASE_URL` | Yes | The base URL for the OpenAI-compatible API. |
45
+ | API Key | `--api-key <key>` | `LLM_API_KEY` | Yes | The authentication key for the API. |
46
+ | Model Name | `--model <name>` | `LLM_MODEL_NAME` | Yes | The specific model to be benchmarked (e.g., `gpt-4o`). |
47
+ | Prompt | `--prompt <text>` | `LLM_PROMPT` | Yes | The input text to send to the model. |
48
+
49
+ ### Examples
50
+
51
+ #### Using Command-Line Arguments
52
+
53
+ ```bash
54
+ ./dist/index.js \
55
+ --api-base-url "https://api.openai.com/v1" \
56
+ --api-key "sk-..." \
57
+ --model "gpt-4o" \
58
+ --prompt "Tell me a short story about a robot who discovers music."
59
+ ```
60
+
61
+ #### Using Environment Variables
62
+
63
+ You can create a `.env` file in the project root or export the variables in your shell:
64
+
65
+ **`.env` file:**
66
+ ```
67
+ LLM_API_BASE_URL="https://api.openai.com/v1"
68
+ LLM_API_KEY="sk-..."
69
+ LLM_MODEL_NAME="gpt-4o"
70
+ LLM_PROMPT="Tell me a short story about a robot who discovers music."
71
+ ```
72
+
73
+ Then, run the tool:
74
+ ```bash
75
+ ./dist/index.js
76
+ ```
77
+
78
+ #### Getting JSON Output
79
+
80
+ To get the results in a machine-readable JSON format, use the `--json` flag:
81
+
82
+ ```bash
83
+ ./dist/index.js --json > results.json
84
+ ```
85
+
86
+ ## Output Format
87
+
88
+ ### Standard Output
89
+
90
+ The default output is a human-readable summary:
91
+
92
+ ```
93
+ LLM Benchmark Results
94
+ =======================
95
+
96
+ Configuration
97
+ -----------------------
98
+ Provider API Base: https://api.groq.com/openai
99
+ Model: llama3-70b-8192
100
+
101
+ Metrics
102
+ -----------------------
103
+ Time to First Token: 152 ms
104
+ Total Wall Clock Time: 2,130 ms
105
+ Overall Output Rate: 234.7 tokens/sec
106
+
107
+ Token Counts
108
+ -----------------------
109
+ Prompt Tokens: 35 (estimated)
110
+ Output Tokens: 450
111
+
112
+ Inter-Token Latency (ms)
113
+ -----------------------
114
+ Min: 2 ms
115
+ Mean: 4.1 ms
116
+ Median: 4 ms
117
+ Max: 15 ms
118
+ p90: 6 ms
119
+ p95: 8 ms
120
+ p99: 12 ms
121
+ ```
122
+
123
+ ### JSON Output (`--json`)
124
+
125
+ The JSON output includes all the calculated metrics and configuration details.
126
+
127
+ ```json
128
+ {
129
+ "configuration": {
130
+ "apiBaseUrl": "https://api.groq.com/openai",
131
+ "model": "llama3-70b-8192"
132
+ },
133
+ "metrics": {
134
+ "timeToFirstTokenMs": 152,
135
+ "totalWallClockTimeMs": 2130,
136
+ "overallOutputRateTps": 234.7
137
+ },
138
+ "tokenCounts": {
139
+ "promptTokens": 35,
140
+ "outputTokens": 450
141
+ },
142
+ "interTokenLatencyMs": {
143
+ "min": 2,
144
+ "mean": 4.1,
145
+ "median": 4,
146
+ "max": 15,
147
+ "p90": 6,
148
+ "p95": 8,
149
+ "p99": 12
150
+ }
151
+ }
152
+ ```
153
+
154
+ ## Development
155
+
156
+ ### Running with ts-node
157
+
158
+ To run the tool in development mode without building, you can use `ts-node`:
159
+
160
+ ```bash
161
+ npx ts-node src/index.ts --api-base-url ...
162
+ ```
163
+
164
+ ### Local Installation and Testing
165
+
166
+ To test the CLI locally as if it were globally installed, you can use `npm link`. This is the best way to test the final command-line experience before publishing.
167
+
168
+ 1. **Build the project:**
169
+ Make sure your latest changes are compiled.
170
+ ```bash
171
+ npm run build
172
+ ```
173
+
174
+ 2. **Link the package:**
175
+ This creates a global symbolic link to your local project.
176
+ ```bash
177
+ npm link
178
+ ```
179
+
180
+ 3. **Run the command globally:**
181
+ You can now run the command from any directory.
182
+ ```bash
183
+ llm-speed-bench --api-base-url "..." --api-key "..."
184
+ ```
185
+
186
+ 4. **Rebuild after changes:**
187
+ Whenever you change the source code, just re-run the build command. The symbolic link will ensure your global command always uses the latest compiled code.
188
+ ```bash
189
+ npm run build
190
+ ```
191
+
192
+ 5. **Unlink the package:**
193
+ When you're done with local testing, you can remove the global link.
194
+ ```bash
195
+ npm unlink llm-speed-bench
196
+ ```
197
+
198
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,339 @@
1
+ #!/usr/bin/env node
2
+ process.env.DOTENV_CONFIG_SILENT = 'true';
3
+ import yargs from 'yargs';
4
+ import { hideBin } from 'yargs/helpers';
5
+ import dotenv from 'dotenv';
6
+ import { get_encoding } from 'tiktoken';
7
+ // Load environment variables from .env file
8
+ dotenv.config({ quiet: true });
9
+ // --- Utility Functions ---
10
+ /**
11
+ * Calculates percentile values from a sorted array of numbers.
12
+ * @param arr - A sorted array of numbers.
13
+ * @param p - The percentile to calculate (0-100).
14
+ * @returns The value at the given percentile.
15
+ */
16
+ const percentile = (arr, p) => {
17
+ if (arr.length === 0)
18
+ return 0;
19
+ const k = (p / 100) * (arr.length - 1);
20
+ const f = Math.floor(k);
21
+ const c = Math.ceil(k);
22
+ if (f === c) {
23
+ return arr[f];
24
+ }
25
+ const fVal = arr[f];
26
+ const cVal = arr[c];
27
+ return fVal * (c - k) + cVal * (k - f);
28
+ };
29
+ /**
30
+ * Calculates statistical metrics for a list of latencies.
31
+ * @param latencies - An array of numbers.
32
+ * @returns An object with min, max, mean, median, and percentile stats.
33
+ */
34
+ const calculateLatencyStats = (latencies) => {
35
+ if (latencies.length === 0) {
36
+ return { min: 0, max: 0, mean: 0, median: 0, p90: 0, p95: 0, p99: 0 };
37
+ }
38
+ const sorted = [...latencies].sort((a, b) => a - b);
39
+ const sum = sorted.reduce((a, b) => a + b, 0);
40
+ const mean = sum / sorted.length;
41
+ const min = sorted[0];
42
+ const max = sorted[sorted.length - 1];
43
+ if (min === undefined || max === undefined) {
44
+ // This path should be unreachable due to the length check above,
45
+ // but it satisfies the strict type checker.
46
+ return { min: 0, max: 0, mean: 0, median: 0, p90: 0, p95: 0, p99: 0 };
47
+ }
48
+ const median = percentile(sorted, 50);
49
+ const p90 = percentile(sorted, 90);
50
+ const p95 = percentile(sorted, 95);
51
+ const p99 = percentile(sorted, 99);
52
+ return {
53
+ min: parseFloat(min.toFixed(2)),
54
+ max: parseFloat(max.toFixed(2)),
55
+ mean: parseFloat(mean.toFixed(2)),
56
+ median: parseFloat(median.toFixed(2)),
57
+ p90: parseFloat(p90.toFixed(2)),
58
+ p95: parseFloat(p95.toFixed(2)),
59
+ p99: parseFloat(p99.toFixed(2)),
60
+ };
61
+ };
62
+ // --- Main Application Logic ---
63
+ class ProgressIndicator {
64
+ constructor(isJson) {
65
+ this.isJson = isJson;
66
+ this.stream = process.stderr;
67
+ this.spinner = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
68
+ this.frame = 0;
69
+ this.message = '';
70
+ }
71
+ render() {
72
+ if (this.isJson)
73
+ return;
74
+ this.stream.clearLine(0);
75
+ this.stream.cursorTo(0);
76
+ const spinnerFrame = this.spinner[this.frame];
77
+ this.stream.write(`${spinnerFrame} ${this.message}`);
78
+ this.frame = (this.frame + 1) % this.spinner.length;
79
+ }
80
+ start(message) {
81
+ if (this.isJson)
82
+ return;
83
+ this.message = message;
84
+ this.timer = setInterval(() => this.render(), 80);
85
+ }
86
+ update(message) {
87
+ if (this.isJson)
88
+ return;
89
+ this.message = message;
90
+ }
91
+ stop(finalMessage) {
92
+ if (this.isJson)
93
+ return;
94
+ if (this.timer) {
95
+ clearInterval(this.timer);
96
+ this.timer = undefined;
97
+ }
98
+ this.stream.clearLine(0);
99
+ this.stream.cursorTo(0);
100
+ this.stream.write(`✅ ${finalMessage}\n`);
101
+ }
102
+ clear() {
103
+ if (this.isJson)
104
+ return;
105
+ this.stream.clearLine(0);
106
+ this.stream.cursorTo(0);
107
+ }
108
+ }
109
+ /**
110
+ * Parses command-line arguments and environment variables.
111
+ * @returns The configuration object.
112
+ */
113
+ async function getConfig() {
114
+ const argv = await yargs(hideBin(process.argv))
115
+ .option('api-base-url', {
116
+ alias: 'u',
117
+ type: 'string',
118
+ description: 'The base URL for the OpenAI-compatible API endpoint.',
119
+ default: process.env.LLM_API_URL,
120
+ })
121
+ .option('api-key', {
122
+ alias: 'k',
123
+ type: 'string',
124
+ description: 'The authentication key for the API.',
125
+ default: process.env.LLM_API_KEY,
126
+ })
127
+ .option('model', {
128
+ alias: 'm',
129
+ type: 'string',
130
+ description: 'The specific model to be benchmarked.',
131
+ default: process.env.LLM_MODEL_NAME,
132
+ })
133
+ .option('prompt', {
134
+ alias: 'p',
135
+ type: 'string',
136
+ description: 'The input text to send to the model.',
137
+ default: process.env.LLM_PROMPT,
138
+ })
139
+ .option('json', {
140
+ type: 'boolean',
141
+ description: 'Output the results in JSON format.',
142
+ default: false,
143
+ })
144
+ .help()
145
+ .alias('help', 'h')
146
+ .parse();
147
+ if (!argv.apiBaseUrl || !argv.apiKey || !argv.model || !argv.prompt) {
148
+ console.error('Error: Missing required arguments.');
149
+ console.error('Please provide api-base-url, api-key, model, and prompt via CLI arguments or environment variables.');
150
+ // Throwing an error is cleaner and more explicit for type checkers
151
+ throw new Error('Missing required arguments.');
152
+ }
153
+ const config = {
154
+ apiBaseUrl: argv.apiBaseUrl,
155
+ apiKey: argv.apiKey,
156
+ model: argv.model,
157
+ prompt: argv.prompt,
158
+ json: argv.json ?? false,
159
+ };
160
+ return config;
161
+ }
162
+ /**
163
+ * Runs the benchmark against the specified LLM provider.
164
+ * @param config - The configuration object.
165
+ */
166
+ async function runBenchmark(config) {
167
+ const { apiBaseUrl, apiKey, model, prompt, json } = config;
168
+ const progress = new ProgressIndicator(json);
169
+ progress.start('Connecting...');
170
+ const T_start = performance.now();
171
+ let T_first_token = null;
172
+ const interTokenLatencies = [];
173
+ let lastChunkTime = 0;
174
+ let outputTokens = 0;
175
+ try {
176
+ const url = new URL(apiBaseUrl);
177
+ if (!url.pathname.endsWith('/')) {
178
+ url.pathname += '/';
179
+ }
180
+ let finalUrl;
181
+ if (url.pathname.endsWith('/v1/')) {
182
+ finalUrl = new URL('chat/completions', url);
183
+ }
184
+ else {
185
+ finalUrl = new URL('v1/chat/completions', url);
186
+ }
187
+ progress.update('Sending Request...');
188
+ const response = await fetch(finalUrl, {
189
+ method: 'POST',
190
+ headers: {
191
+ 'Content-Type': 'application/json',
192
+ Authorization: `Bearer ${apiKey}`,
193
+ },
194
+ body: JSON.stringify({
195
+ model,
196
+ messages: [{ role: 'user', content: prompt }],
197
+ stream: true,
198
+ }),
199
+ });
200
+ if (!response.ok || !response.body) {
201
+ const errorBody = await response.text();
202
+ throw new Error(`API Error: ${response.status} ${response.statusText} - ${errorBody}`);
203
+ }
204
+ progress.update('Waiting for First Token...');
205
+ const reader = response.body.getReader();
206
+ const decoder = new TextDecoder();
207
+ while (true) {
208
+ const { done, value } = await reader.read();
209
+ if (done) {
210
+ break;
211
+ }
212
+ const chunkTime = performance.now();
213
+ if (T_first_token === null) {
214
+ T_first_token = chunkTime;
215
+ }
216
+ if (lastChunkTime > 0) {
217
+ interTokenLatencies.push(chunkTime - lastChunkTime);
218
+ }
219
+ lastChunkTime = chunkTime;
220
+ const chunk = decoder.decode(value, { stream: true });
221
+ const lines = chunk.split('\n').filter((line) => line.trim().startsWith('data:'));
222
+ for (const line of lines) {
223
+ const data = line.substring(5).trim();
224
+ if (data === '[DONE]') {
225
+ break;
226
+ }
227
+ try {
228
+ const parsed = JSON.parse(data);
229
+ const content = parsed.choices[0]?.delta?.content;
230
+ if (content) {
231
+ outputTokens++;
232
+ const elapsedS = (performance.now() - T_first_token) / 1000;
233
+ const tokensPerSecond = elapsedS > 0 ? outputTokens / elapsedS : 0;
234
+ progress.update(`Receiving Tokens... (${outputTokens} tokens received @ ${tokensPerSecond.toFixed(2)} tokens/s)`);
235
+ }
236
+ }
237
+ catch (e) {
238
+ // Ignore parsing errors for non-JSON lines
239
+ }
240
+ }
241
+ }
242
+ const T_end = performance.now();
243
+ progress.stop('Finished receiving tokens.');
244
+ const totalWallClockTimeMs = T_end - T_start;
245
+ const timeToFirstTokenMs = T_first_token ? T_first_token - T_start : 0;
246
+ // Estimate prompt tokens using tiktoken
247
+ const encoding = get_encoding('cl100k_base');
248
+ const promptTokens = encoding.encode(prompt).length;
249
+ encoding.free();
250
+ const outputDurationS = (totalWallClockTimeMs - timeToFirstTokenMs) / 1000;
251
+ const overallOutputRateTps = outputDurationS > 0 ? outputTokens / outputDurationS : 0;
252
+ const latencyStats = calculateLatencyStats(interTokenLatencies);
253
+ const results = {
254
+ configuration: {
255
+ apiBaseUrl,
256
+ model,
257
+ },
258
+ metrics: {
259
+ timeToFirstTokenMs: parseFloat(timeToFirstTokenMs.toFixed(2)),
260
+ totalWallClockTimeMs: parseFloat(totalWallClockTimeMs.toFixed(2)),
261
+ overallOutputRateTps: parseFloat(overallOutputRateTps.toFixed(2)),
262
+ },
263
+ tokenCounts: {
264
+ promptTokens,
265
+ outputTokens,
266
+ },
267
+ interTokenLatencyMs: {
268
+ ...latencyStats,
269
+ latencies: interTokenLatencies,
270
+ },
271
+ };
272
+ printResults(results, config.json);
273
+ }
274
+ catch (error) {
275
+ console.error('An error occurred during the benchmark:', error);
276
+ process.exit(1);
277
+ }
278
+ }
279
+ /**
280
+ * Prints the benchmark results to the console.
281
+ * @param results - The benchmark results object.
282
+ * @param asJson - Whether to print in JSON format.
283
+ */
284
+ function printResults(results, asJson) {
285
+ if (asJson) {
286
+ // Create a new object for JSON output that doesn't include the full latencies array
287
+ const jsonOutput = {
288
+ ...results,
289
+ interTokenLatencyMs: {
290
+ ...results.interTokenLatencyMs,
291
+ latencies: undefined, // Remove the detailed list for the final JSON output
292
+ },
293
+ };
294
+ // delete jsonOutput.interTokenLatencyMs.latencies;
295
+ console.log(JSON.stringify(jsonOutput, null, 2));
296
+ return;
297
+ }
298
+ console.log('LLM Benchmark Results');
299
+ console.log('=======================');
300
+ console.log();
301
+ console.log('Configuration');
302
+ console.log('-----------------------');
303
+ console.log(`Provider API Base: ${results.configuration.apiBaseUrl}`);
304
+ console.log(`Model: ${results.configuration.model}`);
305
+ console.log();
306
+ console.log('Metrics');
307
+ console.log('-----------------------');
308
+ console.log(`Time to First Token: ${results.metrics.timeToFirstTokenMs} ms`);
309
+ console.log(`Total Wall Clock Time: ${results.metrics.totalWallClockTimeMs} ms`);
310
+ console.log(`Overall Output Rate: ${results.metrics.overallOutputRateTps} tokens/sec`);
311
+ console.log();
312
+ console.log('Token Counts');
313
+ console.log('-----------------------');
314
+ console.log(`Prompt Tokens: ${results.tokenCounts.promptTokens} (estimated)`);
315
+ console.log(`Output Tokens: ${results.tokenCounts.outputTokens}`);
316
+ console.log();
317
+ console.log('Inter-Token Latency (ms)');
318
+ console.log('-----------------------');
319
+ console.log(`Min: ${results.interTokenLatencyMs.min} ms`);
320
+ console.log(`Mean: ${results.interTokenLatencyMs.mean} ms`);
321
+ console.log(`Median: ${results.interTokenLatencyMs.median} ms`);
322
+ console.log(`Max: ${results.interTokenLatencyMs.max} ms`);
323
+ console.log(`p90: ${results.interTokenLatencyMs.p90} ms`);
324
+ console.log(`p95: ${results.interTokenLatencyMs.p95} ms`);
325
+ console.log(`p99: ${results.interTokenLatencyMs.p99} ms`);
326
+ }
327
+ // --- Entry Point ---
328
+ (async () => {
329
+ try {
330
+ const config = await getConfig();
331
+ await runBenchmark(config);
332
+ }
333
+ catch (error) {
334
+ // Catch errors from getConfig and exit gracefully
335
+ // The error message is already printed inside getConfig
336
+ process.exit(1);
337
+ }
338
+ })();
339
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "llm-speed-bench",
3
+ "version": "1.0.0",
4
+ "description": "A CLI tool to benchmark the performance of OpenAI-compatible LLM providers.",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "llm-speed-bench": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "start": "ts-node src/index.ts",
15
+ "build": "tsc",
16
+ "test": "echo \"Error: no test specified\" && exit 1"
17
+ },
18
+ "keywords": [
19
+ "llm",
20
+ "benchmark",
21
+ "performance",
22
+ "openai",
23
+ "speed"
24
+ ],
25
+ "author": "",
26
+ "license": "ISC",
27
+ "dependencies": {
28
+ "@types/node": "^24.3.0",
29
+ "@types/yargs": "^17.0.33",
30
+ "dotenv": "^17.2.2",
31
+ "tiktoken": "^1.0.22",
32
+ "ts-node": "^10.9.2",
33
+ "typescript": "^5.9.2",
34
+ "yargs": "^18.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@typescript-eslint/eslint-plugin": "^8.42.0",
38
+ "@typescript-eslint/parser": "^8.42.0",
39
+ "eslint": "^9.34.0"
40
+ }
41
+ }