diff --git a/.DS_Store b/.DS_Store index ff77bef..7a11cef 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fc5c466..0b1f517 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,7 +33,7 @@ jobs: with: poetry-version: 1.3.2 - name: Install dependencies - run: poetry install + run: poetry install --all-extras - name: Static code checks run: | pip install flake8 diff --git a/.gitignore b/.gitignore index b366703..3986061 100644 --- a/.gitignore +++ b/.gitignore @@ -247,3 +247,4 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +/.ruff_cache/ diff --git a/Makefile b/Makefile index 9225b6c..9ec1faa 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,6 @@ isort: lint: make black make ruff - make isort pre-commit: pre-commit run --all-files diff --git a/README.md b/README.md index 7cfee0e..dc63d57 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,43 @@ Here's everything you can pass to reliableGPT | `fallback_strategy` | list | Optional | You can define a custom fallback strategy of OpenAI models you want to try using. If you want to try one model several times, then just repeat that e.g. ['gpt-4', 'gpt-4', 'gpt-3.5-turbo'] will try gpt-4 twice before trying gpt-3.5-turbo | | `model_limits_dir`| dict | Optional | Note: Required if using `queue_requests = True`, For models you want to handle rate limits for set model_limits_dir = {"gpt-3.5-turbo": {"max_token_capacity": 1000000, "max_request_capacity": 10000}} You can find your account rate limits here: https://platform.openai.com/account/rate-limits | | `user_token`| string | Optional | Pass your user token if you want us to handle OpenAI Invalid Key Errors - we'll rotate through your stored keys (more on this below 👇) till we get one that works| +| `azure_fallback_strategy`| List[string] | Optional | Pass your backup azure deployment/engine id's. In case your requests start failing we'll switch to one of these (if you also pass in a backup openai key, we'll try the Azure endpoints before the raw OpenAI ones) | | `backup_openai_key`| string | Optional | Pass your OpenAI API key if you're using Azure and want to switch to OpenAI in case your requests start failing | | `caching` | bool | Optional | Cache your openai responses, Used as backup in case model fallback fails **or** overloaded queue (if you're servers are being overwhelmed with requests, it'll alert you and return cached responses, so that customer requests don't get dropped) | | `max_threads` | int | Optional | Pass this in alongside `caching=True`, for it to handle the overloaded queue scenario | # 👨‍🔬 Use Cases +## Use Caching around your Query Endpoint 🔥 +If you're seeing high-traffic and want to make sure all your users get a response, wrap your query endpoint with reliableCache. It monitors for high-thread utilization and responds with cached responses. +### Step 1. Import reliableCache +```python +from reliablegpt import reliableCache +``` +### Step 2. Initialize reliableCache +```python +# max_threads: the maximum number of threads you've allocated for flask to run (by default this is 1). +# query_arg: the variable name you're using to pass the user query to your endpoint (Assuming this is in the params/args) +# customer_instance_arg: unique identifier for that customer's instance (we'll put all cached responses for that customer within this bucket) +# user_email: [REQUIRED] your user email - we will alert you when you're seeing high utilization +cache = reliableCache(max_threads=20, query_arg="query", customer_instance_arg="instance_id", user_email="krrish@berri.ai") +``` + +e.g. The number of threads for this flask app is `50` +```python +if __name__ == "__main__": + from waitress import serve + serve(app, host="0.0.0.0", port=4000, threads=50) +``` + +### Step 3. Decorate your endpoint 🚀 +```python +## Decorate your endpoint with cache.cache_wrapper, this monitors for .. +## .. high thread utilization and sends cached responses when that happens +@app.route("/test_func") +@cache.cache_wrapper +def test_fn(): + # your endpoint logic +``` ## Switch between Azure OpenAI and raw OpenAI If you're using Azure OpenAI and facing issues like Read/Request Timeouts, Rate limits, etc. you can use reliableGPT 💪 to fall back to the raw OpenAI endpoints if your Azure OpenAI endpoint fails diff --git a/dist/reliableGPT-0.2.992-py3-none-any.whl b/dist/reliableGPT-0.2.992-py3-none-any.whl new file mode 100644 index 0000000..6bfeff6 Binary files /dev/null and b/dist/reliableGPT-0.2.992-py3-none-any.whl differ diff --git a/dist/reliableGPT-0.2.992.tar.gz b/dist/reliableGPT-0.2.992.tar.gz new file mode 100644 index 0000000..cba0753 Binary files /dev/null and b/dist/reliableGPT-0.2.992.tar.gz differ diff --git a/dist/reliableGPT-0.2.993-py3-none-any.whl b/dist/reliableGPT-0.2.993-py3-none-any.whl new file mode 100644 index 0000000..3c555a4 Binary files /dev/null and b/dist/reliableGPT-0.2.993-py3-none-any.whl differ diff --git a/dist/reliableGPT-0.2.993.tar.gz b/dist/reliableGPT-0.2.993.tar.gz new file mode 100644 index 0000000..5e4b70a Binary files /dev/null and b/dist/reliableGPT-0.2.993.tar.gz differ diff --git a/dist/reliableGPT-0.2.9933-py3-none-any.whl b/dist/reliableGPT-0.2.9933-py3-none-any.whl new file mode 100644 index 0000000..df20177 Binary files /dev/null and b/dist/reliableGPT-0.2.9933-py3-none-any.whl differ diff --git a/dist/reliableGPT-0.2.9933.tar.gz b/dist/reliableGPT-0.2.9933.tar.gz new file mode 100644 index 0000000..75aadbf Binary files /dev/null and b/dist/reliableGPT-0.2.9933.tar.gz differ diff --git a/dist/reliableGPT-0.2.994-py3-none-any.whl b/dist/reliableGPT-0.2.994-py3-none-any.whl new file mode 100644 index 0000000..d0e0299 Binary files /dev/null and b/dist/reliableGPT-0.2.994-py3-none-any.whl differ diff --git a/dist/reliableGPT-0.2.994.tar.gz b/dist/reliableGPT-0.2.994.tar.gz new file mode 100644 index 0000000..79cb25d Binary files /dev/null and b/dist/reliableGPT-0.2.994.tar.gz differ diff --git a/dist/reliableGPT-0.2.995-py3-none-any.whl b/dist/reliableGPT-0.2.995-py3-none-any.whl new file mode 100644 index 0000000..d14f77e Binary files /dev/null and b/dist/reliableGPT-0.2.995-py3-none-any.whl differ diff --git a/dist/reliableGPT-0.2.995.tar.gz b/dist/reliableGPT-0.2.995.tar.gz new file mode 100644 index 0000000..2b44b8a Binary files /dev/null and b/dist/reliableGPT-0.2.995.tar.gz differ diff --git a/examples/UseModelFallBacks.ipynb b/examples/UseModelFallBacks.ipynb new file mode 100644 index 0000000..6cfee6d --- /dev/null +++ b/examples/UseModelFallBacks.ipynb @@ -0,0 +1,504 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 6x LLM Request Throughput: Building a Load Balancer for LLM API calls\n", + "If you're getting rate limited by OpenAI, this notebook is a tutorial on how to build a load balancer to increase your throughput capacity\n", + "\n", + "* Below you can see using the load balancer leads to a ~6x improvement in successfull LLM API Calls. 391 successfull calls (15%) without the load balancer, 2162 successfull calls (86.5%) with load balancer\n", + "\n", + "![Screenshot 2023-07-17 at 10.13.38 AM.png](data:image/png;base64,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jy9bbrllbfq6664rv/nNb8rZZ59dbr755vLSl760PPShD63wbmH1Le08WIHbb7+9nHDCCTU2d999d3nBC15QnvjEJz74xHwSBaJAFIgCUSAKzFUgYG6uFPkiCkSBKBAFokAUmKwCXDJcTldddVX5/e9/XzbZZJO5wGSxxRbrWj0X1B133FF++tOf1vcNN9ywrLfeetV10/XC/zv4hz/8oVx88cUFENDWiiuuWDbbbLOintHK9ddfX/7yl78U12rbdY961KPKBhtsUCHPrFmzRru06+f6cNNNN5Xf/e53VYsllliiPOxhDyuPfvSjS7c6aWD8V155ZR1HZyPcYIsvvnhZeumlyyqrrFLWWWedBzmS/v73v5df/epX5a9//WtR1yMe8Yiy8cYbd1Yzrq+51Tigrrnmmjoe4EUbiv5wsq200kpljTXWqH1ZeeWVx1X//E7+r//6r3L66aeXpz3taeXpT3962X777eslYkanE088sYjhW97ylho3MV+Q5d577636mt+33nprmTNnztzmxHWRRRYpYs3ZR5d11123uvmWXHLJemzuydP4C/HlRLz66qvLDTfcUL82n7nhjJEzkQtOrNdee+06F43Z2F33qU99qvzkJz8pd955ZznooIPKLrvsMm1HK57mtPvFfWVMYuc+S4kCUSAKRIEosLAUCJhbWEqnnSgQBaJAFIgCA6CAh3rA5KyzzirHH3982WOPPcpee+1VAZsH327FAzIAdNhhh1VY9qxnPavssMMO5ZGPfGS3y+YeA2k+8pGPVIAEHmy00UZl3333rWBgNBj2s5/9rJx77rnlpJNOqm3r42tf+9ryjGc8o/Z5oqmRzdH11a9+tXzve9+rD/t0eN3rXleBFogxUgEH3/e+95UzzzyzQg79bn1owAc8ADy33XbbCvpmz55dz3EuGAKM/OhHP6qg8eUvf3l57nOfO1JTXT8DWMXyT3/6U/ntb39bLrzwwgovAQyQRgGb1lprraJ9wBHQ3Hzzzef2pWsDYzw43cAcUElfTj3adMZHTIFdYGfNNdesujzpSU8qj3nMYyqcE7/pXEBGcTdGUP2HP/xhueSSS8qf//zn6koEeo3X/AOFH/KQh1QXI/i72mqrVZjVb2BOf42PK1M69MMf/vAKUwHnlCgQBaJAFIgCC0uBgLmFpXTaiQJRIApEgSgwAApMBzDHycTd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YK5PA5duR4EoMPAKjAvMDal17803lWu/f3a5489XlL/fektf6bfY8iuUZdZbv6z5pB3Lkquu3pO+Axrf//73a/rpeuutVx1G4Finywg4O+yww2r65LLLLlt+85vflJ133rn867/+a+lcw+t73/tedd95f9rTnlaPS4l1DndeWwusvQfMjS2EAXP/0KkTzAHIBx10UF1TjmtOMZdB0G9961t1TUPQGRgda6rsP1oZ/b8Bc6Nr046IAejmnu+WQhww1xTLexSIAlGgvxQImOuvePVdbwPm+i5k6XAUiAJRoCowXjB3z/XXlatO+Ua59feXlPuGNhXop7L4SiuV5TbapKy36+5l6bXm3XhhMuP48Y9/XI444oj6QG3zB841i9tzvoBn1vV673vfW7bbbru6TtrXv/71ss0225TXvva1dRMGDjpFuut3vvOdCkesL/eqV72qPqD/+c9/rnVIX7VxhDXAbrzxxgpPvvvd75ZLLrmkbuzwqEc9qjz0oQ+tdVnAHyi00YP1xNoacxx3L3nJSyrk447i4FPULQVXCqN16DqhgHEAgzYN8PJLpU0IfAY02ihgk002qe8rDWncik0bLrzwwno+V9ajH/3oeVJRQQjpqr///e9rqu4WW2xRx6bvv/jFL6oW55xzTj1HvzbYYINigwtFOq/19lZZZZX5bggxETBnzOCHTTNstgBY2TBBn22QALxKN7aZxAorrNCGXK+REmrdP5sd2HiDxrQQZ/qIofkhPsNdUTSVokzn3/3ud9XF5nvwzPht0MBZCe5OZo05a+297nWvq/FrYM4gxPbb3/52jYff7f793/+9rjXXBijuxuXY3/72tzoPGkgyb8wFmzqIobnWWUYDc643Rusv0trcppnPm2ZtjlkDrxNmq9/85/IzRxwXI6ndxiKO5rZNU6y/SHNzsVN37bhPzUOp6ZyDvleP9l0rzuLd5p92/eykg/vTdbTxGT1tyOEa96OYt/aMyzW//e1v65ziXNQfbQOh+mtuuRfdU6OV1ue2VqA+alddKVEgCkSBKDB9FQiYm76xmRE980uGX6QUvxz4BSolCkSBKBAFpr8C4wVzd//t2nLF148tt17yq3LfjTdM/wF29HDxlVcpy2+yWdlgz73LMuuu13Fkcl9KFT322GMrxLGA/hvf+Mb6QO4h2+6ZFry3Vtq//Mu/VJjka2mCL37x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dGDA3Jw5/4jzrFkDHe8MPgoscAVyry1wiVsDAXNNifG/P/DAA+Wqq64qf/jDH8qvf/3r8pjHPKY88pGPLMsuu2xZdNFF51Z4yy23lD//+c/ld7/7XbnhhhvKQx7ykPraaKON5p7jC7H429/+Vs4+++yyxBJLlIc+9KFl9uzZ5bbbbivf+973ynLLLVfWXXfdstlmm5Xll1++aN/56r/77rvLOuusU1ZfffV56vSNc371q1+VG2+8sSy11FJlu+22K6usssqDzpvoB5dddlk5/fTTy3rrrVc22WSTYlxLL730RKub0utofckllxS/19xxxx3lyU9+cll//fXH1KdrrrmmXH755VXr22+/fe41s4Z+Z1hkkUXKkksuWeO21lprlQ033LC+zBPHe1F++9vf1rl466231jny2Mc+thfVpo5pqEDA3NQGJWBuavVP6zNfgYC57jEOmOuuz0AfHRQwN2cIFjxwz93l/qEHoDlDD0SlwYOBjn4GHwV6p8CsoYfXWYsuVhYdeqiftdhiPXtg7V0PZ15NAXMTj6mH45///OflzDPPLF/96lfLPvvsU174whcW4AUAa+WKK66oYO073/lO+eMf/1hhzzOe8YzytKc9rZ1S30GhX/ziF+W9731vWWmllcqzn/3sCtGAtSOPPLKsttpq5VGPelTZaaedKoATO+3/6U9/KjfffHN5whOeUMHgPJUOfQMaHn/88bXtFVdcsRxyyCFl4403Hn7ahL8/44wzytvf/vayzTbb1L6BWb0EfxPu2AQuBNdOPvnk8tOf/rQCzbe+9a1l2223HVNNF198cY3z1772tQpTwdMG5YA5c0JcgT5aAaS+75wrY2polJO+8Y1vVKgLFu+6665l//33H+XMfNzvCgTMTW0EA+amVv+0PvMVCJjrHuOAue76DPTRQQFzgnzL735Tbv7lxeW+228rD9x770DHPYOPAr1WYLFlli1LrbFGWXWrbcqSqz7Y+dPr9lLfP1xagND1119fQBugYPHFF68On+H6+FvEnKH/gQ298fgMb2HhfP/A0ECMYLJGpfvvv7865s4666xyxBFHVCj1nOc8pzziEY8oK6ywwtzBcGCdcMIJ5cc//nH561//WjbddNMKTp7//OfPPccXXHUXXnhh+fSnP10ddS9+8YvLwx72sNIA4DLLLFPh3OwhF52v77nnnnLKKaeU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ZZddtqy22mplk002KRtvvHFZf/31y3DY5dw//vGP5fe//3257LLL6rWLLLJIWX755csjHvGI8rCHPayss846Zckll3yQ0tq44YYbys9//vNy+eWXl7/+9a/lgQceKMstt1xZa621yqMf/eja9tJLL13UObzceOONte8XX3xxueaaa8ptt91WllpqqbLGGmuUhzzkIWWzzTarbQ/v8/B6Jvp9wNxElct1USAKdCoQMNepxsL5uhPMrbDCCmXllVcuiy+++Ij/1iycHqWVKBAFokAU6KZAwFw3dRb8sYC5Ba9xWhhsBQLmusd/xoO566+/vnz/+98vl1xySYVcQN29995b/OPnIQUkW3fddSsk23rrrevDC1CmgHKg3ve+971y6aWXFqDq/vvvr/Bu0UUXLQ996EPLFltsUZ7whCeU1Vdf/UFwzrW//e1vy7nnnlvBmvq43rS7zDLLlG222aZoE9zzfQNs2vBQBej97Gc/K7/85S/LzTffXNsG8DxkgXM77LBD2XLLLWufF1tsse6RnsDRgLkJiJZLokAUeJACAXMPkmSBf+DfOH/Mue666+ofklZcccX6h52R/gi0wDuTBqJAFIgCUWC+Cng+8ZziD/N+r/e7vnfPHCkLXoGAuQWvcVoYbAUC5rrHf8aDuSuuuKIcddRR9eEEhOOMA9E4z66++urqggPAfL7jjjuWJz7xidU5RzYw7oILLijHH398fbDhcOOqu+eee+oxLrolllii7LfffuWRj3xkWXPNNedR+8QTTyxnnnlmhXtceY973OPqP65XXXVVOf/88+u1m266ab1+vfXWm+tk8I8yZ9/RRx9dzjvvvFrv5ptvXgEe0Agyuv7JT35y7fPjH//4CuvmabwH3wTM9UDEVBEFokAJmFv4k4A7+/bbb69ObX9s8gcdLvEF8UechT+6tBgFokAUmHkK+P3fH/FvueWW+sd+2TWgXPvD/cwb8fQaUcDc9IpHejPzFAiY6x7TGQ/mpJL+8Ic/rC45jgFQThoq1xoX2h/+8Idy2mmnlVtvvbUe23///at7zj+Cp5xySjn77LNrCiwot9NOO1V3GifCtddeW0499dR6PTD2pCc9qWy77bZV7bvvvrvWDaz96Ec/KuDbVlttVR7zmMdU+ObaX/ziF/UYZ9wBBxxQwZ6+KYAYp5x+SX/ddddda9qsf6A9aP3qV7+q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nEK2a6+91u2qqo0cNAtujz328PbkscceszvuuMPNtFM4d+65526fWef9IiejCRDMRaOlYQSSEiCYS6rcDBYBBBBAAIHCCRDMFa5kdLhgAgRz/oJFCeYUsl199dU2dOhQN1vuqKOOsi5dunh7otl12uX18ccft4EDB9rXvvY1a9eunfc7nIwrQDAX15fWEUhFgGAulUozTgQQQAABBIopQDBXzLrR6+IIEMz5axUlmHv00UftyiuvtGHDhtmRRx5pEyZMcM+Z83XlH//4hz300EM2ZcoUt+z18ssvJ5jzgTXAOYK5BkDmEggkIEAwl0CRGSICCCCAAAIFFiCYK3Dx6HohBAjm/GWKEsxp5tu3v/1t69atm40aNco+9KEPWa9evaxJkybuJ9ulbdu2mX4mTZrkNouYPXu27bfffnbJJZcQzGWhGuE9wVwjoHNJBEooQDBXwqIyJAQQQAABBEokQDBXomIylJoUIJjzlyVKMPfcc8/Z9ddf73Zcbd68uR199NEubNMS1d12281atmzperV27VpbunSpzZo1y/72t7+5Zaw9e/Z0y18/8YlPWOvWrf2952xUAYK5qLw0jkAyAgRzyZSagSKAAAIIIFBIAYK5QpaNThdIgGDOX6wowdz8+fPdrqxa0vryyy9bnz59bMiQIbb33ntbhw4drFWrVq5X2rF10aJFNm3aNHv11Vdt+fLlNm7cODviiCNs9OjR23dv9Q+Bs7EECOZiydIuAmkJEMylVW9GiwACCCCAQNEECOaKVjH6WzQBgjl/xaIEcxs3bjTNhrv77rvdc+MUzr311lsukGvWrNn25axbtmyxzZs3mz7fo0cP90y60047zc2u08YPWvrKq/EECOYaz54rI1AmAYK5MlWTsSCAAAIIIFA+AYK58tWUEdWWAMGcvx5Rgjk9M27r1q2m58XNnDnT/fnGG2/YsmXLXECnME4vzZzT0tauXbtav379bNCgQW4nVz2brmnTpv6ecza6AMFcdGIugEASAgRzSZSZQSKAAAIIIFBYAYK5wpaOjhdEgGDOX6gowVz2kpopt2TJEve8ublz59qbb77pZsjpM+3bt3eh3IABA2yPPfawLl26ZL/K+0YWIJhr5AJweQRKIkAwV5JCMgwEEEAAAQRKKkAwV9LCMqyaESCY85ciejCnmXNaqrphwwb3o9lyOqaXNoZo0aKF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4Z+2r1y50gRvuv22oKDABHcayumqOA39VqxYIX//+9/Nb73f3Fe+8hWz4k9DP5cPgjmXmvSFQLwCBHPx1p6ZI4AAAgggEIIAwVwIVWKMIQsQzNmrl/pgTqevBy7oI7OiTMOyBx98UN58802zYq12MKcr4nS766233mpWto0fP15OO+00s+LNdPR//9Bw79lnnzX96P3irrnmGhOkbdiwQTRUe+SRR8wKty996Utmy6qujtOHblXVLba/+tWvRLeqnnTSSXLqqaea39o+b948c5Ktvk9XxV199dVm26uGdPrQ0C/Tv94DT/s//vjjpfZWWvPmevyDYK4eeHwUAQSOCBDMHaHgCQIIIIAAAgjkoQDBXB4WhSGlSoBgzl7OegdzGnrpPdcy4VfycrpCTQ8v+OEPf2gCpssuu8ysCssEVMn3Jp9rAOV69Vey/7qCOQ3N9B5yt912m+i20U984hPmkAbdzpp86PZY3eqqAZ3eJ04DPl1Rp6vgdEWbhm76529961tm/plgMNPHb3/7W7PVVVft6Yq7888/3zg+99xzxkyvp4dD6Eo9fU/mofef03vM3X777bJ8+XITCOqKvGz3yct85v38Jph7P2p8BgEEagsQzNUW4c8IIIAAAgggkE8CBHP5VA3GkkYBgjl7VesdzOmqLg2x9Hfth64609NENUDq3r276CEJek+3li1b1n7rO/5cUlIi7dq1M6vP3tHg6A91BXN6jze9L93vfvc7c6+3z33uczJ8+HDp1KnTO0agW0p1K+sf//hHczrrv/7rv5oVeLpVVlfkrVmzxsxDA7sePXq847P6hwceeMAEc7ot9uyzz5ZLL73UbFV96qmn5IYbbjAr6M444wxzyENyNZyu6NPQ88c//rHMnTtXPvzhD4uu6tNVcy4fBHMuNekLgXgFCObirT0zRwABBBBAIAQBgrkQqsQYQxYgmLNXr97BnIZyup1z69atR11JAyRd2aUrwHSVnB5g0LZtW3NC6VFvTrzQp08fc9CCnprq41FXMKcntupJqnr4gm5Lvf766+XEE088aquoBm8vvfSS/OY3v5GRI0fKJz/5SdGTVzWYu+eee2THjh1mC6oe7tCtW7ejpvLoo4+aYE6vce6558qVV15pAjc92OF73/uenHnmmaJbZHU1XDLMzKxSvOmmm0QPoNDP6lbYESNGHHWN+ryQDOY0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)\n", + "\n" + ], + "metadata": { + "id": "1WPOHEASMlz4" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellView": "form", + "id": "WtAeHTxP4pJv" + }, + "outputs": [], + "source": [ + "#@title Env Setup + Installs\n", + "!pip install openai cohere seaborn\n", + "import openai\n", + "import cohere\n", + "import seaborn\n", + "import time" + ] + }, + { + "cell_type": "code", + "source": [ + "#@title List of Sample Questions to use for testing\n", + "questions = ['Please create a prompt to create an instagram post',\n", + " \"I'm currently reviewing a project that involves a 1 ha mine site in Queensland, next to a large river fed by a 100 ha catchment area. The model I'm reviewing has a smaller catchment with rain on grid, but I'm unsure how to approach the larger contributing catchment. I need the model to run as quickly as possible and align with Australian government guidelines. Could you provide me with a step-by-step guide on how to review and potentially adjust a 2D model for this scenario, ensuring its accuracy and compliance\",\n", + " \"I'm currently reviewing a project that involves a 1 ha mine site in Queensland, next to a large river fed by a 100 ha catchment area. The model I'm reviewing has a smaller catchment with rain on grid, but I'm unsure how to approach the larger contributing catchment. I need the model to run as quickly as possible and align with Australian government guidelines. Could you provide me with a step-by-step guide on how to review and potentially adjust a 2D model for this scenario, ensuring its accuracy and compliance\",\n", + " \"I'm currently reviewing a project that involves a 1 ha mine site in Queensland, next to a large river fed by a 100 ha catchment area. The model I'm reviewing has a smaller catchment with rain on grid, but I'm unsure how to approach the larger contributing catchment. I need the model to run as quickly as possible and align with Australian government guidelines. Could you provide me with a step-by-step guide on how to review and potentially adjust a 2D model for this scenario, ensuring its accuracy and compliance\",\n", + " \"I'll complete the task during the time I've set myself. If you set me a task after this then I'll complete if the following morning as I'll be at my other work during the evening.\",\n", + " \"Even last week I kept myself ready during these hours I've mentioned\",\n", + " \"I've set myself work timings. I start work around 9-10 am pakistan time and end around 3-4 pakistan time. This will cover the hours inshallah. The work you set me will normally be done during this time. If I have to do an airport run or something else I'll let you know the nigth before and I'll complete the work at night inshallah.\",\n", + " 'The No Child Left Behind Act was a grant program enacted in 2002 that directed testing elementary and secondary students in math and reading proficiency. This act required states to create, fund, and implement programs that would help all students become proficient in these areas by 2014. Describe a power Congress could use to address the information outlined in the scenario. answer: One power of Congress that could use to address the information in the scenario would be distributing funds to states in order for them to be able to abide by the act. In the current scenario, the state is in charge of funding the federal act, but Congress could address this by nationally funding the act. would this earn the point on a frq?',\n", + " 'The No Child Left Behind Act was a grant program enacted in 2002 that directed testing elementary and secondary students in math and reading proficiency. This act required states to create, fund, and implement programs that would help all students become proficient in these areas by 2014. Describe a power Congress could use to address the information outlined in the scenario. answer: One power of Congress that could use to address the information in the scenario would be distributing funds to states in order for them to be able to abide by the act. In the current scenario, the state is in charge of funding the federal act, but Congress could address this by nationally funding the act.. would this earn the point on a frq?',\n", + " 'The No Child Left Behind Act was a grant program enacted in 2002 that directed testing elementary and secondary students in math and reading proficiency. This act required states to create, fund, and implement programs that would help all students become proficient in these areas by 2014. Describe a power Congress could use to address the information outlined in the scenario. answer: One power of Congress that could use to address the information in the scenario would be distributing funds to states in order for them to be able to abide by the act. In the current scenario, the state is in charge of funding the federal act, but Congress could address this by nationally funding the act.. would this earn the point on a frq?',\n", + " 'What are the causes of primary adrenal insufficiency ?',\n", + " 'What are the causes of primary adrenal insufficiency ?',\n", + " 'What are the causes of high cholesterol ?',\n", + " \"An 18-year-old boy presents with multiple yellow to white skin nodules for the last 8 months. The nodules are painless but have been gradually increasing in size. His eldest sibling has a history of similar nodules; his father died from a myocardial infarction at 38 years of age. His vitals are within the normal range. Examination demonstrates multiple, well-circumscribed, nontender, and mobile nodules on his buttocks and feet. There is a solitary nodule measuring 2 x 1 cm over the right Achilles tendon. Laboratory investigations show a total cholesterol level of 360 mg/dL and a low-density lipoprotein level of 270 mg/dL. A biopsy of the nodules reveals the accumulation of lipid-laden macrophages. Given the likely diagnosis, what is the underlying pathology of this patient's condition?\\n\\nCorrect answer\\n\\nA. Reduced clearance of apolipoprotein B100\\nB. Increased production of very low-density lipoprotein\\nC. Defective low-density lipoprotein receptors\\nD. Loss of function mutation in the PCSK9 gene\",\n", + " 'Who should I call if i have a problem on my pc in m223?',\n", + " 'who should i contact if i have a problem in my pc?',\n", + " 'who should i contact if i have problem in m223?',\n", + " 'Testosterone as part of HRT for women .. (hormone-pellsts subcutaneous) are there any consensus on them?',\n", + " 'Fair enough',\n", + " \"Write in less than 25 words a joke about your company and how what your company does could help the visiting company's product offering. Start the message with a lowercase letter. Reference previous successful chat conversations for the tone and voice. Mix up the language. Try saying something new to each visitor. Make sure it makes sense. Be as specific as possible. If you don't know the person or the company then write a funny joke based on the person's location. If you don't have the person's location then write a message based on the information of the page the person is on. If you know the person's company mention the person's company in the message. If you don't know the company then don't mention it. Take into account previous chat history and context around the company and the visitor. Do not include any urls in the response. At the very end of the message say '(not a bot btw, real person)'. Speak succinctly as you would to your best friend. Your response to the visitor on the site should be as helpful as possible. If you know the company the person works for or the person's name, include the first name or company name in the message. If the person's name or company is not known, then start the message with 'hey!'. Craft the style of your message as the best sales development representative in the world would write. Do not say the same message twice to the person. Start the response with a lowercase letter.\",\n", + " 'Give me the indications for HRT in women ?',\n", + " '100% I agree',\n", + " 'Testosterone as part of HRT for women hormone pellsts subcutaneous are there any consensus on them?',\n", + " '5.7 Economic Developments and Innovations in the Industrial Age Explain the developments of economic systems, ideologies, and institutions and how they contributed to change. 1. Economic Changes in Global Trade a. Free trade policies and the abandonment of mercantilism due to acceptance of Adam Smith’s theories of laissez-faire capitalism and free markets p382 i. Describe Adam Smith and his theories of laissez-faire capitalism. ii. How did these theories affect industrialization? b. Benefits- proliferation of transnational businesses, increased standard of living for some and increased availability, affordability, and variety of consumer goods. (p527-528) i. What was the mass leisure culture and what were their expectations and interests? ii. How did industrialization produce this culture? 5.8 Reactions to the Industrial Economy from 1750 to 1900 Explain the causes and effects of calls for changes in industrial societies from 1750 to 1900. 1. Calls for Change Ch23 p524-527 a. Political, social, educational, and urban reforms (p524) i. What is the social question? ii. Describe the reforms promoted by the governments and individuals. b. Worker’s movements and political parties (p522) i. What were the labor movements and how did they help the worker? ii. How was this new idea passed onto the countryside peasants? c. Ideologies of Marx. Define each of these and discuss their significance to the time period and to industrialization (p526) i. Socialism- ii. Karl Marx- iii. Communism- 2. Government reform and modernization of economies and militaries a. Ottoman (p593-597) i. Explain each of the reforms that were put in place to try to help the empire survive. ii. Who are the Young Turks and what effect did they have on the end of the Ottoman Empire? b. Qing i. (p605-606) What economic changes occurred under the Qing dynasty? ii. (608-609) Explain the reforms that were attempted and the results of each during the Qing. \\u200b 5.9 Society and the Industrial Age Explain how industrialization caused change in existing social hierarchies and standards of living. 1. Adjustments to Industrial Life (p521) a. Describe the changes in social hierarchy that industrialization created, such as family life, material conditions, class structure, etc. b. As industrialization increased, urbanization increased. What were the challenges and issues of urbanization as it further developed? 2. Cultural Transformations p526-527 a. Social Classes- Discuss how the middle class and industrial working class developed and changed due to industrialization. b. Roles of women were altered by industrialization. Discuss the changes for middle class women and compare them to the changes for working class women. Also, how were children affected during this time? (Also read p524-525 in the excerpt at the top). c. Feminism- Explain what feminist movements are and how they developed and gained momentum during industrialization. IDs- Write the definition and the significance Adam Smith Laissez-faire Karl Marx Socialism Communism Labor unions Tanzimat Reforms Young Turks Emmeline Pankhurst Feminist movements Social question',\n", + " \"THE CIVILISED REACTION OF SWEDISH MUSLIM'S PROTEST TO THE BURNING OF THE QURAN...... MASHA-ALLAH MUST WATCH AND SHARE\"]" + ], + "metadata": { + "cellView": "form", + "id": "l24IbDrl6ebA" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "## Regular OpenAI Calls" + ], + "metadata": { + "id": "JJHvNHdVJZbd" + } + }, + { + "cell_type": "code", + "source": [ + "openai.api_key = '' #@param\n", + "total, processed, errors = 0,0,0\n", + "processed_responses = []\n", + "error_responses = []\n", + "\n", + "def make_open_ai_call(user_question):\n", + " global total, processed, errors\n", + " total+=1\n", + " start_time = time.time()\n", + " try:\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": 'You are an AI assistant for BerriAI, answer all questions respectfully'},\n", + " {\"role\": \"user\", \"content\" : user_question * 50}\n", + " ]\n", + " response = openai.ChatCompletion.create(model='gpt-3.5-turbo', messages = messages) # Regular OpenAI Calls\n", + " if response != None:\n", + " processed+=1\n", + " end_time = time.time()\n", + " elapsed_time = end_time - start_time\n", + " print(f\"completed {processed}\")\n", + " processed_responses.append({'Question': user_question, 'Response': response, 'Response Time': elapsed_time})\n", + " except Exception as e:\n", + " errors+=1\n", + " print(e)\n", + " print(f\"\\n\\nErrors {errors} \\n Completed Requests {processed} \\n Total Requests{total} \\n\\n\")\n", + " error_responses.append({'Question': user_question, 'Error': e})\n", + " return\n", + " return response" + ], + "metadata": { + "id": "sYuhuZHu4v_s" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Make 2500 requests to OpenAI - Get Rate Limited 😊\n", + "\n", + "import concurrent.futures\n", + "with concurrent.futures.ThreadPoolExecutor(max_workers=2000) as executor:\n", + " futures = [executor.submit(make_open_ai_call, question) for question in questions*100]\n", + " concurrent.futures.wait(futures)\n", + "\n" + ], + "metadata": { + "cellView": "form", + "id": "Rkp3-lmq5p7D" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Normal API Calls had a 84.3% Error Rate 😥\n", + "print(f\"Made Total Requests: {total} \\nSuccessfull Requests: {processed}\\nFailed Requests: {errors}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Nj7lgwVbLY4o", + "outputId": "8c3797c7-c348-4f74-f056-299634a6ea6f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Made Total Requests: 2500 \n", + "Successfull Requests: 391\n", + "Failed Requests: 2109\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "#@title Bar Chart of Processed Calls, Errors\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def create_bar_chart(errors, total, processed):\n", + " # Data for the bar chart\n", + " labels = ['Errors', 'Processed']\n", + " values = [errors, processed]\n", + "\n", + " # Create the bar chart\n", + " plt.bar(labels, values)\n", + "\n", + " # Add labels and title\n", + " plt.xlabel('Variables')\n", + " plt.ylabel('Values')\n", + " plt.title('LLM API Calls Bar Chart')\n", + "\n", + " # Show the chart\n", + " plt.show()\n", + "\n", + "# Create and display the bar chart\n", + "create_bar_chart(errors, total, processed)\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 480 + }, + "cellView": "form", + "id": "9_yHFdGE7LT4", + "outputId": "b7bc91a8-77d5-42e4-8605-7ad5924f0c35" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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+fJlR5vZbFbNmjWd+j322GO6evWq1qxZoxUrVsjT01N9+/bVxIkTWUyOu1qNGjX03nvvyWQyqU6dOmrQoIHThzN++ZrLysqS3W4v8Br19PSUm5ub47Waf+mvKD///LMk6fnnny90+9mzZyVJf/rTn+Ti4qJ//etfWrhwoby9vfX000/r+eefl8lkuu32n3/+WUePHtWDDz5Y4BjVqlWTJP3444+SJG9vb6ftvzx3lA/CE/ALhc06FdZeu3ZtSdLFixdVv359R/tPP/3ktL2oMV1cXDR48GANHjxY58+f17p16/T666+rTp06Rf7yBu4Gt/tHzi9fT56enjKZTLp06ZJTe1ZWlnJycuTl5SXp5mvyu+++K3Lc/NfstGnTFBQUVGB7fvByc3PTmDFjNGbMGJ08eVJr167VggUL1KhRI/Xt2/e22728vOTv76+///3vRdZSr149SSpwTvm/X1C+uGwHlFBgYKBcXV21ceNGp/YNGzaobt268vHxKfZY9evX13PPPSd/f3+lpqaWcqVA1VazZk21bNmy0NeiJD300EOSpIcffljff/+9vv7660LH8fPz03333adTp04pMDCwwM+t/0jK17RpU40fP161a9cu9LVb2PaHH35Yp06d0r333lvocSTpvvvuU7169bRlyxan8TZt2mTw2UFZYOYJd5W8vDwdPHiwQHvdunXVuHFjQ2N5e3vrmWeeUXx8vNzc3BQcHKxdu3YpMTFRL730kmP6vSjTpk2TxWJRcHCwLBaL9u/fr2+//VYDBgwwVAcAafTo0Xr++ec1ceJE9e7dW2lpaZozZ466d+/u+PRanz599P7772v48OEaPXq0HnjgAZ0/f15ffvml/va3v8lkMmny5MmaOHGisrOz1blzZ5nNZv3www/atWuXxo0bJ19fX40aNUoPPvigAgICZDabtWPHDmVkZKhDhw6SdNvtffv21YcffqhBgwbpueeek4+Pj7KysnT06FHHJ3OrVaum4cOH6+9//7vq1q2rsLAw7d27lzuLVxCEJ9xVrl27pv79+xdof+KJJ351Cr0o/+///T95enrq448/1uLFi9WwYUPNmDFDf/zjH2+7b0hIiNasWaOPPvpIVqtVjRs31osvvqh+/foZrgO423Xp0kXz5s3Tm2++qVGjRql27dp68sknNWHCBEcfNzc3rVixQnPmzNGSJUt0+fJl3XffferVq5ejT8+ePWWxWLR48WIlJCRIkho2bKiOHTs61hu1adNGGzZs0PLly3Xjxg35+vpq9uzZevjhh4u13c3NTStXrtSCBQu0ePFi/fjjj6pdu7YCAgL01FNPOWoZOHCgMjMz9f777+uDDz5QaGioXn75ZQ0dOrTMn0/8OpPdbreXdxEAAACVBWueAAAADCA8AQAAGEB4AgAAMIDwBAAAYADhCQAAwADCEwAAgAGEJwAAAAMITwAAAAYQngDc9b744gv5+/uX6KsvJk+erJCQkGL19ff314IFCwwfA0DFQngCUCGNHDlSrVu31pUrV4rsM2HCBLVq1Uo///zzb1gZgLsd4QlAhdS7d29du3ZNW7duLXS71WrV9u3bFR4erjp16tzRsdq2batDhw6pbdu2dzQOgLsD4QlAhRQZGamaNWs6vpz1l7Zt26bs7Gz17t27xMe4fv268vLy5OLiInd3d7m48CsRwO3xmwJAhVSjRg1169ZNn3/+uS5evFhge2JiomrWrKmHHnpIr776qmJiYhQSEqI2bdpo6NCh+vbbb536569rWrdunebMmaOOHTs6LgsWtubpyy+/VFxcnDp37qxWrVqpU6dOeuWVV3Tt2rVC6z116pRiY2MVHBys8PBwLVy4UMX53vXz58/rxRdf1MMPP6xWrVqpV69e+vjjjwv0W7VqlXr16qXWrVurbdu2euyxx4oMlgDKVvXyLgAAihITE6N//etf2rBhg5555hlH++XLl7Vnzx716tVLFy5c0NatW9WjRw81atRIP/30k1avXq1nnnlG69atU/369Z3GXLRokVxdXRUbG6ucnBy5uroWeuyNGzfq2rVrGjBggGrXrq1Dhw7pvffe07lz5zR//nynvjdu3NDQoUPVunVr/fnPf9bu3bu1YMEC3bhxQy+88EKR5/fTTz/pySeflMlk0tNPPy1vb28lJSXpL3/5i65cuaJnn31WkrRmzRq9/PLL6t69uwYNGqTr16/ru+++09dff62YmJgSPrsASorwBKDC6tChg+rVq6fExESn8LRx40bZbDbFxMTI399fmzZtcrrk1qdPH/Xs2VMff/yxnn/+eacxr1+/rrVr16pGjRq/euyJEyc69enfv7+aNm2qN954Qz/88IPuv/9+pzE7duyoqVOnSpKeeuopjRw5UsuWLdPAgQPl7e1d6DHmzJmjGzduKCEhwbFua8CAARo/frwWLlyoP/7xj6pRo4Z27typBx54oEBoA1A+uGwHoMKqVq2aevXqpQMHDuj06dOO9sTERN1zzz0KDQ2Vm5ubIzjduHFDP//8szw8POTr66ujR48WGLNv3763DU6SnPpkZ2fr0qVLCgkJkd1uL3Tcp59+2vH3/Jkkm82m5OTkQse32+3avHmzIiMjZbfbdenSJcdPeHi4srKy9M0330iSLBaLzp07p0OHDt22bgBlj5knABVaTEyMVqxYocTERI0cOVLnzp3Tl19+qYEDB6patWrKy8vTypUr9f777+v06dO6ceOGY9/atWsXGK9Ro0bFOu4PP/yg+fPna/v27crIyHDa9svbJ7i4uKhx48ZObb6+vpKkM2fOFDr+pUuXlJmZqdWrV2v16tVF9pGkYcOG6bPPPlO/fv3UtGlThYWFKTo6Wg899FCxzgVA6SI8AajQWrVqJT8/P61bt04jR45UYmKi7Ha7Y63P4sWLNW/ePD3++ON64YUX5OXlJRcXF73yyiuFLtguzqzTjRs3NGTIEGVkZGjo0KHy8/OTh4eHzp8/r8mTJysvL++Ozyt/jN69e+sPf/hDoX38/f0lSc2aNdPGjRu1c+dO7d69W5s3b9b777+v559/XnFxcXdcCwBjCE8AKryYmBjNmzdP3377rRITE+Xj46OgoCBJ0qZNm9S+fXu98sorTvtkZmaW+P5Px44dU3p6ul599VX17dvX0b53795C++fl5enUqVOO2SZJSktLkyQ1bNiw0H28vb1Vs2ZN5eXl6eGHH75tTR4eHoqKilJUVJRycnI0ZswYLV68WCNGjJC7u7uBswNwp1jzBKDCy59lmj9/vlJSUpw+YVatWrUCM0wbNmzQ+fPnS3y8/DVUt45rt9u1cuXKIvf55z//6dT3n//8p1xdXRUaGlpo/2rVqql79+7atGmTjh07VmB7/iU7SQXuoO7m5qZmzZrJbrfLZrMV76QAlBpmngBUeI0bN1ZISIi2bdsmSU7hqXPnznrzzTf14osvKiQkRMeOHVNCQkKBNUhG+Pn5qUmTJnr11Vd1/vx51apVS5s2bVJmZmah/d3d3bV7925NmjRJQUFB2r17t3bu3KmRI0cW+Uk76ebXy3zxxRd68skn1a9fPzVv3lwZGRn65ptvlJycrH379kmSYmNjdc8996hNmzaqW7euUlNT9d5776lTp06qVatWic8TQMkQngBUCjExMTpw4ICCgoLUtGlTR/vIkSNltVqVkJCg9evXKyAgQEuWLNHrr79e4mO5urpq8eLFevnll7VkyRK5u7ura9euevrpp9WnT58C/atVq6a3335b06dP12uvvaaaNWtq9OjRBW6T8Ev33HOPPvroI7355pvasmWLPvjgA9WuXVvNmzfXxIkTHf369++vhIQELV++XNnZ2brvvvs0cOBAjRo1qsTnCKDkTPbi3AIXAAAAkljzBAAAYAjhCQAAwADCEwAAgAGEJwAAAAMITwAAAAYQngAAAAwgPAEAABhAeAIAADCA8AQAAGAA4QkAAMAAwhMAAIABhCcAAAAD/j8rTAx7vCYzNwAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Load Balancer Implementation - to use Azure, OpenAI, Cohere\n", + "This load balancer does the following:\n", + "\n", + "* Maintains a priority list of LLM models (earlier models in fallback_strategy get tried first)\n", + "* Tries to make API calls with all models in fallback_strategy (across providers Azure, OpenAI, Cohere)\n", + "* Sets Cooldowns for 60s for rate limited models - if a model has been throwing errors this script sets a 60s cooldown for the selected model\n", + "\n" + ], + "metadata": { + "id": "uxmXQtXtL00U" + } + }, + { + "cell_type": "code", + "source": [ + "def load_balancer(user_question):\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": 'You are an AI assistant for BerriAI, answer all questions respectfully'},\n", + " {\"role\": \"user\", \"content\" : user_question * 50}\n", + " ]\n", + " response = None\n", + " rate_limited_models = set()\n", + " model_expiration_times = {}\n", + " fallback_strategy=['chatgpt-test', 'gpt-3.5-turbo', 'chatgpt-v-2', 'command-nightly']\n", + " start_time = time.time()\n", + " while response == None and time.time() - start_time < 45:\n", + " for model in fallback_strategy:\n", + " # loop thru all models\n", + " try:\n", + " if model in rate_limited_models: # check if model is currently cooling down\n", + " if model_expiration_times.get(model) and time.time() >= model_expiration_times[model]:\n", + " rate_limited_models.remove(model) # check if it's been 60s of cool down and remove model\n", + " else:\n", + " continue # skip model\n", + " if model == 'chatgpt-v-2' or model == 'chatgpt-test':\n", + " # azure configs\n", + " openai.api_type = \"azure\"\n", + " openai.api_base = \"your azure base\" #@param\n", + " openai.api_version = \"your azure version\" #@param\n", + " openai.api_key = \"\" #@param\n", + " response = openai.ChatCompletion.create(\n", + " engine=model,\n", + " messages = messages\n", + " )\n", + " elif model == 'command-nightly':\n", + " cohere_key = \"\"#@param\n", + " co = cohere.Client(cohere_key)\n", + " prompt = \" \".join([message[\"content\"] for message in messages])\n", + " response = co.generate(\n", + " model=model,\n", + " prompt = prompt,\n", + " max_tokens=200\n", + " )\n", + " response = response.generations[0].text\n", + " else:\n", + " # regular configs\n", + " openai.api_type = \"openai\"\n", + " openai.api_base = \"https://api.openai.com/v1\"\n", + " openai.api_version = None\n", + " openai.api_key = \"\"#@param\n", + " if model == 'text-davinci-003':\n", + " prompt = \" \".join([message[\"content\"] for message in messages])\n", + " response = openai.Completion.create(\n", + " model=model,\n", + " prompt = prompt\n", + " )\n", + " else:\n", + " response = openai.ChatCompletion.create(\n", + " model=model,\n", + " messages = messages\n", + " )\n", + " if response != None:\n", + " return response\n", + "\n", + " except Exception as e:\n", + " print(f\"got exception {e}\")\n", + " rate_limited_models.add(model)\n", + " model_expiration_times[model] = time.time() + 60 # cool down this selected model\n", + " print(f\"rate_limited_models {rate_limited_models}\")\n", + " pass\n", + "\n", + " return response" + ], + "metadata": { + "id": "JOzQNUB47MN_" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Test Load balancer with an API call\n", + "response = load_balancer(\"who are u\")\n", + "print(response)" + ], + "metadata": { + "id": "3E6INzM3EvFc" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "#@title Make 2500 requests to Azure, OpenAI, Cohere - 10x Througput 🍇\n", + "import concurrent.futures\n", + "\n", + "total_2, processed_2, errors_2 = 0,0,0\n", + "processed_responses_2 = []\n", + "error_responses_2 = []\n", + "\n", + "def make_LLM_request(user_question):\n", + " global total_2, processed_2, errors_2\n", + " total_2+=1\n", + " start_time = time.time()\n", + " try:\n", + " response = load_balancer(user_question)\n", + " if response != None:\n", + " processed_2 +=1\n", + " end_time = time.time()\n", + " elapsed_time = end_time - start_time\n", + " print(f\"completed {processed_2}\")\n", + " processed_responses_2.append({'Question': user_question, 'Response': response, 'Response Time': elapsed_time})\n", + " else:\n", + " errors_2+=1\n", + " print(f\"\\n\\nErrors {errors_2} \\n Completed Requests {processed_2} \\n Total Requests{total_2} \\n\\n\")\n", + " error_responses_2.append({'Question': user_question, 'Error': 'Load Balancer Failed'})\n", + "\n", + " except Exception as e:\n", + " errors_2+=1\n", + " print(e)\n", + " print(f\"\\n\\nErrors {errors_2} \\n Completed Requests {processed_2} \\n Total Requests{total_2} \\n\\n\")\n", + " error_responses_2.append({'Question': user_question, 'Error': e})\n", + " return\n", + " return response\n", + "\n", + "\n", + "with concurrent.futures.ThreadPoolExecutor(max_workers=2000) as executor:\n", + " futures = [executor.submit(make_LLM_request, question) for question in questions*100]\n", + " concurrent.futures.wait(futures)\n", + "\n" + ], + "metadata": { + "cellView": "form", + "id": "3N0qtrwuDaF5" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(f\"Made Total Requests: {total_2} \\nSuccessfull Requests: {processed_2}\\nFailed Requests: {errors_2}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HkjHj9r7tzLH", + "outputId": "d998e96a-8c5a-4d48-95e7-6f711b30312d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Made Total Requests: 2500 \n", + "Successfull Requests: 2162\n", + "Failed Requests: 338\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "#@title Bar Chart of Processed Calls, Errors with Load Balancer: 6x Improvement 😲\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "def create_bar_chart(errors, processed, errors_2, processed_2):\n", + " # Data for the bar chart\n", + " labels = ['Errors', 'Successfull Requests']\n", + " values_1 = [errors, processed]\n", + " values_2 = [errors_2, processed_2]\n", + "\n", + " # Combine the data into a single DataFrame\n", + " data = {\n", + " 'Variables': labels * 2,\n", + " 'Values': values_1 + values_2,\n", + " 'Load Balancer': ['Without Load Balancer'] * len(labels) + ['With Load Balancer'] * len(labels)\n", + " }\n", + "\n", + " # Create a bar plot using seaborn\n", + " plt.figure(figsize=(8, 6))\n", + " sns.barplot(x='Variables', y='Values', hue='Load Balancer', data=data, palette={'With Load Balancer': '#1581ed', 'Without Load Balancer': '#eb4034'})\n", + "\n", + " # Add title and labels\n", + " plt.ylabel('# Errors, Handled API calls')\n", + " plt.title('LLM API Calls Bar Chart')\n", + "\n", + " # Show the chart\n", + " plt.tight_layout()\n", + " plt.legend()\n", + " plt.show()\n", + "\n", + "# Example usage:\n", + "create_bar_chart(errors, processed, errors_2, processed_2)\n", + "\n", + "\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "\n", + "df_1 = pd.DataFrame(processed_responses_2)\n", + "\n", + "\n", + "# Define the time categories\n", + "categories = ['0-2s', '2-10s', '10-30s', '30-45s', '45-60s', 'more than 60s']\n", + "\n", + "# Bucket the response times into categories\n", + "df_1['Category'] = pd.cut(df_1['Response Time'], bins=[0, 2, 10, 30, 45, 60, float('inf')], labels=categories)\n", + "\n", + "# Count the occurrences of each category\n", + "category_counts = df_1['Category'].value_counts().sort_index()\n", + "\n", + "# Plotting the bar chart\n", + "plt.bar(category_counts.index, category_counts)\n", + "\n", + "# Adding labels and title\n", + "plt.xlabel('Response Time Category')\n", + "plt.ylabel('Count')\n", + "plt.title('Response Time Breakdown')\n", + "\n", + "# Displaying the chart\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "cellView": "form", + "id": "SWlvmvsrDx28", + "outputId": "8b987e0e-c54a-48da-9951-1d1b1e8d5043" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxAAAAJICAYAAADxUwLTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABoJUlEQVR4nO3deVxU9f7H8feggKgMuO8LYKEoCpoiiqjkvmS7Wm7lVrmk5S31qmnd0kyzEMskci3XTMW9rDTL7Fdg2tXSBM0NdxAFlGV+f/hgriNahxGdQV/Px4PHw3PO93zPZ47KzHu+53uOyWKxWAQAAAAABrg4ugAAAAAAhQcBAgAAAIBhBAgAAAAAhhEgAAAAABhGgAAAAABgGAECAAAAgGEECAAAAACGESAAAAAAGEaAAAAAAGAYAQIA4NT8/f01c+ZM6/LKlSvl7++vo0ePOrAqx+ndu7e6dOni6DIA3MMIEACQT7kfYPfs2XPTNkePHpW/v79iYmL+tq+IiAj5+/urX79+N9y+bNky+fv7/+Pxrrd161b5+/srLCxMOTk5f3vs3J/Q0FA99dRT+vLLL23a5fcD686dOzV06FA1b95c9erVU2hoqJ577jlt3rzZcB93Su/evW3OQb169RQREaHx48frxIkTd7SWixcvKioqSg899JCCg4NVv359denSRe+8845Onjx5R2vJdfLkSc2cOVP79u1zyPEBOKeiji4AAO517u7u2rlzp06fPq1y5crZbIuNjZW7u7suX76crz7XrFmjKlWq6NixY/rxxx/VrFmzG7arU6eOnnnmGUnSqVOntHTpUg0dOlQTJ05Uz5498/1aIiMjNWvWLNWsWVPdu3dX5cqVlZycrK1bt2rYsGGaNm2aunbtmu9+b6eKFSvqpZdekiRlZmbq4MGDWrJkibZv367169fLw8Pjttdw5MgR9evXTydOnFCHDh3UvXt3ubq66o8//tCKFSv01VdfadOmTbe9juudOnVKUVFRqlKliurUqXPHjw/AOREgAMDBGjZsqD179mj9+vXq27evdX1SUpJ+/vlntW3bNl8fHtPS0vT111/rpZde0sqVKxUbG3vTAFGhQgV169bNuvzwww+rXbt2mjdvXr4DxMaNGzVr1iy1b99e06dPl6urq3XbgAED9N133ykrKytffd4Jnp6eNudAkqpWrarXX39dcXFx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8vLyUlxcnCpVqiQfHx/5+/srLi5OAQEB1ktm+vbte8N+XnjhBZ07d04JCQmaNm2aJFm/KZek06dP6z//+Y8GDRokT09PTZ8+XUOHDtWXX34pV1dXSdKoUaP03XffacSIEfL19dXq1as1bNgwzZo1Sw8++KDh17R06VJ1795dvXv3tl7nX6tWLXtPkaZOnaoFCxbo+eefV3BwsL799lu99tprysrKUq9evSRd/QDu4+Ojrl27qkSJEtq3b59mzpyptLQ0DR061OY8nTx5UhMnTpSnp6eio6N14sQJFS1q7O0zJydHWVlZ1r+P5cuXq3379jZtkpKS1KtXL1WuXFkXL17UkiVL1KNHD23atEne3t437Pf8+fPy9vbWmDFjZDabdejQIc2cOVOnT5/W5MmTbdp++umnatSokaZMmaJDhw5p6tSpKlOmjEaNGmXtq3v37pKkkSNHqmrVqjp8+LD++usvax9z587VO++8o759+2r06NE6ePCgNUDk9pPr5ZdfVvfu3TV48GDrMx8A3F0IEABQiDRq1EgWi0W7du1Sy5YtFR8fr+DgYElXw0V8fLx69eqlvXv36vLly9b5D9erXr26SpcurePHjysoKCjP9pSUFC1atEj33XefpKsP/+rTp49+/fVXPfDAA/r999+1efNmTZo0ST169JAkhYeH69ixY/kOELnHr1Sp0g1ryY9z585p0aJF6t+/v4YNGyZJCgsL0/nz5zVr1iz17NlTRYoUUWhoqEJDQyXJOk8kIyNDixYtsgaIbdu26bffftO8efOsbUNCQtSyZcubfrC/XvPmzW2WmzRpojFjxtisGzt2rPXP2dnZat68uUJDQ7Vp0ybrB/vr+fv769VXX7UuN2zYUB4eHho9erQmTJhg88G9XLlymj59uqSrf0d79+7Vpk2brB/8582bp7Nnz2rDhg2qWrWqJFlfryRdvHhRkZGRGjBggF566SXr63J1ddWUKVPUv39/lSpVytq+R48eGjRokKHzA6Bw4hImAChE6tatq2LFilkvY4qLi7MGiKCgIJv1JpPJui2/ypcvbw0P0v9GBE6ePClJ+uWXXyRJHTp0sNmvY8eO2rt3b55LZO6U3bt3KzMz84Z1nTt3znoHq8uXLysyMlJt27ZVYGCg6tatqxkzZuj06dO6dOmStS9PT0+bD9Oenp5q1qyZ4XrmzZunFStW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eecdNW/eXKGhoZKkiIgIvf7664qOjlbr1q1Vv359JScnKycnRx988IEiIiJUr149dejQQUuWLLHpM3fofffu3erevbsCAwP16aefSpLmzJmjtm3bKjAwUE2bNlW/fv105MiRO/66Adw+Fy5cuOm379d+sPb391dMTIzN9nnz5snf3z9Pf2+88YbCw8NVr149RUREaPr06TZtvv32W/Xo0UMNGjRQ48aN1bt3b+3du9emj4kTJyosLEz16tXTo48+qu3bt9v08csvv+jpp59Wo0aNFBwcrK5du+qLL74wtL1379564403JEl16tSRv7+/du7cedNLkR544AHNnDnzpufQXi4uLvL399eJEyds1iclJWnUqFEKCQlR/fr19fTTT+u3336zaZOZmak333xTTZo0UaNGjTR27FitXr1a/v7+Onr0qKT/XTa1Z88em31feOEF9e7d22bdwYMH9fzzz6tRo0YKCgrSoEGD9Ndff9m0WbFihTp37qz69esrJCREPXv21O7duyXJ+u9g6tSp1su0du7c+Y/7wfkwAgEUQllZWXnWFS36v//OCxYsUIMGDfTmm2/atN28ebNq1Kihf//733JxcVHx4sU1depULViwQM8//7yCg4P17bff6rXXXlNWVpZ69epl3TczM1Mvv/yy+vXrp5EjR8rb21urVq3S+++/r+HDhysoKEipqan65ZdfdOnSpdt7AgDcUXXr1tWSJUtUtWpVtWrVSuXKlbO7rytXrqhv3746duyYhgwZovvvv19JSUn65ZdfrG3Wr1+vl156SQ8++KCmT58uV1dXxcXF6eTJkwoICNCVK1f0zDPP6OzZsxoxYoQqVKigNWvWaPDgwVq5cqX8/f118eJFDR48WI0aNdK7774rNzc3/fnnn7pw4YIk/eP21157TcuWLdP8+fO1dOlSSVKtWrX0008/3cKZtM/x48dVtWpV63JKSoqeeuopFS9eXOPHj5enp6cWLlyovn37avPmzdZLyt59910tXrxYw4YNU0BAgNatW5cnqBl15MgR9ejRQ/fdd5+mTJkik8mk2bNnq1+/ftq4caPc3Nz0f//3f/r3v/+tZ599Vi1btlRGRoZ2796t1NRUSdLSpUvVvXt39e7dW126dJF09Zz+035wPgQIoJBJS0tT3bp186z/9NNP9cADD0iSvLy8FBUVJZPJZNMmMzNT0dHRKl68uCTp3LlzWrRokfr3769hw4ZJksLCwnT+/HnNmjVLPXv2VJEiRaz7jhw5Up06dbL2t2zZMvn7+9tMFGzTpk3BvmAADvfaa69p6NChGjdunCSpatWqat26tfr162fzwdaIVatWae/evVqyZInNN/mPPPKIJMlisejtt99W8+bNNWvWLOv2li1bWv8cGxur33//XatXr1atWrUkSS1atNDhw4f1wQcf6P3331diYqJSU1P10ksvWb/5zh2RlfSP22vVqqXKlStLUr4uGy0IOTk5ysrKUmpqqlauXKndu3fr3XfftW6fP3++Lly4oOXLl1vDQmhoqNq3b6+YmBi98sorSk5O1meffaaBAwdaf0e3aNFCvXr10smTJ/NdU1RUlLy8vDR37ly5u7tLkho2bKgHH3xQy5cv19NPP63du3fL29tbr776qnW/Vq1aWf+cex4rVapkc07/aT84Hy5hAgqZYsWKacWKFXl+6tSpY20THh6eJzxIUkhIiDU8SFd/aWdmZqpDhw427Tp27Khz587p0KFDNuuvfQOXpICAAO3du1eTJ0/Wzz//rMzMzAJ4hQCczf3336+1a9dqzpw56tOnj/Ub74ceekj79u3LV187duyQn5/fTe9IlJCQoKSkJD322GM37eP777/X/fffr5o1ayorK8v606xZM+ulONWrV1fJkiU1ceJErV+/XufOnbPp45+2O9KTTz6punXrqmnTppo6daoGDhxo8+XN999/r5CQEHl5eVlfu4uLixo3bmx9/fv371dGRobatm1r03e7du3squn7779XRESEihQpYj2m2WxWQECA9dKpgIAAJScna/To0fr++++Vnp5uqG9794PjMAIBFDIuLi7WyXU3c7M7oly/PiUlRZJUtmxZm/W5y8nJydZ1Hh4eKlGihE27Rx99VJcuXdKyZcs0b948eXp66uGHH9aoUaOYYA3cZdzc3NSyZUvrFwnfffedBg8erFmzZikqKspwP8nJyX97N6Pc3zt/1+b8+fPau3fvDUdjc0dNc78tj4yM1CuvvKLs7Gw98MADGjdunPz9/f9xuyO9/fbb8vPz07lz5/TRRx8pOjpajRs3Vnh4uKSrr3/Xrl03fP3Vq1eXJJ0+fVpS3t/71/++N+r8+fOaP3/+De8C6OrqKunqKEjuZbH9+/eXu7u72rdvr7Fjx8rb2/umfdu7HxyHAAHchW40+nCj9bm/mM+ePasKFSpY1585c8Zm+836dHFxUd++fdW3b1+dPHnSen1tqVKlNGTIkFt8FQCcWYsWLVS7dm0dPHjQus7NzS3PSGTunIJc3t7e+uOPP27ab+7vnVOnTt20jZeXl/z9/f/xuQz169fXxx9/rIyMDO3cuVNvv/22hgwZoq+++srQ9htxd3fP8xozMzOVlpb2t7Xkh5+fn/WLogceeEAdOnTQ22+/rRYtWshkMsnLy0stWrTQiy++mGdfNzc3SbLOU7nZ7/drX0/ua7jWhQsXbH7ve3l5qWXLlnrqqafyHPPaL5e6deumbt266dy5c9qyZYsmT56sokWL6q233vrb12zvfnAMLmEC7mGBgYFydXXVxo0bbdZv2LBBZcqUUc2aNQ33VaFCBT377LPy9/e33voQwN3h+g+d0tVbOZ84ccLmG+2KFSvaBArp6rMUrtWsWTMdPHhQv/766w2P5evrq4oVK2rlypU3radZs2Y6cuSIypcvr8DAwDw/1ytWrJhatmypnj176ujRo7p8+XK+tl+rQoUKyszMtLn70I8//njbHvRWokQJDR8+XH/++ac12OSew9ygce1P7ujJ/fffr2LFiunLL7+06W/z5s02yxUrVpQkm7+3c+fO6b///a9Nu9DQUB04cEABAQF5junr65un7tKlS+uJJ55Q8+bNbd4TXF1d//b83mw/OBdGIIBCJicnR7t27cqzvkyZMqpWrVq++ipdurR69eqlmJgYubm5KSgoSFu3btXatWs1fvx466UANzNhwgSZzWYFBQXJbDYrLi5Ov//+u3r27JmvOgA4t65du6p169YKCwtT+fLldfLkSS1atEjnz59X3759re3at2+v+fPnKzAwUD4+PlqzZk2eCbvdunXTZ599pkGDBmno0KG67777dPLkSf3888964403ZDKZ9Oqrr+qll17SsGHD1K1bN7m5uWnXrl0KDAxU69at9fDDD2vJkiXq06ePnn32WdWsWVOpqanau3ev9Y5x3377rVasWKE2bdqocuXKOnPmjBYtWqSGDRvK3d39H7ffTHh4uIoXL65x48Zp4MCBSkpK0oIFC/52n1v18MMPa/bs2YqOjlbbtm3Vr18/xcbGqlevXurTp48qV66sc+fO6ddff1WFChXUr18/eXt7q0ePHoqOjlaxYsWsd2G6/rarFStWVIMGDTRr1ix5enqqaNGiio6Olqenp0274cOH6/HHH1f//v315JNPqmzZsjpz5ox++uknPfDAA+rSpYsiIyOVnJysJk2aqEyZMtq/f7++++479evXz9qPr6+vtmzZogceeEAeHh7y8fHRJ5988o/7wbkQIIBCJiMjQ927d8+z/vHHH//H4fwbeeWVV+Tp6akVK1Zo9uzZqlKliiZNmqQePXr8477BwcFatmyZli9frvT0dFWrVk1jxozRE088ke86ADivoUOH6ptvvtGUKVN07tw5lSpVSv7+/po3b56aNm1qbffCCy/o7NmzmjVrlkwmk7p3764+ffpoypQp1jZubm6aN2+eZsyYoY8++kjJycmqWLGiOnfubG3TqVMnFStWTLNnz9ZLL70kd3d3BQQEWCcEu7m5acGCBZo5c6Zmz56t06dPy9vbWwEBAdZLbKpXry4XFxe99957Onv2rLy9vRUWFqaXXnrJ0PabKVWqlCIjI62XO9WpU0dTp07N88yEguTq6qrnnntO48aN086dOxUSEqKlS5fqvffe07Rp05ScnKwyZcqoQYMGNpOmX375ZWVnZ+vjjz9WTk6O2rZtq5dfflmvvPKKTf/Tpk3TuHHjNGbMGJUtW1YjRozQunXrbG6jWqNGDS1fvlzvvfeeJk2apLS0NJUrV06NGze2jnoEBgZq/vz52rBhgy5evKiKFSuqf//+ev755639TJgwQW+99ZYGDhyojIwMLViwwNB+cC4mi8VicXQRAAAAuP2++uorDRkyRFu2bMn3LXiBXMyBAAAAAGAYAQIAAACAYVzCBAAAAMAwRiAAAAAAGEaAAAAAAGAYAQIAAACAYQQIAAAAAIYRIAAAAAAYRoAAAAAAYBgBAgAAAIBhBAgAAAAAhhEgAAAAABj2/5F4d/vXet6LAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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no3Ro0fD3Nxc1815LiMjIzRp0kTXzShXKpUKKSkpaNy4sd7N6rzpf3LF2tpa72ai9PVc0yWOmzQcN2kq47hdvXq1zPvoVYhat24dDAwM0KVLF2RmZgJ4MutTWFiIzMxMVKtWDcbGxlAoFLh9+7bW/hkZGTAzMwMAcaaqaEaqSF5eHlQqlVhPCplMBhMTE8n7V2RyubzS9q2y0tc3OJ5r0nDcpOG4SVOZxk3KB269ClFJSUm4fv06PDw8tLa1bt0a06dPR79+/WBjY4PExESt65vJyclQKpUAABMTE7z99tviGqmn6wiCoLVWioiIiOhpFerbeS8SEhKC9evXa/zn5eWFBg0aYP369fDx8QEAeHt7IyMjA4mJieK+ycnJuHDhAry9vcUyb29vHDx4EGq1WiyLjY2FQqGAi4vL6+sYERER6Z0KNROlUqlw+PBhAEBaWhqys7PFBeRubm6wtbXVugnn7t27cefOHY1v0rm4uMDLywuTJ0/GxIkTUbVqVSxcuBB2dnbw9fUV6wUHB2Pv3r0YN24c+vXrh8uXLyMmJgZjx47lPaKIiIioRBUqRN2/fx9jxozRKCt6vH79+jLdcmDRokWYM2cOpk2bhvz8fHh5eWHKlCmoUuX/utyoUSPExMRg7ty5GDZsGMzNzREWFoagoKDy6RARERFVWhUqRFlaWuLSpUtl2mfu3LnFlteoUQOzZ8/G7NmzS9y/ZcuW2LZtW5mek4iIiEiv1kQRERERVRQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkQYUKUdevX8e0adPQo0cP2Nvbo2vXrhrbs7OzERkZiV69esHV1RVt27bFiBEjcOnSJa1jZWVlYfLkyXBzc4OLiwvCwsJw9+5drXonT55Enz594OTk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cOvWLdjY2GjVkclkSEpKgru7u6R2CoKAnJwcSftWVCqVSuP/+kQmk0Eul+u6GTqjUqn0ap2fPp9rusRxk4bjJk1lHDdBELRyw4voVYjKyMgAACgUCo3yosdF2zMzM1GjRg2t/c3MzMRLhFlZWcUey9jYGHK5XDyWFGq1GhcvXpS8f0WWkpKi6yaUmVwuh729va6boTPJycl6+Uanj+daRcBxk4bjJk1lG7eyLuPRqxClL4yMjNCkSRNdN6NcqVQqpKSkoHHjxno3q1PWTxaVjbW1td7NROnruaZLHDdpOG7SVMZxu3r1apn30asQZWZmBuDJLJKFhYVYnpmZqbFdoVDg9u3bWvtnZGSIdYpmqopmpIrk5eVBpVKJ9aSQyWQwMTGRvH9FJpfLK23fKit9fYPjuSYNx00ajps0lWncpHzgrlALy1+kaP1S0bqmIklJSTAyMkLDhg3FesnJyVqfvpOTk8VjmJiY4O2339Y6VtF+z66VIiIiInqaXoWohg0bonHjxoiLi9Moj42NhYeHh3gt09vbGxkZGUhMTBTrJCcn48KFC/D29hbLvL29cfDgQajVao1jKRQKuLi4vOLeEBERkT6rUJfzVCoVDh8+DABIS0tDdna2GJjc3Nxgbm6O0aNHY/z48bCysoK7uztiY2Nx9uxZbNy4UTyOi4sLvLy8MHnyZEycOBFVq1bFwoULYWdnB19fX7FecHAw9u7di3HjxqFfv364fPkyYmJiMHbsWN4jioiIiEpUoULU/fv3MWbMGI2yosfr16+Hu7s7unbtCpVKhejoaKxcuRLW1taIiorSmjlatGgR5syZg2nTpiE/Px9eXl6YMmUKqlT5vy43atQIMTExmDt3LoYNGwZzc3OEhYUhKCjo1XeWiIiI9FqFClGWlpa4dOnSC+v17t0bvXv3LrFOjRo1MHv2bMyePbvEei1btsS2bdvK1E4iIiIivVoTRURERFRRMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQM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Ir2md5fzZsyYgUOHDiEiIgLZ2dkaN9C0t7eHsbExRo8ejfHjx8PKygru7u6IjY3F2bNnsXHjRrGui4sLvLy8MHnyZEycOBFVq1bFwoULYWdnB19fXx30jIiIiPSJ3oWohIQEAMDcuXO1th08eBCWlpbo2rUrVCoVoqOjsXLlSlhbWyMqKgouLi4a9RctWoQ5c+Zg2rRpyM/Ph5eXF6ZMmYIqVfRuWIiIiOg107u08Ouvv5aqXu/evdG7d+8S69SoUQOzZ8/G7Nmzy6NpRERE9AbRuzVRRERERBUBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERScAQRURERCQBQxQRERGRBAxRRERERBIwRBERERFJwBBFREREJAFDFBEREZEEDFFEREREEjBEEREREUnAEEVEREQkAUMUERERkQQMUUREREQSMEQRERERSfDGh6hr165hyJAhcHZ2hqenJ+bNm4e8vDxdN4uIiIgquCq6boAuZWRkIDAwEI0bN0ZkZCTu3LmDuXPn4vHjx5g2bZqum0dEREQV2BsdorZs2YJHjx4hKioKNWvWBAAUFBRgxowZGD58OOrWravbBhIREVVAMpkMcrkcMplM103RqTf6cl58fDw8PDzEAAUAfn5+KCwsREJCgu4aRkRURvyl9mYqLBR08rxyuRz29vaQy+U6eX5d9ftZb/RMVFJSEj766CONMoVCAQsLCyQlJUk6plqthiAIOHv2bHk0UYtMJkMvjxrILzB9JceviKoYGuDcuXMQBOk/NBy3suOYSaPrEHP16lWdPffLjJuuCIIAmUyGK1eu6Py1k0Imk+GRSo2CChIqXgdDAxlM5Ublfr6p1eoynwNvdIjKzMyEQqHQKjczM0NGRoakYxa9AK/yh9GsuvErO3ZF9rJjynErO44ZlYU+jptMJoOBgX5flDGVG+m6CTpR3uebTCZjiNI1FxcXXTeBiIiIXgP9jt8vSaFQICsrS6s8IyMDZmZmOmgRERER6Ys3OkTZ2Nho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\n" + }, + "metadata": {} + } + ] + } + ] +} diff --git a/examples/Using_a_hot_(in_memory)_+_hosted_cache_to_prevent_dropped_customer_requests_in_prod_(LLM_Apps)_.ipynb b/examples/Using_a_hot_(in_memory)_+_hosted_cache_to_prevent_dropped_customer_requests_in_prod_(LLM_Apps)_.ipynb new file mode 100644 index 0000000..1aa04b7 --- /dev/null +++ b/examples/Using_a_hot_(in_memory)_+_hosted_cache_to_prevent_dropped_customer_requests_in_prod_(LLM_Apps)_.ipynb @@ -0,0 +1,173 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# Using a hot (in-memory) + hosted cache to prevent dropped customer requests in prod (LLM Apps)." + ], + "metadata": { + "id": "ICOXlbjlMh9c" + } + }, + { + "cell_type": "markdown", + "source": [ + "# Create a class to manage your Caching logic" + ], + "metadata": { + "id": "3dynjvovLwaA" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "6YM2U0ScLTfo" + }, + "outputs": [], + "source": [ + "from typing import Any\n", + "import threading\n", + "from threading import active_count\n", + "import requests\n", + "import traceback\n", + "from flask import Flask, request\n", + "import json\n", + "from fuzzywuzzy import process\n", + "\n", + "class reliableCache:\n", + " def __init__(self, query_arg=None, customer_instance_arg=None, user_email=None, similarity_threshold=0.65, max_threads=100, verbose=False) -> None:\n", + " self.max_threads = max_threads\n", + " self.verbose = verbose\n", + " self.query_arg = query_arg\n", + " self.customer_instance_arg = customer_instance_arg\n", + " self.user_email = user_email\n", + " self.threshold = similarity_threshold\n", + " self.cache_wrapper_threads = {}\n", + " self.hot_cache = {}\n", + " pass\n", + "\n", + " def print_verbose(self, print_statement):\n", + " if self.verbose:\n", + " print(\"Cached Request: \" + str(print_statement))\n", + "\n", + " def add_cache(self, user_email, instance_id, input_prompt, response):\n", + " try:\n", + " self.print_verbose(f\"result being stored in cache: {response}\")\n", + " url = \"YOUR_HOSTED_CACHE_ENDPOINT/add_cache\"\n", + " querystring = {\n", + " \"customer_id\": \"temp5@xyz.com\",\n", + " \"instance_id\": instance_id,\n", + " \"user_email\": user_email,\n", + " \"input_prompt\": input_prompt,\n", + " \"response\": json.dumps({\"response\": response})\n", + " }\n", + " response = requests.post(url, params=querystring)\n", + " except:\n", + " pass\n", + "\n", + " def try_cache_request(self, user_email, instance_id, query=None):\n", + " try:\n", + " url = \"YOUR_HOSTED_CACHE_ENDPOINT/get_cache\"\n", + " querystring = {\n", + " \"customer_id\": \"temp5@xyz.com\",\n", + " \"instance_id\": instance_id,\n", + " \"user_email\": user_email,\n", + " \"input_prompt\": query,\n", + " \"threshold\": self.threshold\n", + " }\n", + " response = requests.get(url, params=querystring)\n", + " self.print_verbose(f\"response: {response.text}\")\n", + " extracted_result = response.json()[\"response\"]\n", + " print(f\"extracted_result: {extracted_result} \\n\\n original response: {response.json()}\")\n", + " return extracted_result\n", + " except:\n", + " pass\n", + " self.print_verbose(f\"cache miss!\")\n", + " return None\n", + "\n", + " def cache_wrapper(self, func):\n", + " def wrapper(*args, **kwargs):\n", + " query = request.args.get(\"query\") # the customer question\n", + " instance_id = request.args.get(self.customer_instance_arg) # the unique instance to put that customer query/response in\n", + " try:\n", + " if (self.user_email, instance_id) in self.hot_cache:\n", + " choices = self.hot_cache[(self.user_email, instance_id)]\n", + " most_similar_query = process.extractOne(query, choices)\n", + " if most_similar_query[1] > 70:\n", + " result = self.hot_cache[(self.user_email, instance_id, most_similar_query[0])]\n", + " return result\n", + " else:\n", + " result = func(*args, **kwargs)\n", + " # add response to cache\n", + " self.add_cache(self.user_email, instance_id=instance_id, input_prompt=query, response=result)\n", + " except Exception as e:\n", + " cache_result = self.try_cache_request(user_email=self.user_email, instance_id=instance_id, query=query)\n", + " if cache_result:\n", + " print(\"cache hit!\")\n", + " self.hot_cache[(self.user_email, instance_id, query)] = cache_result\n", + " if (self.user_email, instance_id) not in self.hot_cache:\n", + " self.hot_cache[(self.user_email, instance_id)] = []\n", + " self.hot_cache[(self.user_email, instance_id)].append(query)\n", + " return cache_result\n", + " else:\n", + " print(\"Cache miss!\")\n", + " raise e\n", + " self.print_verbose(f\"final result: {result}\")\n", + " return result\n", + " return wrapper\n", + "\n", + " def get_wrapper_thread_utilization(self):\n", + " self.print_verbose(f\"cache wrapper thread values: {self.cache_wrapper_threads.values()}\")\n", + " active_cache_threads = 0\n", + " for value in self.cache_wrapper_threads.values():\n", + " if value == True:\n", + " active_cache_threads += 1\n", + " # active_cache_threads = sum(self.cache_wrapper_threads.values())\n", + " self.print_verbose(f\"active_cache_threads: {active_cache_threads}\")\n", + " return active_cache_threads / self.max_threads" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Wrap your query endpoint with it\n", + "\n", + "In our caching class, we designed our cache to be a decorator (cache_wrapper). This wraps the `berri_query` endpoint, and in case we return errors, this will catch that and return a cached response instead. We also check each request against a local / hot cache, to reduce dropped requests (useful during high-traffic scenarios)." + ], + "metadata": { + "id": "RGg6xwGGL2Ih" + } + }, + { + "cell_type": "code", + "source": [ + "@app.route(\"/berri_query\")\n", + "@cache.cache_wrapper\n", + "def berri_query():\n", + " print('Request receieved: ', request)\n", + " # your execution logic\n", + " pass" + ], + "metadata": { + "id": "YZADDSXPL41g" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 12ec22b..cac5398 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,105 +2,105 @@ [[package]] name = "aiohttp" -version = "3.8.3" +version = "3.8.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.6" files = [ - {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba71c9b4dcbb16212f334126cc3d8beb6af377f6703d9dc2d9fb3874fd667ee9"}, - {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d24b8bb40d5c61ef2d9b6a8f4528c2f17f1c5d2d31fed62ec860f6006142e83e"}, - {file = "aiohttp-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f88df3a83cf9df566f171adba39d5bd52814ac0b94778d2448652fc77f9eb491"}, - {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97decbb3372d4b69e4d4c8117f44632551c692bb1361b356a02b97b69e18a62"}, - {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309aa21c1d54b8ef0723181d430347d7452daaff93e8e2363db8e75c72c2fb2d"}, - {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad5383a67514e8e76906a06741febd9126fc7c7ff0f599d6fcce3e82b80d026f"}, - {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20acae4f268317bb975671e375493dbdbc67cddb5f6c71eebdb85b34444ac46b"}, - {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05a3c31c6d7cd08c149e50dc7aa2568317f5844acd745621983380597f027a18"}, - {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6f76310355e9fae637c3162936e9504b4767d5c52ca268331e2756e54fd4ca5"}, - {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:256deb4b29fe5e47893fa32e1de2d73c3afe7407738bd3c63829874661d4822d"}, - {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5c59fcd80b9049b49acd29bd3598cada4afc8d8d69bd4160cd613246912535d7"}, - {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:059a91e88f2c00fe40aed9031b3606c3f311414f86a90d696dd982e7aec48142"}, - {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2feebbb6074cdbd1ac276dbd737b40e890a1361b3cc30b74ac2f5e24aab41f7b"}, - {file = "aiohttp-3.8.3-cp310-cp310-win32.whl", hash = "sha256:5bf651afd22d5f0c4be16cf39d0482ea494f5c88f03e75e5fef3a85177fecdeb"}, - {file = "aiohttp-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:653acc3880459f82a65e27bd6526e47ddf19e643457d36a2250b85b41a564715"}, - {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86fc24e58ecb32aee09f864cb11bb91bc4c1086615001647dbfc4dc8c32f4008"}, - {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75e14eac916f024305db517e00a9252714fce0abcb10ad327fb6dcdc0d060f1d"}, - {file = "aiohttp-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1fde0f44029e02d02d3993ad55ce93ead9bb9b15c6b7ccd580f90bd7e3de476"}, - {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab94426ddb1ecc6a0b601d832d5d9d421820989b8caa929114811369673235c"}, - {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89d2e02167fa95172c017732ed7725bc8523c598757f08d13c5acca308e1a061"}, - {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02f9a2c72fc95d59b881cf38a4b2be9381b9527f9d328771e90f72ac76f31ad8"}, - {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7149272fb5834fc186328e2c1fa01dda3e1fa940ce18fded6d412e8f2cf76d"}, - {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:512bd5ab136b8dc0ffe3fdf2dfb0c4b4f49c8577f6cae55dca862cd37a4564e2"}, - {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7018ecc5fe97027214556afbc7c502fbd718d0740e87eb1217b17efd05b3d276"}, - {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88c70ed9da9963d5496d38320160e8eb7e5f1886f9290475a881db12f351ab5d"}, - {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:da22885266bbfb3f78218dc40205fed2671909fbd0720aedba39b4515c038091"}, - {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e65bc19919c910127c06759a63747ebe14f386cda573d95bcc62b427ca1afc73"}, - {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:08c78317e950e0762c2983f4dd58dc5e6c9ff75c8a0efeae299d363d439c8e34"}, - {file = "aiohttp-3.8.3-cp311-cp311-win32.whl", hash = "sha256:45d88b016c849d74ebc6f2b6e8bc17cabf26e7e40c0661ddd8fae4c00f015697"}, - {file = "aiohttp-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:96372fc29471646b9b106ee918c8eeb4cca423fcbf9a34daa1b93767a88a2290"}, - {file = "aiohttp-3.8.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c971bf3786b5fad82ce5ad570dc6ee420f5b12527157929e830f51c55dc8af77"}, - {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff25f48fc8e623d95eca0670b8cc1469a83783c924a602e0fbd47363bb54aaca"}, - {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e381581b37db1db7597b62a2e6b8b57c3deec95d93b6d6407c5b61ddc98aca6d"}, - {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db19d60d846283ee275d0416e2a23493f4e6b6028825b51290ac05afc87a6f97"}, - {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25892c92bee6d9449ffac82c2fe257f3a6f297792cdb18ad784737d61e7a9a85"}, - {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398701865e7a9565d49189f6c90868efaca21be65c725fc87fc305906be915da"}, - {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4a4fbc769ea9b6bd97f4ad0b430a6807f92f0e5eb020f1e42ece59f3ecfc4585"}, - {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b29bfd650ed8e148f9c515474a6ef0ba1090b7a8faeee26b74a8ff3b33617502"}, - {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e56b9cafcd6531bab5d9b2e890bb4937f4165109fe98e2b98ef0dcfcb06ee9d"}, - {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ec40170327d4a404b0d91855d41bfe1fe4b699222b2b93e3d833a27330a87a6d"}, - {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2df5f139233060578d8c2c975128fb231a89ca0a462b35d4b5fcf7c501ebdbe1"}, - {file = "aiohttp-3.8.3-cp36-cp36m-win32.whl", hash = "sha256:f973157ffeab5459eefe7b97a804987876dd0a55570b8fa56b4e1954bf11329b"}, - {file = "aiohttp-3.8.3-cp36-cp36m-win_amd64.whl", hash = "sha256:437399385f2abcd634865705bdc180c8314124b98299d54fe1d4c8990f2f9494"}, - {file = "aiohttp-3.8.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09e28f572b21642128ef31f4e8372adb6888846f32fecb288c8b0457597ba61a"}, - {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f3553510abdbec67c043ca85727396ceed1272eef029b050677046d3387be8d"}, - {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e168a7560b7c61342ae0412997b069753f27ac4862ec7867eff74f0fe4ea2ad9"}, - {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db4c979b0b3e0fa7e9e69ecd11b2b3174c6963cebadeecfb7ad24532ffcdd11a"}, - {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e164e0a98e92d06da343d17d4e9c4da4654f4a4588a20d6c73548a29f176abe2"}, - {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a78079d9a39ca9ca99a8b0ac2fdc0c4d25fc80c8a8a82e5c8211509c523363"}, - {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:21b30885a63c3f4ff5b77a5d6caf008b037cb521a5f33eab445dc566f6d092cc"}, - {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4b0f30372cef3fdc262f33d06e7b411cd59058ce9174ef159ad938c4a34a89da"}, - {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8135fa153a20d82ffb64f70a1b5c2738684afa197839b34cc3e3c72fa88d302c"}, - {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ad61a9639792fd790523ba072c0555cd6be5a0baf03a49a5dd8cfcf20d56df48"}, - {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978b046ca728073070e9abc074b6299ebf3501e8dee5e26efacb13cec2b2dea0"}, - {file = "aiohttp-3.8.3-cp37-cp37m-win32.whl", hash = "sha256:0d2c6d8c6872df4a6ec37d2ede71eff62395b9e337b4e18efd2177de883a5033"}, - {file = "aiohttp-3.8.3-cp37-cp37m-win_amd64.whl", hash = "sha256:21d69797eb951f155026651f7e9362877334508d39c2fc37bd04ff55b2007091"}, - {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ca9af5f8f5812d475c5259393f52d712f6d5f0d7fdad9acdb1107dd9e3cb7eb"}, - {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d90043c1882067f1bd26196d5d2db9aa6d268def3293ed5fb317e13c9413ea4"}, - {file = "aiohttp-3.8.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d737fc67b9a970f3234754974531dc9afeea11c70791dcb7db53b0cf81b79784"}, - {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf909ea0a3fc9596e40d55d8000702a85e27fd578ff41a5500f68f20fd32e6c"}, - {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5835f258ca9f7c455493a57ee707b76d2d9634d84d5d7f62e77be984ea80b849"}, - {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da37dcfbf4b7f45d80ee386a5f81122501ec75672f475da34784196690762f4b"}, - {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f44875f2804bc0511a69ce44a9595d5944837a62caecc8490bbdb0e18b1342"}, - {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:527b3b87b24844ea7865284aabfab08eb0faf599b385b03c2aa91fc6edd6e4b6"}, - {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5ba88df9aa5e2f806650fcbeedbe4f6e8736e92fc0e73b0400538fd25a4dd96"}, - {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e7b8813be97cab8cb52b1375f41f8e6804f6507fe4660152e8ca5c48f0436017"}, - {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2dea10edfa1a54098703cb7acaa665c07b4e7568472a47f4e64e6319d3821ccf"}, - {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:713d22cd9643ba9025d33c4af43943c7a1eb8547729228de18d3e02e278472b6"}, - {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2d252771fc85e0cf8da0b823157962d70639e63cb9b578b1dec9868dd1f4f937"}, - {file = "aiohttp-3.8.3-cp38-cp38-win32.whl", hash = "sha256:66bd5f950344fb2b3dbdd421aaa4e84f4411a1a13fca3aeb2bcbe667f80c9f76"}, - {file = "aiohttp-3.8.3-cp38-cp38-win_amd64.whl", hash = "sha256:84b14f36e85295fe69c6b9789b51a0903b774046d5f7df538176516c3e422446"}, - {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16c121ba0b1ec2b44b73e3a8a171c4f999b33929cd2397124a8c7fcfc8cd9e06"}, - {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d6aaa4e7155afaf994d7924eb290abbe81a6905b303d8cb61310a2aba1c68ba"}, - {file = "aiohttp-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43046a319664a04b146f81b40e1545d4c8ac7b7dd04c47e40bf09f65f2437346"}, - {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599418aaaf88a6d02a8c515e656f6faf3d10618d3dd95866eb4436520096c84b"}, - {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a2964319d359f494f16011e23434f6f8ef0434acd3cf154a6b7bec511e2fb7"}, - {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73a4131962e6d91109bca6536416aa067cf6c4efb871975df734f8d2fd821b37"}, - {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598adde339d2cf7d67beaccda3f2ce7c57b3b412702f29c946708f69cf8222aa"}, - {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75880ed07be39beff1881d81e4a907cafb802f306efd6d2d15f2b3c69935f6fb"}, - {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0239da9fbafd9ff82fd67c16704a7d1bccf0d107a300e790587ad05547681c8"}, - {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4e3a23ec214e95c9fe85a58470b660efe6534b83e6cbe38b3ed52b053d7cb6ad"}, - {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:47841407cc89a4b80b0c52276f3cc8138bbbfba4b179ee3acbd7d77ae33f7ac4"}, - {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:54d107c89a3ebcd13228278d68f1436d3f33f2dd2af5415e3feaeb1156e1a62c"}, - {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c37c5cce780349d4d51739ae682dec63573847a2a8dcb44381b174c3d9c8d403"}, - {file = "aiohttp-3.8.3-cp39-cp39-win32.whl", hash = "sha256:f178d2aadf0166be4df834c4953da2d7eef24719e8aec9a65289483eeea9d618"}, - {file = "aiohttp-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:88e5be56c231981428f4f506c68b6a46fa25c4123a2e86d156c58a8369d31ab7"}, - {file = "aiohttp-3.8.3.tar.gz", hash = "sha256:3828fb41b7203176b82fe5d699e0d845435f2374750a44b480ea6b930f6be269"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, ] [package.dependencies] aiosignal = ">=1.1.2" async-timeout = ">=4.0.0a3,<5.0" attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<3.0" +charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" @@ -108,6 +108,20 @@ yarl = ">=1.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns", "cchardet"] +[[package]] +name = "aiohttp-retry" +version = "2.8.3" +description = "Simple retry client for aiohttp" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiohttp_retry-2.8.3-py3-none-any.whl", hash = "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45"}, + {file = "aiohttp_retry-2.8.3.tar.gz", hash = "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9"}, +] + +[package.dependencies] +aiohttp = "*" + [[package]] name = "aiosignal" version = "1.3.1" @@ -191,21 +205,21 @@ files = [ [[package]] name = "attrs" -version = "22.2.0" +version = "23.1.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, ] [package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "backoff" @@ -264,15 +278,26 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, + {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, +] + [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -353,27 +378,97 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, ] -[package.extras] -unicode-backport = ["unicodedata2"] - [[package]] name = "click" -version = "8.1.3" +version = "8.1.6" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, + {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, + {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, ] [package.dependencies] @@ -467,49 +562,48 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "38.0.4" +version = "41.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"}, - {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b"}, - {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c"}, - {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00"}, - {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0"}, - {file = "cryptography-38.0.4-cp36-abi3-win32.whl", hash = "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744"}, - {file = "cryptography-38.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7"}, - {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876"}, - {file = "cryptography-38.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee"}, - {file = "cryptography-38.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9"}, - {file = "cryptography-38.0.4.tar.gz", hash = "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, ] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "exceptiongroup" @@ -527,21 +621,22 @@ test = ["pytest (>=6)"] [[package]] name = "flask" -version = "2.2.2" +version = "2.3.2" description = "A simple framework for building complex web applications." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Flask-2.2.2-py3-none-any.whl", hash = "sha256:b9c46cc36662a7949f34b52d8ec7bb59c0d74ba08ba6cb9ce9adc1d8676d9526"}, - {file = "Flask-2.2.2.tar.gz", hash = "sha256:642c450d19c4ad482f96729bd2a8f6d32554aa1e231f4f6b4e7e5264b16cca2b"}, + {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, + {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, ] [package.dependencies] -click = ">=8.0" +blinker = ">=1.6.2" +click = ">=8.1.3" importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.0" -Jinja2 = ">=3.0" -Werkzeug = ">=2.2.2" +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.3" [package.extras] async = ["asgiref (>=3.2)"] @@ -549,85 +644,72 @@ dotenv = ["python-dotenv"] [[package]] name = "frozenlist" -version = "1.3.3" +version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"}, - {file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"}, - {file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bed331fe18f58d844d39ceb398b77d6ac0b010d571cba8267c2e7165806b00ce"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:02c9ac843e3390826a265e331105efeab489ffaf4dd86384595ee8ce6d35ae7f"}, - {file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9545a33965d0d377b0bc823dcabf26980e77f1b6a7caa368a365a9497fb09420"}, - {file = "frozenlist-1.3.3-cp310-cp310-win32.whl", hash = "sha256:d5cd3ab21acbdb414bb6c31958d7b06b85eeb40f66463c264a9b343a4e238642"}, - {file = "frozenlist-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b756072364347cb6aa5b60f9bc18e94b2f79632de3b0190253ad770c5df17db1"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b4395e2f8d83fbe0c627b2b696acce67868793d7d9750e90e39592b3626691b7"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14143ae966a6229350021384870458e4777d1eae4c28d1a7aa47f24d030e6678"}, - {file = "frozenlist-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d8860749e813a6f65bad8285a0520607c9500caa23fea6ee407e63debcdbef6"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23d16d9f477bb55b6154654e0e74557040575d9d19fe78a161bd33d7d76808e8"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb82dbba47a8318e75f679690190c10a5e1f447fbf9df41cbc4c3afd726d88cb"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9309869032abb23d196cb4e4db574232abe8b8be1339026f489eeb34a4acfd91"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a97b4fe50b5890d36300820abd305694cb865ddb7885049587a5678215782a6b"}, - {file = "frozenlist-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c188512b43542b1e91cadc3c6c915a82a5eb95929134faf7fd109f14f9892ce4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:303e04d422e9b911a09ad499b0368dc551e8c3cd15293c99160c7f1f07b59a48"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0771aed7f596c7d73444c847a1c16288937ef988dc04fb9f7be4b2aa91db609d"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:66080ec69883597e4d026f2f71a231a1ee9887835902dbe6b6467d5a89216cf6"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:41fe21dc74ad3a779c3d73a2786bdf622ea81234bdd4faf90b8b03cad0c2c0b4"}, - {file = "frozenlist-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f20380df709d91525e4bee04746ba612a4df0972c1b8f8e1e8af997e678c7b81"}, - {file = "frozenlist-1.3.3-cp311-cp311-win32.whl", hash = "sha256:f30f1928162e189091cf4d9da2eac617bfe78ef907a761614ff577ef4edfb3c8"}, - {file = "frozenlist-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a6394d7dadd3cfe3f4b3b186e54d5d8504d44f2d58dcc89d693698e8b7132b32"}, - {file = "frozenlist-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8df3de3a9ab8325f94f646609a66cbeeede263910c5c0de0101079ad541af332"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0693c609e9742c66ba4870bcee1ad5ff35462d5ffec18710b4ac89337ff16e27"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4210baef299717db0a600d7a3cac81d46ef0e007f88c9335db79f8979c0d3d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:394c9c242113bfb4b9aa36e2b80a05ffa163a30691c7b5a29eba82e937895d5e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6327eb8e419f7d9c38f333cde41b9ae348bec26d840927332f17e887a8dcb70d"}, - {file = "frozenlist-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e24900aa13212e75e5b366cb9065e78bbf3893d4baab6052d1aca10d46d944c"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3843f84a6c465a36559161e6c59dce2f2ac10943040c2fd021cfb70d58c4ad56"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:84610c1502b2461255b4c9b7d5e9c48052601a8957cd0aea6ec7a7a1e1fb9420"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c21b9aa40e08e4f63a2f92ff3748e6b6c84d717d033c7b3438dd3123ee18f70e"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:efce6ae830831ab6a22b9b4091d411698145cb9b8fc869e1397ccf4b4b6455cb"}, - {file = "frozenlist-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:40de71985e9042ca00b7953c4f41eabc3dc514a2d1ff534027f091bc74416401"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:180c00c66bde6146a860cbb81b54ee0df350d2daf13ca85b275123bbf85de18a"}, - {file = "frozenlist-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9bbbcedd75acdfecf2159663b87f1bb5cfc80e7cd99f7ddd9d66eb98b14a8411"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:034a5c08d36649591be1cbb10e09da9f531034acfe29275fc5454a3b101ce41a"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba64dc2b3b7b158c6660d49cdb1d872d1d0bf4e42043ad8d5006099479a194e5"}, - {file = "frozenlist-1.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47df36a9fe24054b950bbc2db630d508cca3aa27ed0566c0baf661225e52c18e"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008a054b75d77c995ea26629ab3a0c0d7281341f2fa7e1e85fa6153ae29ae99c"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:841ea19b43d438a80b4de62ac6ab21cfe6827bb8a9dc62b896acc88eaf9cecba"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e235688f42b36be2b6b06fc37ac2126a73b75fb8d6bc66dd632aa35286238703"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca713d4af15bae6e5d79b15c10c8522859a9a89d3b361a50b817c98c2fb402a2"}, - {file = "frozenlist-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac5995f2b408017b0be26d4a1d7c61bce106ff3d9e3324374d66b5964325448"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a4ae8135b11652b08a8baf07631d3ebfe65a4c87909dbef5fa0cdde440444ee4"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4ea42116ceb6bb16dbb7d526e242cb6747b08b7710d9782aa3d6732bd8d27649"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:810860bb4bdce7557bc0febb84bbd88198b9dbc2022d8eebe5b3590b2ad6c842"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ee78feb9d293c323b59a6f2dd441b63339a30edf35abcb51187d2fc26e696d13"}, - {file = "frozenlist-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0af2e7c87d35b38732e810befb9d797a99279cbb85374d42ea61c1e9d23094b3"}, - {file = "frozenlist-1.3.3-cp38-cp38-win32.whl", hash = "sha256:899c5e1928eec13fd6f6d8dc51be23f0d09c5281e40d9cf4273d188d9feeaf9b"}, - {file = "frozenlist-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:7f44e24fa70f6fbc74aeec3e971f60a14dde85da364aa87f15d1be94ae75aeef"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2b07ae0c1edaa0a36339ec6cce700f51b14a3fc6545fdd32930d2c83917332cf"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ebb86518203e12e96af765ee89034a1dbb0c3c65052d1b0c19bbbd6af8a145e1"}, - {file = "frozenlist-1.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5cf820485f1b4c91e0417ea0afd41ce5cf5965011b3c22c400f6d144296ccbc0"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c11e43016b9024240212d2a65043b70ed8dfd3b52678a1271972702d990ac6d"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8fa3c6e3305aa1146b59a09b32b2e04074945ffcfb2f0931836d103a2c38f936"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:352bd4c8c72d508778cf05ab491f6ef36149f4d0cb3c56b1b4302852255d05d5"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65a5e4d3aa679610ac6e3569e865425b23b372277f89b5ef06cf2cdaf1ebf22b"}, - {file = "frozenlist-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e2c1185858d7e10ff045c496bbf90ae752c28b365fef2c09cf0fa309291669"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f163d2fd041c630fed01bc48d28c3ed4a3b003c00acd396900e11ee5316b56bb"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05cdb16d09a0832eedf770cb7bd1fe57d8cf4eaf5aced29c4e41e3f20b30a784"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:8bae29d60768bfa8fb92244b74502b18fae55a80eac13c88eb0b496d4268fd2d"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eedab4c310c0299961ac285591acd53dc6723a1ebd90a57207c71f6e0c2153ab"}, - {file = "frozenlist-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3bbdf44855ed8f0fbcd102ef05ec3012d6a4fd7c7562403f76ce6a52aeffb2b1"}, - {file = "frozenlist-1.3.3-cp39-cp39-win32.whl", hash = "sha256:efa568b885bca461f7c7b9e032655c0c143d305bf01c30caf6db2854a4532b38"}, - {file = "frozenlist-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfe33efc9cb900a4c46f91a5ceba26d6df370ffddd9ca386eb1d4f0ad97b9ea9"}, - {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, ] [[package]] @@ -673,13 +755,13 @@ files = [ [[package]] name = "iso8601" -version = "1.1.0" +version = "2.0.0" description = "Simple module to parse ISO 8601 dates" optional = false -python-versions = ">=3.6.2,<4.0" +python-versions = ">=3.7,<4.0" files = [ - {file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"}, - {file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"}, + {file = "iso8601-2.0.0-py3-none-any.whl", hash = "sha256:ebe10061b932edb8a8e33cc635d661926c59b9c3bed7a4f4edca8c62d400af10"}, + {file = "iso8601-2.0.0.tar.gz", hash = "sha256:739960d37c74c77bd9bd546a76562ccb581fe3d4820ff5c3141eb49c839fda8f"}, ] [[package]] @@ -729,61 +811,61 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "markupsafe" -version = "2.1.2" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, - {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, - {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, - {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, - {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, - {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, - {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, ] [[package]] @@ -893,39 +975,39 @@ files = [ [[package]] name = "numpy" -version = "1.24.1" +version = "1.24.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.24.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:179a7ef0889ab769cc03573b6217f54c8bd8e16cef80aad369e1e8185f994cd7"}, - {file = "numpy-1.24.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b09804ff570b907da323b3d762e74432fb07955701b17b08ff1b5ebaa8cfe6a9"}, - {file = "numpy-1.24.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1b739841821968798947d3afcefd386fa56da0caf97722a5de53e07c4ccedc7"}, - {file = "numpy-1.24.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e3463e6ac25313462e04aea3fb8a0a30fb906d5d300f58b3bc2c23da6a15398"}, - {file = "numpy-1.24.1-cp310-cp310-win32.whl", hash = "sha256:b31da69ed0c18be8b77bfce48d234e55d040793cebb25398e2a7d84199fbc7e2"}, - {file = "numpy-1.24.1-cp310-cp310-win_amd64.whl", hash = "sha256:b07b40f5fb4fa034120a5796288f24c1fe0e0580bbfff99897ba6267af42def2"}, - {file = "numpy-1.24.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7094891dcf79ccc6bc2a1f30428fa5edb1e6fb955411ffff3401fb4ea93780a8"}, - {file = "numpy-1.24.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e418681372520c992805bb723e29d69d6b7aa411065f48216d8329d02ba032"}, - {file = "numpy-1.24.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e274f0f6c7efd0d577744f52032fdd24344f11c5ae668fe8d01aac0422611df1"}, - {file = "numpy-1.24.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0044f7d944ee882400890f9ae955220d29b33d809a038923d88e4e01d652acd9"}, - {file = "numpy-1.24.1-cp311-cp311-win32.whl", hash = "sha256:442feb5e5bada8408e8fcd43f3360b78683ff12a4444670a7d9e9824c1817d36"}, - {file = "numpy-1.24.1-cp311-cp311-win_amd64.whl", hash = "sha256:de92efa737875329b052982e37bd4371d52cabf469f83e7b8be9bb7752d67e51"}, - {file = "numpy-1.24.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b162ac10ca38850510caf8ea33f89edcb7b0bb0dfa5592d59909419986b72407"}, - {file = "numpy-1.24.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26089487086f2648944f17adaa1a97ca6aee57f513ba5f1c0b7ebdabbe2b9954"}, - {file = "numpy-1.24.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:caf65a396c0d1f9809596be2e444e3bd4190d86d5c1ce21f5fc4be60a3bc5b36"}, - {file = "numpy-1.24.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0677a52f5d896e84414761531947c7a330d1adc07c3a4372262f25d84af7bf7"}, - {file = "numpy-1.24.1-cp38-cp38-win32.whl", hash = "sha256:dae46bed2cb79a58d6496ff6d8da1e3b95ba09afeca2e277628171ca99b99db1"}, - {file = "numpy-1.24.1-cp38-cp38-win_amd64.whl", hash = "sha256:6ec0c021cd9fe732e5bab6401adea5a409214ca5592cd92a114f7067febcba0c"}, - {file = "numpy-1.24.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28bc9750ae1f75264ee0f10561709b1462d450a4808cd97c013046073ae64ab6"}, - {file = "numpy-1.24.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:84e789a085aabef2f36c0515f45e459f02f570c4b4c4c108ac1179c34d475ed7"}, - {file = "numpy-1.24.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e669fbdcdd1e945691079c2cae335f3e3a56554e06bbd45d7609a6cf568c700"}, - {file = "numpy-1.24.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef85cf1f693c88c1fd229ccd1055570cb41cdf4875873b7728b6301f12cd05bf"}, - {file = "numpy-1.24.1-cp39-cp39-win32.whl", hash = "sha256:87a118968fba001b248aac90e502c0b13606721b1343cdaddbc6e552e8dfb56f"}, - {file = "numpy-1.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:ddc7ab52b322eb1e40521eb422c4e0a20716c271a306860979d450decbb51b8e"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed5fb71d79e771ec930566fae9c02626b939e37271ec285e9efaf1b5d4370e7d"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2925567f43643f51255220424c23d204024ed428afc5aad0f86f3ffc080086"}, - {file = "numpy-1.24.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cfa1161c6ac8f92dea03d625c2d0c05e084668f4a06568b77a25a89111621566"}, - {file = "numpy-1.24.1.tar.gz", hash = "sha256:2386da9a471cc00a1f47845e27d916d5ec5346ae9696e01a8a34760858fe9dd2"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, ] [[package]] @@ -952,13 +1034,13 @@ wandb = ["numpy", "openpyxl (>=3.0.7)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1 [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] @@ -994,28 +1076,28 @@ files = [ [[package]] name = "platformdirs" -version = "2.6.2" +version = "3.9.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, - {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, + {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, + {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, ] [package.extras] @@ -1047,25 +1129,24 @@ test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint" [[package]] name = "protobuf" -version = "4.21.12" +version = "4.23.4" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "protobuf-4.21.12-cp310-abi3-win32.whl", hash = "sha256:b135410244ebe777db80298297a97fbb4c862c881b4403b71bac9d4107d61fd1"}, - {file = "protobuf-4.21.12-cp310-abi3-win_amd64.whl", hash = "sha256:89f9149e4a0169cddfc44c74f230d7743002e3aa0b9472d8c28f0388102fc4c2"}, - {file = "protobuf-4.21.12-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:299ea899484ee6f44604deb71f424234f654606b983cb496ea2a53e3c63ab791"}, - {file = "protobuf-4.21.12-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:d1736130bce8cf131ac7957fa26880ca19227d4ad68b4888b3be0dea1f95df97"}, - {file = "protobuf-4.21.12-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:78a28c9fa223998472886c77042e9b9afb6fe4242bd2a2a5aced88e3f4422aa7"}, - {file = "protobuf-4.21.12-cp37-cp37m-win32.whl", hash = "sha256:3d164928ff0727d97022957c2b849250ca0e64777ee31efd7d6de2e07c494717"}, - {file = "protobuf-4.21.12-cp37-cp37m-win_amd64.whl", hash = "sha256:f45460f9ee70a0ec1b6694c6e4e348ad2019275680bd68a1d9314b8c7e01e574"}, - {file = "protobuf-4.21.12-cp38-cp38-win32.whl", hash = "sha256:6ab80df09e3208f742c98443b6166bcb70d65f52cfeb67357d52032ea1ae9bec"}, - {file = "protobuf-4.21.12-cp38-cp38-win_amd64.whl", hash = "sha256:1f22ac0ca65bb70a876060d96d914dae09ac98d114294f77584b0d2644fa9c30"}, - {file = "protobuf-4.21.12-cp39-cp39-win32.whl", hash = "sha256:27f4d15021da6d2b706ddc3860fac0a5ddaba34ab679dc182b60a8bb4e1121cc"}, - {file = "protobuf-4.21.12-cp39-cp39-win_amd64.whl", hash = "sha256:237216c3326d46808a9f7c26fd1bd4b20015fb6867dc5d263a493ef9a539293b"}, - {file = "protobuf-4.21.12-py2.py3-none-any.whl", hash = "sha256:a53fd3f03e578553623272dc46ac2f189de23862e68565e83dde203d41b76fc5"}, - {file = "protobuf-4.21.12-py3-none-any.whl", hash = "sha256:b98d0148f84e3a3c569e19f52103ca1feacdac0d2df8d6533cf983d1fda28462"}, - {file = "protobuf-4.21.12.tar.gz", hash = "sha256:7cd532c4566d0e6feafecc1059d04c7915aec8e182d1cf7adee8b24ef1e2e6ab"}, + {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, + {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, + {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, + {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, + {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, + {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, + {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, + {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, + {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, + {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, + {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, + {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, ] [[package]] @@ -1081,58 +1162,115 @@ files = [ [[package]] name = "pycryptodomex" -version = "3.16.0" +version = "3.18.0" description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodomex-3.16.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b3d04c00d777c36972b539fb79958790126847d84ec0129fce1efef250bfe3ce"}, - {file = "pycryptodomex-3.16.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e5a670919076b71522c7d567a9043f66f14b202414a63c3a078b5831ae342c03"}, - {file = "pycryptodomex-3.16.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ce338a9703f54b2305a408fc9890eb966b727ce72b69f225898bb4e9d9ed3f1f"}, - {file = "pycryptodomex-3.16.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:a1c0ae7123448ecb034c75c713189cb00ebe2d415b11682865b6c54d200d9c93"}, - {file = "pycryptodomex-3.16.0-cp27-cp27m-win32.whl", hash = "sha256:8851585ff19871e5d69e1790f4ca5f6fd1699d6b8b14413b472a4c0dbc7ea780"}, - {file = "pycryptodomex-3.16.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8dd2d9e3c617d0712ed781a77efd84ea579e76c5f9b2a4bc0b684ebeddf868b2"}, - {file = "pycryptodomex-3.16.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2ad9bb86b355b6104796567dd44c215b3dc953ef2fae5e0bdfb8516731df92cf"}, - {file = "pycryptodomex-3.16.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e25a2f5667d91795f9417cb856f6df724ccdb0cdd5cbadb212ee9bf43946e9f8"}, - {file = "pycryptodomex-3.16.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b0789a8490114a2936ed77c87792cfe77582c829cb43a6d86ede0f9624ba8aa3"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0da835af786fdd1c9930994c78b23e88d816dc3f99aa977284a21bbc26d19735"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:22aed0868622d95179217c298e37ed7410025c7b29dac236d3230617d1e4ed56"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1619087fb5b31510b0b0b058a54f001a5ffd91e6ffee220d9913064519c6a69d"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:70288d9bfe16b2fd0d20b6c365db614428f1bcde7b20d56e74cf88ade905d9eb"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7993d26dae4d83b8f4ce605bb0aecb8bee330bb3c95475ef06f3694403621e71"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1cda60207be8c1cf0b84b9138f9e3ca29335013d2b690774a5e94678ff29659a"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:04610536921c1ec7adba158ef570348550c9f3a40bc24be9f8da2ef7ab387981"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-win32.whl", hash = "sha256:daa67f5ebb6fbf1ee9c90decaa06ca7fc88a548864e5e484d52b0920a57fe8a5"}, - {file = "pycryptodomex-3.16.0-cp35-abi3-win_amd64.whl", hash = "sha256:231dc8008cbdd1ae0e34645d4523da2dbc7a88c325f0d4a59635a86ee25b41dd"}, - {file = "pycryptodomex-3.16.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:4dbbe18cc232b5980c7633972ae5417d0df76fe89e7db246eefd17ef4d8e6d7a"}, - {file = "pycryptodomex-3.16.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:893f8a97d533c66cc3a56e60dd3ed40a3494ddb4aafa7e026429a08772f8a849"}, - {file = "pycryptodomex-3.16.0-pp27-pypy_73-win32.whl", hash = "sha256:6a465e4f856d2a4f2a311807030c89166529ccf7ccc65bef398de045d49144b6"}, - {file = "pycryptodomex-3.16.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba57ac7861fd2c837cdb33daf822f2a052ff57dd769a2107807f52a36d0e8d38"}, - {file = "pycryptodomex-3.16.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f2b971a7b877348a27dcfd0e772a0343fb818df00b74078e91c008632284137d"}, - {file = "pycryptodomex-3.16.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e2453162f473c1eae4826eb10cd7bce19b5facac86d17fb5f29a570fde145abd"}, - {file = "pycryptodomex-3.16.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0ba28aa97cdd3ff5ed1a4f2b7f5cd04e721166bd75bd2b929e2734433882b583"}, - {file = "pycryptodomex-3.16.0.tar.gz", hash = "sha256:e9ba9d8ed638733c9e95664470b71d624a6def149e2db6cc52c1aca5a6a2df1d"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, + {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, + {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, + {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, + {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, + {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, + {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, + {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, +] + +[[package]] +name = "pydantic" +version = "1.9.2" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "pydantic-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e"}, + {file = "pydantic-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08"}, + {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c"}, + {file = "pydantic-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131"}, + {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76"}, + {file = "pydantic-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567"}, + {file = "pydantic-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044"}, + {file = "pydantic-1.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555"}, + {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84"}, + {file = "pydantic-1.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f"}, + {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb"}, + {file = "pydantic-1.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b"}, + {file = "pydantic-1.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001"}, + {file = "pydantic-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56"}, + {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4"}, + {file = "pydantic-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f"}, + {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979"}, + {file = "pydantic-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d"}, + {file = "pydantic-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7"}, + {file = "pydantic-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3"}, + {file = "pydantic-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa"}, + {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3"}, + {file = "pydantic-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0"}, + {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8"}, + {file = "pydantic-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8"}, + {file = "pydantic-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326"}, + {file = "pydantic-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801"}, + {file = "pydantic-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44"}, + {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747"}, + {file = "pydantic-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453"}, + {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb"}, + {file = "pydantic-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15"}, + {file = "pydantic-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55"}, + {file = "pydantic-1.9.2-py3-none-any.whl", hash = "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e"}, + {file = "pydantic-1.9.2.tar.gz", hash = "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d"}, ] +[package.dependencies] +typing-extensions = ">=3.7.4.3" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + [[package]] name = "pyseto" -version = "1.7.0" +version = "1.7.3" description = "A Python implementation of PASETO/PASERK." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "pyseto-1.7.0-py3-none-any.whl", hash = "sha256:031d443a87d589db56df090a9ad9a53466d0a2f03c185ef89c38a4197569a256"}, - {file = "pyseto-1.7.0.tar.gz", hash = "sha256:d2530051dc271fdc0437a8c5d3968c9041403960970943aef32a979e6c1c9698"}, + {file = "pyseto-1.7.3-py3-none-any.whl", hash = "sha256:ee679c0dab1837d73bb3f69e3e0e5f0737039e1bb62377d9d08a54386580f734"}, + {file = "pyseto-1.7.3.tar.gz", hash = "sha256:df3a3b220a0fb28a9b355012c2f1762ace26626354ad410b55a83addb6407fb8"}, ] [package.dependencies] -cryptography = ">=36,<39" -iso8601 = ">=1.0.2,<2.0.0" +cryptography = ">=41.0.0,<42.0.0" +iso8601 = ">=1.0.2,<3.0.0" passlib = {version = ">=1.7.4,<2.0.0", extras = ["argon2"]} pycryptodomex = ">=3.12.0,<4.0.0" [package.extras] -docs = ["Sphinx[docs] (>=4.3.2,<6.0.0)", "sphinx-autodoc-typehints[docs] (==1.12.0)", "sphinx-rtd-theme[docs] (>=1.0.0,<2.0.0)"] +docs = ["Sphinx[docs] (>=6.0.0,<7.0.0)", "sphinx-autodoc-typehints[docs] (>=1.21.0,<2.0.0)", "sphinx-rtd-theme[docs] (>=1.0.0,<2.0.0)"] [[package]] name = "pytest" @@ -1202,6 +1340,24 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "redis" +version = "4.6.0" +description = "Python client for Redis database and key-value store" +optional = true +python-versions = ">=3.7" +files = [ + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + [[package]] name = "regex" version = "2023.6.3" @@ -1301,17 +1457,18 @@ files = [ [[package]] name = "replit" -version = "3.2.5" +version = "3.3.1" description = "A library for interacting with features of repl.it" optional = false python-versions = ">=3.8,<4.0" files = [ - {file = "replit-3.2.5-py3-none-any.whl", hash = "sha256:c8ca833203e5e56b53d594523fec204bc31cb1ae4b9b703778e4b8edda292313"}, - {file = "replit-3.2.5.tar.gz", hash = "sha256:4364879b8b8271cc2c07e0e32d33b272ed72687cc6d62a53d2378012a81ad63e"}, + {file = "replit-3.3.1-py3-none-any.whl", hash = "sha256:8a95b3fd2bc60aa2792e5796aae8ab25d61db7b253ce9f410e76ac33a5521a86"}, + {file = "replit-3.3.1.tar.gz", hash = "sha256:e041223a26a0937ed32e40d73162032e29d60cee52242ceb366cd702f9b88b2a"}, ] [package.dependencies] aiohttp = ">=3.6.2,<4.0.0" +aiohttp-retry = ">=2.8.3,<3.0.0" Flask = ">=2.0.0,<3.0.0" protobuf = ">=4.21.8,<5.0.0" pyseto = ">=1.6.11,<2.0.0" @@ -1494,13 +1651,13 @@ files = [ [[package]] name = "urllib3" -version = "1.26.14" +version = "1.26.16" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, - {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, ] [package.extras] @@ -1510,102 +1667,102 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "werkzeug" -version = "2.2.2" +version = "2.3.6" description = "The comprehensive WSGI web application library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Werkzeug-2.2.2-py3-none-any.whl", hash = "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5"}, - {file = "Werkzeug-2.2.2.tar.gz", hash = "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f"}, + {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, + {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, ] [package.dependencies] MarkupSafe = ">=2.1.1" [package.extras] -watchdog = ["watchdog"] +watchdog = ["watchdog (>=2.3)"] [[package]] name = "yarl" -version = "1.8.2" +version = "1.9.2" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863"}, - {file = "yarl-1.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8"}, - {file = "yarl-1.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3"}, - {file = "yarl-1.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80"}, - {file = "yarl-1.8.2-cp310-cp310-win32.whl", hash = "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42"}, - {file = "yarl-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd"}, - {file = "yarl-1.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76"}, - {file = "yarl-1.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c"}, - {file = "yarl-1.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2"}, - {file = "yarl-1.8.2-cp311-cp311-win32.whl", hash = "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b"}, - {file = "yarl-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c"}, - {file = "yarl-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89"}, - {file = "yarl-1.8.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7"}, - {file = "yarl-1.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37"}, - {file = "yarl-1.8.2-cp37-cp37m-win32.whl", hash = "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89"}, - {file = "yarl-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918"}, - {file = "yarl-1.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3"}, - {file = "yarl-1.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c"}, - {file = "yarl-1.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946"}, - {file = "yarl-1.8.2-cp38-cp38-win32.whl", hash = "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165"}, - {file = "yarl-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf"}, - {file = "yarl-1.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08"}, - {file = "yarl-1.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516"}, - {file = "yarl-1.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588"}, - {file = "yarl-1.8.2-cp39-cp39-win32.whl", hash = "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83"}, - {file = "yarl-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778"}, - {file = "yarl-1.8.2.tar.gz", hash = "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, ] [package.dependencies] @@ -1614,21 +1771,23 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.16.1" +version = "3.16.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.1-py3-none-any.whl", hash = "sha256:0b37c326d826d5ca35f2b9685cd750292740774ef16190008b00a0227c256fe0"}, - {file = "zipp-3.16.1.tar.gz", hash = "sha256:857b158da2cbf427b376da1c24fd11faecbac5a4ac7523c3607f8a01f94c2ec0"}, + {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, + {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[extras] +redis-cache = ["redis"] [metadata] lock-version = "2.0" python-versions = ">=3.8.0,<=3.11" - -content-hash = "b18599121b831e32d1390752a73489b7dacfb4380ecb8b8e403310c467675d4c" +content-hash = "f8370010a6126724e73e3f78de5f6a18705e29f1a4e124f37f2f97e211f0b4b3" diff --git a/pyproject.toml b/pyproject.toml index 2236fc2..8beb174 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,14 +16,19 @@ termcolor = "2.3.0" resend = "0.5.1" tiktoken = "^0.4.0" posthog = "^3.0.1" -isort = "^5.12.0" +pydantic = "^1.9.1" +redis = { version = "4.6.0", optional = true } +python-dotenv = "^1.0.0" [tool.poetry.group.dev.dependencies] pytest-cov = "^4.1.0" ruff = "^0.0.278" black = "^23.7.0" pytest = "^7.4.0" -python-dotenv = "^1.0.0" +isort = "^5.12.0" + +[tool.poetry.extras] +redis-cache = ["redis"] [tool.black] line-length = 120 diff --git a/reliablegpt/.DS_Store b/reliablegpt/.DS_Store index 4819cbd..f7edf68 100644 Binary files a/reliablegpt/.DS_Store and b/reliablegpt/.DS_Store differ diff --git a/reliablegpt/__init__.py b/reliablegpt/__init__.py index e69de29..62ebf3d 100644 --- a/reliablegpt/__init__.py +++ b/reliablegpt/__init__.py @@ -0,0 +1,10 @@ +import os + +if os.environ.get("ENVIRONMENT", "local") == "local": + from dotenv import load_dotenv + + load_dotenv() + +from reliablegpt.main import reliableGPT + +__all__ = ["reliableGPT"] diff --git a/reliablegpt/__pycache__/Alerting.cpython-311.pyc b/reliablegpt/__pycache__/Alerting.cpython-311.pyc new file mode 100644 index 0000000..f86d7b2 Binary files /dev/null and b/reliablegpt/__pycache__/Alerting.cpython-311.pyc differ diff --git a/reliablegpt/__pycache__/CacheDecorator.cpython-311.pyc b/reliablegpt/__pycache__/CacheDecorator.cpython-311.pyc new file mode 100644 index 0000000..12e1acf Binary files /dev/null and b/reliablegpt/__pycache__/CacheDecorator.cpython-311.pyc differ diff --git a/reliablegpt/__pycache__/IndividualRequest.cpython-311.pyc b/reliablegpt/__pycache__/IndividualRequest.cpython-311.pyc new file mode 100644 index 0000000..44218cc Binary files /dev/null and b/reliablegpt/__pycache__/IndividualRequest.cpython-311.pyc differ diff --git a/reliablegpt/__pycache__/KeyManagement.cpython-311.pyc b/reliablegpt/__pycache__/KeyManagement.cpython-311.pyc new file mode 100644 index 0000000..13e8d1e Binary files /dev/null and b/reliablegpt/__pycache__/KeyManagement.cpython-311.pyc differ diff --git a/reliablegpt/__pycache__/Model.cpython-311.pyc b/reliablegpt/__pycache__/Model.cpython-311.pyc new file mode 100644 index 0000000..6782c43 Binary files /dev/null and b/reliablegpt/__pycache__/Model.cpython-311.pyc differ diff --git a/reliablegpt/__pycache__/main.cpython-311.pyc b/reliablegpt/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..f613615 Binary files /dev/null and b/reliablegpt/__pycache__/main.cpython-311.pyc differ diff --git a/reliablegpt/alerting.py b/reliablegpt/alerting.py index 6d73a27..e48f35e 100644 --- a/reliablegpt/alerting.py +++ b/reliablegpt/alerting.py @@ -12,7 +12,7 @@ def __init__(self, alert_threshold=5, send_notifications=True, user_emails=set() self.unhandled_errors = {} # dictionary of openai errors + frequency count for that hour now = datetime.datetime.now() self.current_time_block = now.hour - self.set_cooldown = False + self.set_cooldown = True self.cooldown_start_time = time.time() self.send_notifications = send_notifications self.user_emails = user_emails diff --git a/reliablegpt/cache.py b/reliablegpt/cache.py new file mode 100644 index 0000000..5129bb7 --- /dev/null +++ b/reliablegpt/cache.py @@ -0,0 +1,65 @@ +import redis +import requests + +from reliablegpt.constants import DEFAULT_INSTANCE_ID +from reliablegpt.settings import settings + + +class BaseCache: + def put(self, input_prompt, response, *args, **kwargs): + raise NotImplementedError + + def get(self, input_prompt, *args, **kwargs): + raise NotImplementedError + + @staticmethod + def map_results(extracted_result) -> dict: + return {"choices": [{"message": {"content": extracted_result}}]} + + +class DefaultCache(BaseCache): + """1st iteration of refactor, this still needs lots of improvements.""" + + def put(self, input_prompt, response, *args, **kwargs): + request, user_email, customer_id = kwargs["request"], kwargs["user_email"], kwargs["customer_id"] + url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/add_cache" + querystring = { + "customer_id": customer_id, + "instance_id": request.args.get("instance_id") or DEFAULT_INSTANCE_ID, + "user_email": user_email, + "input_prompt": input_prompt, + "response": response, + } + requests.post(url, params=querystring) + + def get(self, input_prompt, *args, **kwargs) -> dict: + request, user_email, customer_id = kwargs["request"], kwargs["user_email"], kwargs["customer_id"] + url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/get_cache" + querystring = { + "customer_id": customer_id, + "instance_id": request.args.get("instance_id") or DEFAULT_INSTANCE_ID, + "user_email": user_email, + "input_prompt": input_prompt, + } + response = requests.get(url, params=querystring) + print(f"cached response: {response.json()}") # todo: PROPER LOGGING + extracted_result = response.json()["response"] + return self.map_results(extracted_result=extracted_result) + + +class RedisCache(BaseCache): + """For now, we do the simplest approach possible, meaning we cache the results in Redis. Using exact match + strategy. In the future this should be extended to other stores and similarity based matching to enable + true semantic caching. For that vector store handling needs to be added. Proper exception handling.""" + + def __init__(self): + self.cache = redis.Redis( + host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, decode_responses=True + ) + + def put(self, input_prompt, response, *args, **kwargs): + self.cache.set(input_prompt, response) + + def get(self, input_prompt, *args, **kwargs): + if self.cache.exists(input_prompt): + return self.map_results(extracted_result=self.cache.get(input_prompt)) diff --git a/reliablegpt/cache_decorator.py b/reliablegpt/cache_decorator.py new file mode 100644 index 0000000..b7672b8 --- /dev/null +++ b/reliablegpt/cache_decorator.py @@ -0,0 +1,100 @@ +import threading +import traceback + +import requests +from flask import request + + +class reliableCache: + def __init__(self, query_arg=None, customer_instance_arg=None, user_email=None, max_threads=100) -> None: + self.max_threads = max_threads + self.verbose = True + self.query_arg = query_arg + self.customer_instance_arg = customer_instance_arg + self.user_email = user_email + self.cache_wrapper_threads = {} + self.hot_cache = {} + pass + + def print_verbose(self, print_statement): + if self.verbose: + print("Cached Request: " + str(print_statement)) + + def add_cache(self, user_email, instance_id, input_prompt, response): + try: + url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/add_cache" + querystring = { + "customer_id": "temp@xyz.com", + "instance_id": instance_id, + "user_email": user_email, + "input_prompt": input_prompt, + "response": response, + } + response = requests.post(url, params=querystring) + except: # noqa + pass + + def try_cache_request(self, user_email, instance_id, query=None): + try: + if (user_email, instance_id, query) in self.hot_cache: + result = self.hot_cache[(user_email, instance_id, query)] + return result + else: + url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/get_cache" + querystring = { + "customer_id": "temp@xyz.com", + "instance_id": instance_id, + "user_email": user_email, + "input_prompt": query, + } + response = requests.get(url, params=querystring) + extracted_result = response.json()["response"] + self.hot_cache[(user_email, instance_id, query)] = extracted_result + return extracted_result + except: # noqa + pass + self.print_verbose("cache miss!") + return None + + def cache_wrapper(self, func): + def wrapper(*args, **kwargs): + query = request.args.get(self.query_arg) # the customer question + instance_id = request.args.get( + self.customer_instance_arg + ) # the unique instance to put that customer query/response in + curr_thread_id = threading.get_ident() + self.cache_wrapper_threads[curr_thread_id] = True # mark thread as active + try: + # monitor for high thread utilization + self.print_verbose(f"max threads: {self.max_threads}") + thread_utilization = self.get_wrapper_thread_utilization() + self.print_verbose(f"thread utilization: {thread_utilization}") + if thread_utilization > 0.8: # over 80% utilization of threads, start returning cached responses + result = self.try_cache_request(user_email=self.user_email, instance_id=instance_id, query=query) + if result is not None: + self.cache_wrapper_threads[curr_thread_id] = False # mark thread as inactive + return result + result = func(*args, **kwargs) + # add response to cache + # Create a separate thread to run the code + thread = threading.Thread(target=self.add_cache, args=(self.user_email, instance_id, query, result)) + thread.start() + pass + except: # noqa + traceback.print_exc() + pass + finally: + self.cache_wrapper_threads[curr_thread_id] = False # mark thread as inactive + return result + + return wrapper + + def get_wrapper_thread_utilization(self): + self.print_verbose(f"cache wrapper thread values: {self.cache_wrapper_threads.values()}") + active_cache_threads = 0 + for value in self.cache_wrapper_threads.values(): + if value is True: + active_cache_threads += 1 + # active_cache_threads = sum(self.cache_wrapper_threads.values()) + self.print_verbose(f"active_cache_threads: {active_cache_threads}") + return active_cache_threads / self.max_threads diff --git a/reliablegpt/constants.py b/reliablegpt/constants.py new file mode 100644 index 0000000..95ffeae --- /dev/null +++ b/reliablegpt/constants.py @@ -0,0 +1 @@ +DEFAULT_INSTANCE_ID = 0000 diff --git a/reliablegpt/individual_request.py b/reliablegpt/individual_request.py index 05010e7..ad442f0 100644 --- a/reliablegpt/individual_request.py +++ b/reliablegpt/individual_request.py @@ -7,6 +7,8 @@ from flask import Flask, request from termcolor import colored +from reliablegpt.cache import BaseCache, DefaultCache + class IndividualRequest: """A brief description of the class.""" @@ -15,12 +17,12 @@ def __init__( self, model=None, app: Flask = None, - fallback_strategy=[ + fallback_strategy=( "gpt-3.5-turbo", "text-davinci-003", "gpt-4", "text-davinci-002", - ], + ), # tuple as we do not want to allow the default to be mutable graceful_string="Sorry, the OpenAI API is currently down", user_email="", user_token="", @@ -28,11 +30,11 @@ def __init__( logging_fn=None, backup_openai_key="", caching=False, - add_cache_func=None, - read_cache_func=None, + cache_store: BaseCache = None, alerting=None, max_threads=None, verbose=False, + **kwargs, ): # Initialize instance variables self.model = model @@ -49,13 +51,16 @@ def __init__( self.max_threads = max_threads self.print_verbose(f"INIT with threads {self.max_threads} {self.caching} {max_threads}") self.alerting = alerting - self.add_cache_func = add_cache_func - self.read_cache_func = read_cache_func + self.cache_store: BaseCache = self.init_cache(cache_store) self.app = app if self.app: self.app.register_error_handler(Exception, self.handle_unhandled_exception) self.app.register_error_handler(500, self.handle_unhandled_exception) + @staticmethod + def init_cache(cache_store: BaseCache): + return cache_store or DefaultCache() + def handle_unhandled_exception(self, e): self.print_verbose(colored("UNHANDLED EXCEPTION OCCURRED", "red")) if self.alerting: @@ -94,7 +99,7 @@ def __call__(self, *args, **kwargs): print(kwargs["messages"]) input_prompt = "\n".join(message["content"] for message in kwargs["messages"]) self.print_verbose("queue depth is higher than the threshold, start caching") - result = self.try_cache_request(query=input_prompt) + result = self.try_cache_request(input_prompt=input_prompt) if self.alerting: # save_exception self.alerting.add_error( @@ -137,66 +142,35 @@ def __call__(self, *args, **kwargs): self.print_verbose("catches the error") return self.handle_exception(args, kwargs, e) - def add_cache(self, input_prompt, response): + def add_cache(self, input_prompt: str, response: str): + if not self.caching: + return + try: - if self.caching: - if self.add_cache_func: - self.add_cache_func(input_prompt, response) - return - else: - if request: - if request.args and request.args.get("user_email"): - customer_id = request.args.get("user_email") - if request.args.get("instance_id"): - instance_id = request.args.get("instance_id") - else: - instance_id = 0000 # default instance id if none passed in - user_email = self.user_email - url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/add_cache" - querystring = { - "customer_id": customer_id, - "instance_id": instance_id, - "user_email": user_email, - "input_prompt": input_prompt, - "response": response, - } - response = requests.post(url, params=querystring) + kwargs: dict = { + "request": request, + "user_email": self.user_email, + "customer_id": request.args.get("user_email"), + } + return self.cache_store.put(input_prompt=input_prompt, response=response, **kwargs) except BaseException: pass - def try_cache_request(self, query=None): + def try_cache_request(self, input_prompt=None): + if not input_prompt or not self.caching: + return + try: - if query: - self.print_verbose("Inside the cache") - if self.read_cache_func: - cache_result = self.read_cache_func(query) - return cache_result - else: - if request: - if request.args and request.args.get("user_email"): - customer_id = request.args.get("user_email") - if request.args.get("instance_id"): - instance_id = request.args.get("instance_id") - else: - instance_id = 0000 # default instance id if none passed in - user_email = self.user_email - url = "https://reliablegpt-logging-server-7nq8.zeet-berri.zeet.app/get_cache" - querystring = { - "customer_id": customer_id, - "instance_id": instance_id, - "user_email": user_email, - "input_prompt": query, - } - response = requests.get(url, params=querystring) - self.print_verbose(f"cached response: {response.json()}") - extracted_result = response.json()["response"] - results = {"choices": [{"message": {"content": extracted_result}}]} - return results + self.print_verbose("Inside the cache") + kwargs: dict = { + "request": request, + "user_email": self.user_email, + "customer_id": request.args.get("user_email"), + } + return self.cache_store.get(input_prompt=input_prompt, **kwargs) except BaseException: traceback.print_exc() - pass self.print_verbose("cache miss!") - return None def fallback_request(self, args, kwargs, fallback_strategy): try: @@ -393,7 +367,7 @@ def handle_exception(self, args, kwargs, e): if "messages" in kwargs and self.caching: print(kwargs["messages"]) input_prompt = "\n".join(message["content"] for message in kwargs["messages"]) - cached_response = self.try_cache_request(query=input_prompt) + cached_response = self.try_cache_request(input_prompt=input_prompt) if cached_response is None: pass else: diff --git a/reliablegpt/key_management.py b/reliablegpt/key_management.py new file mode 100644 index 0000000..4aad882 --- /dev/null +++ b/reliablegpt/key_management.py @@ -0,0 +1,54 @@ +import openai +import requests + + +class reliableKey: + token = "your-token-here" + hot_cache = {} + api_url = "https://reliable-gpt-backend-9gus.zeet-berri.zeet.app" + valid_api_key = True + invalid_key_value = None + recent_get_key_params = None + + class AuthenticationError(openai.error.AuthenticationError): + def __init__(self, *args, **kwargs): + reliableKey.set_invalid_key(openai.api_key) + super().__init__(*args, **kwargs) + + @classmethod + def set_invalid_key(cls, invalid_key): + print(f"calling set invalid key!!: {invalid_key}") + cls.valid_api_key = False + cls.invalid_key_value = invalid_key + if cls.recent_get_key_params: + openai.api_key = cls.get_key( + llm_provider=cls.recent_get_key_params["llm_provider"], + local_token=cls.recent_get_key_params["local_token"], + ) + + @classmethod + def get_key(cls, llm_provider, local_token=None): + cls.recent_get_key_params = {"llm_provider": llm_provider, "local_token": local_token} + try: + print(f"valid api key in get key: {cls.valid_api_key}") + api_key = None + if llm_provider in cls.hot_cache and cls.valid_api_key: + api_key = cls.hot_cache[llm_provider] + else: + querystring = {"llm_provider": llm_provider, "token": cls.token} + if local_token: + querystring["local_token"] = local_token + if not cls.valid_api_key: + print(f"invalid key value in get_key: {cls.invalid_key_value}") + querystring["invalid_api_key"] = cls.invalid_key_value + response = requests.get(cls.api_url + "/get_key", params=querystring) + print(response.text) + api_key = response.json()["api_key"] + cls.hot_cache[llm_provider] = api_key + cls.valid_api_key = True + return api_key + except Exception: + raise Exception( + "Error caused due to either a bad token or non-existent llm provider. If you're testing locally," + " make sure to download your .env containing your local token." + ) diff --git a/reliablegpt/main.py b/reliablegpt/main.py index 6f53e66..14993b2 100644 --- a/reliablegpt/main.py +++ b/reliablegpt/main.py @@ -1,10 +1,10 @@ # # Prod Imports + import requests -from flask import Flask -# # Dev Imports +# Dev Imports # from IndividualRequest import IndividualRequest -# from reliablegpt.model import Model +# from Model import Model # from Alerting import Alerting from posthog import Posthog @@ -12,23 +12,12 @@ from reliablegpt.individual_request import IndividualRequest from reliablegpt.model import Model -posthog = Posthog( - project_api_key="phc_yZ30KsPzRXd3nYaET3VFDmquFKtMZwMTuFKVOei6viB", - host="https://app.posthog.com", -) +posthog = Posthog(project_api_key="phc_yZ30KsPzRXd3nYaET3VFDmquFKtMZwMTuFKVOei6viB", host="https://app.posthog.com") alerting = Alerting() -def save_exception( - type, - user_email, - result="", - original_error="", - error2="", - function_name="", - kwargs={}, -): +def save_exception(type, user_email, result="", original_error="", error2="", function_name="", kwargs={}): try: # print("in save exception on reliableGPT") # url = 'http://0.0.0.0:5000/save_exception' @@ -46,7 +35,7 @@ def save_exception( # print(f"in save exception on reliableGPT, sending req {data}") response = requests.post(url, json=data) except Exception: - return + pass return response @@ -117,32 +106,29 @@ def save_request( for error in errors: alerting.add_error(error) # send_emails_task(self.user_email, posthog_metadata, self.send_notification) - except BaseException: + except: # noqa + pass return # safe function, should not impact error handling if logging fails def reliableGPT( openai_create_function, - app: Flask = None, - fallback_strategy=[ - "gpt-3.5-turbo", - "text-davinci-003", - "gpt-4", - "text-davinci-002", - ], + fallback_strategy=["gpt-3.5-turbo", "text-davinci-003", "gpt-4", "text-davinci-002"], + azure_fallback_strategy=None, graceful_string="Sorry, the OpenAI API is currently down", user_email="", user_token="", send_notification=True, caching=False, - add_cache_func=None, - read_cache_func=None, max_threads=None, backup_openai_key=None, + _test=False, verbose=False, + queue_requests=False, + model_limits_dir=None, ): - """Determine if an instantiation is calling the rate limit handler - or the individual request wrapper directly and return the correct object""" + """Determine if an instantiation is calling the rate limit handler or the individual request wrapper + directly and return the correct object""" primary_email = "" # which api key management is mapped to ## Add email for alerting @@ -161,8 +147,8 @@ def reliableGPT( ## Route to the right object return IndividualRequest( model, - app=app, fallback_strategy=fallback_strategy, + azure_fallback_strategy=azure_fallback_strategy, graceful_string=graceful_string, user_email=primary_email, user_token=user_token, @@ -170,9 +156,8 @@ def reliableGPT( send_notification=send_notification, backup_openai_key=backup_openai_key, caching=caching, - add_cache_func=None, - read_cache_func=None, max_threads=max_threads, alerting=alerting, + _test=_test, verbose=verbose, ) diff --git a/reliablegpt/settings.py b/reliablegpt/settings.py new file mode 100644 index 0000000..f3ff348 --- /dev/null +++ b/reliablegpt/settings.py @@ -0,0 +1,19 @@ +from pydantic import BaseSettings, Field + + +class Settings(BaseSettings): + """Validations and defaults for environment variables. In the future this should be used to load + and validate all the env variables as it's currently the preferred go-to approach in Python world""" + + ENVIRONMENT: str = Field(env="ENVIRONMENT", default="local") + APP_NAME: str = "reliablegpt" + + REDIS_HOST: str = Field(env="REDIS_HOST", default="localhost") + REDIS_PORT: int = Field(env="REDIS_PORT", default=6379) + REDIS_DB: int = Field(env="REDIS_DB", default=0) + + class Config: + env_file = ".env" + + +settings = Settings() diff --git a/setup.py b/setup.py index a1d96b9..d988231 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name="reliableGPT", - version="0.2.981", + version="0.2.995", description="Error handling and auto-retry library for GPT", author="Ishaan Jaffer", packages=["reliablegpt"], diff --git a/tests/test_SimpleLoad/__pycache__/test_simplecache.cpython-311.pyc b/tests/test_SimpleLoad/__pycache__/test_simplecache.cpython-311.pyc new file mode 100644 index 0000000..d29dab8 Binary files /dev/null and b/tests/test_SimpleLoad/__pycache__/test_simplecache.cpython-311.pyc differ diff --git a/tests/test_individual.py b/tests/test_individual.py index e876c09..02b4e18 100644 --- a/tests/test_individual.py +++ b/tests/test_individual.py @@ -6,6 +6,7 @@ import sys import openai +import pytest from dotenv import load_dotenv from reliablegpt import reliableGPT @@ -76,8 +77,8 @@ def get_embedding(text, model="text-embedding-ada-002"): print("text") return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"] - result = get_embedding("GM") - print(result) + with pytest.raises(TypeError): + get_embedding("GM") test_embedding_bad_key() diff --git a/tests/test_individual_request.py b/tests/test_individual_request.py index 424bdf5..21624e1 100644 --- a/tests/test_individual_request.py +++ b/tests/test_individual_request.py @@ -6,6 +6,7 @@ import sys import openai +import pytest from dotenv import load_dotenv from reliablegpt.main import reliableGPT @@ -73,8 +74,8 @@ def get_embedding(text, model="text-embedding-ada-002"): print("text") return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"] - result = get_embedding("GM") - print(result) + with pytest.raises(TypeError): + get_embedding("GM") # test_embedding_bad_key() @@ -90,8 +91,8 @@ def get_embedding(text, model="text-embedding-ada-002"): print("text") return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"] - result = get_embedding("GM") - print(result) + with pytest.raises(TypeError): + get_embedding("GM") # test_embedding_bad_key_fail() diff --git a/tests/test_model.py b/tests/test_model.py index aa89d1c..6fc8f15 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -3,6 +3,7 @@ import openai from dotenv import load_dotenv +from openai.error import APIConnectionError, InvalidRequestError from reliablegpt.model import Model @@ -18,4 +19,7 @@ create_completion = obj.get_original_completion() -print(create_completion(model="text-davinci-003", prompt="Hello world")) +try: + print(create_completion(model="text-davinci-003", prompt="Hello world")) +except (APIConnectionError, InvalidRequestError): + print("API Connection Error, openai not available") diff --git a/tests/test_q.py b/tests/test_q.py index 6ba2a00..623a407 100644 --- a/tests/test_q.py +++ b/tests/test_q.py @@ -3,6 +3,7 @@ import time import openai +import pytest from dotenv import load_dotenv from reliablegpt import reliableGPT @@ -76,7 +77,8 @@ def get_embedding(text, model="text-embedding-ada-002"): print("text") return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"] - get_embedding("GM") + with pytest.raises(TypeError): + get_embedding("GM") test_embedding_bad_key() diff --git a/tests/test_rate_limit_handler.py b/tests/test_rate_limit_handler.py index f4beb5f..83ab258 100644 --- a/tests/test_rate_limit_handler.py +++ b/tests/test_rate_limit_handler.py @@ -6,6 +6,7 @@ import time import openai +import pytest from dotenv import load_dotenv from reliablegpt.main import reliableGPT @@ -75,7 +76,8 @@ def get_embedding(text, model="text-embedding-ada-002"): print("text") return openai.Embedding.create(input=[text], model=model)["data"][0]["embedding"] - get_embedding("GM") + with pytest.raises(TypeError): + get_embedding("GM") test_embedding_bad_key()