36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""Exécution des appels IA locale en arrière-plan.
|
|
|
|
L'inférence llama-cpp-python est bloquante et peut prendre plusieurs
|
|
secondes (voire dizaines de secondes pour le premier appel, le temps de
|
|
charger le modèle) — elle ne doit jamais tourner sur le thread Qt
|
|
principal sous peine de geler toute l'interface.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Callable
|
|
|
|
from PySide6.QtCore import QThread, Signal
|
|
|
|
|
|
class AiTaskThread(QThread):
|
|
"""Exécute `fn(*args, **kwargs)` sur un thread dédié et remonte le
|
|
résultat (ou l'erreur) via un signal Qt, thread-safe par construction."""
|
|
|
|
succeeded = Signal(object)
|
|
failed = Signal(str)
|
|
|
|
def __init__(self, fn: Callable, *args, **kwargs) -> None:
|
|
super().__init__()
|
|
self._fn = fn
|
|
self._args = args
|
|
self._kwargs = kwargs
|
|
|
|
def run(self) -> None:
|
|
try:
|
|
result = self._fn(*self._args, **self._kwargs)
|
|
except Exception as exc: # noqa: BLE001 — remonté proprement à l'UI
|
|
self.failed.emit(str(exc))
|
|
else:
|
|
self.succeeded.emit(result)
|