From 0c6a042d355fa7aa1963924cce4b884c1f6b995e Mon Sep 17 00:00:00 2001 From: Jonathan Perry Date: Tue, 16 Jan 2024 14:52:35 -0500 Subject: [PATCH] Add Pytests for API (#25) --- .github/workflows/environment.yaml | 14 - .github/workflows/pytest.yaml | 21 + .github/workflows/test-deploy.yaml | 49 ++ Makefile | 10 +- backends/openai/types.py | 10 +- pyproject.toml | 5 +- requirements-dev.txt | 502 +++++++++--------- requirements.txt | 8 +- test/fixtures/config.yaml | 7 - test/test_complete.py | 13 - test/test_complete_stream.py | 39 -- test/test_simple_stream.py | 8 - test/this_will_work.py | 16 - tests/__init__.py | 0 {test => tests}/data/0min12sec.wav | Bin tests/fixtures/test-config.yaml | 3 + .../performance/performance_tests.py | 0 tests/test_main.py | 206 +++++++ utils/test_config.py | 23 - zarf-config.yaml | 3 +- zarf.yaml | 12 +- 21 files changed, 547 insertions(+), 402 deletions(-) delete mode 100644 .github/workflows/environment.yaml create mode 100644 .github/workflows/pytest.yaml create mode 100644 .github/workflows/test-deploy.yaml delete mode 100644 test/fixtures/config.yaml delete mode 100644 test/test_complete.py delete mode 100644 test/test_complete_stream.py delete mode 100644 test/test_simple_stream.py delete mode 100644 test/this_will_work.py create mode 100644 tests/__init__.py rename {test => tests}/data/0min12sec.wav (100%) create mode 100644 tests/fixtures/test-config.yaml rename {test => tests}/performance/performance_tests.py (100%) create mode 100644 tests/test_main.py delete mode 100644 utils/test_config.py diff --git a/.github/workflows/environment.yaml b/.github/workflows/environment.yaml deleted file mode 100644 index 63e1887..0000000 --- a/.github/workflows/environment.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: Run tests -on: [pull_request] - -jobs: - Run-Tests: - name: Run tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version-file: 'pyproject.toml' - - run: make requirements-dev requirements - - run: make test \ No newline at end of file diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml new file mode 100644 index 0000000..b33fce5 --- /dev/null +++ b/.github/workflows/pytest.yaml @@ -0,0 +1,21 @@ +name: pytest +on: [pull_request] + +jobs: + pytest: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version-file: 'pyproject.toml' + + - name: Run Repeater + run: docker run -p 50051:50051 -d ghcr.io/defenseunicorns/leapfrogai/repeater:0.3.3 + + - run: make requirements-dev + + - run: make test + env: + LFAI_RUN_REPEATER_TESTS: true \ No newline at end of file diff --git a/.github/workflows/test-deploy.yaml b/.github/workflows/test-deploy.yaml new file mode 100644 index 0000000..b88075a --- /dev/null +++ b/.github/workflows/test-deploy.yaml @@ -0,0 +1,49 @@ +name: Test Package Deployment +on: + pull_request + +jobs: + e2e-build: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Install Zarf + uses: defenseunicorns/setup-zarf@main + with: + download-init-package: true + + - name: Login to Registry1 + uses: docker/login-action@v3 + with: + registry: registry1.dso.mil + username: ${{ secrets.IRON_BANK_ROBOT_USERNAME }} + password: ${{ secrets.IRON_BANK_ROBOT_PASSWORD }} + + - name: Build leapfrogai image + run: make docker-build VERSION=local + + - name: Build leapfrogai zarf package + run: make zarf-build VERSION=local + + - name: Setup K3D + uses: defenseunicorns/zarf/.github/actions/k3d@main + + - name: Initialize zarf + run: zarf init --confirm + + - name: Deploy LFAI Package + run: zarf package deploy zarf-package-leapfrogai-api-amd64*.tar.zst --confirm + + - name: Debug Deployment + run: | + zarf package list + zarf connect list + + + + + + diff --git a/Makefile b/Makefile index 988d3c7..16def18 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ requirements-dev: python -m pip install -r requirements-dev.txt requirements: - pip-sync requirements.txt requirements-dev.txt + pip-sync requirements.txt build-requirements: pip-compile -o requirements.txt pyproject.toml @@ -18,8 +18,9 @@ build-requirements: build-requirements-dev: pip-compile --extra dev -o requirements-dev.txt pyproject.toml --allow-unsafe +.PHONY: test test: - pytest **/*.py + python -m pytest . -v dev: uvicorn main:app --port 3000 --reload @@ -28,4 +29,7 @@ docker-build: docker build -t ghcr.io/defenseunicorns/leapfrogai/leapfrogai-api:${VERSION} . docker-push: - docker push ghcr.io/defenseunicorns/leapfrogai/leapfrogai-api:${VERSION} \ No newline at end of file + docker push ghcr.io/defenseunicorns/leapfrogai/leapfrogai-api:${VERSION} + +zarf-build: + zarf package create . --confirm --set LFAI_API_VERSION=${VERSION} \ No newline at end of file diff --git a/backends/openai/types.py b/backends/openai/types.py index 59eb2d8..15bccec 100644 --- a/backends/openai/types.py +++ b/backends/openai/types.py @@ -77,7 +77,7 @@ class ChatCompletionRequest(BaseModel): class ChatChoice(BaseModel): index: int message: ChatMessage - finish_reason: str + finish_reason: str | None = "" class ChatStreamChoice(BaseModel): @@ -140,10 +140,10 @@ class ModelResponse(BaseModel): class CreateTranscriptionRequest(BaseModel): file: UploadFile model: str - language: str - prompt: str - response_format: str - temperature: float + language: str = "" + prompt: str = "" + response_format: str = "" + temperature: float = 1 @classmethod def as_form( diff --git a/pyproject.toml b/pyproject.toml index 46e4eba..120c805 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,10 +14,13 @@ dependencies = [ requires-python = "==3.11.6" [project.optional-dependencies] -dev = ["pip-tools", "pytest", "black", "isort", "selenium"] +dev = ["pip-tools", "pytest", "black", "isort", "httpx", "selenium"] [tool.pip-tools] generate-hashes = true [tool.setuptools.packages.find] exclude = ["chart"] + +[tool.pytest.ini_options] +addopts = ["--import-mode=importlib"] \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt index 97dc6b9..b0a88e8 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,18 +1,19 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile --allow-unsafe --extra=dev --generate-hashes --output-file=requirements-dev.txt pyproject.toml # -annotated-types==0.5.0 \ - --hash=sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802 \ - --hash=sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd +annotated-types==0.6.0 \ + --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ + --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic anyio==3.7.1 \ --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 # via # fastapi + # httpx # starlette # watchfiles attrs==23.1.0 \ @@ -21,29 +22,25 @@ attrs==23.1.0 \ # via # outcome # trio -black==23.9.1 \ - --hash=sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f \ - --hash=sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7 \ - --hash=sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100 \ - --hash=sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573 \ - --hash=sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d \ - --hash=sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f \ - --hash=sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9 \ - --hash=sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300 \ - --hash=sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948 \ - --hash=sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325 \ - --hash=sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9 \ - --hash=sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71 \ - --hash=sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186 \ - --hash=sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f \ - --hash=sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe \ - --hash=sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855 \ - --hash=sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80 \ - --hash=sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393 \ - --hash=sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c \ - --hash=sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204 \ - --hash=sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377 \ - --hash=sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301 +black==23.11.0 \ + --hash=sha256:250d7e60f323fcfc8ea6c800d5eba12f7967400eb6c2d21ae85ad31c204fb1f4 \ + --hash=sha256:2a9acad1451632021ee0d146c8765782a0c3846e0e0ea46659d7c4f89d9b212b \ + --hash=sha256:412f56bab20ac85927f3a959230331de5614aecda1ede14b373083f62ec24e6f \ + --hash=sha256:421f3e44aa67138ab1b9bfbc22ee3780b22fa5b291e4db8ab7eee95200726b07 \ + --hash=sha256:45aa1d4675964946e53ab81aeec7a37613c1cb71647b5394779e6efb79d6d187 \ + --hash=sha256:4c44b7211a3a0570cc097e81135faa5f261264f4dfaa22bd5ee2875a4e773bd6 \ + --hash=sha256:4c68855825ff432d197229846f971bc4d6666ce90492e5b02013bcaca4d9ab05 \ + --hash=sha256:5133f5507007ba08d8b7b263c7aa0f931af5ba88a29beacc4b2dc23fcefe9c06 \ + --hash=sha256:54caaa703227c6e0c87b76326d0862184729a69b73d3b7305b6288e1d830067e \ + --hash=sha256:58e5f4d08a205b11800332920e285bd25e1a75c54953e05502052738fe16b3b5 \ + --hash=sha256:698c1e0d5c43354ec5d6f4d914d0d553a9ada56c85415700b81dc90125aac244 \ + --hash=sha256:6c1cac07e64433f646a9a838cdc00c9768b3c362805afc3fce341af0e6a9ae9f \ + --hash=sha256:760415ccc20f9e8747084169110ef75d545f3b0932ee21368f63ac0fee86b221 \ + --hash=sha256:7f622b6822f02bfaf2a5cd31fdb7cd86fcf33dab6ced5185c35f5db98260b055 \ + --hash=sha256:cf57719e581cfd48c4efe28543fea3d139c6b6f1238b3f0102a9c73992cbb479 \ + --hash=sha256:d136ef5b418c81660ad847efe0e55c58c8208b77a57a28a503a5f345ccf01394 \ + --hash=sha256:dbea0bb8575c6b6303cc65017b46351dc5953eea5c0a59d7b7e3a2d2f433a911 \ + --hash=sha256:fc7f6a44d52747e65a02558e1d807c82df1d66ffa80a601862040a43ec2e3142 # via leapfrogai-api (pyproject.toml) build==1.0.3 \ --hash=sha256:538aab1b64f9828977f84bc63ae570b060a8ed1be419e7870b8b4fc5e6ea553b \ @@ -52,7 +49,10 @@ build==1.0.3 \ certifi==2023.7.22 \ --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 - # via selenium + # via + # httpcore + # httpx + # selenium click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de @@ -60,92 +60,99 @@ click==8.1.7 \ # black # pip-tools # uvicorn -exceptiongroup==1.1.3 \ - --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ - --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 - # via - # anyio - # pytest - # trio - # trio-websocket -fastapi==0.103.1 \ - --hash=sha256:345844e6a82062f06a096684196aaf96c1198b25c06b72c1311b882aa2d8a35d \ - --hash=sha256:5e5f17e826dbd9e9b5a5145976c5cd90bcaa61f2bf9a69aca423f2bcebe44d83 +fastapi==0.104.1 \ + --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ + --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae # via leapfrogai-api (pyproject.toml) -grpcio==1.58.0 \ - --hash=sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef \ - --hash=sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092 \ - --hash=sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8 \ - --hash=sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188 \ - --hash=sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe \ - --hash=sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9 \ - --hash=sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15 \ - --hash=sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855 \ - --hash=sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9 \ - --hash=sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd \ - --hash=sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3 \ - --hash=sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf \ - --hash=sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577 \ - --hash=sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a \ - --hash=sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29 \ - --hash=sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa \ - --hash=sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a \ - --hash=sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499 \ - --hash=sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d \ - --hash=sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2 \ - --hash=sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4 \ - --hash=sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c \ - --hash=sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4 \ - --hash=sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f \ - --hash=sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22 \ - --hash=sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0 \ - --hash=sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6 \ - --hash=sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045 \ - --hash=sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143 \ - --hash=sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205 \ - --hash=sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830 \ - --hash=sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602 \ - --hash=sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93 \ - --hash=sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60 \ - --hash=sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727 \ - --hash=sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8 \ - --hash=sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd \ - --hash=sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb \ - --hash=sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28 \ - --hash=sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2 \ - --hash=sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07 \ - --hash=sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c \ - --hash=sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58 \ - --hash=sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86 \ - --hash=sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697 +grpcio==1.59.2 \ + --hash=sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340 \ + --hash=sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f \ + --hash=sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1 \ + --hash=sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f \ + --hash=sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd \ + --hash=sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758 \ + --hash=sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00 \ + --hash=sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c \ + --hash=sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3 \ + --hash=sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9 \ + --hash=sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd \ + --hash=sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4 \ + --hash=sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f \ + --hash=sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b \ + --hash=sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873 \ + --hash=sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69 \ + --hash=sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96 \ + --hash=sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29 \ + --hash=sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd \ + --hash=sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4 \ + --hash=sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268 \ + --hash=sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a \ + --hash=sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8 \ + --hash=sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e \ + --hash=sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda \ + --hash=sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01 \ + --hash=sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd \ + --hash=sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828 \ + --hash=sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e \ + --hash=sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2 \ + --hash=sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541 \ + --hash=sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d \ + --hash=sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1 \ + --hash=sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf \ + --hash=sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721 \ + --hash=sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867 \ + --hash=sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188 \ + --hash=sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a \ + --hash=sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1 \ + --hash=sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba \ + --hash=sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd \ + --hash=sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e \ + --hash=sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa \ + --hash=sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516 \ + --hash=sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71 \ + --hash=sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137 \ + --hash=sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52 \ + --hash=sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479 \ + --hash=sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2 \ + --hash=sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6 \ + --hash=sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c \ + --hash=sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf \ + --hash=sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3 \ + --hash=sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3 # via # grpcio-health-checking # grpcio-reflection # leapfrogai -grpcio-health-checking==1.58.0 \ - --hash=sha256:07d58623f27becf186c862cbae7dfd7a54bd63f4b37594c77c8b8fc933f11c2f \ - --hash=sha256:ac7c268654df114ab32be5395fdbfd0d2c4510e7b7ef50189777b39de979249b +grpcio-health-checking==1.59.2 \ + --hash=sha256:7855830a404c8683cc16ff0348443a1a60919a0d2e7265d2bc801071053602da \ + --hash=sha256:e0c544ef4219f9698c94ebd598d3a738fddb56a4032c10f2d2b883543006d091 # via leapfrogai -grpcio-reflection==1.58.0 \ - --hash=sha256:e6048a758d17b6ca1705258e7ee5d926d2960a95ae08ba0929dd233e505acd3d \ - --hash=sha256:fa18885d8a09cef02c9a6b1d17dfed0279f1f401b06bd1f75958b78ebf1b5c0c +grpcio-reflection==1.59.2 \ + --hash=sha256:75134938785c3ebe4d9f1d43aeb145bd3a253d771c2d48630b98478103472b42 \ + --hash=sha256:9796dcbc59dcfb9f6d5465d59e7fa62a5777a3e4d5aa894f44855c896a46fa8b # via leapfrogai h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 # via + # httpcore # uvicorn # wsproto +httpcore==1.0.2 \ + --hash=sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7 \ + --hash=sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535 + # via httpx +httpx==0.25.1 \ + --hash=sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a \ + --hash=sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0 + # via leapfrogai-api (pyproject.toml) idna==3.4 \ --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 # via # anyio + # httpx # trio -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 - # via build iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 @@ -166,9 +173,9 @@ outcome==1.3.0.post0 \ --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b # via trio -packaging==23.1 \ - --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \ - --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f +packaging==23.2 \ + --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ + --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 # via # black # build @@ -181,145 +188,143 @@ pip-tools==7.3.0 \ --hash=sha256:8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e \ --hash=sha256:8e9c99127fe024c025b46a0b2d15c7bd47f18f33226cf7330d35493663fc1d1d # via leapfrogai-api (pyproject.toml) -platformdirs==3.10.0 \ - --hash=sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d \ - --hash=sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d +platformdirs==4.0.0 \ + --hash=sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b \ + --hash=sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731 # via black pluggy==1.3.0 \ --hash=sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12 \ --hash=sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7 # via pytest -protobuf==4.24.3 \ - --hash=sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719 \ - --hash=sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d \ - --hash=sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2 \ - --hash=sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4 \ - --hash=sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1 \ - --hash=sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3 \ - --hash=sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b \ - --hash=sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76 \ - --hash=sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959 \ - --hash=sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52 \ - --hash=sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b \ - --hash=sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675 \ - --hash=sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a +protobuf==4.25.0 \ + --hash=sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575 \ + --hash=sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a \ + --hash=sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51 \ + --hash=sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395 \ + --hash=sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701 \ + --hash=sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054 \ + --hash=sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c \ + --hash=sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9 \ + --hash=sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419 \ + --hash=sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4 \ + --hash=sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f # via # grpcio-health-checking # grpcio-reflection # leapfrogai -pydantic==2.3.0 \ - --hash=sha256:1607cc106602284cd4a00882986570472f193fde9cb1259bceeaedb26aa79a6d \ - --hash=sha256:45b5e446c6dfaad9444819a293b921a40e1db1aa61ea08aede0522529ce90e81 +pydantic==2.4.2 \ + --hash=sha256:94f336138093a5d7f426aac732dcfe7ab4eb4da243c88f891d65deb4a2556ee7 \ + --hash=sha256:bc3ddf669d234f4220e6e1c4d96b061abe0998185a8d7855c0126782b7abc8c1 # via # fastapi # leapfrogai-api (pyproject.toml) -pydantic-core==2.6.3 \ - --hash=sha256:002d0ea50e17ed982c2d65b480bd975fc41086a5a2f9c924ef8fc54419d1dea3 \ - --hash=sha256:02e1c385095efbd997311d85c6021d32369675c09bcbfff3b69d84e59dc103f6 \ - --hash=sha256:046af9cfb5384f3684eeb3f58a48698ddab8dd870b4b3f67f825353a14441418 \ - --hash=sha256:04fe5c0a43dec39aedba0ec9579001061d4653a9b53a1366b113aca4a3c05ca7 \ - --hash=sha256:07a1aec07333bf5adebd8264047d3dc518563d92aca6f2f5b36f505132399efc \ - --hash=sha256:1480fa4682e8202b560dcdc9eeec1005f62a15742b813c88cdc01d44e85308e5 \ - --hash=sha256:1508f37ba9e3ddc0189e6ff4e2228bd2d3c3a4641cbe8c07177162f76ed696c7 \ - --hash=sha256:171a4718860790f66d6c2eda1d95dd1edf64f864d2e9f9115840840cf5b5713f \ - --hash=sha256:19e20f8baedd7d987bd3f8005c146e6bcbda7cdeefc36fad50c66adb2dd2da48 \ - --hash=sha256:1a0ddaa723c48af27d19f27f1c73bdc615c73686d763388c8683fe34ae777bad \ - --hash=sha256:1aa712ba150d5105814e53cb141412217146fedc22621e9acff9236d77d2a5ef \ - --hash=sha256:1ac1750df1b4339b543531ce793b8fd5c16660a95d13aecaab26b44ce11775e9 \ - --hash=sha256:1c721bfc575d57305dd922e6a40a8fe3f762905851d694245807a351ad255c58 \ - --hash=sha256:1ce8c84051fa292a5dc54018a40e2a1926fd17980a9422c973e3ebea017aa8da \ - --hash=sha256:1fa1f6312fb84e8c281f32b39affe81984ccd484da6e9d65b3d18c202c666149 \ - --hash=sha256:22134a4453bd59b7d1e895c455fe277af9d9d9fbbcb9dc3f4a97b8693e7e2c9b \ - --hash=sha256:23470a23614c701b37252618e7851e595060a96a23016f9a084f3f92f5ed5881 \ - --hash=sha256:240a015102a0c0cc8114f1cba6444499a8a4d0333e178bc504a5c2196defd456 \ - --hash=sha256:252851b38bad3bfda47b104ffd077d4f9604a10cb06fe09d020016a25107bf98 \ - --hash=sha256:2a20c533cb80466c1d42a43a4521669ccad7cf2967830ac62c2c2f9cece63e7e \ - --hash=sha256:2dd50d6a1aef0426a1d0199190c6c43ec89812b1f409e7fe44cb0fbf6dfa733c \ - --hash=sha256:340e96c08de1069f3d022a85c2a8c63529fd88709468373b418f4cf2c949fb0e \ - --hash=sha256:3796a6152c545339d3b1652183e786df648ecdf7c4f9347e1d30e6750907f5bb \ - --hash=sha256:37a822f630712817b6ecc09ccc378192ef5ff12e2c9bae97eb5968a6cdf3b862 \ - --hash=sha256:3a750a83b2728299ca12e003d73d1264ad0440f60f4fc9cee54acc489249b728 \ - --hash=sha256:3c8945a105f1589ce8a693753b908815e0748f6279959a4530f6742e1994dcb6 \ - --hash=sha256:3ccc13afee44b9006a73d2046068d4df96dc5b333bf3509d9a06d1b42db6d8bf \ - --hash=sha256:3f90e5e3afb11268628c89f378f7a1ea3f2fe502a28af4192e30a6cdea1e7d5e \ - --hash=sha256:4292ca56751aebbe63a84bbfc3b5717abb09b14d4b4442cc43fd7c49a1529efd \ - --hash=sha256:430ddd965ffd068dd70ef4e4d74f2c489c3a313adc28e829dd7262cc0d2dd1e8 \ - --hash=sha256:439a0de139556745ae53f9cc9668c6c2053444af940d3ef3ecad95b079bc9987 \ - --hash=sha256:44b4f937b992394a2e81a5c5ce716f3dcc1237281e81b80c748b2da6dd5cf29a \ - --hash=sha256:48c1ed8b02ffea4d5c9c220eda27af02b8149fe58526359b3c07eb391cb353a2 \ - --hash=sha256:4ef724a059396751aef71e847178d66ad7fc3fc969a1a40c29f5aac1aa5f8784 \ - --hash=sha256:50555ba3cb58f9861b7a48c493636b996a617db1a72c18da4d7f16d7b1b9952b \ - --hash=sha256:522a9c4a4d1924facce7270c84b5134c5cabcb01513213662a2e89cf28c1d309 \ - --hash=sha256:5493a7027bfc6b108e17c3383959485087d5942e87eb62bbac69829eae9bc1f7 \ - --hash=sha256:56ea80269077003eaa59723bac1d8bacd2cd15ae30456f2890811efc1e3d4413 \ - --hash=sha256:5a2a3c9ef904dcdadb550eedf3291ec3f229431b0084666e2c2aa8ff99a103a2 \ - --hash=sha256:5cfde4fab34dd1e3a3f7f3db38182ab6c95e4ea91cf322242ee0be5c2f7e3d2f \ - --hash=sha256:5e4a2cf8c4543f37f5dc881de6c190de08096c53986381daebb56a355be5dfe6 \ - --hash=sha256:5e9c068f36b9f396399d43bfb6defd4cc99c36215f6ff33ac8b9c14ba15bdf6b \ - --hash=sha256:5ed7ceca6aba5331ece96c0e328cd52f0dcf942b8895a1ed2642de50800b79d3 \ - --hash=sha256:5fa159b902d22b283b680ef52b532b29554ea2a7fc39bf354064751369e9dbd7 \ - --hash=sha256:615a31b1629e12445c0e9fc8339b41aaa6cc60bd53bf802d5fe3d2c0cda2ae8d \ - --hash=sha256:621afe25cc2b3c4ba05fff53525156d5100eb35c6e5a7cf31d66cc9e1963e378 \ - --hash=sha256:6656a0ae383d8cd7cc94e91de4e526407b3726049ce8d7939049cbfa426518c8 \ - --hash=sha256:672174480a85386dd2e681cadd7d951471ad0bb028ed744c895f11f9d51b9ebe \ - --hash=sha256:692b4ff5c4e828a38716cfa92667661a39886e71136c97b7dac26edef18767f7 \ - --hash=sha256:6bcc1ad776fffe25ea5c187a028991c031a00ff92d012ca1cc4714087e575973 \ - --hash=sha256:6bf7d610ac8f0065a286002a23bcce241ea8248c71988bda538edcc90e0c39ad \ - --hash=sha256:75c0ebbebae71ed1e385f7dfd9b74c1cff09fed24a6df43d326dd7f12339ec34 \ - --hash=sha256:788be9844a6e5c4612b74512a76b2153f1877cd845410d756841f6c3420230eb \ - --hash=sha256:7dc2ce039c7290b4ef64334ec7e6ca6494de6eecc81e21cb4f73b9b39991408c \ - --hash=sha256:813aab5bfb19c98ae370952b6f7190f1e28e565909bfc219a0909db168783465 \ - --hash=sha256:8421cf496e746cf8d6b677502ed9a0d1e4e956586cd8b221e1312e0841c002d5 \ - --hash=sha256:84e87c16f582f5c753b7f39a71bd6647255512191be2d2dbf49458c4ef024588 \ - --hash=sha256:84f8bb34fe76c68c9d96b77c60cef093f5e660ef8e43a6cbfcd991017d375950 \ - --hash=sha256:85cc4d105747d2aa3c5cf3e37dac50141bff779545ba59a095f4a96b0a460e70 \ - --hash=sha256:883daa467865e5766931e07eb20f3e8152324f0adf52658f4d302242c12e2c32 \ - --hash=sha256:8b2b1bfed698fa410ab81982f681f5b1996d3d994ae8073286515ac4d165c2e7 \ - --hash=sha256:8ecbac050856eb6c3046dea655b39216597e373aa8e50e134c0e202f9c47efec \ - --hash=sha256:930bfe73e665ebce3f0da2c6d64455098aaa67e1a00323c74dc752627879fc67 \ - --hash=sha256:9616567800bdc83ce136e5847d41008a1d602213d024207b0ff6cab6753fe645 \ - --hash=sha256:9680dd23055dd874173a3a63a44e7f5a13885a4cfd7e84814be71be24fba83db \ - --hash=sha256:99faba727727b2e59129c59542284efebbddade4f0ae6a29c8b8d3e1f437beb7 \ - --hash=sha256:9a718d56c4d55efcfc63f680f207c9f19c8376e5a8a67773535e6f7e80e93170 \ - --hash=sha256:9b33bf9658cb29ac1a517c11e865112316d09687d767d7a0e4a63d5c640d1b17 \ - --hash=sha256:9e8b374ef41ad5c461efb7a140ce4730661aadf85958b5c6a3e9cf4e040ff4bb \ - --hash=sha256:9e9b65a55bbabda7fccd3500192a79f6e474d8d36e78d1685496aad5f9dbd92c \ - --hash=sha256:a0b7486d85293f7f0bbc39b34e1d8aa26210b450bbd3d245ec3d732864009819 \ - --hash=sha256:a53e3195f134bde03620d87a7e2b2f2046e0e5a8195e66d0f244d6d5b2f6d31b \ - --hash=sha256:a87c54e72aa2ef30189dc74427421e074ab4561cf2bf314589f6af5b37f45e6d \ - --hash=sha256:a892b5b1871b301ce20d40b037ffbe33d1407a39639c2b05356acfef5536d26a \ - --hash=sha256:a8acc9dedd304da161eb071cc7ff1326aa5b66aadec9622b2574ad3ffe225525 \ - --hash=sha256:aaafc776e5edc72b3cad1ccedb5fd869cc5c9a591f1213aa9eba31a781be9ac1 \ - --hash=sha256:acafc4368b289a9f291e204d2c4c75908557d4f36bd3ae937914d4529bf62a76 \ - --hash=sha256:b0a5d7edb76c1c57b95df719af703e796fc8e796447a1da939f97bfa8a918d60 \ - --hash=sha256:b25afe9d5c4f60dcbbe2b277a79be114e2e65a16598db8abee2a2dcde24f162b \ - --hash=sha256:b44c42edc07a50a081672e25dfe6022554b47f91e793066a7b601ca290f71e42 \ - --hash=sha256:b594b64e8568cf09ee5c9501ede37066b9fc41d83d58f55b9952e32141256acd \ - --hash=sha256:b962700962f6e7a6bd77e5f37320cabac24b4c0f76afeac05e9f93cf0c620014 \ - --hash=sha256:bb128c30cf1df0ab78166ded1ecf876620fb9aac84d2413e8ea1594b588c735d \ - --hash=sha256:bf9d42a71a4d7a7c1f14f629e5c30eac451a6fc81827d2beefd57d014c006c4a \ - --hash=sha256:c6595b0d8c8711e8e1dc389d52648b923b809f68ac1c6f0baa525c6440aa0daa \ - --hash=sha256:c8c6660089a25d45333cb9db56bb9e347241a6d7509838dbbd1931d0e19dbc7f \ - --hash=sha256:c9d469204abcca28926cbc28ce98f28e50e488767b084fb3fbdf21af11d3de26 \ - --hash=sha256:d38bbcef58220f9c81e42c255ef0bf99735d8f11edef69ab0b499da77105158a \ - --hash=sha256:d4eb77df2964b64ba190eee00b2312a1fd7a862af8918ec70fc2d6308f76ac64 \ - --hash=sha256:d63b7545d489422d417a0cae6f9898618669608750fc5e62156957e609e728a5 \ - --hash=sha256:d7050899026e708fb185e174c63ebc2c4ee7a0c17b0a96ebc50e1f76a231c057 \ - --hash=sha256:d79f1f2f7ebdb9b741296b69049ff44aedd95976bfee38eb4848820628a99b50 \ - --hash=sha256:d85463560c67fc65cd86153a4975d0b720b6d7725cf7ee0b2d291288433fc21b \ - --hash=sha256:d9140ded382a5b04a1c030b593ed9bf3088243a0a8b7fa9f071a5736498c5483 \ - --hash=sha256:d9b4916b21931b08096efed090327f8fe78e09ae8f5ad44e07f5c72a7eedb51b \ - --hash=sha256:df14f6332834444b4a37685810216cc8fe1fe91f447332cd56294c984ecbff1c \ - --hash=sha256:e49ce7dc9f925e1fb010fc3d555250139df61fa6e5a0a95ce356329602c11ea9 \ - --hash=sha256:e61eae9b31799c32c5f9b7be906be3380e699e74b2db26c227c50a5fc7988698 \ - --hash=sha256:ea053cefa008fda40f92aab937fb9f183cf8752e41dbc7bc68917884454c6362 \ - --hash=sha256:f06e21ad0b504658a3a9edd3d8530e8cea5723f6ea5d280e8db8efc625b47e49 \ - --hash=sha256:f14546403c2a1d11a130b537dda28f07eb6c1805a43dae4617448074fd49c282 \ - --hash=sha256:f1a5d8f18877474c80b7711d870db0eeef9442691fcdb00adabfc97e183ee0b0 \ - --hash=sha256:f2969e8f72c6236c51f91fbb79c33821d12a811e2a94b7aa59c65f8dbdfad34a \ - --hash=sha256:f468d520f47807d1eb5d27648393519655eadc578d5dd862d06873cce04c4d1b \ - --hash=sha256:f70dc00a91311a1aea124e5f64569ea44c011b58433981313202c46bccbec0e1 \ - --hash=sha256:f93255b3e4d64785554e544c1c76cd32f4a354fa79e2eeca5d16ac2e7fdd57aa +pydantic-core==2.10.1 \ + --hash=sha256:042462d8d6ba707fd3ce9649e7bf268633a41018d6a998fb5fbacb7e928a183e \ + --hash=sha256:0523aeb76e03f753b58be33b26540880bac5aa54422e4462404c432230543f33 \ + --hash=sha256:05560ab976012bf40f25d5225a58bfa649bb897b87192a36c6fef1ab132540d7 \ + --hash=sha256:0675ba5d22de54d07bccde38997e780044dcfa9a71aac9fd7d4d7a1d2e3e65f7 \ + --hash=sha256:073d4a470b195d2b2245d0343569aac7e979d3a0dcce6c7d2af6d8a920ad0bea \ + --hash=sha256:07ec6d7d929ae9c68f716195ce15e745b3e8fa122fc67698ac6498d802ed0fa4 \ + --hash=sha256:0880e239827b4b5b3e2ce05e6b766a7414e5f5aedc4523be6b68cfbc7f61c5d0 \ + --hash=sha256:0c27f38dc4fbf07b358b2bc90edf35e82d1703e22ff2efa4af4ad5de1b3833e7 \ + --hash=sha256:0d8a8adef23d86d8eceed3e32e9cca8879c7481c183f84ed1a8edc7df073af94 \ + --hash=sha256:0e2a35baa428181cb2270a15864ec6286822d3576f2ed0f4cd7f0c1708472aff \ + --hash=sha256:0f8682dbdd2f67f8e1edddcbffcc29f60a6182b4901c367fc8c1c40d30bb0a82 \ + --hash=sha256:0fa467fd300a6f046bdb248d40cd015b21b7576c168a6bb20aa22e595c8ffcdd \ + --hash=sha256:128552af70a64660f21cb0eb4876cbdadf1a1f9d5de820fed6421fa8de07c893 \ + --hash=sha256:1396e81b83516b9d5c9e26a924fa69164156c148c717131f54f586485ac3c15e \ + --hash=sha256:149b8a07712f45b332faee1a2258d8ef1fb4a36f88c0c17cb687f205c5dc6e7d \ + --hash=sha256:14ac492c686defc8e6133e3a2d9eaf5261b3df26b8ae97450c1647286750b901 \ + --hash=sha256:14cfbb00959259e15d684505263d5a21732b31248a5dd4941f73a3be233865b9 \ + --hash=sha256:14e09ff0b8fe6e46b93d36a878f6e4a3a98ba5303c76bb8e716f4878a3bee92c \ + --hash=sha256:154ea7c52e32dce13065dbb20a4a6f0cc012b4f667ac90d648d36b12007fa9f7 \ + --hash=sha256:15d6bca84ffc966cc9976b09a18cf9543ed4d4ecbd97e7086f9ce9327ea48891 \ + --hash=sha256:1d40f55222b233e98e3921df7811c27567f0e1a4411b93d4c5c0f4ce131bc42f \ + --hash=sha256:25bd966103890ccfa028841a8f30cebcf5875eeac8c4bde4fe221364c92f0c9a \ + --hash=sha256:2cf5bb4dd67f20f3bbc1209ef572a259027c49e5ff694fa56bed62959b41e1f9 \ + --hash=sha256:2e0e2959ef5d5b8dc9ef21e1a305a21a36e254e6a34432d00c72a92fdc5ecda5 \ + --hash=sha256:320f14bd4542a04ab23747ff2c8a778bde727158b606e2661349557f0770711e \ + --hash=sha256:3625578b6010c65964d177626fde80cf60d7f2e297d56b925cb5cdeda6e9925a \ + --hash=sha256:39215d809470f4c8d1881758575b2abfb80174a9e8daf8f33b1d4379357e417c \ + --hash=sha256:3f0ac9fb8608dbc6eaf17956bf623c9119b4db7dbb511650910a82e261e6600f \ + --hash=sha256:417243bf599ba1f1fef2bb8c543ceb918676954734e2dcb82bf162ae9d7bd514 \ + --hash=sha256:420a692b547736a8d8703c39ea935ab5d8f0d2573f8f123b0a294e49a73f214b \ + --hash=sha256:443fed67d33aa85357464f297e3d26e570267d1af6fef1c21ca50921d2976302 \ + --hash=sha256:48525933fea744a3e7464c19bfede85df4aba79ce90c60b94d8b6e1eddd67096 \ + --hash=sha256:485a91abe3a07c3a8d1e082ba29254eea3e2bb13cbbd4351ea4e5a21912cc9b0 \ + --hash=sha256:4a5be350f922430997f240d25f8219f93b0c81e15f7b30b868b2fddfc2d05f27 \ + --hash=sha256:4d966c47f9dd73c2d32a809d2be529112d509321c5310ebf54076812e6ecd884 \ + --hash=sha256:524ff0ca3baea164d6d93a32c58ac79eca9f6cf713586fdc0adb66a8cdeab96a \ + --hash=sha256:53df009d1e1ba40f696f8995683e067e3967101d4bb4ea6f667931b7d4a01357 \ + --hash=sha256:5994985da903d0b8a08e4935c46ed8daf5be1cf217489e673910951dc533d430 \ + --hash=sha256:5cabb9710f09d5d2e9e2748c3e3e20d991a4c5f96ed8f1132518f54ab2967221 \ + --hash=sha256:5fdb39f67c779b183b0c853cd6b45f7db84b84e0571b3ef1c89cdb1dfc367325 \ + --hash=sha256:600d04a7b342363058b9190d4e929a8e2e715c5682a70cc37d5ded1e0dd370b4 \ + --hash=sha256:631cb7415225954fdcc2a024119101946793e5923f6c4d73a5914d27eb3d3a05 \ + --hash=sha256:63974d168b6233b4ed6a0046296803cb13c56637a7b8106564ab575926572a55 \ + --hash=sha256:64322bfa13e44c6c30c518729ef08fda6026b96d5c0be724b3c4ae4da939f875 \ + --hash=sha256:655f8f4c8d6a5963c9a0687793da37b9b681d9ad06f29438a3b2326d4e6b7970 \ + --hash=sha256:6835451b57c1b467b95ffb03a38bb75b52fb4dc2762bb1d9dbed8de31ea7d0fc \ + --hash=sha256:6db2eb9654a85ada248afa5a6db5ff1cf0f7b16043a6b070adc4a5be68c716d6 \ + --hash=sha256:7c4d1894fe112b0864c1fa75dffa045720a194b227bed12f4be7f6045b25209f \ + --hash=sha256:7eb037106f5c6b3b0b864ad226b0b7ab58157124161d48e4b30c4a43fef8bc4b \ + --hash=sha256:8282bab177a9a3081fd3d0a0175a07a1e2bfb7fcbbd949519ea0980f8a07144d \ + --hash=sha256:82f55187a5bebae7d81d35b1e9aaea5e169d44819789837cdd4720d768c55d15 \ + --hash=sha256:8572cadbf4cfa95fb4187775b5ade2eaa93511f07947b38f4cd67cf10783b118 \ + --hash=sha256:8cdbbd92154db2fec4ec973d45c565e767ddc20aa6dbaf50142676484cbff8ee \ + --hash=sha256:8f6e6aed5818c264412ac0598b581a002a9f050cb2637a84979859e70197aa9e \ + --hash=sha256:92f675fefa977625105708492850bcbc1182bfc3e997f8eecb866d1927c98ae6 \ + --hash=sha256:962ed72424bf1f72334e2f1e61b68f16c0e596f024ca7ac5daf229f7c26e4208 \ + --hash=sha256:9badf8d45171d92387410b04639d73811b785b5161ecadabf056ea14d62d4ede \ + --hash=sha256:9c120c9ce3b163b985a3b966bb701114beb1da4b0468b9b236fc754783d85aa3 \ + --hash=sha256:9f6f3e2598604956480f6c8aa24a3384dbf6509fe995d97f6ca6103bb8c2534e \ + --hash=sha256:a1254357f7e4c82e77c348dabf2d55f1d14d19d91ff025004775e70a6ef40ada \ + --hash=sha256:a1392e0638af203cee360495fd2cfdd6054711f2db5175b6e9c3c461b76f5175 \ + --hash=sha256:a1c311fd06ab3b10805abb72109f01a134019739bd3286b8ae1bc2fc4e50c07a \ + --hash=sha256:a5cb87bdc2e5f620693148b5f8f842d293cae46c5f15a1b1bf7ceeed324a740c \ + --hash=sha256:a7a7902bf75779bc12ccfc508bfb7a4c47063f748ea3de87135d433a4cca7a2f \ + --hash=sha256:aad7bd686363d1ce4ee930ad39f14e1673248373f4a9d74d2b9554f06199fb58 \ + --hash=sha256:aafdb89fdeb5fe165043896817eccd6434aee124d5ee9b354f92cd574ba5e78f \ + --hash=sha256:ae8a8843b11dc0b03b57b52793e391f0122e740de3df1474814c700d2622950a \ + --hash=sha256:b00bc4619f60c853556b35f83731bd817f989cba3e97dc792bb8c97941b8053a \ + --hash=sha256:b1f22a9ab44de5f082216270552aa54259db20189e68fc12484873d926426921 \ + --hash=sha256:b3c01c2fb081fced3bbb3da78510693dc7121bb893a1f0f5f4b48013201f362e \ + --hash=sha256:b3dcd587b69bbf54fc04ca157c2323b8911033e827fffaecf0cafa5a892a0904 \ + --hash=sha256:b4a6db486ac8e99ae696e09efc8b2b9fea67b63c8f88ba7a1a16c24a057a0776 \ + --hash=sha256:bec7dd208a4182e99c5b6c501ce0b1f49de2802448d4056091f8e630b28e9a52 \ + --hash=sha256:c0877239307b7e69d025b73774e88e86ce82f6ba6adf98f41069d5b0b78bd1bf \ + --hash=sha256:caa48fc31fc7243e50188197b5f0c4228956f97b954f76da157aae7f67269ae8 \ + --hash=sha256:cfe1090245c078720d250d19cb05d67e21a9cd7c257698ef139bc41cf6c27b4f \ + --hash=sha256:d43002441932f9a9ea5d6f9efaa2e21458221a3a4b417a14027a1d530201ef1b \ + --hash=sha256:d64728ee14e667ba27c66314b7d880b8eeb050e58ffc5fec3b7a109f8cddbd63 \ + --hash=sha256:d6495008733c7521a89422d7a68efa0a0122c99a5861f06020ef5b1f51f9ba7c \ + --hash=sha256:d8f1ebca515a03e5654f88411420fea6380fc841d1bea08effb28184e3d4899f \ + --hash=sha256:d99277877daf2efe074eae6338453a4ed54a2d93fb4678ddfe1209a0c93a2468 \ + --hash=sha256:da01bec0a26befab4898ed83b362993c844b9a607a86add78604186297eb047e \ + --hash=sha256:db9a28c063c7c00844ae42a80203eb6d2d6bbb97070cfa00194dff40e6f545ab \ + --hash=sha256:dda81e5ec82485155a19d9624cfcca9be88a405e2857354e5b089c2a982144b2 \ + --hash=sha256:e357571bb0efd65fd55f18db0a2fb0ed89d0bb1d41d906b138f088933ae618bb \ + --hash=sha256:e544246b859f17373bed915182ab841b80849ed9cf23f1f07b73b7c58baee5fb \ + --hash=sha256:e562617a45b5a9da5be4abe72b971d4f00bf8555eb29bb91ec2ef2be348cd132 \ + --hash=sha256:e570ffeb2170e116a5b17e83f19911020ac79d19c96f320cbfa1fa96b470185b \ + --hash=sha256:e6f31a17acede6a8cd1ae2d123ce04d8cca74056c9d456075f4f6f85de055607 \ + --hash=sha256:e9121b4009339b0f751955baf4543a0bfd6bc3f8188f8056b1a25a2d45099934 \ + --hash=sha256:ebedb45b9feb7258fac0a268a3f6bec0a2ea4d9558f3d6f813f02ff3a6dc6698 \ + --hash=sha256:ecaac27da855b8d73f92123e5f03612b04c5632fd0a476e469dfc47cd37d6b2e \ + --hash=sha256:ecdbde46235f3d560b18be0cb706c8e8ad1b965e5c13bbba7450c86064e96561 \ + --hash=sha256:ed550ed05540c03f0e69e6d74ad58d026de61b9eaebebbaaf8873e585cbb18de \ + --hash=sha256:eeb3d3d6b399ffe55f9a04e09e635554012f1980696d6b0aca3e6cf42a17a03b \ + --hash=sha256:ef337945bbd76cce390d1b2496ccf9f90b1c1242a3a7bc242ca4a9fc5993427a \ + --hash=sha256:f1365e032a477c1430cfe0cf2856679529a2331426f8081172c4a74186f1d595 \ + --hash=sha256:f23b55eb5464468f9e0e9a9935ce3ed2a870608d5f534025cd5536bca25b1402 \ + --hash=sha256:f2e9072d71c1f6cfc79a36d4484c82823c560e6f5599c43c1ca6b5cdbd54f881 \ + --hash=sha256:f323306d0556351735b54acbf82904fe30a27b6a7147153cbe6e19aaaa2aa429 \ + --hash=sha256:f36a3489d9e28fe4b67be9992a23029c3cec0babc3bd9afb39f49844a8c721c5 \ + --hash=sha256:f64f82cc3443149292b32387086d02a6c7fb39b8781563e0ca7b8d7d9cf72bd7 \ + --hash=sha256:f6defd966ca3b187ec6c366604e9296f585021d922e666b99c47e78738b5666c \ + --hash=sha256:f7c2b8eb9fc872e68b46eeaf835e86bccc3a58ba57d0eedc109cbb14177be531 \ + --hash=sha256:fa7db7558607afeccb33c0e4bf1c9a9a835e26599e76af6fe2fcea45904083a6 \ + --hash=sha256:fcb83175cc4936a5425dde3356f079ae03c0802bbdf8ff82c035f8a54b333521 # via pydantic pyproject-hooks==1.0.0 \ --hash=sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8 \ @@ -330,9 +335,9 @@ pysocks==1.7.1 \ --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \ --hash=sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0 # via urllib3 -pytest==7.4.2 \ - --hash=sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002 \ - --hash=sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069 +pytest==7.4.3 \ + --hash=sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac \ + --hash=sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5 # via leapfrogai-api (pyproject.toml) python-multipart==0.0.6 \ --hash=sha256:e9925a80bb668529f1b67c7fdb0a5dacdd7cbfc6fb0bff3ea443fe22bdd62132 \ @@ -393,18 +398,13 @@ pyyaml==6.0.1 \ selenium==4.15.2 \ --hash=sha256:22eab5a1724c73d51b240a69ca702997b717eee4ba1f6065bf5d6b44dba01d48 \ --hash=sha256:9e82cd1ac647fb73cf0d4a6e280284102aaa3c9d94f0fa6e6cc4b5db6a30afbf - # via - # leapfrogai-api (pyproject.toml) - # selenium-async -selenium-async==0.1.0 \ - --hash=sha256:61f0044922bb0a6de4287cd46cf14a61d4cf975f9e0c1c22c1e51efdeca77bb6 \ - --hash=sha256:82ffc0d68795982c553af836a00c37d96c83eda0cd0f38f17a8b775d30c75129 # via leapfrogai-api (pyproject.toml) sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via # anyio + # httpx # trio sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ @@ -418,15 +418,6 @@ toml==0.10.2 \ --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f # via leapfrogai-api (pyproject.toml) -tomli==2.0.1 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via - # black - # build - # pip-tools - # pyproject-hooks - # pytest trio==0.23.1 \ --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe @@ -437,25 +428,22 @@ trio-websocket==0.11.1 \ --hash=sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f \ --hash=sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 # via selenium -typing-extensions==4.7.1 \ - --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \ - --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2 +typing-extensions==4.8.0 \ + --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ + --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef # via - # black # fastapi # pydantic # pydantic-core - # starlette - # uvicorn urllib3[socks]==2.0.7 \ --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e # via # selenium # urllib3 -uvicorn==0.23.2 \ - --hash=sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53 \ - --hash=sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a +uvicorn==0.24.0.post1 \ + --hash=sha256:09c8e5a79dc466bdf28dead50093957db184de356fcdc48697bad3bde4c2588e \ + --hash=sha256:7c84fea70c619d4a710153482c0d230929af7bcf76c7bfa6de151f0a3a80121e # via leapfrogai-api (pyproject.toml) watchfiles==0.21.0 \ --hash=sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc \ @@ -534,18 +522,14 @@ watchfiles==0.21.0 \ --hash=sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303 \ --hash=sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d # via leapfrogai-api (pyproject.toml) -wheel==0.41.2 \ - --hash=sha256:0c5ac5ff2afb79ac23ab82bab027a0be7b5dbcf2e54dc50efe4bf507de1f7985 \ - --hash=sha256:75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8 +wheel==0.41.3 \ + --hash=sha256:488609bc63a29322326e05560731bf7bfea8e48ad646e1f5e40d366607de0942 \ + --hash=sha256:4d4987ce51a49370ea65c0bfd2234e8ce80a12780820d9dc462597a6e60d0841 # via pip-tools wsproto==1.2.0 \ --hash=sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065 \ --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 # via trio-websocket -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 - # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: pip==23.3.1 \ diff --git a/requirements.txt b/requirements.txt index 059f43e..d02e5dc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile --generate-hashes --output-file=requirements.txt pyproject.toml @@ -19,10 +19,6 @@ click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via uvicorn -exceptiongroup==1.1.3 \ - --hash=sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9 \ - --hash=sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3 - # via anyio fastapi==0.103.1 \ --hash=sha256:345844e6a82062f06a096684196aaf96c1198b25c06b72c1311b882aa2d8a35d \ --hash=sha256:5e5f17e826dbd9e9b5a5145976c5cd90bcaa61f2bf9a69aca423f2bcebe44d83 @@ -304,8 +300,6 @@ typing-extensions==4.7.1 \ # fastapi # pydantic # pydantic-core - # starlette - # uvicorn uvicorn==0.23.2 \ --hash=sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53 \ --hash=sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a diff --git a/test/fixtures/config.yaml b/test/fixtures/config.yaml deleted file mode 100644 index db432b6..0000000 --- a/test/fixtures/config.yaml +++ /dev/null @@ -1,7 +0,0 @@ -models: -- name: testmodel - url: grpc://localhost:5051 - capabilities: - - all - - the - - things diff --git a/test/test_complete.py b/test/test_complete.py deleted file mode 100644 index c4fcd95..0000000 --- a/test/test_complete.py +++ /dev/null @@ -1,13 +0,0 @@ -import time - -import httpx - -url = "http://127.0.0.1:8000/complete" - -with httpx.post(url) as r: - print("processing the completion: ", r) - - for chunk in r.iter_lines(): # or, for line in r.iter_lines(): - print("HELLO WORLD") - print(chunk, flush=True) -2 diff --git a/test/test_complete_stream.py b/test/test_complete_stream.py deleted file mode 100644 index 3f80ac7..0000000 --- a/test/test_complete_stream.py +++ /dev/null @@ -1,39 +0,0 @@ -import time - -import httpx -from pydantic import BaseModel - -url = "http://127.0.0.1:8000/complete" - - -class CompletionRequest(BaseModel): - model: str - prompt: str | list[int] - stream: bool | None = False - max_new_tokens: int | None = 16 - temperature: float | None = 1.0 - - -thedata = CompletionRequest( - model="somethign", - prompt="What is your favorite name?", - max_new_tokens=512, - temperature=0.7, -) - - -thedata = { - "prompt": "What is your favorite name?", - "max_new_tokens": "512", - "temperature": "0.7", -} - -with httpx.stream("POST", url, data=thedata) as r: - print("processing the stream: ", r.is_stream_consumed) - print(r.is_closed) - # print(r.iter_bytes) - - for chunk in r.iter_lines(): # or, for line in r.iter_lines(): - print("HELLO WORLD") - print(chunk, flush=True) -2 diff --git a/test/test_simple_stream.py b/test/test_simple_stream.py deleted file mode 100644 index db3f387..0000000 --- a/test/test_simple_stream.py +++ /dev/null @@ -1,8 +0,0 @@ -import httpx - -url = "http://127.0.0.1:8000/streamer" - -with httpx.stream("GET", url) as r: - print("processing the stream: ") - for chunk in r.iter_lines(): - print(chunk, flush=True) diff --git a/test/this_will_work.py b/test/this_will_work.py deleted file mode 100644 index aae4e44..0000000 --- a/test/this_will_work.py +++ /dev/null @@ -1,16 +0,0 @@ -import httpx - -url = "http://127.0.0.1:8000/complete" - -with httpx.stream("POST", url) as r: - print("processing the stream: ") - for chunk in r.iter_lines(): # or, for line in r.iter_lines(): - print(chunk, flush=True) - - -# url = 'http://127.0.0.1:8000/streamer' - -# with httpx.stream('GET', url) as r: -# print("processing the stream: ") -# for chunk in r.iter_lines(): # or, for line in r.iter_lines(): -# print(chunk, flush=True) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/data/0min12sec.wav b/tests/data/0min12sec.wav similarity index 100% rename from test/data/0min12sec.wav rename to tests/data/0min12sec.wav diff --git a/tests/fixtures/test-config.yaml b/tests/fixtures/test-config.yaml new file mode 100644 index 0000000..97e1a1c --- /dev/null +++ b/tests/fixtures/test-config.yaml @@ -0,0 +1,3 @@ +models: +- name: repeater + backend: localhost:50051 diff --git a/test/performance/performance_tests.py b/tests/performance/performance_tests.py similarity index 100% rename from test/performance/performance_tests.py rename to tests/performance/performance_tests.py diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 0000000..6cd278d --- /dev/null +++ b/tests/test_main.py @@ -0,0 +1,206 @@ +from fastapi.testclient import TestClient +from main import app +import backends.openai.types as lfai_types +import pytest +import os +import json + +os.environ["LFAI_CONFIG_FILENAME"] = "test-config.yaml" +os.environ["LFAI_CONFIG_PATH"] = os.path.join(os.path.dirname(__file__), "fixtures") + + +def test_config_load(): + with TestClient(app) as client: + response = client.get("/models") + assert response.status_code == 200 + assert response.json() == {"models": {'repeater': {'backend': 'localhost:50051', 'name': 'repeater'}}} + + +def test_routes(): + expected_routes = { + "/docs": ['GET', 'HEAD'], + "/healthz": ['GET'], + "/models": ['GET'], + "/openai/v1/completions": ['POST'], + "/openai/v1/chat/completions": ['POST'], + "/openai/v1/models": ['GET'], + "/openai/v1/embeddings": ['POST'], + "/openai/v1/audio/transcriptions": ['POST'], + } + + actual_routes = app.routes + for route in actual_routes: + if hasattr(route, "path") and route.path in expected_routes: + assert route.methods == set(expected_routes[route.path]) + del expected_routes[route.path] + + assert len(expected_routes) == 0 + + +def test_healthz(): + with TestClient(app) as client: + response = client.get("/healthz") + assert response.status_code == 200 + assert response.json() == {"status": "ok"} + + +@pytest.mark.skipif(os.environ.get("LFAI_RUN_REPEATER_TESTS") != "true", reason="LFAI_RUN_REPEATER_TESTS envvar was not set to true") +def test_completion(): + with TestClient(app) as client: + # Send request to client + input_text = "This is the completion input text." + completion_request = lfai_types.CompletionRequest( + model="repeater", + prompt=input_text, + ) + response = client.post("/openai/v1/completions", json=completion_request.model_dump()) + assert response.status_code == 200 + + # parse through the response + response_obj = response.json() + assert "choices" in response_obj + + # parse the choices from the response + response_choices = response_obj.get("choices") + assert len(response_choices) == 1 + assert "text" in response_choices[0] + + # validate that the repeater repeated + assert response_choices[0].get("text") == input_text + + +@pytest.mark.skipif(os.environ.get("LFAI_RUN_REPEATER_TESTS") != "true", reason="LFAI_RUN_REPEATER_TESTS envvar was not set to true") +def test_embedding(): + expected_embedding=[0.0 for _ in range(10)] + + with TestClient(app) as client: + # Send request to client + embedding_request = lfai_types.CreateEmbeddingRequest( + model="repeater", + input="This is the embedding input text.", + ) + response = client.post("/openai/v1/embeddings", json=embedding_request.model_dump()) + assert response.status_code == 200 + + # parse through the response + response_obj = response.json() + assert "data" in response_obj + assert len(response_obj.get("data")) == 1 + + # validate the expected response + data_obj = response_obj.get("data")[0] + assert "embedding" in data_obj + assert data_obj.get("embedding") == expected_embedding + + +@pytest.mark.skipif(os.environ.get("LFAI_RUN_REPEATER_TESTS") != "true", reason="LFAI_RUN_REPEATER_TESTS envvar was not set to true") +def test_stream_completion(): + with TestClient(app) as client: + # Send request to client + input_text = "This is the completion input text." + stream_completion_request = lfai_types.CompletionRequest( + model="repeater", + prompt=input_text, + stream=True, + ) + response = client.post("/openai/v1/completions", json=stream_completion_request.model_dump()) + assert response.status_code == 200 + assert response.headers.get('content-type') == "text/event-stream; charset=utf-8" + + # parse through the streamed response + iter_length = 0 + iter_lines = response.iter_lines() + for line in iter_lines: + # skip the empty, and non-data lines + if ": " in line: + strings = line.split(": ", 1) + + # Process all the data responses that is not the sig_stop signal + if strings[0] == "data" and strings[1] != "[DONE]": + stream_response = json.loads(strings[1]) + assert "choices" in stream_response + choices = stream_response.get("choices") + assert len(choices) == 1 + assert "text" in choices[0] + assert choices[0].get("text") == input_text + iter_length += 1 + + # The repeater only response with 5 messages + assert iter_length == 5 + + +@pytest.mark.skipif(os.environ.get("LFAI_RUN_REPEATER_TESTS") != "true", reason="LFAI_RUN_REPEATER_TESTS envvar was not set to true") +def test_chat_completion(): + with TestClient(app) as client: + + input_content = "this is the chat completion input." + chat_completion_request = lfai_types.ChatCompletionRequest( + model="repeater", + messages=[ + lfai_types.ChatMessage( + role="user", + content=input_content + ) + ], + ) + response = client.post("/openai/v1/chat/completions", json=chat_completion_request.model_dump()) + assert response.status_code == 200 + + assert response + + # parse through the chat completion response + response_obj = response.json() + assert "choices" in response_obj + + # parse the choices from the response + response_choices = response_obj.get("choices") + assert len(response_choices) == 1 + assert "message" in response_choices[0] + assert "content" in response_choices[0].get("message") + + # validate that the repeater repeated + assert response_choices[0].get("message").get("content") == input_content + + + +@pytest.mark.skipif(os.environ.get("LFAI_RUN_REPEATER_TESTS") != "true", reason="LFAI_RUN_REPEATER_TESTS envvar was not set to true") +def test_stream_chat_completion(): + with TestClient(app) as client: + input_content = "this is the stream chat completion input." + + chat_completion_request = lfai_types.ChatCompletionRequest( + model="repeater", + messages=[ + lfai_types.ChatMessage( + role="user", + content=input_content + ) + ], + stream=True, + ) + + response = client.post("/openai/v1/chat/completions", json=chat_completion_request.model_dump()) + assert response.status_code == 200 + assert response.headers.get('content-type') == "text/event-stream; charset=utf-8" + + # parse through the streamed response + iter_length = 0 + iter_lines = response.iter_lines() + for line in iter_lines: + # skip the empty, and non-data lines + if ": " in line: + strings = line.split(": ", 1) + + # Process all the data responses that is not the sig_stop signal + if strings[0] == "data" and strings[1] != "[DONE]": + stream_response = json.loads(strings[1]) + assert "choices" in stream_response + choices = stream_response.get("choices") + assert len(choices) == 1 + assert "delta" in choices[0] + assert "content" in choices[0].get("delta") + assert choices[0].get("delta").get("content") == input_content + iter_length += 1 + + # The repeater only response with 5 messages + assert iter_length == 5 \ No newline at end of file diff --git a/utils/test_config.py b/utils/test_config.py deleted file mode 100644 index 1234c61..0000000 --- a/utils/test_config.py +++ /dev/null @@ -1,23 +0,0 @@ -import utils.config as config - - -class TestParseConfig: - def test_simple_case(self): - model_fixture = {"name": "testmodel", "url": "grpc://localhost:50051"} - config_fixture = {"models": [model_fixture]} - - c = config.Config() - c.parse_models(config_fixture) - assert c.models["testmodel"] == model_fixture - - -class TestConfig: - def test_existing_model_backend(self): - c = config.Config( - { - "test": config.Model( - name="test", backend="grpc://localhost:50051", capabilities=None - ) - } - ) - assert c.get_model_backend("test") == "grpc://localhost:50051" diff --git a/zarf-config.yaml b/zarf-config.yaml index 265f2ec..07f8ab7 100644 --- a/zarf-config.yaml +++ b/zarf-config.yaml @@ -1,5 +1,6 @@ package: create: set: - image_version: 0.4.4 + leapfrogai_api_version: 0.4.4 + kiwigrid_version: 1.23.3 max_package_size: "1000000000" \ No newline at end of file diff --git a/zarf.yaml b/zarf.yaml index bf75db9..9e4e1a7 100644 --- a/zarf.yaml +++ b/zarf.yaml @@ -4,14 +4,14 @@ kind: ZarfPackageConfig metadata: description: "LeapfrogAI" name: leapfrogai-api - version: "###ZARF_PKG_TMPL_IMAGE_VERSION###" + version: "###ZARF_PKG_TMPL_LEAPFROGAI_API_VERSION###" architecture: amd64 constants: - name: LEAPFROGAI_API_VERSION - value: "###ZARF_PKG_TMPL_IMAGE_VERSION###" + value: "###ZARF_PKG_TMPL_LEAPFROGAI_API_VERSION###" - name: KIWIGRID_VERSION - value: "1.23.3" + value: "###ZARF_PKG_TMPL_KIWIGRID_VERSION###" variables: - name: ISTIO_ENABLED @@ -30,12 +30,12 @@ components: - name: leapfrogai namespace: leapfrogai localPath: chart - version: "###ZARF_PKG_TMPL_IMAGE_VERSION###" + version: "###ZARF_PKG_TMPL_LEAPFROGAI_API_VERSION###" valuesFiles: - "lfai-values.yaml" images: - - "ghcr.io/defenseunicorns/leapfrogai/leapfrogai-api:###ZARF_PKG_TMPL_IMAGE_VERSION###" - - "registry1.dso.mil/ironbank/kiwigrid/k8s-sidecar:1.23.3" + - "ghcr.io/defenseunicorns/leapfrogai/leapfrogai-api:###ZARF_PKG_TMPL_LEAPFROGAI_API_VERSION###" + - "registry1.dso.mil/ironbank/kiwigrid/k8s-sidecar:###ZARF_PKG_TMPL_KIWIGRID_VERSION###" - name: metallb-config required: false description: "Creates metallb tenant ingresses for the cluster"