// src/services/init.service.js // 초기 데이터 설정 서비스 const { User, LLMProvider } = require('../models'); const logger = require('../config/logger.config'); /** * 초기 관리자 계정 생성 */ async function createDefaultAdmin() { try { const adminEmail = process.env.ADMIN_EMAIL || 'admin@admin.com'; const adminPassword = process.env.ADMIN_PASSWORD || 'Admin123!'; const existing = await User.findOne({ where: { email: adminEmail } }); if (existing) { logger.info(`관리자 계정 이미 존재: ${adminEmail}`); return existing; } const admin = await User.create({ email: adminEmail, password: adminPassword, name: '관리자', role: 'admin', status: 'active', plan: 'enterprise', monthlyTokenLimit: 10000000, // 1000만 토큰 }); logger.info(`✅ 기본 관리자 계정 생성: ${adminEmail}`); return admin; } catch (error) { logger.error('관리자 계정 생성 실패:', error); throw error; } } /** * 기본 LLM 프로바이더 생성 */ async function createDefaultProviders() { try { const providers = [ { name: 'gemini', displayName: 'Google Gemini', endpoint: null, apiKey: process.env.GEMINI_API_KEY || '', modelName: process.env.GEMINI_MODEL || 'gemini-2.0-flash', priority: 1, maxTokens: 8192, temperature: 0.7, timeoutMs: 60000, costPer1kInputTokens: 0.00025, costPer1kOutputTokens: 0.001, }, { name: 'openai', displayName: 'OpenAI GPT', endpoint: 'https://api.openai.com/v1/chat/completions', apiKey: process.env.OPENAI_API_KEY || '', modelName: process.env.OPENAI_MODEL || 'gpt-4o-mini', priority: 2, maxTokens: 4096, temperature: 0.7, timeoutMs: 60000, costPer1kInputTokens: 0.00015, costPer1kOutputTokens: 0.0006, }, { name: 'claude', displayName: 'Anthropic Claude', endpoint: 'https://api.anthropic.com/v1/messages', apiKey: process.env.CLAUDE_API_KEY || '', modelName: process.env.CLAUDE_MODEL || 'claude-3-haiku-20240307', priority: 3, maxTokens: 4096, temperature: 0.7, timeoutMs: 60000, costPer1kInputTokens: 0.00025, costPer1kOutputTokens: 0.00125, }, ]; for (const providerData of providers) { const existing = await LLMProvider.findOne({ where: { name: providerData.name } }); if (existing) { // API 키가 환경변수에 설정되어 있고 DB에는 없으면 업데이트 if (providerData.apiKey && !existing.apiKey) { existing.apiKey = providerData.apiKey; existing.modelName = providerData.modelName; await existing.save(); logger.info(`LLM 프로바이더 API 키 업데이트: ${providerData.name}`); } continue; } await LLMProvider.create({ ...providerData, isActive: true, isHealthy: !!providerData.apiKey, // API 키가 있으면 healthy }); logger.info(`✅ LLM 프로바이더 생성: ${providerData.name} (${providerData.modelName})`); } } catch (error) { logger.error('LLM 프로바이더 생성 실패:', error); throw error; } } /** * 초기화 실행 */ async function initialize() { logger.info('🔧 초기 데이터 설정 시작...'); await createDefaultAdmin(); await createDefaultProviders(); logger.info('✅ 초기 데이터 설정 완료'); } module.exports = { initialize, createDefaultAdmin, createDefaultProviders, };