Voyager-style skill registry: store, verify, and reuse action sequences.
Skills are looked up by embedding similarity between a query (intent /
situation description) and stored skill descriptions, so an LLM brain can
reuse a proven plan instead of re-deriving it.
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
|