引言

在 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) │ │ (容器级隔离) │ │

│ └─────────────────┘ └─────────────────────────────────┘ │

│ • 进程隔离 • 文件系统隔离 • 网络隔离 • 资源限制 │

└─────────────────────────────────────────────────────────────┘

适配器设计:SkillLiteToolSkillLiteToolkit

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 工具所需的 namedescriptionargs_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 提供了一个安全、高效、开箱即用的解决方案。

项目地址https://github.com/EXboys/skilllite

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐