@agentdb/sdk
Version:
JavaScript SDK for AgentDB database service
196 lines (166 loc) • 7.9 kB
JavaScript
/**
* AgentDB SDK Template Management Example
*
* This example demonstrates how to use the template management features
* of the AgentDB SDK, including creating, listing, updating, and deleting templates.
*/
import { DatabaseService, ValidationError, AuthenticationError, DatabaseError } from '../index.js';
// Configuration - replace with your actual values
const BASE_URL = process.env.AGENTDB_BASE_URL || 'https://api.agentdb.dev';
const API_KEY = process.env.AGENTDB_API_KEY;
const TOKEN = process.env.AGENTDB_TOKEN || 'your-uuid-token-here';
if (!API_KEY) {
console.error('Please set AGENTDB_API_KEY environment variable');
process.exit(1);
}
async function runTemplateManagementExample() {
console.log('=== AgentDB SDK Template Management Example ===\n');
try {
// Initialize the database service
const service = new DatabaseService(BASE_URL, API_KEY, true); // Enable debug mode
console.log('1. Creating a new template...');
// Create a sample CRM template
const templateName = 'example-crm-template';
const initializationSql = [
`CREATE TABLE customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
phone TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`,
`CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
amount DECIMAL(10,2) NOT NULL,
status TEXT DEFAULT 'pending',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);`,
`CREATE INDEX idx_customers_email ON customers(email);`,
`CREATE INDEX idx_orders_customer_id ON orders(customer_id);`,
`INSERT INTO customers (name, email, phone) VALUES
('John Doe', 'john@example.com', '+1-555-0123'),
('Jane Smith', 'jane@example.com', '+1-555-0456');`
];
const description = 'Example CRM template with customers and orders tables, including sample data';
try {
const createdTemplate = await service.createTemplate(templateName, initializationSql, description);
console.log('✓ Template created successfully:', createdTemplate.templateName);
} catch (error) {
if (error.message.includes('already exists')) {
console.log('✓ Template already exists, continuing with example...');
} else {
throw error;
}
}
console.log('\n2. Listing all templates...');
const templates = await service.listTemplates();
console.log(`✓ Found ${templates.length} templates:`);
templates.forEach(template => {
console.log(` - ${template.templateName}: ${template.description}`);
});
console.log('\n3. Getting specific template details...');
const templateDetails = await service.getTemplate(templateName);
console.log('✓ Template details:');
console.log(` Name: ${templateDetails.templateName}`);
console.log(` Description: ${templateDetails.description}`);
console.log(` SQL Scripts: ${templateDetails.initializationSql.length} scripts`);
console.log(` Created: ${templateDetails.createdAt}`);
console.log('\n4. Testing template with a database...');
// Create a connection to test the template
const dbName = 'template-test-db';
const connection = service.connect(TOKEN, dbName, 'sqlite');
// Execute a query to create the database and apply the template
console.log('Creating database with template...');
await connection.execute({
sql: 'SELECT 1', // Simple query to create the database
templateName: templateName // This will apply the template
});
console.log('\n5. Getting template info for the database...');
const templateInfo = await service.getTemplateInfo(templateName, TOKEN, dbName, 'sqlite');
console.log('✓ Template info:');
console.log(` Applied: ${templateInfo.isApplied}`);
console.log(` Current Version: ${templateInfo.currentVersion}`);
console.log(` Total Versions: ${templateInfo.totalVersions}`);
console.log(` Schema: ${templateInfo.schema.length} tables/indexes`);
console.log('\n6. Getting applied templates for the database...');
const appliedTemplates = await service.getAppliedTemplates(TOKEN, dbName, 'sqlite');
console.log('✓ Applied templates:');
appliedTemplates.appliedTemplates.forEach(template => {
console.log(` - ${template.templateName} (version ${template.version}) applied at ${template.appliedAt}`);
});
console.log('\n7. Testing natural language to SQL...');
const nlQuery = 'show me all customers with their order count';
const nlResult = await connection.naturalLanguageToSql(nlQuery, null, templateName);
console.log('✓ Natural language conversion:');
console.log(` Query: "${nlQuery}"`);
console.log(` Generated SQL: ${nlResult.sql}`);
if (nlResult.results) {
console.log(` Results: ${nlResult.results[0].rows.length} rows returned`);
}
console.log('\n8. Updating the template...');
const updatedSql = [
...initializationSql,
`ALTER TABLE customers ADD COLUMN address TEXT;`,
`CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price DECIMAL(10,2) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);`
];
const updatedDescription = 'Updated CRM template with address field and products table';
const updateResult = await service.updateTemplate(templateName, updatedSql, updatedDescription);
console.log('✓ Template updated successfully');
console.log(` Previous version had ${updateResult.oldTemplate.initializationSql.length} SQL scripts`);
console.log(` New version has ${updatedSql.length} SQL scripts`);
console.log('\n9. Testing MCP slug creation...');
const mcpParams = {
apiKey: 'example-key',
token: TOKEN,
dbName: dbName,
templateName: templateName
};
try {
const slugResult = await service.createMcpSlug(mcpParams);
console.log('✓ MCP slug created:');
console.log(` Slug: ${slugResult.slug}`);
console.log(` Full URL: ${slugResult.fullUrl}`);
// Test getting the slug back
const slugInfo = await service.getMcpSlug(slugResult.slug);
console.log('✓ Retrieved slug info:');
console.log(` Query params: ${Object.keys(slugInfo.queryParams).join(', ')}`);
} catch (error) {
console.log('⚠ MCP slug creation failed (may require authentication):', error.message);
}
console.log('\n10. Cleaning up - deleting test database...');
await service.deleteDatabase(TOKEN, dbName, 'sqlite');
console.log('✓ Test database deleted');
console.log('\n11. Cleaning up - deleting template...');
const deleteResult = await service.deleteTemplate(templateName);
console.log('✓ Template deleted successfully');
console.log('\n=== Template Management Example Complete ===');
} catch (error) {
console.error('\n❌ Error during template management example:');
if (error instanceof AuthenticationError) {
console.error('Authentication failed. Please check your API key.');
} else if (error instanceof ValidationError) {
console.error('Validation error:', error.message);
} else if (error instanceof DatabaseError) {
console.error('Database error:', error.message);
} else {
console.error('Unexpected error:', error.message);
}
// Log debug information if available
if (error.response && error.response.debugLogs) {
console.error('\nDebug logs:');
error.response.debugLogs.forEach(log => {
console.error(`[${log.level}] ${log.timestamp}: ${log.message}`);
});
}
process.exit(1);
}
}
// Run the example
runTemplateManagementExample();