From 465ee911ffc10af67c237712e25733384eeebdbd Mon Sep 17 00:00:00 2001 From: Matt Harris Date: Mon, 1 Dec 2025 11:43:50 -0500 Subject: [PATCH 1/2] Bump to LangChain 1.1, update dependencies, and bump version --- .github/workflows/test.yml | 2 +- CHANGELOG.md | 29 ++++++ poetry.lock | 204 +++++++++++++++---------------------- pyproject.toml | 14 +-- 4 files changed, 121 insertions(+), 128 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 96d8453..86deb29 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - name: Checkout code diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fe5bbfa --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.2.0] - 2025-12-01 + +### Changed + +- **BREAKING**: Minimum Python version raised from 3.9 to 3.10 (aligns with langchain-core 1.x requirements) +- **BREAKING**: Updated `langchain-core` dependency from `^0.3.76` to `>=1.1.0,<2.0.0` for LangChain 1.0 compatibility +- Updated `langchain-tests` from `^0.3.8` to `^1.0.0` +- Updated `httpx` from `^0.27.0` to `>=0.28.1,<1.0.0` (required by langchain-tests 1.x) + +### Notes + +- This release aligns with the official LangChain 1.0 ecosystem +- Dependency constraints now match official integrations like `langchain-openai` and `langchain-anthropic` +- No code changes required - all langchain-core APIs used remain backward compatible + +## [0.1.0] - Initial Release + +### Added + +- `ChatParallelWeb` - Chat model integration for Parallel's Chat API +- `ParallelWebSearchTool` - Search tool with web research capabilities +- `ParallelExtractTool` - Content extraction from web pages diff --git a/poetry.lock b/poetry.lock index 44cf13c..129c934 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.0.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -52,7 +52,6 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -281,7 +280,7 @@ files = [ [package.extras] dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] hard-encoding-detection = ["chardet"] -toml = ["tomli"] +toml = ["tomli ; python_version < \"3.11\""] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] [[package]] @@ -316,7 +315,7 @@ description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "test", "typing"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, @@ -379,14 +378,14 @@ trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.2" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" groups = ["main", "test", "typing"] files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -394,10 +393,9 @@ anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -418,31 +416,6 @@ files = [ [package.extras] all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] -[[package]] -name = "importlib-metadata" -version = "8.7.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.9" -groups = ["test"] -markers = "" -files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, -] - -[package.dependencies] -zipp = ">=3.20" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] - [[package]] name = "iniconfig" version = "2.1.0" @@ -596,14 +569,14 @@ files = [ [[package]] name = "langchain-core" -version = "0.3.79" +version = "1.1.0" description = "Building applications with LLMs through composability" optional = false -python-versions = "<4.0.0,>=3.9.0" +python-versions = "<4.0.0,>=3.10.0" groups = ["main", "test", "typing"] files = [ - {file = "langchain_core-0.3.79-py3-none-any.whl", hash = "sha256:92045bfda3e741f8018e1356f83be203ec601561c6a7becfefe85be5ddc58fdb"}, - {file = "langchain_core-0.3.79.tar.gz", hash = "sha256:024ba54a346dd9b13fb8b2342e0c83d0111e7f26fa01f545ada23ad772b55a60"}, + {file = "langchain_core-1.1.0-py3-none-any.whl", hash = "sha256:2c9f27dadc6d21ed4aa46506a37a56e6a7e2d2f9141922dc5c251ba921822ee6"}, + {file = "langchain_core-1.1.0.tar.gz", hash = "sha256:2b76a82d427922c8bc51c08404af4fc2a29e9f161dfe2297cb05091e810201e7"}, ] [package.dependencies] @@ -611,63 +584,37 @@ jsonpatch = ">=1.33.0,<2.0.0" langsmith = ">=0.3.45,<1.0.0" packaging = ">=23.2.0,<26.0.0" pydantic = ">=2.7.4,<3.0.0" -PyYAML = ">=5.3.0,<7.0.0" +pyyaml = ">=5.3.0,<7.0.0" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0" typing-extensions = ">=4.7.0,<5.0.0" [[package]] name = "langchain-tests" -version = "0.3.19" +version = "1.0.2" description = "Standard tests for LangChain implementations" optional = false -python-versions = "<4.0,>=3.9" +python-versions = "<4.0.0,>=3.10.0" groups = ["test"] -markers = "platform_python_implementation == \"PyPy\" or python_version < \"3.10\"" files = [ - {file = "langchain_tests-0.3.19-py3-none-any.whl", hash = "sha256:f235b74421e9bf71e9453405287204a4e11f20ed3829f9b7eee9ef55df47a50a"}, - {file = "langchain_tests-0.3.19.tar.gz", hash = "sha256:0d835148fdea7a5bcb3e26c7128b110bb4fa9532b070993566d107632a26b3a0"}, + {file = "langchain_tests-1.0.2-py3-none-any.whl", hash = "sha256:713936d9e474ba39eeade95ee8e9d2e237b15a74d4896cae66ef1a9bd0a44d48"}, + {file = "langchain_tests-1.0.2.tar.gz", hash = "sha256:7e96d82499ee32ab141e93bdeb122c942db41ff326bcc87ca27290ede92f0f78"}, ] [package.dependencies] -httpx = ">=0.25.0,<1" -langchain-core = ">=0.3.53,<1.0.0" +httpx = ">=0.28.1,<1.0.0" +langchain-core = ">=1.1.0,<2.0.0" numpy = [ {version = ">=1.26.2", markers = "python_version < \"3.13\""}, {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, ] -pytest = ">=7,<9" -pytest-asyncio = ">=0.20,<1" -pytest-socket = ">=0.6.0,<1" -syrupy = ">=4,<5" - -[[package]] -name = "langchain-tests" -version = "0.3.20" -description = "Standard tests for LangChain implementations" -optional = false -python-versions = ">=3.9" -groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" -files = [ - {file = "langchain_tests-0.3.20-py3-none-any.whl", hash = "sha256:6cc7ae64eb8dea65360a968840abe8d947c5382b95e065431c9dd061ee1dacd8"}, - {file = "langchain_tests-0.3.20.tar.gz", hash = "sha256:b94c05e37d191d4768a1a5064f2ca4053bacd48ff41e10af245ffa6a065ead4d"}, -] - -[package.dependencies] -httpx = ">=0.25.0,<1" -langchain-core = ">=0.3.63,<1.0.0" -numpy = [ - {version = ">=1.26.2", markers = "python_version < \"3.13\""}, - {version = ">=2.1.0", markers = "python_version >= \"3.13\""}, -] -pytest = ">=7,<9" -pytest-asyncio = ">=0.20,<1" +pytest = ">=7.0.0,<9.0.0" +pytest-asyncio = ">=0.20.0,<2.0.0" pytest-benchmark = "*" pytest-codspeed = "*" pytest-recording = "*" -pytest-socket = ">=0.6.0,<1" -syrupy = ">=4,<5" -vcrpy = ">=7.0" +pytest-socket = ">=0.7.0,<1.0.0" +syrupy = ">=4.0.0,<5.0.0" +vcrpy = ">=7.0.0,<8.0.0" [[package]] name = "langsmith" @@ -691,7 +638,7 @@ requests-toolbelt = ">=1.0.0" zstandard = ">=0.23.0" [package.extras] -claude-agent-sdk = ["claude-agent-sdk (>=0.1.0)"] +claude-agent-sdk = ["claude-agent-sdk (>=0.1.0) ; python_version >= \"3.10\""] langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2)"] openai-agents = ["openai-agents (>=0.0.3)"] otel = ["opentelemetry-api (>=1.30.0)", "opentelemetry-exporter-otlp-proto-http (>=1.30.0)", "opentelemetry-sdk (>=1.30.0)"] @@ -705,7 +652,6 @@ description = "Python port of markdown-it. Markdown parsing, done right!" optional = false python-versions = ">=3.8" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, @@ -731,7 +677,6 @@ description = "Markdown URL utilities" optional = false python-versions = ">=3.7" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, @@ -744,7 +689,6 @@ description = "multidict implementation" optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349"}, {file = "multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e"}, @@ -1303,7 +1247,6 @@ description = "Accelerated property cache" optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db"}, {file = "propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8"}, @@ -1436,7 +1379,6 @@ description = "Get CPU info with pure Python" optional = false python-versions = "*" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, @@ -1449,7 +1391,7 @@ description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\" and implementation_name != \"PyPy\"" +markers = "implementation_name != \"PyPy\"" files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, @@ -1475,7 +1417,7 @@ typing-inspection = ">=0.4.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -1614,7 +1556,6 @@ description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -1672,7 +1613,6 @@ description = "A ``pytest`` fixture for benchmarking code. It will group the tes optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "pytest-benchmark-5.0.1.tar.gz", hash = "sha256:8138178618c85586ce056c70cc5e92f4283c2e6198e8422c2c825aeb3ace6afd"}, {file = "pytest_benchmark-5.0.1-py3-none-any.whl", hash = "sha256:d75fec4cbf0d4fd91e020f425ce2d845e9c127c21bae35e77c84db8ed84bfaa6"}, @@ -1694,7 +1634,6 @@ description = "Pytest plugin to create CodSpeed benchmarks" optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "pytest_codspeed-4.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa83a1a0aaeb6bdb9918a18294708eebe765a3b5a855adccf9213629d2a0d302"}, {file = "pytest_codspeed-4.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e6fe213b2589ffe6f2189b3b21ca14717c9346b226e6028d2e2b4d4d7dac750f"}, @@ -1712,7 +1651,6 @@ files = [ [package.dependencies] cffi = ">=1.17.1" -importlib-metadata = {version = ">=8.5.0", markers = "python_version < \"3.10\""} pytest = ">=3.8" rich = ">=13.8.1" @@ -1744,7 +1682,6 @@ description = "A pytest plugin powered by VCR.py to record and replay HTTP traff optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "pytest_recording-0.13.4-py3-none-any.whl", hash = "sha256:ad49a434b51b1c4f78e85b1e6b74fdcc2a0a581ca16e52c798c6ace971f7f439"}, {file = "pytest_recording-0.13.4.tar.gz", hash = "sha256:568d64b2a85992eec4ae0a419c855d5fd96782c5fb016784d86f18053792768c"}, @@ -1931,7 +1868,6 @@ description = "Render rich text, tables, progress bars, syntax highlighting, mar optional = false python-versions = ">=3.8.0" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, @@ -2035,7 +1971,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["test", "typing"] -markers = "python_version < \"3.11\"" +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, @@ -2103,6 +2039,22 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "types-requests" +version = "2.31.0.6" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.7" +groups = ["typing"] +markers = "platform_python_implementation == \"PyPy\"" +files = [ + {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, + {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, +] + +[package.dependencies] +types-urllib3 = "*" + [[package]] name = "types-requests" version = "2.32.4.20250913" @@ -2110,6 +2062,7 @@ description = "Typing stubs for requests" optional = false python-versions = ">=3.9" groups = ["typing"] +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "types_requests-2.32.4.20250913-py3-none-any.whl", hash = "sha256:78c9c1fffebbe0fa487a418e0fa5252017e9c60d1a2da394077f1780f655d7e1"}, {file = "types_requests-2.32.4.20250913.tar.gz", hash = "sha256:abd6d4f9ce3a9383f269775a9835a4c24e5cd6b9f647d64f88aa4613c33def5d"}, @@ -2118,6 +2071,19 @@ files = [ [package.dependencies] urllib3 = ">=2" +[[package]] +name = "types-urllib3" +version = "1.26.25.14" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +groups = ["typing"] +markers = "platform_python_implementation == \"PyPy\"" +files = [ + {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, + {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, +] + [[package]] name = "typing-extensions" version = "4.15.0" @@ -2145,6 +2111,24 @@ files = [ [package.dependencies] typing-extensions = ">=4.12.0" +[[package]] +name = "urllib3" +version = "1.26.20" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main", "test", "typing"] +markers = "platform_python_implementation == \"PyPy\"" +files = [ + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + [[package]] name = "urllib3" version = "2.5.0" @@ -2152,13 +2136,14 @@ description = "HTTP library with thread-safe connection pooling, file post, and optional = false python-versions = ">=3.9" groups = ["main", "test", "typing"] +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] @@ -2170,7 +2155,6 @@ description = "Automatically mock your HTTP interactions to simplify and speed u optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "vcrpy-7.0.0-py2.py3-none-any.whl", hash = "sha256:55791e26c18daa363435054d8b35bd41a4ac441b6676167635d1b37a71dbe124"}, {file = "vcrpy-7.0.0.tar.gz", hash = "sha256:176391ad0425edde1680c5b20738ea3dc7fb942520a48d2993448050986b3a50"}, @@ -2178,7 +2162,10 @@ files = [ [package.dependencies] PyYAML = "*" -urllib3 = {version = "*", markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\""} +urllib3 = [ + {version = "<2", markers = "platform_python_implementation == \"PyPy\""}, + {version = "*", markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\""}, +] wrapt = "*" yarl = "*" @@ -2235,7 +2222,6 @@ description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04"}, {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2"}, @@ -2327,7 +2313,6 @@ description = "Yet another URL library" optional = false python-versions = ">=3.9" groups = ["test"] -markers = "platform_python_implementation != \"PyPy\" and python_version >= \"3.10\"" files = [ {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e"}, {file = "yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f"}, @@ -2466,27 +2451,6 @@ idna = ">=2.0" multidict = ">=4.0" propcache = ">=0.2.1" -[[package]] -name = "zipp" -version = "3.23.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.9" -groups = ["test"] -markers = "" -files = [ - {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, - {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] - [[package]] name = "zstandard" version = "0.25.0" @@ -2597,9 +2561,9 @@ files = [ ] [package.extras] -cffi = ["cffi (>=1.17,<2.0)", "cffi (>=2.0.0b)"] +cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and python_version < \"3.14\"", "cffi (>=2.0.0b) ; platform_python_implementation != \"PyPy\" and python_version >= \"3.14\""] [metadata] lock-version = "2.1" -python-versions = ">=3.9,<4.0" -content-hash = "d1189e86399bb094efffd9686ecd26cc3e9a04eb54e1434d66925b83837cb4dc" +python-versions = ">=3.10,<4.0" +content-hash = "85dcc91af918c74e6c832182b6a6d130a51c6da49bb4c3b586ed4976a6edc72b" diff --git a/pyproject.toml b/pyproject.toml index 8593179..c8d1bb7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "langchain-parallel" -version = "0.1.0" +version = "0.2.0" description = "A LangChain integration for Parallel Web AI services, including Chat and Search." authors = ["Parallel Team "] readme = "README.md" @@ -40,15 +40,15 @@ disable_error_code = ["arg-type"] "Release Notes" = "https://github.com/parallel-web/langchain-parallel/releases" [tool.poetry.dependencies] -python = ">=3.9,<4.0" -langchain-core = "^0.3.76" +python = ">=3.10,<4.0" +langchain-core = ">=1.1.0,<2.0.0" openai = "^1.88.0" pydantic = "^2.11.7" -httpx = "^0.27.0" +httpx = ">=0.28.1,<1.0.0" parallel-web = "^0.3.3" [tool.ruff] -target-version = "py39" +target-version = "py310" [tool.ruff.lint] select = [ @@ -158,7 +158,7 @@ pytest = "^7.4.3" pytest-asyncio = "^0.23.2" pytest-socket = "^0.7.0" pytest-watcher = "^0.3.4" -langchain-tests = "^0.3.8" +langchain-tests = "^1.0.0" pytest-mock = "^3.14.1" freezegun = "^1.2.2" syrupy = "^4.0.2" @@ -174,4 +174,4 @@ ruff = "<0.13,>=0.12.2" [tool.poetry.group.typing.dependencies] mypy = "^1.10" types-requests = "^2.31.0" -langchain-core = "^0.3.76" +langchain-core = ">=1.1.0,<2.0.0" From 82e7f470ffc30f8b91fdddf8c148b7418511fac3 Mon Sep 17 00:00:00 2001 From: Matt Harris Date: Mon, 1 Dec 2025 12:06:03 -0500 Subject: [PATCH 2/2] increase test timeout and update github action --- .github/workflows/test.yml | 15 +++++++++------ tests/integration_tests/test_extract_tool.py | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 86deb29..ebe5328 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,16 +14,19 @@ jobs: - name: Check if user can run tests id: check run: | - # Check if PR author is owner, member, or collaborator - if [[ "${{ github.event.pull_request.author_association }}" == "OWNER" ]] || \ - [[ "${{ github.event.pull_request.author_association }}" == "MEMBER" ]] || \ - [[ "${{ github.event.pull_request.author_association }}" == "COLLABORATOR" ]]; then + ASSOCIATION="${{ github.event.pull_request.author_association }}" + echo "PR author association: $ASSOCIATION" + + # Check if PR author is owner, member, collaborator, or contributor + if [[ "$ASSOCIATION" == "OWNER" ]] || \ + [[ "$ASSOCIATION" == "MEMBER" ]] || \ + [[ "$ASSOCIATION" == "COLLABORATOR" ]] || \ + [[ "$ASSOCIATION" == "CONTRIBUTOR" ]]; then echo "can-run=true" >> $GITHUB_OUTPUT echo "✅ User has permission to run tests" else echo "can-run=false" >> $GITHUB_OUTPUT - echo "❌ User does not have permission to run tests" - echo "Only repository owners, members, and collaborators can run tests" + echo "❌ User does not have permission to run tests (association: $ASSOCIATION)" fi test: diff --git a/tests/integration_tests/test_extract_tool.py b/tests/integration_tests/test_extract_tool.py index 46ce063..6ff626b 100644 --- a/tests/integration_tests/test_extract_tool.py +++ b/tests/integration_tests/test_extract_tool.py @@ -140,7 +140,7 @@ def test_extract_invalid_url(self, api_key: str) -> None: { "urls": ["https://this-domain-does-not-exist-12345.com/"], "full_content": True, - "timeout": 10.0, # Reasonable timeout + "timeout": 30.0, # Reasonable timeout } )