diff --git a/pyproject.toml b/pyproject.toml index 39b9033fa4d1..4015a3443069 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -95,6 +95,7 @@ dependencies = [ "langchain-google-community==2.0.3", "langchain-elasticsearch==0.3.0", "langchain-ollama==0.2.1", + "langchain-sambanova==0.1.0", "langchain-community~=0.3.10", "sqlalchemy[aiosqlite,postgresql_psycopg2binary,postgresql_psycopgbinary]>=2.0.36,<3.0.0", "atlassian-python-api==3.41.16", diff --git a/src/backend/base/langflow/base/models/model_input_constants.py b/src/backend/base/langflow/base/models/model_input_constants.py index f4c7ab5c79f7..190efda46866 100644 --- a/src/backend/base/langflow/base/models/model_input_constants.py +++ b/src/backend/base/langflow/base/models/model_input_constants.py @@ -8,6 +8,7 @@ from langflow.components.models.groq import GroqModel from langflow.components.models.nvidia import NVIDIAModelComponent from langflow.components.models.openai import OpenAIModelComponent +from langflow.components.models.sambanova import SambaNovaComponent from langflow.inputs.inputs import InputTypes, SecretStrInput from langflow.template.field.base import Input @@ -147,6 +148,17 @@ def _get_amazon_bedrock_inputs_and_fields(): return amazon_bedrock_inputs, create_input_fields_dict(amazon_bedrock_inputs, "") +def _get_sambanova_inputs_and_fields(): + try: + from langflow.components.models.sambanova import SambaNovaComponent + + sambanova_inputs = get_filtered_inputs(SambaNovaComponent) + except ImportError as e: + msg = "SambaNova is not installed. Please install it with `pip install langchain-sambanova`." + raise ImportError(msg) from e + return sambanova_inputs, create_input_fields_dict(sambanova_inputs, "") + + MODEL_PROVIDERS_DICT: dict[str, ModelProvidersDict] = {} # Try to add each provider @@ -227,6 +239,17 @@ def _get_amazon_bedrock_inputs_and_fields(): except ImportError: pass +try: + sambanova_inputs, sambanova_fields = _get_sambanova_inputs_and_fields() + MODEL_PROVIDERS_DICT["SambaNova"] = { + "fields": sambanova_fields, + "inputs": sambanova_inputs, + "prefix": "", + "component_class": SambaNovaComponent(), + } +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"]] diff --git a/src/backend/base/langflow/base/models/sambanova_constants.py b/src/backend/base/langflow/base/models/sambanova_constants.py index 88f2b7973c02..23d7f385bceb 100644 --- a/src/backend/base/langflow/base/models/sambanova_constants.py +++ b/src/backend/base/langflow/base/models/sambanova_constants.py @@ -1,4 +1,5 @@ SAMBANOVA_MODEL_NAMES = [ + "Meta-Llama-3.3-70B-Instruct", "Meta-Llama-3.1-8B-Instruct", "Meta-Llama-3.1-70B-Instruct", "Meta-Llama-3.1-405B-Instruct", @@ -6,6 +7,10 @@ "Meta-Llama-3.2-3B-Instruct", "Llama-3.2-11B-Vision-Instruct", "Llama-3.2-90B-Vision-Instruct", + "Qwen2.5-Coder-32B-Instruct", + "Qwen2.5-72B-Instruct", + "QwQ-32B-Preview", + "Qwen2-Audio-7B-Instruct", ] MODEL_NAMES = SAMBANOVA_MODEL_NAMES diff --git a/src/backend/base/langflow/components/models/sambanova.py b/src/backend/base/langflow/components/models/sambanova.py index f5bbcb4d1603..b59333001f05 100644 --- a/src/backend/base/langflow/components/models/sambanova.py +++ b/src/backend/base/langflow/components/models/sambanova.py @@ -1,4 +1,4 @@ -from langchain_community.chat_models.sambanova import ChatSambaNovaCloud +from langchain_sambanova import ChatSambaNovaCloud from pydantic.v1 import SecretStr from langflow.base.models.model import LCModelComponent @@ -18,7 +18,7 @@ class SambaNovaComponent(LCModelComponent): inputs = [ *LCModelComponent._base_inputs, StrInput( - name="sambanova_url", + name="base_url", display_name="SambaNova Cloud Base Url", advanced=True, info="The base URL of the Sambanova Cloud API. " @@ -33,7 +33,7 @@ class SambaNovaComponent(LCModelComponent): value=SAMBANOVA_MODEL_NAMES[0], ), SecretStrInput( - name="sambanova_api_key", + name="api_key", display_name="Sambanova API Key", info="The Sambanova API Key to use for the Sambanova model.", advanced=False, @@ -44,8 +44,16 @@ class SambaNovaComponent(LCModelComponent): name="max_tokens", display_name="Max Tokens", advanced=True, - value=4096, - info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.", + value=2048, + info="The maximum number of tokens to generate.", + ), + SliderInput( + name="top_p", + display_name="top_p", + advanced=True, + value=1.0, + range_spec=RangeSpec(min=0, max=1, step=0.01), + info="Model top_p", ), SliderInput( name="temperature", display_name="Temperature", value=0.1, range_spec=RangeSpec(min=0, max=2, step=0.01) @@ -53,10 +61,11 @@ class SambaNovaComponent(LCModelComponent): ] def build_model(self) -> LanguageModel: # type: ignore[type-var] - sambanova_url = self.sambanova_url - sambanova_api_key = self.sambanova_api_key + sambanova_url = self.base_url + sambanova_api_key = self.api_key model_name = self.model_name max_tokens = self.max_tokens + top_p = self.top_p temperature = self.temperature api_key = SecretStr(sambanova_api_key).get_secret_value() if sambanova_api_key else None @@ -65,6 +74,7 @@ def build_model(self) -> LanguageModel: # type: ignore[type-var] model=model_name, max_tokens=max_tokens or 1024, temperature=temperature or 0.07, + top_p=top_p, sambanova_url=sambanova_url, sambanova_api_key=api_key, ) diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json b/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json index 8080587514f6..9b5e706bd01e 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Instagram Copywriter.json @@ -1402,6 +1402,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json b/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json index ad4bb2f7878f..69800c4d8aa7 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Market Research.json @@ -1339,6 +1339,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json index 76e530eada15..5226172e6380 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Research Agent.json @@ -1339,6 +1339,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json b/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json index 9477282cd694..63810dcbc2ae 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/SaaS Pricing.json @@ -717,6 +717,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json index 2d5220c83599..2c11def58d33 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Sequential Tasks Agents .json @@ -706,6 +706,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", @@ -1289,6 +1290,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", @@ -2693,6 +2695,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", @@ -3193,7 +3196,7 @@ "data": { "id": "note-7I7gz", "node": { - "description": "## Configure the agent by obtaining your OpenAI API key from [platform.openai.com](https://platform.openai.com). Under \"Model Provider\", choose:\n- OpenAI: Default, requires only API key\n- Anthropic/Azure/Groq/NVIDIA: Each requires their own API keys\n- Custom: Use your own model endpoint + authentication\n\nSelect model and input API key before running the flow.", + "description": "## Configure the agent by obtaining your OpenAI API key from [platform.openai.com](https://platform.openai.com). Under \"Model Provider\", choose:\n- OpenAI: Default, requires only API key\n- Anthropic/Azure/Groq/NVIDIA/SambaNova: Each requires their own API keys\n- Custom: Use your own model endpoint + authentication\n\nSelect model and input API key before running the flow.", "display_name": "", "documentation": "", "template": { diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json b/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json index 6b8d22c80c86..6b74b15f9cc2 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Simple Agent.json @@ -215,6 +215,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json index 8463a00082b0..71c86d02ebdb 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Travel Planning Agents.json @@ -823,6 +823,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", @@ -1379,6 +1380,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", @@ -1935,6 +1937,7 @@ "Groq", "NVIDIA", "OpenAI", + "SambaNova", "Custom" ], "placeholder": "", diff --git a/uv.lock b/uv.lock index 18a8f3ae8bd9..9aee93cd374a 100644 --- a/uv.lock +++ b/uv.lock @@ -3731,6 +3731,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/52/91aeebc40051014a143f6aab77afd6a2acf17311ea461709317d804c7419/langchain_pinecone-0.2.2-py3-none-any.whl", hash = "sha256:3697455bbf0dc916f82bc4b31c8c1540eda45a4265ed7e108464a1992036c2ea", size = 11672 }, ] +[[package]] +name = "langchain-sambanova" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "sseclient-py" }, + { name = "types-requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/dd/88a2aa89b24b2f1e245bf39989a6cd8fe3b21f09171326e1f77696e853d9/langchain_sambanova-0.1.0.tar.gz", hash = "sha256:70ead669b4d440b50fd02e11d5e7e3249b61cf7bb73a79173e40da410b006c0f", size = 23297 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/5a/5a1a3671f70de77d6d8b06c170ba562776c6d88ffbb74cbdb12dc4fbef80/langchain_sambanova-0.1.0-py3-none-any.whl", hash = "sha256:b740011b136414e1ee503bca551bcd869731418457e27510de3a323476d09797", size = 23987 }, +] + [[package]] name = "langchain-tests" version = "0.3.9" @@ -3839,6 +3853,7 @@ dependencies = [ { name = "langchain-ollama" }, { name = "langchain-openai" }, { name = "langchain-pinecone" }, + { name = "langchain-sambanova" }, { name = "langchain-unstructured" }, { name = "langflow-base" }, { name = "langfuse" }, @@ -4001,6 +4016,7 @@ requires-dist = [ { name = "langchain-ollama", specifier = "==0.2.1" }, { name = "langchain-openai", specifier = "==0.2.12" }, { name = "langchain-pinecone", specifier = "==0.2.2" }, + { name = "langchain-sambanova", specifier = "==0.1.0" }, { name = "langchain-unstructured", specifier = "==0.1.5" }, { name = "langflow-base", editable = "src/backend/base" }, { name = "langfuse", specifier = "==2.53.9" },