fix: Gracefully handle missing imports for model components (#4743)

* Handle ImportError for langchain_groq in Groq model initialization

* Refactor model input constants to handle missing imports gracefully

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-11-21 13:41:01 -03:00 • committed by GitHub
commit be7eac9e00
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 130 additions and 40 deletions

View file

@ -33,55 +33,140 @@ def create_input_fields_dict(inputs, prefix):
return {f"{prefix}{input_.name}": input_ for input_ in inputs} return {f"{prefix}{input_.name}": input_ for input_ in inputs}
OPENAI_INPUTS = get_filtered_inputs(OpenAIModelComponent) def _get_openai_inputs_and_fields():
AZURE_INPUTS = get_filtered_inputs(AzureChatOpenAIComponent) try:
GROQ_INPUTS = get_filtered_inputs(GroqModel) from langflow.components.models.openai import OpenAIModelComponent
ANTHROPIC_INPUTS = get_filtered_inputs(AnthropicModelComponent)
NVIDIA_INPUTS = get_filtered_inputs(NVIDIAModelComponent)
AMAZON_BEDROCK_INPUTS = get_filtered_inputs(AmazonBedrockComponent)
OPENAI_FIELDS = {input_.name: input_ for input_ in OPENAI_INPUTS} openai_inputs = get_filtered_inputs(OpenAIModelComponent)
except ImportError as e:
msg = "OpenAI is not installed. Please install it with `pip install langchain-openai`."
raise ImportError(msg) from e
return openai_inputs, {input_.name: input_ for input_ in openai_inputs}
AZURE_FIELDS = create_input_fields_dict(AZURE_INPUTS, "") def _get_azure_inputs_and_fields():
GROQ_FIELDS = create_input_fields_dict(GROQ_INPUTS, "") try:
ANTHROPIC_FIELDS = create_input_fields_dict(ANTHROPIC_INPUTS, "") from langflow.components.models.azure_openai import AzureChatOpenAIComponent
NVIDIA_FIELDS = create_input_fields_dict(NVIDIA_INPUTS, "")
AMAZON_BEDROCK_FIELDS = create_input_fields_dict(AMAZON_BEDROCK_INPUTS, "")
MODEL_PROVIDERS = ["Azure OpenAI", "OpenAI", "Groq", "Anthropic", "NVIDIA", "Amazon Bedrock"] azure_inputs = get_filtered_inputs(AzureChatOpenAIComponent)
except ImportError as e:
msg = "Azure OpenAI is not installed. Please install it with `pip install langchain-azure-openai`."
raise ImportError(msg) from e
return azure_inputs, create_input_fields_dict(azure_inputs, "")
MODEL_PROVIDERS_DICT = {
"Azure OpenAI": { def _get_groq_inputs_and_fields():
"fields": AZURE_FIELDS, try:
"inputs": AZURE_INPUTS, from langflow.components.models.groq import GroqModel
"prefix": "",
"component_class": AzureChatOpenAIComponent(), groq_inputs = get_filtered_inputs(GroqModel)
}, except ImportError as e:
"OpenAI": { msg = "Groq is not installed. Please install it with `pip install langchain-groq`."
"fields": OPENAI_FIELDS, raise ImportError(msg) from e
"inputs": OPENAI_INPUTS, return groq_inputs, create_input_fields_dict(groq_inputs, "")
def _get_anthropic_inputs_and_fields():
try:
from langflow.components.models.anthropic import AnthropicModelComponent
anthropic_inputs = get_filtered_inputs(AnthropicModelComponent)
except ImportError as e:
msg = "Anthropic is not installed. Please install it with `pip install langchain-anthropic`."
raise ImportError(msg) from e
return anthropic_inputs, create_input_fields_dict(anthropic_inputs, "")
def _get_nvidia_inputs_and_fields():
try:
from langflow.components.models.nvidia import NVIDIAModelComponent
nvidia_inputs = get_filtered_inputs(NVIDIAModelComponent)
except ImportError as e:
msg = "NVIDIA is not installed. Please install it with `pip install langchain-nvidia`."
raise ImportError(msg) from e
return nvidia_inputs, create_input_fields_dict(nvidia_inputs, "")
def _get_amazon_bedrock_inputs_and_fields():
try:
from langflow.components.models.amazon_bedrock import AmazonBedrockComponent
amazon_bedrock_inputs = get_filtered_inputs(AmazonBedrockComponent)
except ImportError as e:
msg = "Amazon Bedrock is not installed. Please install it with `pip install langchain-amazon-bedrock`."
raise ImportError(msg) from e
return amazon_bedrock_inputs, create_input_fields_dict(amazon_bedrock_inputs, "")
MODEL_PROVIDERS_DICT = {}
# Try to add each provider
try:
openai_inputs, openai_fields = _get_openai_inputs_and_fields()
MODEL_PROVIDERS_DICT["OpenAI"] = {
"fields": openai_fields,
"inputs": openai_inputs,
"prefix": "", "prefix": "",
"component_class": OpenAIModelComponent(), "component_class": OpenAIModelComponent(),
}, }
"Groq": {"fields": GROQ_FIELDS, "inputs": GROQ_INPUTS, "prefix": "", "component_class": GroqModel()}, except ImportError:
"Anthropic": { pass
"fields": ANTHROPIC_FIELDS,
"inputs": ANTHROPIC_INPUTS, try:
azure_inputs, azure_fields = _get_azure_inputs_and_fields()
MODEL_PROVIDERS_DICT["Azure OpenAI"] = {
"fields": azure_fields,
"inputs": azure_inputs,
"prefix": "",
"component_class": AzureChatOpenAIComponent(),
}
except ImportError:
pass
try:
groq_inputs, groq_fields = _get_groq_inputs_and_fields()
MODEL_PROVIDERS_DICT["Groq"] = {
"fields": groq_fields,
"inputs": groq_inputs,
"prefix": "",
"component_class": GroqModel(),
}
except ImportError:
pass
try:
anthropic_inputs, anthropic_fields = _get_anthropic_inputs_and_fields()
MODEL_PROVIDERS_DICT["Anthropic"] = {
"fields": anthropic_fields,
"inputs": anthropic_inputs,
"prefix": "", "prefix": "",
"component_class": AnthropicModelComponent(), "component_class": AnthropicModelComponent(),
}, }
"NVIDIA": { except ImportError:
"fields": NVIDIA_FIELDS, pass
"inputs": NVIDIA_INPUTS,
try:
nvidia_inputs, nvidia_fields = _get_nvidia_inputs_and_fields()
MODEL_PROVIDERS_DICT["NVIDIA"] = {
"fields": nvidia_fields,
"inputs": nvidia_inputs,
"prefix": "", "prefix": "",
"component_class": NVIDIAModelComponent(), "component_class": NVIDIAModelComponent(),
}, }
"Amazon Bedrock": { except ImportError:
"fields": AMAZON_BEDROCK_FIELDS, pass
"inputs": AMAZON_BEDROCK_INPUTS,
try:
bedrock_inputs, bedrock_fields = _get_amazon_bedrock_inputs_and_fields()
MODEL_PROVIDERS_DICT["Amazon Bedrock"] = {
"fields": bedrock_fields,
"inputs": bedrock_inputs,
"prefix": "", "prefix": "",
"component_class": AmazonBedrockComponent(), "component_class": AmazonBedrockComponent(),
}, }
} except ImportError:
pass
MODEL_PROVIDERS = list(MODEL_PROVIDERS_DICT.keys())
ALL_PROVIDER_FIELDS: list[str] = [field for provider in MODEL_PROVIDERS_DICT.values() for field in provider["fields"]] ALL_PROVIDER_FIELDS: list[str] = [field for provider in MODEL_PROVIDERS_DICT.values() for field in provider["fields"]]

View file

@ -1,5 +1,4 @@
import requests import requests
from langchain_groq import ChatGroq
from pydantic.v1 import SecretStr from pydantic.v1 import SecretStr
from typing_extensions import override from typing_extensions import override
@ -86,6 +85,12 @@ class GroqModel(LCModelComponent):
return build_config return build_config
def build_model(self) -> LanguageModel: # type: ignore[type-var] def build_model(self) -> LanguageModel: # type: ignore[type-var]
try:
from langchain_groq import ChatGroq
except ImportError as e:
msg = "langchain-groq is not installed. Please install it with `pip install langchain-groq`."
raise ImportError(msg) from e
groq_api_key = self.groq_api_key groq_api_key = self.groq_api_key
model_name = self.model_name model_name = self.model_name
max_tokens = self.max_tokens max_tokens = self.max_tokens

2
uv.lock generated
View file

@ -3910,7 +3910,7 @@ requires-dist = [
{ name = "assemblyai", specifier = ">=0.33.0" }, { name = "assemblyai", specifier = ">=0.33.0" },
{ name = "asyncer", specifier = ">=0.0.5" }, { name = "asyncer", specifier = ">=0.0.5" },
{ name = "bcrypt", specifier = "==4.0.1" }, { name = "bcrypt", specifier = "==4.0.1" },
{ name = "cachetools", specifier = ">=5.3.1" }, { name = "cachetools", specifier = ">=5.5.0" },
{ name = "celery", marker = "extra == 'all'", specifier = ">=5.3.1" }, { name = "celery", marker = "extra == 'all'", specifier = ">=5.3.1" },
{ name = "celery", marker = "extra == 'deploy'", specifier = ">=5.3.1" }, { name = "celery", marker = "extra == 'deploy'", specifier = ">=5.3.1" },
{ name = "chardet", specifier = ">=5.2.0" }, { name = "chardet", specifier = ">=5.2.0" },