diff --git a/.fern/metadata.json b/.fern/metadata.json index ef027d7..2528e48 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -12,6 +12,6 @@ "enum_type": "forward_compatible_python_enums" } }, - "originGitCommit": "a5c1143a7b724689db7c5e4cee897834882c9d69", - "sdkVersion": "1.17.0" + "originGitCommit": "204f01f5a6e9ad6585d71b0ad6315aef1be1f537", + "sdkVersion": "1.18.0" } \ No newline at end of file diff --git a/.fern/replay.lock b/.fern/replay.lock index 21cd52b..8879322 100644 --- a/.fern/replay.lock +++ b/.fern/replay.lock @@ -18,7 +18,13 @@ generations: cli_version: unknown generator_versions: fernapi/fern-python-sdk: 4.53.0 -current_generation: ba094f1571e793f1e79af26fd47c40a070550444 + - commit_sha: 6170a0f48113ba39d0229c8dedd7f8de78974aa6 + tree_hash: 7edb792253e202380d24741ffa382e8d7aa24d2a + timestamp: 2026-08-10T18:28:38.845Z + cli_version: unknown + generator_versions: + fernapi/fern-python-sdk: 4.53.0 +current_generation: 6170a0f48113ba39d0229c8dedd7f8de78974aa6 patches: - id: patch-29b579f8 content_hash: sha256:19cd61f1a6dd83c32c2b84be87c4195e51f4c531a09b504a5a4ec17b1de9b4a9 @@ -143,7 +149,7 @@ patches: [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" - status: resolving + status: unresolved - id: patch-4df4e73b content_hash: sha256:5ae6cf843c83300578dbbe88ac7e88028f95221b2174366370482ab9a604ad28 original_commit: 4df4e73b49b9e59112fafc32c047ddff9d18881f @@ -296,4 +302,909 @@ patches: token = await self._async_token() headers["Authorization"] = f"Bearer {token}" return headers - status: resolving + status: unresolved + - id: patch-a54c56a1 + content_hash: sha256:1c9c7c4a0e7eb914d7abc60441e7ecec5e23612a63bd8ffb64eee823f2234de1 + original_commit: a54c56a1e4350c02b437fd7209862de0014fd1b0 + original_message: Harden pydantic schema conversion against late/silent failures + original_author: jordan-extend + base_generation: 6170a0f48113ba39d0229c8dedd7f8de78974aa6 + files: + - poetry.lock + - pyproject.toml + patch_content: | + diff --git a/poetry.lock b/poetry.lock + index 9d0c35a..a432a22 100644 + --- a/poetry.lock + +++ b/poetry.lock + @@ -1,4 +1,4 @@ + -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. + +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + + [[package]] + name = "annotated-types" + @@ -596,4 +596,4 @@ files = [ + [metadata] + lock-version = "2.0" + python-versions = "^3.8" + -content-hash = "bcf31a142c86d9e556553c8c260a93b563ac64a043076dbd48b26111d422c26e" + +content-hash = "f1e2ab5eda730c574ef9098656ce135835405a944b8ad9dcd4c65ef061581e5f" + diff --git a/pyproject.toml b/pyproject.toml + index 0631640..8cc3bd1 100644 + --- a/pyproject.toml + +++ b/pyproject.toml + @@ -5,10 +5,19 @@ dynamic = ["version"] + [tool.poetry] + name = "extend_ai" + version = "1.18.0" + -description = "" + +description = "Official Python SDK for Extend (extend.ai) — the document processing API. Parse, extract, classify, split, and edit PDFs and 35+ file types" + readme = "README.md" + authors = [] + -keywords = [] + +keywords = [ + + "extend", + + "document processing", + + "ocr", + + "pdf parsing", + + "data extraction", + + "document ai", + + "idp", + + "extend.ai", + +] + license = "MIT" + classifiers = [ + "Intended Audience :: Developers", + @@ -40,7 +49,8 @@ python = "^3.8" + httpx = ">=0.21.2" + pydantic = ">= 1.9.2" + pydantic-core = ">=2.18.2" + -typing_extensions = ">= 4.0.0" + +# Generic TypedDicts (used by the typed extraction wrappers) require >= 4.3.0 + +typing_extensions = ">= 4.3.0" + + [tool.poetry.group.dev.dependencies] + mypy = "==1.13.0" + theirs_snapshot: + poetry.lock: | + # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + + [[package]] + name = "annotated-types" + version = "0.7.0" + description = "Reusable constraint types to use with typing.Annotated" + optional = false + python-versions = ">=3.8" + files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, + ] + + [package.dependencies] + typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} + + [[package]] + name = "anyio" + version = "4.5.2" + description = "High level compatibility layer for multiple asynchronous event loop implementations" + optional = false + python-versions = ">=3.8" + files = [ + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, + ] + + [package.dependencies] + exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} + idna = ">=2.8" + sniffio = ">=1.1" + typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + + [package.extras] + doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] + test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] + trio = ["trio (>=0.26.1)"] + + [[package]] + name = "certifi" + version = "2026.7.22" + description = "Python package for providing Mozilla's CA Bundle." + optional = false + python-versions = ">=3.7" + files = [ + {file = "certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775"}, + {file = "certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55"}, + ] + + [[package]] + name = "colorama" + version = "0.4.6" + description = "Cross-platform colored terminal text." + optional = false + python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, + ] + + [[package]] + name = "exceptiongroup" + version = "1.3.1" + description = "Backport of PEP 654 (exception groups)" + optional = false + python-versions = ">=3.7" + files = [ + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, + ] + + [package.dependencies] + typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + + [package.extras] + test = ["pytest (>=6)"] + + [[package]] + name = "execnet" + version = "2.1.2" + description = "execnet: rapid multi-Python deployment" + optional = false + python-versions = ">=3.8" + files = [ + {file = "execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec"}, + {file = "execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd"}, + ] + + [package.extras] + testing = ["hatch", "pre-commit", "pytest", "tox"] + + [[package]] + name = "h11" + version = "0.16.0" + description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" + optional = false + python-versions = ">=3.8" + files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, + ] + + [[package]] + name = "httpcore" + version = "1.0.9" + description = "A minimal low-level HTTP client." + optional = false + python-versions = ">=3.8" + files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, + ] + + [package.dependencies] + certifi = "*" + h11 = ">=0.16" + + [package.extras] + asyncio = ["anyio (>=4.0,<5.0)"] + http2 = ["h2 (>=3,<5)"] + socks = ["socksio (==1.*)"] + trio = ["trio (>=0.22.0,<1.0)"] + + [[package]] + name = "httpx" + version = "0.28.1" + description = "The next generation HTTP client." + optional = false + python-versions = ">=3.8" + files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, + ] + + [package.dependencies] + anyio = "*" + certifi = "*" + httpcore = "==1.*" + idna = "*" + + [package.extras] + brotli = ["brotli", "brotlicffi"] + cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] + http2 = ["h2 (>=3,<5)"] + socks = ["socksio (==1.*)"] + zstd = ["zstandard (>=0.18.0)"] + + [[package]] + name = "idna" + version = "3.15" + description = "Internationalized Domain Names in Applications (IDNA)" + optional = false + python-versions = ">=3.8" + files = [ + {file = "idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8"}, + {file = "idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc"}, + ] + + [package.extras] + all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + + [[package]] + name = "iniconfig" + version = "2.1.0" + description = "brain-dead simple config-ini parsing" + optional = false + python-versions = ">=3.8" + files = [ + {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, + {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, + ] + + [[package]] + name = "mypy" + version = "1.13.0" + description = "Optional static typing for Python" + optional = false + python-versions = ">=3.8" + files = [ + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + ] + + [package.dependencies] + mypy-extensions = ">=1.0.0" + tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + typing-extensions = ">=4.6.0" + + [package.extras] + dmypy = ["psutil (>=4.0)"] + faster-cache = ["orjson"] + install-types = ["pip"] + mypyc = ["setuptools (>=50)"] + reports = ["lxml"] + + [[package]] + name = "mypy-extensions" + version = "1.1.0" + description = "Type system extensions for programs checked with the mypy type checker." + optional = false + python-versions = ">=3.8" + files = [ + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, + ] + + [[package]] + name = "packaging" + version = "26.2" + description = "Core utilities for Python packages" + optional = false + python-versions = ">=3.8" + files = [ + {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, + {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, + ] + + [[package]] + name = "pluggy" + version = "1.5.0" + description = "plugin and hook calling mechanisms for python" + optional = false + python-versions = ">=3.8" + files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + ] + + [package.extras] + dev = ["pre-commit", "tox"] + testing = ["pytest", "pytest-benchmark"] + + [[package]] + name = "pydantic" + version = "2.10.6" + description = "Data validation using Python type hints" + optional = false + python-versions = ">=3.8" + files = [ + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, + ] + + [package.dependencies] + annotated-types = ">=0.6.0" + pydantic-core = "2.27.2" + typing-extensions = ">=4.12.2" + + [package.extras] + email = ["email-validator (>=2.0.0)"] + timezone = ["tzdata"] + + [[package]] + name = "pydantic-core" + version = "2.27.2" + description = "Core functionality for Pydantic validation and serialization" + optional = false + python-versions = ">=3.8" + files = [ + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, + ] + + [package.dependencies] + typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + + [[package]] + name = "pytest" + version = "7.4.4" + description = "pytest: simple powerful testing with Python" + optional = false + python-versions = ">=3.7" + files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + ] + + [package.dependencies] + colorama = {version = "*", markers = "sys_platform == \"win32\""} + exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} + iniconfig = "*" + packaging = "*" + pluggy = ">=0.12,<2.0" + tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + + [package.extras] + testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + + [[package]] + name = "pytest-asyncio" + version = "0.23.8" + description = "Pytest support for asyncio" + optional = false + python-versions = ">=3.8" + files = [ + {file = "pytest_asyncio-0.23.8-py3-none-any.whl", hash = "sha256:50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2"}, + {file = "pytest_asyncio-0.23.8.tar.gz", hash = "sha256:759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3"}, + ] + + [package.dependencies] + pytest = ">=7.0.0,<9" + + [package.extras] + docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] + testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] + + [[package]] + name = "pytest-xdist" + version = "3.6.1" + description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" + optional = false + python-versions = ">=3.8" + files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, + ] + + [package.dependencies] + execnet = ">=2.1" + pytest = ">=7.0.0" + + [package.extras] + psutil = ["psutil (>=3.0)"] + setproctitle = ["setproctitle"] + testing = ["filelock"] + + [[package]] + name = "python-dateutil" + version = "2.9.0.post0" + description = "Extensions to the standard Python datetime module" + optional = false + python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, + ] + + [package.dependencies] + six = ">=1.5" + + [[package]] + name = "ruff" + version = "0.11.5" + description = "An extremely fast Python linter and code formatter, written in Rust." + optional = false + python-versions = ">=3.7" + files = [ + {file = "ruff-0.11.5-py3-none-linux_armv6l.whl", hash = "sha256:2561294e108eb648e50f210671cc56aee590fb6167b594144401532138c66c7b"}, + {file = "ruff-0.11.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac12884b9e005c12d0bd121f56ccf8033e1614f736f766c118ad60780882a077"}, + {file = "ruff-0.11.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4bfd80a6ec559a5eeb96c33f832418bf0fb96752de0539905cf7b0cc1d31d779"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0947c0a1afa75dcb5db4b34b070ec2bccee869d40e6cc8ab25aca11a7d527794"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ad871ff74b5ec9caa66cb725b85d4ef89b53f8170f47c3406e32ef040400b038"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6cf918390cfe46d240732d4d72fa6e18e528ca1f60e318a10835cf2fa3dc19f"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56145ee1478582f61c08f21076dc59153310d606ad663acc00ea3ab5b2125f82"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5f66f8f1e8c9fc594cbd66fbc5f246a8d91f916cb9667e80208663ec3728304"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80b4df4d335a80315ab9afc81ed1cff62be112bd165e162b5eed8ac55bfc8470"}, + {file = "ruff-0.11.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3068befab73620b8a0cc2431bd46b3cd619bc17d6f7695a3e1bb166b652c382a"}, + {file = "ruff-0.11.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5da2e710a9641828e09aa98b92c9ebbc60518fdf3921241326ca3e8f8e55b8b"}, + {file = "ruff-0.11.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ef39f19cb8ec98cbc762344921e216f3857a06c47412030374fffd413fb8fd3a"}, + {file = "ruff-0.11.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:b2a7cedf47244f431fd11aa5a7e2806dda2e0c365873bda7834e8f7d785ae159"}, + {file = "ruff-0.11.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:81be52e7519f3d1a0beadcf8e974715b2dfc808ae8ec729ecfc79bddf8dbb783"}, + {file = "ruff-0.11.5-py3-none-win32.whl", hash = "sha256:e268da7b40f56e3eca571508a7e567e794f9bfcc0f412c4b607931d3af9c4afe"}, + {file = "ruff-0.11.5-py3-none-win_amd64.whl", hash = "sha256:6c6dc38af3cfe2863213ea25b6dc616d679205732dc0fb673356c2d69608f800"}, + {file = "ruff-0.11.5-py3-none-win_arm64.whl", hash = "sha256:67e241b4314f4eacf14a601d586026a962f4002a475aa702c69980a38087aa4e"}, + {file = "ruff-0.11.5.tar.gz", hash = "sha256:cae2e2439cb88853e421901ec040a758960b576126dab520fa08e9de431d1bef"}, + ] + + [[package]] + name = "six" + version = "1.17.0" + description = "Python 2 and 3 compatibility utilities" + optional = false + python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, + ] + + [[package]] + name = "sniffio" + version = "1.3.1" + description = "Sniff out which async library your code is running under" + optional = false + python-versions = ">=3.7" + files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, + ] + + [[package]] + name = "tomli" + version = "2.4.1" + description = "A lil' TOML parser" + optional = false + python-versions = ">=3.8" + files = [ + {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, + {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076"}, + {file = "tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c"}, + {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc"}, + {file = "tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"}, + {file = "tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e"}, + {file = "tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a"}, + {file = "tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9"}, + {file = "tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585"}, + {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1"}, + {file = "tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917"}, + {file = "tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9"}, + {file = "tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54"}, + {file = "tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897"}, + {file = "tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d"}, + {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5"}, + {file = "tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd"}, + {file = "tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36"}, + {file = "tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf"}, + {file = "tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662"}, + {file = "tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15"}, + {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba"}, + {file = "tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6"}, + {file = "tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7"}, + {file = "tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4"}, + {file = "tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d"}, + {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c"}, + {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f"}, + {file = "tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8"}, + {file = "tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26"}, + {file = "tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396"}, + {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, + {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, + ] + + [[package]] + name = "types-python-dateutil" + version = "2.9.0.20241206" + description = "Typing stubs for python-dateutil" + optional = false + python-versions = ">=3.8" + files = [ + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, + ] + + [[package]] + name = "typing-extensions" + version = "4.13.2" + description = "Backported and Experimental Type Hints for Python 3.8+" + optional = false + python-versions = ">=3.8" + files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, + ] + + [metadata] + lock-version = "2.0" + python-versions = "^3.8" + content-hash = "f1e2ab5eda730c574ef9098656ce135835405a944b8ad9dcd4c65ef061581e5f" + pyproject.toml: | + [project] + name = "extend_ai" + dynamic = ["version"] + + [tool.poetry] + name = "extend_ai" + version = "1.18.0" + description = "Official Python SDK for Extend (extend.ai) — the document processing API. Parse, extract, classify, split, and edit PDFs and 35+ file types" + readme = "README.md" + authors = [] + keywords = [ + "extend", + "document processing", + "ocr", + "pdf parsing", + "data extraction", + "document ai", + "idp", + "extend.ai", + ] + license = "MIT" + classifiers = [ + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: OS Independent", + "Operating System :: POSIX", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", + "Operating System :: Microsoft :: Windows", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", + "License :: OSI Approved :: MIT License" + ] + packages = [ + { include = "extend_ai", from = "src"} + ] + + [tool.poetry.urls] + Repository = 'https://github.com/extend-hq/extend-python-sdk' + + [tool.poetry.dependencies] + python = "^3.8" + httpx = ">=0.21.2" + pydantic = ">= 1.9.2" + pydantic-core = ">=2.18.2" + # Generic TypedDicts (used by the typed extraction wrappers) require >= 4.3.0 + typing_extensions = ">= 4.3.0" + + [tool.poetry.group.dev.dependencies] + mypy = "==1.13.0" + pytest = "^7.4.0" + pytest-asyncio = "^0.23.5" + pytest-xdist = "^3.6.1" + python-dateutil = "^2.9.0" + types-python-dateutil = "^2.9.0.20240316" + ruff = "==0.11.5" + + [tool.pytest.ini_options] + testpaths = [ "tests" ] + asyncio_mode = "auto" + + [tool.mypy] + plugins = ["pydantic.mypy"] + + [tool.ruff] + line-length = 120 + + [tool.ruff.lint] + select = [ + "E", # pycodestyle errors + "F", # pyflakes + "I", # isort + ] + ignore = [ + "E402", # Module level import not at top of file + "E501", # Line too long + "E711", # Comparison to `None` should be `cond is not None` + "E712", # Avoid equality comparisons to `True`; use `if ...:` checks + "E721", # Use `is` and `is not` for type comparisons, or `isinstance()` for insinstance checks + "E722", # Do not use bare `except` + "E731", # Do not assign a `lambda` expression, use a `def` + "F821", # Undefined name + "F841" # Local variable ... is assigned to but never used + ] + + [tool.ruff.lint.isort] + section-order = ["future", "standard-library", "third-party", "first-party"] + + [build-system] + requires = ["poetry-core"] + build-backend = "poetry.core.masonry.api" + - id: patch-bcfb09b4 + content_hash: sha256:211eb74e58c97a63f60fd1e12694b529cdbcf4768650a57bb1c668b82e7acdae + original_commit: bcfb09b47f74645267a4e20c1a87920233a3fa85 + original_message: Add PyPI package description and keywords for discoverability. + original_author: jordan-extend + base_generation: 6170a0f48113ba39d0229c8dedd7f8de78974aa6 + files: + - pyproject.toml + patch_content: | + diff --git a/pyproject.toml b/pyproject.toml + index 0631640..8cc3bd1 100644 + --- a/pyproject.toml + +++ b/pyproject.toml + @@ -5,10 +5,19 @@ dynamic = ["version"] + [tool.poetry] + name = "extend_ai" + version = "1.18.0" + -description = "" + +description = "Official Python SDK for Extend (extend.ai) — the document processing API. Parse, extract, classify, split, and edit PDFs and 35+ file types" + readme = "README.md" + authors = [] + -keywords = [] + +keywords = [ + + "extend", + + "document processing", + + "ocr", + + "pdf parsing", + + "data extraction", + + "document ai", + + "idp", + + "extend.ai", + +] + license = "MIT" + classifiers = [ + "Intended Audience :: Developers", + @@ -40,7 +49,8 @@ python = "^3.8" + httpx = ">=0.21.2" + pydantic = ">= 1.9.2" + pydantic-core = ">=2.18.2" + -typing_extensions = ">= 4.0.0" + +# Generic TypedDicts (used by the typed extraction wrappers) require >= 4.3.0 + +typing_extensions = ">= 4.3.0" + + [tool.poetry.group.dev.dependencies] + mypy = "==1.13.0" + theirs_snapshot: + pyproject.toml: | + [project] + name = "extend_ai" + dynamic = ["version"] + + [tool.poetry] + name = "extend_ai" + version = "1.18.0" + description = "Official Python SDK for Extend (extend.ai) — the document processing API. Parse, extract, classify, split, and edit PDFs and 35+ file types" + readme = "README.md" + authors = [] + keywords = [ + "extend", + "document processing", + "ocr", + "pdf parsing", + "data extraction", + "document ai", + "idp", + "extend.ai", + ] + license = "MIT" + classifiers = [ + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: OS Independent", + "Operating System :: POSIX", + "Operating System :: MacOS", + "Operating System :: POSIX :: Linux", + "Operating System :: Microsoft :: Windows", + "Topic :: Software Development :: Libraries :: Python Modules", + "Typing :: Typed", + "License :: OSI Approved :: MIT License" + ] + packages = [ + { include = "extend_ai", from = "src"} + ] + + [tool.poetry.urls] + Repository = 'https://github.com/extend-hq/extend-python-sdk' + + [tool.poetry.dependencies] + python = "^3.8" + httpx = ">=0.21.2" + pydantic = ">= 1.9.2" + pydantic-core = ">=2.18.2" + # Generic TypedDicts (used by the typed extraction wrappers) require >= 4.3.0 + typing_extensions = ">= 4.3.0" + + [tool.poetry.group.dev.dependencies] + mypy = "==1.13.0" + pytest = "^7.4.0" + pytest-asyncio = "^0.23.5" + pytest-xdist = "^3.6.1" + python-dateutil = "^2.9.0" + types-python-dateutil = "^2.9.0.20240316" + ruff = "==0.11.5" + + [tool.pytest.ini_options] + testpaths = [ "tests" ] + asyncio_mode = "auto" + + [tool.mypy] + plugins = ["pydantic.mypy"] + + [tool.ruff] + line-length = 120 + + [tool.ruff.lint] + select = [ + "E", # pycodestyle errors + "F", # pyflakes + "I", # isort + ] + ignore = [ + "E402", # Module level import not at top of file + "E501", # Line too long + "E711", # Comparison to `None` should be `cond is not None` + "E712", # Avoid equality comparisons to `True`; use `if ...:` checks + "E721", # Use `is` and `is not` for type comparisons, or `isinstance()` for insinstance checks + "E722", # Do not use bare `except` + "E731", # Do not assign a `lambda` expression, use a `def` + "F821", # Undefined name + "F841" # Local variable ... is assigned to but never used + ] + + [tool.ruff.lint.isort] + section-order = ["future", "standard-library", "third-party", "first-party"] + + [build-system] + requires = ["poetry-core"] + build-backend = "poetry.core.masonry.api" diff --git a/pyproject.toml b/pyproject.toml index ed4027b..8cc3bd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "extend_ai" -version = "1.17.0" +version = "1.18.0" description = "Official Python SDK for Extend (extend.ai) — the document processing API. Parse, extract, classify, split, and edit PDFs and 35+ file types" readme = "README.md" authors = [] diff --git a/reference.md b/reference.md index 0df7437..b837098 100644 --- a/reference.md +++ b/reference.md @@ -7150,7 +7150,7 @@ Example: `"invoice"` Run a workflow. A workflow is a sequence of steps that process files and data in a specific order to achieve a desired outcome. -Pass `file` for a single document, or `package` to process 2-50 files together as one package in a single run. Exactly one of `file` or `package` must be provided. +Pass `file` for a single document use case (more common), or `package` to process 2-50 files together as one package in a single run where context across files is used together to determine final output. Exactly one of `file` or `package` must be provided. The request returns immediately with a `PROCESSING` status. Use webhooks or poll the Get Workflow Run endpoint for results. diff --git a/src/extend_ai/__init__.py b/src/extend_ai/__init__.py index 71ae875..a92b776 100644 --- a/src/extend_ai/__init__.py +++ b/src/extend_ai/__init__.py @@ -276,6 +276,8 @@ ParseRunFailedWebhookEvent, ParseRunMetrics, ParseRunOutput, + ParseRunOutputMetadata, + ParseRunOutputMetadataPagesItem, ParseRunOutputOcr, ParseRunOutputOcrWordsItem, ParseRunProcessedWebhookEvent, @@ -767,6 +769,8 @@ ParseResultParams, ParseRunFailedWebhookEventParams, ParseRunMetricsParams, + ParseRunOutputMetadataPagesItemParams, + ParseRunOutputMetadataParams, ParseRunOutputOcrParams, ParseRunOutputOcrWordsItemParams, ParseRunOutputParams, @@ -1440,6 +1444,10 @@ "ParseRunMetrics": ".types", "ParseRunMetricsParams": ".requests", "ParseRunOutput": ".types", + "ParseRunOutputMetadata": ".types", + "ParseRunOutputMetadataPagesItem": ".types", + "ParseRunOutputMetadataPagesItemParams": ".requests", + "ParseRunOutputMetadataParams": ".requests", "ParseRunOutputOcr": ".types", "ParseRunOutputOcrParams": ".requests", "ParseRunOutputOcrWordsItem": ".types", @@ -2335,6 +2343,10 @@ def __dir__(): "ParseRunMetrics", "ParseRunMetricsParams", "ParseRunOutput", + "ParseRunOutputMetadata", + "ParseRunOutputMetadataPagesItem", + "ParseRunOutputMetadataPagesItemParams", + "ParseRunOutputMetadataParams", "ParseRunOutputOcr", "ParseRunOutputOcrParams", "ParseRunOutputOcrWordsItem", diff --git a/src/extend_ai/core/client_wrapper.py b/src/extend_ai/core/client_wrapper.py index a6f1950..40a774b 100644 --- a/src/extend_ai/core/client_wrapper.py +++ b/src/extend_ai/core/client_wrapper.py @@ -26,12 +26,12 @@ def get_headers(self) -> typing.Dict[str, str]: import platform headers: typing.Dict[str, str] = { - "User-Agent": "extend_ai/1.17.0", + "User-Agent": "extend_ai/1.18.0", "X-Fern-Language": "Python", "X-Fern-Runtime": f"python/{platform.python_version()}", "X-Fern-Platform": f"{platform.system().lower()}/{platform.release()}", "X-Fern-SDK-Name": "extend_ai", - "X-Fern-SDK-Version": "1.17.0", + "X-Fern-SDK-Version": "1.18.0", **(self.get_custom_headers() or {}), } headers["Authorization"] = f"Bearer {self._get_token()}" diff --git a/src/extend_ai/requests/__init__.py b/src/extend_ai/requests/__init__.py index f97b45d..3cc861e 100644 --- a/src/extend_ai/requests/__init__.py +++ b/src/extend_ai/requests/__init__.py @@ -296,6 +296,8 @@ from .parse_run_failed_webhook_event import ParseRunFailedWebhookEventParams from .parse_run_metrics import ParseRunMetricsParams from .parse_run_output import ParseRunOutputParams + from .parse_run_output_metadata import ParseRunOutputMetadataParams + from .parse_run_output_metadata_pages_item import ParseRunOutputMetadataPagesItemParams from .parse_run_output_ocr import ParseRunOutputOcrParams from .parse_run_output_ocr_words_item import ParseRunOutputOcrWordsItemParams from .parse_run_processed_webhook_event import ParseRunProcessedWebhookEventParams @@ -724,6 +726,8 @@ "ParseResultParams": ".parse_result", "ParseRunFailedWebhookEventParams": ".parse_run_failed_webhook_event", "ParseRunMetricsParams": ".parse_run_metrics", + "ParseRunOutputMetadataPagesItemParams": ".parse_run_output_metadata_pages_item", + "ParseRunOutputMetadataParams": ".parse_run_output_metadata", "ParseRunOutputOcrParams": ".parse_run_output_ocr", "ParseRunOutputOcrWordsItemParams": ".parse_run_output_ocr_words_item", "ParseRunOutputParams": ".parse_run_output", @@ -1172,6 +1176,8 @@ def __dir__(): "ParseResultParams", "ParseRunFailedWebhookEventParams", "ParseRunMetricsParams", + "ParseRunOutputMetadataPagesItemParams", + "ParseRunOutputMetadataParams", "ParseRunOutputOcrParams", "ParseRunOutputOcrWordsItemParams", "ParseRunOutputParams", diff --git a/src/extend_ai/requests/data_retention.py b/src/extend_ai/requests/data_retention.py index 4579396..7f35e42 100644 --- a/src/extend_ai/requests/data_retention.py +++ b/src/extend_ai/requests/data_retention.py @@ -8,7 +8,7 @@ class DataRetentionParams(typing_extensions.TypedDict): """ Controls data retention for this run. When omitted or set to `workspace_default`, Extend uses your workspace's configured retention policy. Set `mode` to `zero` to request zero data retention for the run, which deletes supported run data after processing instead of retaining it under the workspace policy. - Zero data retention is only available for eligible organizations and plans. If your organization is not eligible, the request will fail with a 400 error. + Zero data retention is available to all customers on paid plans upon request. If you're on a free plan, the request will fail with a 400 error. If you'd like to request ZDR to be enabled, please reach out to support@extend.ai. """ mode: typing_extensions.NotRequired[DataRetentionMode] diff --git a/src/extend_ai/requests/parse_run_output.py b/src/extend_ai/requests/parse_run_output.py index 1b66a6a..f98ebb7 100644 --- a/src/extend_ai/requests/parse_run_output.py +++ b/src/extend_ai/requests/parse_run_output.py @@ -4,6 +4,7 @@ import typing_extensions from .chunk import ChunkParams +from .parse_run_output_metadata import ParseRunOutputMetadataParams from .parse_run_output_ocr import ParseRunOutputOcrParams @@ -23,3 +24,8 @@ class ParseRunOutputParams(typing_extensions.TypedDict): """ Raw OCR data from the parsing process. Only included when `returnOcr` is configured in the parse config's advanced options. """ + + metadata: typing_extensions.NotRequired[typing.Optional[ParseRunOutputMetadataParams]] + """ + Rotation, dimension, and file-type metadata about the parse output. `null` for parse runs that completed before this field was introduced. + """ diff --git a/src/extend_ai/requests/parse_run_output_metadata.py b/src/extend_ai/requests/parse_run_output_metadata.py new file mode 100644 index 0000000..67148cc --- /dev/null +++ b/src/extend_ai/requests/parse_run_output_metadata.py @@ -0,0 +1,32 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..core.serialization import FieldMetadata +from .parse_run_output_metadata_pages_item import ParseRunOutputMetadataPagesItemParams + + +class ParseRunOutputMetadataParams(typing_extensions.TypedDict): + """ + Rotation, dimension, and file-type metadata about the parse output. `null` for parse runs that completed before this field was introduced. + """ + + original_mime_type: typing_extensions.NotRequired[ + typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="originalMimeType")] + ] + """ + The file's media type before any format conversion. + """ + + final_mime_type: typing_extensions.NotRequired[ + typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="finalMimeType")] + ] + """ + The file's media type after any format conversion. + """ + + pages: typing_extensions.NotRequired[typing.Optional[typing.Sequence[ParseRunOutputMetadataPagesItemParams]]] + """ + Per-page rotation and original-dimension info. Set when file is a PDF or was converted to PDF. + """ diff --git a/src/extend_ai/requests/parse_run_output_metadata_pages_item.py b/src/extend_ai/requests/parse_run_output_metadata_pages_item.py new file mode 100644 index 0000000..c364cd9 --- /dev/null +++ b/src/extend_ai/requests/parse_run_output_metadata_pages_item.py @@ -0,0 +1,33 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import typing_extensions +from ..core.serialization import FieldMetadata + + +class ParseRunOutputMetadataPagesItemParams(typing_extensions.TypedDict): + number: int + """ + The page number this entry describes. + """ + + rotation_applied: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="rotationApplied")] + """ + Degrees Extend rotated the page clockwise to make it upright. `0` if rotation detection ran and the page was already upright; `null` if rotation detection was disabled for this run. + """ + + original_page_width: typing_extensions.Annotated[float, FieldMetadata(alias="originalPageWidth")] + """ + The file's true page width, independent of rendering resolution. + """ + + original_page_height: typing_extensions.Annotated[float, FieldMetadata(alias="originalPageHeight")] + """ + The file's true page height, independent of rendering resolution. + """ + + dpi: float + """ + The DPI that `boundingBox`/`polygon` coordinates on this page are scaled to. Multiply `originalPageWidth`/`originalPageHeight` by `dpi / 72` to convert them into that same coordinate space. + """ diff --git a/src/extend_ai/requests/parse_run_output_ocr_words_item.py b/src/extend_ai/requests/parse_run_output_ocr_words_item.py index c5d006f..fc7e569 100644 --- a/src/extend_ai/requests/parse_run_output_ocr_words_item.py +++ b/src/extend_ai/requests/parse_run_output_ocr_words_item.py @@ -25,3 +25,8 @@ class ParseRunOutputOcrWordsItemParams(typing_extensions.TypedDict): """ The page number where the word was detected. """ + + block_id: typing_extensions.NotRequired[typing_extensions.Annotated[str, FieldMetadata(alias="blockId")]] + """ + The `id` of the block (see the `Block` schema) this word was assigned to, based on bounding-box overlap. Omitted when the word doesn't fall within any block's bounding box. + """ diff --git a/src/extend_ai/requests/workflow_run_package.py b/src/extend_ai/requests/workflow_run_package.py index 30ec016..eedbaaa 100644 --- a/src/extend_ai/requests/workflow_run_package.py +++ b/src/extend_ai/requests/workflow_run_package.py @@ -15,7 +15,7 @@ class WorkflowRunPackageParams(typing_extensions.TypedDict): files: typing.Sequence[WorkflowRunPackageFilesItemParams] """ - The files to process, in submission order. Each entry can be a URL or an existing Extend file ID. Raw text and base64 inputs are not supported for package runs. + The files to process. Each entry can be a URL or an existing Extend file ID. Raw text and base64 inputs are not supported for package runs. Duplicate file IDs and duplicate URLs are rejected — each file may appear only once. A URL and a file ID are never treated as duplicates of each other, even if they resolve to the same document. """ diff --git a/src/extend_ai/types/__init__.py b/src/extend_ai/types/__init__.py index 07135c3..73f9483 100644 --- a/src/extend_ai/types/__init__.py +++ b/src/extend_ai/types/__init__.py @@ -379,6 +379,8 @@ from .parse_run_failed_webhook_event import ParseRunFailedWebhookEvent from .parse_run_metrics import ParseRunMetrics from .parse_run_output import ParseRunOutput + from .parse_run_output_metadata import ParseRunOutputMetadata + from .parse_run_output_metadata_pages_item import ParseRunOutputMetadataPagesItem from .parse_run_output_ocr import ParseRunOutputOcr from .parse_run_output_ocr_words_item import ParseRunOutputOcrWordsItem from .parse_run_processed_webhook_event import ParseRunProcessedWebhookEvent @@ -904,6 +906,8 @@ "ParseRunFailedWebhookEvent": ".parse_run_failed_webhook_event", "ParseRunMetrics": ".parse_run_metrics", "ParseRunOutput": ".parse_run_output", + "ParseRunOutputMetadata": ".parse_run_output_metadata", + "ParseRunOutputMetadataPagesItem": ".parse_run_output_metadata_pages_item", "ParseRunOutputOcr": ".parse_run_output_ocr", "ParseRunOutputOcrWordsItem": ".parse_run_output_ocr_words_item", "ParseRunProcessedWebhookEvent": ".parse_run_processed_webhook_event", @@ -1447,6 +1451,8 @@ def __dir__(): "ParseRunFailedWebhookEvent", "ParseRunMetrics", "ParseRunOutput", + "ParseRunOutputMetadata", + "ParseRunOutputMetadataPagesItem", "ParseRunOutputOcr", "ParseRunOutputOcrWordsItem", "ParseRunProcessedWebhookEvent", diff --git a/src/extend_ai/types/data_retention.py b/src/extend_ai/types/data_retention.py index 6008bce..d585974 100644 --- a/src/extend_ai/types/data_retention.py +++ b/src/extend_ai/types/data_retention.py @@ -12,7 +12,7 @@ class DataRetention(UncheckedBaseModel): """ Controls data retention for this run. When omitted or set to `workspace_default`, Extend uses your workspace's configured retention policy. Set `mode` to `zero` to request zero data retention for the run, which deletes supported run data after processing instead of retaining it under the workspace policy. - Zero data retention is only available for eligible organizations and plans. If your organization is not eligible, the request will fail with a 400 error. + Zero data retention is available to all customers on paid plans upon request. If you're on a free plan, the request will fail with a 400 error. If you'd like to request ZDR to be enabled, please reach out to support@extend.ai. """ mode: typing.Optional[DataRetentionMode] = pydantic.Field(default=None) diff --git a/src/extend_ai/types/parse_run_output.py b/src/extend_ai/types/parse_run_output.py index 085eec5..b882fb0 100644 --- a/src/extend_ai/types/parse_run_output.py +++ b/src/extend_ai/types/parse_run_output.py @@ -8,6 +8,7 @@ from ..core.pydantic_utilities import IS_PYDANTIC_V2, update_forward_refs from ..core.unchecked_base_model import UncheckedBaseModel from .chunk import Chunk +from .parse_run_output_metadata import ParseRunOutputMetadata from .parse_run_output_ocr import ParseRunOutputOcr @@ -28,6 +29,11 @@ class ParseRunOutput(UncheckedBaseModel): Raw OCR data from the parsing process. Only included when `returnOcr` is configured in the parse config's advanced options. """ + metadata: typing.Optional[ParseRunOutputMetadata] = pydantic.Field(default=None) + """ + Rotation, dimension, and file-type metadata about the parse output. `null` for parse runs that completed before this field was introduced. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: diff --git a/src/extend_ai/types/parse_run_output_metadata.py b/src/extend_ai/types/parse_run_output_metadata.py new file mode 100644 index 0000000..c15078c --- /dev/null +++ b/src/extend_ai/types/parse_run_output_metadata.py @@ -0,0 +1,44 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from ..core.serialization import FieldMetadata +from ..core.unchecked_base_model import UncheckedBaseModel +from .parse_run_output_metadata_pages_item import ParseRunOutputMetadataPagesItem + + +class ParseRunOutputMetadata(UncheckedBaseModel): + """ + Rotation, dimension, and file-type metadata about the parse output. `null` for parse runs that completed before this field was introduced. + """ + + original_mime_type: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="originalMimeType")] = ( + pydantic.Field(alias="originalMimeType", default=None) + ) + """ + The file's media type before any format conversion. + """ + + final_mime_type: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="finalMimeType")] = ( + pydantic.Field(alias="finalMimeType", default=None) + ) + """ + The file's media type after any format conversion. + """ + + pages: typing.Optional[typing.List[ParseRunOutputMetadataPagesItem]] = pydantic.Field(default=None) + """ + Per-page rotation and original-dimension info. Set when file is a PDF or was converted to PDF. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/extend_ai/types/parse_run_output_metadata_pages_item.py b/src/extend_ai/types/parse_run_output_metadata_pages_item.py new file mode 100644 index 0000000..f6893e6 --- /dev/null +++ b/src/extend_ai/types/parse_run_output_metadata_pages_item.py @@ -0,0 +1,51 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +import typing_extensions +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from ..core.serialization import FieldMetadata +from ..core.unchecked_base_model import UncheckedBaseModel + + +class ParseRunOutputMetadataPagesItem(UncheckedBaseModel): + number: int = pydantic.Field() + """ + The page number this entry describes. + """ + + rotation_applied: typing_extensions.Annotated[typing.Optional[int], FieldMetadata(alias="rotationApplied")] = ( + pydantic.Field(alias="rotationApplied", default=None) + ) + """ + Degrees Extend rotated the page clockwise to make it upright. `0` if rotation detection ran and the page was already upright; `null` if rotation detection was disabled for this run. + """ + + original_page_width: typing_extensions.Annotated[float, FieldMetadata(alias="originalPageWidth")] = pydantic.Field( + alias="originalPageWidth" + ) + """ + The file's true page width, independent of rendering resolution. + """ + + original_page_height: typing_extensions.Annotated[float, FieldMetadata(alias="originalPageHeight")] = ( + pydantic.Field(alias="originalPageHeight") + ) + """ + The file's true page height, independent of rendering resolution. + """ + + dpi: float = pydantic.Field() + """ + The DPI that `boundingBox`/`polygon` coordinates on this page are scaled to. Multiply `originalPageWidth`/`originalPageHeight` by `dpi / 72` to convert them into that same coordinate space. + """ + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow diff --git a/src/extend_ai/types/parse_run_output_ocr_words_item.py b/src/extend_ai/types/parse_run_output_ocr_words_item.py index 34316ec..3a26567 100644 --- a/src/extend_ai/types/parse_run_output_ocr_words_item.py +++ b/src/extend_ai/types/parse_run_output_ocr_words_item.py @@ -35,6 +35,13 @@ class ParseRunOutputOcrWordsItem(UncheckedBaseModel): The page number where the word was detected. """ + block_id: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="blockId")] = pydantic.Field( + alias="blockId", default=None + ) + """ + The `id` of the block (see the `Block` schema) this word was assigned to, based on bounding-box overlap. Omitted when the word doesn't fall within any block's bounding box. + """ + if IS_PYDANTIC_V2: model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 else: diff --git a/src/extend_ai/types/workflow_run_package.py b/src/extend_ai/types/workflow_run_package.py index 813217c..b4e268c 100644 --- a/src/extend_ai/types/workflow_run_package.py +++ b/src/extend_ai/types/workflow_run_package.py @@ -17,7 +17,7 @@ class WorkflowRunPackage(UncheckedBaseModel): files: typing.List[WorkflowRunPackageFilesItem] = pydantic.Field() """ - The files to process, in submission order. Each entry can be a URL or an existing Extend file ID. Raw text and base64 inputs are not supported for package runs. + The files to process. Each entry can be a URL or an existing Extend file ID. Raw text and base64 inputs are not supported for package runs. Duplicate file IDs and duplicate URLs are rejected — each file may appear only once. A URL and a file ID are never treated as duplicates of each other, even if they resolve to the same document. """ diff --git a/src/extend_ai/workflow_runs/client.py b/src/extend_ai/workflow_runs/client.py index 222826f..1a20c56 100644 --- a/src/extend_ai/workflow_runs/client.py +++ b/src/extend_ai/workflow_runs/client.py @@ -139,7 +139,7 @@ def create( """ Run a workflow. A workflow is a sequence of steps that process files and data in a specific order to achieve a desired outcome. - Pass `file` for a single document, or `package` to process 2-50 files together as one package in a single run. Exactly one of `file` or `package` must be provided. + Pass `file` for a single document use case (more common), or `package` to process 2-50 files together as one package in a single run where context across files is used together to determine final output. Exactly one of `file` or `package` must be provided. The request returns immediately with a `PROCESSING` status. Use webhooks or poll the Get Workflow Run endpoint for results. @@ -576,7 +576,7 @@ async def create( """ Run a workflow. A workflow is a sequence of steps that process files and data in a specific order to achieve a desired outcome. - Pass `file` for a single document, or `package` to process 2-50 files together as one package in a single run. Exactly one of `file` or `package` must be provided. + Pass `file` for a single document use case (more common), or `package` to process 2-50 files together as one package in a single run where context across files is used together to determine final output. Exactly one of `file` or `package` must be provided. The request returns immediately with a `PROCESSING` status. Use webhooks or poll the Get Workflow Run endpoint for results. diff --git a/src/extend_ai/workflow_runs/raw_client.py b/src/extend_ai/workflow_runs/raw_client.py index a3e5264..4f46f8b 100644 --- a/src/extend_ai/workflow_runs/raw_client.py +++ b/src/extend_ai/workflow_runs/raw_client.py @@ -242,7 +242,7 @@ def create( """ Run a workflow. A workflow is a sequence of steps that process files and data in a specific order to achieve a desired outcome. - Pass `file` for a single document, or `package` to process 2-50 files together as one package in a single run. Exactly one of `file` or `package` must be provided. + Pass `file` for a single document use case (more common), or `package` to process 2-50 files together as one package in a single run where context across files is used together to determine final output. Exactly one of `file` or `package` must be provided. The request returns immediately with a `PROCESSING` status. Use webhooks or poll the Get Workflow Run endpoint for results. @@ -1372,7 +1372,7 @@ async def create( """ Run a workflow. A workflow is a sequence of steps that process files and data in a specific order to achieve a desired outcome. - Pass `file` for a single document, or `package` to process 2-50 files together as one package in a single run. Exactly one of `file` or `package` must be provided. + Pass `file` for a single document use case (more common), or `package` to process 2-50 files together as one package in a single run where context across files is used together to determine final output. Exactly one of `file` or `package` must be provided. The request returns immediately with a `PROCESSING` status. Use webhooks or poll the Get Workflow Run endpoint for results.