[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-e2b-dev--desktop":3,"tool-e2b-dev--desktop":61},[4,18,26,36,44,53],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",144730,2,"2026-04-07T23:26:32",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":32,"last_commit_at":50,"category_tags":51,"status":17},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[52,14],"插件",{"id":54,"name":55,"github_repo":56,"description_zh":57,"stars":58,"difficulty_score":10,"last_commit_at":59,"category_tags":60,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":67,"readme_en":68,"readme_zh":69,"quickstart_zh":70,"use_case_zh":71,"hero_image_url":72,"owner_login":73,"owner_name":74,"owner_avatar_url":75,"owner_bio":76,"owner_company":77,"owner_location":77,"owner_email":78,"owner_twitter":79,"owner_website":80,"owner_url":81,"languages":82,"stars":95,"forks":96,"last_commit_at":97,"license":98,"difficulty_score":32,"env_os":99,"env_gpu":100,"env_ram":100,"env_deps":101,"category_tags":107,"github_topics":108,"view_count":32,"oss_zip_url":77,"oss_zip_packed_at":77,"status":17,"created_at":115,"updated_at":116,"faqs":117,"releases":147},5396,"e2b-dev\u002Fdesktop","desktop","E2B Desktop Sandbox for LLMs. E2B Sandbox with desktop graphical environment that you can connect to any LLM for secure computer use.","E2B Desktop 是一款专为大语言模型（LLM）设计的开源虚拟桌面沙箱，旨在让 AI 安全地操作计算机。它提供了一个隔离的图形化桌面环境，开发者可以轻松在其中安装各类依赖并运行浏览器、代码编辑器等应用，同时支持将桌面画面实时流式传输给 AI 模型，从而实现真正的“计算机使用”能力。\n\n这一工具主要解决了 AI 代理在执行复杂任务时缺乏安全、可控图形界面的痛点。传统方案往往难以在隔离环境中提供完整的桌面体验，而 E2B Desktop 通过沙箱技术确保了每个会话的独立性与安全性，防止恶意操作影响宿主系统。\n\n它特别适合开发者、AI 研究人员以及希望构建自主智能代理的团队使用。无论是想测试 AI 自动浏览网页、编写代码，还是开发基于开源模型的计算机操作智能体，都能借助其提供的 Python 和 JavaScript SDK 快速上手。\n\n其独特亮点在于支持细粒度的屏幕流媒体控制，包括指定窗口推流、生成带鉴权的访问链接以及设置“只读”模式，既满足了调试需求，又兼顾了交互安全。作为 Open Computer Use 生态的核心组件，E2B Desktop 正推动着 AI 从文本交互向实","E2B Desktop 是一款专为大语言模型（LLM）设计的开源虚拟桌面沙箱，旨在让 AI 安全地操作计算机。它提供了一个隔离的图形化桌面环境，开发者可以轻松在其中安装各类依赖并运行浏览器、代码编辑器等应用，同时支持将桌面画面实时流式传输给 AI 模型，从而实现真正的“计算机使用”能力。\n\n这一工具主要解决了 AI 代理在执行复杂任务时缺乏安全、可控图形界面的痛点。传统方案往往难以在隔离环境中提供完整的桌面体验，而 E2B Desktop 通过沙箱技术确保了每个会话的独立性与安全性，防止恶意操作影响宿主系统。\n\n它特别适合开发者、AI 研究人员以及希望构建自主智能代理的团队使用。无论是想测试 AI 自动浏览网页、编写代码，还是开发基于开源模型的计算机操作智能体，都能借助其提供的 Python 和 JavaScript SDK 快速上手。\n\n其独特亮点在于支持细粒度的屏幕流媒体控制，包括指定窗口推流、生成带鉴权的访问链接以及设置“只读”模式，既满足了调试需求，又兼顾了交互安全。作为 Open Computer Use 生态的核心组件，E2B Desktop 正推动着 AI 从文本交互向实际操作能力的跨越。","# E2B Desktop Sandbox - Open Source Virtual Computer for Computer Use\n\nE2B Desktop Sandbox is an open source secure virtual desktop ready for Computer Use. Powered by [E2B](https:\u002F\u002Fe2b.dev).\n\nEach sandbox is isolated from the others and can be customized with any dependencies you want.\n\n![Desktop Sandbox](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fe2b-dev_desktop_readme_31f8ae16037a.png)\n\n## Examples\n\n**SDK Examples**\n\n- Basic Examples:\n  - [Python](.\u002Fexamples\u002Fbasic-python)\n  - [JavaScript](.\u002Fexamples\u002Fbasic-javascript)\n- Streaming Desktop Applications:\n  - [Python](.\u002Fexamples\u002Fstreaming-apps-python)\n  - [JavaScript](.\u002Fexamples\u002Fstreaming-apps-javascript)\n\n**[Open Computer Use](https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fopen-computer-use)**\n\n- Computer use made with 100% open source LLMs.\n\n**[🏄 Surf](https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fsurf)**\n\n- OpenAI Computer Use Agent using E2B's Desktop Sandbox. Runs as a Next.js app.\n\n## 🚀 Getting started\n\nThe E2B Desktop Sandbox is built on top of [E2B Sandbox](https:\u002F\u002Fe2b.dev\u002Fdocs).\n\n### 1. Get E2B API key\n\nSign up at [E2B](https:\u002F\u002Fe2b.dev) and get your API key.\nSet environment variable `E2B_API_KEY` with your API key.\n\n### 2. Install SDK\n\n**Python**\n\n```bash\npip install e2b-desktop\n```\n\n**JavaScript**\n\n```bash\nnpm install @e2b\u002Fdesktop\n```\n\n### 3. Create Desktop Sandbox\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\n\n# Create a new desktop sandbox\ndesktop = Sandbox.create()\n\n# Launch an application\ndesktop.launch('google-chrome')  # or vscode, firefox, etc.\n\n# Wait 10s for the application to open\ndesktop.wait(10000)\n\n# Stream the application's window\n# Note: There can be only one stream at a time\n# You need to stop the current stream before streaming another application\ndesktop.stream.start(\n    window_id=desktop.get_current_window_id(), # if not provided the whole desktop will be streamed\n    require_auth=True\n)\n\n# Get the stream auth key\nauth_key = desktop.stream.get_auth_key()\n\n# Print the stream URL\nprint('Stream URL:', desktop.stream.get_url(auth_key=auth_key))\n\n# Kill the sandbox after the tasks are finished\n# desktop.kill()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\n\u002F\u002F Start a new desktop sandbox\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Launch an application\nawait desktop.launch('google-chrome') \u002F\u002F or vscode, firefox, etc.\n\n\u002F\u002F Wait 10s for the application to open\nawait desktop.wait(10000)\n\n\u002F\u002F Stream the application's window\n\u002F\u002F Note: There can be only one stream at a time\n\u002F\u002F You need to stop the current stream before streaming another application\nawait desktop.stream.start({\n  windowId: await desktop.getCurrentWindowId(), \u002F\u002F if not provided the whole desktop will be streamed\n  requireAuth: true,\n})\n\n\u002F\u002F Get the stream auth key\nconst authKey = desktop.stream.getAuthKey()\n\n\u002F\u002F Print the stream URL\nconsole.log('Stream URL:', desktop.stream.getUrl({ authKey }))\n\n\u002F\u002F Kill the sandbox after the tasks are finished\n\u002F\u002F await desktop.kill()\n```\n\n## Features\n\n### Streaming desktop's screen\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Start the stream\ndesktop.stream.start()\n\n# Get stream URL\nurl = desktop.stream.get_url()\nprint(url)\n\n# Get stream URL and disable user interaction\nurl = desktop.stream.get_url(view_only=True)\nprint(url)\n\n# Stop the stream\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Start the stream\nawait desktop.stream.start()\n\n\u002F\u002F Get stream URL\nconst url = desktop.stream.getUrl()\nconsole.log(url)\n\n\u002F\u002F Get stream URL and disable user interaction\nconst url = desktop.stream.getUrl({ viewOnly: true })\nconsole.log(url)\n\n\u002F\u002F Stop the stream\nawait desktop.stream.stop()\n```\n\n### Streaming with password protection\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Start the stream\ndesktop.stream.start(\n    require_auth=True  # Require authentication with an auto-generated key\n)\n\n# Retrieve the authentication key\nauth_key = desktop.stream.get_auth_key()\n\n# Get stream URL\nurl = desktop.stream.get_url(auth_key=auth_key)\nprint(url)\n\n# Stop the stream\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Start the stream\nawait desktop.stream.start({\n  requireAuth: true, \u002F\u002F Require authentication with an auto-generated key\n})\n\n\u002F\u002F Retrieve the authentication key\nconst authKey = await desktop.stream.getAuthKey()\n\n\u002F\u002F Get stream URL\nconst url = desktop.stream.getUrl({ authKey })\nconsole.log(url)\n\n\u002F\u002F Stop the stream\nawait desktop.stream.stop()\n```\n\n### Streaming specific application\n\n> [!WARNING]\n>\n> - Will raise an error if the desired application is not open yet\n> - The stream will close once the application closes\n> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Get current (active) window ID\nwindow_id = desktop.get_current_window_id()\n\n# Get all windows of the application\nwindow_ids = desktop.get_application_windows(\"Firefox\")\n\n# Start the stream\ndesktop.stream.start(window_id=window_ids[0])\n\n# Stop the stream\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Get current (active) window ID\nconst windowId = await desktop.getCurrentWindowId()\n\n\u002F\u002F Get all windows of the application\nconst windowIds = await desktop.getApplicationWindows('Firefox')\n\n\u002F\u002F Start the stream\nawait desktop.stream.start({ windowId: windowIds[0] })\n\n\u002F\u002F Stop the stream\nawait desktop.stream.stop()\n```\n\n### Mouse control\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\ndesktop.double_click()\ndesktop.left_click()\ndesktop.left_click(x=100, y=200)\ndesktop.right_click()\ndesktop.right_click(x=100, y=200)\ndesktop.middle_click()\ndesktop.middle_click(x=100, y=200)\ndesktop.scroll(10) # Scroll by the amount. Positive for up, negative for down.\ndesktop.move_mouse(100, 200) # Move to x, y coordinates\ndesktop.drag((100, 100), (200, 200)) # Drag using the mouse\ndesktop.mouse_press(\"left\") # Press the mouse button\ndesktop.mouse_release(\"left\") # Release the mouse button\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\nawait desktop.doubleClick()\nawait desktop.leftClick()\nawait desktop.leftClick(100, 200)\nawait desktop.rightClick()\nawait desktop.rightClick(100, 200)\nawait desktop.middleClick()\nawait desktop.middleClick(100, 200)\nawait desktop.scroll(10) \u002F\u002F Scroll by the amount. Positive for up, negative for down.\nawait desktop.moveMouse(100, 200) \u002F\u002F Move to x, y coordinates\nawait desktop.drag([100, 100], [200, 200]) \u002F\u002F Drag using the mouse\nawait desktop.mousePress('left') \u002F\u002F Press the mouse button\nawait desktop.mouseRelease('left') \u002F\u002F Release the mouse button\n```\n\n### Keyboard control\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Write text at the current cursor position with customizable typing speed\ndesktop.write(\"Hello, world!\")  # Default: chunk_size=25, delay_in_ms=75\ndesktop.write(\"Fast typing!\", chunk_size=50, delay_in_ms=25)  # Faster typing\n\n# Press keys\ndesktop.press(\"enter\")\ndesktop.press(\"space\")\ndesktop.press(\"backspace\")\ndesktop.press([\"ctrl\", \"c\"]) # Key combination\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Write text at the current cursor position with customizable typing speed\nawait desktop.write('Hello, world!')\nawait desktop.write('Fast typing!', { chunkSize: 50, delayInMs: 25 }) \u002F\u002F Faster typing\n\n\u002F\u002F Press keys\nawait desktop.press('enter')\nawait desktop.press('space')\nawait desktop.press('backspace')\nawait desktop.press(['ctrl', 'c']) \u002F\u002F Key combination\n```\n\n### Window control\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Get current (active) window ID\nwindow_id = desktop.get_current_window_id()\n\n# Get all windows of the application\nwindow_ids = desktop.get_application_windows(\"Firefox\")\n\n# Get window title\ntitle = desktop.get_window_title(window_id)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Get current (active) window ID\nconst windowId = await desktop.getCurrentWindowId()\n\n\u002F\u002F Get all windows of the application\nconst windowIds = await desktop.getApplicationWindows('Firefox')\n\n\u002F\u002F Get window title\nconst title = await desktop.getWindowTitle(windowId)\n```\n\n### Screenshot\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Take a screenshot and save it as \"screenshot.png\" locally\nimage = desktop.screenshot()\n# Save the image to a file\nwith open(\"screenshot.png\", \"wb\") as f:\n    f.write(image)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\nconst image = await desktop.screenshot()\n\u002F\u002F Save the image to a file\nfs.writeFileSync('screenshot.png', image)\n```\n\n### Open file\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Open file with default application\ndesktop.files.write(\"\u002Fhome\u002Fuser\u002Findex.js\", \"console.log('hello')\") # First create the file\ndesktop.open(\"\u002Fhome\u002Fuser\u002Findex.js\") # Then open it\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Open file with default application\nawait desktop.files.write('\u002Fhome\u002Fuser\u002Findex.js', \"console.log('hello')\") \u002F\u002F First create the file\nawait desktop.open('\u002Fhome\u002Fuser\u002Findex.js') \u002F\u002F Then open it\n```\n\n### Launch applications\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Launch the application\ndesktop.launch('google-chrome')\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Launch the application\nawait desktop.launch('google-chrome')\n```\n\n### Run any bash commands\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# Run any bash command\nout = desktop.commands.run(\"ls -la \u002Fhome\u002Fuser\")\nprint(out)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F Run any bash command\nconst out = await desktop.commands.run('ls -la \u002Fhome\u002Fuser')\nconsole.log(out)\n```\n\n### Wait\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\ndesktop.wait(1000) # Wait for 1 second\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\nawait desktop.wait(1000) \u002F\u002F Wait for 1 second\n```\n\n## Under the hood\n\nThe desktop-like environment is based on Linux and [Xfce](https:\u002F\u002Fwww.xfce.org\u002F) at the moment. We chose Xfce because it's a fast and lightweight environment that's also popular and actively supported. However, this Sandbox template is fully customizable and you can create your own desktop environment.\nCheck out the sandbox template's code [here](.\u002Ftemplate\u002F).\n","# E2B 桌面沙盒 - 用于计算机使用的开源虚拟机\n\nE2B 桌面沙盒是一个开源的安全虚拟桌面，专为计算机使用而设计。它由 [E2B](https:\u002F\u002Fe2b.dev) 提供支持。\n\n每个沙盒彼此隔离，并且可以根据您的需求自定义任何依赖项。\n\n![桌面沙盒](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fe2b-dev_desktop_readme_31f8ae16037a.png)\n\n## 示例\n\n**SDK 示例**\n\n- 基础示例：\n  - [Python](.\u002Fexamples\u002Fbasic-python)\n  - [JavaScript](.\u002Fexamples\u002Fbasic-javascript)\n- 流式传输桌面应用程序：\n  - [Python](.\u002Fexamples\u002Fstreaming-apps-python)\n  - [JavaScript](.\u002Fexamples\u002Fstreaming-apps-javascript)\n\n**[Open Computer Use](https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fopen-computer-use)**\n\n- 使用 100% 开源大模型实现的计算机使用场景。\n\n**[🏄 Surf](https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fsurf)**\n\n- 基于 E2B 桌面沙盒的 OpenAI 计算机使用代理。以 Next.js 应用程序的形式运行。\n\n## 🚀 快速开始\n\nE2B 桌面沙盒构建在 [E2B Sandbox](https:\u002F\u002Fe2b.dev\u002Fdocs) 的基础上。\n\n### 1. 获取 E2B API 密钥\n\n在 [E2B](https:\u002F\u002Fe2b.dev) 上注册并获取您的 API 密钥。将您的 API 密钥设置为环境变量 `E2B_API_KEY`。\n\n### 2. 安装 SDK\n\n**Python**\n\n```bash\npip install e2b-desktop\n```\n\n**JavaScript**\n\n```bash\nnpm install @e2b\u002Fdesktop\n```\n\n### 3. 创建桌面沙盒\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\n\n# 创建一个新的桌面沙盒\ndesktop = Sandbox.create()\n\n# 启动一个应用程序\ndesktop.launch('google-chrome')  # 或 vscode、firefox 等\n\n# 等待 10 秒钟让应用程序打开\ndesktop.wait(10000)\n\n# 流式传输应用程序窗口\n# 注意：同一时间只能有一个流\n# 在流式传输另一个应用程序之前，需要先停止当前的流\ndesktop.stream.start(\n    window_id=desktop.get_current_window_id(), # 如果未提供，则会流式传输整个桌面\n    require_auth=True\n)\n\n# 获取流的认证密钥\nauth_key = desktop.stream.get_auth_key()\n\n# 打印流的 URL\nprint('流 URL:', desktop.stream.get_url(auth_key=auth_key))\n\n# 在任务完成后终止沙盒\n# desktop.kill()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\n\u002F\u002F 启动一个新的桌面沙盒\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 启动一个应用程序\nawait desktop.launch('google-chrome') \u002F\u002F 或 vscode、firefox 等\n\n\u002F\u002F 等待 10 秒钟让应用程序打开\nawait desktop.wait(10000)\n\n\u002F\u002F 流式传输应用程序窗口\n\u002F\u002F 注意：同一时间只能有一个流\n\u002F\u002F 在流式传输另一个应用程序之前，需要先停止当前的流\nawait desktop.stream.start({\n  windowId: await desktop.getCurrentWindowId(), \u002F\u002F 如果未提供，则会流式传输整个桌面\n  requireAuth: true,\n})\n\n\u002F\u002F 获取流的认证密钥\nconst authKey = desktop.stream.getAuthKey()\n\n\u002F\u002F 打印流的 URL\nconsole.log('流 URL:', desktop.stream.getUrl({ authKey }))\n\n\u002F\u002F 在任务完成后终止沙盒\n\u002F\u002F await desktop.kill()\n```\n\n## 功能\n\n### 流式传输桌面屏幕\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 开始流式传输\ndesktop.stream.start()\n\n# 获取流的 URL\nurl = desktop.stream.get_url()\nprint(url)\n\n# 获取流的 URL 并禁用用户交互\nurl = desktop.stream.get_url(view_only=True)\nprint(url)\n\n# 停止流式传输\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 开始流式传输\nawait desktop.stream.start()\n\n\u002F\u002F 获取流的 URL\nconst url = desktop.stream.getUrl()\nconsole.log(url)\n\n\u002F\u002F 获取流的 URL 并禁用用户交互\nconst url = desktop.stream.getUrl({ viewOnly: true })\nconsole.log(url)\n\n\u002F\u002F 停止流式传输\nawait desktop.stream.stop()\n```\n\n### 带密码保护的流式传输\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 开始流式传输\ndesktop.stream.start(\n    require_auth=True  # 需要使用自动生成的密钥进行身份验证\n)\n\n# 获取身份验证密钥\nauth_key = desktop.stream.get_auth_key()\n\n# 获取流的 URL\nurl = desktop.stream.get_url(auth_key=auth_key)\nprint(url)\n\n# 停止流式传输\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 开始流式传输\nawait desktop.stream.start({\n  requireAuth: true, \u002F\u002F 需要使用自动生成的密钥进行身份验证\n})\n\n\u002F\u002F 获取身份验证密钥\nconst authKey = await desktop.stream.getAuthKey()\n\n\u002F\u002F 获取流的 URL\nconst url = desktop.stream.getUrl({ authKey })\nconsole.log(url)\n\n\u002F\u002F 停止流式传输\nawait desktop.stream.stop()\n```\n\n### 流式传输特定应用程序\n\n> [!WARNING]\n>\n> - 如果目标应用程序尚未打开，将会抛出错误\n> - 一旦应用程序关闭，流式传输也会结束\n> - 不支持同时创建多个流式传输，您可能需要先停止当前的流，再为每个应用程序启动新的流\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 获取当前（活动）窗口 ID\nwindow_id = desktop.get_current_window_id()\n\n# 获取应用程序的所有窗口\nwindow_ids = desktop.get_application_windows(\"Firefox\")\n\n# 开始流式传输\ndesktop.stream.start(window_id=window_ids[0])\n\n# 停止流式传输\ndesktop.stream.stop()\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n# 获取当前（活动）窗口 ID\nconst windowId = await desktop.getCurrentWindowId()\n\n# 获取应用程序的所有窗口\nconst windowIds = await desktop.getApplicationWindows('Firefox')\n\n# 开始流式传输\nawait desktop.stream.start({ windowId: windowIds[0] })\n\n# 停止流式传输\nawait desktop.stream.stop()\n```\n\n### 鼠标控制\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\ndesktop.double_click()\ndesktop.left_click()\ndesktop.left_click(x=100, y=200)\ndesktop.right_click()\ndesktop.right_click(x=100, y=200)\ndesktop.middle_click()\ndesktop.middle_click(x=100, y=200)\ndesktop.scroll(10) # 滚动指定的距离。正数向上滚动，负数向下滚动。\ndesktop.move_mouse(100, 200) # 移动到 x, y 坐标\ndesktop.drag((100, 100), (200, 200)) # 使用鼠标拖动\ndesktop.mouse_press(\"left\") # 按下鼠标左键\ndesktop.mouse_release(\"left\") # 释放鼠标左键\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\nawait desktop.doubleClick()\nawait desktop.leftClick()\nawait desktop.leftClick(100, 200)\nawait desktop.rightClick()\nawait desktop.rightClick(100, 200)\nawait desktop.middleClick()\nawait desktop.middleClick(100, 200)\nawait desktop.scroll(10) \u002F\u002F 滚动指定的距离。正数向上滚动，负数向下滚动。\nawait desktop.moveMouse(100, 200) \u002F\u002F 移动到 x, y 坐标\nawait desktop.drag([100, 100], [200, 200]) \u002F\u002F 使用鼠标拖动\nawait desktop.mousePress('left') \u002F\u002F 按下鼠标左键\nawait desktop.mouseRelease('left') \u002F\u002F 释放鼠标左键\n```\n\n### 键盘控制\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 在当前光标位置写入文本，可自定义打字速度\ndesktop.write(\"Hello, world!\")  # 默认：chunk_size=25, delay_in_ms=75\ndesktop.write(\"Fast typing!\", chunk_size=50, delay_in_ms=25)  # 更快的打字速度\n\n# 按键\ndesktop.press(\"enter\")\ndesktop.press(\"space\")\ndesktop.press(\"backspace\")\ndesktop.press([\"ctrl\", \"c\"]) # 组合键\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 在当前光标位置写入文本，可自定义打字速度\nawait desktop.write('Hello, world!')\nawait desktop.write('Fast typing!', { chunkSize: 50, delayInMs: 25 }) \u002F\u002F 更快的打字速度\n\n\u002F\u002F 按键\nawait desktop.press('enter')\nawait desktop.press('space')\nawait desktop.press('backspace')\nawait desktop.press(['ctrl', 'c']) \u002F\u002F 组合键\n```\n\n### 窗口控制\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 获取当前（活动）窗口ID\nwindow_id = desktop.get_current_window_id()\n\n# 获取应用程序的所有窗口\nwindow_ids = desktop.get_application_windows(\"Firefox\")\n\n# 获取窗口标题\ntitle = desktop.get_window_title(window_id)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 获取当前（活动）窗口ID\nconst windowId = await desktop.getCurrentWindowId()\n\n\u002F\u002F 获取应用程序的所有窗口\nconst windowIds = await desktop.getApplicationWindows('Firefox')\n\n\u002F\u002F 获取窗口标题\nconst title = await desktop.getWindowTitle(windowId)\n```\n\n### 截图\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 截取屏幕并保存为本地文件“screenshot.png”\nimage = desktop.screenshot()\n# 将图像保存到文件\nwith open(\"screenshot.png\", \"wb\") as f:\n    f.write(image)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\nconst image = await desktop.screenshot()\n\u002F\u002F 将图像保存到文件\nfs.writeFileSync('screenshot.png', image)\n```\n\n### 打开文件\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 使用默认应用打开文件\ndesktop.files.write(\"\u002Fhome\u002Fuser\u002Findex.js\", \"console.log('hello')\") # 先创建文件\ndesktop.open(\"\u002Fhome\u002Fuser\u002Findex.js\") # 再打开文件\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 使用默认应用打开文件\nawait desktop.files.write('\u002Fhome\u002Fuser\u002Findex.js', \"console.log('hello')\") \u002F\u002F 先创建文件\nawait desktop.open('\u002Fhome\u002Fuser\u002Findex.js') \u002F\u002F 再打开文件\n```\n\n### 启动应用\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 启动应用\ndesktop.launch('google-chrome')\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 启动应用\nawait desktop.launch('google-chrome')\n```\n\n### 运行任意 Bash 命令\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\n# 运行任意 Bash 命令\nout = desktop.commands.run(\"ls -la \u002Fhome\u002Fuser\")\nprint(out)\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 运行任意 Bash 命令\nconst out = await desktop.commands.run('ls -la \u002Fhome\u002Fuser')\nconsole.log(out)\n```\n\n### 等待\n\n**Python**\n\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox.create()\n\ndesktop.wait(1000) # 等待1秒\n```\n\n**JavaScript**\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\nconst desktop = await Sandbox.create()\nawait desktop.wait(1000) \u002F\u002F 等待1秒\n```\n\n## 内部原理\n\n目前，类桌面环境基于 Linux 和 [Xfce](https:\u002F\u002Fwww.xfce.org\u002F)。我们选择 Xfce 是因为它是一个快速、轻量级且广受欢迎、持续维护的环境。不过，该 Sandbox 模板完全可定制，您可以创建自己的桌面环境。\n请在此处查看 Sandbox 模板的代码 [here](.\u002Ftemplate\u002F)。","# E2B Desktop Sandbox 快速上手指南\n\nE2B Desktop Sandbox 是一个开源的安全虚拟桌面环境，专为“计算机使用（Computer Use）”场景设计。它允许开发者通过代码创建隔离的虚拟桌面，启动应用程序、控制鼠标键盘、截取屏幕或运行命令，非常适合构建 AI Agent 和自动化测试流程。\n\n## 1. 环境准备\n\n在开始之前，请确保满足以下要求：\n\n*   **操作系统**：支持 Linux、macOS 或 Windows。\n*   **运行时环境**：\n    *   Python 3.8+ 或 Node.js 18+\n*   **E2B API Key**：\n    1. 访问 [E2B 官网](https:\u002F\u002Fe2b.dev) 注册账号。\n    2. 获取您的 API Key。\n    3. 设置环境变量（替换 `\u003CYOUR_API_KEY>` 为您的实际密钥）：\n        ```bash\n        export E2B_API_KEY=\u003CYOUR_API_KEY>\n        ```\n        *(Windows PowerShell: `$env:E2B_API_KEY=\"\u003CYOUR_API_KEY>\"`)*\n\n## 2. 安装步骤\n\n根据您的开发语言选择对应的 SDK 进行安装。\n\n### Python\n```bash\npip install e2b-desktop\n```\n*(国内用户如遇下载缓慢，可使用清华源：`pip install e2b-desktop -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`)*\n\n### JavaScript \u002F TypeScript\n```bash\nnpm install @e2b\u002Fdesktop\n```\n*(国内用户如遇下载缓慢，可使用淘宝镜像：`npm install @e2b\u002Fdesktop --registry=https:\u002F\u002Fregistry.npmmirror.com`)*\n\n## 3. 基本使用\n\n以下示例展示如何创建一个虚拟桌面沙箱，启动 Chrome 浏览器，并获取桌面的实时视频流地址。\n\n### Python 示例\n\n```python\nfrom e2b_desktop import Sandbox\n\n# 1. 创建一个新的桌面沙箱\ndesktop = Sandbox.create()\n\n# 2. 启动应用程序 (例如：google-chrome, vscode, firefox)\ndesktop.launch('google-chrome')\n\n# 3. 等待应用打开 (单位：毫秒)\ndesktop.wait(10000)\n\n# 4. 开始流式传输当前窗口\n# 注意：同一时间只能有一个活跃的视频流\ndesktop.stream.start(\n    window_id=desktop.get_current_window_id(), \n    require_auth=True\n)\n\n# 5. 获取认证密钥和流媒体 URL\nauth_key = desktop.stream.get_auth_key()\nstream_url = desktop.stream.get_url(auth_key=auth_key)\n\nprint('Stream URL:', stream_url)\n# 您可以在浏览器中打开此 URL 查看虚拟桌面\n\n# 6. 任务完成后销毁沙箱\n# desktop.kill()\n```\n\n### JavaScript 示例\n\n```javascript\nimport { Sandbox } from '@e2b\u002Fdesktop'\n\n\u002F\u002F 1. 创建一个新的桌面沙箱\nconst desktop = await Sandbox.create()\n\n\u002F\u002F 2. 启动应用程序\nawait desktop.launch('google-chrome')\n\n\u002F\u002F 3. 等待应用打开\nawait desktop.wait(10000)\n\n\u002F\u002F 4. 开始流式传输当前窗口\nawait desktop.stream.start({\n  windowId: await desktop.getCurrentWindowId(),\n  requireAuth: true,\n})\n\n\u002F\u002F 5. 获取认证密钥和流媒体 URL\nconst authKey = await desktop.stream.getAuthKey()\nconst streamUrl = desktop.stream.getUrl({ authKey })\n\nconsole.log('Stream URL:', streamUrl)\n\n\u002F\u002F 6. 任务完成后销毁沙箱\n\u002F\u002F await desktop.kill()\n```\n\n### 核心功能速览\n\n创建沙箱后，您可以执行以下操作：\n\n*   **鼠标控制**：`desktop.left_click(x, y)`, `desktop.move_mouse(x, y)`, `desktop.scroll(amount)`\n*   **键盘输入**：`desktop.write(\"Hello\")`, `desktop.press(\"enter\")`, `desktop.press([\"ctrl\", \"c\"])`\n*   **截图**：`image = desktop.screenshot()` (返回二进制图像数据)\n*   **运行命令**：`output = desktop.commands.run(\"ls -la\")`\n*   **文件操作**：`desktop.files.write(\"\u002Fpath\u002Fto\u002Ffile\", \"content\")`\n\n> **提示**：底层环境基于 Linux 和 Xfce 桌面系统，您可以根据需要自定义沙箱模板以预装特定依赖。","某自动化测试团队需要让大语言模型（LLM）自主执行复杂的端到端网页交互测试，包括登录、数据录入及截图验证。\n\n### 没有 desktop 时\n- **环境隔离困难**：每次测试需在本地或共享服务器运行浏览器，极易因残留进程、Cookie 或插件冲突导致测试结果不稳定。\n- **安全风险高**：直接让 LLM 操作宿主机存在巨大隐患，恶意代码或错误指令可能窃取本地敏感数据或破坏开发环境。\n- **可视化调试缺失**：LLM 仅能通过文本日志反馈，开发者无法实时看到浏览器实际操作画面，难以定位“点击失败”或“页面未加载”等视觉类错误。\n- **资源调度僵化**：难以动态按需分配独立的图形化桌面资源，并发测试时容易抢占系统资源导致崩溃。\n\n### 使用 desktop 后\n- **秒级隔离沙箱**：desktop 为每次任务瞬间启动一个全新的、预装好 Chrome 和依赖的独立虚拟桌面，彻底消除环境干扰。\n- **天然安全边界**：所有 LLM 的操作被严格限制在 sandbox 内部，即使执行危险指令也不会波及宿主机，任务结束后自动销毁。\n- **实时流式监控**：通过 desktop 的屏幕流功能，开发者可获取带鉴权的 URL，像看直播一样实时观察 LLM 的鼠标点击和页面渲染过程。\n- **弹性并发支持**：借助 API 可轻松并行创建数百个隔离桌面实例，完美支撑大规模自动化回归测试场景。\n\ndesktop 通过将安全的图形化沙箱与大模型无缝连接，让 AI 真正具备了在隔离环境中“看”和“操作”电脑的能力，极大提升了自动化任务的可靠性与可观测性。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fe2b-dev_desktop_31f8ae16.png","e2b-dev","E2B | Cloud for AI Agents","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fe2b-dev_e286365d.png","Open-source, secure environment with real-world tools for enterprise-grade agents.",null,"hello@e2b.dev","e2b","https:\u002F\u002Fe2b.dev\u002Fdocs","https:\u002F\u002Fgithub.com\u002Fe2b-dev",[83,87,91],{"name":84,"color":85,"percentage":86},"Python","#3572A5",51.7,{"name":88,"color":89,"percentage":90},"TypeScript","#3178c6",46,{"name":92,"color":93,"percentage":94},"JavaScript","#f1e05a",2.3,1336,171,"2026-04-07T10:36:57","Apache-2.0","未说明 (客户端 SDK 支持 Python\u002FJavaScript 运行的任意系统，沙箱环境基于 Linux)","未说明",{"notes":102,"python":103,"dependencies":104},"该工具为云端沙箱服务，本地仅需安装 SDK。运行需要 E2B API 密钥。沙箱环境基于 Linux 和 Xfce 桌面，通过流媒体传输画面，本地无需高性能硬件或图形显卡支持。","未说明 (需安装 e2b-desktop 包)",[105,106],"e2b-desktop (Python)","@e2b\u002Fdesktop (JavaScript\u002FNode.js)",[35,13,15,14],[64,79,109,110,111,73,112,113,114],"gpt","gui","vm","ai","computer","llm","2026-03-27T02:49:30.150509","2026-04-08T13:57:36.758000",[118,123,128,133,138,143],{"id":119,"question_zh":120,"answer_zh":121,"source_url":122},24464,"使用特定模板启动 Desktop Sandbox 时卡住或报错怎么办？","请尝试更新到最新的 Beta 版本 SDK，该版本基于 1.7.1 并修复了相关问题。运行命令：`pip install e2b-desktop==1.7.1b1`。如果自定义模板构建失败，建议先使用默认模板（已包含 Chrome）进行开发，或者等待官方更新 Beta SDK 以匹配最新功能。","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fdesktop\u002Fissues\u002F74",{"id":124,"question_zh":125,"answer_zh":126,"source_url":127},24465,"SDK 代码执行时报错或命令拼接缺少空格如何处理？","确保使用的是兼容的 SDK 版本（如 1.6.4 或更新版本）。如果在 `stream.start()` 时遇到错误，请检查是否正确获取了 `window_id`。典型的工作流程是：先创建 Sandbox，打开网页，等待加载 (`desktop.wait(5000)`)，获取当前窗口 ID，然后启动流。示例代码：\n```python\nfrom e2b_desktop import Sandbox\ndesktop = Sandbox()\ndesktop.open(\"https:\u002F\u002Fwww.google.com\")\ndesktop.wait(5000)\ndesktop.stream.start(window_id=desktop.get_current_window_id())\nprint(desktop.stream.get_url())\n```","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fdesktop\u002Fissues\u002F77",{"id":129,"question_zh":130,"answer_zh":131,"source_url":132},24466,"连接 Sandbox 时出现 'Connection closed (code: 1011)' 错误但脚本仍在运行，如何解决？","这通常是旧版本 SDK 的问题。请更新 `e2b_desktop` pip 包到最新版本。用户反馈显示，更新后该问题（包括自托管 E2B 环境）已不再出现。运行命令：`pip install --upgrade e2b-desktop`。","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fdesktop\u002Fissues\u002F62",{"id":134,"question_zh":135,"answer_zh":136,"source_url":137},24467,"Sandbox 的运行时长限制是多少？付费账户能运行多久？","免费账户通常限制为 1 小时。Pro  tier（付费专业版）用户最长可获得 24 小时的运行时间。对于需要更长时间的企业级需求，官方提供企业定制方案。可以通过代码逻辑控制沙盒的暂停 (`stop`) 和启动 (`start`) 来管理运行时状态，只要不销毁沙盒，数据通常会保留。","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fdesktop\u002Fissues\u002F89",{"id":139,"question_zh":140,"answer_zh":141,"source_url":142},24468,"如何通过 Python 代码在 Desktop Sandbox 中打开特定应用程序（如 Firefox）并获取其窗口？","默认模板通常预装了浏览器。你可以使用 `desktop.open(\"url\")` 直接打开网页，这会自动启动浏览器。然后使用 `desktop.get_current_window_id()` 获取窗口 ID，再结合 `desktop.stream.start()` 进行流式传输。如果应用未打开，`get_application_windows` 会报错，因此建议先通过 `open` 方法或 `commands.run` 启动应用。示例：\n```python\ndesktop = Sandbox(api_key=api_key)\ndesktop.open(\"https:\u002F\u002Fwww.xiaohongshu.com\u002Fexplore\") # 启动浏览器并打开网页\ndesktop.wait(3000) # 等待加载\nwindow_id = desktop.get_current_window_id()\ndesktop.stream.start()\n```","https:\u002F\u002Fgithub.com\u002Fe2b-dev\u002Fdesktop\u002Fissues\u002F71",{"id":144,"question_zh":145,"answer_zh":146,"source_url":127},24469,"如何在 Sandbox 中安装中文语言包和 Playwright 等依赖？","可以通过 `desktop.commands.run()` 执行 shell 命令来安装依赖。以下是一个完整的配置示例，用于安装中文语言包、字体以及 Playwright：\n```python\ndesktop_sandbox.commands.run(\"sudo apt-get update && sudo apt-get install -y language-pack-zh-hans fonts-noto-cjk && sudo locale-gen zh_CN.UTF-8 && sudo update-locale LANG=zh_CN.UTF-8\", background=False)\ndesktop_sandbox.commands.run(\"sudo pip3 install playwright\", background=False)\ndesktop_sandbox.commands.run(\"playwright install firefox\", background=False)\n```",[148,153,158,163,168,172,177,181,186,191,195,200,204,209,214,218,223,228,232,237],{"id":149,"version":150,"summary_zh":151,"released_at":152},154049,"@e2b\u002Fdesktop-python@2.3.0","### 小改动\n\n-   0b89e8d：移除对 Python 3.9 的支持\n","2026-02-17T01:42:39",{"id":154,"version":155,"summary_zh":156,"released_at":157},154050,"@e2b\u002Fdesktop@2.2.2","### 补丁变更\n\n-   43e495f：更新依赖项\n","2025-12-04T18:11:36",{"id":159,"version":160,"summary_zh":161,"released_at":162},154051,"@e2b\u002Fdesktop@2.2.1","### 补丁变更\n\n-   fbd7c10：更新依赖项\n","2025-12-04T17:52:45",{"id":164,"version":165,"summary_zh":166,"released_at":167},154052,"@e2b\u002Fdesktop@2.2.0","### 小改动\n\n-   fa51958：更新 e2b 核心以使用新的连接方法\n","2025-10-31T16:07:28",{"id":169,"version":170,"summary_zh":166,"released_at":171},154053,"@e2b\u002Fdesktop-python@2.2.0","2025-10-31T16:07:25",{"id":173,"version":174,"summary_zh":175,"released_at":176},154054,"@e2b\u002Fdesktop-python@2.1.0","### 小改动\n\n-   5d63292：升级 e2b 至 2.3.0，包含全新的构建系统 2.0 版本\n","2025-10-16T12:07:56",{"id":178,"version":179,"summary_zh":175,"released_at":180},154055,"@e2b\u002Fdesktop@2.1.0","2025-10-16T12:07:54",{"id":182,"version":183,"summary_zh":184,"released_at":185},154056,"@e2b\u002Fdesktop@2.0.2","### 补丁变更\n\n-   8ce7d28：更新了 Node.js 引擎版本\n","2025-10-09T17:36:41",{"id":187,"version":188,"summary_zh":189,"released_at":190},154057,"@e2b\u002Fdesktop@2.0.1","### 补丁变更\n\n-   1ddb1e3：在 xdotool 调用中使用 `--`，以防止将文本解析为选项参数。\n","2025-09-18T10:36:38",{"id":192,"version":193,"summary_zh":189,"released_at":194},154058,"@e2b\u002Fdesktop-python@2.0.1","2025-09-18T10:36:35",{"id":196,"version":197,"summary_zh":198,"released_at":199},154059,"@e2b\u002Fdesktop@2.0.0","### Major Changes\n\n-   50a7cb3: SDK v2\n","2025-08-28T08:31:18",{"id":201,"version":202,"summary_zh":198,"released_at":203},154060,"@e2b\u002Fdesktop-python@2.0.0","2025-08-28T08:31:15",{"id":205,"version":206,"summary_zh":207,"released_at":208},154061,"@e2b\u002Fdesktop-python@1.7.4","### Patch Changes\n\n-   5993344: Fix parsing http errors in connect client\n","2025-07-03T21:13:50",{"id":210,"version":211,"summary_zh":212,"released_at":213},154062,"@e2b\u002Fdesktop@1.9.2","### Patch Changes\n\n-   f3cd9a2: adds MIT license to the SDKs\n","2025-06-06T15:51:47",{"id":215,"version":216,"summary_zh":212,"released_at":217},154063,"@e2b\u002Fdesktop-python@1.7.3","2025-06-06T15:51:44",{"id":219,"version":220,"summary_zh":221,"released_at":222},154064,"@e2b\u002Fdesktop-python@1.7.2","### Patch Changes\n\n-   aa86c3a: fixes restarting desktop environment when trying to reconnect\n","2025-05-29T10:42:24",{"id":224,"version":225,"summary_zh":226,"released_at":227},154065,"@e2b\u002Fdesktop-python@1.7.1","### Patch Changes\n\n-   13b5f98: fix overwriting .vnc directory when stream is re-started\n","2025-05-05T20:28:34",{"id":229,"version":230,"summary_zh":226,"released_at":231},154066,"@e2b\u002Fdesktop@1.9.1","2025-05-05T20:28:31",{"id":233,"version":234,"summary_zh":235,"released_at":236},154067,"@e2b\u002Fdesktop@1.9.0","### Minor Changes\n\n-   c719c15: bump e2b core to v1.4.0\n","2025-05-05T17:57:11",{"id":238,"version":239,"summary_zh":235,"released_at":240},154068,"@e2b\u002Fdesktop-python@1.7.0","2025-05-05T17:57:08"]