@ -16,6 +16,7 @@ import {
|
|||||||
} from '@chakra-ui/react'
|
} from '@chakra-ui/react'
|
||||||
import { TextLink } from '@/components/TextLink'
|
import { TextLink } from '@/components/TextLink'
|
||||||
import { ChatCompletionResponseItem } from './ChatCompletionResponseItem'
|
import { ChatCompletionResponseItem } from './ChatCompletionResponseItem'
|
||||||
|
import { NumberInput } from '@/components/inputs'
|
||||||
|
|
||||||
const apiReferenceUrl =
|
const apiReferenceUrl =
|
||||||
'https://platform.openai.com/docs/api-reference/chat/create'
|
'https://platform.openai.com/docs/api-reference/chat/create'
|
||||||
@ -43,6 +44,18 @@ export const OpenAIChatCompletionSettings = ({
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updateTemperature = (
|
||||||
|
temperature: number | `{{${string}}}` | undefined
|
||||||
|
) => {
|
||||||
|
onOptionsChange({
|
||||||
|
...options,
|
||||||
|
advancedSettings: {
|
||||||
|
...options.advancedSettings,
|
||||||
|
temperature,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const updateResponseMapping = (
|
const updateResponseMapping = (
|
||||||
responseMapping: typeof options.responseMapping
|
responseMapping: typeof options.responseMapping
|
||||||
) => {
|
) => {
|
||||||
@ -61,6 +74,11 @@ export const OpenAIChatCompletionSettings = ({
|
|||||||
</TextLink>{' '}
|
</TextLink>{' '}
|
||||||
to better understand the available options.
|
to better understand the available options.
|
||||||
</Text>
|
</Text>
|
||||||
|
<DropdownList
|
||||||
|
currentItem={options.model}
|
||||||
|
items={chatCompletionModels}
|
||||||
|
onItemSelect={updateModel}
|
||||||
|
/>
|
||||||
<Accordion allowToggle allowMultiple>
|
<Accordion allowToggle allowMultiple>
|
||||||
<AccordionItem>
|
<AccordionItem>
|
||||||
<AccordionButton>
|
<AccordionButton>
|
||||||
@ -88,10 +106,14 @@ export const OpenAIChatCompletionSettings = ({
|
|||||||
<AccordionIcon />
|
<AccordionIcon />
|
||||||
</AccordionButton>
|
</AccordionButton>
|
||||||
<AccordionPanel>
|
<AccordionPanel>
|
||||||
<DropdownList
|
<NumberInput
|
||||||
currentItem={options.model}
|
label="Temperature"
|
||||||
items={chatCompletionModels}
|
placeholder="1"
|
||||||
onItemSelect={updateModel}
|
max={2}
|
||||||
|
min={0}
|
||||||
|
step={0.1}
|
||||||
|
defaultValue={options.advancedSettings?.temperature}
|
||||||
|
onValueChange={updateTemperature}
|
||||||
/>
|
/>
|
||||||
</AccordionPanel>
|
</AccordionPanel>
|
||||||
</AccordionItem>
|
</AccordionItem>
|
||||||
|
@ -18,6 +18,8 @@ import { saveErrorLog } from '@/features/logs/saveErrorLog'
|
|||||||
import { updateVariables } from '@/features/variables/updateVariables'
|
import { updateVariables } from '@/features/variables/updateVariables'
|
||||||
import { parseVariables } from '@/features/variables/parseVariables'
|
import { parseVariables } from '@/features/variables/parseVariables'
|
||||||
import { saveSuccessLog } from '@/features/logs/saveSuccessLog'
|
import { saveSuccessLog } from '@/features/logs/saveSuccessLog'
|
||||||
|
import { parseVariableNumber } from '@/features/variables/parseVariableNumber'
|
||||||
|
import { HTTPError } from 'got'
|
||||||
|
|
||||||
export const createChatCompletionOpenAI = async (
|
export const createChatCompletionOpenAI = async (
|
||||||
state: SessionState,
|
state: SessionState,
|
||||||
@ -53,11 +55,16 @@ export const createChatCompletionOpenAI = async (
|
|||||||
if (variablesTransformedToList.length > 0)
|
if (variablesTransformedToList.length > 0)
|
||||||
newSessionState = await updateVariables(state)(variablesTransformedToList)
|
newSessionState = await updateVariables(state)(variablesTransformedToList)
|
||||||
|
|
||||||
|
const temperature = parseVariableNumber(newSessionState.typebot.variables)(
|
||||||
|
options.advancedSettings?.temperature
|
||||||
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const openai = new OpenAIApi(configuration)
|
const openai = new OpenAIApi(configuration)
|
||||||
const response = await openai.createChatCompletion({
|
const response = await openai.createChatCompletion({
|
||||||
model: options.model,
|
model: options.model,
|
||||||
messages,
|
messages,
|
||||||
|
temperature,
|
||||||
})
|
})
|
||||||
const messageContent = response.data.choices.at(0)?.message?.content
|
const messageContent = response.data.choices.at(0)?.message?.content
|
||||||
const totalTokens = response.data.usage?.total_tokens
|
const totalTokens = response.data.usage?.total_tokens
|
||||||
@ -100,7 +107,12 @@ export const createChatCompletionOpenAI = async (
|
|||||||
newSessionState,
|
newSessionState,
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err)
|
if (err instanceof HTTPError) {
|
||||||
|
console.error(err.response.body)
|
||||||
|
} else {
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
|
||||||
const log = {
|
const log = {
|
||||||
status: 'error',
|
status: 'error',
|
||||||
description: 'OpenAI block returned error',
|
description: 'OpenAI block returned error',
|
||||||
|
12
apps/viewer/src/features/variables/parseVariableNumber.ts
Normal file
12
apps/viewer/src/features/variables/parseVariableNumber.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { Variable } from '@typebot.io/schemas'
|
||||||
|
import { parseGuessedValueType } from './parseGuessedValueType'
|
||||||
|
import { parseVariables } from './parseVariables'
|
||||||
|
|
||||||
|
export const parseVariableNumber =
|
||||||
|
(variables: Variable[]) =>
|
||||||
|
(input: number | `{{${string}}}` | undefined): number | undefined => {
|
||||||
|
if (typeof input === 'number' || input === undefined) return input
|
||||||
|
const parsedInput = parseGuessedValueType(parseVariables(variables)(input))
|
||||||
|
if (typeof parsedInput !== 'number') return undefined
|
||||||
|
return parsedInput
|
||||||
|
}
|
@ -1,10 +1,15 @@
|
|||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
import { variableStringSchema } from '../../utils'
|
||||||
import { blockBaseSchema, credentialsBaseSchema } from '../baseSchemas'
|
import { blockBaseSchema, credentialsBaseSchema } from '../baseSchemas'
|
||||||
import { IntegrationBlockType } from './enums'
|
import { IntegrationBlockType } from './enums'
|
||||||
|
|
||||||
export const openAITasks = ['Create chat completion', 'Create image'] as const
|
export const openAITasks = ['Create chat completion', 'Create image'] as const
|
||||||
|
|
||||||
export const chatCompletionModels = [
|
export const chatCompletionModels = [
|
||||||
|
'gpt-4',
|
||||||
|
'gpt-4-0314',
|
||||||
|
'gpt-4-32k',
|
||||||
|
'gpt-4-32k-0314',
|
||||||
'gpt-3.5-turbo',
|
'gpt-3.5-turbo',
|
||||||
'gpt-3.5-turbo-0301',
|
'gpt-3.5-turbo-0301',
|
||||||
] as const
|
] as const
|
||||||
@ -58,6 +63,11 @@ const chatCompletionOptionsSchema = z
|
|||||||
messages: z.array(
|
messages: z.array(
|
||||||
z.union([chatCompletionMessageSchema, chatCompletionCustomMessageSchema])
|
z.union([chatCompletionMessageSchema, chatCompletionCustomMessageSchema])
|
||||||
),
|
),
|
||||||
|
advancedSettings: z
|
||||||
|
.object({
|
||||||
|
temperature: z.number().or(variableStringSchema).optional(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
responseMapping: z.array(
|
responseMapping: z.array(
|
||||||
z.object({
|
z.object({
|
||||||
id: z.string(),
|
id: z.string(),
|
||||||
|
Reference in New Issue
Block a user