Skip to main content

Agent Skill Management System with self-growth capabilities

Project description

Skill Manager

PyPI

Agent Skill Management System with self-growth capabilities.

Published on PyPI: https://pypi.org/project/skillvault/

Features

  • Skill Storage: SQLite + sqlite-vec for local storage with vector search
  • Semantic Query: ANN retrieval + dependency expansion + token budget cropping
  • Self-Growth: Automatically extract knowledge from conversations and tasks
  • Human-in-the-Loop: Review queue for approving/rejecting draft skills
  • Permission Separation: Agent code can only write drafts, humans control canonical
  • CLI Tool: Command-line interface for skill management (optional)

Installation

pip install skillvault

Quick Start

方式 A:配置式(简单)

from skillvault import SkillManager

sm = SkillManager(
    "skills.db",
    embed_config={
        "base_url": "https://api.openai.com/v1",
        "api_key": "sk-...",
        "model": "text-embedding-3-small",
    }
)

# 本地模型也兼容(OpenAI API 格式)
sm = SkillManager(
    "skills.db",
    embed_config={
        "base_url": "http://localhost:8000/v1",
        "api_key": "xxx",
        "model": "bge-m3",
    }
)

方式 B:函数注入(灵活)

from openai import OpenAI
from skillvault import SkillManager

client = OpenAI()

def embed(text: str) -> list[float]:
    resp = client.embeddings.create(model="text-embedding-3-small", input=[text])
    return resp.data[0].embedding

sm = SkillManager("skills.db", embed_fn=embed)

优先级embed_fn > embed_config > None(报错)

embed 要求

  • 维度必须是 1536(sqlite-vec 硬编码)
  • 兼容模型:OpenAI text-embedding-3-smalltext-embedding-ada-002
  • 不兼容:维度非 1536 的模型(如 all-MiniLM-L6-v2 的 384 维)

使用示例

from skillvault import SkillManager
from skillvault.models import Skill, Chunk

sm = SkillManager("skills.db", embed_config={
    "base_url": "https://api.openai.com/v1",
    "api_key": "sk-...",
    "model": "text-embedding-3-small",
})

# Register a skill
skill = Skill(
    id="frontend-react",
    name="Frontend React",
    chunks=[
        Chunk(
            id="frontend-react::hooks",
            skill_id="frontend-react",
            section="React Hooks",
            content="## useEffect\n\nUse useEffect for side effects...",
            tokens=50,
        )
    ]
)
sm.register(skill)

# Query skills
context = sm.query("React hooks best practices", budget=2000)
print(context)

Self-Growth (Extract knowledge from conversations)

llm_fn 定义方式

llm_fn 签名固定:(text: str) -> dict,必须返回 {"has_knowledge": bool},内部用什么 API 自由选择。

import json

# 方式 1:OpenAI
from openai import OpenAI
openai_client = OpenAI(api_key="sk-...")

def llm_fn_openai(text: str) -> dict:
    resp = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": f"Extract knowledge from:\n{text}\n\nReturn JSON: has_knowledge(bool), title, playbook, examples, when_to_use, dependencies(list)"}],
        response_format={"type": "json_object"},
    )
    return json.loads(resp.choices[0].message.content)

# 方式 2:Claude
import anthropic
claude_client = anthropic.Anthropic(api_key="sk-ant-...")

def llm_fn_claude(text: str) -> dict:
    resp = claude_client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[{"role": "user", "content": f"Extract knowledge from:\n{text}\n\nReturn ONLY JSON: {{'has_knowledge': bool, 'title': str, 'playbook': str}}"}],
    )
    return json.loads(resp.content[0].text)

# 方式 3:本地模型 / OpenAI 兼容接口
local_client = OpenAI(base_url="http://localhost:8000/v1", api_key="xxx")

def llm_fn_local(text: str) -> dict:
    resp = local_client.chat.completions.create(
        model="local-model",
        messages=[{"role": "user", "content": f"Extract knowledge from:\n{text}\n\nReturn JSON: has_knowledge(bool), title, playbook"}],
    )
    return json.loads(resp.choices[0].message.content)

使用示例

from skillvault import SkillManager

sm = SkillManager("skills.db", embed_fn=embed, llm_fn=llm_fn_openai)

# Extract from conversation (returns draft_id or None)
draft_id = sm.extract([
    {"role": "user", "content": "How do I handle errors in async Python?"},
    {"role": "assistant", "content": "Use try/except with asyncio.gather..."},
])

# Review and approve
if draft_id:
    pending = sm.review_queue()
    sm.approve(draft_id)

Agent Mode (Restricted permissions)

from skillvault import SkillManager

# Same embed_fn as above
sm = SkillManager("skills.db", embed_fn=embed, mode="agent")

sm.query("...")           # OK - reads canonical skills only
sm.extract(messages)      # OK - creates drafts
sm.register(skill)        # raises PermissionError
sm.approve(draft_id)      # raises PermissionError

CLI Usage

Requires pip install skillvault[cli].

# List skills
python -m skillvault.cli list

# Review queue
python -m skillvault.cli review-queue

# Approve/reject
python -m skillvault.cli approve draft::skill-id
python -m skillvault.cli reject draft::skill-id --reason "Not useful"

# Export/Import
python -m skillvault.cli export frontend-react react.json
python -m skillvault.cli import react.json

# Statistics
python -m skillvault.cli stats

Architecture

SkillManager (one class)
    │
    ├── query(text, budget)        → Search + assemble context
    ├── register(skill)            → Save canonical skill
    ├── extract(context)           → LLM extraction → draft
    ├── approve/reject(skill_id)   → Review workflow
    └── export/import              → JSON serialization
    │
    ├── storage.py    (SQLite + sqlite-vec)
    ├── query.py      (embed + ANN + budget)
    └── growth.py     (LLM analysis + auto-promote)

Development

# Install in dev mode
pip install -e ".[dev,openai,cli]"

# Run tests
pytest

# Format & lint
black src/ tests/
ruff check src/ tests/

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skillvault-0.1.3.tar.gz (37.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skillvault-0.1.3-py3-none-any.whl (19.6 kB view details)

Uploaded Python 3

File details

Details for the file skillvault-0.1.3.tar.gz.

File metadata

  • Download URL: skillvault-0.1.3.tar.gz
  • Upload date:
  • Size: 37.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for skillvault-0.1.3.tar.gz
Algorithm Hash digest
SHA256 abd5d76448b56adcce1502d151d01ee19f6c4024eb00ac20de35a8b2f722e5dd
MD5 6845af281a2b2ca6d2f7d4b9db0e315c
BLAKE2b-256 ae7b0d3245771dd8328711b190c32bd17264c48decb85f037c444b0d7688e707

See more details on using hashes here.

File details

Details for the file skillvault-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: skillvault-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 19.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for skillvault-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 e1625bd9a590c33d6d5d59dd91ea4b503c73fc61f649bedc8d2ea76cbff442da
MD5 386f18ef5beeee3e266274965351e484
BLAKE2b-256 da528cac703d5b1715347d46e789bb2273f0023d5e740976c79a97ca34fd8cb8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page