github.com/qiniu/go-sdk/v7@v7.27.0/sandbox/doc.go (about) 1 // Package sandbox 提供七牛云沙箱服务的 Go SDK,用于管理安全隔离的云端沙箱环境。 2 // 3 // 沙箱服务是一款专为 AI Agent 场景设计的运行时基础设施,提供安全隔离的云端环境来执行 4 // AI 生成的代码。通过系统级隔离机制,确保代码执行不会对宿主系统造成非法访问或篡改。 5 // 沙箱启动时间低于 200 毫秒,默认存活 5 分钟(最长 1 小时),支持暂停/恢复以持久化 6 // 文件系统和内存状态。 7 // 8 // 更多产品信息请参阅: https://developer.qiniu.com/las/13281/sandbox-overview 9 // 10 // # 核心概念 11 // 12 // - Sandbox: 隔离的云端执行环境(轻量级虚拟化),支持 running、paused、killed 三种状态 13 // - Template: 预构建的沙箱环境定义,包含基础镜像、依赖、文件和启动命令,实现亚秒级启动 14 // - envd: 运行在沙箱内部的 agent 守护进程,通过 ConnectRPC 提供进程管理、文件系统操作和 PTY 终端服务 15 // 16 // # 快速开始 17 // 18 // 创建客户端并启动沙箱: 19 // 20 // c, err := sandbox.NewClient(&sandbox.Config{ 21 // APIKey: os.Getenv("QINIU_API_KEY"), 22 // }) 23 // 24 // timeout := int32(120) 25 // sb, _, err := c.CreateAndWait(ctx, sandbox.CreateParams{ 26 // TemplateID: "base", 27 // Timeout: &timeout, 28 // }, sandbox.WithPollInterval(2*time.Second)) 29 // 30 // defer sb.Kill(ctx) 31 // 32 // # 沙箱生命周期 33 // 34 // Client 提供沙箱的创建、连接和列表操作: 35 // 36 // - [Client.Create] / [Client.CreateAndWait]: 创建沙箱(后者会轮询等待就绪) 37 // - [Client.Connect]: 连接到已有沙箱,可恢复已暂停的沙箱 38 // - [Client.List]: 列出沙箱,支持按状态和元数据过滤 39 // 40 // Sandbox 实例提供生命周期管理: 41 // 42 // - [Sandbox.Kill]: 终止沙箱 43 // - [Sandbox.Pause]: 暂停沙箱(保留文件系统和内存状态) 44 // - [Sandbox.SetTimeout]: 更新超时时间 45 // - [Sandbox.Refresh]: 延长存活时间 46 // - [Sandbox.GetInfo]: 查询沙箱详细状态 47 // - [Sandbox.IsRunning]: 通过 envd /health 端点检查沙箱是否可用 48 // - [Sandbox.GetMetrics]: 获取 CPU、内存、磁盘等资源指标 49 // - [Sandbox.GetLogs]: 获取沙箱日志 50 // - [Sandbox.WaitForReady]: 轮询等待沙箱进入 running 状态 51 // - [Sandbox.GetInjections] / [Sandbox.UpdateInjections]: 查询和替换运行时请求注入规则 52 // - [Sandbox.UpdateGitHubToken]: 更新运行中沙箱的 GitHub 授权令牌 53 // 54 // # 命令执行 55 // 56 // 通过 [Sandbox.Commands] 在沙箱内执行终端命令: 57 // 58 // // 同步执行 59 // result, err := sb.Commands().Run(ctx, "echo hello", 60 // sandbox.WithEnvs(map[string]string{"MY_VAR": "value"}), 61 // sandbox.WithCwd("/tmp"), 62 // sandbox.WithTimeout(5*time.Second), 63 // ) 64 // fmt.Println(result.Stdout) 65 // 66 // // 异步执行(后台命令) 67 // handle, err := sb.Commands().Start(ctx, "sleep 30", sandbox.WithTag("bg")) 68 // handle.WaitPID(ctx) 69 // sb.Commands().Kill(ctx, handle.PID()) 70 // 71 // Commands 支持实时输出回调([WithOnStdout] / [WithOnStderr])、后台命令管理 72 // ([Commands.Start] / [Commands.List] / [Commands.Kill])以及标准输入发送 73 // ([Commands.SendStdin])。 74 // 75 // # 文件系统操作 76 // 77 // 通过 [Sandbox.Files] 进行文件读写: 78 // 79 // // 写入和读取文件 80 // sb.Files().Write(ctx, "/tmp/hello.txt", []byte("Hello!")) 81 // content, err := sb.Files().Read(ctx, "/tmp/hello.txt") 82 // 83 // // 批量写入 84 // sb.Files().WriteFiles(ctx, []sandbox.WriteEntry{ 85 // {Path: "/tmp/a.txt", Data: []byte("content A")}, 86 // {Path: "/tmp/b.txt", Data: []byte("content B")}, 87 // }) 88 // 89 // // 目录操作 90 // sb.Files().MakeDir(ctx, "/tmp/mydir") 91 // entries, err := sb.Files().List(ctx, "/tmp") 92 // 93 // // 监听目录变更 94 // wh, err := sb.Files().WatchDir(ctx, "/tmp/watch", sandbox.WithRecursive(true)) 95 // for ev := range wh.Events() { 96 // fmt.Printf("event: %s %s\n", ev.Type, ev.Name) 97 // } 98 // 99 // Filesystem 还提供 [Filesystem.ReadText]、[Filesystem.ReadStream]、 100 // [Filesystem.Exists]、[Filesystem.GetInfo]、[Filesystem.Rename]、 101 // [Filesystem.Remove] 等操作。 102 // 103 // # PTY 终端 104 // 105 // 通过 [Sandbox.Pty] 创建和管理伪终端会话: 106 // 107 // ptyHandle, err := sb.Pty().Create(ctx, sandbox.PtySize{Cols: 80, Rows: 24}, 108 // sandbox.WithOnStdout(func(data []byte) { fmt.Print(string(data)) }), 109 // ) 110 // sb.Pty().SendInput(ctx, ptyHandle.PID(), []byte("ls -la\n")) 111 // sb.Pty().Resize(ctx, ptyHandle.PID(), sandbox.PtySize{Cols: 120, Rows: 40}) 112 // sb.Pty().Kill(ctx, ptyHandle.PID()) 113 // 114 // # 模板管理 115 // 116 // Client 提供模板的完整生命周期管理: 117 // 118 // - [Client.ListDefaultTemplates] / [Client.ListTemplates] / [Client.GetTemplate]: 列出和查询模板 119 // - [Client.CreateTemplate]: 创建模板(返回 templateID 和 buildID) 120 // - [Client.RebuildTemplate]: 在已有模板上创建新的 waiting build(返回新 buildID) 121 // - [Client.UpdateTemplate] / [Client.DeleteTemplate]: 更新和删除模板 122 // - [Client.StartTemplateBuild] / [Client.WaitForBuild]: 启动构建并等待完成 123 // - [Client.GetTemplateBuildStatus] / [Client.GetTemplateBuildLogs]: 查询构建状态和日志 124 // - [Client.AssignTemplateTags] / [Client.DeleteTemplateTags]: 管理模板标签 125 // - [Client.GetTemplateByAlias]: 通过别名查找模板 126 // 127 // 已有模板的重新构建遵循 [Client.RebuildTemplate] → [Client.StartTemplateBuild] → 128 // [Client.WaitForBuild] 三步流程:先申请一个新的 waiting build,再触发该 build,最后等待完成。 129 // 130 // # 网络访问 131 // 132 // 沙箱默认允许访问互联网,可通过 [CreateParams] 的 Network 字段配置出站流量规则。 133 // 使用 [Sandbox.GetHost] 获取外部访问沙箱指定端口的域名。 134 // 135 // # 轮询选项 136 // 137 // [Client.CreateAndWait]、[Sandbox.WaitForReady] 和 [Client.WaitForBuild] 支持 138 // 通过 [PollOption] 自定义轮询行为: 139 // 140 // - [WithPollInterval]: 设置轮询间隔 141 // - [WithBackoff]: 启用指数退避 142 // - [WithOnPoll]: 注册轮询回调(用于日志或进度展示) 143 package sandbox