mirror of
https://github.com/hwchase17/langchain.git
synced 2025-04-30 04:45:23 +00:00
Reopened as a personal repo outside the organization. ## Description - Naver HyperCLOVA X community package - Add chat model & embeddings - Add unit test & integration test - Add chat model & embeddings docs - I changed partner package(https://github.com/langchain-ai/langchain/pull/24252) to community package on this PR - Could this embeddings(https://github.com/langchain-ai/langchain/pull/21890) be deprecated? We are trying to replace it with embedding model(**ClovaXEmbeddings**) in this PR. Twitter handle: None. (if needed, contact with joonha.jeon@navercorp.com) --- you can check our previous discussion below: > one question on namespaces - would it make sense to have these in .clova namespaces instead of .naver? I would like to keep it as is, unless it is essential to unify the package name. (ClovaX is a branding for the model, and I plan to add other models and components. They need to be managed as separate classes.) > also, could you clarify the difference between ClovaEmbeddings and ClovaXEmbeddings? There are 3 models that are being serviced by embedding, and all are supported in the current PR. In addition, all the functionality of CLOVA Studio that serves actual models, such as distinguishing between test apps and service apps, is supported. The existing PR does not support this content because it is hard-coded. --------- Co-authored-by: Erick Friis <erick@langchain.dev> Co-authored-by: Vadym Barda <vadym@langchain.dev>
120 lines
3.9 KiB
Python
120 lines
3.9 KiB
Python
"""A unit test meant to catch accidental introduction of non-optional dependencies."""
|
|
|
|
from pathlib import Path
|
|
from typing import Any, Dict, Mapping
|
|
|
|
import pytest
|
|
import toml
|
|
|
|
HERE = Path(__file__).parent
|
|
|
|
PYPROJECT_TOML = HERE / "../../pyproject.toml"
|
|
|
|
|
|
@pytest.fixture()
|
|
def poetry_conf() -> Dict[str, Any]:
|
|
"""Load the pyproject.toml file."""
|
|
with open(PYPROJECT_TOML) as f:
|
|
return toml.load(f)["tool"]["poetry"]
|
|
|
|
|
|
def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
|
"""A test that checks if a new non-optional dependency is being introduced.
|
|
|
|
If this test is triggered, it means that a contributor is trying to introduce a new
|
|
required dependency. This should be avoided in most situations.
|
|
"""
|
|
# Get the dependencies from the [tool.poetry.dependencies] section
|
|
dependencies = poetry_conf["dependencies"]
|
|
|
|
is_required = {
|
|
package_name: isinstance(requirements, str)
|
|
or isinstance(requirements, list)
|
|
or not requirements.get("optional", False)
|
|
for package_name, requirements in dependencies.items()
|
|
}
|
|
required_dependencies = [
|
|
package_name for package_name, required in is_required.items() if required
|
|
]
|
|
|
|
assert sorted(required_dependencies) == sorted(
|
|
[
|
|
"PyYAML",
|
|
"SQLAlchemy",
|
|
"aiohttp",
|
|
"dataclasses-json",
|
|
"httpx-sse",
|
|
"langchain-core",
|
|
"langsmith",
|
|
"numpy",
|
|
"python",
|
|
"requests",
|
|
"pydantic-settings",
|
|
"tenacity",
|
|
"langchain",
|
|
]
|
|
)
|
|
|
|
unrequired_dependencies = [
|
|
package_name for package_name, required in is_required.items() if not required
|
|
]
|
|
in_extras = [
|
|
dep for group in poetry_conf.get("extras", {}).values() for dep in group
|
|
]
|
|
assert set(unrequired_dependencies) == set(in_extras)
|
|
|
|
|
|
def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
|
"""Check if someone is attempting to add additional test dependencies.
|
|
|
|
Only dependencies associated with test running infrastructure should be added
|
|
to the test group; e.g., pytest, pytest-cov etc.
|
|
|
|
Examples of dependencies that should NOT be included: boto3, azure, postgres, etc.
|
|
"""
|
|
|
|
test_group_deps = sorted(poetry_conf["group"]["test"]["dependencies"])
|
|
|
|
assert test_group_deps == sorted(
|
|
[
|
|
"duckdb-engine",
|
|
"freezegun",
|
|
"langchain-core",
|
|
"langchain-standard-tests",
|
|
"langchain",
|
|
"lark",
|
|
"pandas",
|
|
"pytest",
|
|
"pytest-asyncio",
|
|
"pytest-cov",
|
|
"pytest-dotenv",
|
|
"pytest-mock",
|
|
"pytest-socket",
|
|
"pytest-watcher",
|
|
"responses",
|
|
"syrupy",
|
|
"requests-mock",
|
|
# TODO: Hack to get around cffi 1.17.1 not working with py3.9, remove when
|
|
# fix is released.
|
|
"cffi",
|
|
]
|
|
)
|
|
|
|
|
|
def test_imports() -> None:
|
|
"""Test that you can import all top level things okay."""
|
|
from langchain_core.prompts import BasePromptTemplate # noqa: F401
|
|
|
|
from langchain_community.callbacks import OpenAICallbackHandler # noqa: F401
|
|
from langchain_community.chat_models import ChatOpenAI # noqa: F401
|
|
from langchain_community.document_loaders import BSHTMLLoader # noqa: F401
|
|
from langchain_community.embeddings import OpenAIEmbeddings # noqa: F401
|
|
from langchain_community.llms import OpenAI # noqa: F401
|
|
from langchain_community.retrievers import VespaRetriever # noqa: F401
|
|
from langchain_community.tools import DuckDuckGoSearchResults # noqa: F401
|
|
from langchain_community.utilities import (
|
|
SearchApiAPIWrapper, # noqa: F401
|
|
SerpAPIWrapper, # noqa: F401
|
|
)
|
|
from langchain_community.vectorstores import FAISS # noqa: F401
|