From cf1804932ff51c380973a4dd9f5584767fb24e5c Mon Sep 17 00:00:00 2001 From: Chester Curme Date: Tue, 17 Feb 2026 14:39:22 -0500 Subject: [PATCH] x --- .github/workflows/check_core_versions.yml | 16 +++++ libs/partners/anthropic/Makefile | 7 +- .../anthropic/langchain_anthropic/__init__.py | 2 + .../anthropic/langchain_anthropic/_version.py | 3 + .../anthropic/scripts/check_version.py | 65 +++++++++++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 libs/partners/anthropic/langchain_anthropic/_version.py create mode 100644 libs/partners/anthropic/scripts/check_version.py diff --git a/.github/workflows/check_core_versions.yml b/.github/workflows/check_core_versions.yml index 7a89512ecc0..6f88747d517 100644 --- a/.github/workflows/check_core_versions.yml +++ b/.github/workflows/check_core_versions.yml @@ -9,6 +9,8 @@ on: paths: - "libs/core/pyproject.toml" - "libs/core/langchain_core/version.py" + - "libs/partners/anthropic/pyproject.toml" + - "libs/partners/anthropic/langchain_anthropic/_version.py" permissions: contents: read @@ -49,3 +51,17 @@ jobs: else echo "Langchain v1 versions match: $LANGCHAIN_PYPROJECT_VERSION" fi + + # Check langchain-anthropic versions + ANTHROPIC_PYPROJECT_VERSION=$(grep -Po '(?<=^version = ")[^"]*' libs/partners/anthropic/pyproject.toml) + ANTHROPIC_VERSION_PY_VERSION=$(grep -Po '(?<=^__version__ = ")[^"]*' libs/partners/anthropic/langchain_anthropic/_version.py) + + # Compare langchain-anthropic versions + if [ "$ANTHROPIC_PYPROJECT_VERSION" != "$ANTHROPIC_VERSION_PY_VERSION" ]; then + echo "langchain-anthropic versions in pyproject.toml and _version.py do not match!" + echo "pyproject.toml version: $ANTHROPIC_PYPROJECT_VERSION" + echo "_version.py version: $ANTHROPIC_VERSION_PY_VERSION" + exit 1 + else + echo "Langchain-anthropic versions match: $ANTHROPIC_PYPROJECT_VERSION" + fi diff --git a/libs/partners/anthropic/Makefile b/libs/partners/anthropic/Makefile index f3fbf4f7a28..4585be63975 100644 --- a/libs/partners/anthropic/Makefile +++ b/libs/partners/anthropic/Makefile @@ -51,16 +51,21 @@ format format_diff: check_imports: $(shell find langchain_anthropic -name '*.py') uv run --all-groups python ./scripts/check_imports.py $^ +check_version: + uv run python ./scripts/check_version.py + ###################### # HELP ###################### help: @echo '----' - @echo 'check_imports - check imports' + @echo 'check_imports - check imports' + @echo 'check_version - validate version consistency' @echo 'format - run code formatters' @echo 'lint - run linters' @echo 'type - run type checking' @echo 'test - run unit tests' @echo 'tests - run unit tests' @echo 'test TEST_FILE= - run all tests in file' +T_FILE= - run all tests in file' diff --git a/libs/partners/anthropic/langchain_anthropic/__init__.py b/libs/partners/anthropic/langchain_anthropic/__init__.py index 84bfeae4693..05c57e7117b 100644 --- a/libs/partners/anthropic/langchain_anthropic/__init__.py +++ b/libs/partners/anthropic/langchain_anthropic/__init__.py @@ -1,5 +1,6 @@ """Claude (Anthropic) partner package for LangChain.""" +from langchain_anthropic._version import __version__ from langchain_anthropic.chat_models import ( ChatAnthropic, convert_to_anthropic_tool, @@ -7,6 +8,7 @@ from langchain_anthropic.chat_models import ( from langchain_anthropic.llms import AnthropicLLM __all__ = [ + "__version__", "AnthropicLLM", "ChatAnthropic", "convert_to_anthropic_tool", diff --git a/libs/partners/anthropic/langchain_anthropic/_version.py b/libs/partners/anthropic/langchain_anthropic/_version.py new file mode 100644 index 00000000000..ebf8540828c --- /dev/null +++ b/libs/partners/anthropic/langchain_anthropic/_version.py @@ -0,0 +1,3 @@ +"""Version information for langchain-anthropic.""" + +__version__ = "1.3.3" # x-release-please-version diff --git a/libs/partners/anthropic/scripts/check_version.py b/libs/partners/anthropic/scripts/check_version.py new file mode 100644 index 00000000000..77f80ddf5ac --- /dev/null +++ b/libs/partners/anthropic/scripts/check_version.py @@ -0,0 +1,65 @@ +"""Check version consistency between `pyproject.toml` and `_version.py`. + +This script validates that the version defined in pyproject.toml matches the `__version__` +variable in `langchain_anthropic/_version.py`. Intended for use as a pre-commit hook to +prevent version mismatches. +""" + +import re +import sys +from pathlib import Path + + +def get_pyproject_version(pyproject_path: Path) -> str | None: + """Extract version from `pyproject.toml`.""" + content = pyproject_path.read_text(encoding="utf-8") + match = re.search(r'^version\s*=\s*"([^"]+)"', content, re.MULTILINE) + return match.group(1) if match else None + + +def get_version_py_version(version_path: Path) -> str | None: + """Extract `__version__` from `_version.py`.""" + content = version_path.read_text(encoding="utf-8") + match = re.search(r'^__version__\s*=\s*"([^"]+)"', content, re.MULTILINE) + return match.group(1) if match else None + + +def main() -> int: + """Validate version consistency.""" + script_dir = Path(__file__).parent + package_dir = script_dir.parent + + pyproject_path = package_dir / "pyproject.toml" + version_path = package_dir / "langchain_anthropic" / "_version.py" + + if not pyproject_path.exists(): + print(f"Error: {pyproject_path} not found") # noqa: T201 + return 1 + + if not version_path.exists(): + print(f"Error: {version_path} not found") # noqa: T201 + return 1 + + pyproject_version = get_pyproject_version(pyproject_path) + version_py_version = get_version_py_version(version_path) + + if pyproject_version is None: + print("Error: Could not find version in pyproject.toml") # noqa: T201 + return 1 + + if version_py_version is None: + print("Error: Could not find __version__ in langchain_anthropic/_version.py") # noqa: T201 + return 1 + + if pyproject_version != version_py_version: + print("Error: Version mismatch detected!") # noqa: T201 + print(f" pyproject.toml: {pyproject_version}") # noqa: T201 + print(f" langchain_anthropic/_version.py: {version_py_version}") # noqa: T201 + return 1 + + print(f"Version check passed: {pyproject_version}") # noqa: T201 + return 0 + + +if __name__ == "__main__": + sys.exit(main())