Skip to main content

LLM Skill 引擎 — 轻量级 Skill 管理、匹配与执行框架

Project description

skillify

Python 3.10+ MIT License Zero LLM Dependency


为什么需要 skillify?

在构建 LLM 应用时,你通常需要:

  1. 将业务能力封装为 LLM 可调用的 Function Calling Tool
  2. 对用户输入做关键词快匹配,高频指令不浪费 LLM Token
  3. 统一管理参数校验、执行、结果校验的完整链路
  4. 支持配置驱动的 CRUD Skill,不用写 Python 代码

skillify 把这些能力封装为一个独立 SDK,不绑定任何 LLM 提供商,拿来即用。

核心特性

特性 说明
4 种 Skill 模式 Rule(关键词回复)、CRUD(数据管理)、Dispatch(结构化操作)、Subagent(LLM 多轮对话)
Pattern 快通道 关键词匹配延迟 < 1ms,高频指令直接拦截不走 LLM
LLM 意图兜底 快通道未命中时,自动调用 LLM 意图分类匹配
Function Calling 自动将 Skill 转为 OpenAI / Anthropic tool definition 格式
校验框架(Harness) 9 条内置规则 + 自定义扩展,pre/post 两阶段校验
可插拔存储 内存 / SQLite / MCP 边侧存储,一行代码切换
零 LLM 依赖 核心包仅依赖 PyYAML,LLM 客户端由调用方注入
配置驱动 Markdown / YAML / JSON 三种格式,写配置即定义 Skill

安装

pip install skillify

或从源码安装:

git clone https://github.com/ArtLjn/skillify.git
cd skillify
pip install -e .

快速开始

30 秒上手

from skillify import SkillManager, SkillContext

# 1. 初始化 — 扫描 Skill 目录,自动注册
sm = SkillManager(skill_dirs=["./skills"])

# 2. 转为 LLM function calling 格式
tools = sm.to_tool_definitions()  # 直接注入 LLM tools 参数

# 3. 关键词快通道匹配(< 1ms)
match = sm.fast_match("帮我查天气")

# 4. 执行 Skill
ctx = SkillContext(user_id="user_001", timezone="Asia/Shanghai")
result = await sm.execute("weather", {"city": "苏州"}, ctx)
print(result.result.reply)

一站式路由 — handle()

result = await sm.handle("你好", context)

if result.executed:
    # 已自动执行完成(Rule/CRUD/Dispatch)
    print(result.execute_result.result.reply)
elif result.source == HandleSource.SUBAGENT:
    # Subagent 类型,需要上层 handoff 到独立 LLM 循环
    skill = sm.get_skill(result.match.skill_name)
elif result.source == HandleSource.NONE:
    print("未匹配任何 Skill")

路由逻辑:

用户输入 → fast_match() → 命中 Rule/CRUD/Dispatch → FAST(自动执行)
                        → 命中 Subagent          → SUBAGENT(handoff)
                        → 未命中 + 有 LLM        → LLM_INTENT(意图兜底)
                        → 未命中 + 无 LLM        → NONE

Skill 类型一览

模式 适用场景 LLM 调用 延迟 定义方式
Rule 简单指令(快捷回复、问候) 0 < 1ms Markdown 配置
CRUD 数据管理(待办、笔记) 0 < 10ms Markdown 配置
Dispatch 结构化操作(提醒、日历、查询) 0(Skill 侧) < 100ms Markdown + scripts/
Subagent 复杂推理(旅行规划、数据分析) 2~5 次 ~2s Markdown + scripts/
Python 自定义逻辑 自定义 自定义 继承 Skill 基类

Rule 模式 — 关键词回复

---
name: greeting
type: skill
description: 问候回复
triggers:
  - 你好
  - 早上好
rules:
  - pattern: 你好
    response: "你好!有什么可以帮你的吗?"
  - pattern: 早上好
    response: "早上好!新的一天加油"
default: "收到消息"
---

CRUD 模式 — 数据管理

---
name: todo
type: skill
label: 待办事项
description: 待办事项管理。触发词: 待办、任务
fields:
  - title
  - priority
  - due_date
display_format: "{title}({priority},截止 {due_date})"
---
result = await sm.execute("todo", {"action": "create", "title": "买牛奶", "priority": "高"})
result = await sm.execute("todo", {"action": "query"})

Dispatch 模式 — 结构化操作

配置驱动 + scripts/ 下的工具脚本,主 Agent LLM 负责提取参数,Skill 只做执行器:

---
name: local_reminder
type: skill
dispatch: reminder_store
description: 本地提醒管理。触发词: 提醒、闹钟
tools:
  - reminder_store
---

Python Skill — 自定义逻辑

from skillify import Skill, SkillContext, SkillResult, ResultStatus

class WeatherSkill(Skill):
    def name(self) -> str:       return "weather"
    def description(self) -> str: return "查询天气。触发词: 天气"
    def triggers(self) -> list[str]: return ["天气", "气温"]
    def parameters_schema(self) -> dict: return {
        "type": "object",
        "properties": {"city": {"type": "string", "description": "城市名"}},
        "required": ["city"],
    }
    async def execute(self, params: dict, context: SkillContext) -> SkillResult:
        return SkillResult(status=ResultStatus.SUCCESS, reply=f"{params['city']}今天晴,25°C")

# 注册
sm.register_skill(WeatherSkill())

存储系统

一行代码切换存储后端:

from skillify.io.storage import create_storage, StorageType, set_default_factory

# 内存(默认)
sm = SkillManager(skill_dirs=["./skills"])

# SQLite
set_default_factory(lambda name: create_storage(StorageType.SQLITE, prefix=name))
sm = SkillManager(skill_dirs=["./skills"])

# 自定义存储后端 — 实现 StorageBackend 接口即可
class MyStorage(StorageBackend):
    async def create(self, item: dict) -> dict: ...
    async def query(self, filters: dict | None = None) -> list[dict]: ...
    async def get(self, item_id: str) -> dict | None: ...
    async def delete(self, item_id: str) -> dict | None: ...
    async def update(self, item_id: str, updates: dict) -> dict | None: ...

校验框架

内置 9 条校验规则(pre/post 两阶段),可扩展:

from skillify.core.harness import ValidationRule, ValidationResult

class SensitiveWordRule(ValidationRule):
    @property
    def name(self) -> str: return "sensitive_word"

    def validate(self, skill, params, result, context) -> ValidationResult:
        vr = ValidationResult(passed=True)
        if result and "违禁词" in result.reply:
            vr.add_issue(self.name, Severity.ERROR, "回复包含敏感词", "reply")
        return vr

sm.harness.add_rule(SensitiveWordRule())

更多文档

项目结构

skillify/
├── src/skillify/
│   ├── core/          # 核心引擎:匹配、执行、校验、注册
│   ├── io/            # 存储、加载器
│   ├── models/        # 数据模型(schemas)
│   ├── skills/        # Skill 基类、配置驱动 Skill、Subagent
│   └── tools/         # 内置工具
├── skills/            # Skill 配置 + 脚本(示例)
├── tests/             # 测试用例
├── docs/              # 文档
└── scripts/           # 构建脚本

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

skillify-0.1.0.tar.gz (75.1 kB view details)

Uploaded Source

Built Distribution

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

skillify-0.1.0-py3-none-any.whl (58.8 kB view details)

Uploaded Python 3

File details

Details for the file skillify-0.1.0.tar.gz.

File metadata

  • Download URL: skillify-0.1.0.tar.gz
  • Upload date:
  • Size: 75.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for skillify-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bbffa687f7ff32fbdbeded08039475690864a40a79dc1f7b5c24f0535c8ee72a
MD5 51984640655b25f86edb2c51e97cac3b
BLAKE2b-256 397f96de49115161b18f715b0f8147c1c69d1417c534484a5a9c3213ae008b83

See more details on using hashes here.

File details

Details for the file skillify-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: skillify-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 58.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for skillify-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e11d75ba27dbd42882bfccbb3913d05fcc543257e62511761511a3f9a5169dc
MD5 f33b2f0bc12f32e12582980c93661317
BLAKE2b-256 486d8501b699dd2228b6e5a59a5ababf7381725382f1138638fa5cf151a60912

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