Skip to content

Commit 732cf45

Browse files
bug: unable to use Other Model for 'Language Model' in Agent Component (#11506)
* fixed import issue on model provider * addressed commments --------- Co-authored-by: keval shah <kevalvirat@gmail.com>
1 parent 947f28c commit 732cf45

6 files changed

Lines changed: 602 additions & 27 deletions

File tree

src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/__tests__/computeDisplayHandle.test.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ describe("computeDisplayHandle", () => {
100100
});
101101

102102
describe("model input handling", () => {
103-
it("should require input_types for model type to show handle", () => {
104-
expect(computeDisplayHandle({ type: "model" }, false)).toBe(false);
103+
it("should always show handle for model type", () => {
104+
expect(computeDisplayHandle({ type: "model" }, false)).toBe(true);
105105
expect(
106106
computeDisplayHandle({ type: "model", input_types: [] }, false),
107-
).toBe(false);
107+
).toBe(true);
108108
expect(
109109
computeDisplayHandle(
110110
{ type: "model", input_types: ["LanguageModel"] },
@@ -113,7 +113,7 @@ describe("computeDisplayHandle", () => {
113113
).toBe(true);
114114
});
115115

116-
it("should allow refresh_button for model type if it has input_types", () => {
116+
it("should always show handle for model type even with refresh_button", () => {
117117
expect(
118118
computeDisplayHandle(
119119
{
@@ -126,13 +126,13 @@ describe("computeDisplayHandle", () => {
126126
).toBe(true);
127127
expect(
128128
computeDisplayHandle({ type: "model", refresh_button: true }, false),
129-
).toBe(false);
129+
).toBe(true);
130130
});
131131
});
132132

133133
describe("real-world scenarios", () => {
134134
it("should handle LLM component inputs correctly", () => {
135-
// Model selector with refresh
135+
// Model selector always shows handle
136136
expect(
137137
computeDisplayHandle(
138138
{
@@ -143,6 +143,16 @@ describe("computeDisplayHandle", () => {
143143
false,
144144
),
145145
).toBe(true);
146+
// Model selector without input_types also shows handle
147+
expect(
148+
computeDisplayHandle(
149+
{
150+
type: "model",
151+
refresh_button: true,
152+
},
153+
false,
154+
),
155+
).toBe(true);
146156
// Text input with optional connection
147157
expect(
148158
computeDisplayHandle(

src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/index.tsx

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,19 @@ const RenderInputParameters = ({
4646
templateFields.forEach((templateField) => {
4747
const template = data.node?.template[templateField];
4848
if (template) {
49+
// For model type fields, provide default input_types if not set
50+
const isModelType = template.type === "model";
51+
const effectiveInputTypes =
52+
template.input_types && template.input_types.length > 0
53+
? template.input_types
54+
: isModelType
55+
? ["LanguageModel"]
56+
: template.input_types;
57+
4958
colorMap.set(templateField, {
50-
colors: getNodeInputColors(
51-
template.input_types,
52-
template.type,
53-
types,
54-
),
59+
colors: getNodeInputColors(effectiveInputTypes, template.type, types),
5560
colorsName: getNodeInputColorsName(
56-
template.input_types,
61+
effectiveInputTypes,
5762
template.type,
5863
types,
5964
),
@@ -101,6 +106,15 @@ const RenderInputParameters = ({
101106
const memoizedColor = memoizedColors.get(templateField);
102107
const memoizedKey = memoizedKeys.get(templateField);
103108

109+
// For model type fields, provide default input_types if not set
110+
const isModelType = template.type === "model";
111+
const effectiveInputTypes =
112+
template.input_types && template.input_types.length > 0
113+
? template.input_types
114+
: isModelType
115+
? ["LanguageModel"]
116+
: template.input_types;
117+
104118
return (
105119
<NodeInputField
106120
lastInput={
@@ -113,16 +127,16 @@ const RenderInputParameters = ({
113127
title={getFieldTitle(data.node?.template!, templateField)}
114128
info={template.info!}
115129
name={templateField}
116-
tooltipTitle={template.input_types?.join("\n") ?? template.type}
130+
tooltipTitle={effectiveInputTypes?.join("\n") ?? template.type}
117131
required={template.required}
118132
id={{
119-
inputTypes: template.input_types,
133+
inputTypes: effectiveInputTypes,
120134
type: template.type,
121135
id: data.id,
122136
fieldName: templateField,
123137
}}
124138
type={template.type}
125-
optionalHandle={template.input_types}
139+
optionalHandle={effectiveInputTypes}
126140
proxy={template.proxy}
127141
showNode={showNode}
128142
colorName={memoizedColor.colorsName}

src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/utils.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@ export const computeDisplayHandle = (
3030
Array.isArray(optionalHandle) &&
3131
optionalHandle.length > 0;
3232

33+
// Always show handle for model inputs
34+
if (isModelInput) {
35+
return true;
36+
}
37+
3338
return !!(
3439
(!LANGFLOW_SUPPORTED_TYPES.has(type ?? "") ||
3540
(optionalHandle && optionalHandle.length > 0)) &&
3641
!(isToolMode && template.tool_mode) &&
37-
(!hasRefreshButton || isModelInput) &&
38-
(!isModelInput || hasInputTypes)
42+
!hasRefreshButton
3943
);
4044
};
4145

src/frontend/src/components/core/parameterRenderComponent/components/modelInputComponent/index.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -505,15 +505,6 @@ export default function ModelInputComponent({
505505
() => setOpenManageProvidersDialog(true),
506506
"manage-model-providers",
507507
)}
508-
509-
{externalOptions?.fields?.data?.node &&
510-
renderFooterButton(
511-
externalOptions.fields.data.node.display_name,
512-
externalOptions.fields.data.node.icon || "Box",
513-
() =>
514-
handleExternalOptions(externalOptions.fields.data.node.name || ""),
515-
"external-option-button",
516-
)}
517508
</div>
518509
);
519510

0 commit comments

Comments
 (0)