Configuration

Complete guide to configuring Qwen Image Edit for your environment

Configuration

This guide covers all configuration options for Qwen Image Edit, including environment variables, model settings, and deployment configurations.

Environment Variables

Required Variables

These environment variables are essential for basic functionality:

# API Authentication
QWEN_API_KEY=your_api_key_here
QWEN_API_URL=https://api.qwen.com/v1  # Optional, defaults to official API

# Application Settings
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXTAUTH_SECRET=your_nextauth_secret_here
NEXTAUTH_URL=http://localhost:3000

Optional Variables

These variables provide additional configuration options:

# Model Configuration
QWEN_MODEL_VERSION=latest                    # Model version to use
QWEN_MAX_IMAGE_SIZE=4096                     # Maximum image dimension
QWEN_DEFAULT_QUALITY=high                    # Default output quality
QWEN_TIMEOUT=30000                          # Request timeout in milliseconds

# Rate Limiting
QWEN_RATE_LIMIT_RPM=60                      # Requests per minute
QWEN_RATE_LIMIT_RPD=1000                    # Requests per day
QWEN_CONCURRENT_REQUESTS=5                   # Max concurrent requests

# Caching
REDIS_URL=redis://localhost:6379            # Redis for caching
CACHE_TTL=3600                              # Cache time-to-live in seconds
ENABLE_CACHE=true                           # Enable/disable caching

# Storage
S3_BUCKET_NAME=your-bucket-name             # AWS S3 bucket for image storage
S3_REGION=us-east-1                         # AWS region
AWS_ACCESS_KEY_ID=your_access_key           # AWS credentials
AWS_SECRET_ACCESS_KEY=your_secret_key       # AWS credentials

# Monitoring
SENTRY_DSN=your_sentry_dsn                  # Error tracking
LOG_LEVEL=info                              # Logging level (debug, info, warn, error)
ENABLE_METRICS=true                         # Enable performance metrics

# Development
DEBUG_MODE=false                            # Enable debug logging
MOCK_API=false                              # Use mock API responses
DEV_TOOLS=false                             # Enable development tools

Model Configuration

Available Models

Qwen Image Edit supports multiple model variants:

// Model configuration options
const modelConfig = {
  // Text editing models
  textEdit: {
    model: 'qwen-image-edit-text-v1',     // Standard text editing
    precision: 'high',                     // high, medium, low
    language: 'auto',                      // auto, en, zh, es, fr, etc.
    preserveStyle: true                     // Preserve original text style
  },
  
  // Semantic editing models
  semanticEdit: {
    model: 'qwen-image-edit-semantic-v1',  // Standard semantic editing
    strength: 0.7,                         // Edit strength (0.1-1.0)
    guidance: 7.5,                         // Guidance scale
    steps: 20                              // Inference steps
  },
  
  // Specialized models
  specialized: {
    portrait: 'qwen-image-edit-portrait-v1',    // Optimized for portraits
    landscape: 'qwen-image-edit-landscape-v1',  // Optimized for landscapes
    product: 'qwen-image-edit-product-v1',      // Optimized for products
    artistic: 'qwen-image-edit-artistic-v1'     // Optimized for artistic content
  }
};

Model Selection Strategy

// Automatic model selection based on content
const selectOptimalModel = (imageType: string, editType: string) => {
  const modelMap = {
    'portrait': {
      'text-edit': 'qwen-image-edit-portrait-text-v1',
      'semantic-edit': 'qwen-image-edit-portrait-v1'
    },
    'product': {
      'text-edit': 'qwen-image-edit-product-text-v1',
      'semantic-edit': 'qwen-image-edit-product-v1'
    },
    'general': {
      'text-edit': 'qwen-image-edit-text-v1',
      'semantic-edit': 'qwen-image-edit-semantic-v1'
    }
  };
  
  return modelMap[imageType]?.[editType] || modelMap['general'][editType];
};

Performance Configuration

Image Processing Settings

// Performance optimization settings
const performanceConfig = {
  // Image preprocessing
  preprocessing: {
    autoResize: true,                    // Automatically resize large images
    maxDimension: 2048,                  // Maximum width/height
    quality: 0.9,                       // JPEG quality (0.1-1.0)
    format: 'auto',                     // auto, jpeg, png, webp
    compression: 'balanced'              // fast, balanced, quality
  },
  
  // Processing optimization
  processing: {
    batchSize: 4,                       // Images per batch
    parallelRequests: 2,                // Concurrent API requests
    retryAttempts: 3,                   // Retry failed requests
    retryDelay: 1000,                   // Delay between retries (ms)
    timeout: 60000                      // Request timeout (ms)
  },
  
  // Memory management
  memory: {
    maxCacheSize: '500MB',              // Maximum cache size
    gcInterval: 300000,                 // Garbage collection interval (ms)
    preloadImages: false,               // Preload frequently used images
    lazyLoading: true                   // Enable lazy loading
  }
};

Caching Configuration

// Caching strategy configuration
const cacheConfig = {
  // Redis configuration
  redis: {
    host: process.env.REDIS_HOST || 'localhost',
    port: parseInt(process.env.REDIS_PORT || '6379'),
    password: process.env.REDIS_PASSWORD,
    db: parseInt(process.env.REDIS_DB || '0'),
    keyPrefix: 'qwen-image-edit:',
    ttl: 3600 // Default TTL in seconds
  },
  
  // Cache policies
  policies: {
    images: {
      ttl: 7200,                        // 2 hours for processed images
      maxSize: '100MB',                 // Maximum size per cached item
      compression: true                 // Compress cached data
    },
    metadata: {
      ttl: 86400,                       // 24 hours for metadata
      maxEntries: 10000                 // Maximum cache entries
    },
    results: {
      ttl: 3600,                        // 1 hour for API results
      invalidateOnError: true           // Clear cache on errors
    }
  }
};

Security Configuration

API Security

// Security configuration
const securityConfig = {
  // API authentication
  authentication: {
    apiKeyHeader: 'X-API-Key',          // Custom API key header
    rateLimiting: {
      windowMs: 60000,                  // 1 minute window
      maxRequests: 100,                 // Max requests per window
      skipSuccessfulRequests: false,    // Count successful requests
      skipFailedRequests: false         // Count failed requests
    },
    ipWhitelist: [],                    // Allowed IP addresses
    userAgent: 'QwenImageEdit/1.0'      // Required user agent
  },
  
  // Input validation
  validation: {
    maxFileSize: '10MB',                // Maximum upload size
    allowedFormats: ['jpg', 'jpeg', 'png', 'webp'],
    maxInstructionLength: 1000,         // Max characters in instructions
    sanitizeInputs: true,               // Sanitize user inputs
    validateUrls: true                  // Validate image URLs
  },
  
  // Output security
  output: {
    watermarkResults: false,            // Add watermarks to results
    stripMetadata: true,                // Remove EXIF data
    contentFiltering: true,             // Filter inappropriate content
    virusScan: false                    // Scan for malware
  }
};

CORS Configuration

// CORS settings for web applications
const corsConfig = {
  origin: [
    'http://localhost:3000',
    'https://yourdomain.com',
    'https://*.yourdomain.com'
  ],
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: [
    'Content-Type',
    'Authorization',
    'X-API-Key',
    'X-Requested-With'
  ],
  credentials: true,
  maxAge: 86400 // 24 hours
};

Deployment Configurations

Docker Configuration

# Dockerfile
FROM node:18-alpine

# Set working directory
WORKDIR /app

# Copy package files
COPY package*.json ./
RUN npm ci --only=production

# Copy application code
COPY . .

# Build application
RUN npm run build

# Set environment variables
ENV NODE_ENV=production
ENV PORT=3000

# Expose port
EXPOSE 3000

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/api/health || exit 1

# Start application
CMD ["npm", "start"]
# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - QWEN_API_KEY=${QWEN_API_KEY}
      - REDIS_URL=redis://redis:6379
    depends_on:
      - redis
    restart: unless-stopped
    
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: unless-stopped
    
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - app
    restart: unless-stopped

volumes:
  redis_data:

Kubernetes Configuration

# k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: qwen-image-edit
  labels:
    app: qwen-image-edit
spec:
  replicas: 3
  selector:
    matchLabels:
      app: qwen-image-edit
  template:
    metadata:
      labels:
        app: qwen-image-edit
    spec:
      containers:
      - name: app
        image: qwen-image-edit:latest
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: "production"
        - name: QWEN_API_KEY
          valueFrom:
            secretKeyRef:
              name: qwen-secrets
              key: api-key
        - name: REDIS_URL
          value: "redis://redis-service:6379"
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /api/health
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/ready
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: qwen-image-edit-service
spec:
  selector:
    app: qwen-image-edit
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000
  type: LoadBalancer

Serverless Configuration

# serverless.yml (for AWS Lambda)
service: qwen-image-edit

provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
  environment:
    QWEN_API_KEY: ${env:QWEN_API_KEY}
    NODE_ENV: production
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:GetObject
        - s3:PutObject
      Resource: "arn:aws:s3:::your-bucket/*"

functions:
  textEdit:
    handler: src/handlers/textEdit.handler
    events:
      - http:
          path: /api/text-edit
          method: post
          cors: true
    timeout: 30
    memorySize: 1024
    
  semanticEdit:
    handler: src/handlers/semanticEdit.handler
    events:
      - http:
          path: /api/semantic-edit
          method: post
          cors: true
    timeout: 60
    memorySize: 2048

plugins:
  - serverless-webpack
  - serverless-offline

Monitoring and Logging

Logging Configuration

// Logging configuration
const loggingConfig = {
  level: process.env.LOG_LEVEL || 'info',
  format: 'json',
  
  // Console logging
  console: {
    enabled: true,
    colorize: process.env.NODE_ENV !== 'production',
    timestamp: true
  },
  
  // File logging
  file: {
    enabled: true,
    filename: 'logs/app.log',
    maxSize: '10MB',
    maxFiles: 5,
    compress: true
  },
  
  // External logging services
  external: {
    sentry: {
      enabled: !!process.env.SENTRY_DSN,
      dsn: process.env.SENTRY_DSN,
      environment: process.env.NODE_ENV,
      tracesSampleRate: 0.1
    },
    datadog: {
      enabled: !!process.env.DD_API_KEY,
      apiKey: process.env.DD_API_KEY,
      service: 'qwen-image-edit',
      version: process.env.APP_VERSION
    }
  }
};

Metrics Configuration

// Metrics and monitoring
const metricsConfig = {
  // Prometheus metrics
  prometheus: {
    enabled: true,
    endpoint: '/metrics',
    defaultLabels: {
      service: 'qwen-image-edit',
      version: process.env.APP_VERSION
    }
  },
  
  // Custom metrics
  custom: {
    requestDuration: true,      // Track request duration
    requestCount: true,         // Track request count
    errorRate: true,           // Track error rate
    imageProcessingTime: true, // Track processing time
    cacheHitRate: true,        // Track cache performance
    apiUsage: true             // Track API usage
  },
  
  // Health checks
  health: {
    endpoint: '/api/health',
    checks: [
      'database',
      'redis',
      'external-api',
      'disk-space',
      'memory-usage'
    ]
  }
};

Configuration Validation

// Configuration validation schema
import Joi from 'joi';

const configSchema = Joi.object({
  // Required configurations
  QWEN_API_KEY: Joi.string().required(),
  NODE_ENV: Joi.string().valid('development', 'production', 'test').default('development'),
  
  // Optional configurations with defaults
  QWEN_API_URL: Joi.string().uri().default('https://api.qwen.com/v1'),
  QWEN_TIMEOUT: Joi.number().integer().min(1000).max(300000).default(30000),
  QWEN_MAX_IMAGE_SIZE: Joi.number().integer().min(512).max(8192).default(4096),
  
  // Cache configuration
  REDIS_URL: Joi.string().uri().optional(),
  CACHE_TTL: Joi.number().integer().min(60).max(86400).default(3600),
  
  // Security configuration
  RATE_LIMIT_RPM: Joi.number().integer().min(1).max(1000).default(60),
  MAX_FILE_SIZE: Joi.string().regex(/^\d+[KMGT]?B$/i).default('10MB')
});

// Validate configuration on startup
const validateConfig = () => {
  const { error, value } = configSchema.validate(process.env, {
    allowUnknown: true,
    stripUnknown: false
  });
  
  if (error) {
    throw new Error(`Configuration validation failed: ${error.message}`);
  }
  
  return value;
};

export const config = validateConfig();

This configuration guide provides comprehensive settings for all aspects of Qwen Image Edit deployment and operation. Adjust these settings based on your specific requirements and environment constraints.