From 99034709dcb6e163a440b490a1f429b399ad7439 Mon Sep 17 00:00:00 2001 From: Max Deichmann Date: Mon, 18 Dec 2023 23:32:02 +0100 Subject: [PATCH] improve integration --- langfuse.log | 0 litellm/integrations/langfuse.py | 58 ++++++++---- litellm/tests/langfuse.log | 37 +++++++- litellm/tests/test_langfuse.py | 151 +++++++++++++++++-------------- poetry.lock | 150 ++++++++++++++++-------------- 5 files changed, 240 insertions(+), 156 deletions(-) create mode 100644 langfuse.log diff --git a/langfuse.log b/langfuse.log new file mode 100644 index 000000000..e69de29bb diff --git a/litellm/integrations/langfuse.py b/litellm/integrations/langfuse.py index ea32fa9d1..2a0cd7453 100644 --- a/litellm/integrations/langfuse.py +++ b/litellm/integrations/langfuse.py @@ -8,39 +8,50 @@ from datetime import datetime dotenv.load_dotenv() # Loading env variables using dotenv import traceback + class LangFuseLogger: # Class variables or attributes def __init__(self): try: from langfuse import Langfuse except Exception as e: - raise Exception(f"\033[91mLangfuse not installed, try running 'pip install langfuse' to fix this error: {e}\033[0m") + raise Exception( + f"\033[91mLangfuse not installed, try running 'pip install langfuse' to fix this error: {e}\033[0m" + ) # Instance variables self.secret_key = os.getenv("LANGFUSE_SECRET_KEY") self.public_key = os.getenv("LANGFUSE_PUBLIC_KEY") self.langfuse_host = os.getenv("LANGFUSE_HOST", "https://cloud.langfuse.com") self.langfuse_release = os.getenv("LANGFUSE_RELEASE") self.langfuse_debug = os.getenv("LANGFUSE_DEBUG") - self.Langfuse = Langfuse( + self.Langfuse = Langfuse( public_key=self.public_key, secret_key=self.secret_key, host=self.langfuse_host, release=self.langfuse_release, - debug=self.langfuse_debug + debug=True, ) def log_event(self, kwargs, response_obj, start_time, end_time, print_verbose): # Method definition - from langfuse.model import InitialGeneration, Usage + try: print_verbose( f"Langfuse Logging - Enters logging function for model {kwargs}" ) litellm_params = kwargs.get("litellm_params", {}) - metadata = litellm_params.get("metadata", {}) or {} # if litellm_params['metadata'] == None - prompt = [kwargs.get('messages')] + metadata = ( + litellm_params.get("metadata", {}) or {} + ) # if litellm_params['metadata'] == None + prompt = [kwargs.get("messages")] optional_params = kwargs.get("optional_params", {}) + optional_params.pop("functions", None) + print_verbose( + f"Langfuse Logging - typw: {type(optional_params), optional_params}" + ) + print_verbose(f"Langfuse Logging - optional params: {optional_params}") + # langfuse only accepts str, int, bool, float for logging for param, value in optional_params.items(): if not isinstance(value, (str, int, bool, float)): @@ -49,22 +60,31 @@ class LangFuseLogger: except: # if casting value to str fails don't block logging pass - + # end of processing langfuse ######################## - self.Langfuse.generation(InitialGeneration( + input = prompt + output = response_obj["choices"][0]["message"].json() + + trace = self.Langfuse.trace( + name=metadata.get("generation_name", "litellm-completion"), + input=input, + output=output, + ) + + trace.generation( name=metadata.get("generation_name", "litellm-completion"), startTime=start_time, endTime=end_time, - model=kwargs['model'], + model=kwargs["model"], modelParameters=optional_params, - prompt=prompt, - completion=response_obj['choices'][0]['message'].json(), - usage=Usage( - prompt_tokens=response_obj['usage']['prompt_tokens'], - completion_tokens=response_obj['usage']['completion_tokens'] - ), - metadata=metadata - )) + input=input, + output=output, + usage={ + "prompt_tokens": response_obj["usage"]["prompt_tokens"], + "completion_tokens": response_obj["usage"]["completion_tokens"], + }, + metadata=metadata, + ) self.Langfuse.flush() print_verbose( f"Langfuse Layer Logging - final response object: {response_obj}" @@ -74,5 +94,7 @@ class LangFuseLogger: print_verbose(f"Langfuse Layer Error - {traceback.format_exc()}") pass - async def _async_log_event(self, kwargs, response_obj, start_time, end_time, print_verbose): + async def _async_log_event( + self, kwargs, response_obj, start_time, end_time, print_verbose + ): self.log_event(kwargs, response_obj, start_time, end_time, print_verbose) diff --git a/litellm/tests/langfuse.log b/litellm/tests/langfuse.log index 58cdb5267..597262903 100644 --- a/litellm/tests/langfuse.log +++ b/litellm/tests/langfuse.log @@ -1,4 +1,37 @@ +Using selector: KqueueSelector +consumer is running... +Starting new HTTPS connection (1): litellm-logging.onrender.com:443 +Request options: {'method': 'post', 'url': '/chat/completions', 'files': None, 'json_data': {'messages': [{'role': 'user', 'content': 'This is a test'}], 'model': 'gpt-3.5-turbo', 'max_tokens': 100, 'temperature': 0.7}} +connect_tcp.started host='api.openai.com' port=443 local_address=None timeout=5.0 socket_options=None +connect_tcp.complete return_value= +start_tls.started ssl_context= server_hostname='api.openai.com' timeout=5.0 +start_tls.complete return_value= +send_request_headers.started request= +send_request_headers.complete +send_request_body.started request= +send_request_body.complete +receive_response_headers.started request= +https://litellm-logging.onrender.com:443 "POST /logging HTTP/1.1" 200 38 +receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Date', b'Mon, 18 Dec 2023 21:53:36 GMT'), (b'Content-Type', b'application/json'), (b'Transfer-Encoding', b'chunked'), (b'Connection', b'keep-alive'), (b'access-control-allow-origin', b'*'), (b'Cache-Control', b'no-cache, must-revalidate'), (b'openai-model', b'gpt-3.5-turbo-0613'), (b'openai-organization', b'finto-technologies'), (b'openai-processing-ms', b'314'), (b'openai-version', b'2020-10-01'), (b'strict-transport-security', b'max-age=15724800; includeSubDomains'), (b'x-ratelimit-limit-requests', b'5000'), (b'x-ratelimit-limit-tokens', b'160000'), (b'x-ratelimit-limit-tokens_usage_based', b'160000'), (b'x-ratelimit-remaining-requests', b'4999'), (b'x-ratelimit-remaining-tokens', b'159895'), (b'x-ratelimit-remaining-tokens_usage_based', b'159895'), (b'x-ratelimit-reset-requests', b'12ms'), (b'x-ratelimit-reset-tokens', b'39ms'), (b'x-ratelimit-reset-tokens_usage_based', b'39ms'), (b'x-request-id', b'798c68979c33c09835370164b9c3a523'), (b'CF-Cache-Status', b'DYNAMIC'), (b'Set-Cookie', b'__cf_bm=CbrXQ9eH3xFyKA4RzW3z3LlpLb_1pGPWeFTYPtWcE50-1702936416-1-ASb/OMcdGX68dHUk+/wA7xDISru2gTUlUJCwGntKnQ58aBvxa5I6ws5xiY6cXyT8hm9s5bX09Q4Tdb/b85w3rFs=; path=/; expires=Mon, 18-Dec-23 22:23:36 GMT; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Set-Cookie', b'_cfuvid=hNImRsjGg2JqU2MW6VYVAAMPGT99ADf9XOKBz5pJix0-1702936416944-0-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None'), (b'Server', b'cloudflare'), (b'CF-RAY', b'837aa3b94aa51655-WAW'), (b'Content-Encoding', b'gzip'), (b'alt-svc', b'h3=":443"; ma=86400')]) +receive_response_body.started request= +receive_response_body.complete +response_closed.started +response_closed.complete +HTTP Request: POST https://api.openai.com/v1/chat/completions "200 OK" +Creating trace id='5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed' name='litellm-completion' user_id=None input=[[{'role': 'user', 'content': 'This is a test'}]] output={'content': 'Great! What would you like to test?', 'role': 'assistant'} session_id=None release=None version=None metadata=None public=None +adding task {'id': '3ce30ace-129e-4a4d-b9db-ed42cdfc5bc5', 'type': 'trace-create', 'body': {'id': '5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed', 'name': 'litellm-completion', 'input': [[{'role': 'user', 'content': 'This is a test'}]], 'output': {'content': 'Great! What would you like to test?', 'role': 'assistant'}}} +Creating generation trace_id='5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed' name='litellm-completion' start_time=datetime.datetime(2023, 12, 18, 22, 53, 35, 556108) metadata={} input=[[{'role': 'user', 'content': 'This is a test'}]] output={'content': 'Great! What would you like to test?', 'role': 'assistant'} level=None status_message=None parent_observation_id=None version=None id='215b1635-46e3-4791-878b-6d76213b8559' end_time=datetime.datetime(2023, 12, 18, 22, 53, 36, 522751) completion_start_time=None model='gpt-3.5-turbo' model_parameters={'temperature': '0.7', 'max_tokens': 100} usage=Usage(input=11, output=9, total=None, unit=)... +item size 348 +adding task {'id': '361e8f67-f46f-42ce-bf9b-e5aab7c5aa38', 'type': 'generation-create', 'body': {'traceId': '5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed', 'name': 'litellm-completion', 'startTime': datetime.datetime(2023, 12, 18, 22, 53, 35, 556108), 'metadata': {}, 'input': [[{'role': 'user', 'content': 'This is a test'}]], 'output': {'content': 'Great! What would you like to test?', 'role': 'assistant'}, 'id': '215b1635-46e3-4791-878b-6d76213b8559', 'endTime': datetime.datetime(2023, 12, 18, 22, 53, 36, 522751), 'model': 'gpt-3.5-turbo', 'modelParameters': {'temperature': '0.7', 'max_tokens': 100}, 'usage': {'input': 11, 'output': 9, 'unit': }}} +flushing queue +item size 659 uploading batch of 2 items +uploading data: {'batch': [{'id': '3ce30ace-129e-4a4d-b9db-ed42cdfc5bc5', 'type': 'trace-create', 'body': {'id': '5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed', 'name': 'litellm-completion', 'input': [[{'role': 'user', 'content': 'This is a test'}]], 'output': {'content': 'Great! What would you like to test?', 'role': 'assistant'}}, 'timestamp': datetime.datetime(2023, 12, 18, 21, 53, 36, 524507, tzinfo=tzutc())}, {'id': '361e8f67-f46f-42ce-bf9b-e5aab7c5aa38', 'type': 'generation-create', 'body': {'traceId': '5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed', 'name': 'litellm-completion', 'startTime': datetime.datetime(2023, 12, 18, 22, 53, 35, 556108), 'metadata': {}, 'input': [[{'role': 'user', 'content': 'This is a test'}]], 'output': {'content': 'Great! What would you like to test?', 'role': 'assistant'}, 'id': '215b1635-46e3-4791-878b-6d76213b8559', 'endTime': datetime.datetime(2023, 12, 18, 22, 53, 36, 522751), 'model': 'gpt-3.5-turbo', 'modelParameters': {'temperature': '0.7', 'max_tokens': 100}, 'usage': {'input': 11, 'output': 9, 'unit': }}, 'timestamp': datetime.datetime(2023, 12, 18, 21, 53, 36, 525388, tzinfo=tzutc())}], 'metadata': {'batch_size': 2, 'sdk_integration': 'default', 'sdk_name': 'python', 'sdk_version': '2.0.1', 'public_key': 'pk-lf-1234567890'}} +making request: {"batch": [{"id": "3ce30ace-129e-4a4d-b9db-ed42cdfc5bc5", "type": "trace-create", "body": {"id": "5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed", "name": "litellm-completion", "input": [[{"role": "user", "content": "This is a test"}]], "output": {"content": "Great! What would you like to test?", "role": "assistant"}}, "timestamp": "2023-12-18T21:53:36.524507+00:00"}, {"id": "361e8f67-f46f-42ce-bf9b-e5aab7c5aa38", "type": "generation-create", "body": {"traceId": "5b723fd6-0b1b-4c0a-b254-29a6e1fe29ed", "name": "litellm-completion", "startTime": "2023-12-18T22:53:35.556108+00:00", "metadata": {}, "input": [[{"role": "user", "content": "This is a test"}]], "output": {"content": "Great! What would you like to test?", "role": "assistant"}, "id": "215b1635-46e3-4791-878b-6d76213b8559", "endTime": "2023-12-18T22:53:36.522751+00:00", "model": "gpt-3.5-turbo", "modelParameters": {"temperature": "0.7", "max_tokens": 100}, "usage": {"input": 11, "output": 9, "unit": "TOKENS"}}, "timestamp": "2023-12-18T21:53:36.525388+00:00"}], "metadata": {"batch_size": 2, "sdk_integration": "default", "sdk_name": "python", "sdk_version": "2.0.1", "public_key": "pk-lf-1234567890"}} to http://localhost:3000/api/public/ingestion +Starting new HTTP connection (1): localhost:3000 +http://localhost:3000 "POST /api/public/ingestion HTTP/1.1" 207 145 +received response: {"errors":[],"successes":[{"id":"3ce30ace-129e-4a4d-b9db-ed42cdfc5bc5","status":201},{"id":"361e8f67-f46f-42ce-bf9b-e5aab7c5aa38","status":201}]} successfully uploaded batch of 2 items -uploading batch of 2 items -successfully uploaded batch of 2 items +successfully flushed about 0 items. +joining 1 consumer threads +consumer thread 0 joined diff --git a/litellm/tests/test_langfuse.py b/litellm/tests/test_langfuse.py index 02abbf656..bed1fe1fc 100644 --- a/litellm/tests/test_langfuse.py +++ b/litellm/tests/test_langfuse.py @@ -1,21 +1,25 @@ import sys import os import io, asyncio -# import logging -# logging.basicConfig(level=logging.DEBUG) -sys.path.insert(0, os.path.abspath('../..')) + +import logging + +logging.basicConfig(level=logging.DEBUG) +sys.path.insert(0, os.path.abspath("../..")) from litellm import completion import litellm + litellm.num_retries = 3 litellm.success_callback = ["langfuse"] os.environ["LANGFUSE_DEBUG"] = "True" import time import pytest + def search_logs(log_file_path): """ - Searches the given log file for logs containing the "/api/public" string. + Searches the given log file for logs containing the "/api/public" string. Parameters: - log_file_path (str): The path to the log file to be searched. @@ -27,12 +31,13 @@ def search_logs(log_file_path): - Exception: If there are any bad logs found in the log file. """ import re + print("\n searching logs") bad_logs = [] good_logs = [] all_logs = [] try: - with open(log_file_path, 'r') as log_file: + with open(log_file_path, "r") as log_file: lines = log_file.readlines() print(f"searching logslines: {lines}") for line in lines: @@ -41,145 +46,157 @@ def search_logs(log_file_path): print("Found log with /api/public:") print(line.strip()) print("\n\n") - match = re.search(r'receive_response_headers.complete return_value=\(b\'HTTP/1.1\', (\d+),', line) + match = re.search( + r"receive_response_headers.complete return_value=\(b\'HTTP/1.1\', (\d+),", + line, + ) if match: status_code = int(match.group(1)) if status_code != 200 and status_code != 201: print("got a BAD log") bad_logs.append(line.strip()) else: - good_logs.append(line.strip()) print("\nBad Logs") print(bad_logs) - if len(bad_logs)>0: + if len(bad_logs) > 0: raise Exception(f"bad logs, Bad logs = {bad_logs}") - + print("\nGood Logs") print(good_logs) if len(good_logs) <= 0: - raise Exception(f"There were no Good Logs from Langfuse. No logs with /api/public status 200. \nAll logs:{all_logs}") + raise Exception( + f"There were no Good Logs from Langfuse. No logs with /api/public status 200. \nAll logs:{all_logs}" + ) except Exception as e: raise e + def pre_langfuse_setup(): """ Set up the logging for the 'pre_langfuse_setup' function. """ # sends logs to langfuse.log import logging + # Configure the logging to write to a file logging.basicConfig(filename="langfuse.log", level=logging.DEBUG) logger = logging.getLogger() - + # Add a FileHandler to the logger - file_handler = logging.FileHandler("langfuse.log", mode='w') + file_handler = logging.FileHandler("langfuse.log", mode="w") file_handler.setLevel(logging.DEBUG) logger.addHandler(file_handler) return -@pytest.mark.skip(reason="beta test - checking langfuse output") -def test_langfuse_logging_async(): - try: + +# @pytest.mark.skip(reason="beta test - checking langfuse output") +def test_langfuse_logging_async(): + try: pre_langfuse_setup() litellm.set_verbose = True + async def _test_langfuse(): return await litellm.acompletion( model="gpt-3.5-turbo", - messages=[{"role": "user", "content":"This is a test"}], + messages=[{"role": "user", "content": "This is a test"}], max_tokens=100, temperature=0.7, timeout=5, ) + response = asyncio.run(_test_langfuse()) print(f"response: {response}") # time.sleep(2) # # check langfuse.log to see if there was a failed response # search_logs("langfuse.log") - except litellm.Timeout as e: + except litellm.Timeout as e: pass - except Exception as e: + except Exception as e: pytest.fail(f"An exception occurred - {e}") -test_langfuse_logging_async() -@pytest.mark.skip(reason="beta test - checking langfuse output") +# test_langfuse_logging_async() + + def test_langfuse_logging(): try: pre_langfuse_setup() litellm.set_verbose = True - response = completion(model="claude-instant-1.2", - messages=[{ - "role": "user", - "content": "Hi 👋 - i'm claude" - }], - max_tokens=10, - temperature=0.2, - ) + response = completion( + model="claude-instant-1.2", + messages=[{"role": "user", "content": "Hi 👋 - i'm claude"}], + max_tokens=10, + temperature=0.2, + ) print(response) # time.sleep(5) # # check langfuse.log to see if there was a failed response # search_logs("langfuse.log") - except litellm.Timeout as e: + except litellm.Timeout as e: pass except Exception as e: pytest.fail(f"An exception occurred - {e}") -test_langfuse_logging() -@pytest.mark.skip(reason="beta test - checking langfuse output") +# test_langfuse_logging() + + def test_langfuse_logging_stream(): try: - litellm.set_verbose=True - response = completion(model="anyscale/meta-llama/Llama-2-7b-chat-hf", - messages=[{ - "role": "user", - "content": "this is a streaming test for llama2 + langfuse" - }], - max_tokens=20, - temperature=0.2, - stream=True - ) + litellm.set_verbose = True + response = completion( + model="gpt-3.5-turbo", + messages=[ + { + "role": "user", + "content": "this is a streaming test for llama2 + langfuse", + } + ], + max_tokens=20, + temperature=0.2, + stream=True, + ) print(response) for chunk in response: pass # print(chunk) - except litellm.Timeout as e: + except litellm.Timeout as e: pass except Exception as e: print(e) + # test_langfuse_logging_stream() + @pytest.mark.skip(reason="beta test - checking langfuse output") def test_langfuse_logging_custom_generation_name(): try: - litellm.set_verbose=True - response = completion(model="gpt-3.5-turbo", - messages=[{ - "role": "user", - "content": "Hi 👋 - i'm claude" - }], - max_tokens=10, - metadata = { - "langfuse/foo": "bar", - "langsmith/fizz": "buzz", - "prompt_hash": "asdf98u0j9131123" - } + litellm.set_verbose = True + response = completion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "Hi 👋 - i'm claude"}], + max_tokens=10, + metadata={ + "langfuse/foo": "bar", + "langsmith/fizz": "buzz", + "prompt_hash": "asdf98u0j9131123", + }, ) print(response) - except litellm.Timeout as e: + except litellm.Timeout as e: pass except Exception as e: pytest.fail(f"An exception occurred - {e}") print(e) -# test_langfuse_logging_custom_generation_name() -@pytest.mark.skip(reason="beta test - checking langfuse output") + def test_langfuse_logging_function_calling(): + litellm.set_verbose = True function1 = [ { "name": "get_current_weather", @@ -198,21 +215,17 @@ def test_langfuse_logging_function_calling(): } ] try: - response = completion(model="gpt-3.5-turbo", - messages=[{ - "role": "user", - "content": "what's the weather in boston" - }], - temperature=0.1, - functions=function1, - ) + response = completion( + model="gpt-3.5-turbo", + messages=[{"role": "user", "content": "what's the weather in boston"}], + temperature=0.1, + functions=function1, + ) print(response) - except litellm.Timeout as e: + except litellm.Timeout as e: pass except Exception as e: print(e) -# test_langfuse_logging_function_calling() - - +test_langfuse_logging_function_calling() diff --git a/poetry.lock b/poetry.lock index 1d8765bfd..95a076474 100644 --- a/poetry.lock +++ b/poetry.lock @@ -394,72 +394,88 @@ typing = ["typing-extensions (>=4.8)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {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"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] @@ -787,13 +803,13 @@ files = [ [[package]] name = "openai" -version = "1.3.8" +version = "1.5.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.3.8-py3-none-any.whl", hash = "sha256:ac5a17352b96db862390d2e6f51de9f7eb32e733f412467b2f160fbd3d0f2609"}, - {file = "openai-1.3.8.tar.gz", hash = "sha256:54963ff247abe185aad6ee443820e48ad9f87eb4de970acb2514bc113ced748c"}, + {file = "openai-1.5.0-py3-none-any.whl", hash = "sha256:42d8c84b0714c990e18afe81d37f8a64423e8196bf7157b8ea665b8d8f393253"}, + {file = "openai-1.5.0.tar.gz", hash = "sha256:4cd91e97988ccd6c44f815107def9495cbc718aeb8b28be33a87b6fa2c432508"}, ] [package.dependencies] @@ -1566,5 +1582,5 @@ proxy-otel = [] [metadata] lock-version = "2.0" -python-versions = "^3.8.1" -content-hash = "4a017b5085b0c46d270e45977a88d1fe1812ddb413cf127dcf1d2e6b39fee286" +python-versions = "^3.8" +content-hash = "0c7e9d5e1582996b2a1390772d230c5eda997e216ace8d996c183ecadef226c3"