mirror of
https://github.com/coder/coder.git
synced 2026-09-24 06:47:27 +08:00
Adds create, list and delete endpoints for AI Gateway keys. Those keys are used to authenticate into Coderd. All endpoints require Owner permission.
83 lines
2.5 KiB
Go
83 lines
2.5 KiB
Go
package codersdk
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"golang.org/x/xerrors"
|
|
)
|
|
|
|
// AIGatewayKey is a shared secret used by a standalone AI Gateway
|
|
// to authenticate into coderd.
|
|
type AIGatewayKey struct {
|
|
ID uuid.UUID `json:"id" format:"uuid"`
|
|
Name string `json:"name"`
|
|
KeyPrefix string `json:"key_prefix"`
|
|
CreatedAt time.Time `json:"created_at" format:"date-time"`
|
|
LastUsedAt *time.Time `json:"last_used_at,omitempty" format:"date-time"`
|
|
}
|
|
|
|
// CreateAIGatewayKeyRequest requests a new AI Gateway key.
|
|
type CreateAIGatewayKeyRequest struct {
|
|
Name string `json:"name" validate:"required"`
|
|
}
|
|
|
|
// CreateAIGatewayKeyResponse returns all key information.
|
|
// Key value is only returned here and cannot be recovered afterwards.
|
|
type CreateAIGatewayKeyResponse struct {
|
|
ID uuid.UUID `json:"id" format:"uuid"`
|
|
Name string `json:"name"`
|
|
Key string `json:"key"`
|
|
KeyPrefix string `json:"key_prefix"`
|
|
CreatedAt time.Time `json:"created_at" format:"date-time"`
|
|
}
|
|
|
|
// CreateAIGatewayKey creates a new AI Gateway key.
|
|
func (c *Client) CreateAIGatewayKey(ctx context.Context, req CreateAIGatewayKeyRequest) (CreateAIGatewayKeyResponse, error) {
|
|
res, err := c.Request(ctx, http.MethodPost, "/api/v2/aibridge/keys", req)
|
|
if err != nil {
|
|
return CreateAIGatewayKeyResponse{}, xerrors.Errorf("make request: %w", err)
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if res.StatusCode != http.StatusCreated {
|
|
return CreateAIGatewayKeyResponse{}, ReadBodyAsError(res)
|
|
}
|
|
var resp CreateAIGatewayKeyResponse
|
|
return resp, json.NewDecoder(res.Body).Decode(&resp)
|
|
}
|
|
|
|
// ListAIGatewayKeys lists all AI Gateway keys.
|
|
func (c *Client) ListAIGatewayKeys(ctx context.Context) ([]AIGatewayKey, error) {
|
|
res, err := c.Request(ctx, http.MethodGet, "/api/v2/aibridge/keys", nil)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("make request: %w", err)
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if res.StatusCode != http.StatusOK {
|
|
return nil, ReadBodyAsError(res)
|
|
}
|
|
var resp []AIGatewayKey
|
|
return resp, json.NewDecoder(res.Body).Decode(&resp)
|
|
}
|
|
|
|
// DeleteAIGatewayKey deletes an AI Gateway key by ID.
|
|
func (c *Client) DeleteAIGatewayKey(ctx context.Context, id uuid.UUID) error {
|
|
res, err := c.Request(ctx, http.MethodDelete,
|
|
fmt.Sprintf("/api/v2/aibridge/keys/%s", id.String()), nil)
|
|
if err != nil {
|
|
return xerrors.Errorf("make request: %w", err)
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
if res.StatusCode != http.StatusNoContent {
|
|
return ReadBodyAsError(res)
|
|
}
|
|
return nil
|
|
}
|