digitalocean/godo

GitHub: digitalocean/godo

DigitalOcean 官方的 Go 客户端库,封装了 V2 REST API 以便开发者在 Go 代码中管理和调用 DigitalOcean 云资源及 AI 推理服务。

Stars: 1539 | Forks: 376

# Godo [![GitHub Actions CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/digitalocean/godo/actions/workflows/ci.yml) [![GoDoc](https://godoc.org/github.com/digitalocean/godo?status.svg)](https://godoc.org/github.com/digitalocean/godo) Godo 是一个用于访问 DigitalOcean V2 API 的 Go 客户端库。 你可以在此处查看客户端 API 文档:[http://godoc.org/github.com/digitalocean/godo](http://godoc.org/github.com/digitalocean/godo) 你可以在此处查看 DigitalOcean API 文档:[https://docs.digitalocean.com/reference/api/api-reference/](https://docs.digitalocean.com/reference/api/api-reference/) ## 安装 ``` go get github.com/digitalocean/godo@vX.Y.Z ``` 其中 X.Y.Z 是你所需的[版本](https://github.com/digitalocean/godo/releases)。 或者 ``` go get github.com/digitalocean/godo ``` 用于非 Go modules 用法或最新版本。 ## 用法 ``` import "github.com/digitalocean/godo" ``` 创建一个新的 DigitalOcean 客户端,然后使用公开的服务来 访问 DigitalOcean API 的不同部分。 ### 认证 你可以在 DigitalOcean 控制面板的 [应用页面](https://cloud.digitalocean.com/settings/applications)管理 API token。 ``` package main import ( "github.com/digitalocean/godo" ) func main() { client := godo.NewFromToken("my-digitalocean-api-token") } ``` 如果你需要为新客户端提供 `context.Context`,则应改用 [`godo.NewClient`](https://godoc.org/github.com/digitalocean/godo#NewClient) 手动构建客户端。 ## AI 与推理 [Serverless Inference API](https://docs.digitalocean.com/reference/api/reference/serverless-inference/) 可在 `https://inference.do-ai.run/` 访问。请使用 **具有完全访问权限范围的 DigitalOcean PAT** 或 Gradient **模型访问密钥** —— 请参阅上方的[凭证说明](#authentication)。 #### 聊天补全 ``` completion, _, err := client.Chat.Completions.New(ctx, &godo.ChatCompletionNewParams{ Model: "llama3.3-70b-instruct", Messages: []godo.ChatCompletionMessage{ godo.UserMessage("Write me a haiku"), }, }) ``` #### 列出模型 ``` page, _, err := client.Models.List(ctx) for _, m := range page.Data { fmt.Println(m.ID) } ``` #### 图像生成 ``` image, _, err := client.ImageGenerations.Generate(ctx, &godo.ImageGenerateParams{ Model: "stable-diffusion-3.5-large", Prompt: "A friendly cartoon shark typing on a laptop at a sunny beach", N: 1, }) ``` 有关流式传输、embeddings、messages、responses、异步调用、批量推理、代理推理以及完整的可运行程序,请参阅 [`examples/serverless-inference/`](examples/serverless-inference/) 和 [`examples/agent-inference/`](examples/agent-inference/)。 ## 示例 创建一个新的 Droplet: ``` dropletName := "super-cool-droplet" createRequest := &godo.DropletCreateRequest{ Name: dropletName, Region: "nyc3", Size: "s-1vcpu-1gb", Image: godo.DropletCreateImage{ Slug: "ubuntu-20-04-x64", }, } ctx := context.TODO() newDroplet, _, err := client.Droplets.Create(ctx, createRequest) if err != nil { fmt.Printf("Something bad happened: %s\n\n", err) return err } ``` ### 分页 如果项目列表被 API 分页,你必须单独请求每一页。例如,获取所有 Droplets: ``` func DropletList(ctx context.Context, client *godo.Client) ([]godo.Droplet, error) { // create a list to hold our droplets list := []godo.Droplet{} // create options. initially, these will be blank opt := &godo.ListOptions{} for { droplets, resp, err := client.Droplets.List(ctx, opt) if err != nil { return nil, err } // append the current page's droplets to our list list = append(list, droplets...) // if we are at the last page, break out the for loop if resp.Links == nil || resp.Links.IsLastPage() { break } page, err := resp.Links.CurrentPage() if err != nil { return nil, err } // set the page we want for the next request opt.Page = page + 1 } return list, nil } ``` 某些 endpoint 提供 token 分页。例如,获取所有 Registry 仓库: ``` func ListRepositoriesV2(ctx context.Context, client *godo.Client, registryName string) ([]*godo.RepositoryV2, error) { // create a list to hold our registries list := []*godo.RepositoryV2{} // create options. initially, these will be blank opt := &godo.TokenListOptions{} for { repositories, resp, err := client.Registry.ListRepositoriesV2(ctx, registryName, opt) if err != nil { return nil, err } // append the current page's registries to our list list = append(list, repositories...) // if we are at the last page, break out the for loop if resp.Links == nil || resp.Links.IsLastPage() { break } // grab the next page token nextPageToken, err := resp.Links.NextPageToken() if err != nil { return nil, err } // provide the next page token for the next request opt.Token = nextPageToken } return list, nil } ``` ### 自动重试与指数退避 Godo 客户端可以配置为通过 [go-retryablehttp](https://github.com/hashicorp/go-retryablehttp) 对失败并返回 429 或 500 级别响应码的请求使用自动重试和指数退避。要配置 Godo 以启用 go-retryablehttp,必须设置 `RetryConfig.RetryMax`。 ``` tokenSrc := oauth2.StaticTokenSource(&oauth2.Token{ AccessToken: "dop_v1_xxxxxx", }) oauth_client := oauth2.NewClient(oauth2.NoContext, tokenSrc) waitMax := godo.PtrTo(6.0) waitMin := godo.PtrTo(3.0) retryConfig := godo.RetryConfig{ RetryMax: 3, RetryWaitMin: waitMin, RetryWaitMax: waitMax, } client, err := godo.New(oauth_client, godo.WithRetryAndBackoffs(retryConfig)) ``` 请参阅 [RetryConfig Godo 文档](https://pkg.go.dev/github.com/digitalocean/godo#RetryConfig)了解更多信息。 ## 版本控制 客户端的每个版本都进行了标记,并相应地更新了版本号。 要查看过去的版本列表,请运行 `git tag`。 ## 文档 有关示例的完整列表,请查看 [API 文档](https://docs.digitalocean.com/reference/api/api-reference/#tag/SSH-Keys)。 有关此库中所有功能的详细信息,请参阅 [GoDoc](http://godoc.org/github.com/digitalocean/godo) 文档。
标签:EVTX分析, 日志审计