[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-upstash-upstash-box-py":3,"mdc-azxm15-key":37,"related-repo-upstash-upstash-box-py":2128,"related-org-upstash-upstash-box-py":2228},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"upstash-box-py","build sandboxed environments with Upstash Box","Work with the upstash-box Python SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box in Python, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"upstash","Upstash","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fupstash.png",[12,16,19,22,25],{"name":13,"slug":14,"type":15},"Sandboxing","sandboxing","tag",{"name":17,"slug":18,"type":15},"Python","python",{"name":20,"slug":21,"type":15},"Code Execution","code-execution",{"name":23,"slug":24,"type":15},"Cloud","cloud",{"name":9,"slug":8,"type":15},15,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fskills","2026-06-26T07:48:31.466005",null,2,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Collection of skills for Upstash","https:\u002F\u002Fgithub.com\u002Fupstash\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fupstash-box-py","---\nname: upstash-box-py\ndescription: Work with the upstash-box Python SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box in Python, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.\n---\n\n# upstash-box Python SDK\n\nSandboxed cloud containers with built-in AI agents, shell, filesystem, and git.\n\n## Install & Setup\n\n```bash\npip install upstash-box\n```\n\nSet `UPSTASH_BOX_API_KEY` env var or pass `api_key` to constructors.\n\nThe SDK ships both a synchronous `Box` (used in the examples below) and an\nasynchronous `AsyncBox` (`box = await AsyncBox.create(...)`, `await box.agent.run(...)`).\nThe async surface is identical with `await` and `async for`.\n\n## Box Lifecycle\n\n```python\nimport os\nfrom upstash_box import Box, Agent, ClaudeCode, BoxApiKey\n\n# Create with agent + git + env vars\nbox = Box.create(\n    runtime=\"node\",  # \"node\" | \"python\" | \"golang\" | \"ruby\" | \"rust\"\n    agent={\n        \"harness\": Agent.CLAUDE_CODE,  # Agent.CODEX | Agent.OPEN_CODE\n        \"model\": ClaudeCode.SONNET_4_5,  # or a plain string \"anthropic\u002Fclaude-sonnet-4-5\"\n        # api_key options:\n        #   omit                    → server decides which key to use\n        #   BoxApiKey.UPSTASH_KEY   → use Upstash-provided LLM key\n        #   BoxApiKey.STORED_KEY    → use key previously stored via Upstash Console\n        #   \"sk-...\"                → direct API key string\n        \"api_key\": BoxApiKey.UPSTASH_KEY,\n    },\n    git={  # all fields optional\n        \"token\": os.environ[\"GITHUB_TOKEN\"],  # or link your GitHub account via Upstash Console\n        \"user_name\": \"Bot\",\n        \"user_email\": \"bot@example.com\",\n    },\n    env={\"DATABASE_URL\": \"...\"},\n    skills=[\"upstash\u002Fqstash-js\"],  # GitHub repos as agent skills\n)\n\n# Reconnect, list, delete, pause\u002Fresume\nsame = Box.get(box.id)\nall_boxes = Box.list()\nbox.pause()\nbox.resume()\nbox.delete()  # irreversible\nstatus = box.get_status()[\"status\"]\n```\n\n## Agent Runs\n\n```python\nfrom pydantic import BaseModel\n\n# Structured output with a Pydantic model (or a raw JSON-schema dict)\nclass Finding(BaseModel):\n    severity: str  # \"high\" | \"medium\" | \"low\"\n    file: str\n    issue: str\n\nclass Review(BaseModel):\n    verdict: str  # \"approved\" | \"changes_requested\"\n    findings: list[Finding]\n\nrun = box.agent.run(\n    prompt=\"Review the code for security issues\",\n    response_schema=Review,\n    timeout=120_000,\n    max_retries=2,\n    on_tool_use=lambda tool: print(tool[\"name\"], tool[\"input\"]),\n)\n\nrun.status   # \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"detached\"\nrun.result   # typed from schema (a Review instance)\nrun.cost     # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n\n# Streaming\nstream = box.agent.stream(prompt=\"Build a REST API\")\nfor chunk in stream:\n    print(chunk)\n\n# Fire-and-forget with webhook\nbox.agent.run(\n    prompt=\"Run tests\",\n    webhook={\"url\": \"https:\u002F\u002Fexample.com\u002Fhook\", \"headers\": {\"Authorization\": \"Bearer ...\"}},\n)\n```\n\n## Run Fields\n\nEvery `run` (agent, command, or code) returns a `Run`:\n\n```python\nrun = box.exec.command(\"npm test\")\nrun.id         # run ID\nrun.status     # \"completed\" | \"failed\" | ...\nrun.result     # string output (or typed result with response_schema)\nrun.exit_code  # int | None (None for agent runs)\nrun.cost       # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n\nrun.cancel()          # cancel a running run\nlogs = run.logs()     # [RunLog(timestamp, level, message)]\n```\n\n## Shell Execution\n\n```python\n# Run commands\nrun = box.exec.command(\"echo hello && ls -la\")\n\n# Run code snippets — lang: \"js\" | \"ts\" | \"python\"\nrun2 = box.exec.code(code=\"print(1 + 1)\", lang=\"python\", timeout=10_000)\n\n# Streaming shell\nstream = box.exec.stream(\"npm run build\")\nfor chunk in stream:\n    # chunk: ExecOutputChunk(type=\"output\", data) | ExecExitChunk(type=\"exit\", exit_code, cpu_ns)\n    ...\n```\n\n## Filesystem\n\n```python\nbox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fapp.py\", content=\"print('hi')\")\ncontent = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fapp.py\")\nentries = box.files.list(\"\u002Fworkspace\u002Fhome\")  # [FileEntry(name, path, size, is_dir, mod_time)]\n\n# Binary files — use encoding=\"base64\" for read and write\nbox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fimage.png\", content=base64_string, encoding=\"base64\")\nb64 = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fimage.png\", encoding=\"base64\")\n\n# Upload local files, download box files\nbox.files.upload([{\"path\": \".\u002Flocal\u002Ffile.txt\", \"destination\": \"\u002Fworkspace\u002Fhome\u002Ffile.txt\"}])\nbox.files.download(folder=\".\u002Foutput\")\n```\n\n## cd \u002F Working Directory\n\nThe SDK tracks `cwd` client-side. All operations (exec, files, git, agent) run relative to it.\n\n```python\nbox.cwd  # current working directory (starts at \u002Fworkspace\u002Fhome)\nbox.cd(\"my-repo\")                  # relative to current cwd\nbox.cd(\"\u002Fworkspace\u002Fhome\u002Fother\")    # absolute path\n```\n\n## Git\n\n```python\nbox.git.clone(repo=\"github.com\u002Forg\u002Frepo\", branch=\"main\")\nbox.cd(\"repo\")  # cd into cloned repo\n\nstatus = box.git.status()\ndiff = box.git.diff()\nresult = box.git.commit(message=\"fix: resolve bug\")  # GitCommitResult(sha, message)\nbox.git.push(branch=\"feature\u002Ffix\")\n\nbox.git.checkout(branch=\"release\u002Fv2\")\npr = box.git.create_pr(title=\"Fix bug\", body=\"...\", base=\"main\")\n# pr: PullRequest(url, number, title, base)\n\n# Arbitrary git commands\noutput = box.git.exec(args=[\"log\", \"--oneline\", \"-5\"])\n```\n\n## Snapshots\n\n```python\n# Snapshot — checkpoint workspace state\nsnap = box.snapshot(name=\"after-setup\")\n# snap: Snapshot(id, name, box_id, size_bytes, status, created_at)\n\nrestored = Box.from_snapshot(snap.id)\nsnaps = box.list_snapshots()\nbox.delete_snapshot(snap.id)\n```\n\n## EphemeralBox\n\nLightweight, short-lived boxes (max 3 days). No agent or git. Supports exec, files,\nschedule, cd, network policy, and snapshots only.\n\n```python\nfrom upstash_box import EphemeralBox\n\nebox = EphemeralBox.create(\n    runtime=\"python\",\n    ttl=3600,  # seconds, max 259200 (3 days)\n    env={\"API_KEY\": \"...\"},\n)\n\nebox.expires_at  # unix timestamp when auto-deleted\nebox.exec.command(\"python -c 'print(1+1)'\")\nebox.exec.code(code=\"print('hi')\", lang=\"python\")\nebox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fdata.json\", content=\"{}\")\nebox.cd(\"subdir\")\nebox.delete()\n\n# Restore from snapshot\nebox2 = EphemeralBox.from_snapshot(snap.id, ttl=7200)\n```\n\n## Public URLs\n\nExpose box ports as public URLs with optional auth.\n\n```python\npublic_url = box.get_public_url(3000)\n# public_url: PublicURL(url=\"https:\u002F\u002F{id}-3000.preview.box.upstash.com\", port)\n\nauthed = box.get_public_url(3000, bearer_token=True)\n# authed: PublicURL(url, port, token)\n\nbasic = box.get_public_url(3000, basic_auth=True)\n# basic: PublicURL(url, port, username, password)\n\nresult = box.list_public_urls()  # {\"public_urls\": [PublicURL, ...]}\nbox.delete_public_url(3000)\n```\n\n## MCP Servers\n\nAttach MCP servers to the box agent.\n\n```python\nbox = Box.create(\n    agent={\"harness\": Agent.CLAUDE_CODE, \"model\": ClaudeCode.SONNET_4_5},\n    mcp_servers=[\n        {\"name\": \"fs\", \"package\": \"@modelcontextprotocol\u002Fserver-filesystem\"},\n        {\"name\": \"custom\", \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsse\", \"headers\": {\"Authorization\": \"...\"}},\n    ],\n)\n```\n\n## Async client\n\nThe async client mirrors the sync API exactly — `await` the calls and use `async for` to stream.\n\n```python\nimport asyncio\nfrom upstash_box import AsyncBox, Agent\n\nasync def main():\n    box = await AsyncBox.create(runtime=\"node\", agent={\"harness\": Agent.CLAUDE_CODE})\n    run = await box.agent.run(prompt=\"Set up a Next.js project\")\n    print(run.result)\n\n    stream = await box.agent.stream(prompt=\"Build a REST API\")\n    async for chunk in stream:\n        print(chunk)\n\n    await box.delete()\n\nasyncio.run(main())\n```\n\n`asyncio.gather` over many `AsyncBox.create(...)` \u002F `box.agent.run(...)` calls runs boxes in parallel.\n\n## Gotchas\n\n- Public API option keys are **snake_case** in Python: `api_key`, `user_name`, `network_policy`, `response_schema`, `max_retries`, `on_tool_use`, and agent `options` like `max_turns`, `max_budget_usd`.\n- Agent config takes **`harness`** (not the deprecated `provider`\u002F`runner`) — `harness` is required.\n- `response_schema` accepts a Pydantic `BaseModel` subclass (returns a typed instance) or a raw JSON-schema `dict` (returns a `dict`).\n- Default working directory is `\u002Fworkspace\u002Fhome`, not `\u002Fhome` or `\u002F`.\n- `box.cd()` is client-side tracking — it validates the path exists but doesn't change the box's shell cwd. All SDK methods use it automatically.\n- `EphemeralBox` does NOT support `agent` or `git` — use full `Box` for those.\n- `run.exit_code` is `None` for agent runs, only available for exec commands.\n- `box.delete()` is irreversible — snapshot first if you need the state.\n- Git operations require `git.token` in the box config for private repos and PRs.\n- `Box.from_snapshot()` creates a new box — it does not modify the original.\n- Close the transport when done: `box.delete()` closes it, or use `with box:` \u002F `box.close()` (`async with` \u002F `await box.aclose()` for `AsyncBox`).\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,64,99,120,173,179,471,477,750,756,777,855,861,953,959,1052,1058,1071,1102,1108,1224,1230,1292,1298,1303,1442,1448,1453,1545,1551,1556,1617,1623,1642,1765,1792,1798,2122],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"upstash-box-python-sdk",[48],{"type":49,"value":50},"text","upstash-box Python SDK",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Sandboxed cloud containers with built-in AI agents, shell, filesystem, and git.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"install-setup",[62],{"type":49,"value":63},"Install & Setup",{"type":43,"tag":65,"props":66,"children":71},"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pip install upstash-box\n","bash","",[72],{"type":43,"tag":73,"props":74,"children":75},"code",{"__ignoreMap":70},[76],{"type":43,"tag":77,"props":78,"children":81},"span",{"class":79,"line":80},"line",1,[82,88,94],{"type":43,"tag":77,"props":83,"children":85},{"style":84},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[86],{"type":49,"value":87},"pip",{"type":43,"tag":77,"props":89,"children":91},{"style":90},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[92],{"type":49,"value":93}," install",{"type":43,"tag":77,"props":95,"children":96},{"style":90},[97],{"type":49,"value":98}," upstash-box\n",{"type":43,"tag":52,"props":100,"children":101},{},[102,104,110,112,118],{"type":49,"value":103},"Set ",{"type":43,"tag":73,"props":105,"children":107},{"className":106},[],[108],{"type":49,"value":109},"UPSTASH_BOX_API_KEY",{"type":49,"value":111}," env var or pass ",{"type":43,"tag":73,"props":113,"children":115},{"className":114},[],[116],{"type":49,"value":117},"api_key",{"type":49,"value":119}," to constructors.",{"type":43,"tag":52,"props":121,"children":122},{},[123,125,131,133,139,141,147,149,155,157,163,165,171],{"type":49,"value":124},"The SDK ships both a synchronous ",{"type":43,"tag":73,"props":126,"children":128},{"className":127},[],[129],{"type":49,"value":130},"Box",{"type":49,"value":132}," (used in the examples below) and an\nasynchronous ",{"type":43,"tag":73,"props":134,"children":136},{"className":135},[],[137],{"type":49,"value":138},"AsyncBox",{"type":49,"value":140}," (",{"type":43,"tag":73,"props":142,"children":144},{"className":143},[],[145],{"type":49,"value":146},"box = await AsyncBox.create(...)",{"type":49,"value":148},", ",{"type":43,"tag":73,"props":150,"children":152},{"className":151},[],[153],{"type":49,"value":154},"await box.agent.run(...)",{"type":49,"value":156},").\nThe async surface is identical with ",{"type":43,"tag":73,"props":158,"children":160},{"className":159},[],[161],{"type":49,"value":162},"await",{"type":49,"value":164}," and ",{"type":43,"tag":73,"props":166,"children":168},{"className":167},[],[169],{"type":49,"value":170},"async for",{"type":49,"value":172},".",{"type":43,"tag":58,"props":174,"children":176},{"id":175},"box-lifecycle",[177],{"type":49,"value":178},"Box Lifecycle",{"type":43,"tag":65,"props":180,"children":183},{"className":181,"code":182,"language":18,"meta":70,"style":70},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import os\nfrom upstash_box import Box, Agent, ClaudeCode, BoxApiKey\n\n# Create with agent + git + env vars\nbox = Box.create(\n    runtime=\"node\",  # \"node\" | \"python\" | \"golang\" | \"ruby\" | \"rust\"\n    agent={\n        \"harness\": Agent.CLAUDE_CODE,  # Agent.CODEX | Agent.OPEN_CODE\n        \"model\": ClaudeCode.SONNET_4_5,  # or a plain string \"anthropic\u002Fclaude-sonnet-4-5\"\n        # api_key options:\n        #   omit                    → server decides which key to use\n        #   BoxApiKey.UPSTASH_KEY   → use Upstash-provided LLM key\n        #   BoxApiKey.STORED_KEY    → use key previously stored via Upstash Console\n        #   \"sk-...\"                → direct API key string\n        \"api_key\": BoxApiKey.UPSTASH_KEY,\n    },\n    git={  # all fields optional\n        \"token\": os.environ[\"GITHUB_TOKEN\"],  # or link your GitHub account via Upstash Console\n        \"user_name\": \"Bot\",\n        \"user_email\": \"bot@example.com\",\n    },\n    env={\"DATABASE_URL\": \"...\"},\n    skills=[\"upstash\u002Fqstash-js\"],  # GitHub repos as agent skills\n)\n\n# Reconnect, list, delete, pause\u002Fresume\nsame = Box.get(box.id)\nall_boxes = Box.list()\nbox.pause()\nbox.resume()\nbox.delete()  # irreversible\nstatus = box.get_status()[\"status\"]\n",[184],{"type":43,"tag":73,"props":185,"children":186},{"__ignoreMap":70},[187,195,203,213,222,231,240,249,258,267,276,285,294,303,312,320,329,338,347,356,365,373,382,391,400,408,417,426,435,444,453,462],{"type":43,"tag":77,"props":188,"children":189},{"class":79,"line":80},[190],{"type":43,"tag":77,"props":191,"children":192},{},[193],{"type":49,"value":194},"import os\n",{"type":43,"tag":77,"props":196,"children":197},{"class":79,"line":30},[198],{"type":43,"tag":77,"props":199,"children":200},{},[201],{"type":49,"value":202},"from upstash_box import Box, Agent, ClaudeCode, BoxApiKey\n",{"type":43,"tag":77,"props":204,"children":206},{"class":79,"line":205},3,[207],{"type":43,"tag":77,"props":208,"children":210},{"emptyLinePlaceholder":209},true,[211],{"type":49,"value":212},"\n",{"type":43,"tag":77,"props":214,"children":216},{"class":79,"line":215},4,[217],{"type":43,"tag":77,"props":218,"children":219},{},[220],{"type":49,"value":221},"# Create with agent + git + env vars\n",{"type":43,"tag":77,"props":223,"children":225},{"class":79,"line":224},5,[226],{"type":43,"tag":77,"props":227,"children":228},{},[229],{"type":49,"value":230},"box = Box.create(\n",{"type":43,"tag":77,"props":232,"children":234},{"class":79,"line":233},6,[235],{"type":43,"tag":77,"props":236,"children":237},{},[238],{"type":49,"value":239},"    runtime=\"node\",  # \"node\" | \"python\" | \"golang\" | \"ruby\" | \"rust\"\n",{"type":43,"tag":77,"props":241,"children":243},{"class":79,"line":242},7,[244],{"type":43,"tag":77,"props":245,"children":246},{},[247],{"type":49,"value":248},"    agent={\n",{"type":43,"tag":77,"props":250,"children":252},{"class":79,"line":251},8,[253],{"type":43,"tag":77,"props":254,"children":255},{},[256],{"type":49,"value":257},"        \"harness\": Agent.CLAUDE_CODE,  # Agent.CODEX | Agent.OPEN_CODE\n",{"type":43,"tag":77,"props":259,"children":261},{"class":79,"line":260},9,[262],{"type":43,"tag":77,"props":263,"children":264},{},[265],{"type":49,"value":266},"        \"model\": ClaudeCode.SONNET_4_5,  # or a plain string \"anthropic\u002Fclaude-sonnet-4-5\"\n",{"type":43,"tag":77,"props":268,"children":270},{"class":79,"line":269},10,[271],{"type":43,"tag":77,"props":272,"children":273},{},[274],{"type":49,"value":275},"        # api_key options:\n",{"type":43,"tag":77,"props":277,"children":279},{"class":79,"line":278},11,[280],{"type":43,"tag":77,"props":281,"children":282},{},[283],{"type":49,"value":284},"        #   omit                    → server decides which key to use\n",{"type":43,"tag":77,"props":286,"children":288},{"class":79,"line":287},12,[289],{"type":43,"tag":77,"props":290,"children":291},{},[292],{"type":49,"value":293},"        #   BoxApiKey.UPSTASH_KEY   → use Upstash-provided LLM key\n",{"type":43,"tag":77,"props":295,"children":297},{"class":79,"line":296},13,[298],{"type":43,"tag":77,"props":299,"children":300},{},[301],{"type":49,"value":302},"        #   BoxApiKey.STORED_KEY    → use key previously stored via Upstash Console\n",{"type":43,"tag":77,"props":304,"children":306},{"class":79,"line":305},14,[307],{"type":43,"tag":77,"props":308,"children":309},{},[310],{"type":49,"value":311},"        #   \"sk-...\"                → direct API key string\n",{"type":43,"tag":77,"props":313,"children":314},{"class":79,"line":26},[315],{"type":43,"tag":77,"props":316,"children":317},{},[318],{"type":49,"value":319},"        \"api_key\": BoxApiKey.UPSTASH_KEY,\n",{"type":43,"tag":77,"props":321,"children":323},{"class":79,"line":322},16,[324],{"type":43,"tag":77,"props":325,"children":326},{},[327],{"type":49,"value":328},"    },\n",{"type":43,"tag":77,"props":330,"children":332},{"class":79,"line":331},17,[333],{"type":43,"tag":77,"props":334,"children":335},{},[336],{"type":49,"value":337},"    git={  # all fields optional\n",{"type":43,"tag":77,"props":339,"children":341},{"class":79,"line":340},18,[342],{"type":43,"tag":77,"props":343,"children":344},{},[345],{"type":49,"value":346},"        \"token\": os.environ[\"GITHUB_TOKEN\"],  # or link your GitHub account via Upstash Console\n",{"type":43,"tag":77,"props":348,"children":350},{"class":79,"line":349},19,[351],{"type":43,"tag":77,"props":352,"children":353},{},[354],{"type":49,"value":355},"        \"user_name\": \"Bot\",\n",{"type":43,"tag":77,"props":357,"children":359},{"class":79,"line":358},20,[360],{"type":43,"tag":77,"props":361,"children":362},{},[363],{"type":49,"value":364},"        \"user_email\": \"bot@example.com\",\n",{"type":43,"tag":77,"props":366,"children":368},{"class":79,"line":367},21,[369],{"type":43,"tag":77,"props":370,"children":371},{},[372],{"type":49,"value":328},{"type":43,"tag":77,"props":374,"children":376},{"class":79,"line":375},22,[377],{"type":43,"tag":77,"props":378,"children":379},{},[380],{"type":49,"value":381},"    env={\"DATABASE_URL\": \"...\"},\n",{"type":43,"tag":77,"props":383,"children":385},{"class":79,"line":384},23,[386],{"type":43,"tag":77,"props":387,"children":388},{},[389],{"type":49,"value":390},"    skills=[\"upstash\u002Fqstash-js\"],  # GitHub repos as agent skills\n",{"type":43,"tag":77,"props":392,"children":394},{"class":79,"line":393},24,[395],{"type":43,"tag":77,"props":396,"children":397},{},[398],{"type":49,"value":399},")\n",{"type":43,"tag":77,"props":401,"children":403},{"class":79,"line":402},25,[404],{"type":43,"tag":77,"props":405,"children":406},{"emptyLinePlaceholder":209},[407],{"type":49,"value":212},{"type":43,"tag":77,"props":409,"children":411},{"class":79,"line":410},26,[412],{"type":43,"tag":77,"props":413,"children":414},{},[415],{"type":49,"value":416},"# Reconnect, list, delete, pause\u002Fresume\n",{"type":43,"tag":77,"props":418,"children":420},{"class":79,"line":419},27,[421],{"type":43,"tag":77,"props":422,"children":423},{},[424],{"type":49,"value":425},"same = Box.get(box.id)\n",{"type":43,"tag":77,"props":427,"children":429},{"class":79,"line":428},28,[430],{"type":43,"tag":77,"props":431,"children":432},{},[433],{"type":49,"value":434},"all_boxes = Box.list()\n",{"type":43,"tag":77,"props":436,"children":438},{"class":79,"line":437},29,[439],{"type":43,"tag":77,"props":440,"children":441},{},[442],{"type":49,"value":443},"box.pause()\n",{"type":43,"tag":77,"props":445,"children":447},{"class":79,"line":446},30,[448],{"type":43,"tag":77,"props":449,"children":450},{},[451],{"type":49,"value":452},"box.resume()\n",{"type":43,"tag":77,"props":454,"children":456},{"class":79,"line":455},31,[457],{"type":43,"tag":77,"props":458,"children":459},{},[460],{"type":49,"value":461},"box.delete()  # irreversible\n",{"type":43,"tag":77,"props":463,"children":465},{"class":79,"line":464},32,[466],{"type":43,"tag":77,"props":467,"children":468},{},[469],{"type":49,"value":470},"status = box.get_status()[\"status\"]\n",{"type":43,"tag":58,"props":472,"children":474},{"id":473},"agent-runs",[475],{"type":49,"value":476},"Agent Runs",{"type":43,"tag":65,"props":478,"children":480},{"className":181,"code":479,"language":18,"meta":70,"style":70},"from pydantic import BaseModel\n\n# Structured output with a Pydantic model (or a raw JSON-schema dict)\nclass Finding(BaseModel):\n    severity: str  # \"high\" | \"medium\" | \"low\"\n    file: str\n    issue: str\n\nclass Review(BaseModel):\n    verdict: str  # \"approved\" | \"changes_requested\"\n    findings: list[Finding]\n\nrun = box.agent.run(\n    prompt=\"Review the code for security issues\",\n    response_schema=Review,\n    timeout=120_000,\n    max_retries=2,\n    on_tool_use=lambda tool: print(tool[\"name\"], tool[\"input\"]),\n)\n\nrun.status   # \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"detached\"\nrun.result   # typed from schema (a Review instance)\nrun.cost     # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n\n# Streaming\nstream = box.agent.stream(prompt=\"Build a REST API\")\nfor chunk in stream:\n    print(chunk)\n\n# Fire-and-forget with webhook\nbox.agent.run(\n    prompt=\"Run tests\",\n    webhook={\"url\": \"https:\u002F\u002Fexample.com\u002Fhook\", \"headers\": {\"Authorization\": \"Bearer ...\"}},\n)\n",[481],{"type":43,"tag":73,"props":482,"children":483},{"__ignoreMap":70},[484,492,499,507,515,523,531,539,546,554,562,570,577,585,593,601,609,617,625,632,639,647,655,663,670,678,686,694,702,709,717,725,733,742],{"type":43,"tag":77,"props":485,"children":486},{"class":79,"line":80},[487],{"type":43,"tag":77,"props":488,"children":489},{},[490],{"type":49,"value":491},"from pydantic import BaseModel\n",{"type":43,"tag":77,"props":493,"children":494},{"class":79,"line":30},[495],{"type":43,"tag":77,"props":496,"children":497},{"emptyLinePlaceholder":209},[498],{"type":49,"value":212},{"type":43,"tag":77,"props":500,"children":501},{"class":79,"line":205},[502],{"type":43,"tag":77,"props":503,"children":504},{},[505],{"type":49,"value":506},"# Structured output with a Pydantic model (or a raw JSON-schema dict)\n",{"type":43,"tag":77,"props":508,"children":509},{"class":79,"line":215},[510],{"type":43,"tag":77,"props":511,"children":512},{},[513],{"type":49,"value":514},"class Finding(BaseModel):\n",{"type":43,"tag":77,"props":516,"children":517},{"class":79,"line":224},[518],{"type":43,"tag":77,"props":519,"children":520},{},[521],{"type":49,"value":522},"    severity: str  # \"high\" | \"medium\" | \"low\"\n",{"type":43,"tag":77,"props":524,"children":525},{"class":79,"line":233},[526],{"type":43,"tag":77,"props":527,"children":528},{},[529],{"type":49,"value":530},"    file: str\n",{"type":43,"tag":77,"props":532,"children":533},{"class":79,"line":242},[534],{"type":43,"tag":77,"props":535,"children":536},{},[537],{"type":49,"value":538},"    issue: str\n",{"type":43,"tag":77,"props":540,"children":541},{"class":79,"line":251},[542],{"type":43,"tag":77,"props":543,"children":544},{"emptyLinePlaceholder":209},[545],{"type":49,"value":212},{"type":43,"tag":77,"props":547,"children":548},{"class":79,"line":260},[549],{"type":43,"tag":77,"props":550,"children":551},{},[552],{"type":49,"value":553},"class Review(BaseModel):\n",{"type":43,"tag":77,"props":555,"children":556},{"class":79,"line":269},[557],{"type":43,"tag":77,"props":558,"children":559},{},[560],{"type":49,"value":561},"    verdict: str  # \"approved\" | \"changes_requested\"\n",{"type":43,"tag":77,"props":563,"children":564},{"class":79,"line":278},[565],{"type":43,"tag":77,"props":566,"children":567},{},[568],{"type":49,"value":569},"    findings: list[Finding]\n",{"type":43,"tag":77,"props":571,"children":572},{"class":79,"line":287},[573],{"type":43,"tag":77,"props":574,"children":575},{"emptyLinePlaceholder":209},[576],{"type":49,"value":212},{"type":43,"tag":77,"props":578,"children":579},{"class":79,"line":296},[580],{"type":43,"tag":77,"props":581,"children":582},{},[583],{"type":49,"value":584},"run = box.agent.run(\n",{"type":43,"tag":77,"props":586,"children":587},{"class":79,"line":305},[588],{"type":43,"tag":77,"props":589,"children":590},{},[591],{"type":49,"value":592},"    prompt=\"Review the code for security issues\",\n",{"type":43,"tag":77,"props":594,"children":595},{"class":79,"line":26},[596],{"type":43,"tag":77,"props":597,"children":598},{},[599],{"type":49,"value":600},"    response_schema=Review,\n",{"type":43,"tag":77,"props":602,"children":603},{"class":79,"line":322},[604],{"type":43,"tag":77,"props":605,"children":606},{},[607],{"type":49,"value":608},"    timeout=120_000,\n",{"type":43,"tag":77,"props":610,"children":611},{"class":79,"line":331},[612],{"type":43,"tag":77,"props":613,"children":614},{},[615],{"type":49,"value":616},"    max_retries=2,\n",{"type":43,"tag":77,"props":618,"children":619},{"class":79,"line":340},[620],{"type":43,"tag":77,"props":621,"children":622},{},[623],{"type":49,"value":624},"    on_tool_use=lambda tool: print(tool[\"name\"], tool[\"input\"]),\n",{"type":43,"tag":77,"props":626,"children":627},{"class":79,"line":349},[628],{"type":43,"tag":77,"props":629,"children":630},{},[631],{"type":49,"value":399},{"type":43,"tag":77,"props":633,"children":634},{"class":79,"line":358},[635],{"type":43,"tag":77,"props":636,"children":637},{"emptyLinePlaceholder":209},[638],{"type":49,"value":212},{"type":43,"tag":77,"props":640,"children":641},{"class":79,"line":367},[642],{"type":43,"tag":77,"props":643,"children":644},{},[645],{"type":49,"value":646},"run.status   # \"running\" | \"completed\" | \"failed\" | \"cancelled\" | \"detached\"\n",{"type":43,"tag":77,"props":648,"children":649},{"class":79,"line":375},[650],{"type":43,"tag":77,"props":651,"children":652},{},[653],{"type":49,"value":654},"run.result   # typed from schema (a Review instance)\n",{"type":43,"tag":77,"props":656,"children":657},{"class":79,"line":384},[658],{"type":43,"tag":77,"props":659,"children":660},{},[661],{"type":49,"value":662},"run.cost     # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n",{"type":43,"tag":77,"props":664,"children":665},{"class":79,"line":393},[666],{"type":43,"tag":77,"props":667,"children":668},{"emptyLinePlaceholder":209},[669],{"type":49,"value":212},{"type":43,"tag":77,"props":671,"children":672},{"class":79,"line":402},[673],{"type":43,"tag":77,"props":674,"children":675},{},[676],{"type":49,"value":677},"# Streaming\n",{"type":43,"tag":77,"props":679,"children":680},{"class":79,"line":410},[681],{"type":43,"tag":77,"props":682,"children":683},{},[684],{"type":49,"value":685},"stream = box.agent.stream(prompt=\"Build a REST API\")\n",{"type":43,"tag":77,"props":687,"children":688},{"class":79,"line":419},[689],{"type":43,"tag":77,"props":690,"children":691},{},[692],{"type":49,"value":693},"for chunk in stream:\n",{"type":43,"tag":77,"props":695,"children":696},{"class":79,"line":428},[697],{"type":43,"tag":77,"props":698,"children":699},{},[700],{"type":49,"value":701},"    print(chunk)\n",{"type":43,"tag":77,"props":703,"children":704},{"class":79,"line":437},[705],{"type":43,"tag":77,"props":706,"children":707},{"emptyLinePlaceholder":209},[708],{"type":49,"value":212},{"type":43,"tag":77,"props":710,"children":711},{"class":79,"line":446},[712],{"type":43,"tag":77,"props":713,"children":714},{},[715],{"type":49,"value":716},"# Fire-and-forget with webhook\n",{"type":43,"tag":77,"props":718,"children":719},{"class":79,"line":455},[720],{"type":43,"tag":77,"props":721,"children":722},{},[723],{"type":49,"value":724},"box.agent.run(\n",{"type":43,"tag":77,"props":726,"children":727},{"class":79,"line":464},[728],{"type":43,"tag":77,"props":729,"children":730},{},[731],{"type":49,"value":732},"    prompt=\"Run tests\",\n",{"type":43,"tag":77,"props":734,"children":736},{"class":79,"line":735},33,[737],{"type":43,"tag":77,"props":738,"children":739},{},[740],{"type":49,"value":741},"    webhook={\"url\": \"https:\u002F\u002Fexample.com\u002Fhook\", \"headers\": {\"Authorization\": \"Bearer ...\"}},\n",{"type":43,"tag":77,"props":743,"children":745},{"class":79,"line":744},34,[746],{"type":43,"tag":77,"props":747,"children":748},{},[749],{"type":49,"value":399},{"type":43,"tag":58,"props":751,"children":753},{"id":752},"run-fields",[754],{"type":49,"value":755},"Run Fields",{"type":43,"tag":52,"props":757,"children":758},{},[759,761,767,769,775],{"type":49,"value":760},"Every ",{"type":43,"tag":73,"props":762,"children":764},{"className":763},[],[765],{"type":49,"value":766},"run",{"type":49,"value":768}," (agent, command, or code) returns a ",{"type":43,"tag":73,"props":770,"children":772},{"className":771},[],[773],{"type":49,"value":774},"Run",{"type":49,"value":776},":",{"type":43,"tag":65,"props":778,"children":780},{"className":181,"code":779,"language":18,"meta":70,"style":70},"run = box.exec.command(\"npm test\")\nrun.id         # run ID\nrun.status     # \"completed\" | \"failed\" | ...\nrun.result     # string output (or typed result with response_schema)\nrun.exit_code  # int | None (None for agent runs)\nrun.cost       # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n\nrun.cancel()          # cancel a running run\nlogs = run.logs()     # [RunLog(timestamp, level, message)]\n",[781],{"type":43,"tag":73,"props":782,"children":783},{"__ignoreMap":70},[784,792,800,808,816,824,832,839,847],{"type":43,"tag":77,"props":785,"children":786},{"class":79,"line":80},[787],{"type":43,"tag":77,"props":788,"children":789},{},[790],{"type":49,"value":791},"run = box.exec.command(\"npm test\")\n",{"type":43,"tag":77,"props":793,"children":794},{"class":79,"line":30},[795],{"type":43,"tag":77,"props":796,"children":797},{},[798],{"type":49,"value":799},"run.id         # run ID\n",{"type":43,"tag":77,"props":801,"children":802},{"class":79,"line":205},[803],{"type":43,"tag":77,"props":804,"children":805},{},[806],{"type":49,"value":807},"run.status     # \"completed\" | \"failed\" | ...\n",{"type":43,"tag":77,"props":809,"children":810},{"class":79,"line":215},[811],{"type":43,"tag":77,"props":812,"children":813},{},[814],{"type":49,"value":815},"run.result     # string output (or typed result with response_schema)\n",{"type":43,"tag":77,"props":817,"children":818},{"class":79,"line":224},[819],{"type":43,"tag":77,"props":820,"children":821},{},[822],{"type":49,"value":823},"run.exit_code  # int | None (None for agent runs)\n",{"type":43,"tag":77,"props":825,"children":826},{"class":79,"line":233},[827],{"type":43,"tag":77,"props":828,"children":829},{},[830],{"type":49,"value":831},"run.cost       # RunCost(input_tokens, output_tokens, compute_ms, total_usd)\n",{"type":43,"tag":77,"props":833,"children":834},{"class":79,"line":242},[835],{"type":43,"tag":77,"props":836,"children":837},{"emptyLinePlaceholder":209},[838],{"type":49,"value":212},{"type":43,"tag":77,"props":840,"children":841},{"class":79,"line":251},[842],{"type":43,"tag":77,"props":843,"children":844},{},[845],{"type":49,"value":846},"run.cancel()          # cancel a running run\n",{"type":43,"tag":77,"props":848,"children":849},{"class":79,"line":260},[850],{"type":43,"tag":77,"props":851,"children":852},{},[853],{"type":49,"value":854},"logs = run.logs()     # [RunLog(timestamp, level, message)]\n",{"type":43,"tag":58,"props":856,"children":858},{"id":857},"shell-execution",[859],{"type":49,"value":860},"Shell Execution",{"type":43,"tag":65,"props":862,"children":864},{"className":181,"code":863,"language":18,"meta":70,"style":70},"# Run commands\nrun = box.exec.command(\"echo hello && ls -la\")\n\n# Run code snippets — lang: \"js\" | \"ts\" | \"python\"\nrun2 = box.exec.code(code=\"print(1 + 1)\", lang=\"python\", timeout=10_000)\n\n# Streaming shell\nstream = box.exec.stream(\"npm run build\")\nfor chunk in stream:\n    # chunk: ExecOutputChunk(type=\"output\", data) | ExecExitChunk(type=\"exit\", exit_code, cpu_ns)\n    ...\n",[865],{"type":43,"tag":73,"props":866,"children":867},{"__ignoreMap":70},[868,876,884,891,899,907,914,922,930,937,945],{"type":43,"tag":77,"props":869,"children":870},{"class":79,"line":80},[871],{"type":43,"tag":77,"props":872,"children":873},{},[874],{"type":49,"value":875},"# Run commands\n",{"type":43,"tag":77,"props":877,"children":878},{"class":79,"line":30},[879],{"type":43,"tag":77,"props":880,"children":881},{},[882],{"type":49,"value":883},"run = box.exec.command(\"echo hello && ls -la\")\n",{"type":43,"tag":77,"props":885,"children":886},{"class":79,"line":205},[887],{"type":43,"tag":77,"props":888,"children":889},{"emptyLinePlaceholder":209},[890],{"type":49,"value":212},{"type":43,"tag":77,"props":892,"children":893},{"class":79,"line":215},[894],{"type":43,"tag":77,"props":895,"children":896},{},[897],{"type":49,"value":898},"# Run code snippets — lang: \"js\" | \"ts\" | \"python\"\n",{"type":43,"tag":77,"props":900,"children":901},{"class":79,"line":224},[902],{"type":43,"tag":77,"props":903,"children":904},{},[905],{"type":49,"value":906},"run2 = box.exec.code(code=\"print(1 + 1)\", lang=\"python\", timeout=10_000)\n",{"type":43,"tag":77,"props":908,"children":909},{"class":79,"line":233},[910],{"type":43,"tag":77,"props":911,"children":912},{"emptyLinePlaceholder":209},[913],{"type":49,"value":212},{"type":43,"tag":77,"props":915,"children":916},{"class":79,"line":242},[917],{"type":43,"tag":77,"props":918,"children":919},{},[920],{"type":49,"value":921},"# Streaming shell\n",{"type":43,"tag":77,"props":923,"children":924},{"class":79,"line":251},[925],{"type":43,"tag":77,"props":926,"children":927},{},[928],{"type":49,"value":929},"stream = box.exec.stream(\"npm run build\")\n",{"type":43,"tag":77,"props":931,"children":932},{"class":79,"line":260},[933],{"type":43,"tag":77,"props":934,"children":935},{},[936],{"type":49,"value":693},{"type":43,"tag":77,"props":938,"children":939},{"class":79,"line":269},[940],{"type":43,"tag":77,"props":941,"children":942},{},[943],{"type":49,"value":944},"    # chunk: ExecOutputChunk(type=\"output\", data) | ExecExitChunk(type=\"exit\", exit_code, cpu_ns)\n",{"type":43,"tag":77,"props":946,"children":947},{"class":79,"line":278},[948],{"type":43,"tag":77,"props":949,"children":950},{},[951],{"type":49,"value":952},"    ...\n",{"type":43,"tag":58,"props":954,"children":956},{"id":955},"filesystem",[957],{"type":49,"value":958},"Filesystem",{"type":43,"tag":65,"props":960,"children":962},{"className":181,"code":961,"language":18,"meta":70,"style":70},"box.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fapp.py\", content=\"print('hi')\")\ncontent = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fapp.py\")\nentries = box.files.list(\"\u002Fworkspace\u002Fhome\")  # [FileEntry(name, path, size, is_dir, mod_time)]\n\n# Binary files — use encoding=\"base64\" for read and write\nbox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fimage.png\", content=base64_string, encoding=\"base64\")\nb64 = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fimage.png\", encoding=\"base64\")\n\n# Upload local files, download box files\nbox.files.upload([{\"path\": \".\u002Flocal\u002Ffile.txt\", \"destination\": \"\u002Fworkspace\u002Fhome\u002Ffile.txt\"}])\nbox.files.download(folder=\".\u002Foutput\")\n",[963],{"type":43,"tag":73,"props":964,"children":965},{"__ignoreMap":70},[966,974,982,990,997,1005,1013,1021,1028,1036,1044],{"type":43,"tag":77,"props":967,"children":968},{"class":79,"line":80},[969],{"type":43,"tag":77,"props":970,"children":971},{},[972],{"type":49,"value":973},"box.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fapp.py\", content=\"print('hi')\")\n",{"type":43,"tag":77,"props":975,"children":976},{"class":79,"line":30},[977],{"type":43,"tag":77,"props":978,"children":979},{},[980],{"type":49,"value":981},"content = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fapp.py\")\n",{"type":43,"tag":77,"props":983,"children":984},{"class":79,"line":205},[985],{"type":43,"tag":77,"props":986,"children":987},{},[988],{"type":49,"value":989},"entries = box.files.list(\"\u002Fworkspace\u002Fhome\")  # [FileEntry(name, path, size, is_dir, mod_time)]\n",{"type":43,"tag":77,"props":991,"children":992},{"class":79,"line":215},[993],{"type":43,"tag":77,"props":994,"children":995},{"emptyLinePlaceholder":209},[996],{"type":49,"value":212},{"type":43,"tag":77,"props":998,"children":999},{"class":79,"line":224},[1000],{"type":43,"tag":77,"props":1001,"children":1002},{},[1003],{"type":49,"value":1004},"# Binary files — use encoding=\"base64\" for read and write\n",{"type":43,"tag":77,"props":1006,"children":1007},{"class":79,"line":233},[1008],{"type":43,"tag":77,"props":1009,"children":1010},{},[1011],{"type":49,"value":1012},"box.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fimage.png\", content=base64_string, encoding=\"base64\")\n",{"type":43,"tag":77,"props":1014,"children":1015},{"class":79,"line":242},[1016],{"type":43,"tag":77,"props":1017,"children":1018},{},[1019],{"type":49,"value":1020},"b64 = box.files.read(\"\u002Fworkspace\u002Fhome\u002Fimage.png\", encoding=\"base64\")\n",{"type":43,"tag":77,"props":1022,"children":1023},{"class":79,"line":251},[1024],{"type":43,"tag":77,"props":1025,"children":1026},{"emptyLinePlaceholder":209},[1027],{"type":49,"value":212},{"type":43,"tag":77,"props":1029,"children":1030},{"class":79,"line":260},[1031],{"type":43,"tag":77,"props":1032,"children":1033},{},[1034],{"type":49,"value":1035},"# Upload local files, download box files\n",{"type":43,"tag":77,"props":1037,"children":1038},{"class":79,"line":269},[1039],{"type":43,"tag":77,"props":1040,"children":1041},{},[1042],{"type":49,"value":1043},"box.files.upload([{\"path\": \".\u002Flocal\u002Ffile.txt\", \"destination\": \"\u002Fworkspace\u002Fhome\u002Ffile.txt\"}])\n",{"type":43,"tag":77,"props":1045,"children":1046},{"class":79,"line":278},[1047],{"type":43,"tag":77,"props":1048,"children":1049},{},[1050],{"type":49,"value":1051},"box.files.download(folder=\".\u002Foutput\")\n",{"type":43,"tag":58,"props":1053,"children":1055},{"id":1054},"cd-working-directory",[1056],{"type":49,"value":1057},"cd \u002F Working Directory",{"type":43,"tag":52,"props":1059,"children":1060},{},[1061,1063,1069],{"type":49,"value":1062},"The SDK tracks ",{"type":43,"tag":73,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":49,"value":1068},"cwd",{"type":49,"value":1070}," client-side. All operations (exec, files, git, agent) run relative to it.",{"type":43,"tag":65,"props":1072,"children":1074},{"className":181,"code":1073,"language":18,"meta":70,"style":70},"box.cwd  # current working directory (starts at \u002Fworkspace\u002Fhome)\nbox.cd(\"my-repo\")                  # relative to current cwd\nbox.cd(\"\u002Fworkspace\u002Fhome\u002Fother\")    # absolute path\n",[1075],{"type":43,"tag":73,"props":1076,"children":1077},{"__ignoreMap":70},[1078,1086,1094],{"type":43,"tag":77,"props":1079,"children":1080},{"class":79,"line":80},[1081],{"type":43,"tag":77,"props":1082,"children":1083},{},[1084],{"type":49,"value":1085},"box.cwd  # current working directory (starts at \u002Fworkspace\u002Fhome)\n",{"type":43,"tag":77,"props":1087,"children":1088},{"class":79,"line":30},[1089],{"type":43,"tag":77,"props":1090,"children":1091},{},[1092],{"type":49,"value":1093},"box.cd(\"my-repo\")                  # relative to current cwd\n",{"type":43,"tag":77,"props":1095,"children":1096},{"class":79,"line":205},[1097],{"type":43,"tag":77,"props":1098,"children":1099},{},[1100],{"type":49,"value":1101},"box.cd(\"\u002Fworkspace\u002Fhome\u002Fother\")    # absolute path\n",{"type":43,"tag":58,"props":1103,"children":1105},{"id":1104},"git",[1106],{"type":49,"value":1107},"Git",{"type":43,"tag":65,"props":1109,"children":1111},{"className":181,"code":1110,"language":18,"meta":70,"style":70},"box.git.clone(repo=\"github.com\u002Forg\u002Frepo\", branch=\"main\")\nbox.cd(\"repo\")  # cd into cloned repo\n\nstatus = box.git.status()\ndiff = box.git.diff()\nresult = box.git.commit(message=\"fix: resolve bug\")  # GitCommitResult(sha, message)\nbox.git.push(branch=\"feature\u002Ffix\")\n\nbox.git.checkout(branch=\"release\u002Fv2\")\npr = box.git.create_pr(title=\"Fix bug\", body=\"...\", base=\"main\")\n# pr: PullRequest(url, number, title, base)\n\n# Arbitrary git commands\noutput = box.git.exec(args=[\"log\", \"--oneline\", \"-5\"])\n",[1112],{"type":43,"tag":73,"props":1113,"children":1114},{"__ignoreMap":70},[1115,1123,1131,1138,1146,1154,1162,1170,1177,1185,1193,1201,1208,1216],{"type":43,"tag":77,"props":1116,"children":1117},{"class":79,"line":80},[1118],{"type":43,"tag":77,"props":1119,"children":1120},{},[1121],{"type":49,"value":1122},"box.git.clone(repo=\"github.com\u002Forg\u002Frepo\", branch=\"main\")\n",{"type":43,"tag":77,"props":1124,"children":1125},{"class":79,"line":30},[1126],{"type":43,"tag":77,"props":1127,"children":1128},{},[1129],{"type":49,"value":1130},"box.cd(\"repo\")  # cd into cloned repo\n",{"type":43,"tag":77,"props":1132,"children":1133},{"class":79,"line":205},[1134],{"type":43,"tag":77,"props":1135,"children":1136},{"emptyLinePlaceholder":209},[1137],{"type":49,"value":212},{"type":43,"tag":77,"props":1139,"children":1140},{"class":79,"line":215},[1141],{"type":43,"tag":77,"props":1142,"children":1143},{},[1144],{"type":49,"value":1145},"status = box.git.status()\n",{"type":43,"tag":77,"props":1147,"children":1148},{"class":79,"line":224},[1149],{"type":43,"tag":77,"props":1150,"children":1151},{},[1152],{"type":49,"value":1153},"diff = box.git.diff()\n",{"type":43,"tag":77,"props":1155,"children":1156},{"class":79,"line":233},[1157],{"type":43,"tag":77,"props":1158,"children":1159},{},[1160],{"type":49,"value":1161},"result = box.git.commit(message=\"fix: resolve bug\")  # GitCommitResult(sha, message)\n",{"type":43,"tag":77,"props":1163,"children":1164},{"class":79,"line":242},[1165],{"type":43,"tag":77,"props":1166,"children":1167},{},[1168],{"type":49,"value":1169},"box.git.push(branch=\"feature\u002Ffix\")\n",{"type":43,"tag":77,"props":1171,"children":1172},{"class":79,"line":251},[1173],{"type":43,"tag":77,"props":1174,"children":1175},{"emptyLinePlaceholder":209},[1176],{"type":49,"value":212},{"type":43,"tag":77,"props":1178,"children":1179},{"class":79,"line":260},[1180],{"type":43,"tag":77,"props":1181,"children":1182},{},[1183],{"type":49,"value":1184},"box.git.checkout(branch=\"release\u002Fv2\")\n",{"type":43,"tag":77,"props":1186,"children":1187},{"class":79,"line":269},[1188],{"type":43,"tag":77,"props":1189,"children":1190},{},[1191],{"type":49,"value":1192},"pr = box.git.create_pr(title=\"Fix bug\", body=\"...\", base=\"main\")\n",{"type":43,"tag":77,"props":1194,"children":1195},{"class":79,"line":278},[1196],{"type":43,"tag":77,"props":1197,"children":1198},{},[1199],{"type":49,"value":1200},"# pr: PullRequest(url, number, title, base)\n",{"type":43,"tag":77,"props":1202,"children":1203},{"class":79,"line":287},[1204],{"type":43,"tag":77,"props":1205,"children":1206},{"emptyLinePlaceholder":209},[1207],{"type":49,"value":212},{"type":43,"tag":77,"props":1209,"children":1210},{"class":79,"line":296},[1211],{"type":43,"tag":77,"props":1212,"children":1213},{},[1214],{"type":49,"value":1215},"# Arbitrary git commands\n",{"type":43,"tag":77,"props":1217,"children":1218},{"class":79,"line":305},[1219],{"type":43,"tag":77,"props":1220,"children":1221},{},[1222],{"type":49,"value":1223},"output = box.git.exec(args=[\"log\", \"--oneline\", \"-5\"])\n",{"type":43,"tag":58,"props":1225,"children":1227},{"id":1226},"snapshots",[1228],{"type":49,"value":1229},"Snapshots",{"type":43,"tag":65,"props":1231,"children":1233},{"className":181,"code":1232,"language":18,"meta":70,"style":70},"# Snapshot — checkpoint workspace state\nsnap = box.snapshot(name=\"after-setup\")\n# snap: Snapshot(id, name, box_id, size_bytes, status, created_at)\n\nrestored = Box.from_snapshot(snap.id)\nsnaps = box.list_snapshots()\nbox.delete_snapshot(snap.id)\n",[1234],{"type":43,"tag":73,"props":1235,"children":1236},{"__ignoreMap":70},[1237,1245,1253,1261,1268,1276,1284],{"type":43,"tag":77,"props":1238,"children":1239},{"class":79,"line":80},[1240],{"type":43,"tag":77,"props":1241,"children":1242},{},[1243],{"type":49,"value":1244},"# Snapshot — checkpoint workspace state\n",{"type":43,"tag":77,"props":1246,"children":1247},{"class":79,"line":30},[1248],{"type":43,"tag":77,"props":1249,"children":1250},{},[1251],{"type":49,"value":1252},"snap = box.snapshot(name=\"after-setup\")\n",{"type":43,"tag":77,"props":1254,"children":1255},{"class":79,"line":205},[1256],{"type":43,"tag":77,"props":1257,"children":1258},{},[1259],{"type":49,"value":1260},"# snap: Snapshot(id, name, box_id, size_bytes, status, created_at)\n",{"type":43,"tag":77,"props":1262,"children":1263},{"class":79,"line":215},[1264],{"type":43,"tag":77,"props":1265,"children":1266},{"emptyLinePlaceholder":209},[1267],{"type":49,"value":212},{"type":43,"tag":77,"props":1269,"children":1270},{"class":79,"line":224},[1271],{"type":43,"tag":77,"props":1272,"children":1273},{},[1274],{"type":49,"value":1275},"restored = Box.from_snapshot(snap.id)\n",{"type":43,"tag":77,"props":1277,"children":1278},{"class":79,"line":233},[1279],{"type":43,"tag":77,"props":1280,"children":1281},{},[1282],{"type":49,"value":1283},"snaps = box.list_snapshots()\n",{"type":43,"tag":77,"props":1285,"children":1286},{"class":79,"line":242},[1287],{"type":43,"tag":77,"props":1288,"children":1289},{},[1290],{"type":49,"value":1291},"box.delete_snapshot(snap.id)\n",{"type":43,"tag":58,"props":1293,"children":1295},{"id":1294},"ephemeralbox",[1296],{"type":49,"value":1297},"EphemeralBox",{"type":43,"tag":52,"props":1299,"children":1300},{},[1301],{"type":49,"value":1302},"Lightweight, short-lived boxes (max 3 days). No agent or git. Supports exec, files,\nschedule, cd, network policy, and snapshots only.",{"type":43,"tag":65,"props":1304,"children":1306},{"className":181,"code":1305,"language":18,"meta":70,"style":70},"from upstash_box import EphemeralBox\n\nebox = EphemeralBox.create(\n    runtime=\"python\",\n    ttl=3600,  # seconds, max 259200 (3 days)\n    env={\"API_KEY\": \"...\"},\n)\n\nebox.expires_at  # unix timestamp when auto-deleted\nebox.exec.command(\"python -c 'print(1+1)'\")\nebox.exec.code(code=\"print('hi')\", lang=\"python\")\nebox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fdata.json\", content=\"{}\")\nebox.cd(\"subdir\")\nebox.delete()\n\n# Restore from snapshot\nebox2 = EphemeralBox.from_snapshot(snap.id, ttl=7200)\n",[1307],{"type":43,"tag":73,"props":1308,"children":1309},{"__ignoreMap":70},[1310,1318,1325,1333,1341,1349,1357,1364,1371,1379,1387,1395,1403,1411,1419,1426,1434],{"type":43,"tag":77,"props":1311,"children":1312},{"class":79,"line":80},[1313],{"type":43,"tag":77,"props":1314,"children":1315},{},[1316],{"type":49,"value":1317},"from upstash_box import EphemeralBox\n",{"type":43,"tag":77,"props":1319,"children":1320},{"class":79,"line":30},[1321],{"type":43,"tag":77,"props":1322,"children":1323},{"emptyLinePlaceholder":209},[1324],{"type":49,"value":212},{"type":43,"tag":77,"props":1326,"children":1327},{"class":79,"line":205},[1328],{"type":43,"tag":77,"props":1329,"children":1330},{},[1331],{"type":49,"value":1332},"ebox = EphemeralBox.create(\n",{"type":43,"tag":77,"props":1334,"children":1335},{"class":79,"line":215},[1336],{"type":43,"tag":77,"props":1337,"children":1338},{},[1339],{"type":49,"value":1340},"    runtime=\"python\",\n",{"type":43,"tag":77,"props":1342,"children":1343},{"class":79,"line":224},[1344],{"type":43,"tag":77,"props":1345,"children":1346},{},[1347],{"type":49,"value":1348},"    ttl=3600,  # seconds, max 259200 (3 days)\n",{"type":43,"tag":77,"props":1350,"children":1351},{"class":79,"line":233},[1352],{"type":43,"tag":77,"props":1353,"children":1354},{},[1355],{"type":49,"value":1356},"    env={\"API_KEY\": \"...\"},\n",{"type":43,"tag":77,"props":1358,"children":1359},{"class":79,"line":242},[1360],{"type":43,"tag":77,"props":1361,"children":1362},{},[1363],{"type":49,"value":399},{"type":43,"tag":77,"props":1365,"children":1366},{"class":79,"line":251},[1367],{"type":43,"tag":77,"props":1368,"children":1369},{"emptyLinePlaceholder":209},[1370],{"type":49,"value":212},{"type":43,"tag":77,"props":1372,"children":1373},{"class":79,"line":260},[1374],{"type":43,"tag":77,"props":1375,"children":1376},{},[1377],{"type":49,"value":1378},"ebox.expires_at  # unix timestamp when auto-deleted\n",{"type":43,"tag":77,"props":1380,"children":1381},{"class":79,"line":269},[1382],{"type":43,"tag":77,"props":1383,"children":1384},{},[1385],{"type":49,"value":1386},"ebox.exec.command(\"python -c 'print(1+1)'\")\n",{"type":43,"tag":77,"props":1388,"children":1389},{"class":79,"line":278},[1390],{"type":43,"tag":77,"props":1391,"children":1392},{},[1393],{"type":49,"value":1394},"ebox.exec.code(code=\"print('hi')\", lang=\"python\")\n",{"type":43,"tag":77,"props":1396,"children":1397},{"class":79,"line":287},[1398],{"type":43,"tag":77,"props":1399,"children":1400},{},[1401],{"type":49,"value":1402},"ebox.files.write(path=\"\u002Fworkspace\u002Fhome\u002Fdata.json\", content=\"{}\")\n",{"type":43,"tag":77,"props":1404,"children":1405},{"class":79,"line":296},[1406],{"type":43,"tag":77,"props":1407,"children":1408},{},[1409],{"type":49,"value":1410},"ebox.cd(\"subdir\")\n",{"type":43,"tag":77,"props":1412,"children":1413},{"class":79,"line":305},[1414],{"type":43,"tag":77,"props":1415,"children":1416},{},[1417],{"type":49,"value":1418},"ebox.delete()\n",{"type":43,"tag":77,"props":1420,"children":1421},{"class":79,"line":26},[1422],{"type":43,"tag":77,"props":1423,"children":1424},{"emptyLinePlaceholder":209},[1425],{"type":49,"value":212},{"type":43,"tag":77,"props":1427,"children":1428},{"class":79,"line":322},[1429],{"type":43,"tag":77,"props":1430,"children":1431},{},[1432],{"type":49,"value":1433},"# Restore from snapshot\n",{"type":43,"tag":77,"props":1435,"children":1436},{"class":79,"line":331},[1437],{"type":43,"tag":77,"props":1438,"children":1439},{},[1440],{"type":49,"value":1441},"ebox2 = EphemeralBox.from_snapshot(snap.id, ttl=7200)\n",{"type":43,"tag":58,"props":1443,"children":1445},{"id":1444},"public-urls",[1446],{"type":49,"value":1447},"Public URLs",{"type":43,"tag":52,"props":1449,"children":1450},{},[1451],{"type":49,"value":1452},"Expose box ports as public URLs with optional auth.",{"type":43,"tag":65,"props":1454,"children":1456},{"className":181,"code":1455,"language":18,"meta":70,"style":70},"public_url = box.get_public_url(3000)\n# public_url: PublicURL(url=\"https:\u002F\u002F{id}-3000.preview.box.upstash.com\", port)\n\nauthed = box.get_public_url(3000, bearer_token=True)\n# authed: PublicURL(url, port, token)\n\nbasic = box.get_public_url(3000, basic_auth=True)\n# basic: PublicURL(url, port, username, password)\n\nresult = box.list_public_urls()  # {\"public_urls\": [PublicURL, ...]}\nbox.delete_public_url(3000)\n",[1457],{"type":43,"tag":73,"props":1458,"children":1459},{"__ignoreMap":70},[1460,1468,1476,1483,1491,1499,1506,1514,1522,1529,1537],{"type":43,"tag":77,"props":1461,"children":1462},{"class":79,"line":80},[1463],{"type":43,"tag":77,"props":1464,"children":1465},{},[1466],{"type":49,"value":1467},"public_url = box.get_public_url(3000)\n",{"type":43,"tag":77,"props":1469,"children":1470},{"class":79,"line":30},[1471],{"type":43,"tag":77,"props":1472,"children":1473},{},[1474],{"type":49,"value":1475},"# public_url: PublicURL(url=\"https:\u002F\u002F{id}-3000.preview.box.upstash.com\", port)\n",{"type":43,"tag":77,"props":1477,"children":1478},{"class":79,"line":205},[1479],{"type":43,"tag":77,"props":1480,"children":1481},{"emptyLinePlaceholder":209},[1482],{"type":49,"value":212},{"type":43,"tag":77,"props":1484,"children":1485},{"class":79,"line":215},[1486],{"type":43,"tag":77,"props":1487,"children":1488},{},[1489],{"type":49,"value":1490},"authed = box.get_public_url(3000, bearer_token=True)\n",{"type":43,"tag":77,"props":1492,"children":1493},{"class":79,"line":224},[1494],{"type":43,"tag":77,"props":1495,"children":1496},{},[1497],{"type":49,"value":1498},"# authed: PublicURL(url, port, token)\n",{"type":43,"tag":77,"props":1500,"children":1501},{"class":79,"line":233},[1502],{"type":43,"tag":77,"props":1503,"children":1504},{"emptyLinePlaceholder":209},[1505],{"type":49,"value":212},{"type":43,"tag":77,"props":1507,"children":1508},{"class":79,"line":242},[1509],{"type":43,"tag":77,"props":1510,"children":1511},{},[1512],{"type":49,"value":1513},"basic = box.get_public_url(3000, basic_auth=True)\n",{"type":43,"tag":77,"props":1515,"children":1516},{"class":79,"line":251},[1517],{"type":43,"tag":77,"props":1518,"children":1519},{},[1520],{"type":49,"value":1521},"# basic: PublicURL(url, port, username, password)\n",{"type":43,"tag":77,"props":1523,"children":1524},{"class":79,"line":260},[1525],{"type":43,"tag":77,"props":1526,"children":1527},{"emptyLinePlaceholder":209},[1528],{"type":49,"value":212},{"type":43,"tag":77,"props":1530,"children":1531},{"class":79,"line":269},[1532],{"type":43,"tag":77,"props":1533,"children":1534},{},[1535],{"type":49,"value":1536},"result = box.list_public_urls()  # {\"public_urls\": [PublicURL, ...]}\n",{"type":43,"tag":77,"props":1538,"children":1539},{"class":79,"line":278},[1540],{"type":43,"tag":77,"props":1541,"children":1542},{},[1543],{"type":49,"value":1544},"box.delete_public_url(3000)\n",{"type":43,"tag":58,"props":1546,"children":1548},{"id":1547},"mcp-servers",[1549],{"type":49,"value":1550},"MCP Servers",{"type":43,"tag":52,"props":1552,"children":1553},{},[1554],{"type":49,"value":1555},"Attach MCP servers to the box agent.",{"type":43,"tag":65,"props":1557,"children":1559},{"className":181,"code":1558,"language":18,"meta":70,"style":70},"box = Box.create(\n    agent={\"harness\": Agent.CLAUDE_CODE, \"model\": ClaudeCode.SONNET_4_5},\n    mcp_servers=[\n        {\"name\": \"fs\", \"package\": \"@modelcontextprotocol\u002Fserver-filesystem\"},\n        {\"name\": \"custom\", \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsse\", \"headers\": {\"Authorization\": \"...\"}},\n    ],\n)\n",[1560],{"type":43,"tag":73,"props":1561,"children":1562},{"__ignoreMap":70},[1563,1570,1578,1586,1594,1602,1610],{"type":43,"tag":77,"props":1564,"children":1565},{"class":79,"line":80},[1566],{"type":43,"tag":77,"props":1567,"children":1568},{},[1569],{"type":49,"value":230},{"type":43,"tag":77,"props":1571,"children":1572},{"class":79,"line":30},[1573],{"type":43,"tag":77,"props":1574,"children":1575},{},[1576],{"type":49,"value":1577},"    agent={\"harness\": Agent.CLAUDE_CODE, \"model\": ClaudeCode.SONNET_4_5},\n",{"type":43,"tag":77,"props":1579,"children":1580},{"class":79,"line":205},[1581],{"type":43,"tag":77,"props":1582,"children":1583},{},[1584],{"type":49,"value":1585},"    mcp_servers=[\n",{"type":43,"tag":77,"props":1587,"children":1588},{"class":79,"line":215},[1589],{"type":43,"tag":77,"props":1590,"children":1591},{},[1592],{"type":49,"value":1593},"        {\"name\": \"fs\", \"package\": \"@modelcontextprotocol\u002Fserver-filesystem\"},\n",{"type":43,"tag":77,"props":1595,"children":1596},{"class":79,"line":224},[1597],{"type":43,"tag":77,"props":1598,"children":1599},{},[1600],{"type":49,"value":1601},"        {\"name\": \"custom\", \"url\": \"https:\u002F\u002Fmcp.example.com\u002Fsse\", \"headers\": {\"Authorization\": \"...\"}},\n",{"type":43,"tag":77,"props":1603,"children":1604},{"class":79,"line":233},[1605],{"type":43,"tag":77,"props":1606,"children":1607},{},[1608],{"type":49,"value":1609},"    ],\n",{"type":43,"tag":77,"props":1611,"children":1612},{"class":79,"line":242},[1613],{"type":43,"tag":77,"props":1614,"children":1615},{},[1616],{"type":49,"value":399},{"type":43,"tag":58,"props":1618,"children":1620},{"id":1619},"async-client",[1621],{"type":49,"value":1622},"Async client",{"type":43,"tag":52,"props":1624,"children":1625},{},[1626,1628,1633,1635,1640],{"type":49,"value":1627},"The async client mirrors the sync API exactly — ",{"type":43,"tag":73,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":49,"value":162},{"type":49,"value":1634}," the calls and use ",{"type":43,"tag":73,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":49,"value":170},{"type":49,"value":1641}," to stream.",{"type":43,"tag":65,"props":1643,"children":1645},{"className":181,"code":1644,"language":18,"meta":70,"style":70},"import asyncio\nfrom upstash_box import AsyncBox, Agent\n\nasync def main():\n    box = await AsyncBox.create(runtime=\"node\", agent={\"harness\": Agent.CLAUDE_CODE})\n    run = await box.agent.run(prompt=\"Set up a Next.js project\")\n    print(run.result)\n\n    stream = await box.agent.stream(prompt=\"Build a REST API\")\n    async for chunk in stream:\n        print(chunk)\n\n    await box.delete()\n\nasyncio.run(main())\n",[1646],{"type":43,"tag":73,"props":1647,"children":1648},{"__ignoreMap":70},[1649,1657,1665,1672,1680,1688,1696,1704,1711,1719,1727,1735,1742,1750,1757],{"type":43,"tag":77,"props":1650,"children":1651},{"class":79,"line":80},[1652],{"type":43,"tag":77,"props":1653,"children":1654},{},[1655],{"type":49,"value":1656},"import asyncio\n",{"type":43,"tag":77,"props":1658,"children":1659},{"class":79,"line":30},[1660],{"type":43,"tag":77,"props":1661,"children":1662},{},[1663],{"type":49,"value":1664},"from upstash_box import AsyncBox, Agent\n",{"type":43,"tag":77,"props":1666,"children":1667},{"class":79,"line":205},[1668],{"type":43,"tag":77,"props":1669,"children":1670},{"emptyLinePlaceholder":209},[1671],{"type":49,"value":212},{"type":43,"tag":77,"props":1673,"children":1674},{"class":79,"line":215},[1675],{"type":43,"tag":77,"props":1676,"children":1677},{},[1678],{"type":49,"value":1679},"async def main():\n",{"type":43,"tag":77,"props":1681,"children":1682},{"class":79,"line":224},[1683],{"type":43,"tag":77,"props":1684,"children":1685},{},[1686],{"type":49,"value":1687},"    box = await AsyncBox.create(runtime=\"node\", agent={\"harness\": Agent.CLAUDE_CODE})\n",{"type":43,"tag":77,"props":1689,"children":1690},{"class":79,"line":233},[1691],{"type":43,"tag":77,"props":1692,"children":1693},{},[1694],{"type":49,"value":1695},"    run = await box.agent.run(prompt=\"Set up a Next.js project\")\n",{"type":43,"tag":77,"props":1697,"children":1698},{"class":79,"line":242},[1699],{"type":43,"tag":77,"props":1700,"children":1701},{},[1702],{"type":49,"value":1703},"    print(run.result)\n",{"type":43,"tag":77,"props":1705,"children":1706},{"class":79,"line":251},[1707],{"type":43,"tag":77,"props":1708,"children":1709},{"emptyLinePlaceholder":209},[1710],{"type":49,"value":212},{"type":43,"tag":77,"props":1712,"children":1713},{"class":79,"line":260},[1714],{"type":43,"tag":77,"props":1715,"children":1716},{},[1717],{"type":49,"value":1718},"    stream = await box.agent.stream(prompt=\"Build a REST API\")\n",{"type":43,"tag":77,"props":1720,"children":1721},{"class":79,"line":269},[1722],{"type":43,"tag":77,"props":1723,"children":1724},{},[1725],{"type":49,"value":1726},"    async for chunk in stream:\n",{"type":43,"tag":77,"props":1728,"children":1729},{"class":79,"line":278},[1730],{"type":43,"tag":77,"props":1731,"children":1732},{},[1733],{"type":49,"value":1734},"        print(chunk)\n",{"type":43,"tag":77,"props":1736,"children":1737},{"class":79,"line":287},[1738],{"type":43,"tag":77,"props":1739,"children":1740},{"emptyLinePlaceholder":209},[1741],{"type":49,"value":212},{"type":43,"tag":77,"props":1743,"children":1744},{"class":79,"line":296},[1745],{"type":43,"tag":77,"props":1746,"children":1747},{},[1748],{"type":49,"value":1749},"    await box.delete()\n",{"type":43,"tag":77,"props":1751,"children":1752},{"class":79,"line":305},[1753],{"type":43,"tag":77,"props":1754,"children":1755},{"emptyLinePlaceholder":209},[1756],{"type":49,"value":212},{"type":43,"tag":77,"props":1758,"children":1759},{"class":79,"line":26},[1760],{"type":43,"tag":77,"props":1761,"children":1762},{},[1763],{"type":49,"value":1764},"asyncio.run(main())\n",{"type":43,"tag":52,"props":1766,"children":1767},{},[1768,1774,1776,1782,1784,1790],{"type":43,"tag":73,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":49,"value":1773},"asyncio.gather",{"type":49,"value":1775}," over many ",{"type":43,"tag":73,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":49,"value":1781},"AsyncBox.create(...)",{"type":49,"value":1783}," \u002F ",{"type":43,"tag":73,"props":1785,"children":1787},{"className":1786},[],[1788],{"type":49,"value":1789},"box.agent.run(...)",{"type":49,"value":1791}," calls runs boxes in parallel.",{"type":43,"tag":58,"props":1793,"children":1795},{"id":1794},"gotchas",[1796],{"type":49,"value":1797},"Gotchas",{"type":43,"tag":1799,"props":1800,"children":1801},"ul",{},[1802,1880,1919,1952,1979,1990,2021,2040,2051,2064,2075],{"type":43,"tag":1803,"props":1804,"children":1805},"li",{},[1806,1808,1814,1816,1821,1822,1828,1829,1835,1836,1842,1843,1849,1850,1856,1858,1864,1866,1872,1873,1879],{"type":49,"value":1807},"Public API option keys are ",{"type":43,"tag":1809,"props":1810,"children":1811},"strong",{},[1812],{"type":49,"value":1813},"snake_case",{"type":49,"value":1815}," in Python: ",{"type":43,"tag":73,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":49,"value":117},{"type":49,"value":148},{"type":43,"tag":73,"props":1823,"children":1825},{"className":1824},[],[1826],{"type":49,"value":1827},"user_name",{"type":49,"value":148},{"type":43,"tag":73,"props":1830,"children":1832},{"className":1831},[],[1833],{"type":49,"value":1834},"network_policy",{"type":49,"value":148},{"type":43,"tag":73,"props":1837,"children":1839},{"className":1838},[],[1840],{"type":49,"value":1841},"response_schema",{"type":49,"value":148},{"type":43,"tag":73,"props":1844,"children":1846},{"className":1845},[],[1847],{"type":49,"value":1848},"max_retries",{"type":49,"value":148},{"type":43,"tag":73,"props":1851,"children":1853},{"className":1852},[],[1854],{"type":49,"value":1855},"on_tool_use",{"type":49,"value":1857},", and agent ",{"type":43,"tag":73,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":49,"value":1863},"options",{"type":49,"value":1865}," like ",{"type":43,"tag":73,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":49,"value":1871},"max_turns",{"type":49,"value":148},{"type":43,"tag":73,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":49,"value":1878},"max_budget_usd",{"type":49,"value":172},{"type":43,"tag":1803,"props":1881,"children":1882},{},[1883,1885,1894,1896,1902,1904,1910,1912,1917],{"type":49,"value":1884},"Agent config takes ",{"type":43,"tag":1809,"props":1886,"children":1887},{},[1888],{"type":43,"tag":73,"props":1889,"children":1891},{"className":1890},[],[1892],{"type":49,"value":1893},"harness",{"type":49,"value":1895}," (not the deprecated ",{"type":43,"tag":73,"props":1897,"children":1899},{"className":1898},[],[1900],{"type":49,"value":1901},"provider",{"type":49,"value":1903},"\u002F",{"type":43,"tag":73,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":49,"value":1909},"runner",{"type":49,"value":1911},") — ",{"type":43,"tag":73,"props":1913,"children":1915},{"className":1914},[],[1916],{"type":49,"value":1893},{"type":49,"value":1918}," is required.",{"type":43,"tag":1803,"props":1920,"children":1921},{},[1922,1927,1929,1935,1937,1943,1945,1950],{"type":43,"tag":73,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":49,"value":1841},{"type":49,"value":1928}," accepts a Pydantic ",{"type":43,"tag":73,"props":1930,"children":1932},{"className":1931},[],[1933],{"type":49,"value":1934},"BaseModel",{"type":49,"value":1936}," subclass (returns a typed instance) or a raw JSON-schema ",{"type":43,"tag":73,"props":1938,"children":1940},{"className":1939},[],[1941],{"type":49,"value":1942},"dict",{"type":49,"value":1944}," (returns a ",{"type":43,"tag":73,"props":1946,"children":1948},{"className":1947},[],[1949],{"type":49,"value":1942},{"type":49,"value":1951},").",{"type":43,"tag":1803,"props":1953,"children":1954},{},[1955,1957,1963,1965,1971,1973,1978],{"type":49,"value":1956},"Default working directory is ",{"type":43,"tag":73,"props":1958,"children":1960},{"className":1959},[],[1961],{"type":49,"value":1962},"\u002Fworkspace\u002Fhome",{"type":49,"value":1964},", not ",{"type":43,"tag":73,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":49,"value":1970},"\u002Fhome",{"type":49,"value":1972}," or ",{"type":43,"tag":73,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":49,"value":1903},{"type":49,"value":172},{"type":43,"tag":1803,"props":1980,"children":1981},{},[1982,1988],{"type":43,"tag":73,"props":1983,"children":1985},{"className":1984},[],[1986],{"type":49,"value":1987},"box.cd()",{"type":49,"value":1989}," is client-side tracking — it validates the path exists but doesn't change the box's shell cwd. All SDK methods use it automatically.",{"type":43,"tag":1803,"props":1991,"children":1992},{},[1993,1998,2000,2006,2007,2012,2014,2019],{"type":43,"tag":73,"props":1994,"children":1996},{"className":1995},[],[1997],{"type":49,"value":1297},{"type":49,"value":1999}," does NOT support ",{"type":43,"tag":73,"props":2001,"children":2003},{"className":2002},[],[2004],{"type":49,"value":2005},"agent",{"type":49,"value":1972},{"type":43,"tag":73,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":49,"value":1104},{"type":49,"value":2013}," — use full ",{"type":43,"tag":73,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":49,"value":130},{"type":49,"value":2020}," for those.",{"type":43,"tag":1803,"props":2022,"children":2023},{},[2024,2030,2032,2038],{"type":43,"tag":73,"props":2025,"children":2027},{"className":2026},[],[2028],{"type":49,"value":2029},"run.exit_code",{"type":49,"value":2031}," is ",{"type":43,"tag":73,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":49,"value":2037},"None",{"type":49,"value":2039}," for agent runs, only available for exec commands.",{"type":43,"tag":1803,"props":2041,"children":2042},{},[2043,2049],{"type":43,"tag":73,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":49,"value":2048},"box.delete()",{"type":49,"value":2050}," is irreversible — snapshot first if you need the state.",{"type":43,"tag":1803,"props":2052,"children":2053},{},[2054,2056,2062],{"type":49,"value":2055},"Git operations require ",{"type":43,"tag":73,"props":2057,"children":2059},{"className":2058},[],[2060],{"type":49,"value":2061},"git.token",{"type":49,"value":2063}," in the box config for private repos and PRs.",{"type":43,"tag":1803,"props":2065,"children":2066},{},[2067,2073],{"type":43,"tag":73,"props":2068,"children":2070},{"className":2069},[],[2071],{"type":49,"value":2072},"Box.from_snapshot()",{"type":49,"value":2074}," creates a new box — it does not modify the original.",{"type":43,"tag":1803,"props":2076,"children":2077},{},[2078,2080,2085,2087,2093,2094,2100,2101,2107,2108,2114,2116,2121],{"type":49,"value":2079},"Close the transport when done: ",{"type":43,"tag":73,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":49,"value":2048},{"type":49,"value":2086}," closes it, or use ",{"type":43,"tag":73,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":49,"value":2092},"with box:",{"type":49,"value":1783},{"type":43,"tag":73,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":49,"value":2099},"box.close()",{"type":49,"value":140},{"type":43,"tag":73,"props":2102,"children":2104},{"className":2103},[],[2105],{"type":49,"value":2106},"async with",{"type":49,"value":1783},{"type":43,"tag":73,"props":2109,"children":2111},{"className":2110},[],[2112],{"type":49,"value":2113},"await box.aclose()",{"type":49,"value":2115}," for ",{"type":43,"tag":73,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":49,"value":138},{"type":49,"value":1951},{"type":43,"tag":2123,"props":2124,"children":2125},"style",{},[2126],{"type":49,"value":2127},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2129,"total":242},[2130,2146,2154,2168,2183,2198,2209],{"slug":8,"name":8,"fn":2131,"description":2132,"org":2133,"tags":2134,"stars":26,"repoUrl":27,"updatedAt":2145},"build applications with Upstash SDKs","Work with any Upstash TypeScript\u002FJavaScript SDK including Redis, Box, QStash, Workflow, Vector, Search and Ratelimit. Use when the user is working with any Upstash product or SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2135,2138,2141,2144],{"name":2136,"slug":2137,"type":15},"Database","database",{"name":2139,"slug":2140,"type":15},"Redis","redis",{"name":2142,"slug":2143,"type":15},"Serverless","serverless",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:15.67714",{"slug":4,"name":4,"fn":5,"description":6,"org":2147,"tags":2148,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2149,2150,2151,2152,2153],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"slug":2155,"name":2155,"fn":2156,"description":2157,"org":2158,"tags":2159,"stars":26,"repoUrl":27,"updatedAt":2167},"upstash-cli","manage Upstash resources via CLI","Run the Upstash CLI (`upstash`) against the Upstash Developer API for Redis, Vector, Search, QStash, and teams. Use when listing or managing databases, backups, vector\u002Fsearch indexes, QStash instances, team members, stats, or any non-interactive Upstash automation with JSON output and terminal commands.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2160,2163,2164,2165,2166],{"name":2161,"slug":2162,"type":15},"CLI","cli",{"name":2136,"slug":2137,"type":15},{"name":2139,"slug":2140,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},"2026-04-27T05:30:29.643462",{"slug":2169,"name":2169,"fn":2170,"description":2171,"org":2172,"tags":2173,"stars":26,"repoUrl":27,"updatedAt":2182},"upstash-qstash-js","manage serverless messaging with QStash","Work with the QStash TypeScript\u002FJavaScript SDK for serverless messaging, scheduling. Use when publishing messages to HTTP endpoints, creating schedules, managing queues, verifying incoming messages and other QStash features in serverless environments.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2174,2177,2180,2181],{"name":2175,"slug":2176,"type":15},"Messaging","messaging",{"name":2178,"slug":2179,"type":15},"Node.js","node-js",{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:20.426103",{"slug":2184,"name":2184,"fn":2185,"description":2186,"org":2187,"tags":2188,"stars":26,"repoUrl":27,"updatedAt":2197},"upstash-ratelimit-js","implement rate limiting with Upstash","Lightweight guidance for using the Upstash Redis RateLimit TypeScript\u002FJavaScript SDK, including setup steps, basic usage, and pointers to advanced algorithm, features, pricing, and traffic‑protection docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2189,2190,2193,2196],{"name":2178,"slug":2179,"type":15},{"name":2191,"slug":2192,"type":15},"Performance","performance",{"name":2194,"slug":2195,"type":15},"Security","security",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:19.131145",{"slug":2199,"name":2199,"fn":2200,"description":2201,"org":2202,"tags":2203,"stars":26,"repoUrl":27,"updatedAt":2208},"upstash-redis-js","manage serverless Redis with Upstash","Work with the Upstash Redis TypeScript\u002FJavaScript SDK for serverless Redis operations. Use for caching, session storage, rate limiting, leaderboards, full-text search (querying, filtering, aggregating) with Upstash Redis Search (different from regular FT.SEARCH), and all Redis data structures. Supports automatic serialization\u002Fdeserialization of JavaScript types. Upstash Redis Search also available via @upstash\u002Fsearch-redis and @upstash\u002Fsearch-ioredis adapters for TCP clients.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2204,2205,2206,2207],{"name":2178,"slug":2179,"type":15},{"name":2139,"slug":2140,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:22.793505",{"slug":2210,"name":2210,"fn":2211,"description":2212,"org":2213,"tags":2214,"stars":26,"repoUrl":27,"updatedAt":2227},"upstash-redis-start","provision Upstash Redis databases for agents","Provision a zero-config, no-signup Upstash Redis database for an AI agent via a single POST to `https:\u002F\u002Fupstash.com\u002Fstart-redis`. Use when an agent needs scratch Redis for short-term memory, conversation history, sub-agent work queues, or ranked recall and the user has not provided credentials. The database lives 3 days unless the user claims it.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2215,2218,2221,2222,2225,2226],{"name":2216,"slug":2217,"type":15},"Agents","agents",{"name":2219,"slug":2220,"type":15},"Automation","automation",{"name":2136,"slug":2137,"type":15},{"name":2223,"slug":2224,"type":15},"Memory","memory",{"name":2139,"slug":2140,"type":15},{"name":9,"slug":8,"type":15},"2026-05-09T05:27:35.503104",{"items":2229,"total":349},[2230,2246,2261,2273,2287,2302,2314,2326,2341,2356,2367,2381],{"slug":2231,"name":2231,"fn":2232,"description":2233,"org":2234,"tags":2235,"stars":2243,"repoUrl":2244,"updatedAt":2245},"context7-cli","manage documentation and skills with ctx7","Use the ctx7 CLI to fetch library documentation, manage AI coding skills, and configure Context7 MCP. Activate when the user mentions \"ctx7\" or \"context7\", needs current docs for any library, wants to install\u002Fsearch\u002Fgenerate skills, or needs to set up Context7 for their AI coding agent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2236,2237,2240],{"name":2161,"slug":2162,"type":15},{"name":2238,"slug":2239,"type":15},"Documentation","documentation",{"name":2241,"slug":2242,"type":15},"Knowledge Management","knowledge-management",60095,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fcontext7","2026-04-06T18:55:02.689254",{"slug":2247,"name":2247,"fn":2248,"description":2249,"org":2250,"tags":2251,"stars":2243,"repoUrl":2244,"updatedAt":2260},"context7-docs","fetch documentation and code examples","Fetch up-to-date documentation and code examples for any library, framework, SDK, CLI tool, or cloud service. Use whenever the user asks about a specific library — even well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot — because training data may not reflect recent API changes or version updates.\nAlways use for: API syntax questions, configuration options, version migration issues, \"how do I\" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage.\nUse even when you think you know the answer. Do not rely on training data for API details, signatures, or configuration options — they are frequently out of date. Prefer this over web search for library documentation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2252,2253,2254,2257],{"name":2161,"slug":2162,"type":15},{"name":2238,"slug":2239,"type":15},{"name":2255,"slug":2256,"type":15},"Reference","reference",{"name":2258,"slug":2259,"type":15},"SDK","sdk","2026-07-28T05:35:31.125695",{"slug":2262,"name":2262,"fn":2263,"description":2264,"org":2265,"tags":2266,"stars":2243,"repoUrl":2244,"updatedAt":2272},"context7-mcp","retrieve library documentation via MCP","This skill should be used when the user asks about libraries, frameworks, API references, or needs code examples. Activates for setup questions, code generation involving libraries, or mentions of specific frameworks like React, Vue, Next.js, Prisma, Supabase, etc.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2267,2268,2269],{"name":2238,"slug":2239,"type":15},{"name":2241,"slug":2242,"type":15},{"name":2270,"slug":2271,"type":15},"MCP","mcp","2026-07-28T05:35:32.109879",{"slug":2274,"name":2274,"fn":2275,"description":2276,"org":2277,"tags":2278,"stars":2243,"repoUrl":2244,"updatedAt":2286},"find-docs","retrieve documentation for developer technologies","Retrieves up-to-date documentation, API references, and code examples for any developer technology. Use this skill whenever the user asks about a specific library, framework, SDK, CLI tool, or cloud service — even for well-known ones like React, Next.js, Prisma, Express, Tailwind, Django, or Spring Boot. Your training data may not reflect recent API changes or version updates.\nAlways use for: API syntax questions, configuration options, version migration issues, \"how do I\" questions mentioning a library name, debugging that involves library-specific behavior, setup instructions, and CLI tool usage.\nUse even when you think you know the answer — do not rely on training data for API details, signatures, or configuration options as they are frequently outdated. Always verify against current docs. Prefer this over web search for library documentation and API details.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2279,2280,2283],{"name":2238,"slug":2239,"type":15},{"name":2281,"slug":2282,"type":15},"Research","research",{"name":2284,"slug":2285,"type":15},"Search","search","2026-07-28T05:35:30.135004",{"slug":2288,"name":2288,"fn":2289,"description":2290,"org":2291,"tags":2292,"stars":2299,"repoUrl":2300,"updatedAt":2301},"upstash-ratelimit-ts","implement Redis rate limiting with Upstash","Lightweight guidance for using the Redis Rate Limit TypeScript SDK, including setup steps, basic usage, and pointers to advanced algorithm, features, pricing, and traffic‑protection docs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2293,2294,2295,2298],{"name":2191,"slug":2192,"type":15},{"name":2139,"slug":2140,"type":15},{"name":2296,"slug":2297,"type":15},"TypeScript","typescript",{"name":9,"slug":8,"type":15},2043,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fratelimit-js","2026-04-06T18:55:05.25459",{"slug":2303,"name":2303,"fn":2200,"description":2304,"org":2305,"tags":2306,"stars":2311,"repoUrl":2312,"updatedAt":2313},"redis-js","Work with the Upstash Redis JavaScript\u002FTypeScript SDK for serverless Redis operations. Use for caching, session storage, rate limiting, leaderboards, full-text search (querying, filtering, aggregating with @upstash\u002Fredis search extension), and all Redis data structures. Supports automatic serialization\u002Fdeserialization of JavaScript types. Search also available via @upstash\u002Fsearch-redis and @upstash\u002Fsearch-ioredis adapters for TCP clients.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2307,2308,2309,2310],{"name":2178,"slug":2179,"type":15},{"name":2139,"slug":2140,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},959,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fredis-js","2026-04-06T18:55:06.549589",{"slug":2315,"name":2315,"fn":2170,"description":2316,"org":2317,"tags":2318,"stars":2323,"repoUrl":2324,"updatedAt":2325},"qstash-js","Work with the QStash JavaScript\u002FTypeScript SDK for serverless messaging, scheduling. Use when publishing messages to HTTP endpoints, creating schedules, managing queues, verifying incoming messages in serverless environments.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2319,2320,2321,2322],{"name":2175,"slug":2176,"type":15},{"name":2178,"slug":2179,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},268,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fqstash-js","2026-04-06T18:55:07.811408",{"slug":2327,"name":2327,"fn":2328,"description":2329,"org":2330,"tags":2331,"stars":2338,"repoUrl":2339,"updatedAt":2340},"upstash-workflow-js","build serverless workflows with Upstash","Lightweight guidance for using the Upstash Workflow SDK to define, trigger, and manage workflows. Use this Skill whenever a user wants to create workflow endpoints, run steps, or interact with the Upstash Workflow client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2332,2333,2334,2335],{"name":2178,"slug":2179,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15},{"name":2336,"slug":2337,"type":15},"Workflow Automation","workflow-automation",150,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fworkflow-js","2026-04-06T18:55:09.106744",{"slug":2342,"name":2342,"fn":2343,"description":2344,"org":2345,"tags":2346,"stars":2353,"repoUrl":2354,"updatedAt":2355},"upstash-vector-js","implement vector search with Upstash","Provides quick-start guidance and a unified entry point for Vector features, SDK usage, and integrations. Use when users ask how to work with Vector, its TS SDK, features, or supported frameworks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2347,2350,2351,2352],{"name":2348,"slug":2349,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2178,"slug":2179,"type":15},{"name":2284,"slug":2285,"type":15},{"name":9,"slug":8,"type":15},70,"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fvector-js","2026-04-06T18:55:10.452627",{"slug":2357,"name":2357,"fn":5,"description":2358,"org":2359,"tags":2360,"stars":744,"repoUrl":2365,"updatedAt":2366},"upstash-box-js","Work with the @upstash\u002Fbox SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2361,2362,2363,2364],{"name":2216,"slug":2217,"type":15},{"name":2178,"slug":2179,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fbox","2026-04-06T18:55:14.361763",{"slug":2368,"name":2368,"fn":2369,"description":2370,"org":2371,"tags":2372,"stars":375,"repoUrl":2379,"updatedAt":2380},"upstash-search-js","implement search features with Upstash","Entry point for documentation skills covering Upstash Search quick starts, core concepts, and TypeScript SDK usage. Use when a user asks how to get started, how indexing works, or how to use the TS client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2373,2376,2377,2378],{"name":2374,"slug":2375,"type":15},"API Development","api-development",{"name":2178,"slug":2179,"type":15},{"name":2284,"slug":2285,"type":15},{"name":9,"slug":8,"type":15},"https:\u002F\u002Fgithub.com\u002Fupstash\u002Fsearch-js","2026-04-06T18:55:11.769669",{"slug":8,"name":8,"fn":2131,"description":2132,"org":2382,"tags":2383,"stars":26,"repoUrl":27,"updatedAt":2145},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2384,2385,2386,2387],{"name":2136,"slug":2137,"type":15},{"name":2139,"slug":2140,"type":15},{"name":2142,"slug":2143,"type":15},{"name":9,"slug":8,"type":15}]