Python SDK for Sleigh runtime server.
Project description
Sleigh Python SDK
Python SDK for the Sleigh runtime server.
Two client variants are included:
- LangChain Tool variant: one-call
as_langchain_tool()(returnsStructuredTool) - MCP variant: expose runtime APIs as MCP tools over stdio
1. Install
pip install sleigh-sdk
Optional extras:
pip install "sleigh-sdk[langchain]"
pip install "sleigh-sdk[mcp]"
2. Base Python Client
from sleigh_sdk import SleighClient
client = SleighClient(base_url="http://127.0.0.1:10122")
session_token = client.create_session_token()["session_token"]
created = client.create_sandbox(session_token=session_token, image="python:3.11-slim")
sandbox_id = created["sandbox_id"]
3. Ordered Workflow (AI Coding)
Run multiple steps in one request and stop early on failure/timeout:
sandbox_id = created["sandbox_id"]
result = client.run_workflow(
session_token=session_token,
steps=[
{"action": "exec_command", "sandbox_id": sandbox_id, "command": "echo hello", "wait": True, "wait_timeout_seconds": 10},
{"action": "create_snapshot", "sandbox_id": sandbox_id},
{"action": "exec_command", "sandbox_id": sandbox_id, "command": "uname -a", "wait": True},
],
)
print(result["stopped_early"], result["steps"])
Note: in SDK validation, every workflow step must include sandbox_id.
3.1 Exec Completion Webhook Subscription
Subscribe a callback for a specific exec task:
sub = client.subscribe_exec_webhook(
session_token=session_token,
sandbox_id=sandbox_id,
exec_id="exec_xxx",
webhook_url="https://your-domain/webhook/notify/evt_xxx",
)
print(sub)
Server sends a signed POST when exec reaches terminal state.
4. Sandbox Read API (AI Coding)
read_result = client.read_sandbox(
session_token=session_token,
sandbox_id=sandbox_id,
command="rg",
args=["TODO", "/workspace"],
timeout_seconds=10,
max_output_bytes=65536,
max_lines=200,
)
print(read_result)
5. Mount + Environment Copy
List available mount workspace directories first:
dirs = client.list_mount_workspaces(session_token=session_token)
print(dirs["items"])
Mount is now server-enforced read-only:
mount_result = client.mount_path(
session_token=session_token,
sandbox_id=sandbox_id,
workspace_path="/project-a",
container_path="/workspace",
)
print(mount_result)
List available environment directories first:
env_dirs = client.list_environment_workspaces(session_token=session_token)
print(env_dirs["items"])
Copy one allowlisted environment directory into sandbox filesystem (non-mount path, via docker cp):
copy_result = client.copy_environment(
session_token=session_token,
sandbox_id=sandbox_id,
environment_path="/env-a",
sandbox_path="/app",
)
print(copy_result)
6. Code Write API (Sandbox Semantic)
code_write targets:
POST /sandboxes/{id}/ops/code/write- validates sandbox auth and targets file inside sandbox filesystem
sandbox_pathis required and must be an absolute file path in sandbox- service exports target file directory to host temp workspace, applies edit, and syncs back
- quality checks: run
pre-commitwhen config exists; otherwise auto-detect language for fallback checks write_mode=context_editis default for partial edits; pass raw snippets withold_text,new_text, and optionalbefore_context/after_context/occurrencewrite_mode=replace_fileis supported for full overwrite by raw source content- For agent friendliness, LangChain tool also supports explicit actions:
code_write_context_editandcode_write_replace_file
result = client.code_write(
session_token=session_token,
sandbox_id=sandbox_id,
sandbox_path="/app/calculator.py",
write_mode="context_edit",
before_context=" def multiply(self, a, b):\n return a * b\n\n",
old_text=" def multiply(self, a, b):\n return a * b\n",
new_text=" def multiply(self, a, b):\n return a * b\n\n def sqrt(self, a):\n if a < 0:\n raise ValueError('Cannot sqrt negative number!')\n return a ** 0.5\n",
)
# Full overwrite mode (raw source content)
rewrite_result = client.code_write(
session_token=session_token,
sandbox_id=sandbox_id,
sandbox_path="/app/calculator.py",
write_mode="replace_file",
content="print('hello from overwrite mode')\n",
)
7. Low-Memory Guard (Create + Expand)
When host available memory ratio:
< 10%: create/expand is blocked>= 10%and< 15%: create requiresconfirm_low_memory=True; expand proceeds with warning in responsereason
created = client.create_sandbox(
session_token=session_token,
image="python:3.11-slim",
confirm_low_memory=True,
request_timeout_seconds=180,
)
8. More Examples
- LangChain integration:
../README_langchain.md - MCP integration:
../README_mcp.md
9. Session Exec History
list_session_exec_tasks accepts optional session_id.
If omitted, SDK uses session_token as session_id automatically:
history = client.list_session_exec_tasks(
session_token=session_token,
limit=20,
)
print(history)
Project details
Release history Release notifications | RSS feed
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 sleigh_sdk-0.1.25.tar.gz.
File metadata
- Download URL: sleigh_sdk-0.1.25.tar.gz
- Upload date:
- Size: 14.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db3703d3960878f487c86074366a7ddc335eb41b73306003ccd793553bffa1ec
|
|
| MD5 |
199057f9d8655a86b222d33bee001315
|
|
| BLAKE2b-256 |
273d9d242fe80e5ae492e36480a96dcf8747a2e78cf60526264733493193569e
|
File details
Details for the file sleigh_sdk-0.1.25-py3-none-any.whl.
File metadata
- Download URL: sleigh_sdk-0.1.25-py3-none-any.whl
- Upload date:
- Size: 14.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98656c6e9ae739c8d80112bebf85750b8c0c3b3460ae26597b877e63d75a3b9b
|
|
| MD5 |
3c680bb70c8d9c4c6823d24eeae68505
|
|
| BLAKE2b-256 |
22e0e7c0d7cda579d4ca81d097462f81531c67e036e5008bb079fd2c93ec7c92
|