Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions args.go
Original file line number Diff line number Diff line change
Expand Up @@ -857,4 +857,13 @@ const (

// ArgDedicatedInferenceAcceleratorSlug filters accelerators by slug (optional).
ArgDedicatedInferenceAcceleratorSlug = "slug"

// ArgDedicatedInferenceRegion filters dedicated inferences by region (optional).
ArgDedicatedInferenceRegion = "region"

// ArgDedicatedInferenceName filters dedicated inferences by name (optional).
ArgDedicatedInferenceName = "name"

// ArgDedicatedInferenceTokenName is the name for a dedicated inference auth token.
ArgDedicatedInferenceTokenName = "token-name"
)
228 changes: 228 additions & 0 deletions commands/dedicated_inference.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,43 @@ For more information, see https://docs.digitalocean.com/reference/api/digitaloce
AddBoolFlag(cmdDelete, doctl.ArgForce, doctl.ArgShortForce, false, "Delete the dedicated inference endpoint without a confirmation prompt")
cmdDelete.Example = `The following example deletes a dedicated inference endpoint: doctl dedicated-inference delete 12345678-1234-1234-1234-123456789012`

cmdUpdate := CmdBuilder(
cmd,
RunDedicatedInferenceUpdate,
"update <dedicated-inference-id>",
"Update a dedicated inference endpoint",
`Updates a dedicated inference endpoint using a spec file in JSON or YAML format.
Use the `+"`"+`--spec`+"`"+` flag to provide the path to the spec file.
Optionally provide a Hugging Face access token using `+"`"+`--hugging-face-token`+"`"+`.`,
Writer,
aliasOpt("u"),
displayerType(&displayers.DedicatedInference{}),
)
AddStringFlag(cmdUpdate, doctl.ArgDedicatedInferenceSpec, "", "", `Path to a dedicated inference spec in JSON or YAML format. Set to "-" to read from stdin.`, requiredOpt())
AddStringFlag(cmdUpdate, doctl.ArgDedicatedInferenceHuggingFaceToken, "", "", "Hugging Face token for accessing gated models (optional)")
cmdUpdate.Example = `The following example updates a dedicated inference endpoint using a spec file: doctl dedicated-inference update 12345678-1234-1234-1234-123456789012 --spec spec.yaml

For more information, see https://docs.digitalocean.com/reference/api/digitalocean/#tag/Dedicated-Inference/operation/dedicatedInferences_update`

cmdList := CmdBuilder(
cmd,
RunDedicatedInferenceList,
"list",
"List all dedicated inference endpoints",
`Lists all dedicated inference endpoints on your account, including their IDs, names, regions, statuses, and endpoints.
Optionally use `+"`"+`--region`+"`"+` to filter by region or `+"`"+`--name`+"`"+` to filter by name.`,
Writer,
aliasOpt("ls"),
displayerType(&displayers.DedicatedInferenceList{}),
)
AddStringFlag(cmdList, doctl.ArgDedicatedInferenceRegion, "", "", "Filter by region (optional)")
AddStringFlag(cmdList, doctl.ArgDedicatedInferenceName, "", "", "Filter by name (optional)")
cmdList.Example = `The following example lists all dedicated inference endpoints: doctl dedicated-inference list

The following example filters by region: doctl dedicated-inference list --region nyc2

The following example filters by name: doctl dedicated-inference list --name my-endpoint`

cmdListAccelerators := CmdBuilder(
cmd,
RunDedicatedInferenceListAccelerators,
Expand All @@ -98,6 +135,70 @@ Optionally use `+"`"+`--slug`+"`"+` to filter by accelerator slug.`,

The following example filters by slug: doctl dedicated-inference list-accelerators 12345678-1234-1234-1234-123456789012 --slug gpu-mi300x1-192gb`

cmdCreateToken := CmdBuilder(
cmd,
RunDedicatedInferenceCreateToken,
"create-token <dedicated-inference-id>",
"Create an auth token for a dedicated inference endpoint",
`Creates a new authentication token for a dedicated inference endpoint.
Use the `+"`"+`--token-name`+"`"+` flag to specify the name of the token.`,
Writer,
aliasOpt("ct"),
displayerType(&displayers.DedicatedInferenceTokenDisplayer{}),
)
AddStringFlag(cmdCreateToken, doctl.ArgDedicatedInferenceTokenName, "", "", "Name for the auth token", requiredOpt())
cmdCreateToken.Example = `The following example creates an auth token for a dedicated inference endpoint: doctl dedicated-inference create-token 12345678-1234-1234-1234-123456789012 --token-name my-token`

cmdListTokens := CmdBuilder(
cmd,
RunDedicatedInferenceListTokens,
"list-tokens <dedicated-inference-id>",
"List auth tokens for a dedicated inference endpoint",
`Lists all authentication tokens for a dedicated inference endpoint, including their IDs, names, and creation timestamps.
Note: token values are not returned when listing tokens.`,
Writer,
aliasOpt("lt"),
displayerType(&displayers.DedicatedInferenceTokenDisplayer{}),
)
cmdListTokens.Example = `The following example lists auth tokens for a dedicated inference endpoint: doctl dedicated-inference list-tokens 12345678-1234-1234-1234-123456789012`

cmdRevokeToken := CmdBuilder(
cmd,
RunDedicatedInferenceRevokeToken,
"revoke-token <dedicated-inference-id> <token-id>",
"Revoke an auth token for a dedicated inference endpoint",
`Revokes (deletes) an authentication token for a dedicated inference endpoint.
Provide the dedicated inference ID and the token ID as arguments.`,
Writer,
aliasOpt("rt"),
)
AddBoolFlag(cmdRevokeToken, doctl.ArgForce, doctl.ArgShortForce, false, "Revoke the token without a confirmation prompt")
cmdRevokeToken.Example = `The following example revokes an auth token: doctl dedicated-inference revoke-token 12345678-1234-1234-1234-123456789012 12345678-0000-0000-1234-123456789012`

cmdGetSizes := CmdBuilder(
cmd,
RunDedicatedInferenceGetSizes,
"get-sizes",
"List available dedicated inference GPU sizes and pricing",
`Returns the available GPU sizes for dedicated inference endpoints, including pricing, region availability, CPU, memory, GPU, and disk details.`,
Writer,
aliasOpt("gs"),
displayerType(&displayers.DedicatedInferenceSizeDisplayer{}),
)
cmdGetSizes.Example = `The following example lists available dedicated inference sizes: doctl dedicated-inference get-sizes`

cmdGetGPUModelConfig := CmdBuilder(
cmd,
RunDedicatedInferenceGetGPUModelConfig,
"get-gpu-model-config",
"List supported GPU model configurations",
`Returns the supported GPU model configurations for dedicated inference endpoints, including model slugs, names, compatible GPU slugs, and whether models are gated.`,
Writer,
aliasOpt("ggmc"),
displayerType(&displayers.DedicatedInferenceGPUModelConfigDisplayer{}),
)
cmdGetGPUModelConfig.Example = `The following example lists GPU model configurations: doctl dedicated-inference get-gpu-model-config`

return cmd
}

Expand Down Expand Up @@ -183,6 +284,18 @@ func RunDedicatedInferenceGet(c *CmdConfig) error {
return c.Display(&displayers.DedicatedInference{DedicatedInferences: do.DedicatedInferences{*endpoint}})
}

// RunDedicatedInferenceList lists all dedicated inference endpoints.
func RunDedicatedInferenceList(c *CmdConfig) error {
region, _ := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceRegion)
name, _ := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceName)

list, err := c.DedicatedInferences().List(region, name)
if err != nil {
return err
}
return c.Display(&displayers.DedicatedInferenceList{DedicatedInferenceListItems: list})
}

// RunDedicatedInferenceListAccelerators lists accelerators for a dedicated inference endpoint.
func RunDedicatedInferenceListAccelerators(c *CmdConfig) error {
if len(c.Args) < 1 {
Expand All @@ -199,6 +312,121 @@ func RunDedicatedInferenceListAccelerators(c *CmdConfig) error {
return c.Display(&displayers.DedicatedInferenceAccelerator{DedicatedInferenceAcceleratorInfos: accelerators})
}

// RunDedicatedInferenceUpdate updates an existing dedicated inference endpoint.
func RunDedicatedInferenceUpdate(c *CmdConfig) error {
if len(c.Args) < 1 {
return doctl.NewMissingArgsErr(c.NS)
}
id := c.Args[0]

specPath, err := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceSpec)
if err != nil {
return err
}

spec, err := readDedicatedInferenceSpec(os.Stdin, specPath)
if err != nil {
return err
}

req := &godo.DedicatedInferenceUpdateRequest{
Spec: spec,
}

hfToken, _ := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceHuggingFaceToken)
if hfToken != "" {
req.Secrets = &godo.DedicatedInferenceSecrets{
HuggingFaceToken: hfToken,
}
}

endpoint, err := c.DedicatedInferences().Update(id, req)
if err != nil {
return err
}
return c.Display(&displayers.DedicatedInference{DedicatedInferences: do.DedicatedInferences{*endpoint}})
}

// RunDedicatedInferenceCreateToken creates a new auth token for a dedicated inference endpoint.
func RunDedicatedInferenceCreateToken(c *CmdConfig) error {
if len(c.Args) < 1 {
return doctl.NewMissingArgsErr(c.NS)
}
diID := c.Args[0]

tokenName, err := c.Doit.GetString(c.NS, doctl.ArgDedicatedInferenceTokenName)
if err != nil {
return err
}

req := &godo.DedicatedInferenceTokenCreateRequest{
Name: tokenName,
}

token, err := c.DedicatedInferences().CreateToken(diID, req)
if err != nil {
return err
}
return c.Display(&displayers.DedicatedInferenceTokenDisplayer{DedicatedInferenceTokens: []do.DedicatedInferenceToken{*token}})
}

// RunDedicatedInferenceListTokens lists all auth tokens for a dedicated inference endpoint.
func RunDedicatedInferenceListTokens(c *CmdConfig) error {
if len(c.Args) < 1 {
return doctl.NewMissingArgsErr(c.NS)
}
diID := c.Args[0]

tokens, err := c.DedicatedInferences().ListTokens(diID)
if err != nil {
return err
}

displayTokens := make([]do.DedicatedInferenceToken, len(tokens))
for i := range tokens {
displayTokens[i] = tokens[i]
}
return c.Display(&displayers.DedicatedInferenceTokenDisplayer{DedicatedInferenceTokens: displayTokens})
}

// RunDedicatedInferenceRevokeToken revokes an auth token for a dedicated inference endpoint.
func RunDedicatedInferenceRevokeToken(c *CmdConfig) error {
if len(c.Args) < 2 {
return doctl.NewMissingArgsErr(c.NS)
}
diID := c.Args[0]
tokenID := c.Args[1]

force, err := c.Doit.GetBool(c.NS, doctl.ArgForce)
if err != nil {
return err
}

if force || AskForConfirmDelete("dedicated inference token", 1) == nil {
return c.DedicatedInferences().RevokeToken(diID, tokenID)
}

return errOperationAborted
}

// RunDedicatedInferenceGetSizes returns available dedicated inference sizes and pricing.
func RunDedicatedInferenceGetSizes(c *CmdConfig) error {
_, sizes, err := c.DedicatedInferences().GetSizes()
if err != nil {
return err
}
return c.Display(&displayers.DedicatedInferenceSizeDisplayer{DedicatedInferenceSizes: sizes})
}

// RunDedicatedInferenceGetGPUModelConfig returns supported GPU model configurations.
func RunDedicatedInferenceGetGPUModelConfig(c *CmdConfig) error {
configs, err := c.DedicatedInferences().GetGPUModelConfig()
if err != nil {
return err
}
return c.Display(&displayers.DedicatedInferenceGPUModelConfigDisplayer{DedicatedInferenceGPUModelConfigs: configs})
}

// RunDedicatedInferenceDelete deletes a dedicated inference endpoint by ID.
func RunDedicatedInferenceDelete(c *CmdConfig) error {
if len(c.Args) < 1 {
Expand Down
Loading
Loading