feat: Add Qwen model integration with cloud-based auto-detection This commit integrates Alibaba Cloud's Qwen (通义千问) model into EDA Service with automatic model selection based on database cluster cloud provider. Key Features: - Auto-detect cloud provider and switch to Qwen for Alibaba Cloud clusters - Dual-layer API key management (system-level + user-level) - International DashScope endpoint support - Complete error handling with UnauthorizedException (401) - Retry mechanism with exponential backoff (3 attempts, 60-120s) - JSON format repair for structured outputs Implementation: - New files: * svc/qwen.py (296 lines) - Qwen API integration module * tests/test_qwen.py (346 lines) - 17 unit tests * tests/test_qwen_e2e.py (191 lines) - End-to-end tests * docs/QWEN_IMPLEMENTATION_SUMMARY.md - Complete implementation summary - Modified files: * consts/consts.py - Add Qwen model constants * config.py - Add QWEN_API_KEY configuration * requirements.txt - Add dashscope>=1.14.0 dependency * svc/openai.py - Add Qwen routing in ai_completion() * svc/eda_task.py - Add _determine_model_by_cloud_provider() method * tests/test_chat2query_tasks.py - Add 6 cloud detection integration tests Testing: - Unit tests: 17/17 passed (using Mock) - Integration tests: 6/6 passed (cloud detection logic) - End-to-end tests: 3/3 passed (with real API) * Text generation: 18 tokens (in) + 15 tokens (out) * JSON format: SELECT * FROM users; * Multi-model: Qwen Turbo & Plus both working Environment Variables: - QWEN_API_KEY: Required for Qwen API access - DASHSCOPE_BASE_URL: Optional, defaults to international endpoint (https://dashscope-intl.aliyuncs.com/api/v1) Architecture: - Maintains consistency with existing OpenAI/Claude integrations - Forces Qwen model on Alibaba Cloud clusters (overrides user preference) - Gracefully falls back to original model if cloud detection fails Total changes: ~850 lines of code across 12 files Status: ✅ All tests passed, ready for production Co-Authored-By: Claude Sonnet 4.5