From c8f18a25242f5ef7586b68cad00d289cfc22e138 Mon Sep 17 00:00:00 2001 From: Eugene Yurtsev Date: Tue, 30 Apr 2024 10:55:29 -0400 Subject: [PATCH] langchain[patch]: Update import handling in `adapters` (#21079) --- libs/langchain/langchain/adapters/openai.py | 62 ++++++++++++++------- libs/langchain/scripts/lint_imports.sh | 30 +++++----- 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/libs/langchain/langchain/adapters/openai.py b/libs/langchain/langchain/adapters/openai.py index 8c121453ad1..445eccd56bd 100644 --- a/libs/langchain/langchain/adapters/openai.py +++ b/libs/langchain/langchain/adapters/openai.py @@ -1,28 +1,52 @@ -import warnings +from typing import TYPE_CHECKING, Any -from langchain_core._api import LangChainDeprecationWarning +from langchain._api import create_importer -from langchain.utils.interactive_env import is_interactive_env +if TYPE_CHECKING: + from langchain_community.adapters.openai import ( + Chat, + ChatCompletion, + ChatCompletionChunk, + ChatCompletions, + Choice, + ChoiceChunk, + Completions, + IndexableBaseModel, + chat, + convert_dict_to_message, + convert_message_to_dict, + convert_messages_for_finetuning, + convert_openai_messages, + ) + +# Create a way to dynamically look up deprecated imports. +# Used to consolidate logic for raising deprecation warnings and +# handling optional imports. +MODULE_LOOKUP = { + "IndexableBaseModel": "langchain_community.adapters.openai", + "Choice": "langchain_community.adapters.openai", + "ChatCompletions": "langchain_community.adapters.openai", + "ChoiceChunk": "langchain_community.adapters.openai", + "ChatCompletionChunk": "langchain_community.adapters.openai", + "convert_dict_to_message": "langchain_community.adapters.openai", + "convert_message_to_dict": "langchain_community.adapters.openai", + "convert_openai_messages": "langchain_community.adapters.openai", + "ChatCompletion": "langchain_community.adapters.openai", + "convert_messages_for_finetuning": "langchain_community.adapters.openai", + "Completions": "langchain_community.adapters.openai", + "Chat": "langchain_community.adapters.openai", + "chat": "langchain_community.adapters.openai", +} + +_import_attribute = create_importer(__file__, deprecated_lookups=MODULE_LOOKUP) -def __getattr__(name: str) -> None: - # If not in interactive env, raise warning. - from langchain_community.adapters import openai - - if not is_interactive_env(): - warnings.warn( - "Importing from langchain is deprecated. Importing from " - "langchain will no longer be supported as of langchain==0.2.0. " - "Instead of `from langchain.adapters.openai import {name}` " - "Use `from langchain_community.adapters.openai import {name}`." - "To install langchain-community run `pip install -U langchain-community`.", - category=LangChainDeprecationWarning, - ) - - return getattr(openai, name) +def __getattr__(name: str) -> Any: + """Look up attributes dynamically.""" + return _import_attribute(name) -__all__ = [ # noqa: F822 +__all__ = [ "IndexableBaseModel", "Choice", "ChatCompletions", diff --git a/libs/langchain/scripts/lint_imports.sh b/libs/langchain/scripts/lint_imports.sh index c239577ae13..5716202ab3d 100755 --- a/libs/langchain/scripts/lint_imports.sh +++ b/libs/langchain/scripts/lint_imports.sh @@ -7,23 +7,23 @@ errors=0 # Check the conditions git grep '^from langchain import' langchain | grep -vE 'from langchain import (__version__|hub)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/pydantic_v1 | grep -vE 'from langchain.(pydantic_v1)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/load | grep -vE 'from langchain.(pydantic_v1|load)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/utils | grep -vE 'from langchain.(pydantic_v1|utils)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/schema | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|env)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/adapters | grep -vE 'from langchain.(pydantic_v1|utils|schema|load)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/callbacks | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/pydantic_v1 | grep -vE 'from langchain.(pydantic_v1|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/load | grep -vE 'from langchain.(pydantic_v1|load|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/utils | grep -vE 'from langchain.(pydantic_v1|utils|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/schema | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|env|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/adapters | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/callbacks | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|_api)' && errors=$((errors+1)) # TODO: it's probably not amazing so that so many other modules depend on `langchain_community.utilities`, because there can be a lot of imports there -git grep '^from langchain\.' langchain/utilities | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|utilities)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/storage | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|storage|utilities)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/utilities | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|utilities|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/storage | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|storage|utilities|_api)' && errors=$((errors+1)) git grep '^from langchain\.' langchain/prompts | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|prompts|_api)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/output_parsers | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|prompts|_api|output_parsers)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/llms | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|prompts|llms|utilities|globals)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/chat_models | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|llms|prompts|adapters|chat_models|utilities|globals)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/embeddings | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|storage|llms|embeddings|utilities)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/docstore | grep -vE 'from langchain.(pydantic_v1|utils|schema|docstore)' && errors=$((errors+1)) -git grep '^from langchain\.' langchain/vectorstores | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|_api|storage|llms|docstore|vectorstores|utilities)' && errors=$((errors+1)) - +git grep '^from langchain\.' langchain/output_parsers | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|prompts|_api|output_parsers|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/llms | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|prompts|llms|utilities|globals|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/chat_models | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|llms|prompts|adapters|chat_models|utilities|globals|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/embeddings | grep -vE 'from langchain.(pydantic_v1|utils|schema|load|callbacks|env|storage|llms|embeddings|utilities|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/docstore | grep -vE 'from langchain.(pydantic_v1|utils|schema|docstore|_api)' && errors=$((errors+1)) +git grep '^from langchain\.' langchain/vectorstores | grep -vE 'from +langchain.(pydantic_v1|utils|schema|load|callbacks|env|_api|storage|llms|docstore|vectorstores|utilities|_api)' && errors=$((errors+1)) # make sure not importing from langchain_experimental git --no-pager grep '^from langchain_experimental\.' . && errors=$((errors+1))