Skip to content

simulatecraft.skills

simulatecraft.skills

Voyager-style skill library: named, verified action sequences.

SkillRegistry

SkillRegistry(embedding_backend: EmbeddingBackend | None = None, *, persistence_path: str | Path | None = None, similarity_threshold: float = 0.4)
Source code in src/simulatecraft/skills/registry.py
def __init__(
    self,
    embedding_backend: EmbeddingBackend | None = None,
    *,
    persistence_path: str | Path | None = None,
    similarity_threshold: float = 0.4,
) -> None:
    self.skills: list[Skill] = []
    self.embedding_backend = embedding_backend or HashingEmbedding()
    self.persistence_path = Path(persistence_path) if persistence_path else None
    self.similarity_threshold = similarity_threshold
    if self.persistence_path and self.persistence_path.exists():
        self._load()

verify async

verify(name: str, achieved: bool) -> bool

Mark whether executing the skill achieved its intended effect.

Source code in src/simulatecraft/skills/registry.py
async def verify(self, name: str, achieved: bool) -> bool:
    """Mark whether executing the skill achieved its intended effect."""
    skill = self.get(name)
    if skill is None:
        return False
    skill.verified = bool(achieved)
    skill.record_use(achieved)
    self._save()
    return skill.verified

find

find(query: str, *, require_verified: bool = True) -> Skill | None

Best matching skill above threshold, or None.

Source code in src/simulatecraft/skills/registry.py
def find(self, query: str, *, require_verified: bool = True) -> Skill | None:
    """Best matching skill above threshold, or None."""
    candidates = [s for s in self.skills if s.verified or not require_verified]
    if not candidates:
        return None
    missing = [s for s in candidates if s.embedding is None]
    if missing:
        vectors = self.embedding_backend.embed([s.description for s in missing])
        for skill, vector in zip(missing, vectors, strict=True):
            skill.embedding = vector.tolist()
    query_vec = self.embedding_backend.embed([query])[0]
    best: Skill | None = None
    best_score = -1.0
    for skill in candidates:
        emb = np.asarray(skill.embedding, dtype=np.float32)
        denom = float(np.linalg.norm(query_vec) * np.linalg.norm(emb))
        score = float(np.dot(query_vec, emb) / denom) if denom > 0 else 0.0
        if score > best_score:
            best, best_score = skill, score
    if best is None or best_score < self.similarity_threshold:
        return None
    return best