diff --git a/.github/workflows/_pydantic_compatibility.yml b/.github/workflows/_pydantic_compatibility.yml new file mode 100644 index 00000000000..5a54c2f53c7 --- /dev/null +++ b/.github/workflows/_pydantic_compatibility.yml @@ -0,0 +1,76 @@ +name: pydantic v1/v2 compatibility + +on: + workflow_call: + inputs: + working-directory: + required: true + type: string + description: "From which folder this pipeline executes" + +env: + POETRY_VERSION: "1.5.1" + +jobs: + build: + defaults: + run: + working-directory: ${{ inputs.working-directory }} + runs-on: ubuntu-latest + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Pydantic v1/v2 compatibility - Python ${{ matrix.python-version }} + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ inputs.working-directory }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: pydantic-cross-compat + install-command: poetry install + - name: Install the opposite major version of pydantic + # If normal tests use pydantic v1, here we'll use v2, and vice versa. + shell: bash + run: | + # Determine the major part of pydantic version + REGULAR_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + if [[ "$REGULAR_VERSION" == "1" ]]; then + PYDANTIC_DEP=">=2.1,<3" + TEST_WITH_VERSION="2" + elif [[ "$REGULAR_VERSION" == "2" ]]; then + PYDANTIC_DEP="<2" + TEST_WITH_VERSION="1" + else + echo "Unexpected pydantic major version '$REGULAR_VERSION', cannot determine which version to use for cross-compatibility test." + exit 1 + fi + + # Install via `pip` instead of `poetry add` to avoid changing lockfile, + # which would prevent caching from working: the cache would get saved + # to a different key than where it gets loaded from. + poetry run pip install "pydantic${PYDANTIC_DEP}" + + # Ensure that the correct pydantic is installed now. + echo "Checking pydantic version... Expecting ${TEST_WITH_VERSION}" + + # Determine the major part of pydantic version + CURRENT_VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) + + # Check that the major part of pydantic version is as expected, if not + # raise an error + if [[ "$CURRENT_VERSION" != "$TEST_WITH_VERSION" ]]; then + echo "Error: expected pydantic version ${CURRENT_VERSION} to have been installed, but found: ${TEST_WITH_VERSION}" + exit 1 + fi + echo "Found pydantic version ${CURRENT_VERSION}, as expected" + - name: Run pydantic compatibility tests + shell: bash + run: make test diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 3cc424cb7a1..179b6303d76 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -7,10 +7,6 @@ on: required: true type: string description: "From which folder this pipeline executes" - test_type: - type: string - description: "Test types to run" - default: '["core", "extended", "core-pydantic-2"]' env: POETRY_VERSION: "1.5.1" @@ -28,8 +24,7 @@ jobs: - "3.9" - "3.10" - "3.11" - test_type: ${{ fromJSON(inputs.test_type) }} - name: Python ${{ matrix.python-version }} ${{ matrix.test_type }} + name: Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} @@ -38,51 +33,8 @@ jobs: python-version: ${{ matrix.python-version }} working-directory: ${{ inputs.working-directory }} poetry-version: ${{ env.POETRY_VERSION }} - cache-key: ${{ matrix.test_type }} - install-command: | - if [ "${{ matrix.test_type }}" == "core" ]; then - echo "Running core tests, installing dependencies with poetry..." - poetry install - elif [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - echo "Running core-pydantic-v2 tests, installing dependencies with poetry..." - poetry install - - # Install via `pip` instead of `poetry add` to avoid changing lockfile, - # which would prevent caching from working: the cache would get saved - # to a different key than where it gets loaded from. - poetry run pip install 'pydantic>=2.1,<3' - else - echo "Running extended tests, installing dependencies with poetry..." - poetry install -E extended_testing - fi - - name: Verify pydantic version - run: | - if [ "${{ matrix.test_type }}" == "core-pydantic-2" ]; then - EXPECTED_VERSION=2 - else - EXPECTED_VERSION=1 - fi - echo "Checking pydantic version... Expecting ${EXPECTED_VERSION}" - - # Determine the major part of pydantic version - VERSION=$(poetry run python -c "import pydantic; print(pydantic.__version__)" | cut -d. -f1) - - # Check that the major part of pydantic version is as expected, if not - # raise an error - if [[ "$VERSION" -ne $EXPECTED_VERSION ]]; then - echo "Error: pydantic version must be equal to ${EXPECTED_VERSION}; Found: ${VERSION}" - exit 1 - fi - echo "Found pydantic version ${VERSION}, as expected" - shell: bash - - name: Run ${{matrix.test_type}} tests - run: | - case "${{ matrix.test_type }}" in - core | core-pydantic-2) - make test - ;; - *) - make extended_tests - ;; - esac + cache-key: core + install-command: poetry install + - name: Run core tests shell: bash + run: make test diff --git a/.github/workflows/langchain_ci.yml b/.github/workflows/langchain_ci.yml index 9dfbd8c3d6e..b91e039ea6f 100644 --- a/.github/workflows/langchain_ci.yml +++ b/.github/workflows/langchain_ci.yml @@ -8,10 +8,15 @@ on: paths: - '.github/workflows/_lint.yml' - '.github/workflows/_test.yml' + - '.github/workflows/_pydantic_compatibility.yml' - '.github/workflows/langchain_ci.yml' - 'libs/langchain/**' workflow_dispatch: # Allows to trigger the workflow manually in GitHub UI +env: + POETRY_VERSION: "1.5.1" + WORKDIR: "libs/langchain" + jobs: lint: uses: @@ -19,10 +24,45 @@ jobs: with: working-directory: libs/langchain secrets: inherit + test: uses: ./.github/workflows/_test.yml with: working-directory: libs/langchain - test_type: '["core", "extended", "core-pydantic-2"]' - secrets: inherit \ No newline at end of file + secrets: inherit + + pydantic-compatibility: + uses: + ./.github/workflows/_pydantic_compatibility.yml + with: + working-directory: libs/langchain + secrets: inherit + + extended-tests: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ${{ env.WORKDIR }} + strategy: + matrix: + python-version: + - "3.8" + - "3.9" + - "3.10" + - "3.11" + name: Python ${{ matrix.python-version }} extended tests + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: "./.github/actions/poetry_setup" + with: + python-version: ${{ matrix.python-version }} + working-directory: ${{ env.WORKDIR }} + poetry-version: ${{ env.POETRY_VERSION }} + cache-key: extended + install-command: | + echo "Running extended tests, installing dependencies with poetry..." + poetry install -E extended_testing + - name: Run extended tests + run: make extended_tests diff --git a/.github/workflows/langchain_experimental_ci.yml b/.github/workflows/langchain_experimental_ci.yml index 9c95634e49c..e1d6e66a846 100644 --- a/.github/workflows/langchain_experimental_ci.yml +++ b/.github/workflows/langchain_experimental_ci.yml @@ -25,5 +25,4 @@ jobs: ./.github/workflows/_test.yml with: working-directory: libs/experimental - test_type: '["core"]' - secrets: inherit \ No newline at end of file + secrets: inherit