digitalocean/godo
GitHub: digitalocean/godo
DigitalOcean 官方的 Go 客户端库,封装了 V2 REST API 以便开发者在 Go 代码中管理和调用 DigitalOcean 云资源及 AI 推理服务。
Stars: 1539 | Forks: 376
# Godo
[](https://github.com/digitalocean/godo/actions/workflows/ci.yml)
[](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分析, 日志审计