Refines chat panel, nudge messages and artifact rendering, reworks deepgram token/streaming handling, and adds test tooling deps (playwright, cypress) to package.json. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
108 lines
4.0 KiB
TypeScript
108 lines
4.0 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { createClient as createSupabaseClient } from '@/lib/auth/server'
|
|
import { createClient as createDeepgramClient } from '@deepgram/sdk'
|
|
|
|
const TOKEN_TTL_SECONDS = 600 // Token geldig voor 10 min (korter = veiliger)
|
|
|
|
export async function POST() {
|
|
console.log('[API /deepgram/token] POST request received')
|
|
try {
|
|
const skipAuthCheck = process.env.SKIP_AUTH_CHECK === 'true'
|
|
|
|
// Auth check (skip in development/demo mode)
|
|
if (!skipAuthCheck) {
|
|
console.log('[API /deepgram/token] Checking auth...')
|
|
const supabase = await createSupabaseClient()
|
|
const { data: authData, error: authError } = await supabase.auth.getUser()
|
|
|
|
if (authError) {
|
|
console.error('[API /deepgram/token] Auth error:', authError)
|
|
return NextResponse.json(
|
|
{ error: 'Kon sessie niet ophalen' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
|
|
if (!authData?.user) {
|
|
console.log('[API /deepgram/token] No user found - returning 401')
|
|
return NextResponse.json({ error: 'Niet geautoriseerd' }, { status: 401 })
|
|
}
|
|
|
|
console.log('[API /deepgram/token] Auth OK')
|
|
} else {
|
|
console.log('[API /deepgram/token] Auth check skipped (SKIP_AUTH_CHECK=true)')
|
|
}
|
|
|
|
// Prefer admin key (can generate tokens), fallback to regular key
|
|
const apiKey = process.env.DEEPGRAM_ADMIN_API_KEY || process.env.DEEPGRAM_API_KEY
|
|
const keyType = process.env.DEEPGRAM_ADMIN_API_KEY ? 'ADMIN' : 'REGULAR'
|
|
console.log('[API /deepgram/token] Using', keyType, 'API key, present:', !!apiKey)
|
|
|
|
if (!apiKey) {
|
|
console.error('[API /deepgram/token] No Deepgram API key configured!')
|
|
return NextResponse.json(
|
|
{ error: 'Deepgram API key ontbreekt in server configuratie' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
|
|
// Check if we should use direct API key (for development when grantToken doesn't work)
|
|
const useDirectKey = process.env.DEEPGRAM_USE_DIRECT_KEY === 'true'
|
|
|
|
if (useDirectKey) {
|
|
console.log('[API /deepgram/token] Using direct API key (DEEPGRAM_USE_DIRECT_KEY=true)')
|
|
return NextResponse.json(
|
|
{
|
|
token: apiKey,
|
|
expiresIn: TOKEN_TTL_SECONDS,
|
|
authMode: 'apiKey',
|
|
},
|
|
{ status: 200 }
|
|
)
|
|
}
|
|
|
|
console.log('[API /deepgram/token] Requesting token from Deepgram...')
|
|
console.log('[API /deepgram/token] API key length:', apiKey.length, 'starts with:', apiKey.slice(0, 8))
|
|
const deepgram = createDeepgramClient(apiKey)
|
|
|
|
let tokenResponse
|
|
try {
|
|
tokenResponse = await deepgram.auth.grantToken({
|
|
ttl_seconds: TOKEN_TTL_SECONDS,
|
|
})
|
|
console.log('[API /deepgram/token] Deepgram response:', JSON.stringify(tokenResponse, null, 2))
|
|
} catch (deepgramError) {
|
|
console.error('[API /deepgram/token] Deepgram SDK threw error:', deepgramError)
|
|
return NextResponse.json(
|
|
{ error: 'Deepgram SDK error: ' + (deepgramError instanceof Error ? deepgramError.message : String(deepgramError)) },
|
|
{ status: 502 }
|
|
)
|
|
}
|
|
|
|
if (!tokenResponse.result) {
|
|
console.error('[API /deepgram/token] Deepgram API error - no result. Full response:', tokenResponse)
|
|
console.log('[API /deepgram/token] TIP: Set DEEPGRAM_USE_DIRECT_KEY=true in .env.local to use API key directly')
|
|
return NextResponse.json(
|
|
{ error: 'Genereren van tijdelijk token mislukt', details: tokenResponse.error },
|
|
{ status: 502 }
|
|
)
|
|
}
|
|
|
|
console.log('[API /deepgram/token] Token generated successfully, expiresIn:', tokenResponse.result.expires_in)
|
|
return NextResponse.json(
|
|
{
|
|
token: tokenResponse.result.access_token,
|
|
expiresIn: tokenResponse.result.expires_in,
|
|
authMode: 'accessToken',
|
|
},
|
|
{ status: 200 }
|
|
)
|
|
} catch (error) {
|
|
console.error('[API /deepgram/token] Unexpected error:', error)
|
|
return NextResponse.json(
|
|
{ error: 'Onverwachte fout bij genereren token' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|