You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/include/AI_Features_Manager.h

217 lines
6.4 KiB

/**
* @file ai_features_manager.h
* @brief AI Features Manager for ProxySQL
*
* The AI_Features_Manager class coordinates all AI-related features in ProxySQL:
* - LLM Bridge (generic LLM access via MySQL protocol)
* - Anomaly detection for security monitoring
* - Vector storage for semantic caching
* - Hybrid model routing (local Ollama + cloud APIs)
*
* Architecture:
* - Central configuration management with 'genai-' variable prefix
* - Thread-safe operations using pthread rwlock
* - Follows same pattern as MCP_Threads_Handler and GenAI_Threads_Handler
* - Coordinates with MySQL_Session for query interception
*
* @date 2025-01-17
* @version 1.0.0
*
* Example Usage:
* @code
* // Access LLM bridge
* LLM_Bridge* llm = GloAI->get_llm_bridge();
* LLMRequest req;
* req.prompt = "Summarize this data";
* LLMResult result = llm->process(req);
* @endcode
*/
#ifndef __CLASS_AI_FEATURES_MANAGER_H
#define __CLASS_AI_FEATURES_MANAGER_H
#define AI_FEATURES_MANAGER_VERSION "1.0.0"
#include "proxysql.h"
#include <pthread.h>
#include <string>
// Forward declarations
class LLM_Bridge;
class Anomaly_Detector;
class SQLite3DB;
/**
* @brief AI Features Manager
*
* Coordinates all AI features in ProxySQL:
* - LLM Bridge (generic LLM access)
* - Anomaly detection for security
* - Vector storage for semantic caching
* - Hybrid model routing (local Ollama + cloud APIs)
*
* This class follows the same pattern as MCP_Threads_Handler and GenAI_Threads_Handler
* for configuration management and lifecycle.
*
* Thread Safety:
* - All public methods are thread-safe using pthread rwlock
* - Use wrlock()/wrunlock() for manual locking if needed
*
* @see LLM_Bridge, Anomaly_Detector
*/
class AI_Features_Manager {
private:
int shutdown_;
pthread_rwlock_t rwlock;
// Sub-components
LLM_Bridge* llm_bridge;
Anomaly_Detector* anomaly_detector;
SQLite3DB* vector_db;
// Helper methods
int init_vector_db();
int init_anomaly_detector();
void close_vector_db();
void close_llm_bridge();
void close_anomaly_detector();
public:
/**
* @brief Status variables (read-only counters)
*
* These track metrics and usage statistics for AI features.
* Configuration is managed by the GenAI module (GloGATH).
*/
struct {
unsigned long long llm_total_requests;
unsigned long long llm_cache_hits;
unsigned long long llm_local_model_calls;
unsigned long long llm_cloud_model_calls;
unsigned long long llm_total_response_time_ms; // Total response time for all LLM calls
unsigned long long llm_cache_total_lookup_time_ms; // Total time spent in cache lookups
unsigned long long llm_cache_total_store_time_ms; // Total time spent in cache storage
unsigned long long llm_cache_lookups;
unsigned long long llm_cache_stores;
unsigned long long llm_cache_misses;
unsigned long long anomaly_total_checks;
unsigned long long anomaly_blocked_queries;
unsigned long long anomaly_flagged_queries;
double daily_cloud_spend_usd;
} status_variables;
/**
* @brief Constructor - initializes with default configuration
*/
AI_Features_Manager();
/**
* @brief Destructor - cleanup resources
*/
~AI_Features_Manager();
/**
* @brief Initialize all AI features
*
* Initializes vector database, LLM bridge, and anomaly detector.
* This must be called after ProxySQL configuration is loaded.
*
* @return 0 on success, non-zero on failure
*/
int init();
/**
* @brief Shutdown all AI features
*
* Gracefully shuts down all components and frees resources.
* Safe to call multiple times.
*/
void shutdown();
/**
* @brief Initialize LLM bridge
*
* Initializes the LLM bridge if not already initialized.
* This can be called at runtime after enabling llm.
*
* @return 0 on success, non-zero on failure
*/
int init_llm_bridge();
/**
* @brief Acquire write lock for thread-safe operations
*
* Use this for manual locking when performing multiple operations
* that need to be atomic.
*
* @note Must be paired with wrunlock()
*/
void wrlock();
/**
* @brief Release write lock
*
* @note Must be called after wrlock()
*/
void wrunlock();
/**
* @brief Get LLM bridge instance
*
* @return Pointer to LLM_Bridge or NULL if not initialized
*
* @note Thread-safe when called within wrlock()/wrunlock() pair
*/
LLM_Bridge* get_llm_bridge() { return llm_bridge; }
// Status variable update methods
void increment_llm_total_requests() { __sync_fetch_and_add(&status_variables.llm_total_requests, 1); }
void increment_llm_cache_hits() { __sync_fetch_and_add(&status_variables.llm_cache_hits, 1); }
void increment_llm_cache_misses() { __sync_fetch_and_add(&status_variables.llm_cache_misses, 1); }
void increment_llm_local_model_calls() { __sync_fetch_and_add(&status_variables.llm_local_model_calls, 1); }
void increment_llm_cloud_model_calls() { __sync_fetch_and_add(&status_variables.llm_cloud_model_calls, 1); }
void add_llm_response_time_ms(unsigned long long ms) { __sync_fetch_and_add(&status_variables.llm_total_response_time_ms, ms); }
void add_llm_cache_lookup_time_ms(unsigned long long ms) { __sync_fetch_and_add(&status_variables.llm_cache_total_lookup_time_ms, ms); }
void add_llm_cache_store_time_ms(unsigned long long ms) { __sync_fetch_and_add(&status_variables.llm_cache_total_store_time_ms, ms); }
void increment_llm_cache_lookups() { __sync_fetch_and_add(&status_variables.llm_cache_lookups, 1); }
void increment_llm_cache_stores() { __sync_fetch_and_add(&status_variables.llm_cache_stores, 1); }
/**
* @brief Get anomaly detector instance
*
* @return Pointer to Anomaly_Detector or NULL if not initialized
*
* @note Thread-safe when called within wrlock()/wrunlock() pair
*/
Anomaly_Detector* get_anomaly_detector() { return anomaly_detector; }
/**
* @brief Get vector database instance
*
* @return Pointer to SQLite3DB or NULL if not initialized
*
* @note Thread-safe when called within wrlock()/wrunlock() pair
*/
SQLite3DB* get_vector_db() { return vector_db; }
/**
* @brief Get AI features status as JSON
*
* Returns comprehensive status including:
* - Enabled features
* - Status counters (requests, cache hits, etc.)
* - Daily cloud spend
*
* Note: Configuration is managed by the GenAI module (GloGATH).
* Use GenAI get/set methods for configuration access.
*
* @return JSON string with status information
*/
std::string get_status_json();
};
// Global instance
extern AI_Features_Manager *GloAI;
#endif // __CLASS_AI_FEATURES_MANAGER_H