package network import java.io.File import java.io.BufferedReader import java.io.InputStreamReader import kotlinx.coroutines.* object LlamaServerManager { private var process: Process? = null private val scope = CoroutineScope(Dispatchers.IO + Job()) fun startServer(binPath: String, modelPath: String) { if (process != null || modelPath.isNullOrBlank()) return // 이미 실행 중이면 무시 val command = listOf( binPath, "-m", modelPath, "--port", "8080", "-c", "2048", // 컨텍스트 길이 "-t", "4", // 인텔 맥 코어 수에 맞춰 스레드 제한 (부하 방지) "--embedding" // 나중에 유사도 분석 등을 위해 활성화 ) scope.launch { try { val pb = ProcessBuilder(command) // 실행 파일 권한 확인 (자동 부여) File(binPath).setExecutable(true) process = pb.start() println("✅ AI 서버 시작됨: http://localhost:8080") // 서버 로그 모니터링 (에러 디버깅용) val reader = BufferedReader(InputStreamReader(process?.inputStream)) var line: String? while (reader.readLine().also { line = it } != null) { // 서버 준비 완료 로그 확인용 if (line?.contains("HTTP server listening") == true) { println("🚀 AI 모델 로딩 완료 및 대기 중") } } } catch (e: Exception) { println("❌ AI 서버 실행 실패: ${e.message}") } } } fun stopServer() { process?.destroy() process = null println("🛑 AI 서버 종료") } }