129 lines
3.6 KiB
JavaScript
129 lines
3.6 KiB
JavaScript
// 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,
|
|
};
|