RSS Git Download  Clone
Raw Blame History 2kB 63 lines
const AI_NETWORK_URL_PROD = 'https://network.corifeus.com'
const AI_NETWORK_URL_DEV = 'http://localhost:8003'

function getNetworkUrl() {
    if (typeof p3xrs.cfg.aiNetworkUrl === 'string' && p3xrs.cfg.aiNetworkUrl.length > 0) {
        return p3xrs.cfg.aiNetworkUrl
    }
    const isDev = process.env.NODE_ENV === 'development'
    return isDev ? AI_NETWORK_URL_DEV : AI_NETWORK_URL_PROD
}

export default async (options) => {
    const { socket, payload } = options

    try {
        const { prompt, context } = payload

        if (!prompt || typeof prompt !== 'string' || prompt.trim().length === 0) {
            throw new Error('AI_PROMPT_REQUIRED')
        }

        const networkUrl = getNetworkUrl()
        console.info('ai-redis-query using network URL:', networkUrl)
        let response
        try {
            response = await fetch(`${networkUrl}/public/ai/redis-query`, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    prompt: prompt.trim(),
                    context: context || {},
                    apiKey: p3xrs.cfg.groqApiKey || undefined,
                }),
            })
        } catch (fetchError) {
            throw new Error('AI service is not reachable')
        }

        const contentType = response.headers.get('content-type') || ''
        if (!contentType.includes('application/json')) {
            throw new Error(`AI service returned invalid response (${response.status})`)
        }

        const data = await response.json()

        if (data.status !== 'ok') {
            throw new Error(data.message || 'AI query failed')
        }

        socket.emit(options.responseEvent, {
            status: 'ok',
            command: data.data.command,
            explanation: data.data.explanation,
        })
    } catch (e) {
        console.error('ai-redis-query error', e)
        socket.emit(options.responseEvent, {
            status: 'error',
            error: e.message,
        })
    }
}