-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
🐛 Enable stream again by migrating endpoint to route handler
- Loading branch information
1 parent
225dfed
commit 0ba13b4
Showing
1 changed file
with
114 additions
and
0 deletions.
There are no files selected for viewing
114 changes: 114 additions & 0 deletions
114
apps/viewer/src/pages/api/integrations/openai/streamer/route.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
import { connect } from '@planetscale/database' | ||
import { env } from '@typebot.io/env' | ||
import { IntegrationBlockType, SessionState } from '@typebot.io/schemas' | ||
import { StreamingTextResponse } from 'ai' | ||
import { getChatCompletionStream } from '@typebot.io/bot-engine/blocks/integrations/openai/getChatCompletionStream' | ||
import OpenAI from 'openai' | ||
import { NextResponse } from 'next/dist/server/web/spec-extension/response' | ||
|
||
export const runtime = 'edge' | ||
export const regions = ['lhr1'] | ||
export const dynamic = 'force-dynamic' | ||
|
||
const responseHeaders = { | ||
'Access-Control-Allow-Origin': '*', | ||
} | ||
|
||
const handler = async (req: Request) => { | ||
if (req.method === 'OPTIONS') { | ||
return new Response('ok', { | ||
headers: { | ||
'Access-Control-Allow-Origin': '*', | ||
'Access-Control-Allow-Methods': 'POST', | ||
'Access-Control-Expose-Headers': 'Content-Length, X-JSON', | ||
'Access-Control-Allow-Headers': '*', | ||
}, | ||
}) | ||
} | ||
const { sessionId, messages } = (await req.json()) as { | ||
sessionId: string | ||
messages: OpenAI.Chat.ChatCompletionMessage[] | ||
} | ||
|
||
if (!sessionId) | ||
return NextResponse.json( | ||
{ message: 'No session ID provided' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
if (!messages) | ||
return NextResponse.json( | ||
{ message: 'No messages provided' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
const conn = connect({ url: env.DATABASE_URL }) | ||
|
||
const chatSession = await conn.execute( | ||
'select state from ChatSession where id=?', | ||
[sessionId] | ||
) | ||
|
||
const state = (chatSession.rows.at(0) as { state: SessionState } | undefined) | ||
?.state | ||
|
||
if (!state) | ||
return NextResponse.json( | ||
{ message: 'No state found' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
const group = state.typebotsQueue[0].typebot.groups.find( | ||
(group) => group.id === state.currentBlock?.groupId | ||
) | ||
const blockIndex = | ||
group?.blocks.findIndex( | ||
(block) => block.id === state.currentBlock?.blockId | ||
) ?? -1 | ||
|
||
const block = blockIndex >= 0 ? group?.blocks[blockIndex ?? 0] : null | ||
|
||
if (!block || !group) | ||
return NextResponse.json( | ||
{ message: 'Current block not found' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
if ( | ||
block.type !== IntegrationBlockType.OPEN_AI || | ||
block.options.task !== 'Create chat completion' | ||
) | ||
return NextResponse.json( | ||
{ message: 'Current block is not an OpenAI block' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
try { | ||
const stream = await getChatCompletionStream(conn)( | ||
state, | ||
block.options, | ||
messages | ||
) | ||
if (!stream) | ||
return NextResponse.json( | ||
{ message: 'Could not create stream' }, | ||
{ status: 400, headers: responseHeaders } | ||
) | ||
|
||
return new StreamingTextResponse(stream, { | ||
headers: responseHeaders, | ||
}) | ||
} catch (error) { | ||
if (error instanceof OpenAI.APIError) { | ||
const { name, status, message } = error | ||
return NextResponse.json( | ||
{ name, status, message }, | ||
{ status, headers: responseHeaders } | ||
) | ||
} else { | ||
throw error | ||
} | ||
} | ||
} | ||
|
||
export default handler |
0ba13b4
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Successfully deployed to the following URLs:
viewer-v2 – ./apps/viewer
seletiva-bbb24.com
speciallife.com.br
sub.yolozeeeer.com
survey.digienge.io
tribe.ezbooking.ai
w.onewebcenter.com
zap.techadviser.in
zero-pendencia.com
ai.digitaldaftar.in
al.onewebcenter.com
app.danielnalex.com
ask.realversity.org
blazecontrol.com.br
bot.boston-voip.com
bot.cabinpromos.com
bot.carnaval.studio
bot.digitalbled.com
bot.dsignagency.com
bbutton.wpwakanda.com
bot.anovaerarb.online
bot.coachayongzul.com
bot.digitalpointer.id
bot.eikju.photography
bot.eymaleggingsg.com
bot.gamesimples.store
bot.incusservices.com
bot.jogomoderno.store
bot.mejoralasalud.fun
bot.meuesocial.com.br
bot.mycompany.reviews
bot.outstandbrand.com
bot.ramonmatos.com.br
bot.sharemyreview.net
bot.synapsegameia.com
bot.truongnguyen.live
bots.baptistearno.com
botz.cloudsiteapp.com
cdd.searchcube.com.sg
chat.jogonobrasil.com
chat.missarkansas.org
chatbot.ownacademy.co
chats.maisefetivo.com
claudio-barros.online
criar.somaperuzzo.com
dental-leadmagnet.com
drabeatrizleal.com.br
gotasafrodisiacas.com
homerun.wpwakanda.com
manuel.thegymgame.com
mdb.assessoria.ademir
portaldasanalises.com
prenota.aldoemaria.it
revistasaudeemdia.com
rossano.thegymgame.it
sbutton.wpwakanda.com
segredosdothreads.com
simone.thegymgame.com
talk.convobuilder.com
terrosdoscassinos.com
test.leadbooster.help
type.rqxsystem.com.br
whats.laracardoso.com
www.acesso-app.online
zillabot.saaszilla.co
815639944.21000000.one
83720273.bouclidom.com
viewer-v2-typebot-io.vercel.app
mdb.evento.equipeinterna.progenbr.com
bot.studiotecnicoimmobiliaremerelli.it
mdb.assessoria.boaventura.progenbr.com
mdb.assessoria.jtrebesqui.progenbr.com
pesquisa.escolamodacomproposito.com.br
anamnese.clinicaramosodontologia.com.br
gabinete.baleia.formulario.progenbr.com
mdb.assessoria.carreirinha.progenbr.com
chrome-os-inquiry-system.itschromeos.com
mdb.assessoria.paulomarques.progenbr.com
viewer-v2-git-main-typebot-io.vercel.app
main-menu-for-itschromeos.itschromeos.com
mdb.assessoria.qrcode.ademir.progenbr.com
mdb.assessoria.qrcode.arthur.progenbr.com
mdb.assessoria.qrcode.danilo.progenbr.com
mdb.assessoria.qrcode.marcao.progenbr.com
mdb.assessoria.qrcode.marcio.progenbr.com
mdb.assessoria.qrcode.aloisio.progenbr.com
mdb.assessoria.qrcode.girotto.progenbr.com
mdb.assessoria.qrcode.marinho.progenbr.com
mdb.assessoria.qrcode.rodrigo.progenbr.com
mdb.assessoria.carlosalexandre.progenbr.com
mdb.assessoria.qrcode.desideri.progenbr.com
mdb.assessoria.qrcode.fernanda.progenbr.com
mdb.assessoria.qrcode.jbatista.progenbr.com
mdb.assessoria.qrcode.mauricio.progenbr.com
mdb.assessoria.fernanda.regional.progenbr.com
mdb.assessoria.qrcode.boaventura.progenbr.com
mdb.assessoria.qrcode.jtrebesqui.progenbr.com
mdb.assessoria.qrcode.carreirinha.progenbr.com
mdb.assessoria.qrcode.paulomarques.progenbr.com
mdb.assessoria.qrcode.carlosalexandre.progenbr.com
mdb.assessoria.qrcode.fernanda.regional.progenbr.com