Closes #1154 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added authentication functionality for user sessions in chat API. - Introduced chat-related API endpoints for starting, previewing, and continuing chat sessions, and streaming messages. - Implemented WhatsApp API webhook handling for receiving and processing messages. - Added environment variable `NEXT_PUBLIC_CHAT_API_URL` for chat API URL configuration. - **Bug Fixes** - Adjusted file upload logic to correctly determine the API host. - Fixed message streaming URL in chat integration with OpenAI. - **Documentation** - Updated guides for creating blocks, local installation, self-hosting, and deployment to use `bun` instead of `pnpm`. - **Refactor** - Refactored chat API functionalities to use modular architecture. - Simplified client log saving and session update functionalities by using external functions. - Transitioned package management and workflow commands to use `bun`. - **Chores** - Switched to `bun` for package management in Dockerfiles and GitHub workflows. - Added new Dockerfile for chat API service setup with Bun framework. - Updated `.prettierignore` and documentation with new commands. - **Style** - No visible changes to end-users. - **Tests** - No visible changes to end-users. - **Revert** - No reverts in this release. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { decryptV2 } from '@typebot.io/lib/api/encryption/decryptV2'
|
|
import { isNotEmpty } from '@typebot.io/lib/utils'
|
|
import {
|
|
ChatCompletionOpenAIOptions,
|
|
OpenAICredentials,
|
|
} from '@typebot.io/schemas/features/blocks/integrations/openai'
|
|
import { SessionState } from '@typebot.io/schemas/features/chat/sessionState'
|
|
import { OpenAIStream } from 'ai'
|
|
import { parseVariableNumber } from '@typebot.io/variables/parseVariableNumber'
|
|
import { ClientOptions, OpenAI } from 'openai'
|
|
import { defaultOpenAIOptions } from '@typebot.io/schemas/features/blocks/integrations/openai/constants'
|
|
import { getCredentials } from '../../queries/getCredentials'
|
|
|
|
export const getOpenAIChatCompletionStream = async (
|
|
state: SessionState,
|
|
options: ChatCompletionOpenAIOptions,
|
|
messages: OpenAI.Chat.ChatCompletionMessageParam[]
|
|
) => {
|
|
if (!options.credentialsId) return
|
|
const credentials = await getCredentials(options.credentialsId)
|
|
if (!credentials) {
|
|
console.error('Could not find credentials in database')
|
|
return
|
|
}
|
|
const { apiKey } = (await decryptV2(
|
|
credentials.data,
|
|
credentials.iv
|
|
)) as OpenAICredentials['data']
|
|
|
|
const { typebot } = state.typebotsQueue[0]
|
|
const temperature = parseVariableNumber(typebot.variables)(
|
|
options.advancedSettings?.temperature
|
|
)
|
|
|
|
const config = {
|
|
apiKey,
|
|
baseURL: options.baseUrl,
|
|
defaultHeaders: {
|
|
'api-key': apiKey,
|
|
},
|
|
defaultQuery: isNotEmpty(options.apiVersion)
|
|
? {
|
|
'api-version': options.apiVersion,
|
|
}
|
|
: undefined,
|
|
} satisfies ClientOptions
|
|
|
|
const openai = new OpenAI(config)
|
|
|
|
const response = await openai.chat.completions.create({
|
|
model: options.model ?? defaultOpenAIOptions.model,
|
|
temperature,
|
|
stream: true,
|
|
messages,
|
|
})
|
|
|
|
return OpenAIStream(response)
|
|
}
|