配置
Qwen Image Edit 环境配置完整指南
配置
本指南涵盖了 Qwen Image Edit 的所有配置选项,包括环境变量、模型设置和部署配置。
环境变量
必需变量
这些环境变量对基本功能至关重要:
# API 认证
QWEN_API_KEY=your_api_key_here
QWEN_API_URL=https://api.qwen.com/v1 # 可选,默认为官方 API
# 应用设置
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXTAUTH_SECRET=your_nextauth_secret_here
NEXTAUTH_URL=http://localhost:3000
可选变量
这些变量提供额外的配置选项:
# 模型配置
QWEN_MODEL_VERSION=latest # 使用的模型版本
QWEN_MAX_IMAGE_SIZE=4096 # 最大图片尺寸
QWEN_DEFAULT_QUALITY=high # 默认输出质量
QWEN_TIMEOUT=30000 # 请求超时时间(毫秒)
# 速率限制
QWEN_RATE_LIMIT_RPM=60 # 每分钟请求数
QWEN_RATE_LIMIT_RPD=1000 # 每天请求数
QWEN_CONCURRENT_REQUESTS=5 # 最大并发请求数
# 缓存
REDIS_URL=redis://localhost:6379 # Redis 缓存
CACHE_TTL=3600 # 缓存生存时间(秒)
ENABLE_CACHE=true # 启用/禁用缓存
# 存储
S3_BUCKET_NAME=your-bucket-name # AWS S3 存储桶
S3_REGION=us-east-1 # AWS 区域
AWS_ACCESS_KEY_ID=your_access_key # AWS 凭证
AWS_SECRET_ACCESS_KEY=your_secret_key # AWS 凭证
# 监控
SENTRY_DSN=your_sentry_dsn # 错误追踪
LOG_LEVEL=info # 日志级别(debug, info, warn, error)
ENABLE_METRICS=true # 启用性能指标
# 开发
DEBUG_MODE=false # 启用调试日志
MOCK_API=false # 使用模拟 API 响应
DEV_TOOLS=false # 启用开发工具
模型配置
可用模型
Qwen Image Edit 支持多种模型变体:
// 模型配置选项
const modelConfig = {
// 文本编辑模型
textEdit: {
model: 'qwen-image-edit-text-v1', // 标准文本编辑
precision: 'high', // high, medium, low
language: 'auto', // auto, en, zh, es, fr 等
preserveStyle: true // 保留原始文本样式
},
// 语义编辑模型
semanticEdit: {
model: 'qwen-image-edit-semantic-v1', // 标准语义编辑
strength: 0.7, // 编辑强度(0.1-1.0)
guidance: 7.5, // 引导比例
steps: 20 // 推理步数
},
// 专用模型
specialized: {
portrait: 'qwen-image-edit-portrait-v1', // 人像优化
landscape: 'qwen-image-edit-landscape-v1', // 风景优化
product: 'qwen-image-edit-product-v1', // 产品优化
artistic: 'qwen-image-edit-artistic-v1' // 艺术内容优化
}
};
模型选择策略
// 基于内容自动选择模型
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];
};
性能配置
图像处理设置
// 性能优化设置
const performanceConfig = {
// 图像预处理
preprocessing: {
autoResize: true, // 自动调整大图片尺寸
maxDimension: 2048, // 最大宽度/高度
quality: 0.9, // JPEG 质量(0.1-1.0)
format: 'auto', // auto, jpeg, png, webp
compression: 'balanced' // fast, balanced, quality
},
// 处理优化
processing: {
batchSize: 4, // 每批图片数量
parallelRequests: 2, // 并发 API 请求数
retryAttempts: 3, // 重试失败请求次数
retryDelay: 1000, // 重试间隔(毫秒)
timeout: 60000 // 请求超时(毫秒)
},
// 内存管理
memory: {
maxCacheSize: '500MB', // 最大缓存大小
gcInterval: 300000, // 垃圾回收间隔(毫秒)
preloadImages: false, // 预加载常用图片
lazyLoading: true // 启用懒加载
}
};
缓存配置
// 缓存策略配置
const cacheConfig = {
// Redis 配置
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 // 默认 TTL(秒)
},
// 缓存策略
policies: {
images: {
ttl: 7200, // 处理后图片缓存 2 小时
maxSize: '100MB', // 每个缓存项最大大小
compression: true // 压缩缓存数据
},
metadata: {
ttl: 86400, // 元数据缓存 24 小时
maxEntries: 10000 // 最大缓存条目数
},
results: {
ttl: 3600, // API 结果缓存 1 小时
invalidateOnError: true // 错误时清除缓存
}
}
};
安全配置
API 安全
// 安全配置
const securityConfig = {
// API 认证
authentication: {
apiKeyHeader: 'X-API-Key', // 自定义 API 密钥头
rateLimiting: {
windowMs: 60000, // 1 分钟窗口
maxRequests: 100, // 每窗口最大请求数
skipSuccessfulRequests: false, // 计算成功请求
skipFailedRequests: false // 计算失败请求
},
ipWhitelist: [], // 允许的 IP 地址
userAgent: 'QwenImageEdit/1.0' // 必需的用户代理
},
// 输入验证
validation: {
maxFileSize: '10MB', // 最大上传大小
allowedFormats: ['jpg', 'jpeg', 'png', 'webp'],
maxInstructionLength: 1000, // 指令最大字符数
sanitizeInputs: true, // 清理用户输入
validateUrls: true // 验证图片 URL
},
// 输出安全
output: {
watermarkResults: false, // 为结果添加水印
stripMetadata: true, // 移除 EXIF 数据
contentFiltering: true, // 过滤不当内容
virusScan: false // 扫描恶意软件
}
};
CORS 配置
// Web 应用的 CORS 设置
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 小时
};
部署配置
Docker 配置
# Dockerfile
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制包文件
COPY package*.json ./
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 构建应用
RUN npm run build
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 暴露端口
EXPOSE 3000
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/api/health || exit 1
# 启动应用
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 配置
# 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.yml(用于 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
监控和日志
日志配置
// 日志配置
const loggingConfig = {
level: process.env.LOG_LEVEL || 'info',
format: 'json',
// 控制台日志
console: {
enabled: true,
colorize: process.env.NODE_ENV !== 'production',
timestamp: true
},
// 文件日志
file: {
enabled: true,
filename: 'logs/app.log',
maxSize: '10MB',
maxFiles: 5,
compress: true
},
// 外部日志服务
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
}
}
};
指标配置
// 指标和监控
const metricsConfig = {
// Prometheus 指标
prometheus: {
enabled: true,
endpoint: '/metrics',
defaultLabels: {
service: 'qwen-image-edit',
version: process.env.APP_VERSION
}
},
// 自定义指标
custom: {
requestDuration: true, // 跟踪请求持续时间
requestCount: true, // 跟踪请求计数
errorRate: true, // 跟踪错误率
imageProcessingTime: true, // 跟踪处理时间
cacheHitRate: true, // 跟踪缓存性能
apiUsage: true // 跟踪 API 使用情况
},
// 健康检查
health: {
endpoint: '/api/health',
checks: [
'database',
'redis',
'external-api',
'disk-space',
'memory-usage'
]
}
};
配置验证
// 配置验证模式
import Joi from 'joi';
const configSchema = Joi.object({
// 必需配置
QWEN_API_KEY: Joi.string().required(),
NODE_ENV: Joi.string().valid('development', 'production', 'test').default('development'),
// 带默认值的可选配置
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),
// 缓存配置
REDIS_URL: Joi.string().uri().optional(),
CACHE_TTL: Joi.number().integer().min(60).max(86400).default(3600),
// 安全配置
RATE_LIMIT_RPM: Joi.number().integer().min(1).max(1000).default(60),
MAX_FILE_SIZE: Joi.string().regex(/^\d+[KMGT]?B$/i).default('10MB')
});
// 启动时验证配置
const validateConfig = () => {
const { error, value } = configSchema.validate(process.env, {
allowUnknown: true,
stripUnknown: false
});
if (error) {
throw new Error(`配置验证失败: ${error.message}`);
}
return value;
};
export const config = validateConfig();
本配置指南为 Qwen Image Edit 部署和运行的各个方面提供了全面的设置。请根据您的具体需求和环境约束调整这些设置。