Lybic Docs

Go SDK使用指南

探索使用 Go SDK 与 Lybic 平台交互的实用示例。

本指南提供了使用 Lybic Go SDK 与 Lybic 平台交互的示例。

快速开始

客户端初始化

Lybic Go SDK 提供了简单的客户端初始化方式。您可以使用默认配置或自定义设置来创建客户端。

基础初始化:

package main

import (
    "context"
    "fmt"
    "github.com/lybic/lybic-sdk-go"
)

func main() {
    ctx := context.Background()
    
    // 使用默认配置创建客户端
    // SDK 将从环境变量读取配置:
    // - LYBIC_ORG_ID: 组织 ID
    // - LYBIC_API_KEY: API 认证密钥
    // - LYBIC_ENDPOINT: API 端点 (默认: https://api.lybic.cn)
    client, err := lybic.NewClient(nil)
    if err != nil {
        fmt.Printf("创建客户端时出错: %v\n", err)
        return
    }
    
    // 使用客户端...
}

自定义配置:

config := lybic.NewConfig()
config.OrgId = "your-org-id"
config.ApiKey = "your-api-key"
config.Endpoint = "https://api.lybic.cn" // 可选,默认为 https://api.lybic.cn
config.Timeout = 30 // 可选,超时时间(秒),默认:10

client, err := lybic.NewClient(config)
if err != nil {
    fmt.Printf("创建客户端时出错: %v\n", err)
    return
}

带有额外请求头和自定义日志的配置:

config := &lybic.Config{
    OrgId:    "your-org-id",
    ApiKey:   "your-api-key",
    Endpoint: "https://api.lybic.cn",
    Timeout:  30,
    ExtraHeaders: map[string]string{
        "X-Custom-Header": "custom-value",
    },
    // 可选地提供自定义日志器
    // Logger: yourCustomLogger,
}

client, err := lybic.NewClient(config)
if err != nil {
    fmt.Printf("创建客户端时出错: %v\n", err)
    return
}

平台 API 示例

以下示例说明了如何通过 SDK 与 Lybic 平台的多种功能进行交互。

沙箱管理

沙箱是按需创建、独立隔离的云端环境,用于运行GUI智能体。

列出沙箱

检索所有可用沙箱的列表。

ctx := context.Background()
sandboxes, err := client.ListSandboxes(ctx)
if err != nil {
    fmt.Printf("列出沙箱时出错: %v", err)
    return
}
fmt.Printf("找到 %d 个沙箱。\n", len(sandboxes))
for _, sandbox := range sandboxes {
    fmt.Printf("- 沙箱 ID: %s, 名称: %s\n", sandbox.Id, sandbox.Name)
}

创建沙箱

创建新沙箱。并非所有参数都需要填写。标有 * 的参数是可选的。

_sandboxName := "Test Sandbox"
createDto := lybic.CreateSandboxDto{
    Name: &_sandboxName,
}

sandbox, err := client.CreateSandbox(ctx, createDto)
if err != nil {
    fmt.Printf("创建沙箱时出错: %v", err)
    return
}
fmt.Printf("已创建沙箱: %+v\n", sandbox)

获取沙箱详情

检索特定沙箱的详细信息。

sandbox, err := client.GetSandbox(ctx, "sandbox-id")
if err != nil {
    fmt.Printf("获取沙箱时出错: %v\n", err)
    return
}
fmt.Printf("沙箱信息: %+v\n", sandbox)

与沙箱交互

您可以执行鼠标点击或键盘输入等操作,并截取截图(预览)。

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: lybic.ComputerUseActionDtoActionOneOf{
        ComputerUseActionDtoActionOneOfInterface: map[string]any{
            "type": "mouse:click",
            "x": map[string]any{
                "type":  "px",
                "value": 10,
            },
            "y": map[string]any{
                "type":  "px",
                "value": 10,
            },
            "button": 1,
        },
    },
})
if err != nil {
    fmt.Println("执行计算机使用操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

获取预览(截图):

previewSandbox, err := client.PreviewSandbox(ctx, "sandbox-Id")
if err != nil {
    fmt.Printf("预览沙箱时出错: %v\n", err)
    return
}
fmt.Printf("已预览沙箱: %+v\n", previewSandbox)

延长沙箱

延长运行中沙箱的生命周期。

var _maxLife float32 = 86400 // 24 小时(秒)
err = client.ExtendSandbox(ctx, "sandbox_id", lybic.ExtendSandboxDto{
    MaxLifeSeconds: &_maxLife,
})
if err != nil {
    fmt.Printf("延长沙箱时出错: %v\n", err)
    return
}
fmt.Println("沙箱延长成功。")

删除沙箱

当您完成使用后删除沙箱。

sandboxId := "your-sandbox-id"
err := client.DeleteSandbox(context.Background(), sandboxId)
if err != nil {
    fmt.Printf("删除沙箱时出错: %v", err)
    return
}
fmt.Println("沙箱删除成功。")

机器镜像管理

创建沙箱快照并从已保存的镜像启动新沙箱。

列出机器镜像

检索所有可用的机器镜像。

images, err := client.ListMachineImages(ctx)
if err != nil {
    fmt.Println("列出机器镜像时出错:", err)
    return
}
fmt.Printf("可用镜像: %+v\n", images)

创建机器镜像

从运行中的沙箱创建新的机器镜像。

imageDto := lybic.CreateMachineImageDto{
    SandboxId: "sandbox-id",
    Name: "my-sandbox-snapshot",
}
image, err := client.CreateMachineImage(ctx, imageDto)
if err != nil {
    fmt.Println("创建机器镜像时出错:", err)
    return
}
fmt.Printf("已创建镜像: %s\n", image.Id)

删除机器镜像

删除不再需要的机器镜像。

err := client.DeleteMachineImage(ctx, "image-id")
if err != nil {
    fmt.Println("删除机器镜像时出错:", err)
    return
}
fmt.Println("机器镜像删除成功")

沙箱文件和进程操作

在沙箱中传输文件和执行命令。

复制文件到/从沙箱:

copyDto := lybic.SandboxFileCopyRequestDto{
    Files: []lybic.SandboxFileCopyRequestDtoFiles{
      {
        Src: map[string]string{
            "type":"sandboxFileLocation",
            "path":"/home/agent/file1"
        },
        Dest: map[string]any{
            "type":"httpPutLocation",
            "url":"http://example.com/accept-put-singend-file-url/file",
            "headers":map[string]any{"x-api-key":"my-api-key"}
        },
      },
  },
}

result, err := client.CopyFilesWithSandbox(ctx, "sandbox-id", copyDto)
if err != nil {
    fmt.Println("复制文件时出错:", err)
    return
}
fmt.Printf("复制结果: %+v\n", result)

在沙箱中执行进程:

processDto := lybic.SandboxProcessRequestDto{
    Executable: "/bin/ls",
    Args:[]string{"-anh"}
}

result, err := client.ExecSandboxProcess(ctx, "sandbox-id", processDto)
if err != nil {
    fmt.Println("执行进程时出错:", err)
    return
}
fmt.Printf("进程输出: %s\n", result.Output)

沙箱状态和监控

监控沙箱状态和生命周期。

获取沙箱状态:

status, err := client.GetSandboxStatus(ctx, "sandbox-id")
if err != nil {
    fmt.Println("获取沙箱状态时出错:", err)
    return
}
// 状态可能是: PENDING, RUNNING, STOPPED, ERROR
fmt.Printf("沙箱状态: %s\n", status.Status)

项目管理

项目用于组织和管理你的资源。

列出项目

projects, err := client.ListProjects(ctx)
if err != nil {
    fmt.Println("列出项目时出错:", err)
    return
}
for _, project := range projects {
    fmt.Printf("项目 ID: %s, 名称: %s\n", project.Id, project.Name)
}

创建项目

projectDto := lybic.CreateProjectDto{
    Name: "My New AI Agent",
}
project, err := client.CreateProject(ctx, projectDto)
if err != nil {
    fmt.Println("创建项目时出错:", err)
	return
}
fmt.Println("项目创建成功:", project.Name)

删除项目

err = client.DeleteProject(ctx, "project-id")
if err != nil {
    fmt.Println("删除项目失败:", err)
    return
}
fmt.Println("项目删除成功")

组织统计信息

检索组织的当前使用统计信息。

stats, err := client.GetStats(ctx)
if err != nil {
    fmt.Println("获取统计信息时出错:", err)
    return
}
fmt.Printf("平台统计: %+v\n", stats)

使用 MCP 客户端

使用 MCP 客户端

对于涉及工具调用能力的高级智能体开发,您需要使用模型上下文协议(MCP)客户端。

MCP 客户端初始化

您可以通过多种方式初始化 McpClient

从现有客户端:

// 假设 'client' 是您已初始化的 lybic.Client
mcpClient, err := lybic.NewMcpClient(ctx, lybic.McpOption{
    UsingClient: client,
})
if err != nil {
    panic(err)
}
defer mcpClient.Close()

从配置对象:

config := &lybic.Config{
    OrgId:    "your-org-id",
    ApiKey:   "your-api-key",
}

mcpClient, err := lybic.NewMcpClient(ctx, lybic.McpOption{
    UsingClientConfig: config,
})
if err != nil {
    panic(err)
}
defer mcpClient.Close()

使用特定的 MCP 服务器:

// 使用特定的 MCP 服务器而非默认的
doNotUseDefault := true
mcpServerId := "your-mcp-server-id"

mcpClient, err := lybic.NewMcpClient(ctx, lybic.McpOption{
    UsingClient:              client,
    DoNotUsingDefaultServer:  &doNotUseDefault,
    UsingSpecificMcpServerId: &mcpServerId,
})
if err != nil {
    panic(err)
}
defer mcpClient.Close()

调用工具

MCP 客户端的主要功能是调用工具,例如 computer-use 服务。

// 此示例假设您有一个与沙箱关联的 MCP 服务器。
args := map[string]any{
    "action": "doubleClick",
    "x":      120,
    "y":      240,
}
service := "computer-use"

result, err := mcpClient.CallTools(context.Background(), args, &service)
if err != nil {
    fmt.Printf("调用工具时出错: %v", err)
    return
}
fmt.Printf("工具调用结果: %+v\n", result)

MCP 服务器管理

您也可以管理 MCP 服务器本身。

列出 MCP 服务器

servers, err := mcpClient.ListMcpServers(ctx)
if err != nil {
    fmt.Println("列出 MCP 服务器时出错:", err)
    return
}
fmt.Println("MCP 服务器:")
for _, server := range servers {
    fmt.Printf("ID: %s, 名称: %s\n", server.Id, server.Name)
}

获取默认 MCP 服务器

defaultServer, err := mcpClient.GetDefaultMcpServer(ctx)
if err != nil {
    fmt.Println("获取默认 MCP 服务器时出错:", err)
    return
}
fmt.Printf("默认 MCP 服务器: %s\n", defaultServer.Id)

创建 MCP 服务器

m, err := mcpClient.CreateMcpServer(ctx, lybic.CreateMcpServerDto{
    Name: "MCP-server-01",
})
if err != nil {
    fmt.Println("创建 MCP 服务器时出错:", err)
    return
}
fmt.Println("已创建 MCP 服务器:")
fmt.Printf("ID: %s, 名称: %s\n", m.Id, m.Name)

删除 MCP 服务器

err := mcpClient.DeleteMcpServer(ctx, "mcp-server-id")
if err != nil {
    fmt.Println("删除 MCP 服务器时出错:", err)
    return
}
fmt.Println("MCP 服务器删除成功")

将 MCP 服务器与沙箱关联

err := mcpClient.SetMcpServerToSandbox(ctx, "mcp-server-id", 
    lybic.SetMcpServerToSandboxResponseDto{
        SandboxId: "sandbox-id",
    })
if err != nil {
    fmt.Println("将 MCP 服务器设置到沙箱时出错:", err)
    return
}
fmt.Println("MCP 服务器与沙箱关联成功")

获取可用工具

从 MCP 服务器检索可用工具列表。

tools, err := mcpClient.GetTools(ctx)
if err != nil {
    fmt.Println("获取工具时出错:", err)
    return
}
fmt.Println("可用工具:")
for _, tool := range tools {
    fmt.Printf("- %s: %s\n", tool.Name, tool.Description)
}

与沙箱的 Action 结构体进行交互

您可以执行鼠标点击或键盘输入等操作,并截图。以下示例演示如何使用 SDK 中提供的各种action(操作)。

执行鼠标点击操作:

// 在位置 (100, 200) 使用鼠标左键创建鼠标点击操作。
action := lybic.NewMouseClickAction(
    lybic.NewPixelLength(100),
    lybic.NewPixelLength(200),
    1, // 1 表示左键
)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行鼠标点击操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行鼠标双击操作:

// 在屏幕中心创建鼠标双击操作。
action := lybic.NewMouseDoubleClickAction(
    lybic.NewFractionalLength(1, 2), // 屏幕宽度的 1/2
    lybic.NewFractionalLength(1, 2), // 屏幕高度的 1/2
    1, // 1 表示左键
)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行鼠标双击操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行鼠标移动操作:

// 将鼠标移动到位置 (300, 400)。
action := lybic.NewMouseMoveAction(
    lybic.NewPixelLength(300),
    lybic.NewPixelLength(400),
)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行鼠标移动操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行鼠标滚动操作:

// 在位置 (300, 400) 垂直滚动 10 步。
action := lybic.NewMouseScrollAction(
    lybic.NewPixelLength(300), // x 位置
    lybic.NewPixelLength(400), // y 位置
    10,  // 垂直滚动步数
    0,   // 水平滚动步数
)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行鼠标滚动操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行鼠标拖动操作:

// 从 (100, 100) 拖动鼠标到 (500, 500)。
action := lybic.NewMouseDragAction(
    lybic.NewPixelLength(100),
    lybic.NewPixelLength(100),
    lybic.NewPixelLength(500),
    lybic.NewPixelLength(500),
)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行鼠标拖动操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行键盘输入操作:

// 创建键盘输入动作,输入 "Hello, Lybic!"。
action := lybic.NewKeyboardTypeAction("Hello, Lybic!", false)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行键盘输入操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

执行键盘快捷键操作:

// 按 Ctrl+C。
action := lybic.NewKeyboardHotkeyAction("ctrl+c")

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行键盘快捷键操作时出错:", err.Error())
    return
}
fmt.Println("操作执行成功:", actionResult)

获取截图:

// 获取沙箱的截图。
action := lybic.NewScreenshotAction()

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("获取截图时出错:", err.Error())
    return
}
// 截图数据将在 actionResult 中。
fmt.Println("截图获取成功:", actionResult)

获取预览(截图的便捷方法):

// 这是一个对截图动作进行封装的辅助函数。
previewSandbox, err := client.PreviewSandbox(ctx, "sandbox-Id")
if err != nil {
    fmt.Printf("预览沙箱时出错: %v\n", err)
    return
}
fmt.Printf("已预览沙箱: %+v", previewSandbox)

执行等待操作:

// 等待 5 秒(5000 毫秒)。
action := lybic.NewWaitAction(5000)

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("执行等待操作时出错:", err.Error())
    return
}
fmt.Println("等待操作完成成功:", actionResult)

标记任务完成:

// 发送任务成功完成。
action := lybic.NewFinishedAction()
// 可选地,您可以添加消息。
// action.Message = "任务完成!"

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("标记任务完成时出错:", err.Error())
    return
}
fmt.Println("标记完成成功:", actionResult)

标记任务失败:

// 标记任务失败。
action := lybic.NewFailedAction()
// 可选地,您可以添加消息。
// action.Message = "出现了问题。"

actionResult, err := client.ExecuteComputerUseAction(ctx, "sandbox-Id", lybic.ComputerUseActionDto{
    Action: action,
})
if err != nil {
    fmt.Println("标记失败时出错:", err.Error())
    return
}
fmt.Println("标记失败成功:", actionResult)

本页内容