MORSATIPIK / fable_engine.py
RDS777's picture
Upload fable_engine.py
974902e verified
Raw
History Blame Contribute Delete
3.27 kB
# core/fable_engine.py
"""
Moteur Fable — itérations successives avec auto-amélioration.
Production → Capture → Observation → Correction → Livraison
"""
import time
import logging
from typing import Dict, Any
log = logging.getLogger("vortex.fable")
class FableEngine:
def __init__(self, llm_engine, memory, error_tree):
self.llm = llm_engine
self.memory = memory
self.error_tree = error_tree
async def run(self, task: str, max_iterations: int = 3) -> Dict[str, Any]:
log.info(f"[Fable] Démarrage : {task[:80]}... (max {max_iterations} iter)")
start_time = time.perf_counter()
best_result = None
best_score = 0.0
history = []
current_task = task
for i in range(max_iterations):
log.info(f"[Fable] Itération {i + 1}/{max_iterations}")
try:
resp = await self.llm.call(
agent="fable",
system="Tu es un expert en résolution de problèmes. Améliore ta réponse à chaque itération.",
user=f"Tâche : {current_task}\nPropose une solution détaillée.",
max_tokens=500,
temperature=0.4
)
solution = resp.content if hasattr(resp, "content") else str(resp)
except Exception as e:
log.error(f"[Fable] Erreur itération {i + 1}: {e}")
solution = f"[Erreur] {e}"
try:
self.error_tree.add_error(str(e), f"Fable iter={i+1} task={task[:100]}")
except Exception:
pass
score = min(0.8, len(solution) / 1000) * 0.8 + 0.2
if "code" in solution.lower() or "api" in solution.lower():
score = min(0.95, score + 0.1)
if score > best_score:
best_score = score
best_result = solution
history.append({"iteration": i + 1, "solution": solution[:300], "score": round(score, 3)})
if score >= 0.85:
log.info(f"[Fable] Seuil atteint à l'itération {i+1} ({score:.3f})")
break
current_task = (
f"{current_task}\nVoici une solution précédente :\n{solution[:500]}\n"
f"Améliore-la en corrigeant les éventuelles faiblesses."
)
elapsed = time.perf_counter() - start_time
log.info(f"[Fable] Terminé en {elapsed:.2f}s, meilleur score {best_score:.3f}")
try:
from core.memory import MemoryTier
self.memory.ingest(
f"Fable: {task[:100]}{best_score:.2f} ({len(history)} iter)",
MemoryTier.EPISODIC, "fable",
importance=best_score, confidence=best_score
)
except Exception as e:
log.warning(f"[Fable] Mémorisation échouée: {e}")
return {
"task": task,
"method": "Fable (itératif)",
"iterations": len(history),
"elapsed_s": round(elapsed, 2),
"best_score": round(best_score, 3),
"best_result": best_result[:1500] if best_result else "Aucun résultat",
"history": history
}