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