2023-05-25 10:32:35 +02:00
import { z } from 'zod'
2022-11-29 10:02:40 +01:00
import {
2023-08-06 10:03:45 +02:00
executableWebhookSchema ,
2022-11-29 10:02:40 +01:00
googleAnalyticsOptionsSchema ,
2022-12-22 17:02:34 +01:00
paymentInputRuntimeOptionsSchema ,
2023-06-28 09:52:03 +02:00
pixelOptionsSchema ,
2022-12-22 17:02:34 +01:00
redirectOptionsSchema ,
2023-08-24 07:48:30 +02:00
} from '../blocks'
import { logSchema } from '../result'
2023-11-08 15:34:16 +01:00
import { listVariableValue } from '../typebot'
2023-01-25 11:27:47 +01:00
import {
textBubbleContentSchema ,
imageBubbleContentSchema ,
videoBubbleContentSchema ,
audioBubbleContentSchema ,
embedBubbleContentSchema ,
2023-08-24 07:48:30 +02:00
} from '../blocks/bubbles'
2023-11-08 15:34:16 +01:00
import { nativeMessageSchema } from '../blocks/integrations/openai'
2023-08-24 07:48:30 +02:00
import { sessionStateSchema } from './sessionState'
import { dynamicThemeSchema } from './shared'
2023-08-24 09:11:10 +02:00
import { preprocessTypebot } from '../typebot/helpers/preprocessTypebot'
2023-11-08 15:34:16 +01:00
import { typebotV5Schema , typebotV6Schema } from '../typebot/typebot'
import { inputBlockSchemas } from '../blocks/inputs/schema'
import { BubbleBlockType } from '../blocks/bubbles/constants'
2022-11-29 10:02:40 +01:00
2023-03-07 14:41:57 +01:00
const chatSessionSchema = z . object ( {
id : z.string ( ) ,
createdAt : z.date ( ) ,
updatedAt : z.date ( ) ,
state : sessionStateSchema ,
} )
2022-11-29 10:02:40 +01:00
2022-12-22 17:02:34 +01:00
const textMessageSchema = z . object ( {
2023-03-14 16:42:12 +01:00
type : z . literal ( BubbleBlockType . TEXT ) ,
2023-04-13 17:04:21 +02:00
content : textBubbleContentSchema ,
2022-12-22 17:02:34 +01:00
} )
const imageMessageSchema = z . object ( {
type : z . enum ( [ BubbleBlockType . IMAGE ] ) ,
content : imageBubbleContentSchema ,
2022-11-29 10:02:40 +01:00
} )
2022-12-22 17:02:34 +01:00
const videoMessageSchema = z . object ( {
type : z . enum ( [ BubbleBlockType . VIDEO ] ) ,
content : videoBubbleContentSchema ,
} )
const audioMessageSchema = z . object ( {
type : z . enum ( [ BubbleBlockType . AUDIO ] ) ,
content : audioBubbleContentSchema ,
} )
const embedMessageSchema = z . object ( {
type : z . enum ( [ BubbleBlockType . EMBED ] ) ,
2023-02-19 09:53:57 +01:00
content : embedBubbleContentSchema
. omit ( {
height : true ,
} )
2023-03-14 16:42:12 +01:00
. merge ( z . object ( { height : z.number ( ) . optional ( ) } ) ) ,
2022-12-22 17:02:34 +01:00
} )
2023-01-27 10:54:59 +01:00
const chatMessageSchema = z
. object ( { id : z.string ( ) } )
. and (
2023-03-14 16:42:12 +01:00
z . discriminatedUnion ( 'type' , [
textMessageSchema ,
imageMessageSchema ,
videoMessageSchema ,
audioMessageSchema ,
embedMessageSchema ,
] )
2023-01-27 10:54:59 +01:00
)
2022-11-29 10:02:40 +01:00
2023-01-27 15:58:05 +01:00
const scriptToExecuteSchema = z . object ( {
2022-11-29 10:02:40 +01:00
content : z.string ( ) ,
args : z.array (
z . object ( {
id : z.string ( ) ,
2023-02-23 14:44:37 +01:00
value : z
. string ( )
. or ( z . number ( ) )
. or ( z . boolean ( ) )
2023-03-21 15:42:03 +01:00
. or ( listVariableValue )
2023-02-23 14:44:37 +01:00
. nullish ( ) ,
2022-11-29 10:02:40 +01:00
} )
) ,
} )
2023-11-08 15:34:16 +01:00
const startTypebotPick = {
version : true ,
id : true ,
groups : true ,
events : true ,
edges : true ,
variables : true ,
settings : true ,
theme : true ,
} as const
2023-08-24 09:11:10 +02:00
export const startTypebotSchema = z . preprocess (
preprocessTypebot ,
2023-11-08 15:34:16 +01:00
z . discriminatedUnion ( 'version' , [
typebotV5Schema . _def . schema . pick ( startTypebotPick ) ,
typebotV6Schema . pick ( startTypebotPick ) ,
] )
2023-08-24 09:11:10 +02:00
)
2023-01-16 12:13:21 +01:00
2023-11-08 15:34:16 +01:00
export const startElementIdSchema = z . union ( [
z . object ( {
startGroupId : z.string ( ) . describe ( 'Start chat from a specific group.' ) ,
startEventId : z.never ( ) . optional ( ) ,
} ) ,
z . object ( {
startEventId : z.string ( ) . describe ( 'Start chat from a specific event.' ) ,
startGroupId : z.never ( ) . optional ( ) ,
} ) ,
z . object ( { } ) ,
] )
export type StartElementId = z . infer < typeof startElementIdSchema >
const startParamsSchema = z
. object ( {
typebot : startTypebotSchema
. or ( z . string ( ) )
. describe (
'Either a Typebot ID or a Typebot object. If you provide a Typebot object, it will be executed in preview mode. ([How can I find my typebot ID?](https://docs.typebot.io/api#how-to-find-my-typebotid)).'
) ,
isPreview : z
. boolean ( )
. optional ( )
. describe (
"If set to `true`, it will start a Preview session with the unpublished bot and it won't be saved in the Results tab. You need to be authenticated with a bearer token for this to work."
) ,
resultId : z
. string ( )
. optional ( )
. describe ( "Provide it if you'd like to overwrite an existing result." ) ,
prefilledVariables : z
. record ( z . unknown ( ) )
. optional ( )
. describe (
'[More info about prefilled variables.](https://docs.typebot.io/editor/variables#prefilled-variables)'
) ,
isStreamEnabled : z
. boolean ( )
. optional ( )
. describe (
'Set this to `true` if you intend to stream OpenAI completions on a client.'
) ,
isOnlyRegistering : z
. boolean ( )
. optional ( )
. describe (
'If set to `true`, it will only register the session and not start the chat. This is used for other chat platform integration as it can require a session to be registered before sending the first message.'
) ,
} )
. and ( startElementIdSchema )
2022-12-22 17:02:34 +01:00
2023-06-16 19:26:29 +02:00
const replyLogSchema = logSchema
. pick ( {
status : true ,
description : true ,
} )
. merge ( z . object ( { details : z.unknown ( ) . optional ( ) } ) )
2022-12-22 17:02:34 +01:00
export const sendMessageInputSchema = z . object ( {
message : z
. string ( )
. optional ( )
. describe (
'The answer to the previous chat input. Do not provide it if you are starting a new chat.'
) ,
sessionId : z
. string ( )
. optional ( )
. describe (
'Session ID that you get from the initial chat request to a bot. If not provided, it will create a new session.'
) ,
2023-08-02 08:34:14 +02:00
startParams : startParamsSchema.optional ( ) ,
2023-06-16 19:26:29 +02:00
clientLogs : z
. array ( replyLogSchema )
. optional ( )
. describe ( 'Logs while executing client side actions' ) ,
2022-12-22 17:02:34 +01:00
} )
const runtimeOptionsSchema = paymentInputRuntimeOptionsSchema . optional ( )
2023-06-28 09:52:03 +02:00
const startPropsToInjectSchema = z . object ( {
googleAnalyticsId : z.string ( ) . optional ( ) ,
2023-09-26 10:22:02 +02:00
pixelIds : z.array ( z . string ( ) ) . optional ( ) ,
2023-06-28 09:52:03 +02:00
gtmId : z.string ( ) . optional ( ) ,
customHeadCode : z.string ( ) . optional ( ) ,
} )
2023-01-26 15:26:42 +01:00
const clientSideActionSchema = z
. object ( {
2023-01-27 10:54:59 +01:00
lastBubbleBlockId : z.string ( ) . optional ( ) ,
2023-09-04 14:52:16 +02:00
expectsDedicatedReply : z.boolean ( ) . optional ( ) ,
2023-01-26 15:26:42 +01:00
} )
2023-01-27 10:54:59 +01:00
. and (
z
. object ( {
2023-01-27 15:58:05 +01:00
scriptToExecute : scriptToExecuteSchema ,
2023-01-27 10:54:59 +01:00
} )
. or (
z . object ( {
redirect : redirectOptionsSchema ,
} )
)
. or (
z . object ( {
2023-01-27 15:58:05 +01:00
chatwoot : z.object ( { scriptToExecute : scriptToExecuteSchema } ) ,
2023-01-27 10:54:59 +01:00
} )
)
. or (
z . object ( {
googleAnalytics : googleAnalyticsOptionsSchema ,
} )
)
. or (
z . object ( {
wait : z.object ( {
secondsToWaitFor : z.number ( ) ,
} ) ,
} )
)
2023-04-14 12:11:42 +02:00
. or (
z . object ( {
setVariable : z.object ( { scriptToExecute : scriptToExecuteSchema } ) ,
} )
)
2023-05-25 10:32:35 +02:00
. or (
z . object ( {
streamOpenAiChatCompletion : z.object ( {
messages : z.array (
2023-11-08 15:34:16 +01:00
nativeMessageSchema . pick ( { content : true , role : true } )
2023-05-25 10:32:35 +02:00
) ,
} ) ,
} )
)
2023-05-26 09:20:22 +02:00
. or (
z . object ( {
webhookToExecute : executableWebhookSchema ,
} )
)
2023-06-28 09:52:03 +02:00
. or (
z . object ( {
startPropsToInject : startPropsToInjectSchema ,
} )
)
. or (
z . object ( {
pixel : pixelOptionsSchema ,
} )
)
2023-01-26 18:23:09 +01:00
)
2023-01-26 15:26:42 +01:00
2023-11-08 15:34:16 +01:00
const typebotInChatReplyPick = {
version : true ,
id : true ,
groups : true ,
edges : true ,
variables : true ,
settings : true ,
theme : true ,
} as const
export const typebotInChatReply = z . preprocess (
preprocessTypebot ,
z . discriminatedUnion ( 'version' , [
typebotV5Schema . _def . schema . pick ( typebotInChatReplyPick ) ,
typebotV6Schema . pick ( typebotInChatReplyPick ) ,
] )
)
2022-11-29 10:02:40 +01:00
export const chatReplySchema = z . object ( {
2022-12-22 17:02:34 +01:00
messages : z.array ( chatMessageSchema ) ,
2023-05-04 09:20:30 -04:00
input : z
2023-11-08 15:34:16 +01:00
. union ( [
z . discriminatedUnion ( 'type' , [ . . . inputBlockSchemas . v5 ] ) ,
z . discriminatedUnion ( 'type' , [ . . . inputBlockSchemas . v6 ] ) ,
] )
2022-12-22 17:02:34 +01:00
. and (
z . object ( {
prefilledValue : z.string ( ) . optional ( ) ,
runtimeOptions : runtimeOptionsSchema.optional ( ) ,
} )
)
. optional ( ) ,
2023-01-26 15:26:42 +01:00
clientSideActions : z.array ( clientSideActionSchema ) . optional ( ) ,
2022-12-22 17:02:34 +01:00
sessionId : z.string ( ) . optional ( ) ,
2023-11-08 15:34:16 +01:00
typebot : z
. object ( {
id : z.string ( ) ,
theme : z.union ( [
typebotV5Schema . _def . schema . shape . theme ,
typebotV6Schema . shape . theme ,
] ) ,
settings : z.union ( [
typebotV5Schema . _def . schema . shape . settings ,
typebotV6Schema . shape . settings ,
] ) ,
} )
2023-01-16 12:13:21 +01:00
. optional ( ) ,
2022-12-22 17:02:34 +01:00
resultId : z.string ( ) . optional ( ) ,
2023-01-16 12:13:21 +01:00
dynamicTheme : dynamicThemeSchema.optional ( ) ,
2023-01-25 11:27:47 +01:00
logs : z.array ( replyLogSchema ) . optional ( ) ,
2023-08-07 15:22:05 +02:00
lastMessageNewFormat : z
. string ( )
. optional ( )
. describe (
'The sent message is validated and formatted on the backend. This is set only if the message differs from the formatted version.'
) ,
2022-11-29 10:02:40 +01:00
} )
export type ChatSession = z . infer < typeof chatSessionSchema >
2023-08-24 07:48:30 +02:00
2022-11-29 10:02:40 +01:00
export type ChatReply = z . infer < typeof chatReplySchema >
2022-12-22 17:02:34 +01:00
export type ChatMessage = z . infer < typeof chatMessageSchema >
export type SendMessageInput = z . infer < typeof sendMessageInputSchema >
2023-01-27 15:58:05 +01:00
export type ScriptToExecute = z . infer < typeof scriptToExecuteSchema >
2022-12-22 17:02:34 +01:00
export type StartParams = z . infer < typeof startParamsSchema >
export type RuntimeOptions = z . infer < typeof runtimeOptionsSchema >
2023-01-16 12:13:21 +01:00
export type StartTypebot = z . infer < typeof startTypebotSchema >
2023-01-25 11:27:47 +01:00
export type ReplyLog = z . infer < typeof replyLogSchema >
2023-06-28 09:52:03 +02:00
export type StartPropsToInject = z . infer < typeof startPropsToInjectSchema >