43 lines
1.4 KiB
PHP
43 lines
1.4 KiB
PHP
<?php
|
|
/**
|
|
* WEVIA Redis LLM — Non-blocking LLM calls via Redis queue
|
|
* Usage: include this file, then call wevia_llm($message, $system_prompt)
|
|
* Returns response in ~5-15s WITHOUT blocking FPM workers
|
|
*/
|
|
function wevia_llm($message, $system = 'Tu es WEVIA, IA souveraine de WEVAL Consulting.', $max_tokens = 1000) {
|
|
$redis = new Redis();
|
|
if (!$redis->connect('127.0.0.1', 6379, 2)) {
|
|
return ['status' => 'error', 'response' => 'Redis connection failed', 'provider' => 'error'];
|
|
}
|
|
|
|
$task_id = uniqid('llm_', true);
|
|
$task = json_encode([
|
|
'id' => $task_id,
|
|
'messages' => [
|
|
['role' => 'system', 'content' => $system],
|
|
['role' => 'user', 'content' => $message]
|
|
],
|
|
'max_tokens' => $max_tokens,
|
|
'ts' => time()
|
|
]);
|
|
|
|
// Push to queue
|
|
$redis->lPush('wevia:llm:queue', $task);
|
|
|
|
// Poll for result (non-blocking sleep, releases CPU)
|
|
$key = "wevia:llm:result:$task_id";
|
|
$max_wait = 20; // seconds
|
|
$start = time();
|
|
|
|
while (time() - $start < $max_wait) {
|
|
$result = $redis->get($key);
|
|
if ($result) {
|
|
$redis->del($key);
|
|
return json_decode($result, true);
|
|
}
|
|
usleep(200000); // 200ms sleep — FPM worker sleeps, doesn't consume CPU
|
|
}
|
|
|
|
return ['status' => 'error', 'response' => 'Timeout waiting for LLM response', 'provider' => 'timeout'];
|
|
}
|