Some checks failed
- Integrate GPU scoring inline into reasoning/multi_path.py (auto-uses GPU when available) - Integrate GPU deduplication into multi_agent/consensus_engine.py - Add semantic_search() method to memory/semantic_graph.py with GPU acceleration - Integrate GPU training into self_improvement/training.py AutoTrainer - Fix all 758 ruff lint issues (whitespace, import sorting, unused imports, ambiguous vars, undefined names) - Fix all 40 mypy type errors across the codebase (no-any-return, union-attr, arg-type, etc.) - Fix deprecated ruff config keys (select/ignore -> [tool.ruff.lint]) - Add .dockerignore to exclude .venv/, tests/, docs/ from Docker builds - Add type hints and docstrings to verification/outcome.py - Fix E402 import ordering in witness_agent.py - Fix F821 undefined names in vector_pgvector.py and native.py - Fix E741 ambiguous variable names in reflective.py and recommender.py All 276 tests pass. 0 ruff errors. 0 mypy errors. Co-Authored-By: Nakamoto, S <defi@defi-oracle.io>
55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
"""Procedural memory: reusable skills/workflows for AGI."""
|
|
|
|
|
|
from fusionagi._logger import logger
|
|
from fusionagi.schemas.skill import Skill
|
|
|
|
|
|
class ProceduralMemory:
|
|
"""
|
|
Skill store: reusable workflows and procedures. Invokable by name;
|
|
write/update rules enforced by caller.
|
|
"""
|
|
|
|
def __init__(self, max_skills: int = 5000) -> None:
|
|
self._skills: dict[str, Skill] = {}
|
|
self._by_name: dict[str, str] = {} # name -> skill_id (latest)
|
|
self._max_skills = max_skills
|
|
|
|
def add_skill(self, skill: Skill) -> None:
|
|
"""Register a skill (overwrites same skill_id)."""
|
|
if len(self._skills) >= self._max_skills and skill.skill_id not in self._skills:
|
|
self._evict_one()
|
|
self._skills[skill.skill_id] = skill
|
|
self._by_name[skill.name] = skill.skill_id
|
|
logger.debug("Procedural memory: skill added", extra={"skill_id": skill.skill_id, "name": skill.name})
|
|
|
|
def get_skill(self, skill_id: str) -> Skill | None:
|
|
"""Return skill by id or None."""
|
|
return self._skills.get(skill_id)
|
|
|
|
def get_skill_by_name(self, name: str) -> Skill | None:
|
|
"""Return latest skill with this name or None."""
|
|
sid = self._by_name.get(name)
|
|
return self._skills.get(sid) if sid else None
|
|
|
|
def list_skills(self, limit: int = 200) -> list[Skill]:
|
|
"""Return skills (e.g. for planner)."""
|
|
return list(self._skills.values())[-limit:]
|
|
|
|
def remove_skill(self, skill_id: str) -> bool:
|
|
"""Remove skill. Returns True if existed."""
|
|
if skill_id not in self._skills:
|
|
return False
|
|
name = self._skills[skill_id].name
|
|
del self._skills[skill_id]
|
|
if self._by_name.get(name) == skill_id:
|
|
del self._by_name[name]
|
|
return True
|
|
|
|
def _evict_one(self) -> None:
|
|
if not self._skills:
|
|
return
|
|
rid = next(iter(self._skills))
|
|
self.remove_skill(rid)
|