UNPKG

cyber-mysql-openai

Version:

Intelligent natural language to SQL translator with self-correction capabilities using OpenAI and MySQL

189 lines (188 loc) 6.37 kB
import { CyberMySQLOpenAIConfig, TranslationResult, SQLResult, NaturalResponseOptions, CacheStats, QueryStreamChunk } from "../types"; import { SupportedLanguage } from "../utils/i18n"; import { QueryRecord } from "../utils/queryHistory"; /** * Clase principal que proporciona la funcionalidad para traducir * lenguaje natural a SQL y ejecutar consultas */ export declare class CyberMySQLOpenAI { private openai; private dbManager; private logger; private responseFormatter; private maxReflections; private openaiModel; private lightModel; private i18n; private cache; private cacheEnabled; private schemaContext; private mode; private cachedSchema; private schemaCachedAt; private schemaTTL; private queryHistory; /** * Constructor de la clase CyberMySQLOpenAI * @param config - Configuración de la librería */ constructor(config?: Partial<CyberMySQLOpenAIConfig>); /** * Procesa una consulta en lenguaje natural, la traduce a SQL y la ejecuta * @param prompt - Consulta en lenguaje natural * @param options - Opciones adicionales * @returns Resultado de la consulta */ query(prompt: string, options?: NaturalResponseOptions): Promise<TranslationResult>; /** * Procesa una consulta en lenguaje natural devolviendo un generador asíncrono * para consumo de eventos y texto en tiempo real (streaming) * @param prompt - Consulta en lenguaje natural * @param options - Opciones adicionales * @returns Generador asíncrono de eventos de consulta */ queryStream(prompt: string, options?: NaturalResponseOptions): AsyncGenerator<QueryStreamChunk, TranslationResult, unknown>; /** * Ejecuta una consulta SQL directamente * @param sql - Consulta SQL * @param options - Opciones adicionales * @returns Resultado de la consulta */ executeSQL(sql: string, options?: NaturalResponseOptions): Promise<SQLResult>; /** * Cierra la conexión a la base de datos */ close(): Promise<void>; /** * Cambia el idioma de las respuestas * @param language - Idioma a establecer ('es' | 'en') */ setLanguage(language: SupportedLanguage): void; /** * Obtiene el idioma actual * @returns Idioma actual */ getLanguage(): SupportedLanguage; /** * Genera SQL a partir de lenguaje natural usando OpenAI * Intenta usar function calling para respuestas estructuradas; * si el modelo no lo soporta, cae al modo texto con sqlCleaner. */ private generateSQL; /** * Construye la descripción comprimida del schema. * Formato: "tabla: col1* col2 col3→ref_tabla" (~20 tokens/tabla vs ~60 antes) * donde * = PRIMARY KEY, →ref = FK a otra tabla */ private buildSchemaDescription; /** * Construye la sección de relaciones FK para el prompt */ private buildRelationshipsSection; /** * Construye la sección de ejemplos few-shot para el prompt */ private buildExamplesSection; /** * Intenta corregir una consulta SQL fallida mediante reflexión * @param prompt - Consulta original en lenguaje natural * @param sql - Consulta SQL que falló * @param errorMessage - Mensaje de error * @param schema - Esquema de la base de datos * @param requestId - ID de la solicitud para logging * @returns Resultado después de intentar corregir */ /** * Extrae los nombres de tablas mencionados en una consulta SQL. * Se usa para filtrar el schema y no re-enviarlo completo en la reflexión. */ private extractTablesFromSQL; private levenshtein; private reflectAndFix; /** * Genera una reflexión sobre un error en una consulta SQL. * Usa function calling cuando está disponible, con fallback a texto. */ private generateReflection; /** * Genera un hash del esquema de la base de datos para usar como clave de cache * @param schema - Esquema de la base de datos * @returns Hash del esquema */ private generateSchemaHash; /** * Obtiene estadísticas del cache * @returns Estadísticas del cache o null si está deshabilitado */ getCacheStats(): CacheStats | null; /** * Limpia el cache completamente */ clearCache(): void; /** * Invalida entradas del cache relacionadas con una tabla específica * @param tableName - Nombre de la tabla * @returns Número de entradas invalidadas */ invalidateCacheByTable(tableName: string): number; /** * Habilita o deshabilita el cache dinámicamente * @param enabled - Estado del cache */ setCacheEnabled(enabled: boolean): void; /** * Verifica si el cache está habilitado * @returns Estado del cache */ isCacheEnabled(): boolean; /** * Obtiene el esquema de la base de datos con cache TTL */ private getSchemaWithCache; /** * Fuerza el refresco del schema cacheado */ refreshSchema(): void; /** * Construye la sección de instrucciones personalizadas para los prompts */ private buildCustomInstructionsSection; /** * Construye la instrucción de estilo de respuesta para los prompts */ private buildResponseStyleInstruction; /** * Acumula el uso de tokens de una respuesta de OpenAI */ private accumulateTokens; /** * Estima el costo en USD basado en el modelo y la cantidad de tokens. * Precios por 1M de tokens (actualizados a Feb 2025). */ private estimateTokenCost; /** * Obtiene el historial de ejecución de consultas * @param limit - Número máximo de registros a devolver */ getQueryHistory(limit?: number): QueryRecord[]; /** * Obtiene estadísticas sobre la ejecución de consultas */ getQueryStats(): { totalQueries: number; successfulQueries: number; failedQueries: number; averageExecutionTime: number; cacheHitRate: number; totalTokensUsed: number; }; /** * Limpia el historial de consultas */ clearQueryHistory(): void; /** * Exporta el historial de consultas como JSON */ exportQueryHistory(): string; } export default CyberMySQLOpenAI;