2
0

(openai) Use Vercel's AI SDK for streaming

This commit is contained in:
Baptiste Arnaud
2023-06-20 17:23:14 +02:00
parent 7c2e5740dc
commit 3be39cbc78
7 changed files with 254 additions and 76 deletions

View File

@@ -6,10 +6,12 @@ import {
OpenAICredentials,
} from '@typebot.io/schemas/features/blocks/integrations/openai'
import { SessionState } from '@typebot.io/schemas/features/chat'
import type {
import { OpenAIStream } from 'ai'
import {
ChatCompletionRequestMessage,
CreateChatCompletionRequest,
} from 'openai'
Configuration,
OpenAIApi,
} from 'openai-edge'
export const getChatCompletionStream =
(conn: Connection) =>
@@ -37,19 +39,18 @@ export const getChatCompletionStream =
options.advancedSettings?.temperature
)
const res = await fetch('https://api.openai.com/v1/chat/completions', {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`,
},
method: 'POST',
body: JSON.stringify({
messages,
model: options.model,
temperature,
stream: true,
} satisfies CreateChatCompletionRequest),
const config = new Configuration({
apiKey,
})
return res.body
const openai = new OpenAIApi(config)
const response = await openai.createChatCompletion({
model: options.model,
temperature,
stream: true,
messages,
})
return OpenAIStream(response)
}

View File

@@ -1,6 +1,7 @@
import { getChatCompletionStream } from '@/features/blocks/integrations/openai/getChatCompletionStream'
import { connect } from '@planetscale/database'
import { IntegrationBlockType, SessionState } from '@typebot.io/schemas'
import { StreamingTextResponse } from 'ai'
import { ChatCompletionRequestMessage } from 'openai'
export const config = {
@@ -15,8 +16,7 @@ const handler = async (req: Request) => {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST',
'Access-Control-Expose-Headers': 'Content-Length, X-JSON',
'Access-Control-Allow-Headers':
'apikey,X-Client-Info, Content-Type, Authorization, Accept, Accept-Language, X-Authorization',
'Access-Control-Allow-Headers': '*',
},
})
}
@@ -66,12 +66,10 @@ const handler = async (req: Request) => {
messages
)
if (!stream) return new Response('Missing credentials', { status: 400 })
if (!stream) return new Response('Could not create stream', { status: 400 })
return new Response(stream, {
status: 200,
return new StreamingTextResponse(stream, {
headers: {
'Content-Type': 'application/json; charset=utf-8',
'Access-Control-Allow-Origin': '*',
},
})