LangChain 集成 SkillLite:为 AI Agent 注入安全沙箱化的技能执行能力
SkillLite是一个轻量级AI Agent技能执行引擎,通过与LangChain集成解决传统Tool开发中的安全性问题。它基于Rust实现系统级安全沙箱(macOS使用Seatbelt,Linux使用Namespace+Seccomp),提供毫秒级冷启动、零依赖的隔离执行环境。相比传统LangChain Tool,SkillLite具备安全隔离、统一技能管理、跨框架复用等优势。集成过程仅需3步
引言
在 AI Agent 的开发实践中,工具调用(Tool Calling) 是连接大语言模型与真实世界的核心桥梁。LangChain 作为最流行的 LLM 应用开发框架,提供了丰富的 Agent 和 Tool 抽象。然而,当 Agent 需要执行用户提供的代码或脚本时,安全性成为了一个不可回避的问题——如何在赋予 Agent 执行能力的同时,防止恶意代码对宿主系统造成破坏?
SkillLite 正是为解决这一问题而生的轻量级 AI Agent 技能执行引擎。它内置了基于 Rust 实现的原生系统级安全沙箱(macOS 使用 Seatbelt,Linux 使用 Namespace + Seccomp),能够在毫秒级冷启动、零外部依赖的条件下,为 Agent 提供安全隔离的代码执行环境。
本文将深入介绍如何将 SkillLite 与 LangChain 集成,使你的 LangChain Agent 获得安全、高效、可扩展的技能执行能力。
为什么需要 SkillLite + LangChain?
在传统的 LangChain Agent 开发中,开发者通常通过继承 BaseTool 来定义工具。这种方式虽然灵活,但存在几个痛点:
-
安全隔离缺失:自定义 Tool 直接在宿主进程中执行,恶意输入可能导致文件泄露、网络攻击或资源耗尽
-
技能管理分散:每个 Tool 都需要单独编码,缺乏统一的技能发现和注册机制
-
跨框架复用困难:为 LangChain 编写的 Tool 无法直接在 LlamaIndex、MCP 等其他框架中使用
SkillLite 通过以下方式解决这些问题:
| 能力 | 传统 LangChain Tool | SkillLite + LangChain |
|------|---------------------|----------------------|
| 安全隔离 | ❌ 无 | ✅ Rust 原生沙箱(进程/文件系统/网络隔离) |
| 技能管理 | 手动编码 | 自动发现、注册、Schema 推断 |
| 跨框架复用 | 仅 LangChain | LangChain / LlamaIndex / MCP / 原生 |
| 冷启动性能 | N/A | ⚡ 毫秒级 |
| LLM 兼容性 | 取决于实现 | 任意 OpenAI 兼容 API |
快速开始
环境准备
# 安装 SkillLite SDK(含 LangChain 适配器)
pip install skilllite[langchain] langchain-openai
# 安装沙箱二进制文件(自动下载预编译版本)
skilllite install
# 验证安装
skilllite status
最简示例:3 步将 SkillLite 技能接入 LangChain Agent
from skilllite import SkillManager
from skilllite.core.adapters.langchain import SkillLiteToolkit
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
# Step 1: 从技能目录创建 LangChain 工具
manager = SkillManager(skills_dir="./.skills")
tools = SkillLiteToolkit.from_manager(manager)
# Step 2: 构建 LangChain Agent
llm = ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant that can use tools."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
agent = create_openai_tools_agent(llm, tools, prompt)
# Step 3: 执行
executor = AgentExecutor.from_agent_and_tools(agent=agent, tools=tools)
result = executor.invoke({"input": "帮我计算 15 * 27"})
print(result["output"])
仅需 3 步,你的 LangChain Agent 就获得了沙箱保护下的技能执行能力。每个技能都在独立进程中运行,文件系统、网络、资源均受到严格限制。
核心架构解析
整体集成架构
┌─────────────────────────────────────────────────────────────┐
│ LangChain Agent │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────────┐ │
│ │ LLM │ │ Prompt │ │ AgentExecutor │ │
│ │(GPT-4等) │ │ Template │ │ (调度循环) │ │
│ └────┬─────┘ └──────────────┘ └───────────┬───────────┘ │
│ │ │ │
│ └──────────── Tool Calls ──────────────┘ │
│ │ │
│ ┌─────────▼─────────┐ │
│ │ SkillLiteTool[] │ ← LangChain BaseTool │
│ │ (适配器层) │ │
│ └─────────┬─────────┘ │
└────────────────────────┼────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ SkillLite SDK │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ SkillManager │ │ SkillRegistry│ │ SecurityScanner │ │
│ │ (技能管理) │ │ (技能注册) │ │ (安全扫描) │ │
│ └──────┬───────┘ └──────────────┘ └──────────────────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ SkillExecutor│ │
│ │ (技能执行器) │ │
│ └──────┬───────┘ │
└─────────┼───────────────────────────────────────────────────┘
│
┌─────────▼───────────────────────────────────────────────────┐
│ SkillBox (Rust 沙箱) │
│ ┌─────────────────┐ ┌─────────────────────────────────┐ │
│ │ macOS: Seatbelt │ │ Linux: Namespace + Seccomp │ │
│ │ (sandbox-exec) │ │ (容器级隔离) │ │
│ └─────────────────┘ └─────────────────────────────────┘ │
│ • 进程隔离 • 文件系统隔离 • 网络隔离 • 资源限制 │
└─────────────────────────────────────────────────────────────┘
适配器设计:SkillLiteTool 与 SkillLiteToolkit
SkillLite 的 LangChain 集成通过两个核心类实现:
SkillLiteTool —— 继承自 LangChain 的 BaseTool,将单个 SkillLite 技能包装为 LangChain 工具:
class SkillLiteTool(BaseTool):
"""LangChain BaseTool adapter for a single SkillLite skill."""
name: str # 工具名称(与技能名一致)
description: str # 工具描述
manager: Any # SkillManager 实例
skill_name: str # 技能名称
allow_network: bool # 是否允许网络访问
timeout: int # 执行超时时间
sandbox_level: int # 沙箱安全级别 (1/2/3)
def _run(self, **kwargs) -> str:
"""同步执行技能"""
result = self.manager.execute(self.skill_name, kwargs)
return result.output if result.success else f"Error: {result.error}"
async def _arun(self, **kwargs) -> str:
"""异步执行技能"""
result = await asyncio.to_thread(self.manager.execute, ...)
return result.output if result.success else f"Error: {result.error}"
SkillLiteToolkit —— 工厂类,批量将 SkillManager 中注册的技能转换为 LangChain 工具:
class SkillLiteToolkit:
@staticmethod
def from_manager(
manager: SkillManager,
skill_names: Optional[List[str]] = None, # 筛选特定技能
allow_network: bool = False, # 网络访问控制
timeout: Optional[int] = None, # 超时设置
sandbox_level: int = 3, # 安全级别
confirmation_callback=None, # 安全确认回调
) -> List[SkillLiteTool]:
...
这种设计的优势在于:
-
零侵入:完全兼容 LangChain 的
BaseTool接口,可与任何 LangChain Agent 无缝配合 -
批量转换:一行代码即可将所有技能转为 LangChain 工具
-
细粒度控制:支持按名称筛选、网络策略、超时、安全级别等配置
安全确认机制:Sandbox Level 3
SkillLite 的一大亮点是其三级沙箱安全模型,在 LangChain 集成中同样得到了完整支持:
| 级别 | 描述 | 适用场景 |
|------|------|---------|
| Level 1 | 无沙箱,直接执行 | 完全可信的技能 |
| Level 2 | 沙箱隔离(文件系统/网络/进程) | 一般技能 |
| Level 3 | 沙箱隔离 + 静态代码安全扫描 | 不可信来源的技能(默认) |
在 Level 3 下,当安全扫描检测到高危操作(如系统命令执行、敏感文件读取)时,适配器会通过 confirmation_callback 请求用户确认:
def security_confirmation(report: str, scan_id: str) -> bool:
"""安全确认回调:展示安全报告,等待用户决策"""
print(report)
return input("是否继续执行?[y/N]: ").lower() == 'y'
tools = SkillLiteToolkit.from_manager(
manager,
sandbox_level=3,
confirmation_callback=security_confirmation
)
安全报告的输出示例:
📋 Security Scan Report (ID: a1b2c3d4)
Found 2 item(s) for review:
🟠 #1 [High] SecurityIssue
├─ Rule: subprocess-execution
├─ Line 15: Detected subprocess call
└─ Code: subprocess.run(["ls", "-la"])
🟡 #2 [Medium] SecurityIssue
├─ Rule: file-system-access
├─ Line 22: Detected file read operation
└─ Code: open("/etc/hosts", "r")
⚠️ High severity issues found. Confirmation required to execute.
这种"扫描 → 报告 → 确认 → 执行"的流程,在保证安全性的同时,不会阻断正常的 Agent 工作流。
进阶用法
与 LangGraph 集成
SkillLite 同样支持与 LangGraph(LangChain 的下一代 Agent 框架)配合使用:
from skilllite import SkillManager
from skilllite.core.adapters.langchain import SkillLiteToolkit
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
manager = SkillManager(skills_dir="./.skills")
# 带安全确认的工具创建
def confirm(report: str, scan_id: str) -> bool:
print(report)
return input("Continue? [y/N]: ").lower() == 'y'
tools = SkillLiteToolkit.from_manager(
manager,
sandbox_level=3,
confirmation_callback=confirm
)
# 使用 LangGraph 的 ReAct Agent
llm = ChatOpenAI(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="your-api-key",
model="qwen3-max",
)
agent = create_react_agent(llm, tools, prompt="你是一个工具执行助手。")
# 异步执行
import asyncio
async def run():
response = await agent.ainvoke({
"messages": [("user", "帮我分析今天的天气")]
})
print(response)
asyncio.run(run())
筛选特定技能
当技能目录中包含大量技能时,可以只暴露特定技能给 Agent:
tools = SkillLiteToolkit.from_manager(
manager,
skill_names=["calculator", "data-analysis"], # 仅加载指定技能
allow_network=True, # 允许网络访问
timeout=60 # 60 秒超时
)
三种集成方式对比
SkillLite 提供了三种与 LangChain 集成的方式,适用于不同场景:
| 方式 | 依赖 | 特点 | 推荐场景 |
|------|------|------|---------|
| SkillLiteToolkit | langchain-core | 官方适配器,一行代码集成 | ✅ 推荐,生产环境 |
| 手动 Agent Loop | 仅 openai | 完全控制,无框架依赖 | 需要深度定制 |
| 内置 AgenticLoop | 仅 openai | SkillLite 自带循环 | 快速原型验证 |
方式一:SkillLiteToolkit(推荐)
from skilllite.core.adapters.langchain import SkillLiteToolkit
tools = SkillLiteToolkit.from_manager(manager)
# 直接用于任何 LangChain Agent
方式二:手动 Agent Loop
# 获取 OpenAI 格式的工具定义
tools_json = [t.to_openai_format() for t in manager.get_tools()]
# 手动调用 LLM 并处理 tool_calls
response = client.chat.completions.create(
model="gpt-4", messages=messages, tools=tools_json
)
# 手动执行技能
result = manager.execute(skill_name, args)
方式三:内置 AgenticLoop
loop = manager.create_agentic_loop(
client=client, model="gpt-4",
system_prompt="You are a helpful assistant.",
max_iterations=10
)
result = loop.run("帮我分析这份数据")
技能(Skill)的编写规范
SkillLite 的技能以目录为单位组织,每个技能包含一个 SKILL.md 元数据文件和对应的脚本:
.skills/
├── calculator/
│ ├── SKILL.md # 技能元数据(名称、描述、输入 Schema)
│ └── scripts/
│ └── calculate.py # 执行脚本
├── data-analysis/
│ ├── SKILL.md
│ └── scripts/
│ └── analyze.py
└── weather/
├── SKILL.md
└── scripts/
└── get_weather.py
SKILL.md 示例:
---
name: calculator
description: A calculator that performs basic arithmetic operations.
compatibility: Requires Python 3.x
license: MIT
metadata:
author: skilllite-team
version: "1.0"
---
## Instructions
This skill performs basic arithmetic calculations.
Accepts JSON input via stdin with fields: operation, a, b.
SkillLite 的 SkillManager 会自动扫描技能目录,解析 SKILL.md 中的元数据,推断输入参数 Schema,并将其转换为 LangChain 工具所需的 name、description 和 args_schema。
与其他 LLM 提供商配合
SkillLite 的 LangChain 集成不绑定特定 LLM,可以与任何 OpenAI 兼容的 API 配合:
# OpenAI GPT-4
llm = ChatOpenAI(model="gpt-4")
# 阿里云通义千问
llm = ChatOpenAI(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="your-key",
model="qwen3-max"
)
# DeepSeek
llm = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
api_key="your-key",
model="deepseek-chat"
)
# 本地 Ollama
llm = ChatOpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama",
model="llama3"
)
无论使用哪个 LLM,SkillLite 的工具定义和执行逻辑完全一致。
总结
通过 SkillLite 与 LangChain 的集成,开发者可以:
-
一行代码将技能目录转换为 LangChain 工具,无需手动编写
BaseTool子类 -
原生沙箱保护确保 Agent 执行的每一段代码都在安全隔离环境中运行
-
三级安全模型提供从无沙箱到安全扫描+人工确认的灵活安全策略
-
毫秒级性能不会拖慢 Agent 的多轮对话和工具调用流程
-
跨框架复用同一套技能可同时服务于 LangChain、LlamaIndex、MCP 等多个框架
如果你正在构建需要执行用户代码或脚本的 LangChain Agent,SkillLite 提供了一个安全、高效、开箱即用的解决方案。
更多推荐



所有评论(0)