feat: V2-7 Admin 콘솔 리디자인 + 3단계 권한 + SaaS 전환 + 코드 정리
- Admin CRM: D3RO Console 스타일 전체 적용 (panelSx/tableSx/filterBtnSx) - 3단계 권한: manager/admin/super_admin (DB + Edge Functions + Frontend) - 랜딩 페이지: 1회 결제 → 월간/연간 구독 SaaS 모델 (10개 언어) - SSE 스트리밍: VoiceConversation Premium LLM 라우팅 + fallback - Supabase 클라이언트: packages/api-client 공통 추출 (browser+server) - RPC 함수 타입: 9개 정의 (admin_usage_by_feature 등) - callAdminApi 401 버그 수정 (getUser() 선행 토큰 갱신)
This commit is contained in:
parent
d0e854c255
commit
8af75a0a1e
50 changed files with 2185 additions and 950 deletions
|
|
@ -269,18 +269,16 @@ class VoiceConversationService extends EventEmitter {
|
|||
this._setState('thinking')
|
||||
|
||||
try {
|
||||
// Ollama /api/chat 호출 (스트리밍)
|
||||
const llmService = getLocalLLMService()
|
||||
const chatMessages = this._buildChatMessages()
|
||||
// LLM 백엔드 선택: premium 설정 + 사용 가능 → PremiumLLM, 아니면 LocalLLM
|
||||
const { generator: chatGenerator, backend } = await this._createChatStream()
|
||||
logger.info(`Conversation LLM backend: ${backend}`)
|
||||
|
||||
const assistantMsgId = crypto.randomUUID()
|
||||
let accumulated = ''
|
||||
const ttsSentences: string[] = []
|
||||
let sentenceBuffer = ''
|
||||
|
||||
const generator = llmService.chatStream(chatMessages)
|
||||
|
||||
for await (const token of generator) {
|
||||
for await (const token of chatGenerator) {
|
||||
accumulated += token
|
||||
|
||||
// 렌더러에 델타 전송
|
||||
|
|
@ -359,6 +357,34 @@ class VoiceConversationService extends EventEmitter {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* LLM 백엔드 선택 + chatStream 생성.
|
||||
* premium 설정 + 사용 가능 → PremiumLLM, 실패 시 LocalLLM fallback.
|
||||
*/
|
||||
private async _createChatStream(): Promise<{
|
||||
generator: AsyncGenerator<string, string>
|
||||
backend: 'local' | 'premium'
|
||||
}> {
|
||||
const chatMessages = this._buildChatMessages()
|
||||
const backend = configGet('llmBackend')
|
||||
|
||||
if (backend === 'premium') {
|
||||
try {
|
||||
const { getPremiumLLMService } = await import('./PremiumLLMService')
|
||||
const premium = getPremiumLLMService()
|
||||
if (premium.isAvailable()) {
|
||||
return { generator: premium.chatStream(chatMessages), backend: 'premium' }
|
||||
}
|
||||
logger.warn('Premium LLM not available for conversation, falling back to local')
|
||||
} catch (err) {
|
||||
logger.warn('Premium LLM init failed for conversation:', err instanceof Error ? err.message : String(err))
|
||||
}
|
||||
}
|
||||
|
||||
const local = getLocalLLMService()
|
||||
return { generator: local.chatStream(chatMessages), backend: 'local' }
|
||||
}
|
||||
|
||||
private _buildChatMessages(): Array<{ role: string; content: string }> {
|
||||
const chatMsgs: Array<{ role: string; content: string }> = [
|
||||
{ role: 'system', content: SYSTEM_PROMPT },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue