빅뱅 8/8 마지막 성공 기준 달성. Supabase Edge Function(llm-proxy)을 통해 Anthropic Claude를 호출하는 PremiumLLMService 신규 구현. 사용자가 Settings에서 Local/Premium 백엔드를 선택하면 VoiceModeService가 자동 분기하고, Premium 실패 시 Local로 silent fallback + 상단 중앙 배너 알림. 실측: Claude Haiku refine 1.6~3.2초 (이전 qwen3 42.9초 → 13~27배 빠름). 주요 변경: - PremiumLLMService 신규 (싱글톤+EventEmitter, processText/chatStream, Supabase functions.invoke 기반, _ensureAuth 가드) - llm-prompts.ts: SYSTEM_PROMPTS를 Local/Premium 공유 모듈로 추출 (resolveSystemPrompt 헬퍼) - VoiceModeService: _getLLMProcessor → _runProcessorWithFallback 라우터 + premium-llm-fallback 이벤트 - CloudSyncService: getAccessToken(async), getAnonKey, invokeFunction(auth 헤더 자동 처리, 에러 body 파싱) - IPC: LLM.PREMIUM_* 채널 6개 + preload API + llm-handlers 이벤트 전달 (safeSendToRenderer 헬퍼) - AppConfig.llmBackend: 'local' | 'premium' (기본 'local') - Settings UI: Backend 드롭다운 + Premium 선택 시 Ollama UI 숨김 + 라이선스 모달 자동 오픈 - AppLayout: 상단 중앙 Snackbar fallback 배너 (8초, warning filled) - LicenseModal: 라이선스 키 입력 제거 → SaaS 구독 관리 UI 전환 (Free/Pro/Pro+ 업그레이드 버튼, Payple 준비 중 스텁) - 등급 비교 표: featureLabel i18n 번역 수정 서버 (Supabase Edge Functions): - quota.ts: 모델별 쿼터 구조 (llm_haiku/sonnet/opus × free/pro/pro_plus), 주간/일간 기간 분리, modelToQuotaKey 매핑, consumeQuota baseLimit 파라미터화 - llm-proxy: 모델별 쿼터 체크 + 소비 (checkQuota → consumeQuota 원자적), verify_jwt=false (2026 sb_publishable_ 키 호환) - config.toml: llm-proxy verify_jwt = false - migration 20260412000001: tier team→pro_plus 통일, subscriptions.overage_credits 컬럼, consume_quota RPC (원자적 base→overage fallback) Tier/쿼터: - free: Haiku 250/주간, Sonnet/Opus 불가 - pro ₩9,900: Haiku 1500/일, Sonnet 300/일, Opus 50/일 - pro_plus ₩29,900: Haiku 무제한, Sonnet 1500/일, Opus 300/일 - api-client SubscriptionTier: team→pro_plus, overage_credits 필드 추가
113 lines
1.9 KiB
TOML
113 lines
1.9 KiB
TOML
# Supabase 프로젝트 설정 (로컬 개발 + CLI 기준)
|
|
# 공식 문서: https://supabase.com/docs/guides/cli/config
|
|
|
|
project_id = "d3ro-voice"
|
|
|
|
[api]
|
|
enabled = true
|
|
port = 54321
|
|
schemas = ["public", "storage"]
|
|
extra_search_path = ["public", "extensions"]
|
|
max_rows = 1000
|
|
|
|
[db]
|
|
port = 54322
|
|
shadow_port = 54320
|
|
major_version = 17
|
|
|
|
[db.pooler]
|
|
enabled = false
|
|
|
|
[db.seed]
|
|
enabled = true
|
|
sql_paths = ["./seed.sql"]
|
|
|
|
[realtime]
|
|
enabled = true
|
|
|
|
[studio]
|
|
enabled = true
|
|
port = 54323
|
|
|
|
[inbucket]
|
|
enabled = true
|
|
port = 54324
|
|
|
|
[storage]
|
|
enabled = true
|
|
file_size_limit = "50MiB"
|
|
|
|
[auth]
|
|
enabled = true
|
|
site_url = "http://localhost:5173"
|
|
additional_redirect_urls = [
|
|
"http://localhost:5173",
|
|
"https://d3ro.dev",
|
|
"d3ro-voice://auth-callback"
|
|
]
|
|
jwt_expiry = 3600
|
|
enable_signup = true
|
|
enable_anonymous_sign_ins = false
|
|
enable_manual_linking = false
|
|
|
|
[auth.email]
|
|
enable_signup = true
|
|
double_confirm_changes = true
|
|
enable_confirmations = false
|
|
|
|
[auth.external.google]
|
|
enabled = true
|
|
client_id = "env(GOOGLE_OAUTH_CLIENT_ID)"
|
|
secret = "env(GOOGLE_OAUTH_SECRET)"
|
|
redirect_uri = ""
|
|
|
|
[auth.external.github]
|
|
enabled = true
|
|
client_id = "env(GITHUB_OAUTH_CLIENT_ID)"
|
|
secret = "env(GITHUB_OAUTH_SECRET)"
|
|
redirect_uri = ""
|
|
|
|
[auth.external.apple]
|
|
enabled = true
|
|
client_id = "env(APPLE_OAUTH_CLIENT_ID)"
|
|
secret = "env(APPLE_OAUTH_SECRET)"
|
|
redirect_uri = ""
|
|
|
|
[edge_runtime]
|
|
enabled = true
|
|
policy = "per_worker"
|
|
inspector_port = 8083
|
|
|
|
[functions.stt-proxy]
|
|
verify_jwt = true
|
|
|
|
[functions.llm-proxy]
|
|
# 2026 sb_publishable_ 키와 Gateway JWT 검증 비호환 — requireUser()에서 직접 인증
|
|
verify_jwt = false
|
|
|
|
[functions.stripe-checkout]
|
|
verify_jwt = true
|
|
|
|
[functions.stripe-portal]
|
|
verify_jwt = true
|
|
|
|
[functions.stripe-webhook]
|
|
verify_jwt = false
|
|
|
|
[functions.team-invite]
|
|
verify_jwt = true
|
|
|
|
[functions.team-accept]
|
|
verify_jwt = true
|
|
|
|
[functions.send-push]
|
|
verify_jwt = true
|
|
|
|
[functions.embed-chunks]
|
|
verify_jwt = true
|
|
|
|
[functions.search-knowledge]
|
|
verify_jwt = true
|
|
|
|
[analytics]
|
|
enabled = false
|