From fd57862e7a8c82faa74c3a44d816b5fd75fdb9a0 Mon Sep 17 00:00:00 2001 From: CRI USER Date: Mon, 7 Apr 2025 11:30:40 +0200 Subject: [PATCH 1/7] feat(tutor): adds auto-gen paerts for mas tutor --- poetry.lock | 1907 ++--------------- pyproject.toml | 3 +- src/app/api/api_v1/endpoints/tutor.py | 122 +- src/app/services/agents.py | 101 - src/app/services/pedagogical_framework.txt | 43 - src/app/services/search_helpers.py | 5 +- .../services/tutor/__init__.py} | 0 src/app/services/tutor/agents.py | 248 +++ src/app/services/tutor/models.py | 42 + src/app/services/tutor/template.md | 8 + src/app/services/tutor/tutor.py | 101 + src/app/services/tutor/utils.py | 15 + src/crews/agents.yaml | 25 - src/crews/crew_manager.py | 46 - src/crews/oddish_crew.py | 64 - src/crews/tasks.yaml | 14 - 16 files changed, 697 insertions(+), 2047 deletions(-) delete mode 100644 src/app/services/agents.py delete mode 100644 src/app/services/pedagogical_framework.txt rename src/{crews/config/agents.yaml => app/services/tutor/__init__.py} (100%) create mode 100644 src/app/services/tutor/agents.py create mode 100644 src/app/services/tutor/models.py create mode 100644 src/app/services/tutor/template.md create mode 100644 src/app/services/tutor/tutor.py create mode 100644 src/app/services/tutor/utils.py delete mode 100644 src/crews/agents.yaml delete mode 100644 src/crews/crew_manager.py delete mode 100644 src/crews/oddish_crew.py delete mode 100644 src/crews/tasks.yaml diff --git a/poetry.lock b/poetry.lock index dc82ea8..fd58b2b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -167,30 +167,12 @@ version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = "*" -groups = ["main", "metrics"] +groups = ["metrics"] files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] -[[package]] -name = "asgiref" -version = "3.8.1" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, - {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, -] - -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - [[package]] name = "astroid" version = "2.15.8" @@ -211,22 +193,6 @@ wrapt = [ {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, ] -[[package]] -name = "asttokens" -version = "3.0.0" -description = "Annotate AST trees with source code positions" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, - {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, -] - -[package.extras] -astroid = ["astroid (>=2,<4)"] -test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] - [[package]] name = "async-timeout" version = "4.0.3" @@ -261,23 +227,73 @@ tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothe tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\""] [[package]] -name = "auth0-python" -version = "4.8.0" -description = "" +name = "autogen-core" +version = "0.4.9.3" +description = "Foundational interfaces and agent runtime implementation for AutoGen" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "autogen_core-0.4.9.3-py3-none-any.whl", hash = "sha256:7e3680182bb968d2f63318dc1c3c427c964807aa6ad45e203924051a7a2333f8"}, + {file = "autogen_core-0.4.9.3.tar.gz", hash = "sha256:a32d53f80d7aa00588d8c5ecf21b8e20fbbef3c4812d5e1862911ba24dc30d3f"}, +] + +[package.dependencies] +jsonref = ">=1.1.0,<1.2.0" +opentelemetry-api = ">=1.27.0" +pillow = ">=11.0.0" +protobuf = ">=5.29.3,<5.30.0" +pydantic = ">=2.10.0,<3.0.0" +typing-extensions = ">=4.0.0" + +[[package]] +name = "autogen-ext" +version = "0.4.9.3" +description = "AutoGen extensions library" +optional = false +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "auth0_python-4.8.0-py3-none-any.whl", hash = "sha256:3d3fa18819a98025cc977d4809ad52b14dbe8b73da3ad56d98e4992d3f7e5bbd"}, - {file = "auth0_python-4.8.0.tar.gz", hash = "sha256:c1a47de68303c56999b5c0e0954fab3e62b57a1ef65a45322dbadbecf34b64a4"}, + {file = "autogen_ext-0.4.9.3-py3-none-any.whl", hash = "sha256:ac3780ec584be71eedd884483fc1a7db0f60318c369d05d7603bb7d27fe25883"}, + {file = "autogen_ext-0.4.9.3.tar.gz", hash = "sha256:c7bef82324ffb9e33b0f8c4cea783b24d1e48e7a9d852889ca5cc19e287500dc"}, ] [package.dependencies] -aiohttp = ">=3.10.11" -cryptography = ">=43.0.1" -pyjwt = ">=2.8.0" -requests = ">=2.32.3" -urllib3 = ">=2.2.3" +autogen-core = "0.4.9.3" + +[package.extras] +azure = ["azure-ai-inference (>=1.0.0b7)", "azure-core", "azure-identity"] +chromadb = ["chromadb"] +diskcache = ["diskcache (>=5.6.3)"] +docker = ["asyncio-atexit (>=1.0.1)", "docker (>=7.0,<8.0)"] +file-surfer = ["autogen-agentchat (==0.4.9.3)", "markitdown (>=0.0.1,<0.1.0)"] +gemini = ["google-genai (>=1.0.0)"] +graphrag = ["graphrag (>=1.0.1)"] +grpc = ["grpcio (>=1.70.0,<1.71.0)"] +http-tool = ["httpx (>=0.27.0)", "json-schema-to-pydantic (>=0.2.0)"] +jupyter-executor = ["ipykernel (>=6.29.5)", "nbclient (>=0.10.2)"] +langchain = ["langchain-core (>=0.3.3,<0.4.0)"] +llama-cpp = ["llama-cpp-python (>=0.3.8)"] +magentic-one = ["autogen-agentchat (==0.4.9.3)", "markitdown (>=0.0.1,<0.1.0)", "pillow (>=11.0.0)", "playwright (>=1.48.0)"] +mcp = ["json-schema-to-pydantic (>=0.2.2)", "mcp (>=1.5.0)"] +ollama = ["ollama (>=0.4.7)", "tiktoken (>=0.8.0)"] +openai = ["aiofiles", "openai (>=1.52.2)", "tiktoken (>=0.8.0)"] +redis = ["redis (>=5.2.1)"] +rich = ["rich (>=13.9.4)"] +semantic-kernel-all = ["semantic-kernel[anthropic,aws,dapr,google,hugging-face,mistralai,ollama,onnx,pandas,usearch] (>=1.17.1)"] +semantic-kernel-anthropic = ["semantic-kernel[anthropic] (>=1.17.1)"] +semantic-kernel-aws = ["semantic-kernel[aws] (>=1.17.1)"] +semantic-kernel-core = ["semantic-kernel (>=1.17.1)"] +semantic-kernel-dapr = ["semantic-kernel[dapr] (>=1.17.1)"] +semantic-kernel-google = ["semantic-kernel[google] (>=1.17.1)"] +semantic-kernel-hugging-face = ["semantic-kernel[hugging-face] (>=1.17.1)"] +semantic-kernel-mistralai = ["semantic-kernel[mistralai] (>=1.17.1)"] +semantic-kernel-ollama = ["semantic-kernel[ollama] (>=1.17.1)"] +semantic-kernel-onnx = ["semantic-kernel[onnx] (>=1.17.1)"] +semantic-kernel-pandas = ["semantic-kernel[pandas] (>=1.17.1)"] +task-centric-memory = ["chromadb (>=0.6.3)"] +video-surfer = ["autogen-agentchat (==0.4.9.3)", "ffmpeg-python", "openai-whisper", "opencv-python (>=4.5)"] +web-surfer = ["autogen-agentchat (==0.4.9.3)", "markitdown (>=0.0.1,<0.1.0)", "pillow (>=11.0.0)", "playwright (>=1.48.0)"] [[package]] name = "azure-ai-inference" @@ -332,45 +348,6 @@ files = [ {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, ] -[[package]] -name = "bcrypt" -version = "4.2.1" -description = "Modern password hashing for your software and your servers" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "bcrypt-4.2.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:1340411a0894b7d3ef562fb233e4b6ed58add185228650942bdc885362f32c17"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ee315739bc8387aa36ff127afc99120ee452924e0df517a8f3e4c0187a0f5f"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dbd0747208912b1e4ce730c6725cb56c07ac734b3629b60d4398f082ea718ad"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:aaa2e285be097050dba798d537b6efd9b698aa88eef52ec98d23dcd6d7cf6fea"}, - {file = "bcrypt-4.2.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:76d3e352b32f4eeb34703370e370997065d28a561e4a18afe4fef07249cb4396"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:b7703ede632dc945ed1172d6f24e9f30f27b1b1a067f32f68bf169c5f08d0425"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89df2aea2c43be1e1fa066df5f86c8ce822ab70a30e4c210968669565c0f4685"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:04e56e3fe8308a88b77e0afd20bec516f74aecf391cdd6e374f15cbed32783d6"}, - {file = "bcrypt-4.2.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:cfdf3d7530c790432046c40cda41dfee8c83e29482e6a604f8930b9930e94139"}, - {file = "bcrypt-4.2.1-cp37-abi3-win32.whl", hash = "sha256:adadd36274510a01f33e6dc08f5824b97c9580583bd4487c564fc4617b328005"}, - {file = "bcrypt-4.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:8c458cd103e6c5d1d85cf600e546a639f234964d0228909d8f8dbeebff82d526"}, - {file = "bcrypt-4.2.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:8ad2f4528cbf0febe80e5a3a57d7a74e6635e41af1ea5675282a33d769fba413"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909faa1027900f2252a9ca5dfebd25fc0ef1417943824783d1c8418dd7d6df4a"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cde78d385d5e93ece5479a0a87f73cd6fa26b171c786a884f955e165032b262c"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:533e7f3bcf2f07caee7ad98124fab7499cb3333ba2274f7a36cf1daee7409d99"}, - {file = "bcrypt-4.2.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:687cf30e6681eeda39548a93ce9bfbb300e48b4d445a43db4298d2474d2a1e54"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:041fa0155c9004eb98a232d54da05c0b41d4b8e66b6fc3cb71b4b3f6144ba837"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f85b1ffa09240c89aa2e1ae9f3b1c687104f7b2b9d2098da4e923f1b7082d331"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c6f5fa3775966cca251848d4d5393ab016b3afed251163c1436fefdec3b02c84"}, - {file = "bcrypt-4.2.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:807261df60a8b1ccd13e6599c779014a362ae4e795f5c59747f60208daddd96d"}, - {file = "bcrypt-4.2.1-cp39-abi3-win32.whl", hash = "sha256:b588af02b89d9fad33e5f98f7838bf590d6d692df7153647724a7f20c186f6bf"}, - {file = "bcrypt-4.2.1-cp39-abi3-win_amd64.whl", hash = "sha256:e84e0e6f8e40a242b11bce56c313edc2be121cec3e0ec2d76fce01f6af33c07c"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76132c176a6d9953cdc83c296aeaed65e1a708485fd55abf163e0d9f8f16ce0e"}, - {file = "bcrypt-4.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e158009a54c4c8bc91d5e0da80920d048f918c61a581f0a63e4e93bb556d362f"}, - {file = "bcrypt-4.2.1.tar.gz", hash = "sha256:6765386e3ab87f569b276988742039baab087b2cdb01e809d74e74503c2faafe"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - [[package]] name = "black" version = "24.3.0" @@ -424,7 +401,7 @@ version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.9" -groups = ["main", "metrics"] +groups = ["metrics"] files = [ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, @@ -448,10 +425,6 @@ files = [ {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"}, - {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"}, {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, @@ -464,14 +437,8 @@ files = [ {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"}, - {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"}, {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, - {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"}, - {file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, @@ -482,24 +449,8 @@ files = [ {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"}, - {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"}, {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, - {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"}, - {file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"}, - {file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"}, - {file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"}, - {file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"}, - {file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"}, {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, @@ -509,10 +460,6 @@ files = [ {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"}, - {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"}, {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, @@ -524,10 +471,6 @@ files = [ {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"}, - {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"}, {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, @@ -540,10 +483,6 @@ files = [ {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"}, - {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"}, {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, @@ -556,53 +495,11 @@ files = [ {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"}, - {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"}, {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, ] -[[package]] -name = "build" -version = "1.2.2.post1" -description = "A simple, correct Python build frontend" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "build-1.2.2.post1-py3-none-any.whl", hash = "sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5"}, - {file = "build-1.2.2.post1.tar.gz", hash = "sha256:b36993e92ca9375a219c99e606a122ff365a760a2d4bba0caa09bd5278b608b7"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=4.6", markers = "python_full_version < \"3.10.2\""} -packaging = ">=19.1" -pyproject_hooks = "*" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] -test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0) ; python_version < \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.11\"", "setuptools (>=67.8.0) ; python_version >= \"3.12\"", "wheel (>=0.36.0)"] -typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] -uv = ["uv (>=0.1.18)"] -virtualenv = ["virtualenv (>=20.0.35)"] - -[[package]] -name = "cachetools" -version = "5.5.1" -description = "Extensible memoizing collections and decorators" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, - {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, -] - [[package]] name = "certifi" version = "2024.8.30" @@ -621,7 +518,8 @@ version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" -groups = ["main", "metrics"] +groups = ["metrics"] +markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\" or implementation_name == \"pypy\"" files = [ {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, @@ -691,7 +589,6 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "platform_python_implementation != \"PyPy\"", metrics = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\" or implementation_name == \"pypy\""} [package.dependencies] pycparser = "*" @@ -811,90 +708,6 @@ files = [ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] -[[package]] -name = "chroma-hnswlib" -version = "0.7.6" -description = "Chromas fork of hnswlib" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "chroma_hnswlib-0.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f35192fbbeadc8c0633f0a69c3d3e9f1a4eab3a46b65458bbcbcabdd9e895c36"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f007b608c96362b8f0c8b6b2ac94f67f83fcbabd857c378ae82007ec92f4d82"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:456fd88fa0d14e6b385358515aef69fc89b3c2191706fd9aee62087b62aad09c"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfaae825499c2beaa3b75a12d7ec713b64226df72a5c4097203e3ed532680da"}, - {file = "chroma_hnswlib-0.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:2487201982241fb1581be26524145092c95902cb09fc2646ccfbc407de3328ec"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81181d54a2b1e4727369486a631f977ffc53c5533d26e3d366dda243fb0998ca"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b4ab4e11f1083dd0a11ee4f0e0b183ca9f0f2ed63ededba1935b13ce2b3606f"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53db45cd9173d95b4b0bdccb4dbff4c54a42b51420599c32267f3abbeb795170"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c093f07a010b499c00a15bc9376036ee4800d335360570b14f7fe92badcdcf9"}, - {file = "chroma_hnswlib-0.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:0540b0ac96e47d0aa39e88ea4714358ae05d64bbe6bf33c52f316c664190a6a3"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e87e9b616c281bfbe748d01705817c71211613c3b063021f7ed5e47173556cb7"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec5ca25bc7b66d2ecbf14502b5729cde25f70945d22f2aaf523c2d747ea68912"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305ae491de9d5f3c51e8bd52d84fdf2545a4a2bc7af49765cda286b7bb30b1d4"}, - {file = "chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822ede968d25a2c88823ca078a58f92c9b5c4142e38c7c8b4c48178894a0a3c5"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2fe6ea949047beed19a94b33f41fe882a691e58b70c55fdaa90274ae78be046f"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feceff971e2a2728c9ddd862a9dd6eb9f638377ad98438876c9aeac96c9482f5"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb0633b60e00a2b92314d0bf5bbc0da3d3320be72c7e3f4a9b19f4609dc2b2ab"}, - {file = "chroma_hnswlib-0.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a566abe32fab42291f766d667bdbfa234a7f457dcbd2ba19948b7a978c8ca624"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6be47853d9a58dedcfa90fc846af202b071f028bbafe1d8711bf64fe5a7f6111"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a7af35bdd39a88bffa49f9bb4bf4f9040b684514a024435a1ef5cdff980579d"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a53b1f1551f2b5ad94eb610207bde1bb476245fc5097a2bec2b476c653c58bde"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3085402958dbdc9ff5626ae58d696948e715aef88c86d1e3f9285a88f1afd3bc"}, - {file = "chroma_hnswlib-0.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:77326f658a15adfb806a16543f7db7c45f06fd787d699e643642d6bde8ed49c4"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:93b056ab4e25adab861dfef21e1d2a2756b18be5bc9c292aa252fa12bb44e6ae"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fe91f018b30452c16c811fd6c8ede01f84e5a9f3c23e0758775e57f1c3778871"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6c0e627476f0f4d9e153420d36042dd9c6c3671cfd1fe511c0253e38c2a1039"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e9796a4536b7de6c6d76a792ba03e08f5aaa53e97e052709568e50b4d20c04f"}, - {file = "chroma_hnswlib-0.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:d30e2db08e7ffdcc415bd072883a322de5995eb6ec28a8f8c054103bbd3ec1e0"}, - {file = "chroma_hnswlib-0.7.6.tar.gz", hash = "sha256:4dce282543039681160259d29fcde6151cc9106c6461e0485f57cdccd83059b7"}, -] - -[package.dependencies] -numpy = "*" - -[[package]] -name = "chromadb" -version = "0.6.3" -description = "Chroma." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "chromadb-0.6.3-py3-none-any.whl", hash = "sha256:4851258489a3612b558488d98d09ae0fe0a28d5cad6bd1ba64b96fdc419dc0e5"}, - {file = "chromadb-0.6.3.tar.gz", hash = "sha256:c8f34c0b704b9108b04491480a36d42e894a960429f87c6516027b5481d59ed3"}, -] - -[package.dependencies] -bcrypt = ">=4.0.1" -build = ">=1.0.3" -chroma-hnswlib = "0.7.6" -fastapi = ">=0.95.2" -grpcio = ">=1.58.0" -httpx = ">=0.27.0" -importlib-resources = "*" -kubernetes = ">=28.1.0" -mmh3 = ">=4.0.1" -numpy = ">=1.22.5" -onnxruntime = ">=1.14.1" -opentelemetry-api = ">=1.2.0" -opentelemetry-exporter-otlp-proto-grpc = ">=1.2.0" -opentelemetry-instrumentation-fastapi = ">=0.41b0" -opentelemetry-sdk = ">=1.2.0" -orjson = ">=3.9.12" -overrides = ">=7.3.1" -posthog = ">=2.4.0" -pydantic = ">=1.9" -pypika = ">=0.48.9" -PyYAML = ">=6.0.0" -rich = ">=10.11.0" -tenacity = ">=8.2.3" -tokenizers = ">=0.13.2" -tqdm = ">=4.65.0" -typer = ">=0.9.0" -typing_extensions = ">=4.5.0" -uvicorn = {version = ">=0.18.3", extras = ["standard"]} - [[package]] name = "click" version = "8.1.8" @@ -921,25 +734,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"}, ] -markers = {main = "os_name == \"nt\" or platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", metrics = "platform_system == \"Windows\""} - -[[package]] -name = "coloredlogs" -version = "15.0.1" -description = "Colored terminal output for Python's logging module" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -files = [ - {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, - {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, -] - -[package.dependencies] -humanfriendly = ">=9.1" - -[package.extras] -cron = ["capturer (>=2.4)"] +markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\"", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", metrics = "platform_system == \"Windows\""} [[package]] name = "configargparse" @@ -1035,108 +830,6 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1 [package.extras] toml = ["tomli ; python_full_version <= \"3.11.0a6\""] -[[package]] -name = "crewai" -version = "0.102.0" -description = "Cutting-edge framework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks." -optional = false -python-versions = "<3.13,>=3.10" -groups = ["main"] -files = [ - {file = "crewai-0.102.0-py3-none-any.whl", hash = "sha256:af9ce144fa48cb0314946b509b0d415f01af3066fa2cfb42f27e05df3fb6539e"}, - {file = "crewai-0.102.0.tar.gz", hash = "sha256:da3c10a126d1176265e1a649a00c2c462e947c91090595d05bd6b7d04e56bc74"}, -] - -[package.dependencies] -appdirs = ">=1.4.4" -auth0-python = ">=4.7.1" -blinker = ">=1.9.0" -chromadb = ">=0.5.23" -click = ">=8.1.7" -instructor = ">=1.3.3" -json-repair = ">=0.25.2" -json5 = ">=0.10.0" -jsonref = ">=1.1.0" -litellm = "1.60.2" -openai = ">=1.13.3" -openpyxl = ">=3.1.5" -opentelemetry-api = ">=1.22.0" -opentelemetry-exporter-otlp-proto-http = ">=1.22.0" -opentelemetry-sdk = ">=1.22.0" -pdfplumber = ">=0.11.4" -pydantic = ">=2.4.2" -python-dotenv = ">=1.0.0" -pyvis = ">=0.3.2" -regex = ">=2024.9.11" -tomli = ">=2.0.2" -tomli-w = ">=1.1.0" -uv = ">=0.4.25" - -[package.extras] -agentops = ["agentops (>=0.3.0)"] -docling = ["docling (>=2.12.0)"] -embeddings = ["tiktoken (>=0.7.0,<0.8.0)"] -fastembed = ["fastembed (>=0.4.1)"] -mem0 = ["mem0ai (>=0.1.29)"] -openpyxl = ["openpyxl (>=3.1.5)"] -pandas = ["pandas (>=2.2.3)"] -pdfplumber = ["pdfplumber (>=0.11.4)"] -tools = ["crewai-tools (>=0.36.0)"] - -[[package]] -name = "cryptography" -version = "44.0.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" -groups = ["main"] -files = [ - {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, - {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, - {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, - {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, - {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, - {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, - {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, - {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, - {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, - {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, - {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, - {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, - {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, - {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, -] - -[package.dependencies] -cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] -docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] -pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] -sdist = ["build (>=1.0.0)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] -test-randomorder = ["pytest-randomly"] - [[package]] name = "dataclasses-json" version = "0.6.7" @@ -1196,18 +889,6 @@ tests = ["Pillow (>=6.2.1)", "absl-py", "apache-beam (>=2.26.0,<2.44.0) ; python torch = ["torch"] vision = ["Pillow (>=6.2.1)"] -[[package]] -name = "decorator" -version = "5.1.1" -description = "Decorators for Humans" -optional = false -python-versions = ">=3.5" -groups = ["main"] -files = [ - {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, - {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, -] - [[package]] name = "deprecated" version = "1.2.18" @@ -1253,30 +934,6 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] -[[package]] -name = "docstring-parser" -version = "0.16" -description = "Parse Python docstrings in reST, Google and Numpydoc format" -optional = false -python-versions = ">=3.6,<4.0" -groups = ["main"] -files = [ - {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"}, - {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"}, -] - -[[package]] -name = "durationpy" -version = "0.9" -description = "Module for converting between datetime.timedelta and Go's Duration strings." -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "durationpy-0.9-py3-none-any.whl", hash = "sha256:e65359a7af5cedad07fb77a2dd3f390f8eb0b74cb845589fa6c057086834dd38"}, - {file = "durationpy-0.9.tar.gz", hash = "sha256:fd3feb0a69a0057d582ef643c355c40d2fa1c942191f914d12203b1a01ac722a"}, -] - [[package]] name = "ecologits" version = "0.5.2" @@ -1303,18 +960,6 @@ litellm = ["litellm (>=1.41.23,<2.0.0)", "rapidfuzz (>=3.9.6,<4.0.0)"] mistralai = ["mistralai (>=0.4.3,<2.0.0)"] openai = ["openai (>=1.12.0,<2.0.0)"] -[[package]] -name = "et-xmlfile" -version = "2.0.0" -description = "An implementation of lxml.xmlfile for the standard library" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, - {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, -] - [[package]] name = "eval-type-backport" version = "0.2.0" @@ -1346,21 +991,6 @@ files = [ [package.extras] test = ["pytest (>=6)"] -[[package]] -name = "executing" -version = "2.2.0" -description = "Get the currently executing AST node of a frame, and other information" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, - {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, -] - -[package.extras] -tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich ; python_version >= \"3.11\""] - [[package]] name = "fastapi" version = "0.115.8" @@ -1470,18 +1100,6 @@ files = [ Flask = ">=1.0.4" Werkzeug = ">=1.0.1" -[[package]] -name = "flatbuffers" -version = "25.2.10" -description = "The FlatBuffers serialization format for Python" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, - {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, -] - [[package]] name = "frozenlist" version = "1.5.0" @@ -1772,49 +1390,6 @@ benchmarks = ["httplib2", "httpx", "requests", "urllib3"] dev = ["dpkt", "pytest", "requests"] examples = ["oauth2"] -[[package]] -name = "google-auth" -version = "2.38.0" -description = "Google Authentication Library" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, - {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, -] - -[package.dependencies] -cachetools = ">=2.0.0,<6.0" -pyasn1-modules = ">=0.2.1" -rsa = ">=3.1.4,<5" - -[package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] -enterprise-cert = ["cryptography", "pyopenssl"] -pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] -pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] -reauth = ["pyu2f (>=0.1.5)"] -requests = ["requests (>=2.20.0,<3.0.0.dev0)"] - -[[package]] -name = "googleapis-common-protos" -version = "1.67.0" -description = "Common protobufs used in Google APIs" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "googleapis_common_protos-1.67.0-py2.py3-none-any.whl", hash = "sha256:579de760800d13616f51cf8be00c876f00a9f146d3e6510e19d1f4111758b741"}, - {file = "googleapis_common_protos-1.67.0.tar.gz", hash = "sha256:21398025365f138be356d5923e9168737d94d46a72aefee4a6110a1f23463c86"}, -] - -[package.dependencies] -protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" - -[package.extras] -grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] - [[package]] name = "greenlet" version = "3.1.1" @@ -2233,21 +1808,6 @@ testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gr torch = ["safetensors[torch]", "torch"] typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] -[[package]] -name = "humanfriendly" -version = "10.0" -description = "Human friendly output for text interfaces using Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -files = [ - {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, - {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, -] - -[package.dependencies] -pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} - [[package]] name = "hyperframe" version = "6.0.1" @@ -2296,26 +1856,6 @@ perf = ["ipython"] test = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] type = ["pytest-mypy"] -[[package]] -name = "importlib-resources" -version = "6.5.2" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, - {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] -type = ["pytest-mypy"] - [[package]] name = "iniconfig" version = "2.0.0" @@ -2328,79 +1868,6 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -[[package]] -name = "instructor" -version = "1.5.2" -description = "structured outputs for llm" -optional = false -python-versions = "<4.0,>=3.9" -groups = ["main"] -files = [ - {file = "instructor-1.5.2-py3-none-any.whl", hash = "sha256:da25abbf1ab792fb094992f1d9ce593e26fe458cb1f9a8e7ebf9d68f3f2c757a"}, - {file = "instructor-1.5.2.tar.gz", hash = "sha256:fdd5ccbca21b4c558a24e9ba12c84afd907e65153a39d035f47c25800011a977"}, -] - -[package.dependencies] -aiohttp = ">=3.9.1,<4.0.0" -docstring-parser = ">=0.16,<0.17" -jiter = ">=0.5.0,<0.6.0" -openai = ">=1.45.0,<2.0.0" -pydantic = ">=2.8.0,<3.0.0" -pydantic-core = ">=2.18.0,<3.0.0" -rich = ">=13.7.0,<14.0.0" -tenacity = ">=8.4.1,<9.0.0" -typer = ">=0.9.0,<1.0.0" - -[package.extras] -anthropic = ["anthropic (>=0.34.0,<0.35.0)", "xmltodict (>=0.13.0,<0.14.0)"] -cerebras-cloud-sdk = ["cerebras_cloud_sdk (>=1.5.0,<2.0.0)"] -cohere = ["cohere (>=5.1.8,<6.0.0)"] -google-generativeai = ["google-generativeai (>=0.8.2,<0.9.0)"] -groq = ["groq (>=0.4.2,<0.5.0)"] -litellm = ["litellm (>=1.35.31,<2.0.0)"] -mistralai = ["mistralai (>=1.0.3,<2.0.0)"] -test-docs = ["anthropic (>=0.34.0,<0.35.0)", "cohere (>=5.1.8,<6.0.0)", "diskcache (>=5.6.3,<6.0.0)", "fastapi (>=0.109.2,<0.110.0)", "groq (>=0.4.2,<0.5.0)", "litellm (>=1.35.31,<2.0.0)", "mistralai (>=1.0.3,<2.0.0)", "pandas (>=2.2.0,<3.0.0)", "pydantic_extra_types (>=2.6.0,<3.0.0)", "redis (>=5.0.1,<6.0.0)", "tabulate (>=0.9.0,<0.10.0)"] -vertexai = ["google-cloud-aiplatform (>=1.53.0,<2.0.0)", "jsonref (>=1.1.0,<2.0.0)"] - -[[package]] -name = "ipython" -version = "8.32.0" -description = "IPython: Productive Interactive Computing" -optional = false -python-versions = ">=3.10" -groups = ["main"] -files = [ - {file = "ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa"}, - {file = "ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt_toolkit = ">=3.0.41,<3.1.0" -pygments = ">=2.4.0" -stack_data = "*" -traitlets = ">=5.13.0" -typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} - -[package.extras] -all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] -black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli ; python_version < \"3.11\"", "typing_extensions"] -kernel = ["ipykernel"] -matplotlib = ["matplotlib"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["ipywidgets", "notebook"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] -test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] - [[package]] name = "isodate" version = "0.7.2" @@ -2440,26 +1907,6 @@ files = [ {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, ] -[[package]] -name = "jedi" -version = "0.19.2" -description = "An autocompletion tool for Python that can be used for text editors." -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, - {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, -] - -[package.dependencies] -parso = ">=0.8.4,<0.9.0" - -[package.extras] -docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] - [[package]] name = "jinja2" version = "3.1.6" @@ -2561,33 +2008,6 @@ files = [ {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] -[[package]] -name = "json-repair" -version = "0.39.0" -description = "A package to repair broken json strings" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "json_repair-0.39.0-py3-none-any.whl", hash = "sha256:a17838801dc2cbaa967ef3ee69ea8b0379819fec320e7e53fd062fda55080e76"}, - {file = "json_repair-0.39.0.tar.gz", hash = "sha256:d6fb9817e60d923d887814a78b5c174250b542c4b03ea548071b5acdfa8c1408"}, -] - -[[package]] -name = "json5" -version = "0.10.0" -description = "A Python implementation of the JSON5 data format." -optional = false -python-versions = ">=3.8.0" -groups = ["main"] -files = [ - {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, - {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, -] - -[package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] - [[package]] name = "jsonpatch" version = "1.33" @@ -2615,25 +2035,6 @@ files = [ {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"}, ] -[[package]] -name = "jsonpickle" -version = "4.0.2" -description = "jsonpickle encodes/decodes any Python object to/from JSON" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "jsonpickle-4.0.2-py3-none-any.whl", hash = "sha256:cd3c90d32a68dcaa7f0e4b918bda7d4bb61f3c03b182d82dae2caf9ded0ab6b3"}, - {file = "jsonpickle-4.0.2.tar.gz", hash = "sha256:3e650b9853adcdab9d9d62a88412b6d36e9a59ba423b01cacf0cd4ee80733aca"}, -] - -[package.extras] -cov = ["pytest-cov"] -dev = ["black", "pyupgrade"] -docs = ["furo", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -packaging = ["build", "setuptools (>=61.2)", "setuptools-scm[toml] (>=6.0)", "twine"] -testing = ["PyYAML", "atheris (>=2.3.0,<2.4.0) ; python_version < \"3.12\"", "bson", "ecdsa", "feedparser", "gmpy2", "numpy", "pandas", "pymongo", "pytest (>=6.0,!=8.1.*)", "pytest-benchmark", "pytest-benchmark[histogram]", "pytest-checkdocs (>=1.2.3)", "pytest-enabler (>=1.0.1)", "pytest-ruff (>=0.2.1)", "scikit-learn", "scipy (>=1.9.3) ; python_version > \"3.10\"", "scipy ; python_version <= \"3.10\"", "simplejson", "sqlalchemy", "ujson"] - [[package]] name = "jsonpointer" version = "3.0.0" @@ -2695,34 +2096,6 @@ files = [ [package.dependencies] referencing = ">=0.31.0" -[[package]] -name = "kubernetes" -version = "32.0.1" -description = "Kubernetes python client" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "kubernetes-32.0.1-py2.py3-none-any.whl", hash = "sha256:35282ab8493b938b08ab5526c7ce66588232df00ef5e1dbe88a419107dc10998"}, - {file = "kubernetes-32.0.1.tar.gz", hash = "sha256:42f43d49abd437ada79a79a16bd48a604d3471a117a8347e87db693f2ba0ba28"}, -] - -[package.dependencies] -certifi = ">=14.05.14" -durationpy = ">=0.7" -google-auth = ">=1.0.1" -oauthlib = ">=3.2.2" -python-dateutil = ">=2.5.3" -pyyaml = ">=5.4.1" -requests = "*" -requests-oauthlib = "*" -six = ">=1.9.0" -urllib3 = ">=1.24.2" -websocket-client = ">=0.32.0,<0.40.0 || >0.40.0,<0.41.dev0 || >=0.43.dev0" - -[package.extras] -adal = ["adal (>=1.0.2)"] - [[package]] name = "langchain" version = "0.3.19" @@ -2998,31 +2371,6 @@ tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing_extensions = {version = ">=4.6.0", markers = "python_version < \"3.11\""} Werkzeug = ">=2.0.0" -[[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, -] - -[package.dependencies] -mdurl = ">=0.1,<1.0" - -[package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "markupsafe" version = "3.0.2" @@ -3114,21 +2462,6 @@ dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.14)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"] tests = ["pytest", "simplejson"] -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -description = "Inline Matplotlib backend for Jupyter" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, - {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, -] - -[package.dependencies] -traitlets = "*" - [[package]] name = "mccabe" version = "0.7.0" @@ -3141,18 +2474,6 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - [[package]] name = "mistralai" version = "1.2.2" @@ -3176,117 +2497,6 @@ typing-inspect = ">=0.9.0,<0.10.0" [package.extras] gcp = ["google-auth (==2.27.0)", "requests (>=2.32.3,<3.0.0)"] -[[package]] -name = "mmh3" -version = "5.1.0" -description = "Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions." -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "mmh3-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eaf4ac5c6ee18ca9232238364d7f2a213278ae5ca97897cafaa123fcc7bb8bec"}, - {file = "mmh3-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:48f9aa8ccb9ad1d577a16104834ac44ff640d8de8c0caed09a2300df7ce8460a"}, - {file = "mmh3-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d4ba8cac21e1f2d4e436ce03a82a7f87cda80378691f760e9ea55045ec480a3d"}, - {file = "mmh3-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69281c281cb01994f054d862a6bb02a2e7acfe64917795c58934b0872b9ece4"}, - {file = "mmh3-5.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d05ed3962312fbda2a1589b97359d2467f677166952f6bd410d8c916a55febf"}, - {file = "mmh3-5.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78ae6a03f4cff4aa92ddd690611168856f8c33a141bd3e5a1e0a85521dc21ea0"}, - {file = "mmh3-5.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95f983535b39795d9fb7336438faae117424c6798f763d67c6624f6caf2c4c01"}, - {file = "mmh3-5.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d46fdd80d4c7ecadd9faa6181e92ccc6fe91c50991c9af0e371fdf8b8a7a6150"}, - {file = "mmh3-5.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0f16e976af7365ea3b5c425124b2a7f0147eed97fdbb36d99857f173c8d8e096"}, - {file = "mmh3-5.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6fa97f7d1e1f74ad1565127229d510f3fd65d931fdedd707c1e15100bc9e5ebb"}, - {file = "mmh3-5.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4052fa4a8561bd62648e9eb993c8f3af3bdedadf3d9687aa4770d10e3709a80c"}, - {file = "mmh3-5.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:3f0e8ae9f961037f812afe3cce7da57abf734285961fffbeff9a4c011b737732"}, - {file = "mmh3-5.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:99297f207db967814f1f02135bb7fe7628b9eacb046134a34e1015b26b06edce"}, - {file = "mmh3-5.1.0-cp310-cp310-win32.whl", hash = "sha256:2e6c8dc3631a5e22007fbdb55e993b2dbce7985c14b25b572dd78403c2e79182"}, - {file = "mmh3-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:e4e8c7ad5a4dddcfde35fd28ef96744c1ee0f9d9570108aa5f7e77cf9cfdf0bf"}, - {file = "mmh3-5.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:45da549269883208912868a07d0364e1418d8292c4259ca11699ba1b2475bd26"}, - {file = "mmh3-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b529dcda3f951ff363a51d5866bc6d63cf57f1e73e8961f864ae5010647079d"}, - {file = "mmh3-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db1079b3ace965e562cdfc95847312f9273eb2ad3ebea983435c8423e06acd7"}, - {file = "mmh3-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:22d31e3a0ff89b8eb3b826d6fc8e19532998b2aa6b9143698043a1268da413e1"}, - {file = "mmh3-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2139bfbd354cd6cb0afed51c4b504f29bcd687a3b1460b7e89498329cc28a894"}, - {file = "mmh3-5.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c8105c6a435bc2cd6ea2ef59558ab1a2976fd4a4437026f562856d08996673a"}, - {file = "mmh3-5.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57730067174a7f36fcd6ce012fe359bd5510fdaa5fe067bc94ed03e65dafb769"}, - {file = "mmh3-5.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bde80eb196d7fdc765a318604ded74a4378f02c5b46c17aa48a27d742edaded2"}, - {file = "mmh3-5.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9c8eddcb441abddeb419c16c56fd74b3e2df9e57f7aa2903221996718435c7a"}, - {file = "mmh3-5.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:99e07e4acafbccc7a28c076a847fb060ffc1406036bc2005acb1b2af620e53c3"}, - {file = "mmh3-5.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e25ba5b530e9a7d65f41a08d48f4b3fedc1e89c26486361166a5544aa4cad33"}, - {file = "mmh3-5.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bb9bf7475b4d99156ce2f0cf277c061a17560c8c10199c910a680869a278ddc7"}, - {file = "mmh3-5.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a1b0878dd281ea3003368ab53ff6f568e175f1b39f281df1da319e58a19c23a"}, - {file = "mmh3-5.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:25f565093ac8b8aefe0f61f8f95c9a9d11dd69e6a9e9832ff0d293511bc36258"}, - {file = "mmh3-5.1.0-cp311-cp311-win32.whl", hash = "sha256:1e3554d8792387eac73c99c6eaea0b3f884e7130eb67986e11c403e4f9b6d372"}, - {file = "mmh3-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8ad777a48197882492af50bf3098085424993ce850bdda406a358b6ab74be759"}, - {file = "mmh3-5.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f29dc4efd99bdd29fe85ed6c81915b17b2ef2cf853abf7213a48ac6fb3eaabe1"}, - {file = "mmh3-5.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45712987367cb9235026e3cbf4334670522a97751abfd00b5bc8bfa022c3311d"}, - {file = "mmh3-5.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b1020735eb35086ab24affbea59bb9082f7f6a0ad517cb89f0fc14f16cea4dae"}, - {file = "mmh3-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:babf2a78ce5513d120c358722a2e3aa7762d6071cd10cede026f8b32452be322"}, - {file = "mmh3-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4f47f58cd5cbef968c84a7c1ddc192fef0a36b48b0b8a3cb67354531aa33b00"}, - {file = "mmh3-5.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2044a601c113c981f2c1e14fa33adc9b826c9017034fe193e9eb49a6882dbb06"}, - {file = "mmh3-5.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c94d999c9f2eb2da44d7c2826d3fbffdbbbbcde8488d353fee7c848ecc42b968"}, - {file = "mmh3-5.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a015dcb24fa0c7a78f88e9419ac74f5001c1ed6a92e70fd1803f74afb26a4c83"}, - {file = "mmh3-5.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:457da019c491a2d20e2022c7d4ce723675e4c081d9efc3b4d8b9f28a5ea789bd"}, - {file = "mmh3-5.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71408579a570193a4ac9c77344d68ddefa440b00468a0b566dcc2ba282a9c559"}, - {file = "mmh3-5.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8b3a04bc214a6e16c81f02f855e285c6df274a2084787eeafaa45f2fbdef1b63"}, - {file = "mmh3-5.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:832dae26a35514f6d3c1e267fa48e8de3c7b978afdafa0529c808ad72e13ada3"}, - {file = "mmh3-5.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bf658a61fc92ef8a48945ebb1076ef4ad74269e353fffcb642dfa0890b13673b"}, - {file = "mmh3-5.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3313577453582b03383731b66447cdcdd28a68f78df28f10d275d7d19010c1df"}, - {file = "mmh3-5.1.0-cp312-cp312-win32.whl", hash = "sha256:1d6508504c531ab86c4424b5a5ff07c1132d063863339cf92f6657ff7a580f76"}, - {file = "mmh3-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:aa75981fcdf3f21759d94f2c81b6a6e04a49dfbcdad88b152ba49b8e20544776"}, - {file = "mmh3-5.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4c1a76808dfea47f7407a0b07aaff9087447ef6280716fd0783409b3088bb3c"}, - {file = "mmh3-5.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a523899ca29cfb8a5239618474a435f3d892b22004b91779fcb83504c0d5b8c"}, - {file = "mmh3-5.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:17cef2c3a6ca2391ca7171a35ed574b5dab8398163129a3e3a4c05ab85a4ff40"}, - {file = "mmh3-5.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:52e12895b30110f3d89dae59a888683cc886ed0472dd2eca77497edef6161997"}, - {file = "mmh3-5.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d6719045cda75c3f40397fc24ab67b18e0cb8f69d3429ab4c39763c4c608dd"}, - {file = "mmh3-5.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d19fa07d303a91f8858982c37e6939834cb11893cb3ff20e6ee6fa2a7563826a"}, - {file = "mmh3-5.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31b47a620d622fbde8ca1ca0435c5d25de0ac57ab507209245e918128e38e676"}, - {file = "mmh3-5.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f810647c22c179b6821079f7aa306d51953ac893587ee09cf1afb35adf87cb"}, - {file = "mmh3-5.1.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6128b610b577eed1e89ac7177ab0c33d06ade2aba93f5c89306032306b5f1c6"}, - {file = "mmh3-5.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1e550a45d2ff87a1c11b42015107f1778c93f4c6f8e731bf1b8fa770321b8cc4"}, - {file = "mmh3-5.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:785ae09276342f79fd8092633e2d52c0f7c44d56e8cfda8274ccc9b76612dba2"}, - {file = "mmh3-5.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0f4be3703a867ef976434afd3661a33884abe73ceb4ee436cac49d3b4c2aaa7b"}, - {file = "mmh3-5.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e513983830c4ff1f205ab97152a0050cf7164f1b4783d702256d39c637b9d107"}, - {file = "mmh3-5.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9135c300535c828c0bae311b659f33a31c941572eae278568d1a953c4a57b59"}, - {file = "mmh3-5.1.0-cp313-cp313-win32.whl", hash = "sha256:c65dbd12885a5598b70140d24de5839551af5a99b29f9804bb2484b29ef07692"}, - {file = "mmh3-5.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:10db7765201fc65003fa998faa067417ef6283eb5f9bba8f323c48fd9c33e91f"}, - {file = "mmh3-5.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:b22fe2e54be81f6c07dcb36b96fa250fb72effe08aa52fbb83eade6e1e2d5fd7"}, - {file = "mmh3-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:166b67749a1d8c93b06f5e90576f1ba838a65c8e79f28ffd9dfafba7c7d0a084"}, - {file = "mmh3-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adba83c7ba5cc8ea201ee1e235f8413a68e7f7b8a657d582cc6c6c9d73f2830e"}, - {file = "mmh3-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a61f434736106804eb0b1612d503c4e6eb22ba31b16e6a2f987473de4226fa55"}, - {file = "mmh3-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba9ce59816b30866093f048b3312c2204ff59806d3a02adee71ff7bd22b87554"}, - {file = "mmh3-5.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd51597bef1e503363b05cb579db09269e6e6c39d419486626b255048daf545b"}, - {file = "mmh3-5.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d51a1ed642d3fb37b8f4cab966811c52eb246c3e1740985f701ef5ad4cdd2145"}, - {file = "mmh3-5.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:709bfe81c53bf8a3609efcbd65c72305ade60944f66138f697eefc1a86b6e356"}, - {file = "mmh3-5.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e01a9b0092b6f82e861137c8e9bb9899375125b24012eb5219e61708be320032"}, - {file = "mmh3-5.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:27e46a2c13c9a805e03c9ec7de0ca8e096794688ab2125bdce4229daf60c4a56"}, - {file = "mmh3-5.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5766299c1d26f6bfd0a638e070bd17dbd98d4ccb067d64db3745bf178e700ef0"}, - {file = "mmh3-5.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7785205e3e4443fdcbb73766798c7647f94c2f538b90f666688f3e757546069e"}, - {file = "mmh3-5.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:8e574fbd39afb433b3ab95683b1b4bf18313dc46456fc9daaddc2693c19ca565"}, - {file = "mmh3-5.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1b6727a5a20e32cbf605743749f3862abe5f5e097cbf2afc7be5aafd32a549ae"}, - {file = "mmh3-5.1.0-cp39-cp39-win32.whl", hash = "sha256:d6eaa711d4b9220fe5252032a44bf68e5dcfb7b21745a96efc9e769b0dd57ec2"}, - {file = "mmh3-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:49d444913f6c02980e5241a53fe9af2338f2043d6ce5b6f5ea7d302c52c604ac"}, - {file = "mmh3-5.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:0daaeaedd78773b70378f2413c7d6b10239a75d955d30d54f460fb25d599942d"}, - {file = "mmh3-5.1.0.tar.gz", hash = "sha256:136e1e670500f177f49ec106a4ebf0adf20d18d96990cc36ea492c651d2b406c"}, -] - -[package.extras] -benchmark = ["pymmh3 (==0.0.5)", "pyperf (==2.8.1)", "xxhash (==3.5.0)"] -docs = ["myst-parser (==4.0.0)", "shibuya (==2024.12.21)", "sphinx (==8.1.3)", "sphinx-copybutton (==0.5.2)"] -lint = ["black (==24.10.0)", "clang-format (==19.1.7)", "isort (==5.13.2)", "pylint (==3.3.3)"] -plot = ["matplotlib (==3.10.0)", "pandas (==2.2.3)"] -test = ["pytest (==8.3.4)", "pytest-sugar (==1.0.0)"] -type = ["mypy (==1.14.1)"] - -[[package]] -name = "monotonic" -version = "1.6" -description = "An implementation of time.monotonic() for Python 2 & < 3.3" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"}, - {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"}, -] - [[package]] name = "mpmath" version = "1.3.0" @@ -3603,62 +2813,6 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] -[[package]] -name = "oauthlib" -version = "3.2.2" -description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, - {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, -] - -[package.extras] -rsa = ["cryptography (>=3.0.0)"] -signals = ["blinker (>=1.4.0)"] -signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] - -[[package]] -name = "onnxruntime" -version = "1.20.1" -description = "ONNX Runtime is a runtime accelerator for Machine Learning models" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "onnxruntime-1.20.1-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:e50ba5ff7fed4f7d9253a6baf801ca2883cc08491f9d32d78a80da57256a5439"}, - {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b2908b50101a19e99c4d4e97ebb9905561daf61829403061c1adc1b588bc0de"}, - {file = "onnxruntime-1.20.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d82daaec24045a2e87598b8ac2b417b1cce623244e80e663882e9fe1aae86410"}, - {file = "onnxruntime-1.20.1-cp310-cp310-win32.whl", hash = "sha256:4c4b251a725a3b8cf2aab284f7d940c26094ecd9d442f07dd81ab5470e99b83f"}, - {file = "onnxruntime-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3b616bb53a77a9463707bb313637223380fc327f5064c9a782e8ec69c22e6a2"}, - {file = "onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b"}, - {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7"}, - {file = "onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc"}, - {file = "onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41"}, - {file = "onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221"}, - {file = "onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9"}, - {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172"}, - {file = "onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e"}, - {file = "onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120"}, - {file = "onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb"}, - {file = "onnxruntime-1.20.1-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:cc01437a32d0042b606f462245c8bbae269e5442797f6213e36ce61d5abdd8cc"}, - {file = "onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb44b08e017a648924dbe91b82d89b0c105b1adcfe31e90d1dc06b8677ad37be"}, - {file = "onnxruntime-1.20.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bda6aebdf7917c1d811f21d41633df00c58aff2bef2f598f69289c1f1dabc4b3"}, - {file = "onnxruntime-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:d30367df7e70f1d9fc5a6a68106f5961686d39b54d3221f760085524e8d38e16"}, - {file = "onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9158465745423b2b5d97ed25aa7740c7d38d2993ee2e5c3bfacb0c4145c49d8"}, - {file = "onnxruntime-1.20.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0df6f2df83d61f46e842dbcde610ede27218947c33e994545a22333491e72a3b"}, -] - -[package.dependencies] -coloredlogs = "*" -flatbuffers = "*" -numpy = ">=1.21.6" -packaging = "*" -protobuf = "*" -sympy = "*" - [[package]] name = "openai" version = "1.63.2" @@ -3685,215 +2839,21 @@ typing-extensions = ">=4.11,<5" datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] realtime = ["websockets (>=13,<15)"] -[[package]] -name = "openpyxl" -version = "3.1.5" -description = "A Python library to read/write Excel 2010 xlsx/xlsm files" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, - {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, -] - -[package.dependencies] -et-xmlfile = "*" - [[package]] name = "opentelemetry-api" -version = "1.30.0" +version = "1.31.1" description = "OpenTelemetry Python API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09"}, - {file = "opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -importlib-metadata = ">=6.0,<=8.5.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.30.0" -description = "OpenTelemetry Protobuf encoding" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_exporter_otlp_proto_common-1.30.0-py3-none-any.whl", hash = "sha256:5468007c81aa9c44dc961ab2cf368a29d3475977df83b4e30aeed42aa7bc3b38"}, - {file = "opentelemetry_exporter_otlp_proto_common-1.30.0.tar.gz", hash = "sha256:ddbfbf797e518411857d0ca062c957080279320d6235a279f7b64ced73c13897"}, -] - -[package.dependencies] -opentelemetry-proto = "1.30.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.30.0" -description = "OpenTelemetry Collector Protobuf over gRPC Exporter" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0-py3-none-any.whl", hash = "sha256:2906bcae3d80acc54fd1ffcb9e44d324e8631058b502ebe4643ca71d1ff30830"}, - {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0.tar.gz", hash = "sha256:d0f10f0b9b9a383b7d04a144d01cb280e70362cccc613987e234183fd1f01177"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -grpcio = ">=1.63.2,<2.0.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.30.0" -opentelemetry-proto = "1.30.0" -opentelemetry-sdk = ">=1.30.0,<1.31.0" - -[[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.30.0" -description = "OpenTelemetry Collector Protobuf over HTTP Exporter" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_exporter_otlp_proto_http-1.30.0-py3-none-any.whl", hash = "sha256:9578e790e579931c5ffd50f1e6975cbdefb6a0a0a5dea127a6ae87df10e0a589"}, - {file = "opentelemetry_exporter_otlp_proto_http-1.30.0.tar.gz", hash = "sha256:c3ae75d4181b1e34a60662a6814d0b94dd33b628bee5588a878bed92cee6abdc"}, -] - -[package.dependencies] -deprecated = ">=1.2.6" -googleapis-common-protos = ">=1.52,<2.0" -opentelemetry-api = ">=1.15,<2.0" -opentelemetry-exporter-otlp-proto-common = "1.30.0" -opentelemetry-proto = "1.30.0" -opentelemetry-sdk = ">=1.30.0,<1.31.0" -requests = ">=2.7,<3.0" - -[[package]] -name = "opentelemetry-instrumentation" -version = "0.51b0" -description = "Instrumentation Tools & Auto Instrumentation for OpenTelemetry Python" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_instrumentation-0.51b0-py3-none-any.whl", hash = "sha256:c6de8bd26b75ec8b0e54dff59e198946e29de6a10ec65488c357d4b34aa5bdcf"}, - {file = "opentelemetry_instrumentation-0.51b0.tar.gz", hash = "sha256:4ca266875e02f3988536982467f7ef8c32a38b8895490ddce9ad9604649424fa"}, -] - -[package.dependencies] -opentelemetry-api = ">=1.4,<2.0" -opentelemetry-semantic-conventions = "0.51b0" -packaging = ">=18.0" -wrapt = ">=1.0.0,<2.0.0" - -[[package]] -name = "opentelemetry-instrumentation-asgi" -version = "0.51b0" -description = "ASGI instrumentation for OpenTelemetry" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_instrumentation_asgi-0.51b0-py3-none-any.whl", hash = "sha256:e8072993db47303b633c6ec1bc74726ba4d32bd0c46c28dfadf99f79521a324c"}, - {file = "opentelemetry_instrumentation_asgi-0.51b0.tar.gz", hash = "sha256:b3fe97c00f0bfa934371a69674981d76591c68d937b6422a5716ca21081b4148"}, -] - -[package.dependencies] -asgiref = ">=3.0,<4.0" -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.51b0" -opentelemetry-semantic-conventions = "0.51b0" -opentelemetry-util-http = "0.51b0" - -[package.extras] -instruments = ["asgiref (>=3.0,<4.0)"] - -[[package]] -name = "opentelemetry-instrumentation-fastapi" -version = "0.51b0" -description = "OpenTelemetry FastAPI Instrumentation" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_instrumentation_fastapi-0.51b0-py3-none-any.whl", hash = "sha256:10513bbc11a1188adb9c1d2c520695f7a8f2b5f4de14e8162098035901cd6493"}, - {file = "opentelemetry_instrumentation_fastapi-0.51b0.tar.gz", hash = "sha256:1624e70f2f4d12ceb792d8a0c331244cd6723190ccee01336273b4559bc13abc"}, -] - -[package.dependencies] -opentelemetry-api = ">=1.12,<2.0" -opentelemetry-instrumentation = "0.51b0" -opentelemetry-instrumentation-asgi = "0.51b0" -opentelemetry-semantic-conventions = "0.51b0" -opentelemetry-util-http = "0.51b0" - -[package.extras] -instruments = ["fastapi (>=0.58,<1.0)"] - -[[package]] -name = "opentelemetry-proto" -version = "1.30.0" -description = "OpenTelemetry Python Proto" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_proto-1.30.0-py3-none-any.whl", hash = "sha256:c6290958ff3ddacc826ca5abbeb377a31c2334387352a259ba0df37c243adc11"}, - {file = "opentelemetry_proto-1.30.0.tar.gz", hash = "sha256:afe5c9c15e8b68d7c469596e5b32e8fc085eb9febdd6fb4e20924a93a0389179"}, -] - -[package.dependencies] -protobuf = ">=5.0,<6.0" - -[[package]] -name = "opentelemetry-sdk" -version = "1.30.0" -description = "OpenTelemetry Python SDK" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091"}, - {file = "opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18"}, -] - -[package.dependencies] -opentelemetry-api = "1.30.0" -opentelemetry-semantic-conventions = "0.51b0" -typing-extensions = ">=3.7.4" - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.51b0" -description = "OpenTelemetry Semantic Conventions" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae"}, - {file = "opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47"}, + {file = "opentelemetry_api-1.31.1-py3-none-any.whl", hash = "sha256:1511a3f470c9c8a32eeea68d4ea37835880c0eed09dd1a0187acc8b1301da0a1"}, + {file = "opentelemetry_api-1.31.1.tar.gz", hash = "sha256:137ad4b64215f02b3000a0292e077641c8611aab636414632a9b9068593b7e91"}, ] [package.dependencies] deprecated = ">=1.2.6" -opentelemetry-api = "1.30.0" - -[[package]] -name = "opentelemetry-util-http" -version = "0.51b0" -description = "Web util for OpenTelemetry" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "opentelemetry_util_http-0.51b0-py3-none-any.whl", hash = "sha256:0561d7a6e9c422b9ef9ae6e77eafcfcd32a2ab689f5e801475cbb67f189efa20"}, - {file = "opentelemetry_util_http-0.51b0.tar.gz", hash = "sha256:05edd19ca1cc3be3968b1e502fd94816901a365adbeaab6b6ddb974384d3a0b9"}, -] +importlib-metadata = ">=6.0,<8.7.0" [[package]] name = "orjson" @@ -3901,7 +2861,7 @@ version = "3.10.11" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" optional = false python-versions = ">=3.8" -groups = ["main", "metrics"] +groups = ["metrics"] files = [ {file = "orjson-3.10.11-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6dade64687f2bd7c090281652fe18f1151292d567a9302b34c2dbb92a3872f1f"}, {file = "orjson-3.10.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82f07c550a6ccd2b9290849b22316a609023ed851a87ea888c0456485a7d196a"}, @@ -3963,18 +2923,6 @@ files = [ {file = "orjson-3.10.11.tar.gz", hash = "sha256:e35b6d730de6384d5b2dab5fd23f0d76fae8bbc8c353c2f78210aa5fa4beb3ef"}, ] -[[package]] -name = "overrides" -version = "7.7.0" -description = "A decorator to automatically detect mismatch when overriding a method." -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, - {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, -] - [[package]] name = "packaging" version = "24.2" @@ -4074,22 +3022,6 @@ sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-d test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] -[[package]] -name = "parso" -version = "0.8.4" -description = "A Python Parser" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, -] - -[package.extras] -qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["docopt", "pytest"] - [[package]] name = "pathspec" version = "0.12.1" @@ -4102,60 +3034,6 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[[package]] -name = "pdfminer-six" -version = "20231228" -description = "PDF parser and analyzer" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "pdfminer.six-20231228-py3-none-any.whl", hash = "sha256:e8d3c3310e6fbc1fe414090123ab01351634b4ecb021232206c4c9a8ca3e3b8f"}, - {file = "pdfminer.six-20231228.tar.gz", hash = "sha256:6004da3ad1a7a4d45930cb950393df89b068e73be365a6ff64a838d37bcb08c4"}, -] - -[package.dependencies] -charset-normalizer = ">=2.0.0" -cryptography = ">=36.0.0" - -[package.extras] -dev = ["black", "mypy (==0.931)", "nox", "pytest"] -docs = ["sphinx", "sphinx-argparse"] -image = ["Pillow"] - -[[package]] -name = "pdfplumber" -version = "0.11.5" -description = "Plumb a PDF for detailed information about each char, rectangle, and line." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pdfplumber-0.11.5-py3-none-any.whl", hash = "sha256:a6e0921a57e0ef7356001a0fd811250b0e37a0b42630a922ee48f55cdd534070"}, - {file = "pdfplumber-0.11.5.tar.gz", hash = "sha256:dadd81b62a0b23e078cdd89de26e013850d4daf5690fcf46dec396b07e6737d6"}, -] - -[package.dependencies] -"pdfminer.six" = "20231228" -Pillow = ">=9.1" -pypdfium2 = ">=4.18.0" - -[[package]] -name = "pexpect" -version = "4.9.0" -description = "Pexpect allows easy control of interactive console applications." -optional = false -python-versions = "*" -groups = ["main"] -markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" -files = [ - {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, - {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, -] - -[package.dependencies] -ptyprocess = ">=0.5" - [[package]] name = "pillow" version = "11.0.0" @@ -4302,31 +3180,6 @@ docs = ["sphinx (>=1.7.1)"] redis = ["redis"] tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] -[[package]] -name = "posthog" -version = "3.14.2" -description = "Integrate PostHog into any python application." -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "posthog-3.14.2-py2.py3-none-any.whl", hash = "sha256:f50d41dfe116ace4971b304518de57e0de34a936cdfdff84efed0dd993dfbcda"}, - {file = "posthog-3.14.2.tar.gz", hash = "sha256:b9794aa5b316767cc7f8685292f8ff3e0df8b01fcaf2905afe2efa9696cb5c77"}, -] - -[package.dependencies] -backoff = ">=1.10.0" -monotonic = ">=1.5" -python-dateutil = ">2.1" -requests = ">=2.7,<3.0" -six = ">=1.5" - -[package.extras] -dev = ["black", "django-stubs", "flake8", "flake8-print", "isort", "lxml", "mypy", "mypy-baseline", "pre-commit", "pydantic", "types-mock", "types-python-dateutil", "types-requests", "types-setuptools", "types-six"] -langchain = ["langchain (>=0.2.0)"] -sentry = ["django", "sentry-sdk"] -test = ["anthropic", "coverage", "django", "flake8", "freezegun (==1.5.1)", "langchain-anthropic (>=0.2.0)", "langchain-community (>=0.2.0)", "langchain-openai (>=0.2.0)", "langgraph", "mock (>=2.0.0)", "openai", "pydantic", "pylint", "pytest", "pytest-asyncio", "pytest-timeout"] - [[package]] name = "prettytable" version = "3.12.0" @@ -4345,21 +3198,6 @@ wcwidth = "*" [package.extras] tests = ["pytest", "pytest-cov", "pytest-lazy-fixtures"] -[[package]] -name = "prompt-toolkit" -version = "3.0.50" -description = "Library for building powerful interactive command lines in Python" -optional = false -python-versions = ">=3.8.0" -groups = ["main"] -files = [ - {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, - {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, -] - -[package.dependencies] -wcwidth = "*" - [[package]] name = "propcache" version = "0.2.0" @@ -4470,23 +3308,23 @@ files = [ [[package]] name = "protobuf" -version = "5.28.3" +version = "5.29.4" description = "" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "protobuf-5.28.3-cp310-abi3-win32.whl", hash = "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24"}, - {file = "protobuf-5.28.3-cp310-abi3-win_amd64.whl", hash = "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868"}, - {file = "protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135"}, - {file = "protobuf-5.28.3-cp38-cp38-win32.whl", hash = "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548"}, - {file = "protobuf-5.28.3-cp38-cp38-win_amd64.whl", hash = "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b"}, - {file = "protobuf-5.28.3-cp39-cp39-win32.whl", hash = "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535"}, - {file = "protobuf-5.28.3-cp39-cp39-win_amd64.whl", hash = "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36"}, - {file = "protobuf-5.28.3-py3-none-any.whl", hash = "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed"}, - {file = "protobuf-5.28.3.tar.gz", hash = "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b"}, + {file = "protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7"}, + {file = "protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d"}, + {file = "protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e"}, + {file = "protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922"}, + {file = "protobuf-5.29.4-cp38-cp38-win32.whl", hash = "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de"}, + {file = "protobuf-5.29.4-cp38-cp38-win_amd64.whl", hash = "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68"}, + {file = "protobuf-5.29.4-cp39-cp39-win32.whl", hash = "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe"}, + {file = "protobuf-5.29.4-cp39-cp39-win_amd64.whl", hash = "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812"}, + {file = "protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862"}, + {file = "protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99"}, ] [[package]] @@ -4574,7 +3412,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, - {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, @@ -4597,34 +3434,6 @@ files = [ {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -optional = false -python-versions = "*" -groups = ["main"] -markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" -files = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -description = "Safely evaluate AST nodes without side effects" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, - {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, -] - -[package.extras] -tests = ["pytest"] - [[package]] name = "pyarrow" version = "18.0.0" @@ -4680,33 +3489,6 @@ files = [ [package.extras] test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] -[[package]] -name = "pyasn1" -version = "0.6.1" -description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, - {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.1" -description = "A collection of ASN.1-based protocols modules" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, - {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6,<0.7.0" - [[package]] name = "pycodestyle" version = "2.11.1" @@ -4725,131 +3507,142 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["main", "metrics"] +groups = ["metrics"] +markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\" or implementation_name == \"pypy\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "platform_python_implementation != \"PyPy\"", metrics = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\" or implementation_name == \"pypy\""} [[package]] name = "pydantic" -version = "2.9.2" +version = "2.11.1" description = "Data validation using Python type hints" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "metrics"] files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, + {file = "pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8"}, + {file = "pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} +pydantic-core = "2.33.0" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and sys_platform == \"win32\""] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.33.0" description = "Core functionality for Pydantic validation and serialization" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "metrics"] files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71dffba8fe9ddff628c68f3abd845e91b028361d43c5f8e7b3f8b91d7d85413e"}, + {file = "pydantic_core-2.33.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:abaeec1be6ed535a5d7ffc2e6c390083c425832b20efd621562fbb5bff6dc518"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759871f00e26ad3709efc773ac37b4d571de065f9dfb1778012908bcc36b3a73"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dcfebee69cd5e1c0b76a17e17e347c84b00acebb8dd8edb22d4a03e88e82a207"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1262b912435a501fa04cd213720609e2cefa723a07c92017d18693e69bf00b"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4726f1f3f42d6a25678c67da3f0b10f148f5655813c5aca54b0d1742ba821b8f"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e790954b5093dff1e3a9a2523fddc4e79722d6f07993b4cd5547825c3cbf97b5"}, + {file = "pydantic_core-2.33.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34e7fb3abe375b5c4e64fab75733d605dda0f59827752debc99c17cb2d5f3276"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ecb158fb9b9091b515213bed3061eb7deb1d3b4e02327c27a0ea714ff46b0760"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:4d9149e7528af8bbd76cc055967e6e04617dcb2a2afdaa3dea899406c5521faa"}, + {file = "pydantic_core-2.33.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e81a295adccf73477220e15ff79235ca9dcbcee4be459eb9d4ce9a2763b8386c"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win32.whl", hash = "sha256:f22dab23cdbce2005f26a8f0c71698457861f97fc6318c75814a50c75e87d025"}, + {file = "pydantic_core-2.33.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cb2390355ba084c1ad49485d18449b4242da344dea3e0fe10babd1f0db7dcfc"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a608a75846804271cf9c83e40bbb4dab2ac614d33c6fd5b0c6187f53f5c593ef"}, + {file = "pydantic_core-2.33.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e1c69aa459f5609dec2fa0652d495353accf3eda5bdb18782bc5a2ae45c9273a"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9ec80eb5a5f45a2211793f1c4aeddff0c3761d1c70d684965c1807e923a588b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e925819a98318d17251776bd3d6aa9f3ff77b965762155bdad15d1a9265c4cfd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bf68bb859799e9cec3d9dd8323c40c00a254aabb56fe08f907e437005932f2b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b2ea72dea0825949a045fa4071f6d5b3d7620d2a208335207793cf29c5a182d"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1583539533160186ac546b49f5cde9ffc928062c96920f58bd95de32ffd7bffd"}, + {file = "pydantic_core-2.33.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:23c3e77bf8a7317612e5c26a3b084c7edeb9552d645742a54a5867635b4f2453"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7a7f2a3f628d2f7ef11cb6188bcf0b9e1558151d511b974dfea10a49afe192b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:f1fb026c575e16f673c61c7b86144517705865173f3d0907040ac30c4f9f5915"}, + {file = "pydantic_core-2.33.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:635702b2fed997e0ac256b2cfbdb4dd0bf7c56b5d8fba8ef03489c03b3eb40e2"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win32.whl", hash = "sha256:07b4ced28fccae3f00626eaa0c4001aa9ec140a29501770a88dbbb0966019a86"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_amd64.whl", hash = "sha256:4927564be53239a87770a5f86bdc272b8d1fbb87ab7783ad70255b4ab01aa25b"}, + {file = "pydantic_core-2.33.0-cp311-cp311-win_arm64.whl", hash = "sha256:69297418ad644d521ea3e1aa2e14a2a422726167e9ad22b89e8f1130d68e1e9a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6c32a40712e3662bebe524abe8abb757f2fa2000028d64cc5a1006016c06af43"}, + {file = "pydantic_core-2.33.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ec86b5baa36f0a0bfb37db86c7d52652f8e8aa076ab745ef7725784183c3fdd"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4deac83a8cc1d09e40683be0bc6d1fa4cde8df0a9bf0cda5693f9b0569ac01b6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:175ab598fb457a9aee63206a1993874badf3ed9a456e0654273e56f00747bbd6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f36afd0d56a6c42cf4e8465b6441cf546ed69d3a4ec92724cc9c8c61bd6ecf4"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a98257451164666afafc7cbf5fb00d613e33f7e7ebb322fbcd99345695a9a61"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecc6d02d69b54a2eb83ebcc6f29df04957f734bcf309d346b4f83354d8376862"}, + {file = "pydantic_core-2.33.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a69b7596c6603afd049ce7f3835bcf57dd3892fc7279f0ddf987bebed8caa5a"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea30239c148b6ef41364c6f51d103c2988965b643d62e10b233b5efdca8c0099"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:abfa44cf2f7f7d7a199be6c6ec141c9024063205545aa09304349781b9a125e6"}, + {file = "pydantic_core-2.33.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20d4275f3c4659d92048c70797e5fdc396c6e4446caf517ba5cad2db60cd39d3"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win32.whl", hash = "sha256:918f2013d7eadea1d88d1a35fd4a1e16aaf90343eb446f91cb091ce7f9b431a2"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_amd64.whl", hash = "sha256:aec79acc183865bad120b0190afac467c20b15289050648b876b07777e67ea48"}, + {file = "pydantic_core-2.33.0-cp312-cp312-win_arm64.whl", hash = "sha256:5461934e895968655225dfa8b3be79e7e927e95d4bd6c2d40edd2fa7052e71b6"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555"}, + {file = "pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9"}, + {file = "pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3"}, + {file = "pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606"}, + {file = "pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b"}, + {file = "pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7c9c84749f5787781c1c45bb99f433402e484e515b40675a5d121ea14711cf61"}, + {file = "pydantic_core-2.33.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:64672fa888595a959cfeff957a654e947e65bbe1d7d82f550417cbd6898a1d6b"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bc7367c0961dec292244ef2549afa396e72e28cc24706210bd44d947582c59"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce72d46eb201ca43994303025bd54d8a35a3fc2a3495fac653d6eb7205ce04f4"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14229c1504287533dbf6b1fc56f752ce2b4e9694022ae7509631ce346158de11"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:085d8985b1c1e48ef271e98a658f562f29d89bda98bf120502283efbc87313eb"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31860fbda80d8f6828e84b4a4d129fd9c4535996b8249cfb8c720dc2a1a00bb8"}, + {file = "pydantic_core-2.33.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f200b2f20856b5a6c3a35f0d4e344019f805e363416e609e9b47c552d35fd5ea"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f72914cfd1d0176e58ddc05c7a47674ef4222c8253bf70322923e73e14a4ac3"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:91301a0980a1d4530d4ba7e6a739ca1a6b31341252cb709948e0aca0860ce0ae"}, + {file = "pydantic_core-2.33.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7419241e17c7fbe5074ba79143d5523270e04f86f1b3a0dff8df490f84c8273a"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win32.whl", hash = "sha256:7a25493320203005d2a4dac76d1b7d953cb49bce6d459d9ae38e30dd9f29bc9c"}, + {file = "pydantic_core-2.33.0-cp39-cp39-win_amd64.whl", hash = "sha256:82a4eba92b7ca8af1b7d5ef5f3d9647eee94d1f74d21ca7c21e3a2b92e008358"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e2762c568596332fdab56b07060c8ab8362c56cf2a339ee54e491cd503612c50"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bf637300ff35d4f59c006fff201c510b2b5e745b07125458a5389af3c0dff8c"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c151ce3d59ed56ebd7ce9ce5986a409a85db697d25fc232f8e81f195aa39a1"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee65f0cc652261744fd07f2c6e6901c914aa6c5ff4dcfaf1136bc394d0dd26b"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:024d136ae44d233e6322027bbf356712b3940bee816e6c948ce4b90f18471b3d"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e37f10f6d4bc67c58fbd727108ae1d8b92b397355e68519f1e4a7babb1473442"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:502ed542e0d958bd12e7c3e9a015bce57deaf50eaa8c2e1c439b512cb9db1e3a"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:715c62af74c236bf386825c0fdfa08d092ab0f191eb5b4580d11c3189af9d330"}, + {file = "pydantic_core-2.33.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bccc06fa0372151f37f6b69834181aa9eb57cf8665ed36405fb45fbf6cac3bae"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5d8dc9f63a26f7259b57f46a7aab5af86b2ad6fbe48487500bb1f4b27e051e4c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30369e54d6d0113d2aa5aee7a90d17f225c13d87902ace8fcd7bbf99b19124db"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3eb479354c62067afa62f53bb387827bee2f75c9c79ef25eef6ab84d4b1ae3b"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0310524c833d91403c960b8a3cf9f46c282eadd6afd276c8c5edc617bd705dc9"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eddb18a00bbb855325db27b4c2a89a4ba491cd6a0bd6d852b225172a1f54b36c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ade5dbcf8d9ef8f4b28e682d0b29f3008df9842bb5ac48ac2c17bc55771cc976"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2c0afd34f928383e3fd25740f2050dbac9d077e7ba5adbaa2227f4d4f3c8da5c"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7da333f21cd9df51d5731513a6d39319892947604924ddf2e24a4612975fb936"}, + {file = "pydantic_core-2.33.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4b6d77c75a57f041c5ee915ff0b0bb58eabb78728b69ed967bc5b780e8f701b8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ba95691cf25f63df53c1d342413b41bd7762d9acb425df8858d7efa616c0870e"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4f1ab031feb8676f6bd7c85abec86e2935850bf19b84432c64e3e239bffeb1ec"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1151827eef98b83d49b6ca6065575876a02d2211f259fb1a6b7757bd24dd8"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a66d931ea2c1464b738ace44b7334ab32a2fd50be023d863935eb00f42be1778"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0bcf0bab28995d483f6c8d7db25e0d05c3efa5cebfd7f56474359e7137f39856"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:89670d7a0045acb52be0566df5bc8b114ac967c662c06cf5e0c606e4aadc964b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:b716294e721d8060908dbebe32639b01bfe61b15f9f57bcc18ca9a0e00d9520b"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fc53e05c16697ff0c1c7c2b98e45e131d4bfb78068fffff92a82d169cbb4c7b7"}, + {file = "pydantic_core-2.33.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:68504959253303d3ae9406b634997a2123a0b0c1da86459abbd0ffc921695eac"}, + {file = "pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3"}, ] [package.dependencies] @@ -4888,39 +3681,6 @@ files = [ {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] -[[package]] -name = "pygments" -version = "2.19.1" -description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, - {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, -] - -[package.extras] -windows-terminal = ["colorama (>=0.4.6)"] - -[[package]] -name = "pyjwt" -version = "2.10.1" -description = "JSON Web Token implementation in Python" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, -] - -[package.extras] -crypto = ["cryptography (>=3.4.0)"] -dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] -docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] - [[package]] name = "pylint" version = "2.17.7" @@ -4981,68 +3741,6 @@ pydantic = "<3.0" pylint = ">2.0,<3.0" pylint-plugin-utils = "*" -[[package]] -name = "pypdfium2" -version = "4.30.1" -description = "Python bindings to PDFium" -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "pypdfium2-4.30.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:e07c47633732cc18d890bb7e965ad28a9c5a932e548acb928596f86be2e5ae37"}, - {file = "pypdfium2-4.30.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5ea2d44e96d361123b67b00f527017aa9c847c871b5714e013c01c3eb36a79fe"}, - {file = "pypdfium2-4.30.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de7a3a36803171b3f66911131046d65a732f9e7834438191cb58235e6163c4e"}, - {file = "pypdfium2-4.30.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8a4231efb13170354f568c722d6540b8d5b476b08825586d48ef70c40d16e03"}, - {file = "pypdfium2-4.30.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f434a4934e8244aa95343ffcf24e9ad9f120dbb4785f631bb40a88c39292493"}, - {file = "pypdfium2-4.30.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f454032a0bc7681900170f67d8711b3942824531e765f91c2f5ce7937f999794"}, - {file = "pypdfium2-4.30.1-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:bbf9130a72370ee9d602e39949b902db669a2a1c24746a91e5586eb829055d9f"}, - {file = "pypdfium2-4.30.1-py3-none-musllinux_1_1_i686.whl", hash = "sha256:5cb52884b1583b96e94fd78542c63bb42e06df5e8f9e52f8f31f5ad5a1e53367"}, - {file = "pypdfium2-4.30.1-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:1a9e372bd4867ff223cc8c338e33fe11055dad12f22885950fc27646cc8d9122"}, - {file = "pypdfium2-4.30.1-py3-none-win32.whl", hash = "sha256:421f1cf205e213e07c1f2934905779547f4f4a2ff2f59dde29da3d511d3fc806"}, - {file = "pypdfium2-4.30.1-py3-none-win_amd64.whl", hash = "sha256:598a7f20264ab5113853cba6d86c4566e4356cad037d7d1f849c8c9021007e05"}, - {file = "pypdfium2-4.30.1-py3-none-win_arm64.whl", hash = "sha256:c2b6d63f6d425d9416c08d2511822b54b8e3ac38e639fc41164b1d75584b3a8c"}, - {file = "pypdfium2-4.30.1.tar.gz", hash = "sha256:5f5c7c6d03598e107d974f66b220a49436aceb191da34cda5f692be098a814ce"}, -] - -[[package]] -name = "pypika" -version = "0.48.9" -description = "A SQL query builder API for Python" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "PyPika-0.48.9.tar.gz", hash = "sha256:838836a61747e7c8380cd1b7ff638694b7a7335345d0f559b04b2cd832ad5378"}, -] - -[[package]] -name = "pyproject-hooks" -version = "1.2.0" -description = "Wrappers to call pyproject.toml-based build backend hooks." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"}, - {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"}, -] - -[[package]] -name = "pyreadline3" -version = "3.5.4" -description = "A python implementation of GNU readline." -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "sys_platform == \"win32\"" -files = [ - {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, - {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, -] - -[package.extras] -dev = ["build", "flake8", "mypy", "pytest", "twine"] - [[package]] name = "pysbd" version = "0.3.4" @@ -5169,23 +3867,6 @@ files = [ {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] -[[package]] -name = "pyvis" -version = "0.3.2" -description = "A Python network graph visualization library" -optional = false -python-versions = ">3.6" -groups = ["main"] -files = [ - {file = "pyvis-0.3.2-py3-none-any.whl", hash = "sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555"}, -] - -[package.dependencies] -ipython = ">=5.3.0" -jinja2 = ">=2.9.6" -jsonpickle = ">=1.4.1" -networkx = ">=1.11" - [[package]] name = "pywin32" version = "308" @@ -5599,25 +4280,6 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "requests-oauthlib" -version = "2.0.0" -description = "OAuthlib authentication support for Requests." -optional = false -python-versions = ">=3.4" -groups = ["main"] -files = [ - {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, - {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, -] - -[package.dependencies] -oauthlib = ">=3.0.0" -requests = ">=2.0.0" - -[package.extras] -rsa = ["oauthlib[signedtoken] (>=3.0.0)"] - [[package]] name = "requests-toolbelt" version = "1.0.0" @@ -5633,26 +4295,6 @@ files = [ [package.dependencies] requests = ">=2.0.1,<3.0.0" -[[package]] -name = "rich" -version = "13.9.4" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -optional = false -python-versions = ">=3.8.0" -groups = ["main"] -files = [ - {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, - {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, -] - -[package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" -typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""} - -[package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] - [[package]] name = "rpds-py" version = "0.22.3" @@ -5766,21 +4408,6 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] -[[package]] -name = "rsa" -version = "4.9" -description = "Pure-Python RSA implementation" -optional = false -python-versions = ">=3.6,<4" -groups = ["main"] -files = [ - {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, - {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, -] - -[package.dependencies] -pyasn1 = ">=0.1.3" - [[package]] name = "safetensors" version = "0.4.5" @@ -6065,18 +4692,6 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib-metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (>=1.12,<1.14)", "pytest-mypy"] -[[package]] -name = "shellingham" -version = "1.5.4" -description = "Tool to Detect Surrounding Shell" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] - [[package]] name = "six" version = "1.16.0" @@ -6197,26 +4812,6 @@ postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] sqlcipher = ["sqlcipher3_binary"] -[[package]] -name = "stack-data" -version = "0.6.3" -description = "Extract data from python stack frames and tracebacks for informative displays" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, - {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, -] - -[package.dependencies] -asttokens = ">=2.1.0" -executing = ">=1.2.0" -pure-eval = "*" - -[package.extras] -tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] - [[package]] name = "starlette" version = "0.45.3" @@ -6259,7 +4854,7 @@ version = "8.5.0" description = "Retry code until it succeeds" optional = false python-versions = ">=3.8" -groups = ["main", "metrics"] +groups = ["metrics"] files = [ {file = "tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687"}, {file = "tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78"}, @@ -6374,6 +4969,7 @@ description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "dev", "metrics"] +markers = "python_version < \"3.11\"" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -6408,19 +5004,6 @@ files = [ {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] -markers = {dev = "python_version < \"3.11\"", metrics = "python_version < \"3.11\""} - -[[package]] -name = "tomli-w" -version = "1.2.0" -description = "A lil' TOML writer" -optional = false -python-versions = ">=3.9" -groups = ["main"] -files = [ - {file = "tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90"}, - {file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"}, -] [[package]] name = "tomlkit" @@ -6525,22 +5108,6 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "traitlets" -version = "5.14.3" -description = "Traitlets Python configuration system" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, - {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, -] - -[package.extras] -docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] - [[package]] name = "transformers" version = "4.49.0" @@ -6611,24 +5178,6 @@ torchhub = ["filelock", "huggingface-hub (>=0.26.0,<1.0)", "importlib-metadata", video = ["av"] vision = ["Pillow (>=10.0.1,<=15.0)"] -[[package]] -name = "typer" -version = "0.15.1" -description = "Typer, build great CLIs. Easy to code. Based on Python type hints." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, - {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, -] - -[package.dependencies] -click = ">=8.0.0" -rich = ">=10.11.0" -shellingham = ">=1.3.0" -typing-extensions = ">=3.7.4.3" - [[package]] name = "typing-extensions" version = "4.12.2" @@ -6658,6 +5207,21 @@ files = [ mypy-extensions = ">=0.3.0" typing-extensions = ">=3.7.4" +[[package]] +name = "typing-inspection" +version = "0.4.0" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main", "metrics"] +files = [ + {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, + {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + [[package]] name = "tzdata" version = "2024.2" @@ -6688,34 +5252,6 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] -[[package]] -name = "uv" -version = "0.6.2" -description = "An extremely fast Python package and project manager, written in Rust." -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "uv-0.6.2-py3-none-linux_armv6l.whl", hash = "sha256:d501ae16fb33969b12a64ac7b9c49d672b8c3964026c5dcaee3b1dcd50a6a22c"}, - {file = "uv-0.6.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c13ca920d87dc00721a86ac3d19667cff5435b369d21e3d6df76b373d8fa8df"}, - {file = "uv-0.6.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f24e119d338bae32b5a604585b7b518036fba556e2c2d9dbd2d7cf1411213b57"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:1db90b728a173926e2018b89df776a373b1e50520466f61e0dbf05f9a64a6db5"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d23fb9cd41aecb31845e884d0bfde243e04e763abeab3532138321b4ebe7437c"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df0a1d95fd1539c05de434259fafcee0b6852900d4178e94b3b6b6b06438b60c"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f2f0dc9a0564b31d4efdee317c176a23bbe7e61aec6d281a331ba6ae32f828ff"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:326aff8c4fb8153e2384e79904c27b1c9d4c3a5879b53a6fbc2da3283fda321d"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8763f310a473f46c0226f5e08a876bd34de121ac370cc7294a5397a13a18d8a"}, - {file = "uv-0.6.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2e421947ef889e6c8913992c560d611826464eabc78f8f702a5eff824aabc7"}, - {file = "uv-0.6.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:7dd26dabd918e5648ecf94fb7c0787db954237e34ea3bdd944b98d007b44c3a5"}, - {file = "uv-0.6.2-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:f3719da2e59403783eab634a6238b90051fc65379e02c10b9ca1b32b26d35f77"}, - {file = "uv-0.6.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:b435687e5c26a64858ea842fbb4b35ced8e8741a99d1b75d0c0143462e956db9"}, - {file = "uv-0.6.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:0f1e8e15c92607862e72e0467a31947af7b9aef93924072e9b4d5dcb5633d374"}, - {file = "uv-0.6.2-py3-none-win32.whl", hash = "sha256:52b7452f4c523b9875de53ba73df87acd1cdea36640281d0d80c8074eda42f16"}, - {file = "uv-0.6.2-py3-none-win_amd64.whl", hash = "sha256:5337cdb6ecc604d0cf36fe6799dd0479111b606009e6c29685d213c74eb40373"}, - {file = "uv-0.6.2-py3-none-win_arm64.whl", hash = "sha256:27ecb8f6ef796220062f31a12e2dc5dc7a14704aa1df0da2dfa3530346c7e3cc"}, - {file = "uv-0.6.2.tar.gz", hash = "sha256:d696a4f3d4a3ac1b305255e8814ae3a147ea3428a977bb3b4335a339941799bc"}, -] - [[package]] name = "uvicorn" version = "0.29.0" @@ -6898,29 +5434,12 @@ version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" -groups = ["main", "metrics"] +groups = ["metrics"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "websocket-client" -version = "1.8.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, -] - -[package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] -optional = ["python-socks", "wsaccel"] -test = ["websockets"] - [[package]] name = "websockets" version = "14.1" @@ -7425,4 +5944,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "3ec7698fcdcc1e6e131d364ccfcf49c4ebddd7549e0ab55bf69dfe9e9cae9380" +content-hash = "743de02862850b50b3b724bfe53e9fe325654533c29b8828efa8c6f9f6caff77" diff --git a/pyproject.toml b/pyproject.toml index 5ca827b..4d83606 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,6 @@ python = ">=3.10,<3.13" azure-ai-inference = "^1.0.0b8" azure-core = "^1.32.0" backoff = "^2.2.1" -crewai ="^0.102.0" ecologits = "^0.5.2" fastapi = "^0.115.8" huggingface-hub = "^0.29.1" @@ -33,6 +32,8 @@ transformers="^4.48.0" torch = {version = "^2.2.2+cpu", source = "pytorch_cpu"} torchvision = {version = "^0.17.2+cpu", source = "pytorch_cpu"} uvicorn = {extras = ["standard"], version = "^0.29.0"} +autogen-core = "^0.4.9.3" +autogen-ext = "^0.4.9.3" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" diff --git a/src/app/api/api_v1/endpoints/tutor.py b/src/app/api/api_v1/endpoints/tutor.py index fc33dac..600c6f5 100644 --- a/src/app/api/api_v1/endpoints/tutor.py +++ b/src/app/api/api_v1/endpoints/tutor.py @@ -1,21 +1,15 @@ -from typing import Annotated, Optional +from typing import Annotated -from fastapi import APIRouter, File, UploadFile -from pydantic import BaseModel +from fastapi import APIRouter, File, Response, UploadFile from src.app.api.dependencies import get_settings + from src.app.services.abst_chat import AbstractChat, ChatFactory -from src.app.services.agents import ( - theme_extractor, - theme_extractor_action, - university_teacher, - university_teacher_action, -) -from src.app.services.helpers import stringify_docs_content from src.app.services.search import SearchService from src.app.services.search_helpers import search_multi_inputs +from src.app.services.tutor.models import ExtractorOuputList, TutorSearchResponse +from src.app.services.tutor.tutor import tutor_manager from src.app.utils.logger import logger as utils_logger -from src.crews.crew_manager import kickoff logger = utils_logger(__name__) @@ -29,58 +23,74 @@ sp = SearchService() -class OddishParams(BaseModel): - file: Optional[UploadFile] = File(default=None) +extractor_prompt = """ +role="An assistant to summarize a text and extract the main themes from it", +backstory="You are specialised in analysing documents, summarizing them and extracting the main themes. You value precision and clarity.", +goal="Analyse each document, summarize it and extract the main themes, explaining why each theme was identified.", +expected_output="You must follow the following JSON schema: {extracts: [{'original_document': 'Document', 'summary': 'Summary', 'themes': ['Theme 1', 'Theme 2', ...]}, {'original_document': 'Document', 'summary': 'Sumamry', 'themes': ['Theme 1', 'Theme 2', ...]}, ...]} an entry by document", +""" -@router.post("/oddish_crew") -async def kickoff_crew_endpoint(files: Annotated[list[UploadFile], File()]): - # get sources and use chat to classify text in parallel +@router.post("/search") +async def tutor_search( + files: Annotated[list[UploadFile], File()], + response: Response, +): file_content: list[bytes] = [await file.read() for file in files] - file_content_str = [content.decode("utf-8") for content in file_content] - docs = await search_multi_inputs( - inputs=file_content_str, nb_results=5, callback_function=sp.search + file_content_str = [f"Document {index+1}: {content.decode("utf-8")}" for index, content in enumerate(file_content)] + file_content_str = "\n\n".join(file_content_str) + + messages = [ + {"role": "system", "content": extractor_prompt}, + {"role": "assistant", "content": file_content_str}, + ] + + themes_extracted = await chatfactory.chat_schema( + model="gpt-4o-mini", messages=messages, response_format=ExtractorOuputList # type: ignore + ) + + if not themes_extracted or not themes_extracted.extracts: + # handle error + return TutorSearchResponse( + extracts=[], + nb_results=0, + documents=[], + ) + + inputs = [doc.summary for doc in themes_extracted.extracts] # type: ignore + + search_results = await search_multi_inputs( + response=response, + inputs=inputs, + nb_results=5, + sdg_filter=None, + collections=None, + callback_function=sp.search ) - result = await kickoff(text_contents=file_content_str, search_results=docs) + if not search_results: + return TutorSearchResponse( + extracts=themes_extracted.extracts, + nb_results=0, + documents=[], + ) - return result + resp = TutorSearchResponse( + extracts=themes_extracted.extracts, + nb_results=len(search_results), + documents=search_results + ) + # TODO: handle duplicates -@router.post("/oddish") -async def oddish(files: Annotated[list[UploadFile], File()]): - print(files) - file_content: list[bytes] = [await file.read() for file in files] - file_content_str = [content.decode("utf-8") for content in file_content] - docs = await search_multi_inputs( - inputs=file_content_str, nb_results=5, callback_function=sp.search - ) - text_contents = "//n".join(file_content_str) - - theme = await chatfactory.flex_chat( - messages=[ - {"role": "system", "content": theme_extractor}, - { - "role": "user", - "content": theme_extractor_action.format(text_contents=text_contents), - }, - ] - ) + return resp - stringified_docs = stringify_docs_content(docs or []) - - plan = await chatfactory.flex_chat( - messages=[ - {"role": "system", "content": university_teacher}, - { - "role": "user", - "content": university_teacher_action.format( - search_results=stringified_docs, - text_contents=text_contents, - theme=theme, - ), - }, - ] - ) - return plan +@router.post("/syllabus") +async def create_syllabus(body: TutorSearchResponse): + syllabus = await tutor_manager(body) + + #TODO: fix error AgentChat + + + return syllabus diff --git a/src/app/services/agents.py b/src/app/services/agents.py deleted file mode 100644 index f36615c..0000000 --- a/src/app/services/agents.py +++ /dev/null @@ -1,101 +0,0 @@ -theme_extractor = """ -role: > - You extract the main themes from a text or collection of texts - goal: > - Analyse a text or collection of texts and extract the main themes, explaining why each theme was identified - backstory: > - You are specialised in analysing documents and extracting the main themes. You value precision and clarity -""" - -university_teacher = """ - role: > - University teacher that is an expert in pedagogical engineering and learning sciences. - You love to infuse SDGs into courses to create impactful educational resources. - goal: > - Create university courses that include SDG-related content in a way that is related to the discipline in question. - backstory: > - You're a university teacher with expertise in all disciplines and how to link them to the Sustainable Development Goals (SDGs). - You're passionate about sharing your knowledge with students and creating engaging learning content. - You're able to design courses in all disciplines in a way that coherently weaves in content related to the SDGs. - Your overarching goal is to ensure that all university students, regardless of their discipline, acquire foundational knowledge on the SDGs - and are able to think about how they can contribute to accomplishing the SDGs in their respective fields. -""" - - -theme_extractor_action = """ -Extract the main themes of the input documents in {text_contents} and explain why in order to ensure you have understood the input documents correctly. -expected_output: > - A list of the main themes identified in the input documents with brief explanations. -""" - - -university_teacher_action = """ -Using the content in both {text_contents} and {search_results}, you generate a course plan that is engaging and coherent in relation to the main themes extracted by the theme_extractor. -Make sure to add learning outcomes and point what learning outcome is being targetted each week -You should also add how you will teach the class, your classes are 3 hours use different methodologies - -here are some of the comptencies your students should have: - -1.1 Valuing -sustainability -To reflect on personal values; identify and explain -how values vary among people and over time, while -critically evaluating how they align with sustainability -values. -1.2 Supporting -fairness -To support equity and justice for current and future -generations and learn from previous generations for -sustainability. -1.3 Promoting -nature -To acknowledge that humans are part of nature; and -to respect the needs and rights of other species and -of nature itself in order to restore and regenerate -healthy and resilient ecosystems. -2.1 Systems -thinking -To approach a sustainability problem from all -sides; to consider time, space and context in order -to understand how elements interact within and -between systems. -2.2 Critical -thinking -To assess information and arguments, identify -assumptions, challenge the status quo, and reflect -on how personal, social and cultural backgrounds -influence thinking and conclusions. -2.3 Problem -framing -To formulate current or potential challenges as a -sustainability problem in terms of difficulty, people -involved, time and geographical scope, in order to -identify suitable approaches to anticipating and -preventing problems, and to mitigating and adapting -to already existing problems. -3.1 Futures literacy -To envision alternative sustainable futures by imagining and developing alternative scenarios and -identifying the steps needed to achieve a preferred -sustainable future -3.2 Adaptability -To manage transitions and challenges in complex -sustainability situations and make decisions related -to the future in the face of uncertainty, ambiguity -and risk -3.3 Exploratory -thinking -To adopt a relational way of thinking by exploring -and linking different disciplines, using creativity and -experimentation with novel ideas or methods. -4.1 Political -agency -To navigate the political system, identify political -responsibility and accountability for unsustainable -behaviour, and demand effective policies for sustainability. -4.2 Collective -action To act for change in collaboration with others. -4.3 Individual -initiative -To identify own potential for sustainability and to actively contribute to improving prospects for the community and the planet -Theme extracted: {theme} -""" diff --git a/src/app/services/pedagogical_framework.txt b/src/app/services/pedagogical_framework.txt deleted file mode 100644 index 2ffea36..0000000 --- a/src/app/services/pedagogical_framework.txt +++ /dev/null @@ -1,43 +0,0 @@ - -A pedagogical framework to guide university teachers in incorporating climate change and Sustainable Development Goals (SDGs) into their classes should focus on several key areas, including learning objectives, content integration, pedagogical approaches, and teacher training. The aim is to ensure all students gain a common understanding of these issues and are empowered to make informed decisions and take action. - -### Core Principles -* **Interdisciplinarity and Transdisciplinarity:** The framework should encourage the breakdown of traditional disciplinary silos to foster a systemic understanding of ecological issues. This involves connecting knowledge across disciplines and integrating various forms of knowledge and practices. -* **Holistic Education:** A "head-heart-body" approach should be adopted, which integrates cognitive, emotional, and practical dimensions of learning. This entails going beyond the mere transfer of knowledge and aiming for a deeper understanding that engages students on multiple levels. -* **Learner-Centered Approach:** The pedagogy should focus on learners as autonomous individuals who actively construct their own knowledge. This requires stimulating learners' prior knowledge and experiences, and encouraging them to reflect on their learning processes. -* **Real-World Application**: Learning should be linked to real-world contexts to enhance student motivation and give meaning to reflections on the future. This includes cooperation with external partners, project-based collaborations, and addressing real societal challenges. -* **Transformative Learning**: The framework should promote critical thinking and challenge existing assumptions to foster a shift in both consciousness and behavior. It needs to trigger a deep reflection about the students' relationship with the world. - -### Learning Objectives -* **Specific Learning Objectives for SDGs:** Educators must set specific learning objectives for the different SDGs, while ensuring these objectives are not isolated from the key sustainability competencies. -* **Competency Development:** The framework must develop key competencies, such as systems thinking, critical thinking, problem-solving, and advocacy. These competencies are essential for dealing with various sustainability challenges and connecting the SDGs. -* **Ethical Discernment:** Courses should provide spaces for learning ethical discernment by exploring individual and collective dilemmas, and understanding different schools of thought and ethical approaches. -* **Life-Long Learning:** Students should be equipped to use all opportunities for their own education throughout their lives, applying their acquired knowledge to promote sustainable development in everyday situations. - -### Content Integration -* **Curriculum Mainstreaming**: Sustainability topics should be integrated into existing curricula and not treated as an add-on. This includes ensuring sustainability-related intended learning outcomes are incorporated. -* **Basic Knowledge**: Provide a common base of knowledge across disciplines to ensure that all students have a foundational understanding of climate change and sustainability. This includes scientific literacy and understanding the interconnectedness of environmental, social, and economic systems. -* **Systemic Understanding**: Promote the understanding of the systemic nature of ecological challenges, including their links with the economic, social, and political spheres. -* **Critical Thinking:** Enable students to understand the construction of scientific facts, to analyze the political issues around climate change and to become aware of biased narratives. - -### Pedagogical Approaches -* **Six "Gates" Methodology**: Use the six "gates" approach (Oikos, Ethos, Nomos, Logos, Praxis, and Dunamis) to explore ecological and social transition issues from multiple angles. This methodology helps create a systemic vision of the challenges by identifying connections between different fields. -* **Active and Experiential Learning:** Employ methods that go beyond traditional lectures and include real-world experiences, practical activities, and group projects. -* **Mobilizing Head, Heart and Body:** Use diverse activities to engage students intellectually, emotionally, and physically, thereby facilitating a deeper understanding of the content. This might involve reflection exercises, encouraging exciting encounters, or creating safe spaces for talking. -* **Collective Intelligence Tools**: Use collective intelligence tools to bring out the multiple facets of a problem. -* **Simulation and Role Play:** Use simulations or role play to help students think and make ethical choices. -* **Controversy Mapping**: Carry out investigations to represent the tensions, interactions between stakeholders, and scientific justifications. -* **Assessment**: Encourage self-assessment, reflection, and the use of portfolios to show the students' progresses. - -### Teacher Training and Support -* **Training in ESD**: Provide teachers with training on sustainable development, SDGs, and related topics and challenges. This training should also help teachers develop an integrative view of sustainability by taking into account social, ecological, economic, and cultural dimensions. -* **Pedagogical Skills:** Teachers must acquire innovative pedagogical skills to foster sustainability competencies in students. This includes skills in facilitation, collective intelligence, and transformative learning. -* **Mentorship and Collaboration:** Establish mentoring programs and foster collaborations between teachers from different disciplines to promote the sharing of knowledge and experience. -* **Resource Sharing**: Create platforms for sharing educational materials and best practices. - -### Systemic Integration -* **University-Wide Commitment**: Ensure a university-wide commitment to integrating sustainability, involving all actors, including students, faculty, and administrative staff. -* **Strategic Planning:** Make sustainability a strategic focus in all studies and curriculum development. -* **Overcoming Barriers**: Address the barriers to integration, such as the compartmentalization of disciplines, lack of time, the grading system, and the pressures on teachers. - -By incorporating these elements into a pedagogical framework, universities can effectively equip their students with the knowledge, skills, and values necessary to address climate change and contribute to a sustainable future. This should be seen as a long-term process that includes continuous improvements and collaboration between all stakeholders. diff --git a/src/app/services/search_helpers.py b/src/app/services/search_helpers.py index bf65723..d157d67 100644 --- a/src/app/services/search_helpers.py +++ b/src/app/services/search_helpers.py @@ -116,9 +116,9 @@ async def search_multi_inputs( response: Response, inputs: List[str], nb_results: int, - sdg_filter: Optional[SearchFilter], - collections: List[str], + sdg_filter: list[int] | None, callback_function: Callable[..., Awaitable[List[ScoredPoint]]], + collections: tuple[str, ...] | None, ): try: qps: list[EnhancedSearchQuery] = [ @@ -144,7 +144,6 @@ async def search_multi_inputs( all_data = await coroutine except CollectionNotFoundError as e: response.status_code = 206 - response.reason_phrase = f"Partial Content {e.message}" if not all_data: response.status_code = 404 diff --git a/src/crews/config/agents.yaml b/src/app/services/tutor/__init__.py similarity index 100% rename from src/crews/config/agents.yaml rename to src/app/services/tutor/__init__.py diff --git a/src/app/services/tutor/agents.py b/src/app/services/tutor/agents.py new file mode 100644 index 0000000..87a898c --- /dev/null +++ b/src/app/services/tutor/agents.py @@ -0,0 +1,248 @@ +from autogen_agentchat.agents import AssistantAgent +from autogen_agentchat.messages import TextMessage +from autogen_core import ( + MessageContext, + RoutedAgent, + TopicId, + message_handler, + type_subscription, +) +from autogen_core.memory import ListMemory +from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage +from src.app.services.tutor.models import ( + Message, + MessageWithResources, + TutorSearchResponse, +) +from src.app.services.tutor.utils import build_system_message + +# TODO: add template file mouve this to utils +TEMPLATES = {"template0": open("src/app/services/tutor/template.md").read()} + + +university_teacher_topic_type = "UniversityTeacherAgent" +sdg_expert_topic_type = "SDGExpertAgent" +pedagogical_engineer_topic_type = "PedagogicalEngineerAgent" +user_input_topic_type = "UserInputAgent" +user_topic_type = "User" + + +@type_subscription(topic_type=university_teacher_topic_type) +class UniversityTeacherAgent(RoutedAgent): + """ + A university professor agent that designs courses in a given discipline. + Attributes: + _system_message (SystemMessage): The system message containing the agent's role, backstory, and goals. + _model_client (ChatCompletionClient): The client used to interact with the language model. + Methods: + __init__(model_client: ChatCompletionClient) -> None: + Initializes the UniversityTeacherAgent with a system message and model client. + handle_documents_and_themes(message: MessageWithSources, ctx: MessageContext) -> None: + Handles incoming messages, generates a syllabus based on the provided text contents and themes, and publishes the generated syllabus. + """ + + def __init__(self, model_client: ChatCompletionClient) -> None: + print("UniversityTeacherAgent") + super().__init__("A university teacher agent.") + self._system_message = SystemMessage( + content=( + build_system_message( + role="the University Professor Agent, responsible for drafting the initial syllabus based on the course materials provided by the user. Your role is to structure the course content, ensuring it aligns with academic standards and effectively conveys the subject matter.", + backstory="You are a highly experienced university professor with expertise in structuring academic courses. You understand the nuances of designing a syllabus that is comprehensive yet adaptable, providing a strong foundation for course delivery. Your experience spans multiple disciplines, and you excel at organizing complex information into a structured curriculum.", + goal="Generate the first version of the syllabus, ensuring that it reflects the course content and discipline provided by the user. Your syllabus should be structured based on the syllabus template, and your version will serve as the foundation for subsequent agents.", + instructions=( + "1. Analyze the input materials uploaded by the user: 'content', 'summary', and 'themes'." + "2. Based on the Draft the following sections:" + "Course Description: Provide a brief yet clear introduction to the course." + "Learning Objectives: Outline broad goals that define what students will gain from the course." + "Learning Outcomes: Define specific and measurable outcomes students should achieve." + "Competencies: Define transferable skills that the students will gain after this course." + "Assessment Methods: Propose methods to evaluate student progress." + "Course Schedule: Create a week-by-week breakdown with key topics and associated learning outcomes." + "References: Include all sources that you use to construct the syllabus." + "3. Save a file to the current directory:" + f"Syllabus File: Contains the drafted syllabus based on the provided template. You must follow this template :\n {TEMPLATES['template0']}. Name the file: uni-prof_syllabus.md" + ), + expected_output=f"You must follow this template :\n {TEMPLATES['template0']}", + ) + ) + ) + self._model_client = model_client + + @message_handler + async def handle_documents_and_themes( + self, message: TutorSearchResponse, ctx: MessageContext + ) -> None: + print("handle_documents_and_themes") + prompt = f"Using the content in TEXT CONTENTS, you generate a syllabus that is engaging and coherent in relation to the THEMES extracted from these contents. \n\nTEXT CONTENTS:\n{message.extracts[0].original_document}\n\nTHEMES:\n{message.extracts[0].themes}" + + llm_result = await self._model_client.create( + messages=[ + self._system_message, + UserMessage(content=prompt, source=self.id.key), + ], + cancellation_token=ctx.cancellation_token, + ) + response = llm_result.content + assert isinstance(response, str) + + await self.publish_message( + MessageWithResources( + content=response, resources=message.documents, source=self.id.type + ), + topic_id=TopicId(sdg_expert_topic_type, source=self.id.key), + ) + + +@type_subscription(topic_type=sdg_expert_topic_type) +class SDGExpertAgent(RoutedAgent): + """ + An SDG expert that assists university professors in integrating sustainability topics in their discipline. + Attributes: + _delegate (AssistantAgent): An assistant agent that handles the core functionality. + _model_client (ChatCompletionClient): The model client used for generating responses. + Methods: + handle_syllabus(message: Message, ctx: MessageContext) -> None: + Handles messages from university professors and integrates sustainability concepts in a thematically linked and relevant manner. + """ + + def __init__(self, model_client: ChatCompletionClient) -> None: + super().__init__("An SDG expert agent.") + self._delegate = AssistantAgent( + "SDGExpert", + model_client=model_client, + system_message=build_system_message( + role="the Sustainability Expert Agent, responsible for integrating sustainability concepts into the syllabus. Your role is to ensure that the syllabus aligns with relevant sustainability principles and frameworks in a way that is appropriate for the course discipline.", + backstory="You are a recognized expert in sustainability education, well-versed in the Sustainable Development Goals (SDGs) and emerging sustainability research. Your expertise allows you to inject sustainability elements into any discipline, making them relevant and actionable for students.", + goal="Modify the initial syllabus provided by the University Professor Agent to integrate sustainability content in a relevant and meaningful way.", + instructions=( + "1. Analyze the syllabus generated by the University Professor Agent. Ensure modifications are discipline-appropriate and avoid forcing sustainability concepts where they do not naturally fit." + "2. Evaluate and refine the following sections:" + "Course Description: Ensure sustainability relevance is reflected." + "Learning Objectives & Outcomes: Add sustainability-focused objectives where applicable." + "Competencies Developed: If relevant, integrate sustainability competencies." + "Course Schedule: Introduce sustainability-related themes into weekly topics where appropriate." + "References: NEVER delete, summarize, or modify any references already present in the syllabus. Only append this section with any additional sources that you use to construct the syllabus. " + "3. Save a file to the current directory:" + f"Revised syllabus File: The updated syllabus with integrated sustainability elements. Name the file: SDG-exp_syllabus.md" + ), + expected_output=( + f"1. Final Syllabus File: The revised syllabus, ready for the pedagogical engineer's review. You must follow this template :\n {TEMPLATES['template0']}. Name the file: SDG-exp_syllabus.md" + "When you are done with generating the final output, reply with SDG EXPERT DONE." + ), + ), + ) + self._model_client = model_client + + @message_handler(match=lambda msg, ctx: msg.source.startswith("UniversityTeacher")) # type: ignore + async def handle_syllabus( + self, message: MessageWithResources, ctx: MessageContext + ) -> Message: + print("handle_syllabus", ctx) + print("handle_syllabus") + """ + Handles the syllabus by integrating SDG content from the documents in the WeLearn resources. + Args: + message (MessageWithResources): The message containing the syllabus content as well as the documents from the WeLearn database. + ctx (MessageContext): The context of the message. + Returns: + None + """ + + prompt = f"Use these WeLearn documents: {message.resources} to integrate sustainability in this syllabus: {message.content}. You do not need to use ALL the information in the WeLearn documents, but ensure that sustainability integration is done in a way that is relevant and thematically linked to the discipline and the topics of the syllabus, that they are deeply embedded in the course content, and aligned with both the discipline and the broader educational goals. Add all WeLearn documents that you use in the REFERENCES section of the syllabus." + try: + llm_result = await self._delegate.on_messages( + [TextMessage(content=prompt, source=self.id.key)], + ctx.cancellation_token, + ) + except Exception as e: + print("Error in SDGExpertAgent:", e) + raise e + response = llm_result.chat_message.content + + assert isinstance(response, str) + + print(f"\n\n{'-'*80}\n{self.id.type}\n{'-'*80}\n\n{response}") + + # await self.publish_message( + # Message(content=response, source=self.id.type), + # topic_id=TopicId(pedagogical_engineer_topic_type, source=self.id.key), + # ) + toto = Message(content=response, source=self.id.type) + return Message( + content=response, + source=self.id.type, + ) + + +@type_subscription(topic_type=pedagogical_engineer_topic_type) +class PedagogicalEngineerAgent(RoutedAgent): + print("PedagogicalEngineerAgent") + """ + A pedagogical engineer agent that assists university professors in constructing their syllabus. This agent ensures that the syllabus contains appropriate learning objectives, learning outcomes, and a corresponding course plan. It focuses specifically on teaching methodologies and pedagogical approaches. It integrates the European sustainability competence framework GreenComp into existing courses. + Attributes: + _delegate (AssistantAgent): An assistant agent that handles the core functionality. + _model_client (ChatCompletionClient): The model client used for generating responses. + Methods: + handle_syllabus(message: Message, ctx: MessageContext) -> None: + Handles messages from university teachers to ensure the syllabus integrates GreenComp competencies. + handle_user_feedback(message: MessageWithFeedback, ctx: MessageContext) -> None: + Handles user feedback to improve the syllabus based on the provided feedback. + """ + + def __init__(self, model_client: ChatCompletionClient, memory: ListMemory) -> None: + super().__init__("A pedagogical engineer agent.") + self._delegate = AssistantAgent( + "PedagogicalEngineer", + model_client=model_client, + system_message=build_system_message( + role="the Pedagogical Engineer Agent, responsible for ensuring that the syllabus adheres to best practices in pedagogy. Your role is to refine learning objectives, align assessments with learning outcomes, and include competencies from the EU GreenComp Framework. You optimize the syllabus for student engagement and effectiveness.", + backstory="You are an experienced pedagogical engineer specializing in higher education course design. You are deeply familiar with competency-based learning and the EU GreenComp Framework, active learning strategies, and assessment alignment. Your expertise ensures that syllabi are not only well-structured but also effective for learning.", + goal="Refine the syllabus provided by the SDG Expert Agent to optimize its pedagogical effectiveness and coherence. Make sure the learning objectives, learning outcomes, and competencies are linked, and that the activities proposed in the Course Plan are appropriate for the accomplishment of the learning outcomes that are targeted.", + instructions=( + "1. Analyze the syllabus generated by the SDG Expert Agent." + "2. Evaluate and refine the following sections:" + "Learning Objectives & Outcomes: Ensure they are well-formulated and that the learning outcomes and thematically linked to the learning objectives." + "Competencies Developed: Integrate competencies from the EU GreenComp Framework and validate the inclusion of relevant transferable skills." + "Assessment Methods: Align evaluation strategies with learning outcomes." + "Course Schedule: (1) For EACH WEEK, make sure that the Learning Outcomes mentioned are the same ones as the ones listed in the Learning Outcomes section, and include the Learning Outcome number in front of each one. (2) analyse the learning outcome and add a new column entitled Class Plan including a structured plan for the class with the activities that the professor should implement in order to best accomplish the outcomes targeted for that week. Ensure activities align with active learning strategies and innovative pedagogical approaches. (3) Go back to the Learning Outcomes section and include the class activities you listen in the Class Plan in the formulation of each Learning Outcome, for the class activities are the measures with which the professor will measure the accomplishment of each outcome. Do this for EVERY WEEK. DO NOT SUMMARIZE OR USE ELLIPSES AS PLACEHOLDERS FOR THE ACTUAL COURSE PLAN." + "References: NEVER delete, summarize, or modify any references already present in the syllabus. Only append this section with any additional sources that you use to construct the syllabus." + "3. Check for consistency, clarity, and overall syllabus coherence to ensure usability for instructors." + ), + expected_output=( + "Save a to the current directory:" + f"1. Final Syllabus File: The polished syllabus, ready for user review. You must follow this template :\n {TEMPLATES['template0']}. Name the file: peda-eng_syllabus.md" + "When you are done with generating the final output, reply with TERMINATE." + ), + ), + memory=[memory], + ) + self._model_client = model_client + + @message_handler(match=lambda msg, ctx: msg.source.startswith("SDGExpert")) # type: ignore + async def handle_syllabus(self, message: Message, ctx: MessageContext) -> Message: + print("handle_syllabus final") + """ + Handles the syllabus by improving on the pedagogical aspects and ensures that the competencies cited in the EU GreenComp framework are present in a coherent manner with the discipline and course content. + Args: + message (Message): The message containing the syllabus content. + ctx (MessageContext): The context of the message. + Returns: + None + """ + + prompt = f"Ensure that the syllabus is pedagogically sound, aligns with competency-based learning, and optimizes student engagement and learning effectiveness. Ensure that the learning objectives, outcomes and the competencies and related in a logical and meaningful way, and that these overarching goals are accomplished through the course plan and activities, also ensure that the competencies cited in the EU GreenComp framework are present in the syllabus in a way that is coherent with the discipline and the course content.\n\nSYLLABUS:\n{message.content}" + llm_result = await self._delegate.on_messages( + [TextMessage(content=prompt, source=self.id.key)], + ctx.cancellation_token, + ) + response = llm_result.chat_message.content + assert isinstance(response, str) + # print(f"\n\n{'-'*80}\n{self.id.type}\n{'-'*80}\n\n{response}") + + # await self.publish_message( + # Message(content=response), + # topic_id=TopicId(user_input_topic_type, source=self.id.key), + # ) + + return Message(content=response) diff --git a/src/app/services/tutor/models.py b/src/app/services/tutor/models.py new file mode 100644 index 0000000..632e41d --- /dev/null +++ b/src/app/services/tutor/models.py @@ -0,0 +1,42 @@ +from typing import Dict, List +from pydantic import BaseModel + +from src.app.models.documents import Document + + +class ExtractorOutput(BaseModel): + original_document: str + summary: str + themes: list[str] + + +class ExtractorOuputList(BaseModel): + extracts: list[ExtractorOutput] + + +class TutorSearchResponse(BaseModel): + extracts: list[ExtractorOutput] + nb_results: int + documents: list[Document] + + +class Message(BaseModel): + content: str + source: str = "default" + + +class MessageWithAnalysis(BaseModel): + content: Dict + source: str = "default" + + +class MessageWithResources(BaseModel): + content: Dict | str + resources: List[Document] + source: str = "default" + + +class MessageWithFeedback(BaseModel): + content: str + feedback: str + source: str = "default" diff --git a/src/app/services/tutor/template.md b/src/app/services/tutor/template.md new file mode 100644 index 0000000..9191e81 --- /dev/null +++ b/src/app/services/tutor/template.md @@ -0,0 +1,8 @@ +1. Course Description: Brief overview of the course content and objectives. Relevance to the broader academic program. +2. Learning Objectives: Learning objectives describe what the instructor intends to teach or cover in a course. They are broad, general statements that define what learners will be exposed to during the course. These are usually teacher-centered and focus on content delivery. Guidelines for Formulating Learning Objectives: Use clear, action-oriented verbs (avoid vague terms like "understand" or "appreciate"); Define the scope and depth of the content; Align with disciplinary expectations and institutional requirements; Ensure feasibility within the course timeline. Examples of Learning Objectives: "Introduce students to the fundamentals of sustainable development."; "Familiarize students with different data visualization techniques in social sciences."; "Provide an overview of historical methodologies in analyzing climate change." +3. Learning Outcomes: Learning outcomes describe what students will be able to do by the end of the course. They are specific, measurable statements that focus on student capabilities and achievements rather than instructional intent. They are linked to the learning objectives but they are student-centered, more specific and measurable. Guidelines for Formulating Learning Outcomes: Begin with a strong action verb (e.g., analyze, evaluate, design, synthesize).; Ensure each outcome is observable and assessable.; Specify the level of mastery expected.; Align with program-level learning goals and institutional accreditation standards. Examples of Learning Outcomes: "By the end of the course, students will be able to critically evaluate the impact of climate change policies on global sustainability."; "Students will be able to design and conduct a research study using qualitative and quantitative methods."; "Students will be able to effectively communicate sustainability strategies to non-specialist audiences." +4. Competencies Developed: Competencies refer to a holistic combination of knowledge, skills, and attitudes necessary for success in a given domain. Unlike learning outcomes, which focus on specific achievements, competencies emphasize the transferability of skills across contexts. Guidelines for Formulating Competencies: Ensure transferability beyond a single course (e.g., critical thinking, teamwork, ethical reasoning).; Integrate technical knowledge and soft skills.; Consider long-term professional and societal relevance. Examples of Competencies: "Demonstrates the ability to work collaboratively in interdisciplinary teams."; "Applies data-driven decision-making to real-world environmental challenges."; "Engages in critical reflection on ethical dilemmas in artificial intelligence." + Interaction Between Learning Objectives, Learning Outcomes, and Competencies: Learning objectives provide a roadmap for what will be taught, learning outcomes specify what students should achieve, and competencies ensure that students develop transferable skills beyond the course context. Example for a Sustainability Course: Learning Objective-"Introduce students to key sustainability frameworks."; Learning Outcome-"Students will be able to compare and contrast the UN Sustainable Development Goals (SDGs) and the Paris Agreement."; Competency-"Develops interdisciplinary thinking to assess global sustainability policies." By ensuring that all three elements align, course design becomes coherent, structured, and impactful. +5. Assessment Methods: Breakdown of grading (e.g., exams, presentations, group projects). Alignment with learning outcomes. +6. Course Schedule: Week-by-week breakdown of topics covered and learning outcomes targeted each week. +7. References: All sources used to generate the syllabus, including any source documents or WeLearn documents used to construct the syllabus. diff --git a/src/app/services/tutor/tutor.py b/src/app/services/tutor/tutor.py new file mode 100644 index 0000000..90d1b9f --- /dev/null +++ b/src/app/services/tutor/tutor.py @@ -0,0 +1,101 @@ +import asyncio +import os +from typing import Dict, List + +from autogen_agentchat.agents import AssistantAgent +from autogen_agentchat.messages import TextMessage +from autogen_core import ( + AgentId, + SingleThreadedAgentRuntime, +) +from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType +from autogen_ext.models.openai import AzureOpenAIChatCompletionClient +from dotenv import load_dotenv +from pydantic import BaseModel + +from src.app.services.tutor.agents import ( + UniversityTeacherAgent, + university_teacher_topic_type, + SDGExpertAgent, + sdg_expert_topic_type, + PedagogicalEngineerAgent, + pedagogical_engineer_topic_type, +) +from src.app.services.tutor.models import Message, TutorSearchResponse + + +load_dotenv() + + +llm_4o_mini = AzureOpenAIChatCompletionClient( + azure_deployment="gpt-4o-mini", + model="gpt-4o-mini", + api_version=os.environ.get("AZURE_GPT_4O_MINI_API_VERSION"), + azure_endpoint=os.environ.get("AZURE_GPT_4O_MINI_API_BASE"), + api_key=os.environ.get("AZURE_GPT_4O_MINI_API_KEY"), +) + + +async def tutor_manager(content: TutorSearchResponse) -> None: + greencomp_memory = ListMemory() + + await greencomp_memory.add( + MemoryContent( + content="Here are the GreenComp competencies: " + "1.1 Valuing sustainability: To reflect on personal values; identify and explain how values vary among people and over time, while critically evaluating how they align with sustainability values. " + "1.2 Supporting fairness: To support equity and justice for current and future generations and learn from previous generations for sustainability. " + "1.3 Promoting nature: To acknowledge that humans are part of nature; and to respect the needs and rights of other species and of nature itself in order to restore and regenerate healthy and resilient ecosystems. " + "2.1 Systems thinking: To approach a sustainability problem from all sides; to consider time, space and context in order to understand how elements interact within and between systems. " + "2.2 Critical thinking: To assess information and arguments, identify assumptions, challenge the status quo, and reflect on how personal, social and cultural backgrounds influence thinking and conclusions. " + "2.3 Problem framing: To formulate current or potential challenges as a sustainability problem in terms of difficulty, people involved, time and geographical scope, in order to identify suitable approaches to anticipating and preventing problems, and to mitigating and adapting to already existing problems. " + "3.1 Futures literacy: To envision alternative sustainable futures by imagining and developing alternative scenarios and identifying the steps needed to achieve a preferred sustainable future. " + "3.2 Adaptability: To manage transitions and challenges in complex sustainability situations and make decisions related to the future in the face of uncertainty, ambiguity and risk. " + "3.3 Exploratory thinking: To adopt a relational way of thinking by exploring and linking different disciplines, using creativity and experimentation with novel ideas or methods. " + "4.1 Political agency: To navigate the political system, identify political responsibility and accountability for unsustainable behaviour, and demand effective policies for sustainability. " + "4.2 Collective action: To act for change in collaboration with others. " + "4.3 Individual initiative: To identify own potential for sustainability and to actively contribute to improving prospects for the community and the planet.The weather should be in metric units", + mime_type=MemoryMimeType.TEXT, + ) + ) + + runtime = SingleThreadedAgentRuntime() + + await UniversityTeacherAgent.register( + runtime, + type=university_teacher_topic_type, + factory=lambda: UniversityTeacherAgent(model_client=llm_4o_mini), + ) + + await SDGExpertAgent.register( + runtime, + type=sdg_expert_topic_type, + factory=lambda: SDGExpertAgent(model_client=llm_4o_mini), + ) + + await PedagogicalEngineerAgent.register( + runtime, + type=pedagogical_engineer_topic_type, + factory=lambda: PedagogicalEngineerAgent( + model_client=llm_4o_mini, memory=greencomp_memory + ), + ) + + runtime.start() + + # response = await runtime.publish_message( + # content, + # topic_id=TopicId(university_teacher_topic_type, source="default"), + # ) + response = await runtime.send_message( + content, + recipient=AgentId(university_teacher_topic_type, "default"), + ) + print('!!!!!!!!!!!!!!!', response) + + await runtime.stop_when_idle() + + await runtime.close() + return response + + +# asyncio.run(main()) diff --git a/src/app/services/tutor/utils.py b/src/app/services/tutor/utils.py new file mode 100644 index 0000000..aa21f0f --- /dev/null +++ b/src/app/services/tutor/utils.py @@ -0,0 +1,15 @@ +def build_system_message( + role: str, + backstory: str, + goal: str, + instructions: str | None = None, + expected_output: str | None = None, +) -> str: + message = f"You are {role}. {backstory}\nYour personal goal is: {goal}." + if instructions: + message += ( + f"You must accomplish your goal by following these steps: {instructions}" + ) + if expected_output: + message += f"\nThis is the expected criteria for your final answer: {expected_output}\nYou MUST return the actual complete content as the final answer, not a summary." + return message diff --git a/src/crews/agents.yaml b/src/crews/agents.yaml deleted file mode 100644 index 10430ce..0000000 --- a/src/crews/agents.yaml +++ /dev/null @@ -1,25 +0,0 @@ -theme_extractor: - role: > - You extract the main themes from a text or collection of texts. - goal: > - Analyse a text or collection of texts and extract the main themes, explaining why each theme was identified. - backstory: > - You are specialised in analysing documents and extracting the main themes. You value precision and clarity. - llm: > - azure/gpt-4o-mini - -university_teacher: - role: > - University teacher that is an expert in pedagogical engineering and learning sciences. - You love to infuse SDGs into courses to create impactful educational resources. - goal: > - Create university courses that include SDG-related content in a way that is related to the discipline in question. - backstory: > - You're a university teacher with expertise in all disciplines and how to link them to the Sustainable Development Goals (SDGs). - You're passionate about sharing your knowledge with students and creating engaging learning content. - You're able to design courses in all disciplines in a way that coherently weaves in content related to the SDGs. - Your overarching goal is to ensure that all university students, regardless of their discipline, acquire foundational knowledge on the SDGs - and are able to think about how they can contribute to accomplishing the SDGs in their respective fields. - llm: > - azure/gpt-4o-mini - diff --git a/src/crews/crew_manager.py b/src/crews/crew_manager.py deleted file mode 100644 index 1d20636..0000000 --- a/src/crews/crew_manager.py +++ /dev/null @@ -1,46 +0,0 @@ -import os - -from crewai.flow import Flow, start -from pydantic import BaseModel - -from src.crews.oddish_crew import OddishCrew - -# Optional: Use environment variables for API keys -os.environ["OPENAI_API_KEY"] = "your_openai_api_key" - - -class OddishState(BaseModel): - # Note: 'id' field is automatically added to all states - text_contents: list[str] = [] - resources: list = [] - course: str = "" - - -class OddishFlow(Flow[OddishState]): - @start() - def draft_course(self): - print("Drafting course") - course = ( - OddishCrew() - .crew() - .kickoff( - inputs={ - "text_contents": self.state.text_contents, - "search_results": self.state.resources, - } - ) - ) - self.state.course = course.raw - return self.state.course - - -async def kickoff(text_contents, search_results): - oddish_flow = OddishFlow() - return await oddish_flow.kickoff_async( - inputs={"text_contents": text_contents, "search_results": search_results} - ) - - -def plot(): - oddish_flow = OddishFlow() - oddish_flow.plot() diff --git a/src/crews/oddish_crew.py b/src/crews/oddish_crew.py deleted file mode 100644 index 4825f08..0000000 --- a/src/crews/oddish_crew.py +++ /dev/null @@ -1,64 +0,0 @@ -from crewai import Agent, Crew, Process, Task -from crewai.project import CrewBase, agent, crew, task - -# If you want to run a snippet of code before or after the crew starts, -# you can use the @before_kickoff and @after_kickoff decorators -# https://docs.crewai.com/concepts/crews#example-crew-class-with-decorators - - -@CrewBase -class OddishCrew: - """Oddish crew""" - - # Learn more about YAML configuration files here: - # Agents: https://docs.crewai.com/concepts/agents#yaml-configuration-recommended - # Tasks: https://docs.crewai.com/concepts/tasks#yaml-configuration-recommended - agents_config = "agents.yaml" - tasks_config = "tasks.yaml" - - # If you would lik to add tools to your crew, you can learn more about it here: - # https://docs.crewai.com/concepts/agents#agent-tools - @agent - def theme_extractor(self) -> Agent: - return Agent( - config=self.agents_config["theme_extractor"], - verbose=True, - llm="azure/gpt-4o-mini", - ) - - @agent - def university_teacher(self) -> Agent: - return Agent( - config=self.agents_config["university_teacher"], - verbose=True, - llm="azure/gpt-4o-mini", - ) - - # To learn more about structured task outputs, - # task dependencies, and task callbacks, check out the documentation: - # https://docs.crewai.com/concepts/tasks#overview-of-a-task - @task - def extract_input_themes(self) -> Task: - return Task( - config=self.tasks_config["extract_input_themes"], - ) - - @task - def generate_course_plan(self) -> Task: - return Task( - config=self.tasks_config["generate_course_plan"], - ) - - @crew - def crew(self) -> Crew: - """Creates the Oddish Crew""" - # To learn how to add knowledge sources to your crew, check out the documentation: - # https://docs.crewai.com/concepts/knowledge#what-is-knowledge - - return Crew( - agents=self.agents, # Automatically created by the @agent decorator - tasks=self.tasks, # Automatically created by the @task decorator - process=Process.sequential, - verbose=True, - memory=False, - ) diff --git a/src/crews/tasks.yaml b/src/crews/tasks.yaml deleted file mode 100644 index 1cb048b..0000000 --- a/src/crews/tasks.yaml +++ /dev/null @@ -1,14 +0,0 @@ -extract_input_themes: - description: > - Extract the main themes of the input documents in {text_contents} and explain why in order to ensure you have understood the input documents correctly. - expected_output: > - A list of the main themes identified in the input documents with brief explanations. - agent: theme_extractor - -generate_course_plan: - description: > - Using the content in both {text_contents} and {search_results}, you generate a course plan that is engaging and coherent in relation to the main themes extracted by the theme_extractor. - expected_output: > - A course plan Formatted as markdown without '```' - agent: university_teacher - context: [extract_input_themes] From 8b96836815a396c0762ba7d2e591addacfbc68c8 Mon Sep 17 00:00:00 2001 From: CRI USER Date: Mon, 7 Apr 2025 17:09:29 +0200 Subject: [PATCH 2/7] working version of syllabus --- src/app/api/api_v1/endpoints/tutor.py | 38 ++++++++------ src/app/core/config.py | 4 +- src/app/services/search_helpers.py | 1 + src/app/services/tutor/agents.py | 46 +++++++---------- src/app/services/tutor/models.py | 13 +++++ src/app/services/tutor/tutor.py | 74 ++++++++++++++++----------- 6 files changed, 101 insertions(+), 75 deletions(-) diff --git a/src/app/api/api_v1/endpoints/tutor.py b/src/app/api/api_v1/endpoints/tutor.py index 600c6f5..5995442 100644 --- a/src/app/api/api_v1/endpoints/tutor.py +++ b/src/app/api/api_v1/endpoints/tutor.py @@ -3,11 +3,14 @@ from fastapi import APIRouter, File, Response, UploadFile from src.app.api.dependencies import get_settings - from src.app.services.abst_chat import AbstractChat, ChatFactory from src.app.services.search import SearchService from src.app.services.search_helpers import search_multi_inputs -from src.app.services.tutor.models import ExtractorOuputList, TutorSearchResponse +from src.app.services.tutor.models import ( + ExtractorOuputList, + SyllabusResponse, + TutorSearchResponse, +) from src.app.services.tutor.tutor import tutor_manager from src.app.utils.logger import logger as utils_logger @@ -37,7 +40,15 @@ async def tutor_search( response: Response, ): file_content: list[bytes] = [await file.read() for file in files] - file_content_str = [f"Document {index+1}: {content.decode("utf-8")}" for index, content in enumerate(file_content)] + doc_list_to_string = "Document {doc_nb}: {content}" + + file_content_str = [ + doc_list_to_string.format( + doc_nb=index + 1, + content=content.decode("utf-8", errors="ignore"), + ) + for index, content in enumerate(file_content) + ] file_content_str = "\n\n".join(file_content_str) messages = [ @@ -48,7 +59,7 @@ async def tutor_search( themes_extracted = await chatfactory.chat_schema( model="gpt-4o-mini", messages=messages, response_format=ExtractorOuputList # type: ignore ) - + if not themes_extracted or not themes_extracted.extracts: # handle error return TutorSearchResponse( @@ -65,7 +76,7 @@ async def tutor_search( nb_results=5, sdg_filter=None, collections=None, - callback_function=sp.search + callback_function=sp.search, ) if not search_results: @@ -76,10 +87,10 @@ async def tutor_search( ) resp = TutorSearchResponse( - extracts=themes_extracted.extracts, - nb_results=len(search_results), - documents=search_results - ) + extracts=themes_extracted.extracts, + nb_results=len(search_results), + documents=search_results, + ) # TODO: handle duplicates @@ -87,10 +98,7 @@ async def tutor_search( @router.post("/syllabus") -async def create_syllabus(body: TutorSearchResponse): - syllabus = await tutor_manager(body) - - #TODO: fix error AgentChat - +async def create_syllabus(body: TutorSearchResponse) -> SyllabusResponse: + result = await tutor_manager(body) - return syllabus + return SyllabusResponse(syllabus=result.content, documents=body.documents) diff --git a/src/app/core/config.py b/src/app/core/config.py index 9da4874..f0b6f95 100644 --- a/src/app/core/config.py +++ b/src/app/core/config.py @@ -22,7 +22,7 @@ class Settings(BaseSettings): BACKEND_CORS_ORIGINS_REGEX: str = CLIENT_ORIGINS_REGEX - def get_api_version(cls): + def get_api_version(self, cls): return { "title": cls.PROJECT_NAME, "api_version": cls.API_V1_STR, @@ -63,4 +63,4 @@ def get_api_version(cls): ) -settings = Settings() +settings = Settings() # type: ignore diff --git a/src/app/services/search_helpers.py b/src/app/services/search_helpers.py index d157d67..51759ed 100644 --- a/src/app/services/search_helpers.py +++ b/src/app/services/search_helpers.py @@ -143,6 +143,7 @@ async def search_multi_inputs( try: all_data = await coroutine except CollectionNotFoundError as e: + logger.error(e.message) response.status_code = 206 if not all_data: diff --git a/src/app/services/tutor/agents.py b/src/app/services/tutor/agents.py index 87a898c..59ee87b 100644 --- a/src/app/services/tutor/agents.py +++ b/src/app/services/tutor/agents.py @@ -9,9 +9,11 @@ ) from autogen_core.memory import ListMemory from autogen_core.models import ChatCompletionClient, SystemMessage, UserMessage + from src.app.services.tutor.models import ( Message, MessageWithResources, + TaskResponse, TutorSearchResponse, ) from src.app.services.tutor.utils import build_system_message @@ -26,6 +28,10 @@ user_input_topic_type = "UserInputAgent" user_topic_type = "User" +CLOSURE_AGENT_TYPE = "collect_result_agent" +TASK_RESULTS_TOPIC_TYPE = "task-results" +task_results_topic_id = TopicId(type=TASK_RESULTS_TOPIC_TYPE, source="default") + @type_subscription(topic_type=university_teacher_topic_type) class UniversityTeacherAgent(RoutedAgent): @@ -42,7 +48,6 @@ class UniversityTeacherAgent(RoutedAgent): """ def __init__(self, model_client: ChatCompletionClient) -> None: - print("UniversityTeacherAgent") super().__init__("A university teacher agent.") self._system_message = SystemMessage( content=( @@ -73,7 +78,6 @@ def __init__(self, model_client: ChatCompletionClient) -> None: async def handle_documents_and_themes( self, message: TutorSearchResponse, ctx: MessageContext ) -> None: - print("handle_documents_and_themes") prompt = f"Using the content in TEXT CONTENTS, you generate a syllabus that is engaging and coherent in relation to the THEMES extracted from these contents. \n\nTEXT CONTENTS:\n{message.extracts[0].original_document}\n\nTHEMES:\n{message.extracts[0].themes}" llm_result = await self._model_client.create( @@ -106,7 +110,7 @@ class SDGExpertAgent(RoutedAgent): Handles messages from university professors and integrates sustainability concepts in a thematically linked and relevant manner. """ - def __init__(self, model_client: ChatCompletionClient) -> None: + def __init__(self, model_client: ChatCompletionClient, memory: ListMemory) -> None: super().__init__("An SDG expert agent.") self._delegate = AssistantAgent( "SDGExpert", @@ -123,23 +127,20 @@ def __init__(self, model_client: ChatCompletionClient) -> None: "Competencies Developed: If relevant, integrate sustainability competencies." "Course Schedule: Introduce sustainability-related themes into weekly topics where appropriate." "References: NEVER delete, summarize, or modify any references already present in the syllabus. Only append this section with any additional sources that you use to construct the syllabus. " - "3. Save a file to the current directory:" - f"Revised syllabus File: The updated syllabus with integrated sustainability elements. Name the file: SDG-exp_syllabus.md" ), expected_output=( f"1. Final Syllabus File: The revised syllabus, ready for the pedagogical engineer's review. You must follow this template :\n {TEMPLATES['template0']}. Name the file: SDG-exp_syllabus.md" "When you are done with generating the final output, reply with SDG EXPERT DONE." ), ), + memory=[memory], ) self._model_client = model_client @message_handler(match=lambda msg, ctx: msg.source.startswith("UniversityTeacher")) # type: ignore async def handle_syllabus( self, message: MessageWithResources, ctx: MessageContext - ) -> Message: - print("handle_syllabus", ctx) - print("handle_syllabus") + ) -> None: """ Handles the syllabus by integrating SDG content from the documents in the WeLearn resources. Args: @@ -159,25 +160,16 @@ async def handle_syllabus( print("Error in SDGExpertAgent:", e) raise e response = llm_result.chat_message.content - + assert isinstance(response, str) - - print(f"\n\n{'-'*80}\n{self.id.type}\n{'-'*80}\n\n{response}") - - # await self.publish_message( - # Message(content=response, source=self.id.type), - # topic_id=TopicId(pedagogical_engineer_topic_type, source=self.id.key), - # ) - toto = Message(content=response, source=self.id.type) - return Message( - content=response, - source=self.id.type, - ) + await self.publish_message( + Message(content=response, source=self.id.type), + topic_id=TopicId(pedagogical_engineer_topic_type, source=self.id.key), + ) @type_subscription(topic_type=pedagogical_engineer_topic_type) class PedagogicalEngineerAgent(RoutedAgent): - print("PedagogicalEngineerAgent") """ A pedagogical engineer agent that assists university professors in constructing their syllabus. This agent ensures that the syllabus contains appropriate learning objectives, learning outcomes, and a corresponding course plan. It focuses specifically on teaching methodologies and pedagogical approaches. It integrates the European sustainability competence framework GreenComp into existing courses. Attributes: @@ -221,7 +213,6 @@ def __init__(self, model_client: ChatCompletionClient, memory: ListMemory) -> No @message_handler(match=lambda msg, ctx: msg.source.startswith("SDGExpert")) # type: ignore async def handle_syllabus(self, message: Message, ctx: MessageContext) -> Message: - print("handle_syllabus final") """ Handles the syllabus by improving on the pedagogical aspects and ensures that the competencies cited in the EU GreenComp framework are present in a coherent manner with the discipline and course content. Args: @@ -238,11 +229,10 @@ async def handle_syllabus(self, message: Message, ctx: MessageContext) -> Messag ) response = llm_result.chat_message.content assert isinstance(response, str) - # print(f"\n\n{'-'*80}\n{self.id.type}\n{'-'*80}\n\n{response}") - # await self.publish_message( - # Message(content=response), - # topic_id=TopicId(user_input_topic_type, source=self.id.key), - # ) + await self.publish_message( + TaskResponse(result=response, task_id="pedagogical"), + task_results_topic_id, + ) return Message(content=response) diff --git a/src/app/services/tutor/models.py b/src/app/services/tutor/models.py index 632e41d..ec22284 100644 --- a/src/app/services/tutor/models.py +++ b/src/app/services/tutor/models.py @@ -1,4 +1,6 @@ +from dataclasses import dataclass from typing import Dict, List + from pydantic import BaseModel from src.app.models.documents import Document @@ -20,6 +22,11 @@ class TutorSearchResponse(BaseModel): documents: list[Document] +class SyllabusResponse(BaseModel): + syllabus: str + documents: list[Document] + + class Message(BaseModel): content: str source: str = "default" @@ -40,3 +47,9 @@ class MessageWithFeedback(BaseModel): content: str feedback: str source: str = "default" + + +@dataclass +class TaskResponse: + task_id: str + result: str diff --git a/src/app/services/tutor/tutor.py b/src/app/services/tutor/tutor.py index 90d1b9f..9871112 100644 --- a/src/app/services/tutor/tutor.py +++ b/src/app/services/tutor/tutor.py @@ -1,44 +1,50 @@ import asyncio -import os -from typing import Dict, List -from autogen_agentchat.agents import AssistantAgent -from autogen_agentchat.messages import TextMessage from autogen_core import ( AgentId, + ClosureAgent, + ClosureContext, + MessageContext, SingleThreadedAgentRuntime, + TypeSubscription, ) from autogen_core.memory import ListMemory, MemoryContent, MemoryMimeType from autogen_ext.models.openai import AzureOpenAIChatCompletionClient -from dotenv import load_dotenv -from pydantic import BaseModel +from src.app.api.dependencies import get_settings from src.app.services.tutor.agents import ( - UniversityTeacherAgent, - university_teacher_topic_type, - SDGExpertAgent, - sdg_expert_topic_type, + CLOSURE_AGENT_TYPE, + TASK_RESULTS_TOPIC_TYPE, PedagogicalEngineerAgent, + SDGExpertAgent, + UniversityTeacherAgent, pedagogical_engineer_topic_type, + sdg_expert_topic_type, + university_teacher_topic_type, ) -from src.app.services.tutor.models import Message, TutorSearchResponse +from src.app.services.tutor.models import Message, TaskResponse, TutorSearchResponse - -load_dotenv() +settings = get_settings() llm_4o_mini = AzureOpenAIChatCompletionClient( azure_deployment="gpt-4o-mini", model="gpt-4o-mini", - api_version=os.environ.get("AZURE_GPT_4O_MINI_API_VERSION"), - azure_endpoint=os.environ.get("AZURE_GPT_4O_MINI_API_BASE"), - api_key=os.environ.get("AZURE_GPT_4O_MINI_API_KEY"), + api_version=settings.AZURE_API_VERSION, + azure_endpoint=settings.AZURE_API_BASE, + api_key=settings.AZURE_API_KEY, ) -async def tutor_manager(content: TutorSearchResponse) -> None: - greencomp_memory = ListMemory() +async def tutor_manager(content: TutorSearchResponse) -> Message: + queue = asyncio.Queue[TaskResponse]() + async def collect_result( + _agent: ClosureContext, message: TaskResponse, ctx: MessageContext + ) -> None: + await queue.put(message) + + greencomp_memory = ListMemory() await greencomp_memory.add( MemoryContent( content="Here are the GreenComp competencies: " @@ -69,7 +75,9 @@ async def tutor_manager(content: TutorSearchResponse) -> None: await SDGExpertAgent.register( runtime, type=sdg_expert_topic_type, - factory=lambda: SDGExpertAgent(model_client=llm_4o_mini), + factory=lambda: SDGExpertAgent( + model_client=llm_4o_mini, memory=greencomp_memory + ), ) await PedagogicalEngineerAgent.register( @@ -82,20 +90,26 @@ async def tutor_manager(content: TutorSearchResponse) -> None: runtime.start() - # response = await runtime.publish_message( - # content, - # topic_id=TopicId(university_teacher_topic_type, source="default"), - # ) - response = await runtime.send_message( + await ClosureAgent.register_closure( + runtime, + CLOSURE_AGENT_TYPE, + collect_result, + subscriptions=lambda: [ + TypeSubscription( + topic_type=TASK_RESULTS_TOPIC_TYPE, agent_type=CLOSURE_AGENT_TYPE + ) + ], + ) + + await runtime.send_message( content, recipient=AgentId(university_teacher_topic_type, "default"), ) - print('!!!!!!!!!!!!!!!', response) await runtime.stop_when_idle() - - await runtime.close() - return response + response: TaskResponse = TaskResponse(task_id="", result="") + if not queue.empty(): + response = await queue.get() - -# asyncio.run(main()) + await runtime.close() + return Message(content=response.result) From 8f97c38931ed9d96cd8f77f189d0c26ebd6da1dd Mon Sep 17 00:00:00 2001 From: CRI USER Date: Mon, 7 Apr 2025 17:38:48 +0200 Subject: [PATCH 3/7] handles tests --- .coveragerc | 4 ++-- src/app/tests/services/tutor/test_utils.py | 22 +++++++++++++++++++ src/app/tests/tests_files/tutor_test_file.txt | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/app/tests/services/tutor/test_utils.py create mode 100644 src/app/tests/tests_files/tutor_test_file.txt diff --git a/.coveragerc b/.coveragerc index 565e986..9a1b890 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,5 +1,5 @@ [run] omit = - src/app/api/api_v1/endpoints/tutor.py - src/crews/* \ No newline at end of file + src/app/services/tutor/agents.py + src/app/services/tutor/tutor.py diff --git a/src/app/tests/services/tutor/test_utils.py b/src/app/tests/services/tutor/test_utils.py new file mode 100644 index 0000000..05f12b4 --- /dev/null +++ b/src/app/tests/services/tutor/test_utils.py @@ -0,0 +1,22 @@ +from unittest import TestCase + +from src.app.services.tutor.utils import build_system_message + + +class TestTutorUtils(TestCase): + def test_build_system_message(self): + message = build_system_message( + role="tutor", + backstory="You are a tutor", + goal="help students learn", + instructions="Follow the syllabus", + expected_output="Detailed explanation", + ) + expected_message = ( + "You are tutor. You are a tutor\nYour personal goal is: help students learn." + "You must accomplish your goal by following these steps: Follow the syllabus" + "\nThis is the expected criteria for your final answer: Detailed explanation" + "\nYou MUST return the actual complete content as the final answer, not a summary." + ) + + self.assertEqual(message, expected_message) diff --git a/src/app/tests/tests_files/tutor_test_file.txt b/src/app/tests/tests_files/tutor_test_file.txt new file mode 100644 index 0000000..c67dace --- /dev/null +++ b/src/app/tests/tests_files/tutor_test_file.txt @@ -0,0 +1 @@ +this is a mocked text file From c5a20d35761513cd4010b33afa9a89bf0875f371 Mon Sep 17 00:00:00 2001 From: CRI USER Date: Tue, 8 Apr 2025 10:56:10 +0200 Subject: [PATCH 4/7] fix missing packages --- poetry.lock | 17 ++++++++++++++++- pyproject.toml | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index fd58b2b..afedf77 100644 --- a/poetry.lock +++ b/poetry.lock @@ -226,6 +226,21 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\""] +[[package]] +name = "autogen-agentchat" +version = "0.4.9.3" +description = "AutoGen agents and teams library" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "autogen_agentchat-0.4.9.3-py3-none-any.whl", hash = "sha256:574956e65fad2029ec267ed143388c81f8fd308a06ca08773e63c2757ed9a1d1"}, + {file = "autogen_agentchat-0.4.9.3.tar.gz", hash = "sha256:d101fa3d536df3aef845f6038ba77a1603e06fdd4e2547a89accc59128d5aaa1"}, +] + +[package.dependencies] +autogen-core = "0.4.9.3" + [[package]] name = "autogen-core" version = "0.4.9.3" @@ -5944,4 +5959,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<3.13" -content-hash = "743de02862850b50b3b724bfe53e9fe325654533c29b8828efa8c6f9f6caff77" +content-hash = "395a5f09607b7ca5550b4f6f6002fdd8104f1e374f41e83701f8991c59198242" diff --git a/pyproject.toml b/pyproject.toml index 4d83606..038f711 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ torchvision = {version = "^0.17.2+cpu", source = "pytorch_cpu"} uvicorn = {extras = ["standard"], version = "^0.29.0"} autogen-core = "^0.4.9.3" autogen-ext = "^0.4.9.3" +autogen-agentchat = "^0.4.9.2" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" From 2157ceb1728de3e5d8e88d4f7c34140239be666f Mon Sep 17 00:00:00 2001 From: CRI USER Date: Tue, 8 Apr 2025 15:23:14 +0200 Subject: [PATCH 5/7] add nex steps TODOs --- src/app/api/api_v1/endpoints/tutor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/api/api_v1/endpoints/tutor.py b/src/app/api/api_v1/endpoints/tutor.py index 5995442..293b862 100644 --- a/src/app/api/api_v1/endpoints/tutor.py +++ b/src/app/api/api_v1/endpoints/tutor.py @@ -61,7 +61,6 @@ async def tutor_search( ) if not themes_extracted or not themes_extracted.extracts: - # handle error return TutorSearchResponse( extracts=[], nb_results=0, @@ -100,5 +99,7 @@ async def tutor_search( @router.post("/syllabus") async def create_syllabus(body: TutorSearchResponse) -> SyllabusResponse: result = await tutor_manager(body) + # TODO: handle errors + # TODO: mae sure documents are used return SyllabusResponse(syllabus=result.content, documents=body.documents) From cb088eb1ffce5a1e9c59c680e70d74ae26e72eaa Mon Sep 17 00:00:00 2001 From: CRI USER Date: Wed, 9 Apr 2025 16:37:11 +0200 Subject: [PATCH 6/7] use gpt_4O --- k8s/welearn-api/secrets.dev.yaml | 7 ++++--- k8s/welearn-api/secrets.prod.yaml | 7 ++++--- k8s/welearn-api/values.dev.yaml | 1 + k8s/welearn-api/values.prod.yaml | 1 + k8s/welearn-api/values.yaml | 1 + pytest.ini | 5 +++++ src/app/core/config.py | 5 ++++- src/app/services/search.py | 4 +++- src/app/services/tutor/agents.py | 20 ++++++++++++++++++++ src/app/services/tutor/tutor.py | 10 +++++----- 10 files changed, 48 insertions(+), 13 deletions(-) diff --git a/k8s/welearn-api/secrets.dev.yaml b/k8s/welearn-api/secrets.dev.yaml index 84f4f63..d451b81 100644 --- a/k8s/welearn-api/secrets.dev.yaml +++ b/k8s/welearn-api/secrets.dev.yaml @@ -1,6 +1,7 @@ config: sensitive: AZURE_API_KEY: ENC[AES256_GCM,data:vU5sozgleY904OU1Fb0yEaRzWYNHnCD2ILjthvtSfk4=,iv:b7ItArThdtIsz1qvgpptbOq96GHa1q6VWAweHYWw2Po=,tag:emJB+azc6vcIWCgv8idtyg==,type:str] + AZURE_4O_API_KEY: ENC[AES256_GCM,data:vhtwbX4naziWiNGYA0rdyb82c1IuSnx2qWZhMfscCHQ=,iv:Tv0uy4c2Ekr1eIuNr577sPJzgpaUO6TWk1l3kZOUq5M=,tag:M7zVhgcR6tGeDrgJRzCU7w==,type:str] MISTRAL_API_KEY: ENC[AES256_GCM,data:7Oqb2b3PZEbuqhSBGjqRQYz637xnho4D1T4Bkg+oBk0=,iv:6/RMp5QRcz9Rvku6l+j9w7qVtBp7to4fc5wQ+iWMjxA=,tag:dCGleGpG+6EPj1OJF6KTWQ==,type:str] PG_PASSWORD: ENC[AES256_GCM,data:8GsISVAuJyIh0WUFwb9mpqyWcNT04fnmpH4ru5CA+aw=,iv:oGKLDiadbhRQWVSE5J/4QJbppiTIcHhNr9fFY7XI0jY=,tag:Ksk0uMrB9fmVT8thQODFJA==,type:str] AZURE_LLAMA_31_8B_API_KEY: ENC[AES256_GCM,data:1QoINoywOPJnzFrdHMaTua1QFF0zDfhOsRSq5BZMFbc=,iv:SdvSiIUsv2kG7pA7T7Bcr/WYcXIhX9RPrFAgpzhtb10=,tag:AvmJFATaTbYiSi5j542eEQ==,type:str] @@ -42,8 +43,8 @@ sops: SE5yTm9yVEdjeUwrNW1sMnkvMVgwd2cK7TBA3a/Uq262Q30hz++Vwg6GFTjiD+AB zLZuHPmOMe8wa0Tiei+KRiTb8zXN/I8/ZW83L7irTKWbTTIKbJfIpQ== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-02-27T14:16:38Z" - mac: ENC[AES256_GCM,data:QAX0egQxpSauBBEhfoT0QvOv8ISngpnDyodbhE7Q2kfriuys7JyeFZ7qd2MUvWYTu2ZO88vh3hJTUA+Tht75ZP/G7951u861vZ0ta3MdMTc9R1HEtQPsvafWlVDHVF8hnUOKT9rwnhvKaV4KHhZlm996QBX/HQfL/3zw3dp+cU8=,iv:FpDks7RzZQkATv47QpuY2Glgc3vGdpKM/p35+4B1igY=,tag:5vErXlRl6nZ+2aT8GiyN+g==,type:str] + lastmodified: "2025-04-09T14:26:49Z" + mac: ENC[AES256_GCM,data:ZyQ3EZuVY0s0AXzyWB3jQMZuG+H54rwac0sacRf8e0mxVC6ab9v1QUR7pI0ND/vxultNfhMQ5aQ7vZd3OKPxW+zgTLAi9dNDe79S0+edCrHfqUkPnJDd/RRyRRyBXv17oV4ptZ0DljKCQhGpKVBihOEzt0xX3952JYtZpLrpZWw=,iv:cvNgZkgy+sVE0zbdvFvDXhkpnRH18L6qawcEu/M7eaM=,tag:rlEgmZpf+WuuhbJwXa+rfA==,type:str] pgp: [] unencrypted_suffix: _unencrypted - version: 3.8.1 + version: 3.9.4 diff --git a/k8s/welearn-api/secrets.prod.yaml b/k8s/welearn-api/secrets.prod.yaml index 5ac034f..50ca970 100644 --- a/k8s/welearn-api/secrets.prod.yaml +++ b/k8s/welearn-api/secrets.prod.yaml @@ -1,6 +1,7 @@ config: sensitive: AZURE_API_KEY: ENC[AES256_GCM,data:CVS807YirBrmwzZPg7ZusmuQlRk2Z5fA7q0FL6or748=,iv:dcakolSW8odoMR9rZJQeRoSdfpTfVNMjs9ErldLk4ec=,tag:ycKc15UcW7MtsARklJk+Uw==,type:str] + AZURE_API_KEY: ENC[AES256_GCM,data:yy42gEZ/X8nbXTe5975p8RGTKwdMulRa197LT5upcOA=,iv:LHP5pjh1mWxi2xvj3f0m2bwvk5pFp4GOWDMaDnqv6MQ=,tag:iHwyUgikPGtmcgHgAuwypg==,type:str] MISTRAL_API_KEY: ENC[AES256_GCM,data:IQXLbwxh64kBr1Ss1VIlf0ptCIk4IlhPP9LMobCOD6c=,iv:dDshAEAUsXvKg6Mc6kYxxfMnUNLwerP2/Pob2mfivIg=,tag:B218+OwD0rKA2qsxl9sHXQ==,type:str] PG_PASSWORD: ENC[AES256_GCM,data:T+LaC4wkSed2ZbuZZA9EnqsZ,iv:7JM9iNYjLQ63kqZ5AtDODkE0BELWRal3wTB4G8W8Kho=,tag:IRUsvN4EowdEhJsSx++7Mg==,type:str] AZURE_LLAMA_31_8B_API_KEY: ENC[AES256_GCM,data:DcOJJGvIZXcfRfQeGYPAHmx+NGZPpoEPT6ndSui4f1g=,iv:mL51SowjMycwB4cg6XTKjJnPf2Yu9bbxZZgkuXL759A=,tag:oe1pDvuOU3bDL1KZUt3F+Q==,type:str] @@ -42,8 +43,8 @@ sops: ditKbGZ4NjdxZ1NPdWphQ2Yrc3NLd0kKNd1U4P32MV2hWbXu5F4oirZxEzCM6aL6 8nJlfIO94bH2Gmz8fkCpEGAHqp06i/j2u85ssom3U0GZD/rq5VA6lg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-02-27T14:16:46Z" - mac: ENC[AES256_GCM,data:LvNaMJzeRsf9vorJasN/FGTk/btH9qRAKOqlHspU1S7H9QxFIxNm8UeaFFZZxftABUKcpSbxF8UDG7XfWQhvda/V38hsgTL55URiWP2GUKaCKJFYGP71ZpQGDgMItMSK0CXzzh7iAQHTEkzPr2PWmot8MQQG5zCiMPQDoOs28pM=,iv:/ZN+SJ70wI7ZrP4Zjr2PrcQTdLAk1hgW/nowHt3nUf0=,tag:RCU55ZvjBa37JxNg/kvGBA==,type:str] + lastmodified: "2025-04-09T14:27:53Z" + mac: ENC[AES256_GCM,data:tYWuFOW7DrI/RFiNIhyLcLVvpwyK212ZYpNr2pmA8fmWpgr+RFZ5I2GyDPfYwMfWN2vTCSYyQIX5WIfWGsJC4a3oUhSwcQuChf1x38HX4cRcG0cID9Rf485Ufxv6FRde+azB5/h2CTCOg6mXc5AtZww0guiAXB/l/6PB9ipCBkk=,iv:qVMkttPxMxsfVPi+A65+hPhAqVZoCmY+G8rijpBCFqA=,tag:7cC3LANyrjz8Ug8gR7ND0A==,type:str] pgp: [] unencrypted_suffix: _unencrypted - version: 3.8.1 + version: 3.9.4 diff --git a/k8s/welearn-api/values.dev.yaml b/k8s/welearn-api/values.dev.yaml index 97eada5..14db630 100644 --- a/k8s/welearn-api/values.dev.yaml +++ b/k8s/welearn-api/values.dev.yaml @@ -4,6 +4,7 @@ ingress: config: nonSensitive: AZURE_API_BASE: "https://apim-welearn-openai.azure-api.net" + AZURE_40_API_BASE: "https://apim-welearn-openai-sweden.azure-api.net" PG_HOST: dev-lab-projects-backend.postgres.database.azure.com AZURE_LLAMA_31_8B_API_BASE: https://meta-llama-3-1-8b-instruct-wl.swedencentral.models.ai.azure.com/ AZURE_LLAMA_31_70B_API_BASE: https://meta-llama-3-1-70b-instruct-wl.swedencentral.models.ai.azure.com/ diff --git a/k8s/welearn-api/values.prod.yaml b/k8s/welearn-api/values.prod.yaml index 484e2a6..89e575b 100644 --- a/k8s/welearn-api/values.prod.yaml +++ b/k8s/welearn-api/values.prod.yaml @@ -4,6 +4,7 @@ ingress: config: nonSensitive: AZURE_API_BASE: "https://apim-welearn-openai.azure-api.net" + AZURE_40_API_BASE: "https://apim-welearn-openai-sweden.azure-api.net" PG_HOST: prod-prod-projects-backend.postgres.database.azure.com AZURE_LLAMA_31_8B_API_BASE: https://meta-llama-3-1-8b-instruct-wl.swedencentral.models.ai.azure.com/ AZURE_LLAMA_31_70B_API_BASE: https://meta-llama-3-1-70b-instruct-wl.swedencentral.models.ai.azure.com/ diff --git a/k8s/welearn-api/values.yaml b/k8s/welearn-api/values.yaml index 28d27ba..2957e97 100644 --- a/k8s/welearn-api/values.yaml +++ b/k8s/welearn-api/values.yaml @@ -35,6 +35,7 @@ config: QDRANT_PORT: "6333" AZURE_API_TYPE: "azure" AZURE_API_VERSION: "2024-08-01-preview" + AZURE_4O_API_VERSION: "2025-01-01-preview" CORPUS: conversation MODELS_FOLDER_ROOTS: "/models" AZURE_API_BASE: "https://welearn-openai.openai.azure.com/openai/" diff --git a/pytest.ini b/pytest.ini index b5acad5..e836de7 100644 --- a/pytest.ini +++ b/pytest.ini @@ -9,6 +9,11 @@ env = AZURE_API_BASE=https://test.com AZURE_API_TYPE = test_type AZURE_API_VERSION = test_version + AZURE_4O_API_KEY=fake_api_key + AZURE_4O_API_BASE=https://test.com + AZURE_4O_API_TYPE = test_type + AZURE_4O_API_VERSION = test_version + MISTRAL_API_KEY=fake_mistral_api_key diff --git a/src/app/core/config.py b/src/app/core/config.py index f0b6f95..218d57a 100644 --- a/src/app/core/config.py +++ b/src/app/core/config.py @@ -48,7 +48,10 @@ def get_api_version(self, cls): AZURE_API_KEY: str AZURE_API_BASE: str AZURE_API_VERSION: str - # AZURE_API_TYPE: str + + AZURE_GPT_4O_API_KEY: str + AZURE_GPT_4O_API_BASE: str + AZURE_GPT_4O_API_VERSION: str # PG PG_USER: Optional[str] = None diff --git a/src/app/services/search.py b/src/app/services/search.py index 16e5914..c32e9e6 100644 --- a/src/app/services/search.py +++ b/src/app/services/search.py @@ -247,7 +247,9 @@ async def search( with_payload=self.payload_keys, score_threshold=0.5, ) - logger.debug("method=search nb_results=%s", collection_info, len(resp)) + logger.debug( + "method=search collection=%s nb_results=%s", collection_info, len(resp) + ) except qdrant_exceptions.ResponseHandlingException: return [] return resp diff --git a/src/app/services/tutor/agents.py b/src/app/services/tutor/agents.py index 59ee87b..780a167 100644 --- a/src/app/services/tutor/agents.py +++ b/src/app/services/tutor/agents.py @@ -1,3 +1,5 @@ +import time + from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.messages import TextMessage from autogen_core import ( @@ -17,6 +19,9 @@ TutorSearchResponse, ) from src.app.services.tutor.utils import build_system_message +from src.app.utils.logger import logger as utils_logger + +logger = utils_logger(__name__) # TODO: add template file mouve this to utils TEMPLATES = {"template0": open("src/app/services/tutor/template.md").read()} @@ -80,6 +85,7 @@ async def handle_documents_and_themes( ) -> None: prompt = f"Using the content in TEXT CONTENTS, you generate a syllabus that is engaging and coherent in relation to the THEMES extracted from these contents. \n\nTEXT CONTENTS:\n{message.extracts[0].original_document}\n\nTHEMES:\n{message.extracts[0].themes}" + start_time = time.time() llm_result = await self._model_client.create( messages=[ self._system_message, @@ -88,6 +94,10 @@ async def handle_documents_and_themes( cancellation_token=ctx.cancellation_token, ) response = llm_result.content + end_time = time.time() + logger.debug( + "agent_type=%s response_time=%s", self.id.type, end_time - start_time + ) assert isinstance(response, str) await self.publish_message( @@ -152,6 +162,7 @@ async def handle_syllabus( prompt = f"Use these WeLearn documents: {message.resources} to integrate sustainability in this syllabus: {message.content}. You do not need to use ALL the information in the WeLearn documents, but ensure that sustainability integration is done in a way that is relevant and thematically linked to the discipline and the topics of the syllabus, that they are deeply embedded in the course content, and aligned with both the discipline and the broader educational goals. Add all WeLearn documents that you use in the REFERENCES section of the syllabus." try: + start_time = time.time() llm_result = await self._delegate.on_messages( [TextMessage(content=prompt, source=self.id.key)], ctx.cancellation_token, @@ -159,8 +170,12 @@ async def handle_syllabus( except Exception as e: print("Error in SDGExpertAgent:", e) raise e + end_time = time.time() response = llm_result.chat_message.content + logger.debug( + "agent_type=%s response_time=%s", self.id.type, end_time - start_time + ) assert isinstance(response, str) await self.publish_message( Message(content=response, source=self.id.type), @@ -223,13 +238,18 @@ async def handle_syllabus(self, message: Message, ctx: MessageContext) -> Messag """ prompt = f"Ensure that the syllabus is pedagogically sound, aligns with competency-based learning, and optimizes student engagement and learning effectiveness. Ensure that the learning objectives, outcomes and the competencies and related in a logical and meaningful way, and that these overarching goals are accomplished through the course plan and activities, also ensure that the competencies cited in the EU GreenComp framework are present in the syllabus in a way that is coherent with the discipline and the course content.\n\nSYLLABUS:\n{message.content}" + start_time = time.time() llm_result = await self._delegate.on_messages( [TextMessage(content=prompt, source=self.id.key)], ctx.cancellation_token, ) response = llm_result.chat_message.content + end_time = time.time() assert isinstance(response, str) + logger.debug( + "agent_type=%s response_time=%s", self.id.type, end_time - start_time + ) await self.publish_message( TaskResponse(result=response, task_id="pedagogical"), task_results_topic_id, diff --git a/src/app/services/tutor/tutor.py b/src/app/services/tutor/tutor.py index 9871112..7df1168 100644 --- a/src/app/services/tutor/tutor.py +++ b/src/app/services/tutor/tutor.py @@ -28,11 +28,11 @@ llm_4o_mini = AzureOpenAIChatCompletionClient( - azure_deployment="gpt-4o-mini", - model="gpt-4o-mini", - api_version=settings.AZURE_API_VERSION, - azure_endpoint=settings.AZURE_API_BASE, - api_key=settings.AZURE_API_KEY, + azure_deployment="gpt-4o", + model="gpt-4o", + api_version=settings.AZURE_GPT_4O_API_VERSION, + azure_endpoint=settings.AZURE_GPT_4O_API_BASE, + api_key=settings.AZURE_GPT_4O_API_KEY, ) From a00e28fb581a0629fe474e7789ee1041296e3095 Mon Sep 17 00:00:00 2001 From: CRI USER Date: Wed, 9 Apr 2025 18:05:04 +0200 Subject: [PATCH 7/7] fix values --- .env.example | 6 ++++++ k8s/welearn-api/secrets.dev.yaml | 6 +++--- k8s/welearn-api/secrets.prod.yaml | 6 +++--- k8s/welearn-api/values.dev.yaml | 2 +- k8s/welearn-api/values.prod.yaml | 2 +- k8s/welearn-api/values.yaml | 3 ++- pytest.ini | 8 ++++---- 7 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.env.example b/.env.example index bfc8800..e375b30 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,12 @@ AZURE_API_TYPE="azure" AZURE_API_KEY="AZURE_OPEN_AI_API_KEY" AZURE_API_BASE="AZURE_OPEN_AI_API_BASE" +AZURE_GPT_4O_API_VERSION="AZURE_OPEN_AI_VERSION" +AZURE_GPT_4O_API_TYPE="azure" + +AZURE_GPT_4O_API_KEY="AZURE_OPEN_AI_API_KEY" +AZURE_GPT_4O_API_BASE="AZURE_OPEN_AI_API_BASE" + MISTRAL_API_KEY="MISTRAL_API_KEY" QDRANT_HOST="QDRANT_HOST" diff --git a/k8s/welearn-api/secrets.dev.yaml b/k8s/welearn-api/secrets.dev.yaml index d451b81..9237d9c 100644 --- a/k8s/welearn-api/secrets.dev.yaml +++ b/k8s/welearn-api/secrets.dev.yaml @@ -1,7 +1,7 @@ config: sensitive: AZURE_API_KEY: ENC[AES256_GCM,data:vU5sozgleY904OU1Fb0yEaRzWYNHnCD2ILjthvtSfk4=,iv:b7ItArThdtIsz1qvgpptbOq96GHa1q6VWAweHYWw2Po=,tag:emJB+azc6vcIWCgv8idtyg==,type:str] - AZURE_4O_API_KEY: ENC[AES256_GCM,data:vhtwbX4naziWiNGYA0rdyb82c1IuSnx2qWZhMfscCHQ=,iv:Tv0uy4c2Ekr1eIuNr577sPJzgpaUO6TWk1l3kZOUq5M=,tag:M7zVhgcR6tGeDrgJRzCU7w==,type:str] + AZURE_GPT_4O_API_KEY: ENC[AES256_GCM,data:Kggxdo8yaKEz8jbv2oc4vVLGiIaiu2cr0EMRG/3QOas=,iv:pOkCiKhlECCBS1q5Lfb5xIycJ79se43nLgWgseEe23o=,tag:FHY6YbrTaUh0pQodu/dvVw==,type:str] MISTRAL_API_KEY: ENC[AES256_GCM,data:7Oqb2b3PZEbuqhSBGjqRQYz637xnho4D1T4Bkg+oBk0=,iv:6/RMp5QRcz9Rvku6l+j9w7qVtBp7to4fc5wQ+iWMjxA=,tag:dCGleGpG+6EPj1OJF6KTWQ==,type:str] PG_PASSWORD: ENC[AES256_GCM,data:8GsISVAuJyIh0WUFwb9mpqyWcNT04fnmpH4ru5CA+aw=,iv:oGKLDiadbhRQWVSE5J/4QJbppiTIcHhNr9fFY7XI0jY=,tag:Ksk0uMrB9fmVT8thQODFJA==,type:str] AZURE_LLAMA_31_8B_API_KEY: ENC[AES256_GCM,data:1QoINoywOPJnzFrdHMaTua1QFF0zDfhOsRSq5BZMFbc=,iv:SdvSiIUsv2kG7pA7T7Bcr/WYcXIhX9RPrFAgpzhtb10=,tag:AvmJFATaTbYiSi5j542eEQ==,type:str] @@ -43,8 +43,8 @@ sops: SE5yTm9yVEdjeUwrNW1sMnkvMVgwd2cK7TBA3a/Uq262Q30hz++Vwg6GFTjiD+AB zLZuHPmOMe8wa0Tiei+KRiTb8zXN/I8/ZW83L7irTKWbTTIKbJfIpQ== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-04-09T14:26:49Z" - mac: ENC[AES256_GCM,data:ZyQ3EZuVY0s0AXzyWB3jQMZuG+H54rwac0sacRf8e0mxVC6ab9v1QUR7pI0ND/vxultNfhMQ5aQ7vZd3OKPxW+zgTLAi9dNDe79S0+edCrHfqUkPnJDd/RRyRRyBXv17oV4ptZ0DljKCQhGpKVBihOEzt0xX3952JYtZpLrpZWw=,iv:cvNgZkgy+sVE0zbdvFvDXhkpnRH18L6qawcEu/M7eaM=,tag:rlEgmZpf+WuuhbJwXa+rfA==,type:str] + lastmodified: "2025-04-09T16:01:56Z" + mac: ENC[AES256_GCM,data:jVFOMK7EaOrFYkrmYuh1LtgA3CL8O64qtPpA+Uzj4etH+M3GfD/1pEjyPpGi0gZbluRq2O8fN0EgKcvFLfcj3fovGQvfyOL1lxk3hdRhfIBGcEqcskGQjBRl0Wf0A1utCVG3Qng6cpm3EGj5MjWLrez0KQWMoYd4ONTfYSIEoaU=,iv:KRP/fMGFBFEgaWZZlOMehsqmcJOdTcJrj3Ghtg24WSU=,tag:uXi3cvfFZByYqGEMLLneJg==,type:str] pgp: [] unencrypted_suffix: _unencrypted version: 3.9.4 diff --git a/k8s/welearn-api/secrets.prod.yaml b/k8s/welearn-api/secrets.prod.yaml index 50ca970..b1ce5fa 100644 --- a/k8s/welearn-api/secrets.prod.yaml +++ b/k8s/welearn-api/secrets.prod.yaml @@ -1,7 +1,7 @@ config: sensitive: AZURE_API_KEY: ENC[AES256_GCM,data:CVS807YirBrmwzZPg7ZusmuQlRk2Z5fA7q0FL6or748=,iv:dcakolSW8odoMR9rZJQeRoSdfpTfVNMjs9ErldLk4ec=,tag:ycKc15UcW7MtsARklJk+Uw==,type:str] - AZURE_API_KEY: ENC[AES256_GCM,data:yy42gEZ/X8nbXTe5975p8RGTKwdMulRa197LT5upcOA=,iv:LHP5pjh1mWxi2xvj3f0m2bwvk5pFp4GOWDMaDnqv6MQ=,tag:iHwyUgikPGtmcgHgAuwypg==,type:str] + AZURE_GPT_4O_API_KEY: ENC[AES256_GCM,data:Bq63nzG78SnhgKuojzpqblZMYSUWVEn1Vmw1/7pcE2M=,iv:p6S7Z0ASOjgr4F/mHs5M9ciCjUMvbuWCJrnWUdq6BMc=,tag:cScW3VnbsOewmbi1iHIATw==,type:str] MISTRAL_API_KEY: ENC[AES256_GCM,data:IQXLbwxh64kBr1Ss1VIlf0ptCIk4IlhPP9LMobCOD6c=,iv:dDshAEAUsXvKg6Mc6kYxxfMnUNLwerP2/Pob2mfivIg=,tag:B218+OwD0rKA2qsxl9sHXQ==,type:str] PG_PASSWORD: ENC[AES256_GCM,data:T+LaC4wkSed2ZbuZZA9EnqsZ,iv:7JM9iNYjLQ63kqZ5AtDODkE0BELWRal3wTB4G8W8Kho=,tag:IRUsvN4EowdEhJsSx++7Mg==,type:str] AZURE_LLAMA_31_8B_API_KEY: ENC[AES256_GCM,data:DcOJJGvIZXcfRfQeGYPAHmx+NGZPpoEPT6ndSui4f1g=,iv:mL51SowjMycwB4cg6XTKjJnPf2Yu9bbxZZgkuXL759A=,tag:oe1pDvuOU3bDL1KZUt3F+Q==,type:str] @@ -43,8 +43,8 @@ sops: ditKbGZ4NjdxZ1NPdWphQ2Yrc3NLd0kKNd1U4P32MV2hWbXu5F4oirZxEzCM6aL6 8nJlfIO94bH2Gmz8fkCpEGAHqp06i/j2u85ssom3U0GZD/rq5VA6lg== -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-04-09T14:27:53Z" - mac: ENC[AES256_GCM,data:tYWuFOW7DrI/RFiNIhyLcLVvpwyK212ZYpNr2pmA8fmWpgr+RFZ5I2GyDPfYwMfWN2vTCSYyQIX5WIfWGsJC4a3oUhSwcQuChf1x38HX4cRcG0cID9Rf485Ufxv6FRde+azB5/h2CTCOg6mXc5AtZww0guiAXB/l/6PB9ipCBkk=,iv:qVMkttPxMxsfVPi+A65+hPhAqVZoCmY+G8rijpBCFqA=,tag:7cC3LANyrjz8Ug8gR7ND0A==,type:str] + lastmodified: "2025-04-09T16:01:39Z" + mac: ENC[AES256_GCM,data:3QVdNClzWjbEUT/craRgEZNejAnbgvWbvCVeuPDnipxnjU7lR0ZOlMf/az7DxLze301QI5ZLguSgSQxkhpO+KKPAJPkQAcBTo8KvGR7QfLIrdGO/HGDQxyvp36oDv0V81eQFA3FHNTpU6C3cfV1TBnFcR7sKcjS7qDeI3/LftQo=,iv:ntCNFse4qgt32WCwmmW2OrJek14tCTytCRRsmeGHc9E=,tag:4UeOPC6RnHYL9CD8BuCstw==,type:str] pgp: [] unencrypted_suffix: _unencrypted version: 3.9.4 diff --git a/k8s/welearn-api/values.dev.yaml b/k8s/welearn-api/values.dev.yaml index 14db630..7de324c 100644 --- a/k8s/welearn-api/values.dev.yaml +++ b/k8s/welearn-api/values.dev.yaml @@ -4,7 +4,7 @@ ingress: config: nonSensitive: AZURE_API_BASE: "https://apim-welearn-openai.azure-api.net" - AZURE_40_API_BASE: "https://apim-welearn-openai-sweden.azure-api.net" + AZURE_GPT_40_API_BASE: "https://welearn-openai-sweden.openai.azure.com" PG_HOST: dev-lab-projects-backend.postgres.database.azure.com AZURE_LLAMA_31_8B_API_BASE: https://meta-llama-3-1-8b-instruct-wl.swedencentral.models.ai.azure.com/ AZURE_LLAMA_31_70B_API_BASE: https://meta-llama-3-1-70b-instruct-wl.swedencentral.models.ai.azure.com/ diff --git a/k8s/welearn-api/values.prod.yaml b/k8s/welearn-api/values.prod.yaml index 89e575b..30f6c69 100644 --- a/k8s/welearn-api/values.prod.yaml +++ b/k8s/welearn-api/values.prod.yaml @@ -4,7 +4,7 @@ ingress: config: nonSensitive: AZURE_API_BASE: "https://apim-welearn-openai.azure-api.net" - AZURE_40_API_BASE: "https://apim-welearn-openai-sweden.azure-api.net" + AZURE_GPT_40_API_BASE: "https://welearn-openai-sweden.openai.azure.com" PG_HOST: prod-prod-projects-backend.postgres.database.azure.com AZURE_LLAMA_31_8B_API_BASE: https://meta-llama-3-1-8b-instruct-wl.swedencentral.models.ai.azure.com/ AZURE_LLAMA_31_70B_API_BASE: https://meta-llama-3-1-70b-instruct-wl.swedencentral.models.ai.azure.com/ diff --git a/k8s/welearn-api/values.yaml b/k8s/welearn-api/values.yaml index 2957e97..27cb03b 100644 --- a/k8s/welearn-api/values.yaml +++ b/k8s/welearn-api/values.yaml @@ -35,10 +35,11 @@ config: QDRANT_PORT: "6333" AZURE_API_TYPE: "azure" AZURE_API_VERSION: "2024-08-01-preview" - AZURE_4O_API_VERSION: "2025-01-01-preview" + AZURE_GPT_4O_API_VERSION: "2025-01-01-preview" CORPUS: conversation MODELS_FOLDER_ROOTS: "/models" AZURE_API_BASE: "https://welearn-openai.openai.azure.com/openai/" + AZURE_GPT_40_API_BASE: "https://welearn-openai-sweden.openai.azure.com/" CLIENT_ORIGINS_REGEX: '^{{ join "|" (values .Values.allowedHostsRegexes | sortAlpha ) }}$' PG_USER: welearn_datastack PG_DATABASE: welearn_datastack diff --git a/pytest.ini b/pytest.ini index e836de7..6228cb2 100644 --- a/pytest.ini +++ b/pytest.ini @@ -9,10 +9,10 @@ env = AZURE_API_BASE=https://test.com AZURE_API_TYPE = test_type AZURE_API_VERSION = test_version - AZURE_4O_API_KEY=fake_api_key - AZURE_4O_API_BASE=https://test.com - AZURE_4O_API_TYPE = test_type - AZURE_4O_API_VERSION = test_version + AZURE_GPT_4O_API_KEY=fake_api_key + AZURE_GPT_4O_API_BASE=https://test.com + AZURE_GPT_4O_API_TYPE = test_type + AZURE_GPT_4O_API_VERSION = test_version MISTRAL_API_KEY=fake_mistral_api_key