mirror of
https://github.com/hwchase17/langchain.git
synced 2026-02-04 08:10:25 +00:00
Compare commits
126 Commits
cc/multi_m
...
langchain=
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dafe0e2e2 | ||
|
|
26a75d9386 | ||
|
|
a40db45a69 | ||
|
|
13c67127b9 | ||
|
|
5db6442ad9 | ||
|
|
88dca23f8a | ||
|
|
91fa2c3057 | ||
|
|
b42e3c4556 | ||
|
|
540ec89e58 | ||
|
|
bdf045f9cd | ||
|
|
78f0568d43 | ||
|
|
895d20c12c | ||
|
|
a34c0c3e65 | ||
|
|
899eae0403 | ||
|
|
65e94a80d1 | ||
|
|
42514d626d | ||
|
|
dbccfc6da9 | ||
|
|
6498021818 | ||
|
|
76e9546240 | ||
|
|
1aed3e966d | ||
|
|
a5106252bf | ||
|
|
0f553cdcf0 | ||
|
|
927b2526c3 | ||
|
|
84146f365f | ||
|
|
ff3db37670 | ||
|
|
edf8b65dff | ||
|
|
36b15b9935 | ||
|
|
ed46da39d1 | ||
|
|
48909cf936 | ||
|
|
e0d5fe6010 | ||
|
|
a2d6306339 | ||
|
|
ac64eccaa0 | ||
|
|
42d980bcd8 | ||
|
|
322ad54300 | ||
|
|
cc055b2e76 | ||
|
|
1f93811019 | ||
|
|
9a140c58c8 | ||
|
|
c1e980ab67 | ||
|
|
7b7ae76a08 | ||
|
|
76ebfe6bce | ||
|
|
33e1e28dd7 | ||
|
|
0397f46ab8 | ||
|
|
938b59af9f | ||
|
|
e6a7d1a01f | ||
|
|
2efa99b7f0 | ||
|
|
fb827c5bf1 | ||
|
|
2cf7cd52bd | ||
|
|
2c8d3659bf | ||
|
|
623781bab2 | ||
|
|
0d7dc22d61 | ||
|
|
93ed105475 | ||
|
|
a1573ecaf4 | ||
|
|
ff01ae62a2 | ||
|
|
9af02a5a4c | ||
|
|
79bd2b6e43 | ||
|
|
f990dfa535 | ||
|
|
ab9b38cfe3 | ||
|
|
2620666fad | ||
|
|
b0b0371fdc | ||
|
|
03ae7d4523 | ||
|
|
5f448331c2 | ||
|
|
a87d670630 | ||
|
|
38cb39f3ba | ||
|
|
3dc938b0ba | ||
|
|
99ed91fd71 | ||
|
|
42988b8f62 | ||
|
|
fbf271fcb9 | ||
|
|
b432d3ca75 | ||
|
|
26c7a54001 | ||
|
|
c74e68647b | ||
|
|
3bb8ea6527 | ||
|
|
39c4129e38 | ||
|
|
2358a5a65c | ||
|
|
eb2d8243d9 | ||
|
|
035892f0df | ||
|
|
bc4c706f82 | ||
|
|
1f309366ac | ||
|
|
98a0cf2ea2 | ||
|
|
e6136ca0d5 | ||
|
|
795ebf081c | ||
|
|
488dfb4ffa | ||
|
|
d3b9a4ea18 | ||
|
|
43900925d4 | ||
|
|
2f2b06e754 | ||
|
|
d54b964540 | ||
|
|
4361786f4b | ||
|
|
b5229bb86c | ||
|
|
b643307826 | ||
|
|
4c24c8c4d9 | ||
|
|
d8faef3549 | ||
|
|
c1ea9518b2 | ||
|
|
7a3643effa | ||
|
|
407f331beb | ||
|
|
584a4bd9f6 | ||
|
|
0064cc4751 | ||
|
|
d9d8735d9f | ||
|
|
fb4adb444d | ||
|
|
dd47b8c454 | ||
|
|
1c634f9436 | ||
|
|
e939cd462a | ||
|
|
bc24f60a39 | ||
|
|
7a8d5586de | ||
|
|
3898048b49 | ||
|
|
cfa56be510 | ||
|
|
fb79799571 | ||
|
|
d9ce5f4464 | ||
|
|
d6e2af40eb | ||
|
|
1a22baf999 | ||
|
|
e20603e225 | ||
|
|
c71fc8b58a | ||
|
|
1a4af623f1 | ||
|
|
dfce027c57 | ||
|
|
701387066c | ||
|
|
ea838e80c7 | ||
|
|
4dcc659f48 | ||
|
|
dcbedef4d8 | ||
|
|
070e12f886 | ||
|
|
aa7637b2e4 | ||
|
|
b7bdf0b81a | ||
|
|
e034999cb6 | ||
|
|
a1a6ef10a9 | ||
|
|
6693a0c80b | ||
|
|
4202c1411b | ||
|
|
10f677f2f7 | ||
|
|
f71cf387f0 | ||
|
|
b07e6be354 |
21
.github/actions/uv_setup/action.yml
vendored
Normal file
21
.github/actions/uv_setup/action.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# TODO: https://docs.astral.sh/uv/guides/integration/github/#caching
|
||||
|
||||
name: uv-install
|
||||
description: Set up Python and uv
|
||||
|
||||
inputs:
|
||||
python-version:
|
||||
description: Python version, supporting MAJOR.MINOR only
|
||||
required: true
|
||||
|
||||
env:
|
||||
UV_VERSION: "0.5.25"
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Install uv and set the python version
|
||||
uses: astral-sh/setup-uv@v5
|
||||
with:
|
||||
version: ${{ env.UV_VERSION }}
|
||||
python-version: ${{ inputs.python-version }}
|
||||
31
.github/scripts/check_diff.py
vendored
31
.github/scripts/check_diff.py
vendored
@@ -7,6 +7,8 @@ from typing import Dict, List, Set
|
||||
from pathlib import Path
|
||||
import tomllib
|
||||
|
||||
from packaging.requirements import Requirement
|
||||
|
||||
from get_min_versions import get_min_version_from_toml
|
||||
|
||||
|
||||
@@ -37,6 +39,8 @@ IGNORED_PARTNERS = [
|
||||
|
||||
PY_312_MAX_PACKAGES = [
|
||||
"libs/partners/huggingface", # https://github.com/pytorch/pytorch/issues/130249
|
||||
"libs/partners/pinecone",
|
||||
"libs/partners/voyageai",
|
||||
]
|
||||
|
||||
|
||||
@@ -61,15 +65,17 @@ def dependents_graph() -> dict:
|
||||
|
||||
# load regular and test deps from pyproject.toml
|
||||
with open(path, "rb") as f:
|
||||
pyproject = tomllib.load(f)["tool"]["poetry"]
|
||||
pyproject = tomllib.load(f)
|
||||
|
||||
pkg_dir = "libs" + "/".join(path.split("libs")[1].split("/")[:-1])
|
||||
for dep in [
|
||||
*pyproject["dependencies"].keys(),
|
||||
*pyproject["group"]["test"]["dependencies"].keys(),
|
||||
*pyproject["project"]["dependencies"],
|
||||
*pyproject["dependency-groups"]["test"],
|
||||
]:
|
||||
requirement = Requirement(dep)
|
||||
package_name = requirement.name
|
||||
if "langchain" in dep:
|
||||
dependents[dep].add(pkg_dir)
|
||||
dependents[package_name].add(pkg_dir)
|
||||
continue
|
||||
|
||||
# load extended deps from extended_testing_deps.txt
|
||||
@@ -120,8 +126,7 @@ def _get_configs_for_single_dir(job: str, dir_: str) -> List[Dict[str, str]]:
|
||||
py_versions = ["3.9", "3.10", "3.11", "3.12", "3.13"]
|
||||
# custom logic for specific directories
|
||||
elif dir_ == "libs/partners/milvus":
|
||||
# milvus poetry doesn't allow 3.12 because they
|
||||
# declare deps in funny way
|
||||
# milvus doesn't allow 3.12 because they declare deps in funny way
|
||||
py_versions = ["3.9", "3.11"]
|
||||
|
||||
elif dir_ in PY_312_MAX_PACKAGES:
|
||||
@@ -148,17 +153,17 @@ def _get_configs_for_single_dir(job: str, dir_: str) -> List[Dict[str, str]]:
|
||||
def _get_pydantic_test_configs(
|
||||
dir_: str, *, python_version: str = "3.11"
|
||||
) -> List[Dict[str, str]]:
|
||||
with open("./libs/core/poetry.lock", "rb") as f:
|
||||
core_poetry_lock_data = tomllib.load(f)
|
||||
for package in core_poetry_lock_data["package"]:
|
||||
with open("./libs/core/uv.lock", "rb") as f:
|
||||
core_uv_lock_data = tomllib.load(f)
|
||||
for package in core_uv_lock_data["package"]:
|
||||
if package["name"] == "pydantic":
|
||||
core_max_pydantic_minor = package["version"].split(".")[1]
|
||||
break
|
||||
|
||||
with open(f"./{dir_}/poetry.lock", "rb") as f:
|
||||
dir_poetry_lock_data = tomllib.load(f)
|
||||
with open(f"./{dir_}/uv.lock", "rb") as f:
|
||||
dir_uv_lock_data = tomllib.load(f)
|
||||
|
||||
for package in dir_poetry_lock_data["package"]:
|
||||
for package in dir_uv_lock_data["package"]:
|
||||
if package["name"] == "pydantic":
|
||||
dir_max_pydantic_minor = package["version"].split(".")[1]
|
||||
break
|
||||
@@ -304,7 +309,7 @@ if __name__ == "__main__":
|
||||
f"Unknown lib: {file}. check_diff.py likely needs "
|
||||
"an update for this new library!"
|
||||
)
|
||||
elif file.startswith("docs/") or file in ["pyproject.toml", "poetry.lock"]: # docs or root poetry files
|
||||
elif file.startswith("docs/") or file in ["pyproject.toml", "uv.lock"]: # docs or root uv files
|
||||
docs_edited = True
|
||||
dirs_to_run["lint"].add(".")
|
||||
|
||||
|
||||
11
.github/scripts/check_prerelease_dependencies.py
vendored
11
.github/scripts/check_prerelease_dependencies.py
vendored
@@ -10,26 +10,25 @@ if __name__ == "__main__":
|
||||
toml_data = tomllib.load(file)
|
||||
|
||||
# see if we're releasing an rc
|
||||
version = toml_data["tool"]["poetry"]["version"]
|
||||
version = toml_data["project"]["version"]
|
||||
releasing_rc = "rc" in version or "dev" in version
|
||||
|
||||
# if not, iterate through dependencies and make sure none allow prereleases
|
||||
if not releasing_rc:
|
||||
dependencies = toml_data["tool"]["poetry"]["dependencies"]
|
||||
for lib in dependencies:
|
||||
dep_version = dependencies[lib]
|
||||
dependencies = toml_data["project"]["dependencies"]
|
||||
for dep_version in dependencies:
|
||||
dep_version_string = (
|
||||
dep_version["version"] if isinstance(dep_version, dict) else dep_version
|
||||
)
|
||||
|
||||
if "rc" in dep_version_string:
|
||||
raise ValueError(
|
||||
f"Dependency {lib} has a prerelease version. Please remove this."
|
||||
f"Dependency {dep_version} has a prerelease version. Please remove this."
|
||||
)
|
||||
|
||||
if isinstance(dep_version, dict) and dep_version.get(
|
||||
"allow-prereleases", False
|
||||
):
|
||||
raise ValueError(
|
||||
f"Dependency {lib} has allow-prereleases set to true. Please remove this."
|
||||
f"Dependency {dep_version} has allow-prereleases set to true. Please remove this."
|
||||
)
|
||||
|
||||
41
.github/scripts/get_min_versions.py
vendored
41
.github/scripts/get_min_versions.py
vendored
@@ -1,3 +1,4 @@
|
||||
from collections import defaultdict
|
||||
import sys
|
||||
from typing import Optional
|
||||
|
||||
@@ -7,6 +8,7 @@ else:
|
||||
# for python 3.10 and below, which doesnt have stdlib tomllib
|
||||
import tomli as tomllib
|
||||
|
||||
from packaging.requirements import Requirement
|
||||
from packaging.specifiers import SpecifierSet
|
||||
from packaging.version import Version
|
||||
|
||||
@@ -94,6 +96,23 @@ def get_minimum_version(package_name: str, spec_string: str) -> Optional[str]:
|
||||
return str(min(valid_versions)) if valid_versions else None
|
||||
|
||||
|
||||
def _check_python_version_from_requirement(
|
||||
requirement: Requirement, python_version: str
|
||||
) -> bool:
|
||||
if not requirement.marker:
|
||||
return True
|
||||
else:
|
||||
marker_str = str(requirement.marker)
|
||||
if "python_version" or "python_full_version" in marker_str:
|
||||
python_version_str = "".join(
|
||||
char
|
||||
for char in marker_str
|
||||
if char.isdigit() or char in (".", "<", ">", "=", ",")
|
||||
)
|
||||
return check_python_version(python_version, python_version_str)
|
||||
return True
|
||||
|
||||
|
||||
def get_min_version_from_toml(
|
||||
toml_path: str,
|
||||
versions_for: str,
|
||||
@@ -105,8 +124,10 @@ def get_min_version_from_toml(
|
||||
with open(toml_path, "rb") as file:
|
||||
toml_data = tomllib.load(file)
|
||||
|
||||
# Get the dependencies from tool.poetry.dependencies
|
||||
dependencies = toml_data["tool"]["poetry"]["dependencies"]
|
||||
dependencies = defaultdict(list)
|
||||
for dep in toml_data["project"]["dependencies"]:
|
||||
requirement = Requirement(dep)
|
||||
dependencies[requirement.name].append(requirement)
|
||||
|
||||
# Initialize a dictionary to store the minimum versions
|
||||
min_versions = {}
|
||||
@@ -121,17 +142,11 @@ def get_min_version_from_toml(
|
||||
if lib in dependencies:
|
||||
if include and lib not in include:
|
||||
continue
|
||||
# Get the version string
|
||||
version_string = dependencies[lib]
|
||||
|
||||
if isinstance(version_string, dict):
|
||||
version_string = version_string["version"]
|
||||
if isinstance(version_string, list):
|
||||
version_string = [
|
||||
vs
|
||||
for vs in version_string
|
||||
if check_python_version(python_version, vs["python"])
|
||||
][0]["version"]
|
||||
requirements = dependencies[lib]
|
||||
for requirement in requirements:
|
||||
if _check_python_version_from_requirement(requirement, python_version):
|
||||
version_string = str(requirement.specifier)
|
||||
break
|
||||
|
||||
# Use parse_version to get the minimum supported version from version_string
|
||||
min_version = get_minimum_version(lib, version_string)
|
||||
|
||||
15
.github/workflows/_compile_integration_test.yml
vendored
15
.github/workflows/_compile_integration_test.yml
vendored
@@ -13,7 +13,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -22,25 +22,22 @@ jobs:
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 20
|
||||
name: "poetry run pytest -m compile tests/integration_tests #${{ inputs.python-version }}"
|
||||
name: "uv run pytest -m compile tests/integration_tests #${{ inputs.python-version }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: compile-integration
|
||||
|
||||
- name: Install integration dependencies
|
||||
shell: bash
|
||||
run: poetry install --with=test_integration,test
|
||||
run: uv sync --group test --group test_integration
|
||||
|
||||
- name: Check integration tests compile
|
||||
shell: bash
|
||||
run: poetry run pytest -m compile tests/integration_tests
|
||||
run: uv run pytest -m compile tests/integration_tests
|
||||
|
||||
- name: Ensure the tests did not create any additional files
|
||||
shell: bash
|
||||
|
||||
13
.github/workflows/_integration_test.yml
vendored
13
.github/workflows/_integration_test.yml
vendored
@@ -12,7 +12,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -24,22 +24,19 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: core
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: poetry install --with test,test_integration
|
||||
run: uv sync --group test --group test_integration
|
||||
|
||||
- name: Install deps outside pyproject
|
||||
if: ${{ startsWith(inputs.working-directory, 'libs/community/') }}
|
||||
shell: bash
|
||||
run: poetry run pip install "boto3<2" "google-cloud-aiplatform<2"
|
||||
run: VIRTUAL_ENV=.venv uv pip install "boto3<2" "google-cloud-aiplatform<2"
|
||||
|
||||
- name: Run integration tests
|
||||
shell: bash
|
||||
|
||||
47
.github/workflows/_lint.yml
vendored
47
.github/workflows/_lint.yml
vendored
@@ -13,12 +13,13 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
WORKDIR: ${{ inputs.working-directory == '' && '.' || inputs.working-directory }}
|
||||
|
||||
# This env var allows us to get inline annotations when ruff has complaints.
|
||||
RUFF_OUTPUT_FORMAT: github
|
||||
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: "make lint #${{ inputs.python-version }}"
|
||||
@@ -27,25 +28,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: lint-with-extras
|
||||
|
||||
- name: Check Poetry File
|
||||
shell: bash
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry check
|
||||
|
||||
- name: Check lock file
|
||||
shell: bash
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry lock --check
|
||||
|
||||
- name: Install dependencies
|
||||
# Also installs dev/lint/test/typing dependencies, to ensure we have
|
||||
@@ -58,17 +44,7 @@ jobs:
|
||||
# It doesn't matter how you change it, any change will cause a cache-bust.
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry install --with lint,typing
|
||||
|
||||
- name: Get .mypy_cache to speed up mypy
|
||||
uses: actions/cache@v4
|
||||
env:
|
||||
SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2"
|
||||
with:
|
||||
path: |
|
||||
${{ env.WORKDIR }}/.mypy_cache
|
||||
key: mypy-lint-${{ runner.os }}-${{ runner.arch }}-py${{ inputs.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }}
|
||||
|
||||
uv sync --group lint --group typing
|
||||
|
||||
- name: Analysing the code with our lint
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
@@ -87,21 +63,12 @@ jobs:
|
||||
if: ${{ ! startsWith(inputs.working-directory, 'libs/partners/') }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry install --with test
|
||||
uv sync --group test
|
||||
- name: Install unit+integration test dependencies
|
||||
if: ${{ startsWith(inputs.working-directory, 'libs/partners/') }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry install --with test,test_integration
|
||||
|
||||
- name: Get .mypy_cache_test to speed up mypy
|
||||
uses: actions/cache@v4
|
||||
env:
|
||||
SEGMENT_DOWNLOAD_TIMEOUT_MIN: "2"
|
||||
with:
|
||||
path: |
|
||||
${{ env.WORKDIR }}/.mypy_cache_test
|
||||
key: mypy-test-${{ runner.os }}-${{ runner.arch }}-py${{ inputs.python-version }}-${{ inputs.working-directory }}-${{ hashFiles(format('{0}/poetry.lock', inputs.working-directory)) }}
|
||||
uv sync --group test --group test_integration
|
||||
|
||||
- name: Analysing the code with our lint
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
65
.github/workflows/_release.yml
vendored
65
.github/workflows/_release.yml
vendored
@@ -21,7 +21,7 @@ on:
|
||||
|
||||
env:
|
||||
PYTHON_VERSION: "3.11"
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -36,13 +36,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: release
|
||||
|
||||
# We want to keep this build stage *separate* from the release stage,
|
||||
# so that there's no sharing of permissions between them.
|
||||
@@ -56,7 +53,7 @@ jobs:
|
||||
# > from the publish job.
|
||||
# https://github.com/pypa/gh-action-pypi-publish#non-goals
|
||||
- name: Build project for distribution
|
||||
run: poetry build
|
||||
run: uv build
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: Upload build
|
||||
@@ -67,11 +64,18 @@ jobs:
|
||||
|
||||
- name: Check Version
|
||||
id: check-version
|
||||
shell: bash
|
||||
shell: python
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
echo pkg-name="$(poetry version | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT
|
||||
echo version="$(poetry version --short)" >> $GITHUB_OUTPUT
|
||||
import os
|
||||
import tomllib
|
||||
with open("pyproject.toml", "rb") as f:
|
||||
data = tomllib.load(f)
|
||||
pkg_name = data["project"]["name"]
|
||||
version = data["project"]["version"]
|
||||
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
|
||||
f.write(f"pkg-name={pkg_name}\n")
|
||||
f.write(f"version={version}\n")
|
||||
release-notes:
|
||||
needs:
|
||||
- build
|
||||
@@ -184,13 +188,11 @@ jobs:
|
||||
# - The package is published, and it breaks on the missing dependency when
|
||||
# used in the real world.
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
id: setup-python
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -213,17 +215,18 @@ jobs:
|
||||
# - attempt install again after 5 seconds if it fails because there is
|
||||
# sometimes a delay in availability on test pypi
|
||||
run: |
|
||||
poetry run pip install dist/*.whl
|
||||
uv venv
|
||||
VIRTUAL_ENV=.venv uv pip install dist/*.whl
|
||||
|
||||
# Replace all dashes in the package name with underscores,
|
||||
# since that's how Python imports packages with dashes in the name.
|
||||
# also remove _official suffix
|
||||
IMPORT_NAME="$(echo "$PKG_NAME" | sed s/-/_/g | sed s/_official//g)"
|
||||
|
||||
poetry run python -c "import $IMPORT_NAME; print(dir($IMPORT_NAME))"
|
||||
uv run python -c "import $IMPORT_NAME; print(dir($IMPORT_NAME))"
|
||||
|
||||
- name: Import test dependencies
|
||||
run: poetry install --with test --no-root
|
||||
run: uv sync --group test
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
# Overwrite the local version of the package with the built version
|
||||
@@ -234,7 +237,7 @@ jobs:
|
||||
PKG_NAME: ${{ needs.build.outputs.pkg-name }}
|
||||
VERSION: ${{ needs.build.outputs.version }}
|
||||
run: |
|
||||
poetry run pip install dist/*.whl
|
||||
VIRTUAL_ENV=.venv uv pip install dist/*.whl
|
||||
|
||||
- name: Run unit tests
|
||||
run: make tests
|
||||
@@ -243,15 +246,15 @@ jobs:
|
||||
- name: Check for prerelease versions
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
poetry run python $GITHUB_WORKSPACE/.github/scripts/check_prerelease_dependencies.py pyproject.toml
|
||||
uv run python $GITHUB_WORKSPACE/.github/scripts/check_prerelease_dependencies.py pyproject.toml
|
||||
|
||||
- name: Get minimum versions
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
id: min-version
|
||||
run: |
|
||||
poetry run pip install packaging requests
|
||||
python_version="$(poetry run python --version | awk '{print $2}')"
|
||||
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml release $python_version)"
|
||||
VIRTUAL_ENV=.venv uv pip install packaging requests
|
||||
python_version="$(uv run python --version | awk '{print $2}')"
|
||||
min_versions="$(uv run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml release $python_version)"
|
||||
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
|
||||
echo "min-versions=$min_versions"
|
||||
|
||||
@@ -260,12 +263,12 @@ jobs:
|
||||
env:
|
||||
MIN_VERSIONS: ${{ steps.min-version.outputs.min-versions }}
|
||||
run: |
|
||||
poetry run pip install --force-reinstall $MIN_VERSIONS --editable .
|
||||
VIRTUAL_ENV=.venv uv pip install --force-reinstall $MIN_VERSIONS --editable .
|
||||
make tests
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: Import integration test dependencies
|
||||
run: poetry install --with test,test_integration
|
||||
run: uv sync --group test --group test_integration
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: Run integration tests
|
||||
@@ -332,13 +335,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: release
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
@@ -374,13 +374,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: release
|
||||
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
|
||||
20
.github/workflows/_test.yml
vendored
20
.github/workflows/_test.yml
vendored
@@ -13,7 +13,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -26,17 +26,14 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
id: setup-python
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: core
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: poetry install --with test
|
||||
run: uv sync --group test --dev
|
||||
|
||||
- name: Run core tests
|
||||
shell: bash
|
||||
@@ -48,9 +45,9 @@ jobs:
|
||||
id: min-version
|
||||
shell: bash
|
||||
run: |
|
||||
poetry run pip install packaging tomli requests
|
||||
python_version="$(poetry run python --version | awk '{print $2}')"
|
||||
min_versions="$(poetry run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml pull_request $python_version)"
|
||||
VIRTUAL_ENV=.venv uv pip install packaging tomli requests
|
||||
python_version="$(uv run python --version | awk '{print $2}')"
|
||||
min_versions="$(uv run python $GITHUB_WORKSPACE/.github/scripts/get_min_versions.py pyproject.toml pull_request $python_version)"
|
||||
echo "min-versions=$min_versions" >> "$GITHUB_OUTPUT"
|
||||
echo "min-versions=$min_versions"
|
||||
|
||||
@@ -59,8 +56,7 @@ jobs:
|
||||
env:
|
||||
MIN_VERSIONS: ${{ steps.min-version.outputs.min-versions }}
|
||||
run: |
|
||||
poetry run pip install uv
|
||||
poetry run uv pip install $MIN_VERSIONS
|
||||
VIRTUAL_ENV=.venv uv pip install $MIN_VERSIONS
|
||||
make tests
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
|
||||
14
.github/workflows/_test_doc_imports.yml
vendored
14
.github/workflows/_test_doc_imports.yml
vendored
@@ -9,7 +9,7 @@ on:
|
||||
description: "Python version to use"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -19,25 +19,23 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
cache-key: core
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: poetry install --with test
|
||||
run: uv sync --group test
|
||||
|
||||
- name: Install langchain editable
|
||||
run: |
|
||||
poetry run pip install langchain-experimental -e libs/core libs/langchain libs/community
|
||||
VIRTUAL_ENV=.venv uv pip install langchain-experimental -e libs/core libs/langchain libs/community
|
||||
|
||||
- name: Check doc imports
|
||||
shell: bash
|
||||
run: |
|
||||
poetry run python docs/scripts/check_imports.py
|
||||
uv run python docs/scripts/check_imports.py
|
||||
|
||||
- name: Ensure the test did not create any additional files
|
||||
shell: bash
|
||||
|
||||
13
.github/workflows/_test_pydantic.yml
vendored
13
.github/workflows/_test_pydantic.yml
vendored
@@ -18,7 +18,7 @@ on:
|
||||
description: "Pydantic version to test."
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -31,21 +31,18 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ inputs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ inputs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ inputs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: core
|
||||
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: poetry install --with test
|
||||
run: uv sync --group test
|
||||
|
||||
- name: Overwrite pydantic version
|
||||
shell: bash
|
||||
run: poetry run pip install pydantic~=${{ inputs.pydantic-version }}
|
||||
run: VIRTUAL_ENV=.venv uv pip install pydantic~=${{ inputs.pydantic-version }}
|
||||
|
||||
- name: Run core tests
|
||||
shell: bash
|
||||
|
||||
26
.github/workflows/_test_release.yml
vendored
26
.github/workflows/_test_release.yml
vendored
@@ -14,8 +14,8 @@ on:
|
||||
description: "Release from a non-master branch (danger!)"
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
PYTHON_VERSION: "3.10"
|
||||
PYTHON_VERSION: "3.11"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -29,13 +29,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: release
|
||||
|
||||
# We want to keep this build stage *separate* from the release stage,
|
||||
# so that there's no sharing of permissions between them.
|
||||
@@ -49,7 +46,7 @@ jobs:
|
||||
# > from the publish job.
|
||||
# https://github.com/pypa/gh-action-pypi-publish#non-goals
|
||||
- name: Build project for distribution
|
||||
run: poetry build
|
||||
run: uv build
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
|
||||
- name: Upload build
|
||||
@@ -60,11 +57,18 @@ jobs:
|
||||
|
||||
- name: Check Version
|
||||
id: check-version
|
||||
shell: bash
|
||||
shell: python
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
run: |
|
||||
echo pkg-name="$(poetry version | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT
|
||||
echo version="$(poetry version --short)" >> $GITHUB_OUTPUT
|
||||
import os
|
||||
import tomllib
|
||||
with open("pyproject.toml", "rb") as f:
|
||||
data = tomllib.load(f)
|
||||
pkg_name = data["project"]["name"]
|
||||
version = data["project"]["version"]
|
||||
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
|
||||
f.write(f"pkg-name={pkg_name}\n")
|
||||
f.write(f"version={version}\n")
|
||||
|
||||
publish:
|
||||
needs:
|
||||
|
||||
26
.github/workflows/api_doc_build.yml
vendored
26
.github/workflows/api_doc_build.yml
vendored
@@ -5,7 +5,6 @@ on:
|
||||
schedule:
|
||||
- cron: '0 13 * * *'
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
PYTHON_VERSION: "3.11"
|
||||
|
||||
jobs:
|
||||
@@ -46,22 +45,19 @@ jobs:
|
||||
fi
|
||||
done
|
||||
|
||||
- name: Set up Python ${{ env.PYTHON_VERSION }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./langchain/.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ env.PYTHON_VERSION }} + uv
|
||||
uses: "./langchain/.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
cache-key: api-docs
|
||||
working-directory: langchain
|
||||
|
||||
- name: Install initial py deps
|
||||
working-directory: langchain
|
||||
run: |
|
||||
python -m pip install -U uv
|
||||
python -m uv pip install --upgrade --no-cache-dir pip setuptools pyyaml
|
||||
uv venv
|
||||
VIRTUAL_ENV=.venv uv pip install --upgrade --no-cache-dir pip setuptools pyyaml toml
|
||||
|
||||
- name: Move libs with script
|
||||
run: python langchain/.github/scripts/prep_api_docs_build.py
|
||||
run: uv run python langchain/.github/scripts/prep_api_docs_build.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
@@ -72,9 +68,9 @@ jobs:
|
||||
- name: Install dependencies
|
||||
working-directory: langchain
|
||||
run: |
|
||||
python -m uv pip install $(ls ./libs/partners | xargs -I {} echo "./libs/partners/{}") --overrides ./docs/vercel_overrides.txt
|
||||
python -m uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental libs/standard-tests
|
||||
python -m uv pip install -r docs/api_reference/requirements.txt
|
||||
VIRTUAL_ENV=.venv uv pip install $(ls ./libs/partners | xargs -I {} echo "./libs/partners/{}") --overrides ./docs/vercel_overrides.txt
|
||||
VIRTUAL_ENV=.venv uv pip install libs/core libs/langchain libs/text-splitters libs/community libs/experimental libs/standard-tests
|
||||
VIRTUAL_ENV=.venv uv pip install -r docs/api_reference/requirements.txt
|
||||
|
||||
- name: Set Git config
|
||||
working-directory: langchain
|
||||
@@ -85,9 +81,9 @@ jobs:
|
||||
- name: Build docs
|
||||
working-directory: langchain
|
||||
run: |
|
||||
python docs/api_reference/create_api_rst.py
|
||||
python -m sphinx -T -E -b html -d ../langchain-api-docs-html/_build/doctrees -c docs/api_reference docs/api_reference ../langchain-api-docs-html/api_reference_build/html -j auto
|
||||
python docs/api_reference/scripts/custom_formatter.py ../langchain-api-docs-html/api_reference_build/html
|
||||
uv run python docs/api_reference/create_api_rst.py
|
||||
uv run python -m sphinx -T -E -b html -d ../langchain-api-docs-html/_build/doctrees -c docs/api_reference docs/api_reference ../langchain-api-docs-html/api_reference_build/html -j auto
|
||||
uv run python docs/api_reference/scripts/custom_formatter.py ../langchain-api-docs-html/api_reference_build/html
|
||||
# Default index page is blank so we copy in the actual home page.
|
||||
cp ../langchain-api-docs-html/api_reference_build/html/{reference,index}.html
|
||||
rm -rf ../langchain-api-docs-html/_build/
|
||||
|
||||
23
.github/workflows/check_diffs.yml
vendored
23
.github/workflows/check_diffs.yml
vendored
@@ -18,7 +18,7 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -127,24 +127,19 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python ${{ matrix.job-configs.python-version }} + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python ${{ matrix.job-configs.python-version }} + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ matrix.job-configs.python-version }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ matrix.job-configs.working-directory }}
|
||||
cache-key: extended
|
||||
|
||||
- name: Install dependencies
|
||||
- name: Install dependencies and run extended tests
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Running extended tests, installing dependencies with poetry..."
|
||||
poetry install --with test
|
||||
poetry run pip install uv
|
||||
poetry run uv pip install -r extended_testing_deps.txt
|
||||
|
||||
- name: Run extended tests
|
||||
run: make extended_tests
|
||||
echo "Running extended tests, installing dependencies with uv..."
|
||||
uv venv
|
||||
uv sync --group test
|
||||
VIRTUAL_ENV=.venv uv pip install -r extended_testing_deps.txt
|
||||
VIRTUAL_ENV=.venv make extended_tests
|
||||
|
||||
- name: Ensure the tests did not create any additional files
|
||||
shell: bash
|
||||
|
||||
15
.github/workflows/run_notebooks.yml
vendored
15
.github/workflows/run_notebooks.yml
vendored
@@ -15,7 +15,7 @@ on:
|
||||
- cron: '0 13 * * *'
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
@@ -25,13 +25,10 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python + Poetry ${{ env.POETRY_VERSION }}
|
||||
uses: "./.github/actions/poetry_setup"
|
||||
- name: Set up Python + uv
|
||||
uses: "./.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ github.event.inputs.python_version || '3.11' }}
|
||||
poetry-version: ${{ env.POETRY_VERSION }}
|
||||
working-directory: ${{ inputs.working-directory }}
|
||||
cache-key: run-notebooks
|
||||
|
||||
- name: 'Authenticate to Google Cloud'
|
||||
id: 'auth'
|
||||
@@ -48,17 +45,17 @@ jobs:
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
poetry install --with dev,test
|
||||
uv sync --group dev --group test
|
||||
|
||||
- name: Pre-download files
|
||||
run: |
|
||||
poetry run python docs/scripts/cache_data.py
|
||||
uv run python docs/scripts/cache_data.py
|
||||
curl -s https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sql | sqlite3 docs/docs/how_to/Chinook.db
|
||||
cp docs/docs/how_to/Chinook.db docs/docs/tutorials/Chinook.db
|
||||
|
||||
- name: Prepare notebooks
|
||||
run: |
|
||||
poetry run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory ${{ github.event.inputs.working-directory || 'all' }}
|
||||
uv run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory ${{ github.event.inputs.working-directory || 'all' }}
|
||||
|
||||
- name: Run notebooks
|
||||
env:
|
||||
|
||||
21
.github/workflows/scheduled_test.yml
vendored
21
.github/workflows/scheduled_test.yml
vendored
@@ -14,7 +14,9 @@ on:
|
||||
|
||||
env:
|
||||
POETRY_VERSION: "1.8.4"
|
||||
UV_FROZEN: "true"
|
||||
DEFAULT_LIBS: '["libs/partners/openai", "libs/partners/anthropic", "libs/partners/fireworks", "libs/partners/groq", "libs/partners/mistralai", "libs/partners/deepseek", "libs/partners/google-vertexai", "libs/partners/google-genai", "libs/partners/aws"]'
|
||||
POETRY_LIBS: ("libs/partners/google-vertexai" "libs/partners/google-genai" "libs/partners/aws")
|
||||
|
||||
jobs:
|
||||
compute-matrix:
|
||||
@@ -79,7 +81,8 @@ jobs:
|
||||
mv langchain-google/libs/vertexai langchain/libs/partners/google-vertexai
|
||||
mv langchain-aws/libs/aws langchain/libs/partners/aws
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
- name: Set up Python ${{ matrix.python-version }} with poetry
|
||||
if: contains(env.POETRY_LIBS, matrix.working-directory)
|
||||
uses: "./langchain/.github/actions/poetry_setup"
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
@@ -87,6 +90,12 @@ jobs:
|
||||
working-directory: langchain/${{ matrix.working-directory }}
|
||||
cache-key: scheduled
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }} + uv
|
||||
if: "!contains(env.POETRY_LIBS, matrix.working-directory)"
|
||||
uses: "./langchain/.github/actions/uv_setup"
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: 'Authenticate to Google Cloud'
|
||||
id: 'auth'
|
||||
uses: google-github-actions/auth@v2
|
||||
@@ -100,12 +109,20 @@ jobs:
|
||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ secrets.AWS_REGION }}
|
||||
|
||||
- name: Install dependencies
|
||||
- name: Install dependencies (poetry)
|
||||
if: contains(env.POETRY_LIBS, matrix.working-directory)
|
||||
run: |
|
||||
echo "Running scheduled tests, installing dependencies with poetry..."
|
||||
cd langchain/${{ matrix.working-directory }}
|
||||
poetry install --with=test_integration,test
|
||||
|
||||
- name: Install dependencies (uv)
|
||||
if: "!contains(env.POETRY_LIBS, matrix.working-directory)"
|
||||
run: |
|
||||
echo "Running scheduled tests, installing dependencies with uv..."
|
||||
cd langchain/${{ matrix.working-directory }}
|
||||
uv sync --group test --group test_integration
|
||||
|
||||
- name: Run integration tests
|
||||
env:
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||
|
||||
30
Makefile
30
Makefile
@@ -25,20 +25,20 @@ docs_clean:
|
||||
|
||||
## docs_linkcheck: Run linkchecker on the documentation.
|
||||
docs_linkcheck:
|
||||
poetry run linkchecker _dist/docs/ --ignore-url node_modules
|
||||
uv run --no-group test linkchecker _dist/docs/ --ignore-url node_modules
|
||||
|
||||
## api_docs_build: Build the API Reference documentation.
|
||||
api_docs_build:
|
||||
poetry run python docs/api_reference/create_api_rst.py
|
||||
cd docs/api_reference && poetry run make html
|
||||
poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
|
||||
uv run --no-group test python docs/api_reference/create_api_rst.py
|
||||
cd docs/api_reference && uv run --no-group test make html
|
||||
uv run --no-group test python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
|
||||
|
||||
API_PKG ?= text-splitters
|
||||
|
||||
api_docs_quick_preview:
|
||||
poetry run python docs/api_reference/create_api_rst.py $(API_PKG)
|
||||
cd docs/api_reference && poetry run make html
|
||||
poetry run python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
|
||||
uv run --no-group test python docs/api_reference/create_api_rst.py $(API_PKG)
|
||||
cd docs/api_reference && uv run make html
|
||||
uv run --no-group test python docs/api_reference/scripts/custom_formatter.py docs/api_reference/_build/html/
|
||||
open docs/api_reference/_build/html/reference.html
|
||||
|
||||
## api_docs_clean: Clean the API Reference documentation build artifacts.
|
||||
@@ -50,15 +50,15 @@ api_docs_clean:
|
||||
|
||||
## api_docs_linkcheck: Run linkchecker on the API Reference documentation.
|
||||
api_docs_linkcheck:
|
||||
poetry run linkchecker docs/api_reference/_build/html/index.html
|
||||
uv run --no-group test linkchecker docs/api_reference/_build/html/index.html
|
||||
|
||||
## spell_check: Run codespell on the project.
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --no-group test codespell --toml pyproject.toml
|
||||
|
||||
## spell_fix: Run codespell on the project and fix the errors.
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --no-group test codespell --toml pyproject.toml -w
|
||||
|
||||
######################
|
||||
# LINTING AND FORMATTING
|
||||
@@ -66,9 +66,9 @@ spell_fix:
|
||||
|
||||
## lint: Run linting on the project.
|
||||
lint lint_package lint_tests:
|
||||
poetry run ruff check docs cookbook
|
||||
poetry run ruff format docs cookbook cookbook --diff
|
||||
poetry run ruff check --select I docs cookbook
|
||||
uv run --group lint ruff check docs cookbook
|
||||
uv run --group lint ruff format docs cookbook cookbook --diff
|
||||
uv run --group lint ruff check --select I docs cookbook
|
||||
git --no-pager grep 'from langchain import' docs cookbook | grep -vE 'from langchain import (hub)' && echo "Error: no importing langchain from root in docs, except for hub" && exit 1 || exit 0
|
||||
|
||||
git --no-pager grep 'api.python.langchain.com' -- docs/docs ':!docs/docs/additional_resources/arxiv_references.mdx' ':!docs/docs/integrations/document_loaders/sitemap.ipynb' || exit 0 && \
|
||||
@@ -77,5 +77,5 @@ lint lint_package lint_tests:
|
||||
|
||||
## format: Format the project files.
|
||||
format format_diff:
|
||||
poetry run ruff format docs cookbook
|
||||
poetry run ruff check --select I --fix docs cookbook
|
||||
uv run --group lint ruff format docs cookbook
|
||||
uv run --group lint ruff check --select I --fix docs cookbook
|
||||
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
eNrtWk1z28YZbtqbTz31jGJ66hAUQIIUSQ2nQ1ORbDkSJVGJJTsezmqxENYEsDB2wQ9pdKjbU2/o9A80VsSORnGScaaN07jnHvoH7EN/S94FQYks0TaTYwY6kNzdd9+PZ9+vFfB8MiAhp8x/75r6goQICxjw+PkkJM8iwsXvLz0iHGZd7Ha6By+ikL79tSNEwBsrKyigRRYQH9EiZt7KwFjBDhIr8DtwScLm4phZ43c/7Z6pHuEcnRCuNpTHZypmIMsXMFAPiOsqHlGQ8pT1iVpQ1JC5RK5EnITq+ROY8ZhFXDl1EgjNZJpHfZpQEh6AFNKzWeghye5MFeMg2f2UM7/HsUM8JEnnh5Js7qdFOA5pIBWWG7dADUUwRUjFpA5FuT8IwdJQ0MQC2E5EFGTtTjCD35IDEClRMGeZoGJqWjfZLmdSbbkIqX+inktJkY8dl/okiz3y+ZCEkjnYztwBaOqQZf67NzwyZJwnyD2LaEgseRypMQuin8xz25qxTxmx46cECzmDLItK1ZC7O4+PjVxOpBgfeQscpApYnpMII5IoAjMEeenMzbjHEounWFMfu5FFepF0oJu9E4cgC1z33z/5+YXDuIhfLrrj5whjAu5CfMwssDv+7OSUBgXFIraLBLkCF/RJ4uzxVZ+QQEMuHZDL6a74CxQELsVIrq9I37lOXVaTICwvX0lH0UA/X8SvW3zs4w5o0rq/sjuG4PEVo1ipFytfjDQuEPVdCAbNRaDUZZCs/31+IUC4D5y0NDDjy+nml/M0jMefbiPc6S6wRCF24k9R6FXNV/PzYeQL6pF40t5dFpcu3oorFw2juPrlAmNpUfxZ8tVIPil7PU/gEBeOX5umivjbYyJQUSaD4lwyKE7P9m8LwokIxxpmoEP8Z/3lDGSX+CfCiV9U6pW/zIL8d5ewTUT8+QUcKPnXPydpSvmk8+DWF35xsQ6HG785cKKCoteVLeQrJb1UgY9GebWh15TN7YPrdirmQJ7lW4j0kVghAzkzVXFNAd1DCItmJGyt9uVBCHFng33vz5xpgp3I7xPrqp3pRm+kG4F50h5IZxoZBYwTLVUzvj7U9qfZVbu//mrqsxoLT5BPTxOfit8k/jQ8HQ0tHFmWMxh6ev3ULNNjEmH7q3QLJCUpBhTSPB6/KJWNl+nK7DCvwHhdM3RNN74ZaSFg41KPAsDJZ5rieXxR0XX962UCAXELxWBi6snfP+YpQsifkIdB9i0bs16vf5tNNGNVBpL6av2bRSrAeo6NUfL418sEKYtPdH49mlFr1Irf/goGvZJhmTrGJWwghEplU1/Vy6vExAgZq2ULV19Pk48m5GEGLITDJhjqmRjHbwseGsnobZaNSrkKlq4padbpRsfrTNrA15QgJC5D1uftDa2NoH5o3cQh48n60U5r+377CtK61masT8kf3733s14P271jr/mMbT3ceWDX9PYWOr1LVksbe6xu7o3Mjeqwfuh27f2SMToqD1vhngaqVs1KRS/VNKOoF42ioT2q7fHRPUT65PTho3VkfETK9vr+Q4vaQ7HR2beKg5aoeofHoh+iUr10tHnYLYUP9gy7dHRsDLro3iNjR3/aPt3uf3BYRJsla5d99GwI1iDhNFfWFPBNqAS8mYaMBiGjyYAxGvosYNYUK8GgWVzMsWvKPWgFOr47XlO6EkwC35Dyu1SQ5g7zyds/AQbRgFpNapFKtCFabm209YG56zJ7v91iRx92quG2LsJwf8fZbFlbm50DNgeCUa1reopDVTdriRfeqv4DtfrroTafAbTOtNjEE59xn9r2ZZeEEEDxFXZZZEG5CMklnPl+6yj+qmbbq+V6uWzbVrmKcEW72+lOkAvONMDxK6fcVBumWVbXFA81a1WIm6QF+u3ltPi+U/5gIYGSqga1V5UpEkOC1Fq+eFQ97Rs1kwUty6ivf2iQ+xVW75+Ot3fVwqzkTnfMJdVikoeAAEPeErKe34JXmPVN822TBgnB1PRVzajBLj7mgng9G1QjYQAaShF20LNL2CrVqnUTSdYOo1jW9ceyFltkpDb0AjQmroD+6Sxt11QEeQgSNHAo3LZ3KgxCYkPlBjX8yHXPC6rLTiBvHfPpREEF4ZQ7PdCfyx4noXpSUNNqnwzv3PnRoXYL0dnHqprDsgTLtCnNgVkC5mO1kXtMFjAPnXEOyzIsigVG5bgs4wI35xyXDFw4hoYnR2YZGRyyYY5LhscMqZ/jkoELymHJhGWIwrwkZSDzmxyUrH63kPe7WcDkt6MMUOQTjByXZVySpzo5Lvlt+vsCc5dgFPHcZ7IamPzimH0NQDzHJQMXFgn5n3Fr+oQ/x+c/8clvj9lZhubhlIWLTYmbXx8zkPll3slkwXKeg5KC8v9xULlggfrjQuLWmDP5Gp8XiN70TRK1UavJh9UztW6mS9WCKphA7s2MYZiFxc09iwhEXZ74mnwbxLohBsRRZFF2O3GeIWaewRR+sOd/8ICJ5N00EBSExKJ4QWVdPmiXaP+X5fPzm1N8vN7Zef/JnTvfAT6lHnY=
|
||||
eNrtWktz28Ydb5qbTz31jKDtpUNA4Puh4WQoyZYlWaJiypHdxMNZLhbESgAWxi74kEaHuv0C6PQLNFbEjkZxknGmjdO45x76BeRDP0v/C5AiFbmNkZmcAh8o7uL//O3/BXOfTgYk4JR571xQT5AAYQELHj2dBORJSLj445lLhM3M0912Z+9ZGNDL39pC+LyxtIR8qjOfeIjqmLlLg/wStpFYgu++Q2Ixpz1mjl///DfHqks4R33C1cZHxypmoMoTakPdI46juERBygE7JGpODZhDYD/kJFBPHudUl5nEgY2+L7QS01zqUUlFuA/iSddigYtA0LEqxr5kPODM63JsExcB3eIKaObfTMJxQH1pJDBtgm5FMEVIa6RqHXj9AHwLBJU2AysRoX+TM4YIvkpuIFFCf+6KoCL2pROz5mYWchFQr6+egIbQw7ZDPXJTLvL4kARSKrjKnAGYZ5PvCt694r8h/ERi9CSkATEB8an1ixofz8VsTqUmEljvgGABa2SaVFqDnN0FJCzkcALSPeQu8Eq1wNQQQUikblgT5Cbr2arLYudiNKmHndAk3VDGxIxtYhNkQjD+52e/OLUZF9Hz6wH2OcKYQBgQDzMTvIw+6x9RP6eYxHKQIOcQVR6Jwzc6PyTE15BDB+Qs4Yq+QL7vUIzk8yUZFxfTKNSk4zcfn8s40MA8T0QvW3zs4TZY0tpY2h1DOnhKXq/k9fwXI40LRD0HwltzEBh15sfP/7H4wEf4ECRp01SLzhLm54s0jEefbiPc7lwTiQJsR5+iwK2UXizuB6EnqEuiyeruTXXTh3N1RT1f0GtfXhMsPYo+i/804k/KXi4S2MSBQ9eS5I++7RGBdJne+kJ668nJ/v2aciKCsYYZ2BD9xXg+A9khXl/Y0bNyqf7XWfb+4QzYRMifnsKBkn//azItEp+0t+ax8MvTNTjc6NU+MXOKUVbukJ5SMApl+GiUK41SVVnf3rtYnarZk2d5CYk8EktkIHcSE5cVsD2ANGiGwtJqX+4FkGEW+Hd7FkwTbIfeITHPV98YRq9kGIF70h+oURoZ+YwTbWpmdPFQu5/US21j7UUSsxoL+sijR3FMRa/ieBoejYYmDk3THgxdo35UKtIeCbH11ZQFio5UAwZpLo+eVY368+mT2WGeg/OGljc0I//NSAsAG4e6FACOP6dFm0enZcMwvr5JICBhobxPSkb875+LFAEUR6ivoHsuplSv1799M9FMVBFI6tX6N9epAOsFMfmCy7++STAV8YnBL0Yzao2a0eWvYdEtVyrVWr1XqALG1ULP6lWtnkVwr0CKFaNoVV8mZUcT8jB9FsBhEwwdSoyjy5yLRjJ7m8V8GagNY1mZFp1O2Ftj0ge+rPgBcRgyP8eWhhE0By0JyGiy9mintb2xeg61W1tl7JCSP71+591uF1vdntu07naQvrJl7m1VyuPdD+/dGRyMxmzYfRTuj93tQs0/qFr7dw9b1Y0PtHy1WAMvDKOq5XVDh7TXcP1JpT00vNtVZ9UYhit0xNuP+vbDjYebv/PWibU58jbcJw/WwnIhWHf0tRX04LBTDYatUT3o3tt3xoPtVn1lrby9Pqp96G95R8MPSm4LvEHCbi4tKxCbUPh5c5oyGqSMJhMm3yjMEmZZMWMMmvr1Grus3IXm3vac8bLSkWAS+AulvkMFae4wj1z+GTAIB9Rsruq2l39QWa1zr1cbuX5xZ2d/H9+l44PyPUP3Udja2lm5XdDXj7YXQMgXy5oxxaFilGpxFM5N/4FW/e2htlgBtHbSaqKJx7hHLeusQwJIoOgcOyw0oV0E5Gz1jna/9Sj6qm6YZWzl62WzYJXMPNZW2p0JciCYBjh6YRebaqNUKqrLiouatQrkTTzU/P4sabWvf9U1kUANBZoatFpVlkgMBVJrjfoH4cpoY8Me992Ng53d+9YQ+/jI3XyACtAyp3024Vgoqnpch4AAQ90Ssn1fgVd54zikQUEoaTK8arITg6MUky506wDooDei0JHtnI+5IG7XAptJ4IPpUrfld6sFYlZRr1zCUqfNgDkZ0qhnkpHaMHIgxBHx1DQdzhAUKEgUT4qdj3LxWGZBRwf7vNBxYAxwWB8KWo8nGzkVlFNud8ExLqecmAoGkekUEC9v3frpwDnH7vhjVc3wenu8knk2Q+ztEftYbWQxlgqxfXuc4ZUCL8UEbzPAUgAGr/QZYGkA4xgGtwyyFJDhgA0zwNLE2JB6GWBpAEMZXunwGqIga5RpIHs/QyvVpJ/LJv1UiGVvkmnQkj8hZYClACz+vS0DLPu/ih8PsRWCUcizKEs1iGVv3ynfjBDPAEsDGAuF/JnEnF73yIB7W+CyV/CUlYxmmZkKMIsSJ3sHTwPZe9lElgqvkwyt70Pr+wFSuWC++hOBaO7lsbx76vqim1yPUhu1mrxoMbP3artQzamCCeRc7eTz5dx15q5JBKJOfOsyvuJkXhHDUaDQpGy+cfIGNYsCknMBf/6PDNiIL1yCIj8gJsXXTDbkJRF5DP/j8cnJ1fF+tNbeuf341q3/ArgMR1M=
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
eNrtWVtv28gV7r7mqS+LvrJEnwpRJiVSEm0YheNLLr7IFzmxkw2E0XAoTkxymJmhLjb80LR/gD+hG0daGN7sLhK0223T5wLtH3Af+iP6C3oo0ZEMc9v3Bf0geM6cOZdvvnMORb0e9wgXlIWfXdFQEo6whIVIXo85eRUTIX8/Coj0mHOx2zxovYk5vf61J2UkFhcWUETLLCIhomXMgoWesYA9JBfg/8gnEzMXHeYMry/O1IAIgbpEqIvK8zMVM3AVSlioLeL7SkAUpLxkJ0QtKSpnPkl3YkG4ev4CJAFziJ+KupHUTKYFNKSpppCcoAA2JI/Jp3WbRRPfID9TaYj92CHtOPWeaZ6DqiRBBMnKmKdSvayfjz2CHIDi3z/7+YXHhEze3U7vG4QxAf8kxMyhYTf5untKo5LiENdHklxCTiGZgJdcnhASacinPTKankq+RVHkU4zS/YWXgoVXGQaaHEbk7vZlmr0GMYcy+dCEIFYeLewO4R5CxShbdtn6dqAJiWjoA7CajyCeUTTZ/8v8RoTwCRjRsjtORtPD7+Z1mEjebiPcPLhlEnHsJW8RD2rm+3k5j0NJA5KMV3fvuss2Z+6qZcMo17+7ZVgMQ5y8dZEvyJ9uHSaSDzXMwEbyB32EGTuhJLn+T7uN3XYnWG4cnJre8MnhabkuNmr94wdHe2tbbpdu16W+avZbIbM2D6J1Pd7e1ox6tWZall6xNaOsl42yobV3dw8d/eGTeHh8qlsi3um01h8/WjG39poc1x/W7XVLbB+9DOJXmybVd7Y2+i0ebD/BzlGT8rU9/cT3Hpf39+4j+vRhpRejnf7heqW/pEB0cY86y8dHdmXDOnmw8QptPd0/PNwg69VB41nF5LFb725tyr26ZR8GK5Wj47nwdEvX9CzCmm429PTv3Q03fBJ2pZe8MWrmV5yICFhNfjcCyGQsXl8AD8k//z7OSuvL5uaMwp9frAEnk48tLy4puq08RqFS0SsWfCxW64uGrjzYbl2tZm5aKQWvFUkGcoH0Usm0kpYUqGcuiFyOpas1vmtxFAoXeLl+UwNj7MXhCXEuV3PZ/zFlP1xtmg+UtUYGERNEy8JMro60/WmT0R6tvZ+WmsZ4F4X0dFIKycdJGfRPB30Hx47j9fqBbp+aVdohMXY/ZEcizlI3EJAWiORNpdJ4l+3cEPESktc1A7A2fhhoUPfEpwEFgCefWacTyYUF6H9/V0FCa4KeODYn16P/bV6DkwAYnPqemTFt2/5rvtKNqSqo2HX7h9tagPWcGaMSiO/vKmQmvtTF1eBGW6NOcv0rWLSrSLfqtY7V6diogg3TMWqGU23oVaNh6VbD/jPcLcVgJb3MiHG4bIKhrcthcl0K0CBtOstVw6rWINMlJWugB3FnjaU5iCUl4sRnyPlmdUNbRdgj2sGEkMl47XhnZfvR6h+PtHlmac1pP07GIRMhdd3RAeFwMckl9lnsQPfkZAS29leOkw8N161XbdPsdKodEztEu988GCMfguzh5L1XXVYXTbOqLikBWm7U4D4mE+a3ozSpsPuvX/zDQRJNGr+jLqrpOMIwjLSVUD5r7HNhDPq7veiZd/+YbQah6a1EtLaullTWeQnszU6UZwOsPOE3KGCoB0nA5k3pVvXSzVyaH0saEM3U9LpmNOCUGAoYNG0XQiM8gghTF27UdivYqTRqtolS0x6jOJ2Mz9Nx5ZCBugi2wbJE6uJZNg5VBPyGwgcLpdn4VGHBiQvDDcIIY98/L6k+60I9dMRUUFLBORVeG+KHsZJpvSip2UCcLO/d+8mhNoPoqTdUC1juwKI4kFSBy11cpEcKXHJwERj6dIHMXWQwZ/0ClxzG9GlY4JKDCypgyYWlj3gxknKQ+U0BSg5dvgi/KOooB5j7BCP41lxAk8OZ4tEuf1AjUeCSgwuLZfqVO33TVeCTg0/xfJffZWhRTnm4uJT4xQNeDjK/LEDJQPn/OKhCskj9aSExS+ZMhdyDSLan7/jBrZG+7r0JayZulFTJJPI/SSp26fbZtkMkor6YUC19Te980oUUUOxQNhOc53iZNzBFH9L5HzZAMPmtExxFnDgU34pYT99Up2D/yPb5+adLfL7W3Fl/ce/efwHj3HJ7
|
||||
eNrtWctu20YUbbdZdVOgS5boqtDIpEQ9DaOwLTsxEkeOH0icthBGM0NxbJJDzwwtyYEXTfsDXHXd1JEKw01bJOg7XXfRH3AX/Yh+QS8lObKR9KF1qYUgzty5j3MfhyIfDg+ZVFyEr5/xUDOJiYYLlTwcSnYQM6U/GQRMe4KebDS3tj+PJT9/19M6UvW5ORzxvIhYiHmeiGDu0J4jHtZz8Dvy2UjNSVvQ/vmnD8yAKYU7TJn19x+YRIClUJt1c5v5vhEwAxt7Yp+ZOVMKn8F6rJg0jz/MmYGgzIeFTqSRI1DAQw5SSkuGA7OuZcwurloiGpk06w9MHhI/pqwVpzbHYsc5U7MgggB1LGHNylvHQ49hCtH/8dobJ55QOnlyNaKvMCEMDLOQCMrDTvJl54hHOYMy18eanUIcIRvhlZzuMxYh7PNDNhifSr7GUeRzgtP9uT0lwrNJ3Ej3I/by9mkaNAKHQ508a4ITi2tzG32APjTsfNnO21/3kNKYhz5giXwM/gyi0f5PlzciTPZBCZqkNRmMDz+5LCNU8ngdk+bWFZVYEi95jGVQdp5eXpdxqHnAkuHyxsvmJptTc8W8XchXv7miWPVDkjx2sa/Yd1cOMy37iAjQkXxmDYgQ+5wl53+2WsRttYOFWyvW9SZv7hxsWiv3bzv7ivQr7dZmU8Xxmhs1mmt78Z2jUN2QXCC7UqxWqjXLqiI7b+UhZFSq7Vc92ryxHK/1Vq3GzaXm+kF1Ua5Xt9rhvYbtdqs7tUiuNMqhtR1ul+93JA706qFDaZnuVNfvx/n8dV+t+mJH7O3mC7sbrVsFqztvgHfxIacL1mJt96DX2L5Z2/TKmPb2G5ux192xSH59qVfxFuXG6uL9zuZeIepccq9sV5A18bBsOVUr/Ty5qA2fhR3tJZ/bJfsLyVQEFc0+HgBkOlYPT6AO2W+/Difd9Kh5c1rCb540oCaT53cZzRlWyVhlbaNgFUrwVS+V6yXbuL6+fbY8MbOdluC5oVlPz7HDdGXcRfMGtLBUTC/E2kXVb7YlDpULdbly0QND4sXhPqOny6+s/udp9UNq03igmRHrRUIxNHEzObuHNsdzBa01no5bDQnZwSE/GrVC8nzUBt2jXpeSmFLvsBtYtSOnyNssJu6zyZFIitQMOIQClZzYVs1+Mtm6qMRTiN5CtoUs+8cegr5nPg84IDz6nkw3OFsC+L9/WUDDQII5OHRG+bF+uSwhWQAlnBqfqnFqtdrPrxa6UFUEkVql9uNVKQD7khq7EKjvXxaYqHhkqbPehTTiNDl/By5aNsYVWnZsWrHLAAUp1+y2XXAYcZyS7VScHyC5nICWNJuRkJBtRmCU635yngtwL506C0W7VCxDpPPGZHxuxe2GSGNQ80YkmS8w/Yq4iGDiMTSuyGTY2L29uL62/O09dLm0UHM8jJNhKFTIXXewxSQkJjklvogpjE/JBsuraHNxN3lWs2iJuEWnVGtXqy520VJza4h9cPKQJE+94oJZd5yiOW8EeKFahnyMWOWjQRpU2Pn9rVOKNa4bMPYpMEVKQQQICC32Onv9u/3Npe7OjTtyxbWPogOvqA5uNSv9AEhEtPegfCcn8lPSyo8KHAQINIRmoPOid23rlYSEoNAcZFWQXU25CQLlhLU0Bwqrm8AVOPZ1utFXwEAtF3xmMgLXU9tu1KoUGK3gdskhqU1PwOExTfKQsh4wVQ6U+BqnxDahRwyVDwkIU7VTMk3pk7nAeeBfGPs+UJ4vOtApbTVeyJlgnCuvBYEB4UykgGUnPDm6vHbt/wPnFLu7Xt/M8PrveBkUos0AmwEw7bEMsFkAUwRIIoNsBsiIFN0MsFlqrMvDDLBZAMMZXrPh1cUyI8pZIHvvg/CDrMhmQWyJEQx/mjPMZmnM7G5sRqbEKgNsFsBErNO/6Okzswy4WYDLbslmnGQ868yZAHM587N7slkgeztD69/Q+neATKVFZP5PIJpG+cAEUIJIt8avMMAfO31ofeHvdLmaM7XQ2H+xUqjlrp5tUaYx90eveEdvIegLWYgNx5SL6cLxK6xcVjBOC4TzDzpgYfQuFwxFklFOrnhspc/b0yz8zfbx8Yvsvt9o3l758Nq1vwCNNtHn
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
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
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
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
|
||||
@@ -1 +1 @@
|
||||
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
|
||||
@@ -3,16 +3,11 @@
|
||||
This guide walks through how to run the repository locally and check in your first code.
|
||||
For a [development container](https://containers.dev/), see the [.devcontainer folder](https://github.com/langchain-ai/langchain/tree/master/.devcontainer).
|
||||
|
||||
## Dependency Management: Poetry and other env/dependency managers
|
||||
## Dependency Management: `uv` and other env/dependency managers
|
||||
|
||||
This project utilizes [Poetry](https://python-poetry.org/) v1.7.1+ as a dependency manager.
|
||||
This project utilizes [uv](https://docs.astral.sh/uv/) v0.5+ as a dependency manager.
|
||||
|
||||
❗Note: *Before installing Poetry*, if you use `Conda`, create and activate a new Conda env (e.g. `conda create -n langchain python=3.9`)
|
||||
|
||||
Install Poetry: **[documentation on how to install it](https://python-poetry.org/docs/#installation)**.
|
||||
|
||||
❗Note: If you use `Conda` or `Pyenv` as your environment/package manager, after installing Poetry,
|
||||
tell Poetry to use the virtualenv python environment (`poetry config virtualenvs.prefer-active-python true`)
|
||||
Install `uv`: **[documentation on how to install it](https://docs.astral.sh/uv/getting-started/installation/)**.
|
||||
|
||||
## Different packages
|
||||
|
||||
@@ -37,7 +32,7 @@ cd libs/community
|
||||
Install langchain-community development requirements (for running langchain, running examples, linting, formatting, tests, and coverage):
|
||||
|
||||
```bash
|
||||
poetry install --with lint,typing,test,test_integration
|
||||
uv sync
|
||||
```
|
||||
|
||||
Then verify dependency installation:
|
||||
@@ -46,12 +41,6 @@ Then verify dependency installation:
|
||||
make test
|
||||
```
|
||||
|
||||
If during installation you receive a `WheelFileValidationError` for `debugpy`, please make sure you are running
|
||||
Poetry v1.6.1+. This bug was present in older versions of Poetry (e.g. 1.4.1) and has been resolved in newer releases.
|
||||
If you are still seeing this bug on v1.6.1+, you may also try disabling "modern installation"
|
||||
(`poetry config installer.modern-installation false`) and re-installing requirements.
|
||||
See [this `debugpy` issue](https://github.com/microsoft/debugpy/issues/1246) for more details.
|
||||
|
||||
## Testing
|
||||
|
||||
**Note:** In `langchain`, `langchain-community`, and `langchain-experimental`, some test dependencies are optional. See the following section about optional dependencies.
|
||||
@@ -79,7 +68,6 @@ If you are only developing `langchain_core` or `langchain_community`, you can si
|
||||
|
||||
```bash
|
||||
cd libs/core
|
||||
poetry install --with test
|
||||
make test
|
||||
```
|
||||
|
||||
@@ -87,7 +75,6 @@ Or:
|
||||
|
||||
```bash
|
||||
cd libs/community
|
||||
poetry install --with test
|
||||
make test
|
||||
```
|
||||
|
||||
@@ -179,7 +166,7 @@ ignore-words-list = 'momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogy
|
||||
|
||||
`langchain-core` and partner packages **do not use** optional dependencies in this way.
|
||||
|
||||
You'll notice that `pyproject.toml` and `poetry.lock` are **not** touched when you add optional dependencies below.
|
||||
You'll notice that `pyproject.toml` and `uv.lock` are **not** touched when you add optional dependencies below.
|
||||
|
||||
If you're adding a new dependency to Langchain, assume that it will be an optional dependency, and
|
||||
that most users won't have it installed.
|
||||
@@ -196,18 +183,10 @@ test makes use of lightweight fixtures to test the logic of the code.
|
||||
|
||||
## Adding a Jupyter Notebook
|
||||
|
||||
If you are adding a Jupyter Notebook example, you'll want to install the optional `dev` dependencies.
|
||||
|
||||
To install dev dependencies:
|
||||
If you are adding a Jupyter Notebook example, you'll want to run with `test` dependencies:
|
||||
|
||||
```bash
|
||||
poetry install --with dev
|
||||
uv run --group test jupyter notebook
|
||||
```
|
||||
|
||||
Launch a notebook:
|
||||
|
||||
```bash
|
||||
poetry run jupyter notebook
|
||||
```
|
||||
|
||||
When you run `poetry install`, the `langchain` package is installed as editable in the virtualenv, so your new logic can be imported into the notebook.
|
||||
When you run `uv sync`, the `langchain` package is installed as editable in the virtualenv, so your new logic can be imported into the notebook.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Read the list of notebooks to skip from the JSON file
|
||||
SKIP_NOTEBOOKS=$(python -c "import json; print('\n'.join(json.load(open('docs/notebooks_no_execution.json'))))")
|
||||
SKIP_NOTEBOOKS=$(uv run python -c "import json; print('\n'.join(json.load(open('docs/notebooks_no_execution.json'))))")
|
||||
|
||||
# Get the working directory or specific notebook file from the input parameter
|
||||
WORKING_DIRECTORY=$1
|
||||
@@ -13,7 +13,7 @@ execute_notebook() {
|
||||
total="$3"
|
||||
echo "Starting execution of $file ($index/$total)"
|
||||
start_time=$(date +%s)
|
||||
if ! output=$(time poetry run jupyter nbconvert --to notebook --execute --ExecutePreprocessor.kernel_name=python3 $file 2>&1); then
|
||||
if ! output=$(time uv run --group dev --group test jupyter nbconvert --to notebook --execute --ExecutePreprocessor.kernel_name=python3 $file 2>&1); then
|
||||
end_time=$(date +%s)
|
||||
execution_time=$((end_time - start_time))
|
||||
echo "Error in $file. Execution time: $execution_time seconds"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
# modifications should be discarded after the cassettes are generated.
|
||||
#
|
||||
# Usage:
|
||||
# In monorepo env, `poetry install --with dev,test`
|
||||
# In monorepo env, `uv sync --group dev --group test`
|
||||
# `./docs/scripts/update_cassettes.sh path/to/notebook`
|
||||
# e.g., `./docs/scripts/update_cassettes.sh docs/docs/how_to/tool_choice.ipynb`
|
||||
#
|
||||
@@ -41,11 +41,11 @@ delete_cassettes "$WORKING_DIRECTORY"
|
||||
|
||||
# Pre-download tiktoken files
|
||||
echo "Pre-downloading nltk and tiktoken files..."
|
||||
poetry run python docs/scripts/cache_data.py
|
||||
uv run python docs/scripts/cache_data.py
|
||||
|
||||
# Prepare notebooks
|
||||
echo "Preparing notebooks for CI..."
|
||||
poetry run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory "$WORKING_DIRECTORY"
|
||||
uv run python docs/scripts/prepare_notebooks_for_ci.py --comment-install-cells --working-directory "$WORKING_DIRECTORY"
|
||||
|
||||
# Run notebooks
|
||||
echo "Running notebooks..."
|
||||
|
||||
@@ -13,20 +13,20 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --group typing --group lint mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
test tests: _test _e2e_test
|
||||
|
||||
PYTHON = .venv/bin/python
|
||||
|
||||
_test:
|
||||
poetry run pytest tests
|
||||
uv run --group test pytest tests
|
||||
|
||||
# custom integration testing for cli integration flow
|
||||
# currently ignores vectorstores test because lacks implementation
|
||||
@@ -35,7 +35,7 @@ _e2e_test:
|
||||
mkdir .integration_test
|
||||
cd .integration_test && \
|
||||
python3 -m venv .venv && \
|
||||
$(PYTHON) -m pip install --upgrade poetry && \
|
||||
pip install --upgrade poetry && \
|
||||
$(PYTHON) -m pip install -e .. && \
|
||||
$(PYTHON) -m langchain_cli.cli integration new --name parrot-link --name-class ParrotLink && \
|
||||
$(PYTHON) -m langchain_cli.cli integration new --name parrot-link --name-class ParrotLinkB --src=integration_template/chat_models.py --dst=langchain-parrot-link/langchain_parrot_link/chat_models_b.py && \
|
||||
|
||||
@@ -1,48 +1,52 @@
|
||||
[tool.poetry]
|
||||
[build-system]
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[project]
|
||||
authors = [
|
||||
{name = "Erick Friis", email = "erick@langchain.dev"},
|
||||
]
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"typer[all]<1.0.0,>=0.9.0",
|
||||
"gitpython<4,>=3",
|
||||
"langserve[all]>=0.0.51",
|
||||
"uvicorn<1.0,>=0.23",
|
||||
"tomlkit>=0.12",
|
||||
"gritql<1.0.0,>=0.2.0",
|
||||
]
|
||||
name = "langchain-cli"
|
||||
version = "0.0.35"
|
||||
description = "CLI for interacting with LangChain"
|
||||
authors = ["Erick Friis <erick@langchain.dev>"]
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[tool.poetry.urls]
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/cli"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-cli%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
typer = { extras = ["all"], version = "^0.9.0" }
|
||||
gitpython = "^3"
|
||||
langserve = { extras = ["all"], version = ">=0.0.51" }
|
||||
uvicorn = ">=0.23,<1.0"
|
||||
tomlkit = ">=0.12"
|
||||
gritql = "^0.2.0"
|
||||
|
||||
[tool.poetry.scripts]
|
||||
[project.scripts]
|
||||
langchain = "langchain_cli.cli:app"
|
||||
langchain-cli = "langchain_cli.cli:app"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
pytest = "^7.4.2"
|
||||
pytest-watch = "^4.2.0"
|
||||
[dependency-groups]
|
||||
dev = [
|
||||
"pytest<8.0.0,>=7.4.2",
|
||||
"pytest-watch<5.0.0,>=4.2.0",
|
||||
]
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
"mypy<2.0.0,>=1.13.0",
|
||||
]
|
||||
test = [
|
||||
"langchain @ file:///${PROJECT_ROOT}/../langchain",
|
||||
]
|
||||
typing = [
|
||||
"langchain @ file:///${PROJECT_ROOT}/../langchain",
|
||||
]
|
||||
test_integration = []
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
mypy = "^1.13.0"
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
langchain = {path = "../langchain", develop = true}
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
langchain = {path = "../langchain", develop = true}
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
[tool.poetry.extras]
|
||||
# For langserve
|
||||
serve = []
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = [
|
||||
@@ -57,7 +61,3 @@ exclude = [
|
||||
"langchain_cli/integration_template",
|
||||
"langchain_cli/package_template",
|
||||
]
|
||||
|
||||
[build-system]
|
||||
requires = ["poetry-core"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
|
||||
2014
libs/cli/uv.lock
generated
Normal file
2014
libs/cli/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -7,28 +7,31 @@ all: help
|
||||
TEST_FILE ?= tests/unit_tests/
|
||||
integration_tests: TEST_FILE = tests/integration_tests/
|
||||
|
||||
.EXPORT_ALL_VARIABLES:
|
||||
UV_FROZEN = true
|
||||
|
||||
# Run unit tests and generate a coverage report.
|
||||
coverage:
|
||||
poetry run pytest --cov \
|
||||
uv run --group test pytest --cov \
|
||||
--cov-config=.coveragerc \
|
||||
--cov-report xml \
|
||||
--cov-report term-missing:skip-covered \
|
||||
$(TEST_FILE)
|
||||
|
||||
test tests:
|
||||
poetry run pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
integration_tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --disable-socket --allow-unix-socket --snapshot-update --now . -- -vv tests/unit_tests
|
||||
uv run --group test ptw --disable-socket --allow-unix-socket --snapshot-update --now . -- -vv tests/unit_tests
|
||||
|
||||
check_imports: $(shell find langchain_community -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --group test python ./scripts/check_imports.py $^
|
||||
|
||||
extended_tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
uv run --no-sync --group test pytest --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
|
||||
|
||||
######################
|
||||
@@ -48,19 +51,19 @@ lint lint_diff lint_package lint_tests:
|
||||
./scripts/check_pydantic.sh .
|
||||
./scripts/lint_imports.sh .
|
||||
./scripts/check_pickle.sh .
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --group typing --group lint mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --group typing --group lint ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --group typing --group lint codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --group typing --group lint codespell --toml pyproject.toml -w
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -104,4 +104,5 @@ mlflow[genai]>=2.14.0
|
||||
databricks-sdk>=0.30.0
|
||||
websocket>=0.2.1,<1
|
||||
writer-sdk>=1.2.0
|
||||
unstructured[pdf]>=0.15
|
||||
yandexcloud==0.144.0
|
||||
unstructured[pdf]>=0.15
|
||||
|
||||
@@ -6,10 +6,10 @@ https://learn.microsoft.com/en-us/graph/auth/
|
||||
|
||||
from datetime import datetime as dt
|
||||
from typing import List, Optional, Type
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from langchain_core.callbacks import CallbackManagerForToolRun
|
||||
from pydantic import BaseModel, Field
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from langchain_community.tools.office365.base import O365BaseTool
|
||||
from langchain_community.tools.office365.utils import UTC_FORMAT
|
||||
|
||||
@@ -1,16 +1,92 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
name = "langchain-community"
|
||||
version = "0.3.16"
|
||||
description = "Community contributed LangChain integrations."
|
||||
[project]
|
||||
authors = []
|
||||
license = "MIT"
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.34rc1",
|
||||
"langchain<1.0.0,>=0.3.18rc1",
|
||||
"SQLAlchemy<3,>=1.4",
|
||||
"requests<3,>=2",
|
||||
"PyYAML>=5.3",
|
||||
"aiohttp<4.0.0,>=3.8.3",
|
||||
"tenacity!=8.4.0,<10,>=8.1.0",
|
||||
"dataclasses-json<0.7,>=0.5.7",
|
||||
"pydantic-settings<3.0.0,>=2.4.0",
|
||||
"langsmith<0.4,>=0.1.125",
|
||||
"httpx-sse<1.0.0,>=0.4.0",
|
||||
"numpy<2,>=1.26.4; python_version < \"3.12\"",
|
||||
"numpy<3,>=1.26.2; python_version >= \"3.12\"",
|
||||
]
|
||||
name = "langchain-community"
|
||||
version = "0.3.17rc1"
|
||||
description = "Community contributed LangChain integrations."
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/community"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-community%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.4.4",
|
||||
"pytest-cov<5.0.0,>=4.1.0",
|
||||
"pytest-dotenv<1.0.0,>=0.5.2",
|
||||
"duckdb-engine<1.0.0,>=0.13.6",
|
||||
"pytest-watcher<1.0.0,>=0.2.6",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"responses<1.0.0,>=0.22.0",
|
||||
"pytest-asyncio<1.0.0,>=0.20.3",
|
||||
"lark<2.0.0,>=1.1.5",
|
||||
"pandas<3.0.0,>=2.0.0",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"pytest-socket<1.0.0,>=0.6.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"requests-mock<2.0.0,>=1.11.0",
|
||||
"pytest-xdist<4.0.0,>=3.6.1",
|
||||
"cffi<1.17.1; python_version < \"3.10\"",
|
||||
"cffi; python_version >= \"3.10\"",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain @ file:///${PROJECT_ROOT}/../langchain",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../standard-tests",
|
||||
"toml>=0.10.2",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
test_integration = [
|
||||
"pytest-vcr<2.0.0,>=1.0.2",
|
||||
"vcrpy<7,>=6",
|
||||
]
|
||||
lint = [
|
||||
"ruff<0.6,>=0.5",
|
||||
"cffi<1.17.1; python_version < \"3.10\"",
|
||||
"cffi; python_version >= \"3.10\"",
|
||||
]
|
||||
dev = [
|
||||
"jupyter<2.0.0,>=1.0.0",
|
||||
"setuptools<68.0.0,>=67.6.1",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.12",
|
||||
"types-pyyaml<7.0.0.0,>=6.0.12.2",
|
||||
"types-requests<3.0.0.0,>=2.28.11.5",
|
||||
"types-toml<1.0.0.0,>=0.10.8.1",
|
||||
"types-pytz<2024.0.0.0,>=2023.3.0.0",
|
||||
"types-chardet<6.0.0.0,>=5.0.4.6",
|
||||
"types-redis<5.0.0.0,>=4.3.21.6",
|
||||
"mypy-protobuf<4.0.0,>=3.0.0",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters",
|
||||
"langchain @ file:///${PROJECT_ROOT}/../langchain",
|
||||
]
|
||||
|
||||
|
||||
[tool.ruff]
|
||||
exclude = [
|
||||
"tests/examples/non-utf8-encoding.py",
|
||||
@@ -27,31 +103,6 @@ skip = ".git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package
|
||||
ignore-regex = ".*(Stati Uniti|Tense=Pres).*"
|
||||
ignore-words-list = "momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia,nin,cann"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/community"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-community%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.32"
|
||||
langchain = "^0.3.16"
|
||||
SQLAlchemy = ">=1.4,<3"
|
||||
requests = "^2"
|
||||
PyYAML = ">=5.3"
|
||||
aiohttp = "^3.8.3"
|
||||
tenacity = ">=8.1.0,!=8.4.0,<10"
|
||||
dataclasses-json = ">= 0.5.7, < 0.7"
|
||||
pydantic-settings = "^2.4.0"
|
||||
langsmith = ">=0.1.125,<0.4"
|
||||
httpx-sse = "^0.4.0"
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = ">=1.22.4,<2"
|
||||
python = "<3.12"
|
||||
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = ">=1.26.2,<3"
|
||||
python = ">=3.12"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "T201"]
|
||||
|
||||
@@ -71,101 +122,3 @@ filterwarnings = [
|
||||
"ignore::langchain_core._api.deprecation.LangChainDeprecationWarning:test",
|
||||
"ignore::langchain_core._api.deprecation.LangChainPendingDeprecationWarning:test",
|
||||
]
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.4.4"
|
||||
pytest-cov = "^4.1.0"
|
||||
pytest-dotenv = "^0.5.2"
|
||||
duckdb-engine = "^0.13.6"
|
||||
pytest-watcher = "^0.2.6"
|
||||
freezegun = "^1.2.2"
|
||||
responses = "^0.22.0"
|
||||
pytest-asyncio = "^0.20.3"
|
||||
lark = "^1.1.5"
|
||||
pandas = "^2.0.0"
|
||||
pytest-mock = "^3.10.0"
|
||||
pytest-socket = "^0.6.0"
|
||||
syrupy = "^4.0.2"
|
||||
requests-mock = "^1.11.0"
|
||||
pytest-xdist = "^3.6.1"
|
||||
[[tool.poetry.group.test.dependencies.cffi]]
|
||||
version = "<1.17.1"
|
||||
python = "<3.10"
|
||||
|
||||
[[tool.poetry.group.test.dependencies.cffi]]
|
||||
version = "*"
|
||||
python = ">=3.10"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
pytest-vcr = "^1.0.2"
|
||||
vcrpy = "^6"
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
[[tool.poetry.group.lint.dependencies.cffi]]
|
||||
version = "<1.17.1"
|
||||
python = "<3.10"
|
||||
|
||||
[[tool.poetry.group.lint.dependencies.cffi]]
|
||||
version = "*"
|
||||
python = ">=3.10"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
jupyter = "^1.0.0"
|
||||
setuptools = "^67.6.1"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.12"
|
||||
types-pyyaml = "^6.0.12.2"
|
||||
types-requests = "^2.28.11.5"
|
||||
types-toml = "^0.10.8.1"
|
||||
types-pytz = "^2023.3.0.0"
|
||||
types-chardet = "^5.0.4.6"
|
||||
types-redis = "^4.3.21.6"
|
||||
mypy-protobuf = "^3.0.0"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain]
|
||||
path = "../langchain"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../standard-tests"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain]
|
||||
path = "../langchain"
|
||||
develop = true
|
||||
|
||||
@@ -82,7 +82,7 @@ class MockResponse:
|
||||
def raise_for_status(self) -> None:
|
||||
"""Mocked raise for status."""
|
||||
if 400 <= self.status_code < 600:
|
||||
raise HTTPError()
|
||||
raise HTTPError() # type: ignore[call-arg]
|
||||
|
||||
def json(self) -> Dict:
|
||||
"""Returns mocked json data."""
|
||||
|
||||
@@ -50,6 +50,7 @@ def test_yandexgpt_invalid_model_params() -> None:
|
||||
[dict(), dict(disable_request_logging=True), dict(disable_request_logging=False)],
|
||||
)
|
||||
@mock.patch.dict(os.environ, {}, clear=True)
|
||||
@pytest.mark.requires("yandexcloud") # TODO: remove this
|
||||
def test_completion_call(api_key_or_token: dict, disable_logging: dict) -> None:
|
||||
absent_yandex_module_stub = MagicMock()
|
||||
grpc_mock = MagicMock()
|
||||
|
||||
@@ -50,11 +50,12 @@ async def test_load_mocked_with_filters(expected_documents: List[Document]) -> N
|
||||
mock_collection.find = mock_find
|
||||
mock_collection.count_documents = mock_count_documents
|
||||
|
||||
with patch(
|
||||
"motor.motor_asyncio.AsyncIOMotorClient", return_value=MagicMock()
|
||||
), patch(
|
||||
"langchain_community.document_loaders.mongodb.MongodbLoader.aload",
|
||||
new=mock_async_load,
|
||||
with (
|
||||
patch("motor.motor_asyncio.AsyncIOMotorClient", return_value=MagicMock()),
|
||||
patch(
|
||||
"langchain_community.document_loaders.mongodb.MongodbLoader.aload",
|
||||
new=mock_async_load,
|
||||
),
|
||||
):
|
||||
loader = MongodbLoader(
|
||||
"mongodb://localhost:27017",
|
||||
|
||||
@@ -63,7 +63,7 @@ class MockResponse:
|
||||
def raise_for_status(self) -> None:
|
||||
"""Mocked raise for status."""
|
||||
if 400 <= self.status_code < 600:
|
||||
raise HTTPError()
|
||||
raise HTTPError() # type: ignore[call-arg]
|
||||
|
||||
def json(self) -> Dict:
|
||||
"""Returns mocked json data."""
|
||||
|
||||
@@ -50,6 +50,7 @@ def test_yandexgpt_invalid_model_params() -> None:
|
||||
[dict(), dict(disable_request_logging=True), dict(disable_request_logging=False)],
|
||||
)
|
||||
@mock.patch.dict(os.environ, {}, clear=True)
|
||||
@pytest.mark.requires("yandexcloud") # TODO: remove this
|
||||
def test_completion_call(api_key_or_token: dict, disable_logging: dict) -> None:
|
||||
absent_yandex_module_stub = MagicMock()
|
||||
grpc_mock = MagicMock()
|
||||
|
||||
@@ -30,7 +30,8 @@ from tests.unit_tests.llms.fake_llm import FakeLLM
|
||||
def get_sqlite_cache() -> SQLAlchemyCache:
|
||||
return SQLAlchemyCache(
|
||||
engine=create_engine(
|
||||
"sqlite://", creator=lambda: sqlite3.connect("file::memory:?cache=shared")
|
||||
"sqlite://",
|
||||
creator=lambda: sqlite3.connect("file::memory:?cache=shared", uri=True),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any, Dict, Mapping
|
||||
|
||||
import pytest
|
||||
import toml
|
||||
from packaging.requirements import Requirement
|
||||
|
||||
HERE = Path(__file__).parent
|
||||
|
||||
@@ -12,30 +13,21 @@ PYPROJECT_TOML = HERE / "../../pyproject.toml"
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def poetry_conf() -> Dict[str, Any]:
|
||||
def uv_conf() -> Dict[str, Any]:
|
||||
"""Load the pyproject.toml file."""
|
||||
with open(PYPROJECT_TOML) as f:
|
||||
return toml.load(f)["tool"]["poetry"]
|
||||
return toml.load(f)
|
||||
|
||||
|
||||
def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
def test_required_dependencies(uv_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
|
||||
]
|
||||
dependencies = uv_conf["project"]["dependencies"]
|
||||
required_dependencies = set(Requirement(dep).name for dep in dependencies)
|
||||
|
||||
assert sorted(required_dependencies) == sorted(
|
||||
[
|
||||
@@ -47,7 +39,6 @@ def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
"langchain-core",
|
||||
"langsmith",
|
||||
"numpy",
|
||||
"python",
|
||||
"requests",
|
||||
"pydantic-settings",
|
||||
"tenacity",
|
||||
@@ -55,16 +46,8 @@ def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
]
|
||||
)
|
||||
|
||||
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:
|
||||
def test_test_group_dependencies(uv_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
|
||||
@@ -73,9 +56,10 @@ def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
Examples of dependencies that should NOT be included: boto3, azure, postgres, etc.
|
||||
"""
|
||||
|
||||
test_group_deps = sorted(poetry_conf["group"]["test"]["dependencies"])
|
||||
dependencies = uv_conf["dependency-groups"]["test"]
|
||||
test_group_deps = set(Requirement(dep).name for dep in dependencies)
|
||||
|
||||
assert test_group_deps == sorted(
|
||||
assert sorted(test_group_deps) == sorted(
|
||||
[
|
||||
"duckdb-engine",
|
||||
"freezegun",
|
||||
@@ -94,6 +78,7 @@ def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
"pytest-xdist",
|
||||
"responses",
|
||||
"syrupy",
|
||||
"toml",
|
||||
"requests-mock",
|
||||
# TODO: Hack to get around cffi 1.17.1 not working with py3.9, remove when
|
||||
# fix is released.
|
||||
|
||||
@@ -44,11 +44,12 @@ def test_huggingface_tts_constructor() -> None:
|
||||
def test_huggingface_tts_run_with_requests_mock() -> None:
|
||||
os.environ["HUGGINGFACE_API_KEY"] = "foo"
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmp_dir, patch(
|
||||
"uuid.uuid4"
|
||||
) as mock_uuid, patch("requests.post") as mock_inference, patch(
|
||||
"builtins.open", mock_open()
|
||||
) as mock_file:
|
||||
with (
|
||||
tempfile.TemporaryDirectory() as tmp_dir,
|
||||
patch("uuid.uuid4") as mock_uuid,
|
||||
patch("requests.post") as mock_inference,
|
||||
patch("builtins.open", mock_open()) as mock_file,
|
||||
):
|
||||
input_query = "Dummy input"
|
||||
|
||||
mock_uuid_value = uuid.UUID("00000000-0000-0000-0000-000000000000")
|
||||
|
||||
@@ -7,8 +7,8 @@ import pytest
|
||||
from langchain_community.agent_toolkits import PlayWrightBrowserToolkit
|
||||
|
||||
|
||||
@pytest.mark.requires("playwright")
|
||||
@pytest.mark.requires("bs4")
|
||||
@pytest.mark.requires("playwright")
|
||||
def test_playwright_tools_schemas() -> None:
|
||||
"""Test calling 'tool_call_schema' for every tool to check to init issues."""
|
||||
|
||||
|
||||
@@ -220,9 +220,10 @@ def test_ids_used_correctly() -> None:
|
||||
]
|
||||
ids_provided = [i.metadata.get("id") for i in documents]
|
||||
|
||||
with patch.object(
|
||||
SearchClient, "upload_documents", mock_upload_documents
|
||||
), patch.object(SearchIndexClient, "get_index", mock_default_index):
|
||||
with (
|
||||
patch.object(SearchClient, "upload_documents", mock_upload_documents),
|
||||
patch.object(SearchIndexClient, "get_index", mock_default_index),
|
||||
):
|
||||
vector_store = create_vector_store()
|
||||
ids_used_at_upload = vector_store.add_documents(documents, ids=ids_provided)
|
||||
assert len(ids_provided) == len(ids_used_at_upload)
|
||||
|
||||
4181
libs/community/uv.lock
generated
Normal file
4181
libs/community/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -6,13 +6,16 @@ all: help
|
||||
# Define a variable for the test file path.
|
||||
TEST_FILE ?= tests/unit_tests/
|
||||
|
||||
.EXPORT_ALL_VARIABLES:
|
||||
UV_FROZEN = true
|
||||
|
||||
test tests:
|
||||
env \
|
||||
-u LANGCHAIN_TRACING_V2 \
|
||||
-u LANGCHAIN_API_KEY \
|
||||
-u LANGSMITH_TRACING \
|
||||
-u LANGCHAIN_PROJECT \
|
||||
poetry run pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
env \
|
||||
@@ -20,16 +23,16 @@ test_watch:
|
||||
-u LANGCHAIN_API_KEY \
|
||||
-u LANGSMITH_TRACING \
|
||||
-u LANGCHAIN_PROJECT \
|
||||
poetry run ptw --snapshot-update --now . --disable-socket --allow-unix-socket -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . --disable-socket --allow-unix-socket -- -vv $(TEST_FILE)
|
||||
|
||||
test_profile:
|
||||
poetry run pytest -vv tests/unit_tests/ --profile-svg
|
||||
uv run --group test pytest -vv tests/unit_tests/ --profile-svg
|
||||
|
||||
check_imports: $(shell find langchain_core -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --group test python ./scripts/check_imports.py $^
|
||||
|
||||
extended_tests:
|
||||
poetry run pytest --only-extended --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest --only-extended --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
|
||||
######################
|
||||
@@ -47,19 +50,19 @@ lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
./scripts/lint_imports.sh
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -1,16 +1,70 @@
|
||||
[build-system]
|
||||
requires = [ "poetry-core>=1.0.0",]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
name = "langchain-core"
|
||||
version = "0.3.33"
|
||||
description = "Building applications with LLMs through composability"
|
||||
[project]
|
||||
authors = []
|
||||
license = "MIT"
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langsmith<0.4,>=0.1.125",
|
||||
"tenacity!=8.4.0,<10.0.0,>=8.1.0",
|
||||
"jsonpatch<2.0,>=1.33",
|
||||
"PyYAML>=5.3",
|
||||
"packaging<25,>=23.2",
|
||||
"typing-extensions>=4.7",
|
||||
"pydantic<3.0.0,>=2.5.2; python_full_version < \"3.12.4\"",
|
||||
"pydantic<3.0.0,>=2.7.4; python_full_version >= \"3.12.4\"",
|
||||
]
|
||||
name = "langchain-core"
|
||||
version = "0.3.34rc2"
|
||||
description = "Building applications with LLMs through composability"
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/core"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-core%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
|
||||
[dependency-groups]
|
||||
lint = [
|
||||
"ruff<1.0.0,>=0.9.2",
|
||||
]
|
||||
typing = [
|
||||
"mypy<1.11,>=1.10",
|
||||
"types-pyyaml<7.0.0.0,>=6.0.12.2",
|
||||
"types-requests<3.0.0.0,>=2.28.11.5",
|
||||
"types-jinja2<3.0.0,>=2.11.9",
|
||||
"langchain-text-splitters",
|
||||
]
|
||||
dev = [
|
||||
"jupyter<2.0.0,>=1.0.0",
|
||||
"setuptools<68.0.0,>=67.6.1",
|
||||
"grandalf<1.0,>=0.8",
|
||||
]
|
||||
test = [
|
||||
"pytest<9,>=8",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"grandalf<1.0,>=0.8",
|
||||
"responses<1.0.0,>=0.25.0",
|
||||
"pytest-socket<1.0.0,>=0.7.0",
|
||||
"pytest-xdist<4.0.0,>=3.6.1",
|
||||
"blockbuster~=1.5.11",
|
||||
"numpy<2.0.0,>=1.24.0; python_version < \"3.12\"",
|
||||
"numpy<3,>=1.26.0; python_version >= \"3.12\"",
|
||||
"langchain-tests",
|
||||
]
|
||||
test_integration = []
|
||||
|
||||
[tool.uv.sources]
|
||||
langchain-tests = { path = "../standard-tests" }
|
||||
langchain-text-splitters = { path = "../text-splitters" }
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
exclude = [ "notebooks", "examples", "example_data", "langchain_core/pydantic", "tests/unit_tests/utils/test_function_calling.py",]
|
||||
disallow_untyped_defs = "True"
|
||||
@@ -21,27 +75,6 @@ ignore_missing_imports = true
|
||||
[tool.ruff]
|
||||
target-version = "py39"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/core"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-core%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langsmith = ">=0.1.125,<0.4"
|
||||
tenacity = ">=8.1.0,!=8.4.0,<10.0.0"
|
||||
jsonpatch = "^1.33"
|
||||
PyYAML = ">=5.3"
|
||||
packaging = ">=23.2,<25"
|
||||
typing-extensions = ">=4.7"
|
||||
[[tool.poetry.dependencies.pydantic]]
|
||||
version = "^2.5.2"
|
||||
python = "<3.12.4"
|
||||
|
||||
[[tool.poetry.dependencies.pydantic]]
|
||||
version = "^2.7.4"
|
||||
python = ">=3.12.4"
|
||||
|
||||
[tool.poetry.extras]
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = [ "ASYNC", "B", "C4", "COM", "DJ", "E", "EM", "EXE", "F", "FLY", "FURB", "I", "ICN", "INT", "LOG", "N", "NPY", "PD", "PIE", "Q", "RSE", "S", "SIM", "SLOT", "T10", "T201", "TID", "TRY", "UP", "W", "YTT",]
|
||||
@@ -56,21 +89,6 @@ markers = [ "requires: mark tests as requiring a specific library", "compile: ma
|
||||
asyncio_mode = "auto"
|
||||
filterwarnings = [ "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning",]
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.typing]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.ruff.lint.pep8-naming]
|
||||
classmethod-decorators = [ "classmethod", "langchain_core.utils.pydantic.pre_init", "pydantic.field_validator", "pydantic.v1.root_validator",]
|
||||
|
||||
@@ -80,71 +98,3 @@ classmethod-decorators = [ "classmethod", "langchain_core.utils.pydantic.pre_ini
|
||||
"tests/unit_tests/runnables/test_graph.py" = [ "E501",]
|
||||
"tests/**" = [ "S",]
|
||||
"scripts/**" = [ "S",]
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.9.2"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = ">=1.10,<1.11"
|
||||
types-pyyaml = "^6.0.12.2"
|
||||
types-requests = "^2.28.11.5"
|
||||
types-jinja2 = "^2.11.9"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
jupyter = "^1.0.0"
|
||||
setuptools = "^67.6.1"
|
||||
grandalf = "^0.8"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^8"
|
||||
freezegun = "^1.2.2"
|
||||
pytest-mock = "^3.10.0"
|
||||
syrupy = "^4.0.2"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
grandalf = "^0.8"
|
||||
responses = "^0.25.0"
|
||||
pytest-socket = "^0.7.0"
|
||||
pytest-xdist = "^3.6.1"
|
||||
blockbuster = "~1.5.11"
|
||||
[[tool.poetry.group.test.dependencies.numpy]]
|
||||
version = "^1.24.0"
|
||||
python = "<3.12"
|
||||
|
||||
[[tool.poetry.group.test.dependencies.numpy]]
|
||||
version = ">=1.26.0,<3"
|
||||
python = ">=3.12"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../standard-tests"
|
||||
develop = true
|
||||
|
||||
2718
libs/core/uv.lock
generated
Normal file
2718
libs/core/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,35 +10,38 @@ all: help
|
||||
# Define a variable for the test file path.
|
||||
TEST_FILE ?= tests/unit_tests/
|
||||
|
||||
.EXPORT_ALL_VARIABLES:
|
||||
UV_FROZEN = true
|
||||
|
||||
# Run unit tests and generate a coverage report.
|
||||
coverage:
|
||||
poetry run pytest --cov \
|
||||
uv run --group test pytest --cov \
|
||||
--cov-config=.coveragerc \
|
||||
--cov-report xml \
|
||||
--cov-report term-missing:skip-covered \
|
||||
$(TEST_FILE)
|
||||
|
||||
test tests:
|
||||
poetry run pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest -n auto --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
extended_tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
uv run --group test pytest --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -x --disable-socket --allow-unix-socket --disable-warnings tests/unit_tests
|
||||
uv run --group test ptw --snapshot-update --now . -- -x --disable-socket --allow-unix-socket --disable-warnings tests/unit_tests
|
||||
|
||||
test_watch_extended:
|
||||
poetry run ptw --snapshot-update --now . -- -x --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
uv run --group test ptw --snapshot-update --now . -- -x --disable-socket --allow-unix-socket --only-extended tests/unit_tests
|
||||
|
||||
integration_tests:
|
||||
poetry run pytest tests/integration_tests
|
||||
uv run --group test --group test_integration pytest tests/integration_tests
|
||||
|
||||
docker_tests:
|
||||
docker build -t my-langchain-image:test .
|
||||
docker run --rm my-langchain-image:test
|
||||
|
||||
check_imports: $(shell find langchain -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# LINTING AND FORMATTING
|
||||
@@ -55,19 +58,19 @@ lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
./scripts/lint_imports.sh
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -28,7 +28,7 @@ from typing_extensions import Self
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import openai
|
||||
from openai.types.beta.threads import ThreadMessage
|
||||
from openai.types.beta.threads import ThreadMessage # type: ignore[attr-defined]
|
||||
from openai.types.beta.threads.required_action_function_tool_call import (
|
||||
RequiredActionFunctionToolCall,
|
||||
)
|
||||
@@ -590,7 +590,8 @@ class OpenAIAssistantRunnable(RunnableSerializable[Dict, OutputType]):
|
||||
isinstance(content, openai.types.beta.threads.TextContentBlock)
|
||||
if version_gte_1_14
|
||||
else isinstance(
|
||||
content, openai.types.beta.threads.MessageContentText
|
||||
content,
|
||||
openai.types.beta.threads.MessageContentText, # type: ignore[attr-defined]
|
||||
)
|
||||
)
|
||||
for content in answer
|
||||
@@ -743,7 +744,8 @@ class OpenAIAssistantRunnable(RunnableSerializable[Dict, OutputType]):
|
||||
isinstance(content, openai.types.beta.threads.TextContentBlock)
|
||||
if version_gte_1_14
|
||||
else isinstance(
|
||||
content, openai.types.beta.threads.MessageContentText
|
||||
content,
|
||||
openai.types.beta.threads.MessageContentText, # type: ignore[attr-defined]
|
||||
)
|
||||
)
|
||||
for content in answer
|
||||
|
||||
@@ -236,7 +236,9 @@ class FlareChain(Chain):
|
||||
"Please install langchain-openai."
|
||||
"pip install langchain-openai"
|
||||
)
|
||||
llm = ChatOpenAI(max_tokens=max_generation_len, logprobs=True, temperature=0)
|
||||
llm = ChatOpenAI(
|
||||
max_completion_tokens=max_generation_len, logprobs=True, temperature=0
|
||||
)
|
||||
response_chain = PROMPT | llm
|
||||
question_gen_chain = QUESTION_GENERATOR_PROMPT | llm | StrOutputParser()
|
||||
return cls(
|
||||
|
||||
@@ -65,7 +65,7 @@ class OpenAIModerationChain(Chain):
|
||||
except ValueError:
|
||||
values["openai_pre_1_0"] = True
|
||||
if values["openai_pre_1_0"]:
|
||||
values["client"] = openai.Moderation
|
||||
values["client"] = openai.Moderation # type: ignore[attr-defined]
|
||||
else:
|
||||
values["client"] = openai.OpenAI(api_key=openai_api_key)
|
||||
values["async_client"] = openai.AsyncOpenAI(api_key=openai_api_key)
|
||||
|
||||
@@ -30,7 +30,9 @@ def _embedding_factory() -> Embeddings:
|
||||
from langchain_openai import OpenAIEmbeddings
|
||||
except ImportError:
|
||||
try:
|
||||
from langchain_community.embeddings.openai import OpenAIEmbeddings
|
||||
from langchain_community.embeddings.openai import ( # type: ignore[no-redef]
|
||||
OpenAIEmbeddings,
|
||||
)
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
"Could not import OpenAIEmbeddings. Please install the "
|
||||
@@ -89,7 +91,9 @@ class _EmbeddingDistanceChainMixin(Chain):
|
||||
pass
|
||||
|
||||
try:
|
||||
from langchain_community.embeddings.openai import OpenAIEmbeddings
|
||||
from langchain_community.embeddings.openai import ( # type: ignore[no-redef]
|
||||
OpenAIEmbeddings,
|
||||
)
|
||||
|
||||
types_.append(OpenAIEmbeddings)
|
||||
except ImportError:
|
||||
|
||||
@@ -135,7 +135,9 @@ def load_evaluator(
|
||||
from langchain_openai import ChatOpenAI
|
||||
except ImportError:
|
||||
try:
|
||||
from langchain_community.chat_models.openai import ChatOpenAI
|
||||
from langchain_community.chat_models.openai import ( # type: ignore[no-redef]
|
||||
ChatOpenAI,
|
||||
)
|
||||
except ImportError:
|
||||
raise ImportError(
|
||||
"Could not import langchain_openai or fallback onto "
|
||||
|
||||
@@ -1,16 +1,119 @@
|
||||
[build-system]
|
||||
requires = [ "poetry-core>=1.0.0",]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
name = "langchain"
|
||||
version = "0.3.17"
|
||||
description = "Building applications with LLMs through composability"
|
||||
[project]
|
||||
authors = []
|
||||
license = "MIT"
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.34rc2",
|
||||
"langchain-text-splitters<1.0.0,>=0.3.6rc2",
|
||||
"langsmith<0.4,>=0.1.17",
|
||||
"pydantic<3.0.0,>=2.7.4",
|
||||
"SQLAlchemy<3,>=1.4",
|
||||
"requests<3,>=2",
|
||||
"PyYAML>=5.3",
|
||||
"aiohttp<4.0.0,>=3.8.3",
|
||||
"tenacity!=8.4.0,<10,>=8.1.0",
|
||||
"numpy<2,>=1.26.4; python_version < \"3.12\"",
|
||||
"numpy<3,>=1.26.2; python_version >= \"3.12\"",
|
||||
"async-timeout<5.0.0,>=4.0.0; python_version < \"3.11\"",
|
||||
]
|
||||
name = "langchain"
|
||||
version = "0.3.18rc2"
|
||||
description = "Building applications with LLMs through composability"
|
||||
readme = "README.md"
|
||||
|
||||
[project.optional-dependencies]
|
||||
community = ["langchain-community"]
|
||||
anthropic = ["langchain-anthropic>=0.3.7rc1"]
|
||||
openai = ["langchain-openai>=0.3.4rc1"]
|
||||
cohere = ["langchain-cohere"]
|
||||
google-vertexai = ["langchain-google-vertexai"]
|
||||
google-genai = ["langchain-google-genai"]
|
||||
fireworks = ["langchain-fireworks"]
|
||||
ollama = ["langchain-ollama"]
|
||||
together = ["langchain-together"]
|
||||
mistralai = ["langchain-mistralai"]
|
||||
huggingface = ["langchain-huggingface"]
|
||||
groq = ["langchain-groq"]
|
||||
aws = ["langchain-aws"]
|
||||
deepseek = ["langchain-deepseek"]
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/langchain"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
|
||||
[project.scripts]
|
||||
langchain-server = "langchain.server:main"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<9,>=8",
|
||||
"pytest-cov<5.0.0,>=4.0.0",
|
||||
"pytest-dotenv<1.0.0,>=0.5.2",
|
||||
"duckdb-engine<1.0.0,>=0.9.2",
|
||||
"pytest-watcher<1.0.0,>=0.2.6",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"responses<1.0.0,>=0.22.0",
|
||||
"pytest-asyncio<1.0.0,>=0.23.2",
|
||||
"lark<2.0.0,>=1.1.5",
|
||||
"pandas<3.0.0,>=2.0.0",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"pytest-socket<1.0.0,>=0.6.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"requests-mock<2.0.0,>=1.11.0",
|
||||
"pytest-xdist<4.0.0,>=3.6.1",
|
||||
"cffi<1.17.1; python_version < \"3.10\"",
|
||||
"cffi; python_version >= \"3.10\"",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../standard-tests",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters",
|
||||
"langchain-openai @ file:///${PROJECT_ROOT}/../partners/openai",
|
||||
"toml>=0.10.2",
|
||||
"packaging>=24.2",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
test_integration = [
|
||||
"pytest-vcr<2.0.0,>=1.0.2",
|
||||
"urllib3<2; python_version < \"3.10\"",
|
||||
"wrapt<2.0.0,>=1.15.0",
|
||||
"python-dotenv<2.0.0,>=1.0.0",
|
||||
"cassio<1.0.0,>=0.1.0",
|
||||
"langchainhub<1.0.0,>=0.1.16",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters",
|
||||
]
|
||||
lint = [
|
||||
"ruff<1.0.0,>=0.9.2",
|
||||
"cffi<1.17.1; python_version < \"3.10\"",
|
||||
"cffi; python_version >= \"3.10\"",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"types-pyyaml<7.0.0.0,>=6.0.12.2",
|
||||
"types-requests<3.0.0.0,>=2.28.11.5",
|
||||
"types-toml<1.0.0.0,>=0.10.8.1",
|
||||
"types-redis<5.0.0.0,>=4.3.21.6",
|
||||
"types-pytz<2024.0.0.0,>=2023.3.0.0",
|
||||
"types-chardet<6.0.0.0,>=5.0.4.6",
|
||||
"mypy-protobuf<4.0.0,>=3.0.0",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters",
|
||||
]
|
||||
dev = [
|
||||
"jupyter<2.0.0,>=1.0.0",
|
||||
"playwright<2.0.0,>=1.28.0",
|
||||
"setuptools<68.0.0,>=67.6.1",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../core",
|
||||
"langchain-text-splitters @ file:///${PROJECT_ROOT}/../text-splitters",
|
||||
]
|
||||
|
||||
|
||||
[tool.ruff]
|
||||
target-version = "py39"
|
||||
exclude = [ "tests/integration_tests/examples/non-utf8-encoding.py",]
|
||||
@@ -25,32 +128,6 @@ skip = ".git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package
|
||||
ignore-regex = ".*(Stati Uniti|Tense=Pres).*"
|
||||
ignore-words-list = "momento,collison,ned,foor,reworkd,parth,whats,aapply,mysogyny,unsecure,damon,crate,aadd,symbl,precesses,accademia,nin"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/langchain"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.scripts]
|
||||
langchain-server = "langchain.server:main"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.33"
|
||||
langchain-text-splitters = "^0.3.3"
|
||||
langsmith = ">=0.1.17,<0.4"
|
||||
pydantic = "^2.7.4"
|
||||
SQLAlchemy = ">=1.4,<3"
|
||||
requests = "^2"
|
||||
PyYAML = ">=5.3"
|
||||
aiohttp = "^3.8.3"
|
||||
tenacity = ">=8.1.0,!=8.4.0,<10"
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = ">=1.22.4,<2"
|
||||
python = "<3.12"
|
||||
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = ">=1.26.2,<3"
|
||||
python = ">=3.12"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = [ "E", "F", "I", "T201", "D",]
|
||||
pydocstyle = { convention = "google" }
|
||||
@@ -67,125 +144,3 @@ addopts = "--strict-markers --strict-config --durations=5 --snapshot-warn-unused
|
||||
markers = [ "requires: mark tests as requiring a specific library", "scheduled: mark tests to run in scheduled testing", "compile: mark placeholder test used to compile integration tests without running them",]
|
||||
asyncio_mode = "auto"
|
||||
filterwarnings = [ "ignore::langchain_core._api.beta_decorator.LangChainBetaWarning", "ignore::langchain_core._api.deprecation.LangChainDeprecationWarning:tests", "ignore::langchain_core._api.deprecation.LangChainPendingDeprecationWarning:tests",]
|
||||
|
||||
[tool.poetry.dependencies.async-timeout]
|
||||
version = "^4.0.0"
|
||||
python = "<3.11"
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.typing]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^8"
|
||||
pytest-cov = "^4.0.0"
|
||||
pytest-dotenv = "^0.5.2"
|
||||
duckdb-engine = "^0.9.2"
|
||||
pytest-watcher = "^0.2.6"
|
||||
freezegun = "^1.2.2"
|
||||
responses = "^0.22.0"
|
||||
pytest-asyncio = "^0.23.2"
|
||||
lark = "^1.1.5"
|
||||
pandas = "^2.0.0"
|
||||
pytest-mock = "^3.10.0"
|
||||
pytest-socket = "^0.6.0"
|
||||
syrupy = "^4.0.2"
|
||||
requests-mock = "^1.11.0"
|
||||
pytest-xdist = "^3.6.1"
|
||||
[[tool.poetry.group.test.dependencies.cffi]]
|
||||
version = "<1.17.1"
|
||||
python = "<3.10"
|
||||
|
||||
[[tool.poetry.group.test.dependencies.cffi]]
|
||||
version = "*"
|
||||
python = ">=3.10"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
pytest-vcr = "^1.0.2"
|
||||
wrapt = "^1.15.0"
|
||||
python-dotenv = "^1.0.0"
|
||||
cassio = "^0.1.0"
|
||||
langchainhub = "^0.1.16"
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.9.2"
|
||||
[[tool.poetry.group.lint.dependencies.cffi]]
|
||||
version = "<1.17.1"
|
||||
python = "<3.10"
|
||||
|
||||
[[tool.poetry.group.lint.dependencies.cffi]]
|
||||
version = "*"
|
||||
python = ">=3.10"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
types-pyyaml = "^6.0.12.2"
|
||||
types-requests = "^2.28.11.5"
|
||||
types-toml = "^0.10.8.1"
|
||||
types-redis = "^4.3.21.6"
|
||||
types-pytz = "^2023.3.0.0"
|
||||
types-chardet = "^5.0.4.6"
|
||||
mypy-protobuf = "^3.0.0"
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
jupyter = "^1.0.0"
|
||||
playwright = "^1.28.0"
|
||||
setuptools = "^67.6.1"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../standard-tests"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-openai]
|
||||
path = "../partners/openai"
|
||||
optional = true
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-text-splitters]
|
||||
path = "../text-splitters"
|
||||
develop = true
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any, Dict, Mapping
|
||||
|
||||
import pytest
|
||||
import toml
|
||||
from packaging.requirements import Requirement
|
||||
|
||||
HERE = Path(__file__).parent
|
||||
|
||||
@@ -12,30 +13,21 @@ PYPROJECT_TOML = HERE / "../../pyproject.toml"
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def poetry_conf() -> Dict[str, Any]:
|
||||
def uv_conf() -> Dict[str, Any]:
|
||||
"""Load the pyproject.toml file."""
|
||||
with open(PYPROJECT_TOML) as f:
|
||||
return toml.load(f)["tool"]["poetry"]
|
||||
return toml.load(f)
|
||||
|
||||
|
||||
def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
def test_required_dependencies(uv_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
|
||||
]
|
||||
dependencies = uv_conf["project"]["dependencies"]
|
||||
required_dependencies = set(Requirement(dep).name for dep in dependencies)
|
||||
|
||||
assert sorted(required_dependencies) == sorted(
|
||||
[
|
||||
@@ -48,22 +40,13 @@ def test_required_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
"langsmith",
|
||||
"numpy",
|
||||
"pydantic",
|
||||
"python",
|
||||
"requests",
|
||||
"tenacity",
|
||||
]
|
||||
)
|
||||
|
||||
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:
|
||||
def test_test_group_dependencies(uv_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
|
||||
@@ -72,9 +55,10 @@ def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
Examples of dependencies that should NOT be included: boto3, azure, postgres, etc.
|
||||
"""
|
||||
|
||||
test_group_deps = sorted(poetry_conf["group"]["test"]["dependencies"])
|
||||
dependencies = uv_conf["dependency-groups"]["test"]
|
||||
test_group_deps = set(Requirement(dep).name for dep in dependencies)
|
||||
|
||||
assert test_group_deps == sorted(
|
||||
assert sorted(test_group_deps) == sorted(
|
||||
[
|
||||
"duckdb-engine",
|
||||
"freezegun",
|
||||
@@ -83,6 +67,7 @@ def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
"langchain-text-splitters",
|
||||
"langchain-openai",
|
||||
"lark",
|
||||
"packaging",
|
||||
"pandas",
|
||||
"pytest",
|
||||
"pytest-asyncio",
|
||||
@@ -94,6 +79,7 @@ def test_test_group_dependencies(poetry_conf: Mapping[str, Any]) -> None:
|
||||
"pytest-xdist",
|
||||
"responses",
|
||||
"syrupy",
|
||||
"toml",
|
||||
"requests-mock",
|
||||
# TODO: temporary hack since cffi 1.17.1 doesn't work with py 3.9.
|
||||
"cffi",
|
||||
|
||||
6153
libs/langchain/uv.lock
generated
Normal file
6153
libs/langchain/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,13 @@ TEST_FILE ?= tests/unit_tests/
|
||||
integration_test integration_tests: TEST_FILE=tests/integration_tests/
|
||||
|
||||
test tests:
|
||||
poetry run pytest -vvv --timeout 30 --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest -vvv --timeout 30 --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
integration_test integration_tests:
|
||||
poetry run pytest -vvv --timeout 30 $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest -vvv --timeout 30 $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
|
||||
######################
|
||||
@@ -31,22 +31,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_anthropic -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -1,30 +1,64 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
name = "langchain-anthropic"
|
||||
version = "0.3.6"
|
||||
description = "An integration package connecting AnthropicMessages and LangChain"
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"anthropic<1,>=0.45.0",
|
||||
"langchain-core<1.0.0,>=0.3.34rc2",
|
||||
"pydantic<3.0.0,>=2.7.4",
|
||||
]
|
||||
name = "langchain-anthropic"
|
||||
version = "0.3.7rc1"
|
||||
description = "An integration package connecting AnthropicMessages and LangChain"
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/anthropic"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-anthropic%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.3.0",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"defusedxml<1.0.0,>=0.7.1",
|
||||
"pytest-timeout<3.0.0,>=2.3.1",
|
||||
"pytest-socket<1.0.0,>=0.7.0",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
]
|
||||
dev = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
test_integration = [
|
||||
"requests<3.0.0,>=2.32.3",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"types-requests<3.0.0.0,>=2.32.0.20241016",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = "True"
|
||||
plugins = ['pydantic.mypy']
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/anthropic"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-anthropic%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
anthropic = ">=0.45.0,<1"
|
||||
langchain-core = "^0.3.33"
|
||||
pydantic = "^2.7.4"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "T201"]
|
||||
|
||||
@@ -38,65 +72,3 @@ markers = [
|
||||
"compile: mark placeholder test used to compile integration tests without running them",
|
||||
]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.dependencies.defusedxml]
|
||||
version = "^0.7.1"
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.3.0"
|
||||
freezegun = "^1.2.2"
|
||||
pytest-mock = "^3.10.0"
|
||||
syrupy = "^4.0.2"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
defusedxml = "^0.7.1"
|
||||
pytest-timeout = "^2.3.1"
|
||||
pytest-socket = "^0.7.0"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
types-requests = "^2.32.0.20241016"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../../standard-tests"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
requests = "^2.32.3"
|
||||
[tool.poetry.group.test_integration.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
1401
libs/partners/anthropic/uv.lock
generated
Normal file
1401
libs/partners/anthropic/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,13 @@ TEST_FILE ?= tests/unit_tests/
|
||||
integration_test integration_tests: TEST_FILE = tests/integration_tests/
|
||||
|
||||
test tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
integration_test integration_tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
|
||||
|
||||
@@ -32,22 +32,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_chroma -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -970,7 +970,7 @@ class Chroma(VectorStore):
|
||||
"""
|
||||
if self._embedding_function is None:
|
||||
raise ValueError(
|
||||
"For MMR search, you must specify an embedding function on" "creation."
|
||||
"For MMR search, you must specify an embedding function on creation."
|
||||
)
|
||||
|
||||
embedding = self._embedding_function.embed_query(query)
|
||||
|
||||
@@ -1,35 +1,66 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core!=0.3.0,!=0.3.1,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,<0.4.0,>=0.2.43",
|
||||
"numpy<2.0.0,>=1.22.4; python_version < \"3.12\"",
|
||||
"numpy<2.0.0,>=1.26.2; python_version >= \"3.12\"",
|
||||
"chromadb!=0.5.10,!=0.5.11,!=0.5.12,!=0.5.4,!=0.5.5,!=0.5.7,!=0.5.9,<0.7.0,>=0.4.0",
|
||||
]
|
||||
name = "langchain-chroma"
|
||||
version = "0.2.1"
|
||||
description = "An integration package connecting Chroma and LangChain"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/chroma"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-chroma%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.3.0",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"onnxruntime<1.20; python_version < \"3.10\"",
|
||||
"onnxruntime; python_version >= \"3.10\"",
|
||||
"pytest-socket<1.0.0,>=0.7.0",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"",
|
||||
"langchain-core<0.3,>=0.1.40; python_version < \"3.9\"",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
test_integration = []
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
"onnxruntime<1.20; python_version < \"3.10\"",
|
||||
"onnxruntime; python_version >= \"3.10\"",
|
||||
]
|
||||
dev = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"",
|
||||
"langchain-core<0.3,>=0.1.40; python_version < \"3.9\"",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"types-requests<3.0.0.0,>=2.31.0.20240406",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core ; python_version >= \"3.9\"",
|
||||
"langchain-core<0.3,>=0.1.40; python_version < \"3.9\"",
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = true
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/chroma"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-chroma%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4"
|
||||
langchain-core = ">=0.2.43,<0.4.0,!=0.3.0,!=0.3.1,!=0.3.2,!=0.3.3,!=0.3.4,!=0.3.5,!=0.3.6,!=0.3.7,!=0.3.8,!=0.3.9,!=0.3.10,!=0.3.11,!=0.3.12,!=0.3.13,!=0.3.14"
|
||||
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = "^1.22.4"
|
||||
python = "<3.12"
|
||||
|
||||
[[tool.poetry.dependencies.numpy]]
|
||||
version = "^1.26.2"
|
||||
python = ">=3.12"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "T201", "D"]
|
||||
|
||||
@@ -44,96 +75,8 @@ markers = [
|
||||
]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.dependencies.chromadb]
|
||||
version = ">=0.4.0,<0.7.0,!=0.5.4,!=0.5.5,!=0.5.7,!=0.5.9,!=0.5.10,!=0.5.11,!=0.5.12"
|
||||
|
||||
[tool.poetry.dependencies.fastapi]
|
||||
version = ">=0.95.2,<1"
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.ruff.lint.pydocstyle]
|
||||
convention = "google"
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"tests/**" = ["D"]
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.3.0"
|
||||
freezegun = "^1.2.2"
|
||||
pytest-mock = "^3.10.0"
|
||||
syrupy = "^4.0.2"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
# hack to make sure py3.9 compatible versionof onnxruntime is installed for testing
|
||||
onnxruntime = [
|
||||
{ version = "<1.20", python = "<3.10" },
|
||||
{ version = "*", python = ">=3.10" },
|
||||
]
|
||||
pytest-socket = "^0.7.0"
|
||||
[[tool.poetry.group.test.dependencies.langchain-core]]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
python = ">=3.9"
|
||||
|
||||
[[tool.poetry.group.test.dependencies.langchain-core]]
|
||||
version = ">=0.1.40,<0.3"
|
||||
python = "<3.9"
|
||||
|
||||
[[tool.poetry.group.test.dependencies.langchain-tests]]
|
||||
path = "../../standard-tests"
|
||||
develop = true
|
||||
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
# hack to make sure py3.9 compatible versionof onnxruntime is installed for testing
|
||||
onnxruntime = [
|
||||
{ version = "<1.20", python = "<3.10" },
|
||||
{ version = "*", python = ">=3.10" },
|
||||
]
|
||||
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
[[tool.poetry.group.dev.dependencies.langchain-core]]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
python = ">=3.9"
|
||||
|
||||
[[tool.poetry.group.dev.dependencies.langchain-core]]
|
||||
version = ">=0.1.40,<0.3"
|
||||
python = "<3.9"
|
||||
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
types-requests = "^2.31.0.20240406"
|
||||
[[tool.poetry.group.typing.dependencies.langchain-core]]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
python = ">=3.9"
|
||||
|
||||
[[tool.poetry.group.typing.dependencies.langchain-core]]
|
||||
version = ">=0.1.40,<0.3"
|
||||
python = "<3.9"
|
||||
|
||||
2535
libs/partners/chroma/uv.lock
generated
Normal file
2535
libs/partners/chroma/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,14 +10,14 @@ integration_test integration_tests: TEST_FILE = tests/integration_tests/
|
||||
|
||||
# unit tests are run with the --disable-socket flag to prevent network calls
|
||||
test tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
# integration tests are run without the --disable-socket flag to allow network calls
|
||||
integration_test integration_tests:
|
||||
poetry run pytest --timeout=30 $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest --timeout=30 $(TEST_FILE)
|
||||
|
||||
######################
|
||||
# LINTING AND FORMATTING
|
||||
@@ -33,22 +33,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_deepseek -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -1,28 +1,51 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.33",
|
||||
"langchain-openai<1.0.0,>=0.3.3",
|
||||
]
|
||||
name = "langchain-deepseek"
|
||||
version = "0.1.1"
|
||||
description = "An integration package connecting DeepSeek and LangChain"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/deepseek"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22deepseek%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.4.3",
|
||||
"pytest-asyncio<1.0.0,>=0.23.2",
|
||||
"pytest-socket<1.0.0,>=0.7.0",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"langchain-tests<1.0.0,>=0.3.5",
|
||||
"langchain-openai @ file:///${PROJECT_ROOT}/../openai",
|
||||
"pytest-timeout<3.0.0,>=2.3.1",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.6",
|
||||
]
|
||||
test_integration = []
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
]
|
||||
dev = []
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = "True"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/deepseek"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22deepseek%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.33"
|
||||
langchain-openai = "^0.3.3"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "T201"]
|
||||
|
||||
@@ -35,40 +58,3 @@ markers = [
|
||||
"compile: mark placeholder test used to compile integration tests without running them",
|
||||
]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies]
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.4.3"
|
||||
pytest-asyncio = "^0.23.2"
|
||||
pytest-socket = "^0.7.0"
|
||||
pytest-watcher = "^0.3.4"
|
||||
langchain-tests = "^0.3.5"
|
||||
langchain-openai = { path = "../openai" }
|
||||
pytest-timeout = "^2.3.1"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.6"
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
|
||||
1408
libs/partners/deepseek/uv.lock
generated
Normal file
1408
libs/partners/deepseek/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -9,13 +9,13 @@ TEST_FILE ?= tests/unit_tests/
|
||||
integration_tests: TEST_FILE=tests/integration_tests/
|
||||
|
||||
test integration_tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest $(TEST_FILE)
|
||||
|
||||
tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test pytest $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
|
||||
######################
|
||||
@@ -32,22 +32,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_exa -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -16,7 +16,7 @@ from pydantic import Field, SecretStr, model_validator
|
||||
from langchain_exa._utilities import initialize_client
|
||||
|
||||
|
||||
class ExaSearchResults(BaseTool):
|
||||
class ExaSearchResults(BaseTool): # type: ignore[override]
|
||||
"""Exa Search tool.
|
||||
|
||||
Setup:
|
||||
@@ -105,7 +105,7 @@ class ExaSearchResults(BaseTool):
|
||||
return repr(e)
|
||||
|
||||
|
||||
class ExaFindSimilarResults(BaseTool):
|
||||
class ExaFindSimilarResults(BaseTool): # type: ignore[override]
|
||||
"""Tool that queries the Metaphor Search API and gets back json."""
|
||||
|
||||
name: str = "exa_find_similar_results_json"
|
||||
|
||||
@@ -1,28 +1,55 @@
|
||||
[build-system]
|
||||
requires = [ "poetry-core>=1.0.0",]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.15",
|
||||
"exa-py<2.0.0,>=1.0.8",
|
||||
]
|
||||
name = "langchain-exa"
|
||||
version = "0.2.1"
|
||||
description = "An integration package connecting Exa and LangChain"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/exa"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-exa%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.3.0",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
]
|
||||
dev = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
test_integration = []
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
"pydantic>2.0,<2.10", # TODO: support 2.10
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = "True"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/exa"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-exa%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.15"
|
||||
exa-py = "^1.0.8"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = [ "E", "F", "I", "T201",]
|
||||
|
||||
@@ -33,49 +60,3 @@ omit = [ "tests/*",]
|
||||
addopts = "--snapshot-warn-unused --strict-markers --strict-config --durations=5"
|
||||
markers = [ "requires: mark tests as requiring a specific library", "compile: mark placeholder test used to compile integration tests without running them",]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.3.0"
|
||||
freezegun = "^1.2.2"
|
||||
pytest-mock = "^3.10.0"
|
||||
syrupy = "^4.0.2"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
1207
libs/partners/exa/uv.lock
generated
Normal file
1207
libs/partners/exa/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,13 @@ TEST_FILE ?= tests/unit_tests/
|
||||
integration_test integration_tests: TEST_FILE = tests/integration_tests/
|
||||
|
||||
test tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
integration_test integration_tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
|
||||
######################
|
||||
@@ -31,22 +31,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_fireworks -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -1,31 +1,60 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.33",
|
||||
"fireworks-ai>=0.13.0",
|
||||
"openai<2.0.0,>=1.10.0",
|
||||
"requests<3,>=2",
|
||||
"aiohttp<4.0.0,>=3.9.1",
|
||||
]
|
||||
name = "langchain-fireworks"
|
||||
version = "0.2.7"
|
||||
description = "An integration package connecting Fireworks and LangChain"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/fireworks"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-fireworks%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.3.0",
|
||||
"freezegun<2.0.0,>=1.2.2",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"syrupy<5.0.0,>=4.0.2",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"pytest-socket<1.0.0,>=0.7.0",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
test_integration = []
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
]
|
||||
dev = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"types-requests<3,>=2",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = "True"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/fireworks"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-fireworks%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.33"
|
||||
fireworks-ai = ">=0.13.0"
|
||||
openai = "^1.10.0"
|
||||
requests = "^2"
|
||||
aiohttp = "^3.9.1"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "T201"]
|
||||
|
||||
@@ -39,55 +68,3 @@ markers = [
|
||||
"compile: mark placeholder test used to compile integration tests without running them",
|
||||
]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.3.0"
|
||||
freezegun = "^1.2.2"
|
||||
pytest-mock = "^3.10.0"
|
||||
syrupy = "^4.0.2"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
pytest-socket = "^0.7.0"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies]
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
types-requests = "^2"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../../standard-tests"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
1992
libs/partners/fireworks/uv.lock
generated
Normal file
1992
libs/partners/fireworks/uv.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -9,13 +9,13 @@ TEST_FILE ?= tests/unit_tests/
|
||||
integration_test integration_tests: TEST_FILE=tests/integration_tests/
|
||||
|
||||
test tests:
|
||||
poetry run pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
uv run --group test pytest --disable-socket --allow-unix-socket $(TEST_FILE)
|
||||
|
||||
integration_test integration_tests:
|
||||
poetry run pytest $(TEST_FILE)
|
||||
uv run --group test --group test_integration pytest $(TEST_FILE)
|
||||
|
||||
test_watch:
|
||||
poetry run ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
uv run --group test ptw --snapshot-update --now . -- -vv $(TEST_FILE)
|
||||
|
||||
|
||||
######################
|
||||
@@ -32,22 +32,22 @@ lint_tests: PYTHON_FILES=tests
|
||||
lint_tests: MYPY_CACHE=.mypy_cache_test
|
||||
|
||||
lint lint_diff lint_package lint_tests:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && poetry run mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES) --diff
|
||||
[ "$(PYTHON_FILES)" = "" ] || mkdir -p $(MYPY_CACHE) && uv run --all-groups mypy $(PYTHON_FILES) --cache-dir $(MYPY_CACHE)
|
||||
|
||||
format format_diff:
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || poetry run ruff check --select I --fix $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff format $(PYTHON_FILES)
|
||||
[ "$(PYTHON_FILES)" = "" ] || uv run --all-groups ruff check --select I --fix $(PYTHON_FILES)
|
||||
|
||||
spell_check:
|
||||
poetry run codespell --toml pyproject.toml
|
||||
uv run --all-groups codespell --toml pyproject.toml
|
||||
|
||||
spell_fix:
|
||||
poetry run codespell --toml pyproject.toml -w
|
||||
uv run --all-groups codespell --toml pyproject.toml -w
|
||||
|
||||
check_imports: $(shell find langchain_groq -name '*.py')
|
||||
poetry run python ./scripts/check_imports.py $^
|
||||
uv run --all-groups python ./scripts/check_imports.py $^
|
||||
|
||||
######################
|
||||
# HELP
|
||||
|
||||
@@ -36,13 +36,13 @@ To develop the `langchain-groq` package, you'll need to follow these instruction
|
||||
### Install dev dependencies
|
||||
|
||||
```bash
|
||||
poetry install --with test,test_integration,lint,codespell
|
||||
uv sync --group lint --group test
|
||||
```
|
||||
|
||||
### Build the package
|
||||
|
||||
```bash
|
||||
poetry build
|
||||
uv build
|
||||
```
|
||||
|
||||
### Run unit tests
|
||||
|
||||
@@ -1,28 +1,55 @@
|
||||
[build-system]
|
||||
requires = ["poetry-core>=1.0.0"]
|
||||
build-backend = "poetry.core.masonry.api"
|
||||
requires = ["pdm-backend"]
|
||||
build-backend = "pdm.backend"
|
||||
|
||||
[tool.poetry]
|
||||
[project]
|
||||
authors = []
|
||||
license = {text = "MIT"}
|
||||
requires-python = "<4.0,>=3.9"
|
||||
dependencies = [
|
||||
"langchain-core<1.0.0,>=0.3.33",
|
||||
"groq<1,>=0.4.1",
|
||||
]
|
||||
name = "langchain-groq"
|
||||
version = "0.2.4"
|
||||
description = "An integration package connecting Groq and LangChain"
|
||||
authors = []
|
||||
readme = "README.md"
|
||||
|
||||
[project.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/groq"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-groq%3D%3D0%22&expanded=true"
|
||||
repository = "https://github.com/langchain-ai/langchain"
|
||||
license = "MIT"
|
||||
|
||||
[dependency-groups]
|
||||
test = [
|
||||
"pytest<8.0.0,>=7.3.0",
|
||||
"pytest-mock<4.0.0,>=3.10.0",
|
||||
"pytest-watcher<1.0.0,>=0.3.4",
|
||||
"pytest-asyncio<1.0.0,>=0.21.1",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
"langchain-tests @ file:///${PROJECT_ROOT}/../../standard-tests",
|
||||
]
|
||||
codespell = [
|
||||
"codespell<3.0.0,>=2.2.0",
|
||||
]
|
||||
lint = [
|
||||
"ruff<1.0,>=0.5",
|
||||
]
|
||||
dev = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
test_integration = [
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
typing = [
|
||||
"mypy<2.0,>=1.10",
|
||||
"langchain-core @ file:///${PROJECT_ROOT}/../../core",
|
||||
]
|
||||
|
||||
|
||||
[tool.mypy]
|
||||
disallow_untyped_defs = "True"
|
||||
|
||||
[tool.poetry.urls]
|
||||
"Source Code" = "https://github.com/langchain-ai/langchain/tree/master/libs/partners/groq"
|
||||
"Release Notes" = "https://github.com/langchain-ai/langchain/releases?q=tag%3A%22langchain-groq%3D%3D0%22&expanded=true"
|
||||
|
||||
[tool.poetry.dependencies]
|
||||
python = ">=3.9,<4.0"
|
||||
langchain-core = "^0.3.33"
|
||||
groq = ">=0.4.1,<1"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "W"]
|
||||
|
||||
@@ -36,53 +63,3 @@ markers = [
|
||||
"scheduled: mark tests to run in scheduled testing",
|
||||
]
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.poetry.group.test]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.codespell]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.lint]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.dev]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test_integration]
|
||||
optional = true
|
||||
|
||||
[tool.poetry.group.test.dependencies]
|
||||
pytest = "^7.3.0"
|
||||
pytest-mock = "^3.10.0"
|
||||
pytest-watcher = "^0.3.4"
|
||||
pytest-asyncio = "^0.21.1"
|
||||
|
||||
[tool.poetry.group.codespell.dependencies]
|
||||
codespell = "^2.2.0"
|
||||
|
||||
[tool.poetry.group.lint.dependencies]
|
||||
ruff = "^0.5"
|
||||
|
||||
[tool.poetry.group.typing.dependencies]
|
||||
mypy = "^1.10"
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test.dependencies.langchain-tests]
|
||||
path = "../../standard-tests"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.dev.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.test_integration.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
[tool.poetry.group.typing.dependencies.langchain-core]
|
||||
path = "../../core"
|
||||
develop = true
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user