feat: LLM switch via MQTT — profils local/cloud synchronisés
- Stocke _config_path dans BaseAgent pour la persistance - Souscription à agents/llm/switch (retained) sur tous les agents - _on_llm_switch : change self.llm.model + persiste dans config.json - _save_config : écrit la config en mémoire dans le fichier JSON Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -80,7 +80,8 @@ class BaseAgent(ABC):
|
|||||||
DEFAULT_CONFIG_PATH: str = "config/config.json"
|
DEFAULT_CONFIG_PATH: str = "config/config.json"
|
||||||
|
|
||||||
def __init__(self, config_path: Optional[str] = None):
|
def __init__(self, config_path: Optional[str] = None):
|
||||||
self.config = self._load_config(config_path or self.DEFAULT_CONFIG_PATH)
|
self._config_path = config_path or self.DEFAULT_CONFIG_PATH
|
||||||
|
self.config = self._load_config(self._config_path)
|
||||||
self.agent_id: str = self.config["agent_id"]
|
self.agent_id: str = self.config["agent_id"]
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
@@ -233,6 +234,7 @@ class BaseAgent(ABC):
|
|||||||
self.mqtt.subscribe_broadcast(self._on_mqtt_broadcast)
|
self.mqtt.subscribe_broadcast(self._on_mqtt_broadcast)
|
||||||
self.mqtt.subscribe_all_capabilities(self._on_capabilities_update)
|
self.mqtt.subscribe_all_capabilities(self._on_capabilities_update)
|
||||||
self.mqtt.subscribe_all_status(self._on_status_update)
|
self.mqtt.subscribe_all_status(self._on_status_update)
|
||||||
|
self.mqtt.subscribe("agents/llm/switch", self._on_llm_switch)
|
||||||
# Souscriptions custom de l'agent
|
# Souscriptions custom de l'agent
|
||||||
self.setup_extra_subscriptions()
|
self.setup_extra_subscriptions()
|
||||||
|
|
||||||
@@ -284,6 +286,36 @@ class BaseAgent(ABC):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug(f"Erreur parsing capabilities: {e}")
|
logger.debug(f"Erreur parsing capabilities: {e}")
|
||||||
|
|
||||||
|
def _on_llm_switch(self, msg: Message | str, topic: str):
|
||||||
|
"""Reçoit un ordre de switch LLM depuis le topic agents/llm/switch."""
|
||||||
|
try:
|
||||||
|
import json as _json
|
||||||
|
raw = msg if isinstance(msg, str) else (msg.payload if isinstance(msg, Message) else str(msg))
|
||||||
|
data = _json.loads(raw)
|
||||||
|
model = data.get("model")
|
||||||
|
profile = data.get("profile", "")
|
||||||
|
if not model:
|
||||||
|
return
|
||||||
|
if self.llm.model == model:
|
||||||
|
return # Déjà sur ce modèle
|
||||||
|
self.llm.model = model
|
||||||
|
self.config["llm"]["model"] = model
|
||||||
|
profiles = self.config.setdefault("llm_profiles", {})
|
||||||
|
if profile:
|
||||||
|
profiles[profile] = model
|
||||||
|
self._save_config()
|
||||||
|
logger.info(f"[LLM] Modèle changé → {model} (profil: {profile or 'direct'})")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"[LLM] Erreur switch: {e}")
|
||||||
|
|
||||||
|
def _save_config(self):
|
||||||
|
"""Persiste la config en mémoire dans le fichier JSON."""
|
||||||
|
try:
|
||||||
|
with open(self._config_path, "w") as f:
|
||||||
|
json.dump(self.config, f, indent=2, ensure_ascii=False)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Erreur sauvegarde config ({self._config_path}): {e}")
|
||||||
|
|
||||||
def _on_status_update(self, msg: Message | str, topic: str):
|
def _on_status_update(self, msg: Message | str, topic: str):
|
||||||
"""Mise à jour du statut d'un agent."""
|
"""Mise à jour du statut d'un agent."""
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user