fix: update input of Language model component to support images#8534
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThe changes update the types of input fields used in the Changes
Suggested reviewers
✨ Finishing Touches🧪 Generate Unit Tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Pull Request Overview
This PR replaces the deprecated MessageTextInput class with the new MessageInput in the language model component.
- Updated import to use
MessageInputinstead ofMessageTextInput - Updated component instantiation to match the new input class
Comments suppressed due to low confidence (2)
src/backend/base/langflow/components/models/language_model.py:14
- Update any docstrings or comments in this file (or elsewhere) that reference the old
MessageTextInputto prevent confusion about the newMessageInputclass.
from langflow.io import DropdownInput, MessageInput, SecretStrInput, SliderInput
src/backend/base/langflow/components/models/language_model.py:50
- Ensure existing tests (or add new ones) cover the
MessageInputbehavior to catch any regressions now that the input class has been renamed.
MessageInput(
|
1 min pushing the updated templates too. |
There was a problem hiding this comment.
Actionable comments posted: 1
🔭 Outside diff range comments (1)
src/backend/base/langflow/components/models/language_model.py (1)
55-60:⚠️ Potential issue
system_messagefield: mismatch with starter-project templateThe code now exposes
MultilineInput, butBasic Prompting.jsonstill declares_input_type = "MessageTextInput"for the same field.
At runtime this causes the front-end to render the wrong widget (and may break copy-paste/trace-as-input).Action: update the starter-project template to
MultilineInput.
🧹 Nitpick comments (1)
src/backend/base/langflow/components/models/language_model.py (1)
50-55: Consider declaringinput_typesforMessageInput
MessageTextInputused to default itsinput_typesto["Message"].
IfMessageInputkeeps the same contract you’re safe, otherwise the canvas may not allow connections fromMessagehandles.- MessageInput( - name="input_value", - display_name="Input", - info="The input text to send to the model", - ), + MessageInput( + name="input_value", + display_name="Input", + info="The input text to send to the model", + input_types=["Message"], # keep old behaviour + ),
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/backend/base/langflow/components/models/language_model.py(2 hunks)src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (31)
- GitHub Check: Validate PR
- GitHub Check: Validate PR
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 23/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 25/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 22/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 18/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 24/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 20/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 21/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 19/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 14/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 17/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 16/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 13/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 15/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 10/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 7/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 12/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 9/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 11/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 5/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 6/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 8/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 4/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 3/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 1/25
- GitHub Check: Run Frontend Tests / Playwright Tests - Shard 2/25
- GitHub Check: Run Backend Tests / Unit Tests - Python 3.10 - Group 4
- GitHub Check: Run Backend Tests / Unit Tests - Python 3.10 - Group 5
- GitHub Check: Run Backend Tests / Unit Tests - Python 3.10 - Group 1
- GitHub Check: Run Backend Tests / Unit Tests - Python 3.10 - Group 2
🔇 Additional comments (2)
src/backend/base/langflow/components/models/language_model.py (1)
14-14:Details
✅ Verification successful
Verify complete removal of
MessageTextInputGreat to see the switch to
MessageInput/MultilineInput.
Please run a quick grep to make sureMessageTextInputis no longer referenced in this module (or re-imported later via*). Lingering references will raiseNameErrors once the old import is gone.
🏁 Script executed:
#!/bin/bash rg -n "MessageTextInput" src/backend/base/langflow/components/models/language_model.pyLength of output: 86
🏁 Script executed:
#!/bin/bash # Verify that MessageTextInput has been fully removed across the codebase rg -n "MessageTextInput" .Length of output: 77420
Verified removal of
MessageTextInputfrom language_model.pyI ran a search for
MessageTextInputinsrc/backend/base/langflow/components/models/language_model.pyand found no references—so the module is clear and won’t raise anyNameError.src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json (1)
250-252: Good update –input_valuenow usesMultilineInputUI component type matches the change made in
ChatInput.
| "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import OPENAI_MODEL_NAMES\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" | ||
| }, | ||
| "input_value": { |
There was a problem hiding this comment.
LanguageModelComponent template out-of-sync with Python definition
The embedded source code (line 1032) imports MessageInput/MultilineInput, yet the template JSON that follows still defines:
"input_value": { "_input_type": "MessageTextInput", ... }
"system_message": { "_input_type": "MessageTextInput", ... }
This inconsistency will surface as:
• Wrong widgets rendered in the editor
• Validation errors when connecting Message handles
Patch (excerpt):
-"_input_type": "MessageTextInput",
+"_input_type": "MessageInput",and
-"_input_type": "MessageTextInput",
+"_input_type": "MultilineInput",Apply both changes inside LanguageModelComponent’s template block.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "value": "from typing import Any\n\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_openai import ChatOpenAI\n\nfrom langflow.base.models.anthropic_constants import ANTHROPIC_MODELS\nfrom langflow.base.models.google_generative_ai_constants import GOOGLE_GENERATIVE_AI_MODELS\nfrom langflow.base.models.model import LCModelComponent\nfrom langflow.base.models.openai_constants import OPENAI_MODEL_NAMES\nfrom langflow.field_typing import LanguageModel\nfrom langflow.field_typing.range_spec import RangeSpec\nfrom langflow.inputs.inputs import BoolInput\nfrom langflow.io import DropdownInput, MessageInput, MultilineInput, SecretStrInput, SliderInput\nfrom langflow.schema.dotdict import dotdict\n\n\nclass LanguageModelComponent(LCModelComponent):\n display_name = \"Language Model\"\n description = \"Runs a language model given a specified provider. \"\n icon = \"brain-circuit\"\n category = \"models\"\n priority = 0 # Set priority to 0 to make it appear first\n\n inputs = [\n DropdownInput(\n name=\"provider\",\n display_name=\"Model Provider\",\n options=[\"OpenAI\", \"Anthropic\", \"Google\"],\n value=\"OpenAI\",\n info=\"Select the model provider\",\n real_time_refresh=True,\n options_metadata=[{\"icon\": \"OpenAI\"}, {\"icon\": \"Anthropic\"}, {\"icon\": \"Google\"}],\n ),\n DropdownInput(\n name=\"model_name\",\n display_name=\"Model Name\",\n options=OPENAI_MODEL_NAMES,\n value=OPENAI_MODEL_NAMES[0],\n info=\"Select the model to use\",\n ),\n SecretStrInput(\n name=\"api_key\",\n display_name=\"OpenAI API Key\",\n info=\"Model Provider API key\",\n required=False,\n show=True,\n real_time_refresh=True,\n ),\n MessageInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"The input text to send to the model\",\n ),\n MultilineInput(\n name=\"system_message\",\n display_name=\"System Message\",\n info=\"A system message that helps set the behavior of the assistant\",\n advanced=True,\n ),\n BoolInput(\n name=\"stream\",\n display_name=\"Stream\",\n info=\"Whether to stream the response\",\n value=False,\n advanced=True,\n ),\n SliderInput(\n name=\"temperature\",\n display_name=\"Temperature\",\n value=0.1,\n info=\"Controls randomness in responses\",\n range_spec=RangeSpec(min=0, max=1, step=0.01),\n advanced=True,\n ),\n ]\n\n def build_model(self) -> LanguageModel:\n provider = self.provider\n model_name = self.model_name\n temperature = self.temperature\n stream = self.stream\n\n if provider == \"OpenAI\":\n if not self.api_key:\n msg = \"OpenAI API key is required when using OpenAI provider\"\n raise ValueError(msg)\n return ChatOpenAI(\n model_name=model_name,\n temperature=temperature,\n streaming=stream,\n openai_api_key=self.api_key,\n )\n if provider == \"Anthropic\":\n if not self.api_key:\n msg = \"Anthropic API key is required when using Anthropic provider\"\n raise ValueError(msg)\n return ChatAnthropic(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n anthropic_api_key=self.api_key,\n )\n if provider == \"Google\":\n if not self.api_key:\n msg = \"Google API key is required when using Google provider\"\n raise ValueError(msg)\n return ChatGoogleGenerativeAI(\n model=model_name,\n temperature=temperature,\n streaming=stream,\n google_api_key=self.api_key,\n )\n msg = f\"Unknown provider: {provider}\"\n raise ValueError(msg)\n\n def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None) -> dotdict:\n if field_name == \"provider\":\n if field_value == \"OpenAI\":\n build_config[\"model_name\"][\"options\"] = OPENAI_MODEL_NAMES\n build_config[\"model_name\"][\"value\"] = OPENAI_MODEL_NAMES[0]\n build_config[\"api_key\"][\"display_name\"] = \"OpenAI API Key\"\n elif field_value == \"Anthropic\":\n build_config[\"model_name\"][\"options\"] = ANTHROPIC_MODELS\n build_config[\"model_name\"][\"value\"] = ANTHROPIC_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Anthropic API Key\"\n elif field_value == \"Google\":\n build_config[\"model_name\"][\"options\"] = GOOGLE_GENERATIVE_AI_MODELS\n build_config[\"model_name\"][\"value\"] = GOOGLE_GENERATIVE_AI_MODELS[0]\n build_config[\"api_key\"][\"display_name\"] = \"Google API Key\"\n return build_config\n" | |
| }, | |
| "input_value": { | |
| "input_value": { | |
| - "_input_type": "MessageTextInput", | |
| + "_input_type": "MessageInput", | |
| "display_name": "Input", | |
| "info": "The input text to send to the model", | |
| // …other settings… | |
| }, | |
| "system_message": { | |
| - "_input_type": "MessageTextInput", | |
| + "_input_type": "MultilineInput", | |
| "display_name": "System Message", | |
| "info": "A system message that helps set the behavior of the assistant", | |
| // …other settings… | |
| }, |
🤖 Prompt for AI Agents
In src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json
around lines 1032 to 1034, the LanguageModelComponent template is out of sync
with the Python code: the template uses "MessageTextInput" for "input_value" and
"system_message" fields, but the Python imports and usage require "MessageInput"
and "MultilineInput" respectively. To fix this, update the template JSON inside
the LanguageModelComponent's template block to replace "input_value" field's
"_input_type" with "MessageInput" and "system_message" field's "_input_type"
with "MultilineInput" to match the Python definition and ensure correct widget
rendering and validation.
…w components for better organization and separation of concerns
…flow-ai#8534) * Update language_model.py * Update language_model.py * Update Basic Prompting.json * ✨ (changes-filter.yaml): add new directory 'initial_setup' to langflow components for better organization and separation of concerns --------- Co-authored-by: cristhianzl <cristhian.lousa@gmail.com>
This pull request updates the
LanguageModelComponentclass to replace certain input types with more versatile alternatives, improving flexibility and usability. The changes include replacingMessageTextInputwithMessageInputandMultilineInputin relevant parts of the codebase.Input Type Updates
language_model.py: ReplacedMessageTextInputwithMessageInputand addedMultilineInputto the list of imports. (src/backend/base/langflow/components/models/language_model.py, src/backend/base/langflow/components/models/language_model.pyL14-R14)LanguageModelComponent: ChangedMessageTextInputtoMessageInputfor theinput_valuefield and toMultilineInputfor thesystem_messagefield. (src/backend/base/langflow/components/models/language_model.py, src/backend/base/langflow/components/models/language_model.pyL50-R55)Starter Project Updates
Basic Prompting.json: Updated the starter project configuration to reflect the new input types (MessageInputandMultilineInput) in place ofMessageTextInput. (src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.json, src/backend/base/langflow/initial_setup/starter_projects/Basic Prompting.jsonL1032-R1032)Summary by CodeRabbit