llm-interface
Advanced tools
Comparing version 2.0.13 to 2.0.14
{ | ||
"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, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
179521
4199