# LangSkills

Python SDK for Skills — LangChain 渐进式披露（Progressive Disclosure）工具，按需加载 skill 内容，节省 Token。

## 特性

- **渐进式披露**：启动时仅加载 skill 元信息（name + description），完整内容按需加载
- **节省 Token**：避免一次性注入所有 skill 文档
- **LangChain 原生集成**：开箱即用的 `load_skill` Tool
- **标准格式**：兼容 [Agent Skills](https://agentskills.io/) / Cursor SKILL.md 规范

## 安装
```bash
pip install langskills
```

## 快速开始

### 1. 准备 Skills 目录
```
skills/
├── pdf_parser/
│   └── SKILL.md
└── weather_query/
    └── SKILL.md
```

**SKILL.md 示例**（YAML frontmatter + Markdown）：
```markdown
---
name: Weather Query
description: Get current weather information for any city
version: 1.0
---

Use this skill to fetch real-time weather data.
Call the weather API with city name as parameter.
```

### 2. 集成到 LangChain
```python
import uuid
from langchain.chat_models import init_chat_model
from langskills import SkillsLoader
from langchain.agents import create_agent

# 加载 skills
loader = SkillsLoader.from_directory("./skills")
tools = loader.to_langchain_tools()  # 生成 load_skill tool

# 初始化模型
llm = init_chat_model(
    base_url="https://api.example.com/v1",
    api_key="your-api-key",
    model="Qwen/Qwen3-32B",
    model_provider="openai",
)

# 创建 agent
agent = create_agent(llm, tools=tools)

# 调用
response = agent.invoke(
    {"messages": [{"role": "user", "content": "今天天气如何"}]},
    {"configurable": {"thread_id": str(uuid.uuid4())}},
)

print(response["messages"])
```

### 工作流程

1. Agent 启动时看到 `load_skill` tool（列出所有 skill 名称和描述）
2. 用户提问后，agent 判断需要哪个 skill
3. 调用 `load_skill(skill_name="Weather Query")` 加载完整内容
4. 根据内容执行任务

## API
```python
from langskills import SkillsLoader

loader = SkillsLoader.from_directory("./skills")

# 列出所有 skill 名称
loader.list_skill_names()

# 获取简要信息（仅元数据）
loader.get_skill_summaries()

# 按需加载完整内容
loader.load_skill_content("Weather Query")

# 转为 LangChain tools
tools = loader.to_langchain_tools()
```

## 开发
```bash
# 安装依赖
uv sync

# 运行测试
pytest
```

## 发布
```bash
uv build
twine upload dist/*
```

## License

MIT