venice-ai-sdk-apl
Version:
A comprehensive SDK for the Venice AI API with CLI support, programmatic CLI usage, CLI-style interface, and interactive demo
201 lines • 6.58 kB
JavaScript
;
/**
* Logger Utility
*
* This module provides logging functionality for the SDK.
* It allows for different log levels and can be enabled/disabled.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Logger = exports.LogLevel = void 0;
/**
* Log levels
*/
var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["NONE"] = 0] = "NONE";
LogLevel[LogLevel["ERROR"] = 1] = "ERROR";
LogLevel[LogLevel["WARN"] = 2] = "WARN";
LogLevel[LogLevel["INFO"] = 3] = "INFO";
LogLevel[LogLevel["DEBUG"] = 4] = "DEBUG";
LogLevel[LogLevel["TRACE"] = 5] = "TRACE";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
/**
* Default logger configuration
*/
const DEFAULT_CONFIG = {
level: LogLevel.NONE,
timestamps: true
};
/**
* Logger class
*/
class Logger {
/**
* Configure the logger
*
* @param config - Logger configuration
*/
static configure(config) {
Logger.config = {
...Logger.config,
...config
};
}
/**
* Set the log level
*
* @param level - Log level
*/
static setLevel(level) {
Logger.config.level = level;
}
/**
* Log a message at the error level
*
* @param message - Message to log
* @param data - Additional data to log
*/
static error(message, data) {
Logger.log(message, LogLevel.ERROR, data);
}
/**
* Log a message at the warn level
*
* @param message - Message to log
* @param data - Additional data to log
*/
static warn(message, data) {
Logger.log(message, LogLevel.WARN, data);
}
/**
* Log a message at the info level
*
* @param message - Message to log
* @param data - Additional data to log
*/
static info(message, data) {
Logger.log(message, LogLevel.INFO, data);
}
/**
* Log a message at the debug level
*
* @param message - Message to log
* @param data - Additional data to log
*/
static debug(message, data) {
Logger.log(message, LogLevel.DEBUG, data);
}
/**
* Log a message at the trace level
*
* @param message - Message to log
* @param data - Additional data to log
*/
static trace(message, data) {
Logger.log(message, LogLevel.TRACE, data);
}
/**
* Sanitizes an object to exclude image data
*
* @param data - Object to sanitize
* @returns Sanitized object
*/
static sanitizeImageData(data) {
if (!data || typeof data !== 'object') {
return data;
}
// Create a shallow copy of the object
const sanitized = Array.isArray(data) ? [...data] : { ...data };
// Check each property for potential image data
for (const key in sanitized) {
if (Object.prototype.hasOwnProperty.call(sanitized, key)) {
const value = sanitized[key];
// Check for common image field names
if (['image', 'data', 'content', 'file', 'buffer', 'base64'].includes(key.toLowerCase())) {
// Check if value is likely image data (string longer than 1000 chars or Buffer)
if ((typeof value === 'string' && value.length > 1000) ||
(value && typeof value === 'object' && 'buffer' in value) ||
(value instanceof Buffer)) {
sanitized[key] = '[IMAGE DATA EXCLUDED]';
}
}
else if (typeof value === 'string' && value.length > 1000 &&
(value.startsWith('data:image') ||
value.startsWith('/9j/') || // JPEG
value.startsWith('iVBOR') || // PNG
/^[A-Za-z0-9+/=]{1000,}$/.test(value))) {
// Also check for base64 encoded images in other fields
sanitized[key] = '[IMAGE DATA EXCLUDED]';
}
else if (typeof value === 'object' && value !== null) {
// Recursively sanitize nested objects
sanitized[key] = Logger.sanitizeImageData(value);
}
}
}
return sanitized;
}
/**
* Log a message at the specified level
*
* @param message - Message to log
* @param level - Log level
* @param data - Additional data to log
*/
static log(message, level, data) {
if (level > Logger.config.level) {
return;
}
const timestamp = Logger.config.timestamps ? `[${new Date().toISOString()}] ` : '';
const levelStr = LogLevel[level].padEnd(5);
let logMessage = `${timestamp}${levelStr} - ${message}`;
if (data !== undefined) {
if (typeof data === 'object') {
try {
// Sanitize object to exclude image data before stringifying
const sanitizedData = Logger.sanitizeImageData(data);
const dataStr = JSON.stringify(sanitizedData, null, 2);
logMessage += `\n${dataStr}`;
}
catch (error) {
logMessage += `\n[Object could not be stringified]`;
}
}
else {
// For non-object data, check if it's a string that might be base64 encoded image
if (typeof data === 'string' && data.length > 1000 &&
(data.startsWith('data:image') ||
data.startsWith('/9j/') || // JPEG
data.startsWith('iVBOR') || // PNG
/^[A-Za-z0-9+/=]{1000,}$/.test(data))) {
logMessage += ' [IMAGE DATA EXCLUDED]';
}
else {
logMessage += ` ${data}`;
}
}
}
if (Logger.config.logHandler) {
Logger.config.logHandler(logMessage, level);
}
else {
switch (level) {
case LogLevel.ERROR:
console.error(logMessage);
break;
case LogLevel.WARN:
console.warn(logMessage);
break;
default:
console.log(logMessage);
break;
}
}
}
}
exports.Logger = Logger;
/**
* Current configuration
*/
Logger.config = { ...DEFAULT_CONFIG };
//# sourceMappingURL=logger.js.map