SQL
AI & External Services

AI and external services

LedgyX provides built-in integration with AI services, the Telegram Bot API, notification systems, and file operations through special SQL functions.

AI services

Language models

AI_CHAT_COMPLETION - Chat with AI models

-- Basic chat request
SELECT AI_CHAT_COMPLETION(
    'gpt-4',
    'Explain how blockchain works in simple terms',
    &temperature,
    &max_tokens
) AS ai_response
TYPE OBJECT;
 
-- Contextual dialog with history
SELECT AI_CHAT_COMPLETION(
    'gpt-3.5-turbo',
    &user_message,
    &conversation_history::JSON,
    0.7,
    1000
) AS chat_response
TYPE OBJECT;
 
-- Using it in an API endpoint
-- POST /api/chat/ask
INSERT INTO chat_logs (user_id, question, ai_answer, timestamp)
SELECT 
    &user_id,
    &question,
    AI_CHAT_COMPLETION('gpt-4', &question, 0.8, 500),
    NOW()
ON CONFLICT(user_id) DO UPDATE 
SET question = EXCLUDED.question,
    ai_answer = EXCLUDED.ai_answer,
    timestamp = EXCLUDED.timestamp;

AI_CREATE_COMPLETION - Text generation

-- Automatically creating descriptions
SELECT 
    product_name,
    AI_CREATE_COMPLETION(
        'text-davinci-003',
        'Create a marketing description for the product: ' || product_name,
        &temperature,
        &max_tokens
    ) AS generated_description
FROM dictionary.products 
WHERE description IS NULL
LIMIT 10 TYPE LIST;
 
-- Generating SQL queries from a description
SELECT AI_CREATE_COMPLETION(
    'code-davinci-002',
    'Write a SQL query for: ' || &user_request,
    0.1,
    200
) AS generated_sql
TYPE OBJECT;

Embeddings and semantic search

AI_CREATE_EMBEDDING - Text vectorization

-- Creating embeddings for search
SELECT 
    document_id,
    title,
    content,
    AI_CREATE_EMBEDDING('text-embedding-ada-002', content) AS embedding_vector
FROM dictionary.documents
WHERE embedding_vector IS NULL
LIMIT 100 TYPE LIST;
 
-- Semantic search by query (simplified)
SELECT 
    d.title,
    d.content,
    d.embedding_vector
FROM dictionary.documents d
WHERE d.embedding_vector IS NOT NULL
ORDER BY d.title
LIMIT 10 TYPE LIST;

Content moderation

AI_MODERATE_CONTENT - Checking content

-- Automatic moderation of messages
SELECT 
    message_id,
    user_message,
    AI_MODERATE_CONTENT(user_message) AS moderation_result
FROM dictionary.user_messages 
WHERE moderated = false
TYPE LIST;
 
-- API for checking content before publishing  
-- POST /api/content/moderate
SELECT 
    AI_MODERATE_CONTENT(&content) AS moderation_result
TYPE OBJECT;

Working with images

AI_GENERATE_IMAGE - Image generation

-- Creating images from a description
SELECT 
    product_id,
    product_name,
    AI_GENERATE_IMAGE(
        'dall-e-3',
        'Create a professional product image: ' || product_name,
        '1024x1024',
        'high'
    ) AS generated_image_url
FROM dictionary.products
WHERE image_url IS NULL
LIMIT 5 TYPE LIST;
 
-- Generating user avatars
-- POST /api/user/generate-avatar
INSERT INTO dictionary.user_avatars (user_id, avatar_url, generated_at)
SELECT 
    &user_id,
    AI_GENERATE_IMAGE(
        'dall-e-2', 
        &avatar_description,
        '512x512',
        'standard'
    ),
    NOW()
ON CONFLICT(user_id) DO UPDATE 
SET avatar_url = EXCLUDED.avatar_url,
    generated_at = EXCLUDED.generated_at;

AI_ANALYZE_IMAGE - Image analysis

-- Analyzing uploaded images
SELECT 
    image_id,
    image_url,
    AI_ANALYZE_IMAGE(image_url, 'Describe what is shown in the picture') AS image_description,
    AI_ANALYZE_IMAGE(image_url, 'Are there people in the image?') AS contains_people
FROM dictionary.uploaded_images
WHERE analyzed = false
LIMIT 20 TYPE LIST;
 
-- Automatic categorization
UPDATE dictionary.uploaded_images 
SET 
    category = (
        SELECT AI_ANALYZE_IMAGE(image_url, 'Which category does this image belong to: nature, city, people, food, technology?')
    ),
    analyzed = true
WHERE analyzed = false;

AI_ANALYZE_IMAGE_FILE - Analyzing image files

-- Analyzing local image files
SELECT 
    file_path,
    AI_ANALYZE_IMAGE_FILE(file_path, 'Extract all text from the image') AS extracted_text,
    AI_ANALYZE_IMAGE_FILE(file_path, 'Describe the document contents') AS document_summary
FROM dictionary.scanned_documents
WHERE processed = false
TYPE LIST;

Audio processing

AI_TRANSCRIBE_AUDIO - Speech recognition

-- Transcribing audio calls
SELECT 
    call_id,
    audio_file_path,
    AI_TRANSCRIBE_AUDIO(audio_file_path, 'ru') AS transcription,
    duration_seconds
FROM dictionary.call_recordings
WHERE transcription IS NULL
ORDER BY call_date DESC
LIMIT 50 TYPE LIST;
 
-- API for transcription
-- POST /api/audio/transcribe  
SELECT 
    &file_id AS file_id,
    AI_TRANSCRIBE_AUDIO(&file_path, &language) AS transcript
TYPE OBJECT;

AI_TRANSLATE_AUDIO - Audio translation

-- Translating audio into other languages
SELECT 
    audio_id,
    original_language,
    AI_TRANSLATE_AUDIO(audio_file_path, 'en') AS english_translation,
    AI_TRANSLATE_AUDIO(audio_file_path, 'es') AS spanish_translation
FROM dictionary.multilingual_content
WHERE translated = false
TYPE LIST;

AI file operations

File management

-- AI_UPLOAD_FILE - Uploading files to the AI service
SELECT AI_UPLOAD_FILE(&file_path, 'training-data') AS upload_result
TYPE OBJECT;
 
-- AI_LIST_FILES - List of uploaded files  
SELECT AI_LIST_FILES() AS files_list
TYPE LIST;
 
-- AI_DELETE_FILE - Deleting files
SELECT AI_DELETE_FILE(&file_id) AS deletion_result  
TYPE OBJECT;

Telegram Bot API

Sending messages

TG_SEND_MESSAGE - Sending text messages

-- Sending notifications to users
SELECT 
    user_id,
    TG_SEND_MESSAGE(
        telegram_chat_id,
        'Your order #' || order_id || ' is ready for pickup!',
        'MarkdownV2'
    ) AS message_result
FROM dictionary.users u
JOIN dictionary.orders o ON u.user_id = o.user_id  
WHERE o.status = 'ready' AND o.notified = false
TYPE LIST;
 
-- API for sending messages
-- POST /api/telegram/send-message
INSERT INTO dictionary.telegram_messages (chat_id, message, sent_at, status)
SELECT 
    &chat_id,
    &message_text,
    NOW(),
    'sent';

Sending media

TG_SEND_PHOTO, TG_SEND_DOCUMENT, TG_SEND_AUDIO

-- Sending photos with a caption
SELECT 
    TG_SEND_PHOTO(
        &chat_id,
        &photo_url,
        'Your QR code for signing in to the system'
    ) AS photo_sent
TYPE OBJECT;
 
-- Sending documents
SELECT 
    TG_SEND_DOCUMENT(
        &chat_id,
        &document_path,
        'Report for ' || &report_period
    ) AS document_sent  
TYPE OBJECT;
 
-- Sending voice messages
SELECT 
    TG_SEND_VOICE(
        &chat_id,
        &voice_file_path,
        'Voice notification'
    ) AS voice_sent
TYPE OBJECT;
 
-- Sending audio files
SELECT 
    TG_SEND_AUDIO(
        &chat_id,
        &audio_file_path,
        'Music file',
        &performer,
        &title,
        &duration
    ) AS audio_sent
TYPE OBJECT;

Interactive elements

TG_SEND_INLINE_KEYBOARD - Interactive buttons

-- Sending a menu with buttons
SELECT TG_SEND_INLINE_KEYBOARD(
    &chat_id,
    'Choose an action:',
    '[
        [{"text": "📊 Show statistics", "callback_data": "show_stats"}],
        [{"text": "🔄 Refresh data", "callback_data": "refresh_data"}],
        [{"text": "⚙️ Settings", "callback_data": "settings"}]
    ]'
) AS keyboard_sent
TYPE OBJECT;
 
-- Handling callback queries
-- POST /api/telegram/callback
SELECT TG_ANSWER_CALLBACK_QUERY(
    &callback_query_id,
    CASE &callback_data
        WHEN 'show_stats' THEN 'Loading statistics...'
        WHEN 'refresh_data' THEN 'Refreshing data...'  
        WHEN 'settings' THEN 'Opening settings...'
        ELSE 'Unknown command'
    END,
    true
) AS callback_answered
TYPE OBJECT;

Working with Telegram files

TG_GET_FILE, TG_DOWNLOAD_FILE

-- Getting information about a file
SELECT 
    file_id,
    TG_GET_FILE(&file_id) AS file_info
TYPE OBJECT;
 
-- Downloading a file from a user
SELECT 
    TG_DOWNLOAD_FILE(&file_id, &local_path) AS download_result
TYPE OBJECT;
 
-- Combined operation
SELECT 
    TG_GET_AND_DOWNLOAD_FILE(&file_id, &destination_path) AS file_processed
TYPE OBJECT;

Server-Sent Events (SSE)

SSE_SEND - Real-time notifications

-- Sending real-time notifications
SELECT SSE_SEND(
    &client_id,
    'data_update',
    '{
        "type": "new_order",
        "order_id": ' || &order_id || ',
        "timestamp": "' || NOW() || '"
    }'
) AS sse_sent
TYPE OBJECT;
 
-- Notifications about system events
INSERT INTO dictionary.system_events (event_type, data, created_at)
SELECT 'user_login', &user_data, NOW();

Webhook integrations

EVENT and WEBHOOK systems

-- Webhook for user registration
SELECT WEBHOOK(
    'POST',
    'https://external-system.com/api/new-user',
    '{"user_id":' || &user_id || ',"email":"' || &email || ',"registration_time":"' || NOW() || '"}',
    '{"Content-Type": "application/json", "Authorization": "Bearer ' || &api_token || '"}'
) AS webhook_result
TYPE OBJECT;
 
-- Webhook for an order status change
SELECT WEBHOOK(
    'POST',
    &webhook_url,
    '{"order_id":' || &order_id || ',"old_status":"' || &old_status || '","new_status":"' || &new_status || '","updated_at":"' || NOW() || '"}'
) AS status_webhook_result
TYPE OBJECT;

Complex integrations

AI + Telegram Bot

-- Chat bot with AI support
-- POST /api/telegram/chat-bot
SELECT 
    TG_SEND_MESSAGE(
        &chat_id,
        AI_CHAT_COMPLETION('gpt-3.5-turbo', &user_message, 0.7, 500),
        'Markdown'
    ) AS message_sent
TYPE OBJECT;

AI + Image analysis + Notifications

-- Automatic analysis and notifications (no CTE — subquery in FROM)
SELECT 
    ia.image_id,
    ia.analysis,
    CASE 
        WHEN ia.analysis LIKE '%suspicious%' THEN
            TG_SEND_MESSAGE(
                &security_chat_id,
                '🚨 Suspicious activity detected on camera #' || ia.image_id,
                'Markdown'
            )
        ELSE NULL
    END AS alert_sent
FROM (
    SELECT 
        image_id,
        AI_ANALYZE_IMAGE(image_url, 'Is there any suspicious activity in the image?') AS analysis
    FROM dictionary.security_cameras
    WHERE analyzed = false
    LIMIT 10
) AS ia
TYPE LIST;

AI Schemas

AI_SCHEMAS - Working with data schemas

-- Getting schemas for AI processing
SELECT AI_SCHEMAS() AS available_schemas
TYPE LIST;
 
-- Automatically generating schemas based on data
SELECT AI_SCHEMAS(&table_name, &sample_data) AS generated_schema
TYPE OBJECT;

Optimization and best practices

Asynchronous processing

-- A task queue for AI processing
CREATE DICTIONARY IF NOT EXISTS ai_tasks_queue (
    task_id UUID DEFAULT UUID(),
    task_type TEXT NOT NULL,
    input_data JSON NOT NULL,
    status TEXT DEFAULT 'pending',
    result JSON,
    created_at TIMESTAMP DEFAULT NOW(),
    processed_at TIMESTAMP,
    PRIMARY KEY (task_id)
);
 
-- Processing tasks in batches
UPDATE ai_tasks_queue 
SET 
    status = 'processing',
    result = CASE task_type
        WHEN 'text_completion' THEN 
            AI_CREATE_COMPLETION('gpt-3.5-turbo', input_data->>'prompt')::JSON
        WHEN 'image_analysis' THEN 
            AI_ANALYZE_IMAGE(input_data->>'image_url', input_data->>'question')::JSON
        WHEN 'audio_transcription' THEN 
            AI_TRANSCRIBE_AUDIO(input_data->>'file_path', input_data->>'language')::JSON
    END,
    processed_at = NOW()
WHERE status = 'pending'
  AND created_at < NOW() - INTERVAL '1 minute'
LIMIT 50;

Monitoring and logging

-- Logging AI requests
CREATE DICTIONARY IF NOT EXISTS ai_usage_logs (
    log_id UUID DEFAULT UUID(),
    service_type TEXT NOT NULL,
    endpoint TEXT,
    input_tokens INTEGER,
    output_tokens INTEGER,
    cost_usd DECIMAL(10,4),
    response_time_ms INTEGER,
    success BOOLEAN,
    error_message TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);
 
-- AI usage statistics
SELECT 
    service_type,
    COUNT(*) as requests_count,
    SUM(cost_usd) as total_cost,
    AVG(response_time_ms) as avg_response_time,
    (COUNT(*) FILTER (WHERE success = true) * 100.0 / COUNT(*)) as success_rate
FROM ai_usage_logs
WHERE created_at > NOW() - INTERVAL '24 hours'
GROUP BY service_type
ORDER BY total_cost DESC
TYPE LIST;

Previous topic: ← Blockchain integration
Next topic: Object types →

Related sections: