What You’ll Learn
- Defining a
@tool with langchain_core.tools that executes Python in a Declaw sandbox
- Creating a LangGraph ReAct agent with
create_react_agent
- Demo mode that exercises the sandbox tool directly without needing an OpenAI key
Prerequisites
- Declaw instance running and
DECLAW_API_KEY / DECLAW_DOMAIN set
OPENAI_API_KEY (optional — the example runs in demo mode without it)
pip install declaw python-dotenv langgraph langchain-openai
This example is available in Python. TypeScript support coming soon.
Code Walkthrough
Wrap Sandbox.create() in a LangChain @tool. The agent receives the function’s docstring as the tool description, so make it clear:
from langchain_core.tools import tool
from declaw import Sandbox
@tool
def execute_python(code: str) -> str:
"""Execute Python code in a secure Declaw sandbox."""
sbx = Sandbox.create(template="python", timeout=300)
try:
sbx.files.write("/tmp/code.py", code)
result = sbx.commands.run("python3 /tmp/code.py", timeout=30)
return (
f"stdout: {result.stdout}\n"
f"stderr: {result.stderr}\n"
f"exit_code: {result.exit_code}"
)
finally:
sbx.kill()
Each call to execute_python spins up a fresh sandbox, runs the code, and destroys the sandbox. Sandboxes are fully isolated — code from one call cannot affect another.
2. Create a LangGraph ReAct agent
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_react_agent(llm, [execute_python])
3. Run the agent
prompt = "Write Python code to compute the first 10 Fibonacci numbers and print them."
result = agent.invoke({"messages": [("user", prompt)]})
for msg in result["messages"]:
role = getattr(msg, "type", "unknown")
content = getattr(msg, "content", "")
if content:
print(f"\n[{role}] {content}")
The agent will reason about the task, call execute_python with the generated code, receive the sandbox output, and formulate a final answer.
4. Demo mode (no API key needed)
Run the sandbox tool directly without the LangGraph agent:
from declaw import Sandbox
code = """\
a, b = 0, 1
fibs = []
for _ in range(10):
fibs.append(a)
a, b = b, a + b
print("Fibonacci:", fibs)
"""
sbx = Sandbox.create(template="python", timeout=300)
try:
sbx.files.write("/tmp/code.py", code)
result = sbx.commands.run("python3 /tmp/code.py", timeout=30)
print(result.stdout)
finally:
sbx.kill()
Expected Output
In demo mode:
=======================================================
LangGraph + Declaw Sandbox Example
=======================================================
No OPENAI_API_KEY found -- running demo mode.
--- Tool Definition ---
from langchain_core.tools import tool
from declaw import Sandbox
@tool
def execute_python(code: str) -> str:
"""Execute Python code in a secure Declaw sandbox."""
...
--- Running Code Directly in Declaw Sandbox ---
Code:
a, b = 0, 1
fibs = []
...
stdout: Fibonacci: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
stderr:
exit_code: 0
Sandbox cleaned up.
=======================================================
Done!
=======================================================