primellm 0.2.0 → 1.0.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/index.js CHANGED
@@ -1,279 +1,350 @@
1
- /**
2
- * PrimeLLM JavaScript SDK v0.2.0
3
- *
4
- * Production-grade SDK with streaming, retries, and full API parity.
5
- *
6
- * @example
7
- * import PrimeLLM from "primellm";
8
- *
9
- * const client = new PrimeLLM({ apiKey: "primellm_XXX" });
10
- * const response = await client.chat({
11
- * model: "gpt-5.1",
12
- * messages: [{ role: "user", content: "Hello!" }],
13
- * });
14
- * console.log(response.choices[0].message.content);
15
- */
16
- import { PrimeLLMError, createErrorFromStatus, } from "./errors.js";
17
- import { countTokens, setTokenizerAdapter } from "./tokenizer.js";
18
- import { streamReader } from "./streaming.js";
19
- // Re-export types and utilities
20
- export * from "./types.js";
21
- export * from "./errors.js";
22
- export { countTokens, setTokenizerAdapter } from "./tokenizer.js";
23
- const DEFAULT_RETRY = {
24
- maxAttempts: 3,
25
- baseDelayMs: 300,
26
- maxDelayMs: 10000,
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
5
  };
28
- /**
29
- * Retryable status codes
30
- */
31
- const RETRYABLE_STATUSES = [429, 502, 503, 504];
32
- /**
33
- * Sleep with exponential backoff and jitter
34
- */
35
- async function sleep(attempt, config) {
36
- const delay = Math.min(config.maxDelayMs, config.baseDelayMs * Math.pow(2, attempt) + Math.random() * 300);
37
- await new Promise(resolve => setTimeout(resolve, delay));
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const figlet_1 = __importDefault(require("figlet"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const child_process_1 = require("child_process");
11
+ const os_1 = require("os");
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const open_1 = __importDefault(require("open"));
15
+ const enquirer_1 = __importDefault(require("enquirer"));
16
+ const { prompt } = enquirer_1.default;
17
+ // ============================================================================
18
+ // CONSTANTS
19
+ // ============================================================================
20
+ const PRIMELLM_BASE_URL = 'https://api.primellm.in/v1';
21
+ const PRIMELLM_DASHBOARD_URL = 'https://primellm.in/dashboard/api-keys';
22
+ // Tool installation packages
23
+ const TOOLS = {
24
+ 'Claude Code': {
25
+ command: 'claude',
26
+ package: '@anthropic-ai/claude-code',
27
+ configName: 'claude',
28
+ },
29
+ 'Codex': {
30
+ command: 'codex',
31
+ package: '@openai/codex',
32
+ configName: 'codex',
33
+ },
34
+ };
35
+ // ============================================================================
36
+ // SYSTEM DETECTION
37
+ // ============================================================================
38
+ function getOS() {
39
+ const os = (0, os_1.platform)();
40
+ switch (os) {
41
+ case 'darwin': return 'macOS';
42
+ case 'linux': return 'Linux';
43
+ case 'win32': return 'Windows';
44
+ default: return os;
45
+ }
38
46
  }
39
- /**
40
- * PrimeLLM API Client
41
- *
42
- * Production-grade client with streaming, retries, and full API access.
43
- */
44
- export class PrimeLLM {
45
- /**
46
- * Create a new PrimeLLM client.
47
- *
48
- * @param options - Configuration options
49
- * @param options.apiKey - Your PrimeLLM API key (required)
50
- * @param options.baseURL - API base URL (default: "https://api.primellm.in")
51
- * @param options.timeoutMs - Request timeout in ms (default: 60000)
52
- * @param options.maxRetries - Max retry attempts (default: 3)
53
- */
54
- constructor(options) {
55
- if (!options.apiKey) {
56
- throw new PrimeLLMError("PrimeLLM: apiKey is required");
57
- }
58
- this.apiKey = options.apiKey;
59
- this.baseURL = (options.baseURL ?? "https://api.primellm.in").replace(/\/$/, "");
60
- this.timeoutMs = options.timeoutMs ?? 60000;
61
- this.retry = {
62
- ...DEFAULT_RETRY,
63
- maxAttempts: options.maxRetries ?? 3,
64
- };
65
- // Initialize sub-clients
66
- this.embeddings = new EmbeddingsClient(this);
67
- this.models = new ModelsClient(this);
68
- this.keys = new KeysClient(this);
69
- this.credits = new CreditsClient(this);
70
- this.tokens = new TokensClient();
71
- this.chat = new ChatClient(this);
47
+ function getShell() {
48
+ const shell = process.env.SHELL || process.env.COMSPEC || 'unknown';
49
+ const shellName = shell.split(/[/\\]/).pop() || 'unknown';
50
+ return shellName;
51
+ }
52
+ function getNodeVersion() {
53
+ return process.version;
54
+ }
55
+ function commandExists(cmd) {
56
+ try {
57
+ const isWindows = (0, os_1.platform)() === 'win32';
58
+ const checkCmd = isWindows ? `where ${cmd}` : `which ${cmd}`;
59
+ (0, child_process_1.execSync)(checkCmd, { stdio: 'ignore' });
60
+ return true;
61
+ }
62
+ catch {
63
+ return false;
72
64
  }
73
- /**
74
- * Internal HTTP request with retries and error handling
75
- */
76
- async request(path, body, options) {
77
- const method = options?.method ?? "POST";
78
- let lastError = null;
79
- for (let attempt = 0; attempt < this.retry.maxAttempts; attempt++) {
80
- const controller = new AbortController();
81
- const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
82
- try {
83
- const fetchOptions = {
84
- method,
85
- headers: {
86
- "Authorization": `Bearer ${this.apiKey}`,
87
- "Content-Type": "application/json",
88
- },
89
- signal: controller.signal,
90
- };
91
- if (body && method !== "GET") {
92
- fetchOptions.body = JSON.stringify(body);
93
- }
94
- const res = await fetch(`${this.baseURL}${path}`, fetchOptions);
95
- if (!res.ok) {
96
- const text = await res.text().catch(() => "");
97
- let detail = text;
98
- try {
99
- const json = JSON.parse(text);
100
- detail = json.detail || text;
101
- }
102
- catch { }
103
- // Check if retryable
104
- if (RETRYABLE_STATUSES.includes(res.status) && attempt < this.retry.maxAttempts - 1) {
105
- lastError = createErrorFromStatus(res.status, `Request failed: ${res.status}`, detail);
106
- await sleep(attempt, this.retry);
107
- continue;
108
- }
109
- throw createErrorFromStatus(res.status, `PrimeLLM API error: ${res.status}`, detail);
110
- }
111
- return await res.json();
112
- }
113
- catch (error) {
114
- clearTimeout(timeout);
115
- if (error instanceof PrimeLLMError) {
116
- throw error;
117
- }
118
- if (error instanceof Error && error.name === "AbortError") {
119
- throw new PrimeLLMError(`Request timed out after ${this.timeoutMs}ms`);
120
- }
121
- // Network error - retry
122
- if (attempt < this.retry.maxAttempts - 1) {
123
- lastError = error;
124
- await sleep(attempt, this.retry);
125
- continue;
126
- }
127
- throw new PrimeLLMError(error.message);
128
- }
129
- finally {
130
- clearTimeout(timeout);
131
- }
65
+ }
66
+ // ============================================================================
67
+ // ASCII ART & DISPLAY
68
+ // ============================================================================
69
+ function displayBanner() {
70
+ console.clear();
71
+ const banner = figlet_1.default.textSync('PrimeLLM', {
72
+ font: 'Big',
73
+ horizontalLayout: 'default',
74
+ });
75
+ console.log(chalk_1.default.cyan(banner));
76
+ console.log(chalk_1.default.gray('━'.repeat(60)));
77
+ console.log(chalk_1.default.white.bold(' Configure AI coding tools with PrimeLLM'));
78
+ console.log(chalk_1.default.gray('━'.repeat(60)));
79
+ console.log();
80
+ }
81
+ function displaySystemInfo() {
82
+ console.log(chalk_1.default.white.bold('šŸ“Š System Information\n'));
83
+ const os = getOS();
84
+ const shell = getShell();
85
+ const nodeVersion = getNodeVersion();
86
+ console.log(` ${chalk_1.default.gray('OS:')} ${chalk_1.default.green(os)}`);
87
+ console.log(` ${chalk_1.default.gray('Shell:')} ${chalk_1.default.green(shell)}`);
88
+ console.log(` ${chalk_1.default.gray('Node:')} ${chalk_1.default.green(nodeVersion)}`);
89
+ console.log();
90
+ }
91
+ // ============================================================================
92
+ // CONFIGURATION PATHS
93
+ // ============================================================================
94
+ function getConfigPaths(tool, scope) {
95
+ const home = (0, os_1.homedir)();
96
+ if (tool === 'Claude Code') {
97
+ if (scope === 'system') {
98
+ return {
99
+ dir: (0, path_1.join)(home, '.claude'),
100
+ file: (0, path_1.join)(home, '.claude', 'config.json'),
101
+ };
102
+ }
103
+ else {
104
+ return {
105
+ dir: '.claude',
106
+ file: (0, path_1.join)('.claude', 'config.json'),
107
+ };
132
108
  }
133
- throw lastError || new PrimeLLMError("Request failed after retries");
134
109
  }
135
- /**
136
- * Internal streaming request
137
- */
138
- async *streamRequest(path, body) {
139
- const controller = new AbortController();
140
- const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
141
- try {
142
- const res = await fetch(`${this.baseURL}${path}`, {
143
- method: "POST",
144
- headers: {
145
- "Authorization": `Bearer ${this.apiKey}`,
146
- "Content-Type": "application/json",
147
- },
148
- body: JSON.stringify({ ...body, stream: true }),
149
- signal: controller.signal,
150
- });
151
- if (!res.ok) {
152
- const text = await res.text().catch(() => "");
153
- throw createErrorFromStatus(res.status, `Streaming failed: ${res.status}`, text);
154
- }
155
- if (!res.body) {
156
- throw new PrimeLLMError("Response body is null");
157
- }
158
- const reader = res.body.getReader();
159
- yield* streamReader(reader);
110
+ else {
111
+ // Codex uses OpenAI-compatible config
112
+ if (scope === 'system') {
113
+ return {
114
+ dir: (0, path_1.join)(home, '.codex'),
115
+ file: (0, path_1.join)(home, '.codex', 'config.json'),
116
+ };
160
117
  }
161
- finally {
162
- clearTimeout(timeout);
118
+ else {
119
+ return {
120
+ dir: '.codex',
121
+ file: (0, path_1.join)('.codex', 'config.json'),
122
+ };
163
123
  }
164
124
  }
165
125
  }
166
- /**
167
- * Chat sub-client
168
- */
169
- class ChatClient {
170
- constructor(client) {
171
- this.client = client;
172
- }
173
- /**
174
- * Send a chat completion request
175
- */
176
- async create(request) {
177
- return this.client.request("/v1/chat", request);
126
+ function readExistingConfig(configPath) {
127
+ try {
128
+ if ((0, fs_1.existsSync)(configPath)) {
129
+ const content = (0, fs_1.readFileSync)(configPath, 'utf8');
130
+ return JSON.parse(content);
131
+ }
178
132
  }
179
- /**
180
- * Stream chat completion (async iterator)
181
- *
182
- * @example
183
- * for await (const chunk of client.chat.stream({...})) {
184
- * console.log(chunk.delta?.content);
185
- * }
186
- */
187
- async *stream(request) {
188
- yield* this.client.streamRequest("/v1/chat", request);
133
+ catch {
134
+ // Config doesn't exist or is invalid
189
135
  }
136
+ return null;
190
137
  }
191
- /**
192
- * Embeddings sub-client
193
- */
194
- class EmbeddingsClient {
195
- constructor(client) {
196
- this.client = client;
138
+ function writeConfig(tool, scope, apiKey) {
139
+ const { dir, file } = getConfigPaths(tool, scope);
140
+ // Create directory if it doesn't exist
141
+ if (!(0, fs_1.existsSync)(dir)) {
142
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
197
143
  }
198
- /**
199
- * Create embeddings for input text
200
- */
201
- async create(request) {
202
- return this.client.request("/v1/embeddings", request);
144
+ let config;
145
+ if (tool === 'Claude Code') {
146
+ // Claude Code configuration format
147
+ config = {
148
+ apiKey: apiKey,
149
+ baseUrl: PRIMELLM_BASE_URL,
150
+ model: 'claude-sonnet-4-20250514', // Default model
151
+ };
203
152
  }
204
- }
205
- /**
206
- * Models sub-client
207
- */
208
- class ModelsClient {
209
- constructor(client) {
210
- this.client = client;
153
+ else {
154
+ // Codex (OpenAI-compatible) configuration format
155
+ config = {
156
+ apiKey: apiKey,
157
+ baseUrl: PRIMELLM_BASE_URL,
158
+ model: 'gpt-4.1', // Default model
159
+ };
211
160
  }
212
- /**
213
- * List available models
214
- */
215
- async list() {
216
- return this.client.request("/v1/models", undefined, { method: "GET" });
161
+ // Preserve existing config values
162
+ const existing = readExistingConfig(file);
163
+ if (existing) {
164
+ config = { ...existing, ...config };
217
165
  }
166
+ (0, fs_1.writeFileSync)(file, JSON.stringify(config, null, 2));
218
167
  }
219
- /**
220
- * Keys sub-client
221
- */
222
- class KeysClient {
223
- constructor(client) {
224
- this.client = client;
168
+ // ============================================================================
169
+ // TOOL INSTALLATION
170
+ // ============================================================================
171
+ async function installTool(tool) {
172
+ const toolInfo = TOOLS[tool];
173
+ const spinner = (0, ora_1.default)(`Installing ${tool}...`).start();
174
+ try {
175
+ const installCmd = `npm install -g ${toolInfo.package}`;
176
+ (0, child_process_1.execSync)(installCmd, {
177
+ stdio: 'pipe',
178
+ encoding: 'utf8',
179
+ });
180
+ spinner.succeed(chalk_1.default.green(`${tool} installed successfully`));
181
+ return true;
225
182
  }
226
- /**
227
- * List API keys
228
- */
229
- async list() {
230
- return this.client.request("/v1/keys", undefined, { method: "GET" });
183
+ catch (error) {
184
+ spinner.fail(chalk_1.default.red(`Failed to install ${tool}`));
185
+ if (error instanceof Error && 'stderr' in error) {
186
+ console.error(chalk_1.default.gray(error.stderr || 'Unknown error'));
187
+ }
188
+ return false;
231
189
  }
232
- /**
233
- * Create a new API key
234
- */
235
- async create(label) {
236
- return this.client.request("/v1/keys", { label });
190
+ }
191
+ // ============================================================================
192
+ // VALIDATION
193
+ // ============================================================================
194
+ function validateApiKey(key) {
195
+ return key.startsWith('primellm_') && key.length > 15;
196
+ }
197
+ function maskApiKey(key) {
198
+ if (key.length <= 12)
199
+ return '***';
200
+ return key.substring(0, 12) + '...' + key.substring(key.length - 4);
201
+ }
202
+ // ============================================================================
203
+ // MAIN FLOW
204
+ // ============================================================================
205
+ async function main() {
206
+ displayBanner();
207
+ displaySystemInfo();
208
+ const spinner = (0, ora_1.default)('Initializing...').start();
209
+ await new Promise(resolve => setTimeout(resolve, 500));
210
+ spinner.succeed('Ready');
211
+ console.log();
212
+ // ============ STEP 1: Tool Selection ============
213
+ console.log(chalk_1.default.white.bold('šŸ”§ Tool Selection\n'));
214
+ const { selectedTool } = await prompt({
215
+ type: 'select',
216
+ name: 'selectedTool',
217
+ message: 'Which tool would you like to configure?',
218
+ choices: ['Claude Code', 'Codex'],
219
+ });
220
+ console.log();
221
+ // ============ STEP 2: Tool Detection & Installation ============
222
+ const toolInfo = TOOLS[selectedTool];
223
+ const toolExists = commandExists(toolInfo.command);
224
+ if (toolExists) {
225
+ console.log(chalk_1.default.green(`āœ“ ${selectedTool} is already installed`));
237
226
  }
238
- /**
239
- * Revoke an API key
240
- */
241
- async revoke(keyId) {
242
- return this.client.request("/v1/keys/revoke", { key_id: keyId });
227
+ else {
228
+ console.log(chalk_1.default.yellow(`⚠ ${selectedTool} is not installed`));
229
+ const { confirmInstall } = await prompt({
230
+ type: 'confirm',
231
+ name: 'confirmInstall',
232
+ message: `Would you like to install ${selectedTool}?`,
233
+ initial: true,
234
+ });
235
+ if (!confirmInstall) {
236
+ console.log(chalk_1.default.yellow('\n⚠ Installation cancelled. Please install manually and run again.'));
237
+ process.exit(0);
238
+ }
239
+ const installed = await installTool(selectedTool);
240
+ if (!installed) {
241
+ console.log(chalk_1.default.red('\nāŒ Installation failed. Please install manually and run again.'));
242
+ process.exit(1);
243
+ }
243
244
  }
244
- }
245
- /**
246
- * Credits sub-client
247
- */
248
- class CreditsClient {
249
- constructor(client) {
250
- this.client = client;
245
+ console.log();
246
+ // ============ STEP 3: API Key ============
247
+ console.log(chalk_1.default.white.bold('šŸ”‘ API Key Configuration\n'));
248
+ const { hasApiKey } = await prompt({
249
+ type: 'select',
250
+ name: 'hasApiKey',
251
+ message: 'Do you already have a PrimeLLM API key?',
252
+ choices: [
253
+ { name: 'yes', message: 'Yes, I have an API key' },
254
+ { name: 'no', message: 'No, I need to create one' },
255
+ ],
256
+ });
257
+ let apiKey;
258
+ if (hasApiKey === 'no') {
259
+ console.log(chalk_1.default.cyan('\nšŸ“ Opening PrimeLLM dashboard to create an API key...\n'));
260
+ await (0, open_1.default)(PRIMELLM_DASHBOARD_URL);
261
+ await prompt({
262
+ type: 'confirm',
263
+ name: 'ready',
264
+ message: 'Press Enter when you have created your API key...',
265
+ });
251
266
  }
252
- /**
253
- * Get current credit balance
254
- */
255
- async get() {
256
- return this.client.request("/v1/credits", undefined, { method: "GET" });
267
+ // Prompt for API key
268
+ const { inputApiKey } = await prompt({
269
+ type: 'password',
270
+ name: 'inputApiKey',
271
+ message: 'Enter your PrimeLLM API key:',
272
+ validate: (value) => {
273
+ if (!value)
274
+ return 'API key is required';
275
+ if (!validateApiKey(value))
276
+ return 'API key must start with "primellm_"';
277
+ return true;
278
+ },
279
+ });
280
+ apiKey = inputApiKey;
281
+ console.log(chalk_1.default.green(`āœ“ API key validated: ${maskApiKey(apiKey)}`));
282
+ console.log();
283
+ // ============ STEP 4: Configuration Scope ============
284
+ console.log(chalk_1.default.white.bold('šŸ“ Configuration Scope\n'));
285
+ const { configScope } = await prompt({
286
+ type: 'select',
287
+ name: 'configScope',
288
+ message: 'Choose configuration scope:',
289
+ choices: [
290
+ { name: 'system', message: 'System-level (applies to all projects)' },
291
+ { name: 'project', message: 'Project-level (current project only)' },
292
+ ],
293
+ });
294
+ console.log();
295
+ // ============ STEP 5: Check Existing Config ============
296
+ const { file: configFile } = getConfigPaths(selectedTool, configScope);
297
+ const existingConfig = readExistingConfig(configFile);
298
+ if (existingConfig) {
299
+ console.log(chalk_1.default.yellow('⚠ Existing configuration found:\n'));
300
+ console.log(chalk_1.default.gray(` Base URL: ${existingConfig.baseUrl || '(not set)'}`));
301
+ console.log(chalk_1.default.gray(` API Key: ${existingConfig.apiKey ? maskApiKey(existingConfig.apiKey) : '(not set)'}`));
302
+ console.log();
303
+ const { confirmOverwrite } = await prompt({
304
+ type: 'confirm',
305
+ name: 'confirmOverwrite',
306
+ message: 'Do you want to overwrite this configuration?',
307
+ initial: true,
308
+ });
309
+ if (!confirmOverwrite) {
310
+ console.log(chalk_1.default.yellow('\n⚠ Configuration cancelled.'));
311
+ process.exit(0);
312
+ }
313
+ console.log();
257
314
  }
258
- }
259
- /**
260
- * Tokens sub-client (utility)
261
- */
262
- class TokensClient {
263
- /**
264
- * Count tokens in text or messages
265
- */
266
- count(input) {
267
- return countTokens(input);
315
+ // ============ STEP 6: Write Configuration ============
316
+ const writeSpinner = (0, ora_1.default)('Writing configuration...').start();
317
+ try {
318
+ writeConfig(selectedTool, configScope, apiKey);
319
+ writeSpinner.succeed(chalk_1.default.green('Configuration saved'));
268
320
  }
269
- /**
270
- * Set custom tokenizer adapter
271
- */
272
- setAdapter(adapter) {
273
- setTokenizerAdapter(adapter);
321
+ catch (error) {
322
+ writeSpinner.fail(chalk_1.default.red('Failed to write configuration'));
323
+ console.error(chalk_1.default.gray(String(error)));
324
+ process.exit(1);
274
325
  }
326
+ // ============ SUCCESS ============
327
+ console.log();
328
+ console.log(chalk_1.default.gray('━'.repeat(60)));
329
+ console.log();
330
+ console.log(chalk_1.default.green.bold('āœ… PrimeLLM configured successfully!'));
331
+ console.log();
332
+ console.log(chalk_1.default.white('You can now use:'));
333
+ console.log(chalk_1.default.cyan(` ${toolInfo.command}`));
334
+ console.log(chalk_1.default.white('with PrimeLLM as the backend.'));
335
+ console.log();
336
+ console.log(chalk_1.default.gray(`Config location: ${configFile}`));
337
+ console.log(chalk_1.default.gray(`Base URL: ${PRIMELLM_BASE_URL}`));
338
+ console.log();
339
+ console.log(chalk_1.default.gray('━'.repeat(60)));
340
+ console.log();
341
+ console.log(chalk_1.default.white('Need help? Visit ') + chalk_1.default.cyan('https://primellm.in/docs'));
342
+ console.log();
275
343
  }
276
- // Backwards compatibility alias
277
- export { PrimeLLM as PrimeLLMClient };
278
- // Default export
279
- export default PrimeLLM;
344
+ // Run the CLI
345
+ main().catch((error) => {
346
+ console.error(chalk_1.default.red('An unexpected error occurred:'));
347
+ console.error(chalk_1.default.gray(String(error)));
348
+ process.exit(1);
349
+ });
350
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}