Go SDK
The SixDegree Go SDK is a type-safe, auto-generated client for interacting with the SixDegree platform API. The SDK is automatically generated from the OpenAPI specification using ogen, ensuring it stays in sync with the platform API.
Installation
go get github.com/sixdegree-ai/go-sixdegree
Requirements:
- Go 1.24 or later
Quick Start
package main
import (
"context"
"log"
v1 "github.com/sixdegree-ai/go-sixdegree/sixdegree/v1"
)
func main() {
// Create client with API token
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithToken("your-api-token"),
)
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
// List environments
envs, err := client.ListEnvironments(ctx, &v1.ListEnvironmentsParams{})
if err != nil {
log.Fatal(err)
}
for _, env := range envs.Environments {
log.Printf("Environment: %s (ID: %s)\n", env.Name, env.ID)
}
}
Authentication
API Token Authentication
The SDK supports token-based authentication using the WithToken option:
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithToken("sd_your_api_token"),
)
Environment Variable
Set the token via environment variable:
export SIXDEGREE_API_TOKEN="sd_your_api_token"
import "os"
token := os.Getenv("SIXDEGREE_API_TOKEN")
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithToken(token),
)
Custom HTTP Client
For advanced scenarios, provide a custom HTTP client:
import "net/http"
httpClient := &http.Client{
Timeout: 30 * time.Second,
}
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithClient(httpClient),
v1.WithToken("your-token"),
)
Environments
Environments provide isolated namespaces for your entities and relationships.
List Environments
result, err := client.ListEnvironments(ctx, &v1.ListEnvironmentsParams{})
if err != nil {
return err
}
for _, env := range result.Environments {
log.Printf("Environment: %s (ID: %s)\n", env.Name, env.ID)
}
Get Environment
env, err := client.GetEnvironment(ctx, &v1.GetEnvironmentParams{
EnvironmentID: "env_abc123",
})
if err != nil {
return err
}
log.Printf("Environment: %s\n", env.Name)
log.Printf("Created: %s\n", env.CreatedAt)
Create Environment
result, err := client.CreateEnvironment(ctx, &v1.CreateEnvironmentRequest{
Name: "Production",
Description: v1.NewOptString("Production environment"),
})
if err != nil {
return err
}
log.Printf("Created environment: %s\n", result.ID)
Delete Environment
err := client.DeleteEnvironment(ctx, &v1.DeleteEnvironmentParams{
EnvironmentID: "env_abc123",
})
if err != nil {
return err
}
Entities
Entities represent the nodes in your knowledge graph.
List Entities
result, err := client.ListEntities(ctx, &v1.ListEntitiesParams{
EnvironmentID: "env_abc123",
Kind: v1.NewOptString("Repository"),
Limit: v1.NewOptInt(100),
Offset: v1.NewOptInt(0),
})
if err != nil {
return err
}
for _, entity := range result.Entities {
log.Printf("Entity: %s (Kind: %s)\n", entity.Name, entity.Kind)
}
log.Printf("Total: %d, Page: %d of %d\n",
result.Total, result.Page, result.TotalPages)
Get Entity
entity, err := client.GetEntity(ctx, &v1.GetEntityParams{
EnvironmentID: "env_abc123",
EntityUID: "repo_xyz789",
})
if err != nil {
return err
}
log.Printf("Entity: %s\n", entity.Name)
log.Printf("Kind: %s\n", entity.Kind)
log.Printf("Properties: %+v\n", entity.Properties)
Create Entity
result, err := client.CreateEntity(ctx, &v1.CreateEntityRequest{
EnvironmentID: "env_abc123",
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "Service",
Name: "auth-service",
Properties: v1.NewOptCreateEntityReqProperties(v1.CreateEntityReqProperties{
"url": "https://auth.example.com",
"port": 8080,
}),
})
if err != nil {
return err
}
log.Printf("Created entity: %s\n", result.UID)
Update Entity
result, err := client.UpdateEntity(ctx, &v1.UpdateEntityRequest{
EnvironmentID: "env_abc123",
EntityUID: "service_xyz",
Properties: v1.NewOptUpdateEntityReqProperties(v1.UpdateEntityReqProperties{
"status": "active",
"replicas": 3,
}),
})
if err != nil {
return err
}
Delete Entity
err := client.DeleteEntity(ctx, &v1.DeleteEntityParams{
EnvironmentID: "env_abc123",
EntityUID: "service_xyz",
})
if err != nil {
return err
}
Bulk Create Entities
For creating multiple entities efficiently:
entities := []v1.CreateEntityRequest{
{
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "Service",
Name: "api-service",
},
{
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "Service",
Name: "web-service",
},
}
result, err := client.CreateEntitiesBulk(ctx, &v1.CreateEntitiesBulkRequest{
EnvironmentID: "env_abc123",
Entities: entities,
})
if err != nil {
return err
}
log.Printf("Created: %d, Failed: %d\n", result.SuccessCount, result.FailureCount)
for _, failure := range result.Failures {
log.Printf("Failed: %s - %s\n", failure.Name, failure.Error)
}
Get Entity Relationships
result, err := client.GetEntityRelations(ctx, &v1.GetEntityRelationsParams{
EnvironmentID: "env_abc123",
EntityUID: "repo_xyz",
})
if err != nil {
return err
}
for _, rel := range result.Relations {
log.Printf("%s -[%s]-> %s\n", rel.From, rel.Type, rel.To)
}
Create Relationship
result, err := client.CreateEntityRelation(ctx, &v1.CreateEntityRelationRequest{
EnvironmentID: "env_abc123",
From: "repo_xyz",
To: "service_abc",
Type: "DEPLOYS_TO",
Properties: v1.NewOptCreateEntityRelationReqProperties(v1.CreateEntityRelationReqProperties{
"environment": "production",
"version": "v1.2.3",
}),
})
if err != nil {
return err
}
log.Printf("Created relationship: %s\n", result.ID)
Bulk Create Relationships
relations := []v1.CreateEntityRelationRequest{
{From: "repo1", To: "service1", Type: "DEPLOYS_TO"},
{From: "repo2", To: "service2", Type: "DEPLOYS_TO"},
}
result, err := client.CreateEntityRelationsBulk(ctx, &v1.CreateEntityRelationsBulkRequest{
EnvironmentID: "env_abc123",
Relations: relations,
})
if err != nil {
return err
}
log.Printf("Created: %d, Failed: %d\n", result.SuccessCount, result.FailureCount)
Chat
The Chat API provides AI-powered interactions with your knowledge graph.
Create Chat Session
result, err := client.CreateChat(ctx, &v1.CreateChatRequest{
EnvironmentID: "env_abc123",
ModelID: v1.NewOptString("claude-3-5-sonnet-20241022"),
})
if err != nil {
return err
}
chatID := result.ID
log.Printf("Created chat session: %s\n", chatID)
List Chat Sessions
result, err := client.ListChats(ctx, &v1.ListChatsParams{
EnvironmentID: "env_abc123",
Limit: v1.NewOptInt(20),
})
if err != nil {
return err
}
for _, chat := range result.Chats {
log.Printf("Chat: %s - %s\n", chat.ID, chat.Title)
}
Get Chat History
result, err := client.GetChat(ctx, &v1.GetChatParams{
EnvironmentID: "env_abc123",
ChatID: "chat_xyz",
})
if err != nil {
return err
}
for _, msg := range result.Messages {
log.Printf("[%s] %s\n", msg.Role, msg.Content)
}
Send Chat Message (Non-Streaming)
result, err := client.CreateChatCompletions(ctx, &v1.CreateChatCompletionsRequest{
EnvironmentID: "env_abc123",
ChatID: "chat_xyz",
Messages: []v1.ChatMessage{
{
Role: "user",
Content: "What repositories depend on the auth service?",
},
},
Stream: v1.NewOptBool(false),
})
if err != nil {
return err
}
log.Printf("Response: %s\n", result.Choices[0].Message.Content)
Streaming Chat
For real-time streaming responses:
import "io"
result, err := client.CreateChatCompletions(ctx, &v1.CreateChatCompletionsRequest{
EnvironmentID: "env_abc123",
ChatID: "chat_xyz",
Messages: []v1.ChatMessage{
{
Role: "user",
Content: "Explain the architecture of my system",
},
},
Stream: v1.NewOptBool(true),
})
if err != nil {
return err
}
// Handle streaming response
for {
chunk, err := result.Read()
if err == io.EOF {
break
}
if err != nil {
return err
}
if len(chunk.Choices) > 0 {
fmt.Print(chunk.Choices[0].Delta.Content)
}
}
Chat Suggestions
Get AI-suggested questions based on the knowledge graph:
result, err := client.GetChatSuggestions(ctx, &v1.GetChatSuggestionsParams{
EnvironmentID: "env_abc123",
})
if err != nil {
return err
}
for _, suggestion := range result.Suggestions {
log.Printf("Suggested question: %s\n", suggestion.Text)
}
MCP (Model Context Protocol)
List MCP Endpoints
result, err := client.ListMcpendpoints(ctx, &v1.ListMcpendpointsParams{
EnvironmentID: "env_abc123",
})
if err != nil {
return err
}
for _, endpoint := range result.Endpoints {
log.Printf("MCP Endpoint: %s (%s)\n", endpoint.Name, endpoint.Transport)
}
Create MCP Endpoint
result, err := client.CreateMcpendpoint(ctx, &v1.CreateMcpendpointRequest{
EnvironmentID: "env_abc123",
Name: "PostgreSQL Tools",
URL: "https://mcp-postgres.example.com",
Transport: "http",
AuthConfig: v1.NewOptCreateMcpendpointReqAuthConfig(v1.CreateMcpendpointReqAuthConfig{
"type": "bearer",
"token": "your-token",
}),
})
if err != nil {
return err
}
log.Printf("Created MCP endpoint: %s\n", result.ID)
List Available MCP Tools
result, err := client.ListMcptools(ctx, &v1.ListMcptoolsParams{
EnvironmentID: "env_abc123",
McpendpointID: v1.NewOptString("mcp_xyz"),
})
if err != nil {
return err
}
for _, tool := range result.Tools {
log.Printf("Tool: %s - %s\n", tool.Name, tool.Description)
}
Discovery
List Configured Molecules
result, err := client.ListConfiguredMolecules(ctx, &v1.ListConfiguredMoleculesParams{
EnvironmentID: "env_abc123",
})
if err != nil {
return err
}
for _, mol := range result.Molecules {
log.Printf("Molecule: %s (Status: %s)\n", mol.Name, mol.Status)
}
Create Configured Molecule
result, err := client.CreateConfiguredMolecule(ctx, &v1.CreateConfiguredMoleculeRequest{
EnvironmentID: "env_abc123",
MoleculeID: "github",
Configuration: v1.NewOptCreateConfiguredMoleculeReqConfiguration(
v1.CreateConfiguredMoleculeReqConfiguration{
"token": "ghp_your_token",
"orgs": []string{"myorg"},
},
),
})
if err != nil {
return err
}
log.Printf("Configured molecule: %s\n", result.ID)
Run Discovery
result, err := client.RunDiscovery(ctx, &v1.RunDiscoveryParams{
EnvironmentID: "env_abc123",
MoleculeID: v1.NewOptString("github"),
})
if err != nil {
return err
}
log.Printf("Discovery run started: %s\n", result.RunID)
Check Discovery Status
result, err := client.GetDiscoveryRun(ctx, &v1.GetDiscoveryRunParams{
EnvironmentID: "env_abc123",
RunID: "run_xyz",
})
if err != nil {
return err
}
log.Printf("Status: %s\n", result.Status)
log.Printf("Entities discovered: %d\n", result.EntitiesCreated)
Context and Timeouts
Use context for cancellation and timeouts:
import "time"
// Request with timeout
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
result, err := client.ListEntities(ctx, &v1.ListEntitiesParams{
EnvironmentID: "env_abc123",
})
if err != nil {
if errors.Is(err, context.DeadlineExceeded) {
log.Println("Request timed out")
}
return err
}
Error Handling
The SDK uses structured errors from ogen:
import "github.com/ogen-go/ogen/ogenerrors"
result, err := client.GetEntity(ctx, &v1.GetEntityParams{
EnvironmentID: "env_abc123",
EntityUID: "entity_xyz",
})
if err != nil {
// Check for specific error types
if errors.Is(err, context.Canceled) {
log.Println("Request was canceled")
return err
}
if errors.Is(err, context.DeadlineExceeded) {
log.Println("Request timed out")
return err
}
// Check for API errors
var apiErr *ogenerrors.ErrorStatusCode
if errors.As(err, &apiErr) {
log.Printf("API error (status %d): %s\n", apiErr.StatusCode, apiErr.Response)
return err
}
log.Printf("Unexpected error: %v\n", err)
return err
}
Handling Not Found Errors
entity, err := client.GetEntity(ctx, &v1.GetEntityParams{
EnvironmentID: "env_abc123",
EntityUID: "entity_xyz",
})
if err != nil {
var apiErr *ogenerrors.ErrorStatusCode
if errors.As(err, &apiErr) && apiErr.StatusCode == 404 {
log.Println("Entity not found")
return nil // Handle gracefully
}
return err
}
Pagination
Handle paginated responses:
const pageSize = 100
offset := 0
for {
result, err := client.ListEntities(ctx, &v1.ListEntitiesParams{
EnvironmentID: "env_abc123",
Limit: v1.NewOptInt(pageSize),
Offset: v1.NewOptInt(offset),
})
if err != nil {
return err
}
// Process entities
for _, entity := range result.Entities {
log.Printf("Entity: %s\n", entity.Name)
}
// Check if more pages
if offset+pageSize >= result.Total {
break
}
offset += pageSize
}
Testing
Using the SDK in Tests
package myapp_test
import (
"context"
"testing"
v1 "github.com/sixdegree-ai/go-sixdegree/sixdegree/v1"
)
func TestCreateEntity(t *testing.T) {
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithToken(getTestToken()),
)
if err != nil {
t.Fatal(err)
}
ctx := context.Background()
result, err := client.CreateEntity(ctx, &v1.CreateEntityRequest{
EnvironmentID: "test_env",
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "TestEntity",
Name: "test-entity",
})
if err != nil {
t.Fatalf("Failed to create entity: %v", err)
}
if result.UID == "" {
t.Error("Expected non-empty entity UID")
}
// Cleanup
defer client.DeleteEntity(ctx, &v1.DeleteEntityParams{
EnvironmentID: "test_env",
EntityUID: result.UID,
})
}
func getTestToken() string {
// Load from environment or test config
return os.Getenv("SIXDEGREE_TEST_TOKEN")
}
Complete Example
Here's a complete example that demonstrates common workflows:
package main
import (
"context"
"log"
"time"
v1 "github.com/sixdegree-ai/go-sixdegree/sixdegree/v1"
)
func main() {
// Create client
client, err := v1.NewClient(
"https://api.sixdegree.ai",
v1.WithToken("your-api-token"),
)
if err != nil {
log.Fatal(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
envID := "env_abc123"
// 1. Create entities
log.Println("Creating entities...")
entities := []v1.CreateEntityRequest{
{
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "Repository",
Name: "api-service",
Properties: v1.NewOptCreateEntityReqProperties(v1.CreateEntityReqProperties{
"language": "Go",
"url": "https://github.com/org/api-service",
}),
},
{
Group: "core",
Version: "v1",
Namespace: "default",
Kind: "Service",
Name: "api-production",
Properties: v1.NewOptCreateEntityReqProperties(v1.CreateEntityReqProperties{
"url": "https://api.prod.example.com",
}),
},
}
bulkResult, err := client.CreateEntitiesBulk(ctx, &v1.CreateEntitiesBulkRequest{
EnvironmentID: envID,
Entities: entities,
})
if err != nil {
log.Fatal(err)
}
log.Printf("Created %d entities\n", bulkResult.SuccessCount)
// 2. Create relationship
log.Println("Creating relationship...")
_, err = client.CreateEntityRelation(ctx, &v1.CreateEntityRelationRequest{
EnvironmentID: envID,
From: bulkResult.Entities[0].UID,
To: bulkResult.Entities[1].UID,
Type: "DEPLOYS_TO",
})
if err != nil {
log.Fatal(err)
}
// 3. Query entities
log.Println("Querying entities...")
listResult, err := client.ListEntities(ctx, &v1.ListEntitiesParams{
EnvironmentID: envID,
Kind: v1.NewOptString("Repository"),
})
if err != nil {
log.Fatal(err)
}
for _, entity := range listResult.Entities {
log.Printf("Found: %s (UID: %s)\n", entity.Name, entity.UID)
// Get relationships
relations, err := client.GetEntityRelations(ctx, &v1.GetEntityRelationsParams{
EnvironmentID: envID,
EntityUID: entity.UID,
})
if err != nil {
log.Printf("Failed to get relations: %v\n", err)
continue
}
for _, rel := range relations.Relations {
log.Printf(" -> %s [%s]\n", rel.To, rel.Type)
}
}
// 4. Chat with AI about the entities
log.Println("Creating chat session...")
chatResult, err := client.CreateChat(ctx, &v1.CreateChatRequest{
EnvironmentID: envID,
})
if err != nil {
log.Fatal(err)
}
completion, err := client.CreateChatCompletions(ctx, &v1.CreateChatCompletionsRequest{
EnvironmentID: envID,
ChatID: chatResult.ID,
Messages: []v1.ChatMessage{
{
Role: "user",
Content: "What services are deployed from the api-service repository?",
},
},
Stream: v1.NewOptBool(false),
})
if err != nil {
log.Fatal(err)
}
log.Printf("AI Response: %s\n", completion.Choices[0].Message.Content)
}
Additional Resources
- Building Molecules - Create custom data discovery modules
- SDK Repository - Source code and examples