TwinMind Multi-Environment Setup
Overview
Configure TwinMind for development, staging, and production environments with proper isolation and promotion workflows.
Prerequisites
- Multiple TwinMind accounts or API keys per environment
- Understanding of environment management
- CI/CD pipeline for deployments
Instructions
Step 1: Environment Configuration Structure
// src/config/environments.ts
export type Environment = 'development' | 'staging' | 'production';
export interface EnvironmentConfig {
name: Environment;
twinmind: {
apiKey: string;
baseUrl: string;
webhookSecret: string;
model: 'ear-2' | 'ear-3' | 'ear-3-custom';
features: {
diarization: boolean;
autoSummary: boolean;
actionItems: boolean;
debug: boolean;
};
};
limits: {
rateLimit: number;
concurrentJobs: number;
dailyQuota?: number;
};
integrations: {
slack?: { webhook: string; channel: string };
calendar?: { enabled: boolean };
email?: { enabled: boolean };
};
}
// Environment-specific configurations
const configs: Record<Environment, Partial<EnvironmentConfig>> = {
development: {
name: 'development',
twinmind: {
apiKey: process.env.TWINMIND_API_KEY_DEV!,
baseUrl: 'https://api.twinmind.com/v1',
webhookSecret: process.env.TWINMIND_WEBHOOK_SECRET_DEV!,
model: 'ear-2', // Use cheaper model in dev
features: {
diarization: false, // Faster without diarization
autoSummary: true,
actionItems: true,
debug: true,
},
},
limits: {
rateLimit: 30,
concurrentJobs: 1,
dailyQuota: 10, // Limit dev usage
},
integrations: {
slack: { webhook: process.env.SLACK_WEBHOOK_DEV!, channel: '#dev-alerts' },
calendar: { enabled: false },
email: { enabled: false },
},
},
staging: {
name: 'staging',
twinmind: {
apiKey: process.env.TWINMIND_API_KEY_STAGING!,
baseUrl: 'https://api.twinmind.com/v1',
webhookSecret: process.env.TWINMIND_WEBHOOK_SECRET_STAGING!,
model: 'ear-3',
features: {
diarization: true,
autoSummary: true,
actionItems: true,
debug: true,
},
},
limits: {
rateLimit: 60,
concurrentJobs: 2,
dailyQuota: 50,
},
integrations: {
slack: { webhook: process.env.SLACK_WEBHOOK_STAGING!, channel: '#staging-alerts' },
calendar: { enabled: true },
email: { enabled: false }, // No real emails in staging
},
},
production: {
name: 'production',
twinmind: {
apiKey: process.env.TWINMIND_API_KEY_PROD!,
baseUrl: 'https://api.twinmind.com/v1',
webhookSecret: process.env.TWINMIND_WEBHOOK_SECRET_PROD!,
model: 'ear-3',
features: {
diarization: true,
autoSummary: true,
actionItems: true,
debug: false, // No debug in production
},
},
limits: {
rateLimit: 300, // Enterprise limits
concurrentJobs: 10,
},
integrations: {
slack: { webhook: process.env.SLACK_WEBHOOK_PROD!, channel: '#production-alerts' },
calendar: { enabled: true },
email: { enabled: true },
},
},
};
export function getEnvironmentConfig(): EnvironmentConfig {
const env = (process.env.NODE_ENV || 'development') as Environment;
const config = configs[env];
if (!config) {
throw new Error(`Unknown environment: ${env}`);
}
return config as EnvironmentConfig;
}