From 7ff7c4f81be96e024b4aacf8fdce11ef89a93834 Mon Sep 17 00:00:00 2001 From: Aryan Agarwal <67140930+AryanAgarwal27@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:04:13 -0700 Subject: [PATCH 1/3] docs: Refactored AWS Lambda Tool to Use AgentExecutor instead of initialize agent (#30267) ## Description: - Removed deprecated `initialize_agent()` usage in AWS Lambda integration. - Replaced it with `AgentExecutor` for compatibility with LangChain v0.3. - Fixed documentation linting errors. ## Issue: - No specific issue linked, but this resolves the use of deprecated agent initialization. ## Dependencies: - No new dependencies added. ## Request for Review: - Please verify if the implementation is correct. - If approved and merged, I will proceed with updating other related files. ## Twitter Handle (Optional): I don't have a Twitter but here is my LinkedIn instead (https://www.linkedin.com/in/aryan1227/) --- docs/docs/integrations/tools/awslambda.ipynb | 22 +++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/docs/integrations/tools/awslambda.ipynb b/docs/docs/integrations/tools/awslambda.ipynb index 08a7ed4e692..c7bfb5039f8 100644 --- a/docs/docs/integrations/tools/awslambda.ipynb +++ b/docs/docs/integrations/tools/awslambda.ipynb @@ -62,23 +62,25 @@ }, "outputs": [], "source": [ - "from langchain.agents import AgentType, initialize_agent, load_tools\n", + "from langchain.agents import AgentExecutor, OpenAIFunctionsAgent\n", + "from langchain.tools import Tool\n", "from langchain_openai import OpenAI\n", "\n", "llm = OpenAI(temperature=0)\n", "\n", - "tools = load_tools(\n", - " [\"awslambda\"],\n", - " awslambda_tool_name=\"email-sender\",\n", - " awslambda_tool_description=\"sends an email with the specified content to test@testing123.com\",\n", - " function_name=\"testFunction1\",\n", + "tools = Tool(\n", + " name=\"email-sender\",\n", + " description=\"Sends an email with the specified content to test@testing123.com\",\n", + " func=lambda input_text: f\"Email sent to test@testing123.com with content: {input_text}\",\n", ")\n", "\n", - "agent = initialize_agent(\n", - " tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True\n", - ")\n", + "agent = OpenAIFunctionsAgent(llm=llm, tools=[tools])\n", "\n", - "agent.run(\"Send an email to test@testing123.com saying hello world.\")" + "agent_executor = AgentExecutor(agent=agent, tools=[tools], verbose=True)\n", + "\n", + "agent_executor.invoke(\n", + " {\"input\": \" Send an email to test@testing123.com saying hello world.\"}\n", + ")" ] }, { From f6a17fbc564ee8e75cdbe376f22171f78fc86159 Mon Sep 17 00:00:00 2001 From: amuwall Date: Tue, 18 Mar 2025 10:09:02 +0800 Subject: [PATCH 2/3] community: fix import exception too constrictive (#30218) Fix this issue #30097 --- .../document_loaders/parsers/images.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libs/community/langchain_community/document_loaders/parsers/images.py b/libs/community/langchain_community/document_loaders/parsers/images.py index b053b94d491..eb3da4d2a11 100644 --- a/libs/community/langchain_community/document_loaders/parsers/images.py +++ b/libs/community/langchain_community/document_loaders/parsers/images.py @@ -45,24 +45,24 @@ class BaseImageBlobParser(BaseBlobParser): """ try: from PIL import Image as Img - - with blob.as_bytes_io() as buf: - if blob.mimetype == "application/x-npy": - img = Img.fromarray(numpy.load(buf)) - else: - img = Img.open(buf) - content = self._analyze_image(img) - logger.debug("Image text: %s", content.replace("\n", "\\n")) - yield Document( - page_content=content, - metadata={**blob.metadata, **{"source": blob.source}}, - ) except ImportError: raise ImportError( "`Pillow` package not found, please install it with " "`pip install Pillow`" ) + with blob.as_bytes_io() as buf: + if blob.mimetype == "application/x-npy": + img = Img.fromarray(numpy.load(buf)) + else: + img = Img.open(buf) + content = self._analyze_image(img) + logger.debug("Image text: %s", content.replace("\n", "\\n")) + yield Document( + page_content=content, + metadata={**blob.metadata, **{"source": blob.source}}, + ) + class RapidOCRBlobParser(BaseImageBlobParser): """Parser for extracting text from images using the RapidOCR library. From b91daf06eb5380e0ef453ddea586901c5669106d Mon Sep 17 00:00:00 2001 From: ccurme Date: Tue, 18 Mar 2025 10:50:34 -0400 Subject: [PATCH 3/3] groq[minor]: remove default model (#30341) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The default model for `ChatGroq`, `"mixtral-8x7b-32768"`, is being retired on March 20, 2025. Here we remove the default, such that model names must be explicitly specified (being explicit is a good practice here, and avoids the need for breaking changes down the line). This change will be released in a minor version bump to 0.3. This follows https://github.com/langchain-ai/langchain/pull/30161 (released in version 0.2.5), where we began generating warnings to this effect. ![Screenshot 2025-03-18 at 10 33 27 AM](https://github.com/user-attachments/assets/f1e4b302-c62a-43b0-aa86-eaf9271e86cb) --- .../groq/langchain_groq/chat_models.py | 25 +------------------ .../groq/tests/unit_tests/test_chat_models.py | 21 ---------------- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/libs/partners/groq/langchain_groq/chat_models.py b/libs/partners/groq/langchain_groq/chat_models.py index bb4115b850a..a95722695d8 100644 --- a/libs/partners/groq/langchain_groq/chat_models.py +++ b/libs/partners/groq/langchain_groq/chat_models.py @@ -88,8 +88,6 @@ from typing_extensions import Self from langchain_groq.version import __version__ -WARNED_DEFAULT_MODEL = False - class ChatGroq(BaseChatModel): """`Groq` Chat large language models API. @@ -305,7 +303,7 @@ class ChatGroq(BaseChatModel): client: Any = Field(default=None, exclude=True) #: :meta private: async_client: Any = Field(default=None, exclude=True) #: :meta private: - model_name: str = Field(default="mixtral-8x7b-32768", alias="model") + model_name: str = Field(alias="model") """Model name to use.""" temperature: float = 0.7 """What sampling temperature to use.""" @@ -353,27 +351,6 @@ class ChatGroq(BaseChatModel): populate_by_name=True, ) - @model_validator(mode="before") - @classmethod - def warn_default_model(cls, values: Dict[str, Any]) -> Any: - """Warning anticipating removal of default model.""" - # TODO(ccurme): remove this warning in 0.3.0 when default model is removed - global WARNED_DEFAULT_MODEL - if ( - "model" not in values - and "model_name" not in values - and not WARNED_DEFAULT_MODEL - ): - warnings.warn( - "Groq is retiring the default model for ChatGroq, mixtral-8x7b-32768, " - "on March 20, 2025. Requests with the default model will start failing " - "on that date. Version 0.3.0 of langchain-groq will remove the " - "default. Please specify `model` explicitly, e.g., " - "`model='mistral-saba-24b'` or `model='llama-3.3-70b-versatile'`.", - ) - WARNED_DEFAULT_MODEL = True - return values - @model_validator(mode="before") @classmethod def build_extra(cls, values: Dict[str, Any]) -> Any: diff --git a/libs/partners/groq/tests/unit_tests/test_chat_models.py b/libs/partners/groq/tests/unit_tests/test_chat_models.py index 583b562b285..c14f793e6bc 100644 --- a/libs/partners/groq/tests/unit_tests/test_chat_models.py +++ b/libs/partners/groq/tests/unit_tests/test_chat_models.py @@ -2,7 +2,6 @@ import json import os -import warnings from typing import Any from unittest.mock import AsyncMock, MagicMock, patch @@ -280,23 +279,3 @@ def test_groq_serialization() -> None: # Ensure a None was preserved assert llm.groq_api_base == llm2.groq_api_base - - -def test_groq_warns_default_model() -> None: - """Test that a warning is raised if a default model is used.""" - - # Delete this test in 0.3 release, when the default model is removed. - - # Test no warning if model is specified - with warnings.catch_warnings(): - warnings.simplefilter("error") - ChatGroq(model="foo") - - # Test warns if default model is used - with pytest.warns(match="default model"): - ChatGroq() - - # Test only warns once - with warnings.catch_warnings(): - warnings.simplefilter("error") - ChatGroq()