Files
triqura-ecd/app/api/deepgram/token/route.ts
colinislit cdeea793bd feat(cortex): update chat/nudge flow, deepgram streaming and agenda form
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>
2026-07-09 22:37:46 +02:00

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 }
)
}
}