Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
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
66 changes: 66 additions & 0 deletions docs/components/DigitalOcean.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { CardGrid, LinkCard } from "@astrojs/starlight/components";
<LinkCard title="Create App" href="#create-app" description="Create a new DigitalOcean App Platform application with services, static sites, workers, or jobs" />
<LinkCard title="Create DNS Record" href="#create-dns-record" description="Create a DNS record for a DigitalOcean domain" />
<LinkCard title="Create Droplet" href="#create-droplet" description="Create a new DigitalOcean Droplet" />
<LinkCard title="Create Knowledge Base" href="#create-knowledge-base" description="Create a DigitalOcean Gradient AI knowledge base with one or more data sources" />
<LinkCard title="Create Load Balancer" href="#create-load-balancer" description="Create a DigitalOcean Load Balancer with forwarding rules and targets" />
<LinkCard title="Create Snapshot" href="#create-snapshot" description="Create a snapshot of a DigitalOcean Droplet" />
<LinkCard title="Delete Alert Policy" href="#delete-alert-policy" description="Delete a DigitalOcean monitoring alert policy" />
Expand Down Expand Up @@ -472,6 +473,71 @@ Returns the created droplet object including:
}
```

<a id="create-knowledge-base"></a>

## Create Knowledge Base

The Create Knowledge Base component creates a new knowledge base on the DigitalOcean Gradient AI Platform, ready for use with AI agents via retrieval-augmented generation (RAG).

### How it works

A knowledge base converts your data sources into vector embeddings using the selected embedding model. Those embeddings are stored in an OpenSearch database — either a newly provisioned one or one you already have. Once created, the knowledge base can be attached to any Gradient AI agent.

### Data Sources

You can add multiple data sources of different types:

- **Spaces Bucket or Folder** — indexes all supported files in a DigitalOcean Spaces bucket or folder
- **Web or Sitemap URL** — crawls a public website (seed URL) or a list of URLs from a sitemap

Each data source has its own independent chunking strategy.

### Chunking Strategies

- **Section-based** (default) — splits on structural elements like headings and paragraphs; fast and low-cost
- **Semantic** — groups sentences by meaning; slower but context-aware
- **Hierarchical** — creates parent (context) and child (retrieval) chunk pairs
- **Fixed-length** — splits strictly by token count; best for logs and unstructured text

### OpenSearch Database

The knowledge base requires an OpenSearch database to store the vector embeddings:
- **Create new** — provisions a new database automatically sized to your data
- **Use existing** — connects to a database you already have by providing its ID

### Output

Returns the created knowledge base including:
- **uuid**: Knowledge base UUID for use in downstream components
- **name**: Name of the knowledge base
- **region**: Datacenter region
- **embeddingModelUUID**: UUID of the embedding model used
- **projectId**: Associated project ID
- **databaseId**: UUID of the OpenSearch database (empty when creating new)
- **createdAt**: Creation timestamp

### Example Output

```json
{
"data": {
"createdAt": "2025-01-01T00:00:00Z",
"databaseId": "abf1055a-745d-4c24-a1db-1959ea819264",
"embeddingModelUUID": "05700391-7aa8-11ef-bf8f-4e013e2ddde4",
"name": "my-knowledge-base",
"projectId": "37455431-84bd-4fa2-94cf-e8486f8f8c5e",
"region": "tor1",
"tags": [
"docs",
"production"
],
"uuid": "20cd8434-6ea1-11f0-bf8f-4e013e2ddde4"
},
"timestamp": "2025-01-01T00:00:00Z",
"type": "digitalocean.knowledge_base.created"
}
```

<a id="create-load-balancer"></a>

## Create Load Balancer
Expand Down
183 changes: 183 additions & 0 deletions pkg/integrations/digitalocean/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2289,6 +2289,189 @@ func (c *Client) ListApps() ([]App, error) {
return response.Apps, nil
}

// EmbeddingModel represents a DigitalOcean Gradient AI embedding model
type EmbeddingModel struct {
UUID string `json:"uuid"`
Name string `json:"name"`
Description string `json:"description"`
KBMinChunkSize int `json:"kb_min_chunk_size"`
KBMaxChunkSize int `json:"kb_max_chunk_size"`
KBDefaultChunkSize int `json:"kb_default_chunk_size"`
}

// ListEmbeddingModels retrieves all embedding models available for knowledge base vectorization
func (c *Client) ListEmbeddingModels() ([]EmbeddingModel, error) {
url := fmt.Sprintf("%s/gen-ai/models?usecases=MODEL_USECASE_KNOWLEDGEBASE&per_page=200", c.BaseURL)
responseBody, err := c.execRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}

var response struct {
Models []EmbeddingModel `json:"models"`
}

if err := json.Unmarshal(responseBody, &response); err != nil {
return nil, fmt.Errorf("error parsing response: %v", err)
}

return response.Models, nil
}

// Project represents a DigitalOcean project
type Project struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Purpose string `json:"purpose"`
Environment string `json:"environment"`
IsDefault bool `json:"is_default"`
}

// ListProjects retrieves all projects in the account
func (c *Client) ListProjects() ([]Project, error) {
url := fmt.Sprintf("%s/projects?per_page=200", c.BaseURL)
responseBody, err := c.execRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}

var response struct {
Projects []Project `json:"projects"`
}

if err := json.Unmarshal(responseBody, &response); err != nil {
return nil, fmt.Errorf("error parsing response: %v", err)
}

return response.Projects, nil
}

// Database represents a DigitalOcean managed database cluster
type Database struct {
ID string `json:"id"`
Name string `json:"name"`
Engine string `json:"engine"`
Status string `json:"status"`
}

// ListDatabasesByEngine retrieves all managed database clusters filtered by engine
func (c *Client) ListDatabasesByEngine(engine string) ([]Database, error) {
url := fmt.Sprintf("%s/databases?engine=%s&per_page=200", c.BaseURL, engine)
responseBody, err := c.execRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}

var response struct {
Databases []Database `json:"databases"`
}

if err := json.Unmarshal(responseBody, &response); err != nil {
return nil, fmt.Errorf("error parsing response: %v", err)
}

return response.Databases, nil
}

// KnowledgeBase represents a DigitalOcean Gradient AI knowledge base
type KnowledgeBase struct {
UUID string `json:"uuid"`
Name string `json:"name"`
EmbeddingModelUUID string `json:"embedding_model_uuid"`
Region string `json:"region"`
ProjectID string `json:"project_id"`
Tags []string `json:"tags"`
DatabaseID string `json:"database_id"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
}

// KBSpacesDataSource defines a Spaces bucket data source for a knowledge base
type KBSpacesDataSource struct {
BucketName string `json:"bucket_name"`
Region string `json:"region"`
}

// KBWebCrawlerDataSource defines a web crawler data source for a knowledge base
type KBWebCrawlerDataSource struct {
BaseURL string `json:"base_url"`
CrawlingOption string `json:"crawling_option,omitempty"`
EmbedMedia bool `json:"embed_media"`
ExcludeTags []string `json:"exclude_tags,omitempty"`
}

// KBChunkingOptions defines chunking configuration for a knowledge base data source
type KBChunkingOptions struct {
MaxChunkSize int `json:"max_chunk_size,omitempty"`
SemanticThreshold float64 `json:"semantic_threshold,omitempty"`
ParentChunkSize int `json:"parent_chunk_size,omitempty"`
ChildChunkSize int `json:"child_chunk_size,omitempty"`
}

// KBDataSource represents a single data source in a knowledge base
type KBDataSource struct {
SpacesDataSource *KBSpacesDataSource `json:"spaces_data_source,omitempty"`
WebCrawlerDataSource *KBWebCrawlerDataSource `json:"web_crawler_data_source,omitempty"`
ChunkingAlgorithm string `json:"chunking_algorithm,omitempty"`
ChunkingOptions *KBChunkingOptions `json:"chunking_options,omitempty"`
}

// CreateKnowledgeBaseRequest is the payload for POST /v2/gen-ai/knowledge_bases
type CreateKnowledgeBaseRequest struct {
Name string `json:"name"`
EmbeddingModelUUID string `json:"embedding_model_uuid"`
Region string `json:"region"`
ProjectID string `json:"project_id"`
Tags []string `json:"tags,omitempty"`
DatabaseID string `json:"database_id,omitempty"`
DataSources []KBDataSource `json:"datasources,omitempty"`
}

// CreateKnowledgeBase creates a new Gradient AI knowledge base
func (c *Client) CreateKnowledgeBase(req CreateKnowledgeBaseRequest) (*KnowledgeBase, error) {
url := fmt.Sprintf("%s/gen-ai/knowledge_bases", c.BaseURL)

body, err := json.Marshal(req)
if err != nil {
return nil, fmt.Errorf("error marshaling request: %v", err)
}

responseBody, err := c.execRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
return nil, err
}

var response struct {
KnowledgeBase KnowledgeBase `json:"knowledge_base"`
}

if err := json.Unmarshal(responseBody, &response); err != nil {
return nil, fmt.Errorf("error parsing response: %v", err)
}

return &response.KnowledgeBase, nil
}

// ListKnowledgeBases retrieves all knowledge bases in the account
func (c *Client) ListKnowledgeBases() ([]KnowledgeBase, error) {
url := fmt.Sprintf("%s/gen-ai/knowledge_bases?per_page=200", c.BaseURL)
responseBody, err := c.execRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}

var response struct {
KnowledgeBases []KnowledgeBase `json:"knowledge_bases"`
}

if err := json.Unmarshal(responseBody, &response); err != nil {
return nil, fmt.Errorf("error parsing response: %v", err)
}

return response.KnowledgeBases, nil
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unused ListKnowledgeBases function is dead code

Low Severity

ListKnowledgeBases is a new exported method added in this PR but has zero callers anywhere in the codebase. It's not referenced in list_resources.go, not used in create_knowledge_base.go, and not called from any other file. This is dead code that adds maintenance burden without providing value.

Fix in Cursor Fix in Web


// AppNodeMetadata stores metadata about an app for display in the UI
type AppNodeMetadata struct {
AppID string `json:"appId" mapstructure:"appId"`
Expand Down
Loading
Loading