From 82debac9de4c69453e1443abb063d025053d153f Mon Sep 17 00:00:00 2001 From: Maciej Majek Date: Mon, 16 Sep 2024 14:54:28 +0200 Subject: [PATCH 1/3] chore: update packages, langchain pydantic v2 --- poetry.lock | 217 +++++++++++++++++++++++++++++++------------------ pyproject.toml | 13 +-- 2 files changed, 144 insertions(+), 86 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3f013e4a..89a9ce2e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1307,13 +1307,13 @@ files = [ [[package]] name = "elevenlabs" -version = "1.8.0" +version = "1.8.1" description = "" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "elevenlabs-1.8.0-py3-none-any.whl", hash = "sha256:77987731a2422637a88f6a572e27bb61e8ae117f1e5b06e1c558a2f6982ed653"}, - {file = "elevenlabs-1.8.0.tar.gz", hash = "sha256:cd17634e819fe85f34f66f23f92e0a9b63685e561872afe76b0e2374b9fd47bf"}, + {file = "elevenlabs-1.8.1-py3-none-any.whl", hash = "sha256:d9a2a62963b008f4b8f52326984b1cf35fd455ebbe24ff136cb3009908e1185d"}, + {file = "elevenlabs-1.8.1.tar.gz", hash = "sha256:a6309fc7ca91d379dfbec3fddeb5a6b755847c25fa935f936654d55a95d7b9a9"}, ] [package.dependencies] @@ -2091,13 +2091,13 @@ packaging = "*" [[package]] name = "identify" -version = "2.6.0" +version = "2.6.1" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, - {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, + {file = "identify-2.6.1-py2.py3-none-any.whl", hash = "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0"}, + {file = "identify-2.6.1.tar.gz", hash = "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98"}, ] [package.extras] @@ -2105,15 +2105,18 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagecodecs" version = "2024.6.1" @@ -2700,26 +2703,26 @@ files = [ [[package]] name = "langchain" -version = "0.2.16" +version = "0.3.0" description = "Building applications with LLMs through composability" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain-0.2.16-py3-none-any.whl", hash = "sha256:8f59ee8b45f268df4b924ea3b9c63e49286efa756d16b3f6a9de5c6e502c36e1"}, - {file = "langchain-0.2.16.tar.gz", hash = "sha256:ffb426a76a703b73ac69abad77cd16eaf03dda76b42cff55572f592d74944166"}, + {file = "langchain-0.3.0-py3-none-any.whl", hash = "sha256:59a75a6a1eb7bfd2a6bf0c7a5816409a8fdc9046187b07af287b23b9899617af"}, + {file = "langchain-0.3.0.tar.gz", hash = "sha256:a7c23892440bd1f5b9e029ff0dd709dd881ae927c4c0a3210ac64dba9bbf3f7f"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} -langchain-core = ">=0.2.38,<0.3.0" -langchain-text-splitters = ">=0.2.0,<0.3.0" +langchain-core = ">=0.3.0,<0.4.0" +langchain-text-splitters = ">=0.3.0,<0.4.0" langsmith = ">=0.1.17,<0.2.0" numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1,<2", markers = "python_version < \"3.12\""}, ] -pydantic = ">=1,<3" +pydantic = ">=2.7.4,<3.0.0" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" @@ -2727,44 +2730,46 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-aws" -version = "0.1.18" +version = "0.2.0" description = "An integration package connecting AWS and LangChain" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_aws-0.1.18-py3-none-any.whl", hash = "sha256:54c65157c67837cd932a6a8c536b52e2308c4e917bccd187d6f42651943cdd51"}, - {file = "langchain_aws-0.1.18.tar.gz", hash = "sha256:2e59efc95ef6758581b7e769cd610b750c76635c437a4f43c454a14cfab67c64"}, + {file = "langchain_aws-0.2.0-py3-none-any.whl", hash = "sha256:c48ed18d95f161992806ff7dcc68a1da353135d18bbc345dacbb29969c122a74"}, + {file = "langchain_aws-0.2.0.tar.gz", hash = "sha256:e357bd1e1b0be985a8b8fb1a001015d9d8930a26941f1184deb93a668154c83a"}, ] [package.dependencies] boto3 = ">=1.34.131,<1.35.0" -langchain-core = ">=0.2.33,<0.3" +langchain-core = ">=0.3.0,<0.4" numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1,<2", markers = "python_version < \"3.12\""}, ] +pydantic = ">=2,<3" [[package]] name = "langchain-community" -version = "0.2.16" +version = "0.3.0" description = "Community contributed LangChain integrations." optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_community-0.2.16-py3-none-any.whl", hash = "sha256:115e1419c176091d4e00240cb5a38612a249e70f213516b6cacae61a8794a868"}, - {file = "langchain_community-0.2.16.tar.gz", hash = "sha256:ab416b793a7aed1fa46ebaffd29993296b02286a99819eabc43be2ea8e41ae78"}, + {file = "langchain_community-0.3.0-py3-none-any.whl", hash = "sha256:40084f1f785f0fb56c8698ff059bbda8bd8c683cbdffa7902a0e04e72961496c"}, + {file = "langchain_community-0.3.0.tar.gz", hash = "sha256:1ee8a469ad66977f21b9d96bdcdd8549c5281c474f0f9cc13b932efd63a78105"}, ] [package.dependencies] aiohttp = ">=3.8.3,<4.0.0" dataclasses-json = ">=0.5.7,<0.7" -langchain = ">=0.2.16,<0.3.0" -langchain-core = ">=0.2.38,<0.3.0" -langsmith = ">=0.1.0,<0.2.0" +langchain = ">=0.3.0,<0.4.0" +langchain-core = ">=0.3.0,<0.4.0" +langsmith = ">=0.1.112,<0.2.0" numpy = [ - {version = ">=1,<2", markers = "python_version < \"3.12\""}, {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, + {version = ">=1,<2", markers = "python_version < \"3.12\""}, ] +pydantic-settings = ">=2.4.0,<3.0.0" PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" @@ -2772,21 +2777,21 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.2.39" +version = "0.3.0" description = "Building applications with LLMs through composability" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.2.39-py3-none-any.whl", hash = "sha256:5a5ad4e1c02d13e7021c026b2c7965069ad71ef67b018274cd52bab56e39143e"}, - {file = "langchain_core-0.2.39.tar.gz", hash = "sha256:73d7b6f0b0212bc8069c3640d69e8d75faa51097784019ffa5c36c617c04acb0"}, + {file = "langchain_core-0.3.0-py3-none-any.whl", hash = "sha256:bee6dae2366d037ef0c5b87401fed14b5497cad26f97724e8c9ca7bc9239e847"}, + {file = "langchain_core-0.3.0.tar.gz", hash = "sha256:1249149ea3ba24c9c761011483c14091573a5eb1a773aa0db9c8ad155dd4a69d"}, ] [package.dependencies] jsonpatch = ">=1.33,<2.0" -langsmith = ">=0.1.112,<0.2.0" +langsmith = ">=0.1.117,<0.2.0" packaging = ">=23.2,<25" pydantic = [ - {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""}, {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, ] PyYAML = ">=5.3" @@ -2795,58 +2800,58 @@ typing-extensions = ">=4.7" [[package]] name = "langchain-ollama" -version = "0.1.3" +version = "0.2.0" description = "An integration package connecting Ollama and LangChain" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_ollama-0.1.3-py3-none-any.whl", hash = "sha256:e4017178b2fbf822c74b29eaca3732c925265a63d9dd9fe6970c34fd32568c4a"}, - {file = "langchain_ollama-0.1.3.tar.gz", hash = "sha256:cc5f3d510e591cb66b382f4fe32801877593c0d0a1dc48e9e8fcd16b8e01c454"}, + {file = "langchain_ollama-0.2.0-py3-none-any.whl", hash = "sha256:aa5b794599652494a07fd27b22784854480cd4c793f0db5e81ebeccc2affd135"}, + {file = "langchain_ollama-0.2.0.tar.gz", hash = "sha256:250ad9f3edce1a0ca16e4fad19f783ac728d7d76888ba952c462cd9f680353f7"}, ] [package.dependencies] -langchain-core = ">=0.2.36,<0.3.0" +langchain-core = ">=0.3.0,<0.4.0" ollama = ">=0.3.0,<1" [[package]] name = "langchain-openai" -version = "0.1.24" +version = "0.2.0" description = "An integration package connecting OpenAI and LangChain" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_openai-0.1.24-py3-none-any.whl", hash = "sha256:7dc27f1dd50090a409fb5e970b07aaf3ff32c027cc1e8da1d1272f950e93e02c"}, - {file = "langchain_openai-0.1.24.tar.gz", hash = "sha256:3f7ef5c26d232685d3c367b7ec523799563c468725e4ca2e616d7c4a96bd16f3"}, + {file = "langchain_openai-0.2.0-py3-none-any.whl", hash = "sha256:9a1a69ba0706f23ec2941096ead0bc39202cac0e9782a5d6c8d92cb2280c2759"}, + {file = "langchain_openai-0.2.0.tar.gz", hash = "sha256:441ec8fd254992e5fa81d375e60849993a81db5e9e42a79344ebff7a40a0b45f"}, ] [package.dependencies] -langchain-core = ">=0.2.39,<0.3.0" +langchain-core = ">=0.3,<0.4" openai = ">=1.40.0,<2.0.0" tiktoken = ">=0.7,<1" [[package]] name = "langchain-text-splitters" -version = "0.2.4" +version = "0.3.0" description = "LangChain text splitting utilities" optional = false -python-versions = "<4.0,>=3.8.1" +python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_text_splitters-0.2.4-py3-none-any.whl", hash = "sha256:2702dee5b7cbdd595ccbe43b8d38d01a34aa8583f4d6a5a68ad2305ae3e7b645"}, - {file = "langchain_text_splitters-0.2.4.tar.gz", hash = "sha256:f7daa7a3b0aa8309ce248e2e2b6fc8115be01118d336c7f7f7dfacda0e89bf29"}, + {file = "langchain_text_splitters-0.3.0-py3-none-any.whl", hash = "sha256:e84243e45eaff16e5b776cd9c81b6d07c55c010ebcb1965deb3d1792b7358e83"}, + {file = "langchain_text_splitters-0.3.0.tar.gz", hash = "sha256:f9fe0b4d244db1d6de211e7343d4abc4aa90295aa22e1f0c89e51f33c55cd7ce"}, ] [package.dependencies] -langchain-core = ">=0.2.38,<0.3.0" +langchain-core = ">=0.3.0,<0.4.0" [[package]] name = "langfuse" -version = "2.48.0" +version = "2.48.1" description = "A client library for accessing langfuse" optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langfuse-2.48.0-py3-none-any.whl", hash = "sha256:475b047e461f8a45e3c7d81b6a87e0b9e389c489d465b838aa69cbdd16eeacce"}, - {file = "langfuse-2.48.0.tar.gz", hash = "sha256:46e7e6e6e97fe03115a9f95d7f29b3fcd1848a9d1bb34608ebb42a3931919e45"}, + {file = "langfuse-2.48.1-py3-none-any.whl", hash = "sha256:8661070b6d94ba1d7da92c054f3110b6ecf4489d6e8204a4080f934f3f49ebf2"}, + {file = "langfuse-2.48.1.tar.gz", hash = "sha256:b8117d90babec6be1bc3303b42e0b71848531eae44118e6e0123d03e7961d0fc"}, ] [package.dependencies] @@ -2865,17 +2870,32 @@ openai = ["openai (>=0.27.8)"] [[package]] name = "langgraph" -version = "0.1.19" +version = "0.2.21" description = "Building stateful, multi-actor applications with LLMs" optional = false python-versions = "<4.0,>=3.9.0" files = [ - {file = "langgraph-0.1.19-py3-none-any.whl", hash = "sha256:7155b86e5d3559e986b3cbcd1c34ee96959136814bc2db679f84fc5fa7a8e61c"}, - {file = "langgraph-0.1.19.tar.gz", hash = "sha256:715babd412eebdc6f5f4e8a485073be55669ebf73495b795ec816668027dbe74"}, + {file = "langgraph-0.2.21-py3-none-any.whl", hash = "sha256:4a9319bab8eab84a6a9954177ded7fcd57c5fa87bb617adc3855a0713f3fc614"}, + {file = "langgraph-0.2.21.tar.gz", hash = "sha256:87346bc8d7cba08cac5bc97c7f11550d054c3197272c8599e13349ab789a3d28"}, +] + +[package.dependencies] +langchain-core = ">=0.2.39,<0.4" +langgraph-checkpoint = ">=1.0.2,<2.0.0" + +[[package]] +name = "langgraph-checkpoint" +version = "1.0.9" +description = "Library with base interfaces for LangGraph checkpoint savers." +optional = false +python-versions = "<4.0.0,>=3.9.0" +files = [ + {file = "langgraph_checkpoint-1.0.9-py3-none-any.whl", hash = "sha256:9765c0005d645a22940c5df92f05f34fbda669466994096c3546a005da8572fc"}, + {file = "langgraph_checkpoint-1.0.9.tar.gz", hash = "sha256:0e8646d8cfeaa6586acecf0a0a0da17488612036ece07bffe886b851fae717e2"}, ] [package.dependencies] -langchain-core = ">=0.2.22,<0.3" +langchain-core = ">=0.2.38,<0.4" [[package]] name = "langsmith" @@ -3562,13 +3582,13 @@ files = [ [[package]] name = "narwhals" -version = "1.8.0" +version = "1.8.1" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false python-versions = ">=3.8" files = [ - {file = "narwhals-1.8.0-py3-none-any.whl", hash = "sha256:73bde7b1721e1d95f749f6aacec12bc616fcccae5a926064d641c93e133fd548"}, - {file = "narwhals-1.8.0.tar.gz", hash = "sha256:b1572b8781273e5712ee76144b9b6f412f2b71f39d63053853322cc98201eeaa"}, + {file = "narwhals-1.8.1-py3-none-any.whl", hash = "sha256:91a3af813733df39a74f590fdd1bb0d2d6d8a33e32aa409f56d941c0a29f8cdd"}, + {file = "narwhals-1.8.1.tar.gz", hash = "sha256:97527778e11f39a1e5e2113b8fbb9ead788be41c0337f21852e684e378f583e8"}, ] [package.extras] @@ -4075,10 +4095,10 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -4099,10 +4119,10 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\" and python_version < \"3.11\""}, {version = ">=1.21.2", markers = "platform_system != \"Darwin\" and python_version >= \"3.10\" and python_version < \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -4275,9 +4295,9 @@ files = [ [package.dependencies] numpy = [ + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.22.4", markers = "python_version < \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -4461,13 +4481,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.3" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.3-py3-none-any.whl", hash = "sha256:50a5450e2e84f44539718293cbb1da0a0885c9d14adf21b77bae4e66fc99d9b5"}, + {file = "platformdirs-4.3.3.tar.gz", hash = "sha256:d4e0b7d8ec176b341fb03cb11ca12d0276faa8c485f9cd218f613840463fc2c0"}, ] [package.extras] @@ -4929,6 +4949,26 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.5.2" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.5.2-py3-none-any.whl", hash = "sha256:2c912e55fd5794a59bf8c832b9de832dcfdf4778d79ff79b708744eed499a907"}, + {file = "pydantic_settings-2.5.2.tar.gz", hash = "sha256:f90b139682bee4d2065273d5185d71d37ea46cfe57e1b5ae184fc6a0b2484ca0"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + [[package]] name = "pydeck" version = "0.9.1" @@ -5072,15 +5112,18 @@ image = ["Pillow (>=8.0.0)"] [[package]] name = "pyreadline3" -version = "3.4.3" +version = "3.5.2" description = "A python implementation of GNU readline." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pyreadline3-3.4.3-py3-none-any.whl", hash = "sha256:f832c5898f4f9a0f81d48a8c499b39d0179de1a465ea3def1a7e7231840b4ed6"}, - {file = "pyreadline3-3.4.3.tar.gz", hash = "sha256:ebab0baca37f50e2faa1dd99a6da1c75de60e0d68a3b229c134bbd12786250e2"}, + {file = "pyreadline3-3.5.2-py3-none-any.whl", hash = "sha256:a87d56791e2965b2b187e2ea33dcf664600842c997c0623c95cf8ef07db83de9"}, + {file = "pyreadline3-3.5.2.tar.gz", hash = "sha256:ba82292e52c5a3bb256b291af0c40b457c1e8699cac9a873abbcaac8aef3a1bb"}, ] +[package.extras] +dev = ["build", "flake8", "pytest", "twine"] + [[package]] name = "pysocks" version = "1.7.1" @@ -5129,6 +5172,20 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "pytorchvideo" version = "0.1.5" @@ -6226,18 +6283,18 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.0.0-py3-none-any.whl", hash = "sha256:791ae94f04f78c880b5e614e560dd32d4b4af5d151bd9e7483e3377846caf90a"}, + {file = "setuptools-75.0.0.tar.gz", hash = "sha256:25af69c809d9334cd8e653d385277abeb5a102dca255954005a7092d282575ea"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] @@ -7960,13 +8017,13 @@ jupyter = ["ipytree (>=0.2.2)", "ipywidgets (>=8.0.0)", "notebook"] [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] @@ -7980,4 +8037,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.10, <3.13" -content-hash = "3cc6f87ef487cb74881e6e96c909b6eb07e24332b96f8220aa823784feb08980" +content-hash = "a893846f73b481b6386f2ef9950a72b546a77d37b7418997202d746ede8d5932" diff --git a/pyproject.toml b/pyproject.toml index 034fb5ee..dc57f3be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,13 @@ classifiers = [ package-mode = false [tool.poetry.dependencies] python = "^3.10, <3.13" +langchain-core = "^0.3" +langchain = "*" +langgraph = "*" +langchain-aws = "*" +langchain-openai = "*" +langchain-ollama = "*" +langchain-community = "*" requests = "^2.32.2" pre-commit = "^3.7.0" openai = "^1.23.3" @@ -23,12 +30,7 @@ tqdm = "^4.66.4" pytest = "^8.2.0" xxhash = "^3.4.1" optuna = "^3.6.1" -langchain = "^0.2.3" -langchain-aws = "^0.1.7" -langchain-openai = "^0.1.8" -langchain-community = "^0.2.4" transforms3d = "^0.4.1" -langgraph = "^0.1.0" tabulate = "^0.9.0" lark = "^1.1.9" langfuse = "^2.36.1" @@ -43,7 +45,6 @@ faiss-cpu = "^1.8.0.post1" rich = "^13.7.1" docx2txt = "^0.8" pypdf = "^4.2.0" -langchain-ollama = "^0.1.1" streamlit = "^1.37.1" deprecated = "^1.2.14" From e2dc1166ceb1465e235bbe80239f50146eb7d7f6 Mon Sep 17 00:00:00 2001 From: Maciej Majek Date: Mon, 16 Sep 2024 15:18:58 +0200 Subject: [PATCH 2/3] feat: migrate to pydantic v2 --- src/rai/rai/agents/state_based.py | 4 ++-- src/rai/rai/apps/state_analyzer.py | 2 +- src/rai/rai/apps/talk_to_docs.py | 2 +- src/rai/rai/apps/task_executor.py | 2 +- src/rai/rai/apps/task_planner.py | 2 +- src/rai/rai/tools/ros/cli.py | 2 +- src/rai/rai/tools/ros/native.py | 6 +++--- src/rai/rai/tools/ros/native_actions.py | 8 +++++--- src/rai/rai/tools/ros/tools.py | 6 +++--- src/rai/rai/tools/time.py | 2 +- src/rai_hmi/rai_hmi/task.py | 3 +-- src/rai_hmi/rai_hmi/tools.py | 2 +- tests/conftest.py | 2 +- 13 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/rai/rai/agents/state_based.py b/src/rai/rai/agents/state_based.py index 795bb149..fe81f251 100644 --- a/src/rai/rai/agents/state_based.py +++ b/src/rai/rai/agents/state_based.py @@ -42,7 +42,6 @@ ToolCall, ToolMessage, ) -from langchain_core.pydantic_v1 import BaseModel, Field, ValidationError from langchain_core.runnables import Runnable, RunnableConfig from langchain_core.runnables.config import get_executor_for_config from langchain_core.tools import BaseTool @@ -50,7 +49,8 @@ from langgraph.graph import END, START, StateGraph from langgraph.graph.graph import CompiledGraph from langgraph.prebuilt.tool_node import str_output -from langgraph.utils import RunnableCallable +from langgraph.utils.runnable import RunnableCallable +from pydantic import BaseModel, Field, ValidationError from rclpy.impl.rcutils_logger import RcutilsLogger from rai.messages import ( diff --git a/src/rai/rai/apps/state_analyzer.py b/src/rai/rai/apps/state_analyzer.py index d0c74fb8..8c99be52 100644 --- a/src/rai/rai/apps/state_analyzer.py +++ b/src/rai/rai/apps/state_analyzer.py @@ -15,7 +15,7 @@ from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field STATE_ANALYZER_PROMPT = """ I am a part of a robot's supervising system. I am responsible for analyzing current robot's state with respect to the planned mission. diff --git a/src/rai/rai/apps/talk_to_docs.py b/src/rai/rai/apps/talk_to_docs.py index b784bf49..16dcbc5c 100644 --- a/src/rai/rai/apps/talk_to_docs.py +++ b/src/rai/rai/apps/talk_to_docs.py @@ -24,11 +24,11 @@ from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from langchain_core.prompts.chat import ChatPromptTemplate -from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.tools import BaseTool from langchain_core.vectorstores import VectorStore from langchain_openai import OpenAIEmbeddings from langgraph.graph import StateGraph +from pydantic import BaseModel, Field from rai.apps.document_loader import ingest_documentation diff --git a/src/rai/rai/apps/task_executor.py b/src/rai/rai/apps/task_executor.py index 1b34953d..a32d5ff8 100644 --- a/src/rai/rai/apps/task_executor.py +++ b/src/rai/rai/apps/task_executor.py @@ -27,9 +27,9 @@ ToolMessage, ) from langchain_core.prompts import ChatPromptTemplate -from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.runnables import RunnableConfig from langchain_core.tools import BaseTool, tool +from pydantic import BaseModel, Field logger = logging.getLogger(__name__) diff --git a/src/rai/rai/apps/task_planner.py b/src/rai/rai/apps/task_planner.py index 4a6acc3d..5a688b8e 100644 --- a/src/rai/rai/apps/task_planner.py +++ b/src/rai/rai/apps/task_planner.py @@ -15,7 +15,7 @@ from langchain_core.language_models.chat_models import BaseChatModel from langchain_core.prompts import ChatPromptTemplate -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field PLANNER_PROMPT = """ I am a part of a robot's planning system. I am responsible for planning the robot's actions by splitting tasks in to atomic steps. diff --git a/src/rai/rai/tools/ros/cli.py b/src/rai/rai/tools/ros/cli.py index 42cabee5..b00f1e86 100644 --- a/src/rai/rai/tools/ros/cli.py +++ b/src/rai/rai/tools/ros/cli.py @@ -17,7 +17,7 @@ from typing import Type from langchain.tools import BaseTool -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field class Ros2TopicToolInput(BaseModel): diff --git a/src/rai/rai/tools/ros/native.py b/src/rai/rai/tools/ros/native.py index 9bcdd26e..e90b2e06 100644 --- a/src/rai/rai/tools/ros/native.py +++ b/src/rai/rai/tools/ros/native.py @@ -27,7 +27,7 @@ import rosidl_runtime_py.utilities import sensor_msgs.msg from langchain.tools import BaseTool -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field from rclpy.impl.rcutils_logger import RcutilsLogger from .utils import convert_ros_img_to_base64, import_message_from_str @@ -180,7 +180,7 @@ class TopicInput(Ros2BaseInput): class GetMsgFromTopic(Ros2BaseTool): - name = "get_msg_from_topic" + name: str = "get_msg_from_topic" description: str = "Get message from topic" args_schema: Type[TopicInput] = TopicInput response_format: str = "content_and_artifact" @@ -195,7 +195,7 @@ def _run(self, topic_name: str): class GetCameraImage(Ros2BaseTool): - name = "get_camera_image" + name: str = "get_camera_image" description: str = "get image from robots camera" response_format: str = "content_and_artifact" args_schema: Type[TopicInput] = TopicInput diff --git a/src/rai/rai/tools/ros/native_actions.py b/src/rai/rai/tools/ros/native_actions.py index 740e6e22..c02a82c4 100644 --- a/src/rai/rai/tools/ros/native_actions.py +++ b/src/rai/rai/tools/ros/native_actions.py @@ -18,7 +18,7 @@ import rosidl_runtime_py.set_message import rosidl_runtime_py.utilities from action_msgs.msg import GoalStatus -from langchain_core.pydantic_v1 import BaseModel, Field +from pydantic import BaseModel, Field from rclpy.action import ActionClient from .native import Ros2BaseTool @@ -155,8 +155,10 @@ def _run(self, uid: str): class Ros2ListActionFeedbacks(Ros2BaseTool): - name = "Ros2ListActionFeedbacks" - description = "List intermediate feedbacks received during ros2 action. Feedbacks are sent before the action is completed." + name: str = "Ros2ListActionFeedbacks" + description: str = ( + "List intermediate feedbacks received during ros2 action. Feedbacks are sent before the action is completed." + ) args_schema: Type[OptionalActionUidInput] = OptionalActionUidInput diff --git a/src/rai/rai/tools/ros/tools.py b/src/rai/rai/tools/ros/tools.py index 38231148..2804eaf9 100644 --- a/src/rai/rai/tools/ros/tools.py +++ b/src/rai/rai/tools/ros/tools.py @@ -22,9 +22,9 @@ import cv2 import numpy as np from geometry_msgs.msg import Point, Quaternion, TransformStamped -from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.tools import BaseTool from nav_msgs.msg import OccupancyGrid +from pydantic import BaseModel, Field from tf_transformations import euler_from_quaternion from rai.tools.ros.deprecated import SingleMessageGrabber @@ -50,7 +50,7 @@ class AddDescribedWaypointToDatabaseToolInput(BaseModel): class AddDescribedWaypointToDatabaseTool(BaseTool): """Add described waypoint to the database tool.""" - name = "AddDescribedWaypointToDatabaseTool" + name: str = "AddDescribedWaypointToDatabaseTool" description: str = ( "A tool for adding a described waypoint to the database for later use. " ) @@ -242,7 +242,7 @@ class GetCurrentPositionToolInput(BaseModel): class GetCurrentPositionTool(BaseTool): """Get the current position of the robot.""" - name = "GetCurrentPositionTool" + name: str = "GetCurrentPositionTool" description: str = "A tool for getting the current position of the robot." args_schema: Type[GetCurrentPositionToolInput] = GetCurrentPositionToolInput diff --git a/src/rai/rai/tools/time.py b/src/rai/rai/tools/time.py index 3b2bd44d..e288fe92 100644 --- a/src/rai/rai/tools/time.py +++ b/src/rai/rai/tools/time.py @@ -16,8 +16,8 @@ import time from typing import Type -from langchain.pydantic_v1 import BaseModel, Field from langchain_core.tools import BaseTool +from pydantic import BaseModel, Field class WaitForSecondsToolInput(BaseModel): diff --git a/src/rai_hmi/rai_hmi/task.py b/src/rai_hmi/rai_hmi/task.py index 2c969edc..73b86ad1 100644 --- a/src/rai_hmi/rai_hmi/task.py +++ b/src/rai_hmi/rai_hmi/task.py @@ -15,8 +15,7 @@ from enum import Enum -from langchain_core.pydantic_v1 import BaseModel -from pydantic import UUID4 +from pydantic import UUID4, BaseModel class Priority(str, Enum): diff --git a/src/rai_hmi/rai_hmi/tools.py b/src/rai_hmi/rai_hmi/tools.py index 3148542c..55ff7d5c 100644 --- a/src/rai_hmi/rai_hmi/tools.py +++ b/src/rai_hmi/rai_hmi/tools.py @@ -15,8 +15,8 @@ from typing import Any, Type -from langchain_core.pydantic_v1 import BaseModel, Field from langchain_core.tools import BaseTool +from pydantic import BaseModel, Field from .task import Task diff --git a/tests/conftest.py b/tests/conftest.py index a1b5137e..d74425d3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,7 +28,7 @@ @pytest.fixture def rai_python_modules(): - packages = glob.glob("src/*") + packages = glob.glob("src/rai*") + glob.glob("src/*/rai*") package_names = [os.path.basename(p) for p in packages] ros2_python_packages = [] for package_path, package_name in zip(packages, package_names): From 5d2f6c2b079f71ff5f7e98feb491633b7b5c2c09 Mon Sep 17 00:00:00 2001 From: Maciej Majek Date: Wed, 18 Sep 2024 14:57:41 +0200 Subject: [PATCH 3/3] feat: custom error message --- src/rai/rai/agents/state_based.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/rai/rai/agents/state_based.py b/src/rai/rai/agents/state_based.py index fe81f251..55b89773 100644 --- a/src/rai/rai/agents/state_based.py +++ b/src/rai/rai/agents/state_based.py @@ -13,6 +13,8 @@ # limitations under the License. # + +import json import logging import pickle import time @@ -159,11 +161,22 @@ def run_one(call: ToolCall): "Tool output (max 100 chars): " + str(output.content[0:100]) ) except ValidationError as e: - self.logger.info( - f'Args validation error in "{call["name"]}", error: {e}' - ) + errors = e.errors() + for error in errors: + error.pop( + "url" + ) # get rid of the https://errors.pydantic.dev/... url + + error_message = f""" + Validation error in tool {call["name"]}: + {e.title} + Number of errors: {e.error_count()} + Errors: + {json.dumps(errors, indent=2)} + """ + self.logger.info(error_message) output = ToolMessage( - content=f"Failed to run tool. Error: {e}", + content=error_message, name=call["name"], tool_call_id=call["id"], status="error",