Socket
Socket
Sign inDemoInstall

llm-interface

Package Overview
Dependencies
Maintainers
0
Versions
38
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

llm-interface - npm Package Compare versions

Comparing version 2.0.13 to 2.0.14

2

package.json
{
"name": "llm-interface",
"version": "2.0.13",
"version": "2.0.14",
"main": "src/index.js",

@@ -5,0 +5,0 @@ "description": "A simple, unified NPM-based interface for interacting with multiple Large Language Model (LLM) APIs, including OpenAI, AI21 Studio, Anthropic, Cloudflare AI, Cohere, Fireworks AI, Google Gemini, Goose AI, Groq, Hugging Face, Mistral AI, Perplexity, Reka AI, watsonx.ai, and LLaMA.cpp.",

@@ -5,3 +5,3 @@ # llm-interface

![Version 2.0.13](https://img.shields.io/badge/Version-2.0.13-blue) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Built with Node.js](https://img.shields.io/badge/Built%20with-Node.js-green)](https://nodejs.org/)
![Version 2.0.14](https://img.shields.io/badge/Version-2.0.14-blue) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Built with Node.js](https://img.shields.io/badge/Built%20with-Node.js-green)](https://nodejs.org/)

@@ -8,0 +8,0 @@ ## Introduction

@@ -30,3 +30,2 @@ /**

const log = require('loglevel');
log.setLevel(log.levels.SILENT);

@@ -197,3 +196,3 @@ // BaseInterface class for interacting with various APIs

log.log(this.baseURL + url);
// log.log('baseInterface:url', this.baseURL + url);

@@ -203,6 +202,5 @@ // update the headers

log.log(this.client.defaults.headers);
// log.log('baseInterface:headers', this.client.defaults.headers);
// log.log('baseInterface:requestBody', requestBody);
log.log(requestBody);
let response;

@@ -213,3 +211,3 @@

response = await this.client.post(this.baseURL + url, requestBody);
log.log(JSON.stringify(response.data));
// log.log('baseInterface:response.data', JSON.stringify(response.data));
} else {

@@ -305,8 +303,9 @@ return await this.client.post(this.baseURL + url, requestBody, {

}
log.log(responseContent);
// log.log('responseContent', responseContent);
let finalResponse = {};
let finalResponse = { success: false };
if (responseContent) {
finalResponse.results = responseContent;
finalResponse.success = true;
}

@@ -379,3 +378,3 @@ // optionally include the original llm api response

// Adjust options
log.log('expects', expects);
// log.log('expects', expects);
prompt = this.adjustEmbeddingPrompt(prompt);

@@ -411,6 +410,6 @@ //console.log('prompt', prompt);

const url = this.getEmbedRequestUrl(model);
log.log('url', embeddingUrl + url);
log.log('api', config[this.interfaceName].apiKey);
log.log('payload', payload);
log.log('prompt', prompt.length);
// log.log('url', embeddingUrl + url);
// log.log('api', config[this.interfaceName].apiKey);
// log.log('payload', payload);
// log.log('prompt', prompt.length);

@@ -422,3 +421,3 @@ let response, embeddings;

response = await this.client.post(embeddingUrl + url, payload);
log.log('response', response.data);
// log.log('response', response.data);
} catch (error) {

@@ -425,0 +424,0 @@ if (error.response) {

@@ -13,3 +13,2 @@ /**

const log = require('loglevel');
log.setLevel(log.levels.SILENT);

@@ -16,0 +15,0 @@ /**

@@ -13,4 +13,3 @@ /**

const log = require('loglevel');
//log.setLevel('silent');
let cacheInstance = [];
/**

@@ -17,0 +16,0 @@ * Sets the API key for a specified interface or multiple interfaces.

const { SendMessageError, EmbeddingsError } = require('./errors.js');
const { delay } = require('./utils.js');
const { hrtime } = require('process');
const log = require('loglevel');
log.setLevel(log.levels.SILENT);

@@ -15,2 +18,3 @@ /**

async function retryWithBackoff(fn, options, errorType) {
const start = hrtime();
let { retryAttempts = 3, retryMultiplier = 0.3 } = options;

@@ -21,5 +25,14 @@ let currentRetry = 0;

try {
return await fn();
log.log(`retryWithBackoff:${retryAttempts}`);
let response = await fn();
if (response?.results) {
const end = hrtime(start);
const milliseconds = end[0] * 1e3 + end[1] / 1e6;
response.total_time = milliseconds.toFixed(5);
return response;
}
} catch (error) {
const statusCode = error.response?.status;
const delayTime = (currentRetry + 1) * retryMultiplier * 1000 + 500;
switch (statusCode) {

@@ -30,15 +43,9 @@ case 400:

case 404:
if (errorType === 'SendMessageError') {
throw new SendMessageError(
`HTTP ${statusCode}: ${error.response?.statusText || 'Error'}`,
error.response?.data,
error.stack,
);
} else if (errorType === 'EmbeddingsError') {
throw new EmbeddingsError(
`HTTP ${statusCode}: ${error.response?.statusText || 'Error'}`,
error.response?.data,
error.stack,
);
}
log.log(
`retryWithBackoff:error:${statusCode}:${
error.response?.statusText || 'Error'
}`,
);
throw createError(errorType, statusCode, error);
break;

@@ -50,6 +57,9 @@

const retryAfter = error.response?.headers['retry-after'];
if (retryAfter) {
log.log(
`retryWithBackoff:error:${statusCode}: Retry after ${retryAfter} s`,
);
await delay(retryAfter * 1000);
} else {
const delayTime = (currentRetry + 1) * retryMultiplier * 1000 + 500;
await delay(delayTime);

@@ -63,3 +73,2 @@ }

// Retry with exponential backoff
const delayTime = (currentRetry + 1) * retryMultiplier * 1000 + 500;
await delay(delayTime);

@@ -69,20 +78,8 @@ break;

default:
if (errorType === 'SendMessageError') {
throw new SendMessageError(
`HTTP ${statusCode || 'Unknown'}: ${error.message}`,
error.response?.data,
error.stack,
);
} else if (errorType === 'EmbeddingsError') {
throw new EmbeddingsError(
`HTTP ${statusCode || 'Unknown'}: ${error.message}`,
error.response?.data,
error.stack,
);
}
throw createError(errorType, statusCode || 'Unknown', error);
break;
}
currentRetry++;
retryAttempts--;
}
currentRetry++;
retryAttempts--;
}

@@ -97,2 +94,25 @@

/**
* Creates a custom error based on the provided type, status code, and error details.
* @param {string} type - The type of error to create ('SendMessageError' or 'EmbeddingsError').
* @param {number|string} statusCode - The HTTP status code associated with the error.
* @param {Error} error - The original error object containing additional details.
* @returns {SendMessageError|EmbeddingsError} - The custom error object.
* @throws {Error} - Throws a generic error if the provided type is not recognized.
*/
function createError(type, statusCode, error) {
const message = `HTTP ${statusCode}: ${
error.response?.statusText || error.message
}`;
const data = error.response?.data;
const stack = error.stack;
if (type === 'SendMessageError') {
return new SendMessageError(message, data, stack);
} else if (type === 'EmbeddingsError') {
return new EmbeddingsError(message, data, stack);
}
throw new Error(`Unknown error type: ${type}`);
}
module.exports = { retryWithBackoff };

@@ -12,2 +12,3 @@ /**

const RESET = '\u001b[0m';
const log = require('loglevel');

@@ -144,2 +145,3 @@ /**

async function delay(ms) {
log.log(`delay(${ms})`);
return new Promise((resolve) => setTimeout(resolve, ms));

@@ -169,3 +171,2 @@ }

/* should be moved */

@@ -207,5 +208,6 @@

process.stdout.write(
`\n${YELLOW}Using ${interfaceName} and ${!embeddings
? getInterfaceConfigValue(interfaceName, 'model.default')
: getInterfaceConfigValue(interfaceName, 'embeddings.default')
`\n${YELLOW}Using ${interfaceName} and ${
!embeddings
? getInterfaceConfigValue(interfaceName, 'model.default')
: getInterfaceConfigValue(interfaceName, 'embeddings.default')
}${RESET}`,

@@ -243,3 +245,2 @@ );

/**

@@ -260,6 +261,10 @@ * Checks if the given variable is an empty plain object.

function isEmptyObject(obj) {
return obj !== null && obj !== undefined && Object.keys(obj).length === 0 && obj.constructor === Object;
return (
obj !== null &&
obj !== undefined &&
Object.keys(obj).length === 0 &&
obj.constructor === Object
);
}
module.exports = {

@@ -266,0 +271,0 @@ getMessageObject,

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc