LangChain Sandbox
Project description
🛡️ LangChain Sandbox
A secure environment for running Python code using Pyodide (WebAssembly) and Deno
📋 Overview
LangChain Sandbox provides a secure environment for executing untrusted Python code. It leverages Pyodide (Python compiled to WebAssembly) to run Python code in a sandboxed environment.
✨ Key Features
- 🔒 Security - Isolated execution environment with configurable permissions
- 💻 Local Execution - No remote execution or Docker containers needed
- 🔄 Session Support - Maintain state across multiple code executions
Limitations
- Latency: There is a few seconds of latency when starting the sandbox per run
- File access: Currently not supported. You will not be able to access the files written by the sandbox.
- Network requests: If you need to make network requests please use
httpx.AsyncClientinstead ofrequests.
🚀 Quick Install
-
Install Deno (required): https://docs.deno.com/runtime/getting_started/installation/
-
Install
langchain-sandbox:pip install langchain-sandbox
💡 Example Usage
from langchain_sandbox import PyodideSandbox
# Create a sandbox instance
sandbox = PyodideSandbox(
# Allow Pyodide to install python packages that
# might be required.
allow_net=True,
)
code = """\
import numpy as np
x = np.array([1, 2, 3])
print(x)
"""
# Execute Python code
print(await sandbox.execute(code))
# CodeExecutionResult(
# result=None,
# stdout='[1 2 3]',
# stderr=None,
# status='success',
# execution_time=2.8578367233276367,
# session_metadata={'created': '2025-05-15T21:26:37.204Z', 'lastModified': '2025-05-15T21:26:37.831Z', 'packages': ['numpy']},
# session_bytes=None
# )
Stateful Sandbox
If you want to persist state between code executions (to persist variables, imports,
and definitions, etc.), you can set stateful=True in the sandbox. This will return
session_bytes and session_metadata that you can pass to .execute().
[!warning]
session_bytescontains pickled session state. It should not be unpickled and is only meant to be used by the sandbox itself
sandbox = PyodideSandbox(
# Create stateful sandbox
stateful=True,
# Allow Pyodide to install python packages that
# might be required.
allow_net=True,
)
code = """\
import numpy as np
x = np.array([1, 2, 3])
print(x)
"""
result = await sandbox.execute(code)
# Pass previous result
print(await sandbox.execute("float(x[0])", session_bytes=result.session_bytes, session_metadata=result.session_metadata))
# CodeExecutionResult(
# result=1,
# stdout=None,
# stderr=None,
# status='success',
# execution_time=2.7027177810668945
# session_metadata={'created': '2025-05-15T21:27:57.120Z', 'lastModified': '2025-05-15T21:28:00.061Z', 'packages': ['numpy', 'dill']},
# session_bytes=b'\x80\x04\x95d\x01\x00..."
# )
Using as a tool
You can use PyodideSandbox as a LangChain tool:
from langchain_sandbox import PyodideSandboxTool
tool = PyodideSandboxTool()
result = await tool.ainvoke("print('Hello, world!')")
Using with an agent
You can use sandbox tools inside a LangGraph agent:
from langgraph.prebuilt import create_react_agent
from langchain_sandbox import PyodideSandboxTool
tool = PyodideSandboxTool(
# Allow Pyodide to install python packages that
# might be required.
allow_net=True
)
agent = create_react_agent(
"anthropic:claude-3-7-sonnet-latest",
tools=[tool],
)
result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's 5 + 7?"}]},
)
Stateful Tool
[!important] Stateful
PyodideSandboxToolworks only in LangGraph agents that use the prebuiltcreate_react_agentorToolNode.
If you want to persist state between code executions (to persist variables, imports,
and definitions, etc.), you need to set stateful=True:
from langgraph.prebuilt import create_react_agent
from langgraph.prebuilt.chat_agent_executor import AgentState
from langgraph.checkpoint.memory import InMemorySaver
from langchain_sandbox import PyodideSandboxTool, PyodideSandbox
class State(AgentState):
# important: add session_bytes & session_metadata keys to your graph state schema -
# these keys are required to store the session data between tool invocations.
# `session_bytes` contains pickled session state. It should not be unpickled
# and is only meant to be used by the sandbox itself
session_bytes: bytes
session_metadata: dict
tool = PyodideSandboxTool(
# Create stateful sandbox
stateful=True,
# Allow Pyodide to install python packages that
# might be required.
allow_net=True
)
agent = create_react_agent(
"anthropic:claude-3-7-sonnet-latest",
tools=[tool],
checkpointer=InMemorySaver(),
state_schema=State
)
result = await agent.ainvoke(
{
"messages": [
{"role": "user", "content": "what's 5 + 7? save result as 'a'"}
],
"session_bytes": None,
"session_metadata": None
},
config={"configurable": {"thread_id": "123"}},
)
second_result = await agent.ainvoke(
{"messages": [{"role": "user", "content": "what's the sine of 'a'?"}]},
config={"configurable": {"thread_id": "123"}},
)
See full examples here:
🧩 Components
The sandbox consists of two main components:
pyodide-sandbox-js: JavaScript/TypeScript module using Deno to provide the core sandboxing functionality.sandbox-py: ContainsPyodideSandboxwhich just wraps the JavaScript/TypeScript module and executes it as a subprocess.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file langchain_sandbox-0.0.6.tar.gz.
File metadata
- Download URL: langchain_sandbox-0.0.6.tar.gz
- Upload date:
- Size: 80.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5b0f819e96ea394d66fdcb8508180bf8ba146404ae9a043535ab1a70d004396
|
|
| MD5 |
4a7e2e978dd298e30aebe0561ef57048
|
|
| BLAKE2b-256 |
10a00b654bccd20ef20aeb9365e52223f96732899012776f0decb879523cd7d4
|
File details
Details for the file langchain_sandbox-0.0.6-py3-none-any.whl.
File metadata
- Download URL: langchain_sandbox-0.0.6-py3-none-any.whl
- Upload date:
- Size: 9.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
793fb7ca8eca2e075d49912085dad5453a083789bb8fdb682290f49db36ba2ba
|
|
| MD5 |
b784d6a7fa56b1d7aab7322e8f0c071a
|
|
| BLAKE2b-256 |
bee4503a0939e777ee1cef207d0d32e6b66660447f81bd4f9c7dfb00b5538325
|