Skip to main content

SDK Integration Guide

Official SDKs for integrating CODITECT DMS into your applications.


Python SDK

Installation

pip install coditect-dms

Quick Start

from coditect import DMSClient

# Initialize client
client = DMSClient(api_key="dms_prod_sk_...")

# Search documents
results = client.search("How do I implement authentication?")
for result in results:
print(f"{result.score:.2f}: {result.document_title}")
print(f" {result.content[:200]}")

# Upload document
doc = client.documents.upload("./my-document.md")
print(f"Uploaded: {doc.id} - Status: {doc.status}")

# Wait for processing
doc = client.documents.wait_for_processing(doc.id, timeout=120)
print(f"Processing complete: {doc.chunk_count} chunks")

Detailed Usage

Configuration

from coditect import DMSClient, Config

# Full configuration
config = Config(
api_key="dms_prod_sk_...",
base_url="https://dms-api.coditect.ai/api/v1",
timeout=30,
max_retries=3,
retry_backoff=1.5,
)

client = DMSClient(config=config)

# Or use environment variables
# CODITECT_API_KEY, CODITECT_API_URL
client = DMSClient()

Search Operations

from coditect import SearchMode

# Basic search
results = client.search("authentication")

# Advanced search
results = client.search(
query="How do I implement JWT authentication?",
mode=SearchMode.HYBRID,
top_k=20,
min_score=0.4,
include_content=True,
expand_context=True,
context_chunks=2,
)

# Iterate results
for result in results:
print(f"Score: {result.score}")
print(f"Document: {result.document_title}")
print(f"Section: {result.section_title}")
print(f"Content: {result.content}")
print(f"Context Before: {result.context_before}")
print(f"Context After: {result.context_after}")

GraphRAG Traversal

from coditect import RelationshipType

# Traverse from a chunk
context = client.graphrag.traverse(
seed_chunk_id="550e8400-e29b-41d4-a716-446655440001",
max_depth=2,
max_nodes=15,
relationship_types=[RelationshipType.SEQUENTIAL, RelationshipType.SEMANTIC],
min_weight=0.5,
)

print(f"Seed: {context.seed_chunk.content[:100]}")
print(f"Related: {len(context.related_chunks)} chunks")
print(f"Relationships: {len(context.relationships)}")

for chunk in context.related_chunks:
print(f" - {chunk.section_title}: {chunk.content[:50]}...")

Document Management

# List documents
docs = client.documents.list(
page=1,
page_size=50,
status="completed",
document_type="guide",
)

# Upload from file
doc = client.documents.upload("./security-guide.md")

# Upload with metadata
doc = client.documents.create(
filename="architecture.md",
content="# Architecture\n\n...",
document_type="adr",
keywords=["architecture", "design"],
tags=["v2"],
)

# Get document
doc = client.documents.get("550e8400-e29b-41d4-a716-446655440000")

# Update metadata
doc = client.documents.update(
doc_id=doc.id,
title="Updated Title",
summary="New summary",
)

# Get chunks
chunks = client.documents.get_chunks(doc.id)
for chunk in chunks:
print(f"Chunk {chunk.sequence_num}: {chunk.token_count} tokens")

# Delete document
client.documents.delete(doc.id)

Analytics

from datetime import datetime, timedelta
from coditect import MetricType, TimeGranularity

# Get dashboard metrics
dashboard = client.analytics.dashboard()
print(f"Total documents: {dashboard.document_metrics.total_documents}")
print(f"Total searches: {dashboard.search_metrics.total_searches}")

# Query time-series metrics
metrics = client.analytics.query_metrics(
metric_types=[MetricType.SEARCHES_PERFORMED, MetricType.DOCUMENTS_UPLOADED],
start_time=datetime.now() - timedelta(days=7),
end_time=datetime.now(),
granularity=TimeGranularity.DAY,
)

for series in metrics.series:
print(f"{series.label}: {series.total} total")

# Get usage for billing
usage = client.analytics.usage()
print(f"Documents: {usage.documents_uploaded}")
print(f"Searches: {usage.searches_performed}")
print(f"Cost: ${usage.embedding_cost_usd:.2f}")

Error Handling

from coditect import (
DMSError,
AuthenticationError,
RateLimitError,
NotFoundError,
ValidationError,
)

try:
results = client.search("query")
except AuthenticationError:
print("Invalid API key")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except NotFoundError:
print("Resource not found")
except ValidationError as e:
print(f"Validation error: {e.errors}")
except DMSError as e:
print(f"API error: {e.message}")

Async Support

import asyncio
from coditect import AsyncDMSClient

async def main():
client = AsyncDMSClient(api_key="dms_prod_sk_...")

# Concurrent searches
tasks = [
client.search("authentication"),
client.search("authorization"),
client.search("security"),
]
results = await asyncio.gather(*tasks)

for result in results:
print(f"Found {len(result)} results")

await client.close()

asyncio.run(main())

TypeScript/JavaScript SDK

Installation

npm install @coditect/dms-client
# or
yarn add @coditect/dms-client

Quick Start

import { DMSClient } from '@coditect/dms-client';

// Initialize client
const client = new DMSClient({
apiKey: 'dms_prod_sk_...',
});

// Search documents
const results = await client.search({
query: 'How do I implement authentication?',
mode: 'hybrid',
topK: 10,
});

results.forEach((result) => {
console.log(`${result.score.toFixed(2)}: ${result.documentTitle}`);
console.log(` ${result.content.slice(0, 200)}`);
});

// Upload document
const doc = await client.documents.upload('./my-document.md');
console.log(`Uploaded: ${doc.id} - Status: ${doc.status}`);

Detailed Usage

Configuration

import { DMSClient, Config } from '@coditect/dms-client';

const config: Config = {
apiKey: process.env.CODITECT_API_KEY!,
baseUrl: 'https://dms-api.coditect.ai/api/v1',
timeout: 30000,
retries: 3,
};

const client = new DMSClient(config);

Search Operations

import { SearchMode } from '@coditect/dms-client';

// Basic search
const results = await client.search({ query: 'authentication' });

// Advanced search
const results = await client.search({
query: 'How do I implement JWT authentication?',
mode: SearchMode.Hybrid,
topK: 20,
minScore: 0.4,
includeContent: true,
expandContext: true,
contextChunks: 2,
});

// Process results
for (const result of results) {
console.log(`Score: ${result.score}`);
console.log(`Document: ${result.documentTitle}`);
console.log(`Section: ${result.sectionTitle}`);
console.log(`Content: ${result.content}`);
}

GraphRAG Traversal

import { RelationshipType } from '@coditect/dms-client';

const context = await client.graphrag.traverse({
seedChunkId: '550e8400-e29b-41d4-a716-446655440001',
maxDepth: 2,
maxNodes: 15,
relationshipTypes: [RelationshipType.Sequential, RelationshipType.Semantic],
minWeight: 0.5,
});

console.log(`Seed: ${context.seedChunk.content.slice(0, 100)}`);
console.log(`Related: ${context.relatedChunks.length} chunks`);
console.log(`Relationships: ${context.relationships.length}`);

Document Management

// List documents
const docs = await client.documents.list({
page: 1,
pageSize: 50,
status: 'completed',
documentType: 'guide',
});

// Upload file (Node.js)
import fs from 'fs';
const file = fs.readFileSync('./security-guide.md');
const doc = await client.documents.upload(file, 'security-guide.md');

// Upload with metadata
const doc = await client.documents.create({
filename: 'architecture.md',
content: '# Architecture\n\n...',
documentType: 'adr',
keywords: ['architecture', 'design'],
tags: ['v2'],
});

// Get document
const doc = await client.documents.get('550e8400-...');

// Update metadata
const updated = await client.documents.update(doc.id, {
title: 'Updated Title',
summary: 'New summary',
});

// Delete document
await client.documents.delete(doc.id);

Analytics

import { MetricType, TimeGranularity } from '@coditect/dms-client';

// Get dashboard metrics
const dashboard = await client.analytics.dashboard();
console.log(`Total documents: ${dashboard.documentMetrics.totalDocuments}`);

// Query time-series metrics
const metrics = await client.analytics.queryMetrics({
metricTypes: [MetricType.SearchesPerformed, MetricType.DocumentsUploaded],
startTime: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
endTime: new Date(),
granularity: TimeGranularity.Day,
});

for (const series of metrics.series) {
console.log(`${series.label}: ${series.total} total`);
}

Error Handling

import {
DMSError,
AuthenticationError,
RateLimitError,
NotFoundError,
ValidationError,
} from '@coditect/dms-client';

try {
const results = await client.search({ query: 'test' });
} catch (error) {
if (error instanceof AuthenticationError) {
console.log('Invalid API key');
} else if (error instanceof RateLimitError) {
console.log(`Rate limited. Retry after ${error.retryAfter} seconds`);
} else if (error instanceof NotFoundError) {
console.log('Resource not found');
} else if (error instanceof ValidationError) {
console.log(`Validation error: ${JSON.stringify(error.errors)}`);
} else if (error instanceof DMSError) {
console.log(`API error: ${error.message}`);
}
}

React Integration

import { useDMS, DMSProvider } from '@coditect/dms-react';

// Wrap your app
function App() {
return (
<DMSProvider apiKey={process.env.REACT_APP_CODITECT_API_KEY!}>
<SearchComponent />
</DMSProvider>
);
}

// Use in components
function SearchComponent() {
const { search, isLoading, results, error } = useDMS();

const handleSearch = async (query: string) => {
await search({ query, mode: 'hybrid', topK: 10 });
};

return (
<div>
<input
type="text"
onChange={(e) => handleSearch(e.target.value)}
placeholder="Search documents..."
/>
{isLoading && <p>Searching...</p>}
{error && <p>Error: {error.message}</p>}
{results?.map((result) => (
<div key={result.chunkId}>
<h3>{result.documentTitle}</h3>
<p>{result.content}</p>
</div>
))}
</div>
);
}

Go SDK

Installation

go get github.com/coditect-ai/dms-go

Quick Start

package main

import (
"context"
"fmt"
"log"

dms "github.com/coditect-ai/dms-go"
)

func main() {
// Initialize client
client := dms.NewClient(dms.Config{
APIKey: "dms_prod_sk_...",
})

// Search documents
results, err := client.Search(context.Background(), &dms.SearchRequest{
Query: "How do I implement authentication?",
Mode: dms.SearchModeHybrid,
TopK: 10,
})
if err != nil {
log.Fatal(err)
}

for _, result := range results.Results {
fmt.Printf("%.2f: %s\n", result.Score, result.DocumentTitle)
fmt.Printf(" %s\n", result.Content[:200])
}
}

Detailed Usage

package main

import (
"context"
"fmt"
"os"
"time"

dms "github.com/coditect-ai/dms-go"
)

func main() {
ctx := context.Background()

// Initialize with config
client := dms.NewClient(dms.Config{
APIKey: os.Getenv("CODITECT_API_KEY"),
BaseURL: "https://dms-api.coditect.ai/api/v1",
Timeout: 30 * time.Second,
MaxRetries: 3,
})

// Upload document
file, _ := os.Open("./document.md")
defer file.Close()

doc, err := client.Documents.Upload(ctx, file, "document.md")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Uploaded: %s\n", doc.ID)

// Wait for processing
doc, err = client.Documents.WaitForProcessing(ctx, doc.ID, 120*time.Second)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Processed: %d chunks\n", doc.ChunkCount)

// Search
results, err := client.Search(ctx, &dms.SearchRequest{
Query: "authentication",
Mode: dms.SearchModeHybrid,
TopK: 10,
MinScore: 0.3,
IncludeContent: true,
})
if err != nil {
log.Fatal(err)
}

for _, r := range results.Results {
fmt.Printf("%.2f: %s\n", r.Score, r.DocumentTitle)
}

// Analytics
dashboard, err := client.Analytics.Dashboard(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Total docs: %d\n", dashboard.DocumentMetrics.TotalDocuments)
}

REST API (Direct)

For languages without an official SDK, use the REST API directly:

cURL Examples

# Search
curl -X POST https://dms-api.coditect.ai/api/v1/search \
-H "X-API-Key: $CODITECT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "authentication", "mode": "hybrid", "top_k": 10}'

# Upload document
curl -X POST https://dms-api.coditect.ai/api/v1/documents/upload \
-H "X-API-Key: $CODITECT_API_KEY" \
-F "file=@document.md"

# List documents
curl https://dms-api.coditect.ai/api/v1/documents \
-H "X-API-Key: $CODITECT_API_KEY"

# Get analytics
curl https://dms-api.coditect.ai/api/v1/analytics/dashboard \
-H "X-API-Key: $CODITECT_API_KEY"

Best Practices

Connection Pooling

# Python - reuse client instance
client = DMSClient(api_key="...")
# Use across requests

# TypeScript - singleton pattern
let client: DMSClient | null = null;
export function getClient(): DMSClient {
if (!client) {
client = new DMSClient({ apiKey: process.env.API_KEY! });
}
return client;
}

Error Handling

Always handle rate limits with exponential backoff:

import time
from coditect import RateLimitError

def search_with_retry(query, max_retries=3):
for attempt in range(max_retries):
try:
return client.search(query)
except RateLimitError as e:
if attempt == max_retries - 1:
raise
time.sleep(e.retry_after or (2 ** attempt))

Batch Operations

# Upload multiple documents efficiently
from concurrent.futures import ThreadPoolExecutor

files = ["doc1.md", "doc2.md", "doc3.md"]

with ThreadPoolExecutor(max_workers=5) as executor:
docs = list(executor.map(client.documents.upload, files))

Support