Skip to content

Commit 320eab6

Browse files
authored
Chore/Add base options to azure chat openai (#3886)
* add base options to azure chat openai * add base options to embeddings
1 parent 9c2203b commit 320eab6

File tree

3 files changed

+65
-8
lines changed

3 files changed

+65
-8
lines changed

packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { AzureOpenAIInput, ChatOpenAI as LangchainChatOpenAI, OpenAIChatInput } from '@langchain/openai'
1+
import { AzureOpenAIInput, ChatOpenAI as LangchainChatOpenAI, OpenAIChatInput, ClientOptions, LegacyOpenAIInput } from '@langchain/openai'
22
import { BaseCache } from '@langchain/core/caches'
33
import { BaseLLMParams } from '@langchain/core/language_models/llms'
44
import { ICommonObject, IMultiModalOption, INode, INodeData, INodeOptionsValue, INodeParams } from '../../../src/Interface'
55
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
66
import { ChatOpenAI } from '../ChatOpenAI/FlowiseChatOpenAI'
77
import { getModels, MODEL_TYPE } from '../../../src/modelLoader'
8+
import { BaseChatModelParams } from '@langchain/core/language_models/chat_models'
89

910
const serverCredentialsExists =
1011
!!process.env.AZURE_OPENAI_API_KEY &&
@@ -27,7 +28,7 @@ class AzureChatOpenAI_ChatModels implements INode {
2728
constructor() {
2829
this.label = 'Azure ChatOpenAI'
2930
this.name = 'azureChatOpenAI'
30-
this.version = 6.0
31+
this.version = 7.0
3132
this.type = 'AzureChatOpenAI'
3233
this.icon = 'Azure.svg'
3334
this.category = 'Chat Models'
@@ -116,6 +117,13 @@ class AzureChatOpenAI_ChatModels implements INode {
116117
optional: true,
117118
additionalParams: true
118119
},
120+
{
121+
label: 'BaseOptions',
122+
name: 'baseOptions',
123+
type: 'json',
124+
optional: true,
125+
additionalParams: true
126+
},
119127
{
120128
label: 'Allow Image Uploads',
121129
name: 'allowImageUploads',
@@ -169,6 +177,7 @@ class AzureChatOpenAI_ChatModels implements INode {
169177
const cache = nodeData.inputs?.cache as BaseCache
170178
const topP = nodeData.inputs?.topP as string
171179
const basePath = nodeData.inputs?.basepath as string
180+
const baseOptions = nodeData.inputs?.baseOptions
172181

173182
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
174183
const azureOpenAIApiKey = getCredentialParam('azureOpenAIApiKey', credentialData, nodeData)
@@ -179,7 +188,10 @@ class AzureChatOpenAI_ChatModels implements INode {
179188
const allowImageUploads = nodeData.inputs?.allowImageUploads as boolean
180189
const imageResolution = nodeData.inputs?.imageResolution as string
181190

182-
const obj: Partial<AzureOpenAIInput> & BaseLLMParams & Partial<OpenAIChatInput> = {
191+
const obj: Partial<AzureOpenAIInput> &
192+
BaseLLMParams &
193+
Partial<OpenAIChatInput> &
194+
BaseChatModelParams & { configuration?: ClientOptions & LegacyOpenAIInput } = {
183195
temperature: parseFloat(temperature),
184196
modelName,
185197
azureOpenAIApiKey,
@@ -196,6 +208,16 @@ class AzureChatOpenAI_ChatModels implements INode {
196208
if (cache) obj.cache = cache
197209
if (topP) obj.topP = parseFloat(topP)
198210
if (basePath) obj.azureOpenAIBasePath = basePath
211+
if (baseOptions) {
212+
try {
213+
const parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions)
214+
obj.configuration = {
215+
defaultHeaders: parsedBaseOptions
216+
}
217+
} catch (exception) {
218+
console.error('Error parsing base options', exception)
219+
}
220+
}
199221

200222
const multiModalOption: IMultiModalOption = {
201223
image: {

packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AzureOpenAIInput, OpenAIEmbeddings, OpenAIEmbeddingsParams } from '@langchain/openai'
1+
import { AzureOpenAIInput, ClientOptions, LegacyOpenAIInput, OpenAIEmbeddings, OpenAIEmbeddingsParams } from '@langchain/openai'
22
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
33
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
44

@@ -23,7 +23,7 @@ class AzureOpenAIEmbedding_Embeddings implements INode {
2323
constructor() {
2424
this.label = 'Azure OpenAI Embeddings'
2525
this.name = 'azureOpenAIEmbeddings'
26-
this.version = 1.0
26+
this.version = 2.0
2727
this.type = 'AzureOpenAIEmbeddings'
2828
this.icon = 'Azure.svg'
2929
this.category = 'Embeddings'
@@ -58,6 +58,13 @@ class AzureOpenAIEmbedding_Embeddings implements INode {
5858
type: 'string',
5959
optional: true,
6060
additionalParams: true
61+
},
62+
{
63+
label: 'BaseOptions',
64+
name: 'baseOptions',
65+
type: 'json',
66+
optional: true,
67+
additionalParams: true
6168
}
6269
]
6370
}
@@ -66,14 +73,15 @@ class AzureOpenAIEmbedding_Embeddings implements INode {
6673
const batchSize = nodeData.inputs?.batchSize as string
6774
const timeout = nodeData.inputs?.timeout as string
6875
const basePath = nodeData.inputs?.basepath as string
76+
const baseOptions = nodeData.inputs?.baseOptions
6977

7078
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
7179
const azureOpenAIApiKey = getCredentialParam('azureOpenAIApiKey', credentialData, nodeData)
7280
const azureOpenAIApiInstanceName = getCredentialParam('azureOpenAIApiInstanceName', credentialData, nodeData)
7381
const azureOpenAIApiDeploymentName = getCredentialParam('azureOpenAIApiDeploymentName', credentialData, nodeData)
7482
const azureOpenAIApiVersion = getCredentialParam('azureOpenAIApiVersion', credentialData, nodeData)
7583

76-
const obj: Partial<OpenAIEmbeddingsParams> & Partial<AzureOpenAIInput> = {
84+
const obj: Partial<OpenAIEmbeddingsParams> & Partial<AzureOpenAIInput> & { configuration?: ClientOptions & LegacyOpenAIInput } = {
7785
azureOpenAIApiKey,
7886
azureOpenAIApiInstanceName,
7987
azureOpenAIApiDeploymentName,
@@ -83,6 +91,16 @@ class AzureOpenAIEmbedding_Embeddings implements INode {
8391

8492
if (batchSize) obj.batchSize = parseInt(batchSize, 10)
8593
if (timeout) obj.timeout = parseInt(timeout, 10)
94+
if (baseOptions) {
95+
try {
96+
const parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions)
97+
obj.configuration = {
98+
defaultHeaders: parsedBaseOptions
99+
}
100+
} catch (exception) {
101+
console.error('Error parsing base options', exception)
102+
}
103+
}
86104

87105
const model = new OpenAIEmbeddings(obj)
88106
return model

packages/components/nodes/embeddings/OpenAIEmbeddingCustom/OpenAIEmbeddingCustom.ts

+19-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class OpenAIEmbeddingCustom_Embeddings implements INode {
1717
constructor() {
1818
this.label = 'OpenAI Embeddings Custom'
1919
this.name = 'openAIEmbeddingsCustom'
20-
this.version = 2.0
20+
this.version = 3.0
2121
this.type = 'OpenAIEmbeddingsCustom'
2222
this.icon = 'openai.svg'
2323
this.category = 'Embeddings'
@@ -58,6 +58,13 @@ class OpenAIEmbeddingCustom_Embeddings implements INode {
5858
optional: true,
5959
additionalParams: true
6060
},
61+
{
62+
label: 'BaseOptions',
63+
name: 'baseOptions',
64+
type: 'json',
65+
optional: true,
66+
additionalParams: true
67+
},
6168
{
6269
label: 'Model Name',
6370
name: 'modelName',
@@ -81,6 +88,7 @@ class OpenAIEmbeddingCustom_Embeddings implements INode {
8188
const basePath = nodeData.inputs?.basepath as string
8289
const modelName = nodeData.inputs?.modelName as string
8390
const dimensions = nodeData.inputs?.dimensions as string
91+
const baseOptions = nodeData.inputs?.baseOptions
8492

8593
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
8694
const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData)
@@ -95,7 +103,16 @@ class OpenAIEmbeddingCustom_Embeddings implements INode {
95103
if (modelName) obj.modelName = modelName
96104
if (dimensions) obj.dimensions = parseInt(dimensions, 10)
97105

98-
const model = new OpenAIEmbeddings(obj, { basePath })
106+
let parsedBaseOptions: any | undefined = undefined
107+
if (baseOptions) {
108+
try {
109+
parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions)
110+
} catch (exception) {
111+
throw new Error("Invalid JSON in the ChatOpenAI's BaseOptions: " + exception)
112+
}
113+
}
114+
115+
const model = new OpenAIEmbeddings(obj, { baseURL: basePath, defaultHeaders: parsedBaseOptions })
99116
return model
100117
}
101118
}

0 commit comments

Comments
 (0)