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'
import { listVariableValue , typebotSchema } 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'
import { BubbleBlockType } from '../blocks/bubbles/enums'
import { inputBlockSchemas } from '../blocks/schemas'
import { chatCompletionMessageSchema } from '../blocks/integrations/openai'
import { sessionStateSchema } from './sessionState'
import { dynamicThemeSchema } from './shared'
2023-08-24 09:11:10 +02:00
import { preprocessTypebot } from '../typebot/helpers/preprocessTypebot'
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-08-24 09:11:10 +02:00
export const startTypebotSchema = z . preprocess (
preprocessTypebot ,
typebotSchema . _def . schema . pick ( {
version : true ,
id : true ,
groups : true ,
edges : true ,
variables : true ,
settings : true ,
theme : true ,
} )
)
2023-01-16 12:13:21 +01:00
2022-12-22 17:02:34 +01:00
const startParamsSchema = z . object ( {
2023-01-16 12:13:21 +01:00
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)).'
) ,
2022-12-22 17:02:34 +01:00
isPreview : z
. boolean ( )
. optional ( )
. describe (
2023-08-04 14:53:49 +02:00
"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."
2022-12-22 17:02:34 +01:00
) ,
resultId : z
. string ( )
. optional ( )
. describe ( "Provide it if you'd like to overwrite an existing result." ) ,
2023-01-16 12:13:21 +01:00
startGroupId : z
. string ( )
. optional ( )
. describe ( 'Start chat from a specific group.' ) ,
prefilledVariables : z
. record ( z . unknown ( ) )
. optional ( )
. describe (
'[More info about prefilled variables.](https://docs.typebot.io/editor/variables#prefilled-variables)'
) ,
2023-08-02 08:34:14 +02:00
isStreamEnabled : z
. boolean ( )
. optional ( )
. describe (
'Set this to `true` if you intend to stream OpenAI completions on a client.'
) ,
2023-08-29 10:01:28 +02:00
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.'
) ,
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
pixelId : z.string ( ) . optional ( ) . describe ( 'Deprecated' ) ,
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 (
chatCompletionMessageSchema . pick ( { content : true , role : true } )
) ,
} ) ,
} )
)
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
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
. discriminatedUnion ( 'type' , [ . . . inputBlockSchemas ] )
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-08-23 10:57:38 +02:00
typebot : typebotSchema._def.schema
2023-01-16 12:13:21 +01:00
. pick ( { id : true , theme : true , settings : true } )
. 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 >