From 00e7c9a9672e7c7eee80e2917484c0062d700905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Chaves?= Date: Tue, 23 Jul 2024 13:15:43 +0200 Subject: [PATCH] Prevent failing on greetings, division by zero errors, add reasoning and better descriptions --- .../query_resolution_evaluator.py | 61 +++++++++------- .../tests/test_query_resolution_evaluator.py | 70 ++++++++++++++++--- poetry.lock | 27 ------- 3 files changed, 96 insertions(+), 62 deletions(-) diff --git a/evaluators/langevals/langevals_langevals/query_resolution_evaluator.py b/evaluators/langevals/langevals_langevals/query_resolution_evaluator.py index e9a9ab8..efa2361 100644 --- a/evaluators/langevals/langevals_langevals/query_resolution_evaluator.py +++ b/evaluators/langevals/langevals_langevals/query_resolution_evaluator.py @@ -16,6 +16,7 @@ Money, ) + class QueryResolutionConversationMessageEntry(EvaluatorEntry): input: str output: str @@ -33,15 +34,18 @@ class QueryResolutionConversationSettings(BaseModel): "openai/gpt-4-turbo", "openai/gpt-4-0125-preview", "openai/gpt-4-1106-preview", + "openai/gpt-4o", + "openai/gpt-4o-mini", "azure/gpt-35-turbo-1106", "azure/gpt-4-turbo-2024-04-09", "azure/gpt-4-1106-preview", + "azure/gpt-4o", "groq/llama3-70b-8192", "anthropic/claude-3-haiku-20240307", "anthropic/claude-3-sonnet-20240229", "anthropic/claude-3-opus-20240229", ] = Field( - default="azure/gpt-35-turbo-1106", + default="openai/gpt-4o-mini", description="The model to use for evaluation", ) max_tokens: int = Field( @@ -53,10 +57,7 @@ class QueryResolutionConversationSettings(BaseModel): class QueryResolutionConversationResult(EvaluationResult): score: float passed: bool = Field(default=True) - details: Optional[str] = Field( - default="2 querries were resolved in this conversation" - ) - + details: Optional[str] class QueryResolutionConversationEvaluator( @@ -67,7 +68,7 @@ class QueryResolutionConversationEvaluator( ] ): """ - This evaluator checks if all the querries of the user were resolved by the LLM. + This evaluator checks if all the user queries in the conversation were resolved. Useful to detect when the bot doesn't know how to answer or can't help the user. """ name = "Query Resolution Conversation Evaluator" @@ -120,7 +121,6 @@ def evaluate( List[dict[str, str]], trim_messages(messages, litellm_model, max_tokens=max_tokens), ) - print(messages) response = litellm.completion( model=litellm_model, @@ -130,50 +130,57 @@ def evaluate( "type": "function", "function": { "name": "query_resolution_evaluator", - "description": "Evaluate if all of the querries were resolved", + "description": "Evaluate if all of the queries were answered", "parameters": { "type": "object", "properties": { - "querries_total": { - "type": "number", - "description": "Number of total user querries in the dialogue", + "reasoning": { + "type": "string", + "description": "Reasoning for the answer", }, - "querries_resolved": { + "queries_total": { "type": "number", - "description": "Number of resolved user querries in the dialogue", + "description": "Number of total user queries in the dialogue, greetings and non-requests do not count", }, - "were_resolved": { - "type": "boolean", - "description": "True if all querries were resolved, false if not", + "queries_answered": { + "type": "number", + "description": "Number of resolved user queries in the dialogue", }, }, "required": [ - "were_resolved", - "querries_total", - "querries_resolved", + "reasoning", + "queries_total", + "queries_answered", ], }, }, }, ], - tool_choice={"type": "function", "function": {"name": "query_resolution_evaluator"}}, # type: ignore + tool_choice={ + "type": "function", + "function": {"name": "query_resolution_evaluator"}, + }, ) response = cast(ModelResponse, response) choice = cast(Choices, response.choices[0]) arguments = json.loads( cast(Message, choice.message).tool_calls[0].function.arguments ) - print(choice) cost = completion_cost(completion_response=response, prompt=prompt) - passed: bool = cast(bool, arguments["were_resolved"]) - total_querries: int = arguments["querries_total"] - resolved_querries: int = arguments["querries_resolved"] - resolution_ratio: float = resolved_querries / total_querries + reasoning: str = arguments["reasoning"] + passed: bool = arguments["queries_answered"] == arguments["queries_total"] + total_queries: int = arguments["queries_total"] + resolved_queries: int = arguments["queries_answered"] + resolution_ratio: float = ( + 1 + if resolved_queries == 0 and total_queries == 0 + else resolved_queries / max(total_queries, 1) + ) cost = completion_cost(completion_response=response) details: str = ( - f"There were {total_querries} querries in total and {resolved_querries} of them were resolved in the conversation." + f"There were {total_queries} queries in total and {resolved_queries} of them were resolved in the conversation. Reasoning: {reasoning}" ) return QueryResolutionConversationResult( @@ -181,4 +188,4 @@ def evaluate( score=resolution_ratio, details=details, cost=Money(amount=cost, currency="USD") if cost else None, - ) \ No newline at end of file + ) diff --git a/evaluators/langevals/tests/test_query_resolution_evaluator.py b/evaluators/langevals/tests/test_query_resolution_evaluator.py index 6750667..714bbd2 100644 --- a/evaluators/langevals/tests/test_query_resolution_evaluator.py +++ b/evaluators/langevals/tests/test_query_resolution_evaluator.py @@ -7,15 +7,41 @@ QueryResolutionConversationEntry, QueryResolutionConversationSettings, QueryResolutionConversationResult, - QueryResolutionConversationEvaluator + QueryResolutionConversationEvaluator, ) +def test_query_resolution_conversation_evaluator_pass_for_simple_greetings(): + response1 = QueryResolutionConversationMessageEntry( + input="Hey, how are you?", + output="Hello, I am an assistant and I don't have feelings", + ) + conversation = QueryResolutionConversationEntry(conversation=[response1]) + settings = QueryResolutionConversationSettings( + model="openai/gpt-4o-mini", max_tokens=10000 + ) + evaluator = QueryResolutionConversationEvaluator(settings=settings) + result = evaluator.evaluate(conversation) + + assert result.status == "processed" + assert result.score == 1 + assert result.passed == True + assert result.details + + def test_query_resolution_conversation_evaluator_pass(): - response1 = QueryResolutionConversationMessageEntry(input="Hey, how are you?", output="Hello, I am an assistant and I don't have feelings") - response2 = QueryResolutionConversationMessageEntry(input="Okay, is there a president in the Netherlands? Also, tell me what is the system of government in the Netherlands?", output="There is no president in the Netherlands. The system of government is constitutional monarchy.") + response1 = QueryResolutionConversationMessageEntry( + input="Hey, how are you?", + output="Hello, I am an assistant and I don't have feelings", + ) + response2 = QueryResolutionConversationMessageEntry( + input="Okay, is there a president in the Netherlands? Also, tell me what is the system of government in the Netherlands?", + output="There is no president in the Netherlands. The system of government is constitutional monarchy.", + ) conversation = QueryResolutionConversationEntry(conversation=[response1, response2]) - settings = QueryResolutionConversationSettings(model='openai/gpt-3.5-turbo-1106', max_tokens=10000) + settings = QueryResolutionConversationSettings( + model="openai/gpt-4o-mini", max_tokens=10000 + ) evaluator = QueryResolutionConversationEvaluator(settings=settings) result = evaluator.evaluate(conversation) @@ -24,11 +50,20 @@ def test_query_resolution_conversation_evaluator_pass(): assert result.passed == True assert result.details + def test_query_resolution_conversation_evaluator_fail(): - response1 = QueryResolutionConversationMessageEntry(input="Hey, how are you?", output="Hello, I am an assistant and I don't have feelings") - response2 = QueryResolutionConversationMessageEntry(input="Okay, is there a president in the Netherlands? Also, what equals 2 + 2? How many paws does a standard dog have?", output="There is no president in the Netherlands.") + response1 = QueryResolutionConversationMessageEntry( + input="Hey, how are you?", + output="Hello, I am an assistant and I don't have feelings", + ) + response2 = QueryResolutionConversationMessageEntry( + input="Okay, is there a president in the Netherlands? Also, what equals 2 + 2? How many paws does a standard dog have?", + output="There is no president in the Netherlands.", + ) conversation = QueryResolutionConversationEntry(conversation=[response1, response2]) - settings = QueryResolutionConversationSettings(model='openai/gpt-3.5-turbo-1106', max_tokens=10000) + settings = QueryResolutionConversationSettings( + model="openai/gpt-4o-mini", max_tokens=10000 + ) evaluator = QueryResolutionConversationEvaluator(settings=settings) result = evaluator.evaluate(conversation) @@ -38,12 +73,31 @@ def test_query_resolution_conversation_evaluator_fail(): assert result.details +def test_query_resolution_conversation_evaluator_fails_with_i_dont_know(): + response1 = QueryResolutionConversationMessageEntry( + input="What time is it?", + output="Sorry, I don't have any information about the current time", + ) + conversation = QueryResolutionConversationEntry(conversation=[response1]) + settings = QueryResolutionConversationSettings( + model="openai/gpt-4o-mini", max_tokens=10000 + ) + evaluator = QueryResolutionConversationEvaluator(settings=settings) + result = evaluator.evaluate(conversation) + + assert result.status == "processed" + assert result.score == 0.0 + assert result.passed == False + assert result.details + def test_product_sentiment_polarity_evaluator_skipped_for_non_product_related_outputs(): response1 = QueryResolutionConversationMessageEntry(input="", output="") response2 = QueryResolutionConversationMessageEntry(input="", output="") conversation = QueryResolutionConversationEntry(conversation=[response1, response2]) - settings = QueryResolutionConversationSettings(model='openai/gpt-3.5-turbo-1106', max_tokens=10000) + settings = QueryResolutionConversationSettings( + model="openai/gpt-4o-mini", max_tokens=10000 + ) evaluator = QueryResolutionConversationEvaluator(settings=settings) result = evaluator.evaluate(conversation) diff --git a/poetry.lock b/poetry.lock index c85dd6a..650ab53 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2077,9 +2077,6 @@ files = [ {file = "lingua_language_detector-2.0.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:51adc3ac5c39a1d245394e6f02a197896e380b908642f4a19bef7554029f6437"}, {file = "lingua_language_detector-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:013a57405ce9b5d03250fc50cd09b10122f21398851c4ecce98647fe7585b5f4"}, {file = "lingua_language_detector-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d24190b5e75c466fe3117310aeae2d11e30e62dfb531c288a85b9b6ab11c94e2"}, - {file = "lingua_language_detector-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4e162f9aa34c4f78bc48a69b557b58f783e1ee1dd369e99ab7d2b14bdac3447f"}, - {file = "lingua_language_detector-2.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a8092529499ab8bb1beece1a9f4c241b1d0c3ab6c36b181833c4107b81ae5d1d"}, - {file = "lingua_language_detector-2.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ce3233f1c05c623eafdbfb751bd8ac47e20c4bfd744ba6dda5d5c47db7149425"}, {file = "lingua_language_detector-2.0.2-cp310-none-win32.whl", hash = "sha256:ffa8eff2bbfbf80469a6c4ee3864ccfd4dc7150717e9a1abcf4580b354ccea10"}, {file = "lingua_language_detector-2.0.2-cp310-none-win_amd64.whl", hash = "sha256:745befc3a1e4c9510d00ad34cac206b678944257fc8b5c1cd7b512310cd7fdbd"}, {file = "lingua_language_detector-2.0.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:14216ee3aeb0c9ab6a5665d71a1399653fe635ed66f208165ed67346feeb2a5c"}, @@ -2087,9 +2084,6 @@ files = [ {file = "lingua_language_detector-2.0.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a7ae33db037acb47c6517a938885dab4b8bf14e6d6b27a9fa7e237e8680babbc"}, {file = "lingua_language_detector-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6b22ad7d05db4ae6ef8ff127ccee2afb456941ddd781dc8675f110f77de8337"}, {file = "lingua_language_detector-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d39aa5ca1b2d51aee46c7c96fa7ad0463dd2471a1b9827019b71fa367c918be"}, - {file = "lingua_language_detector-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d1502bb5e33a9f535b735cb8a898d96b81a63d19a1d2143f76e3b1ae7b7651ae"}, - {file = "lingua_language_detector-2.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d72a650be1c44e69dacac26aa7ab354790f95191bc830b3d43ab32ec71388a25"}, - {file = "lingua_language_detector-2.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c9588ed7e1dfbe06190d6946cd0a9c0f4f22018f09dc37bb6ac686bcfd67907"}, {file = "lingua_language_detector-2.0.2-cp311-none-win32.whl", hash = "sha256:c0a9fcaaf3a05b7b0b199414bfcdfc06a90b6779bfc37f784fafd45a0dad3201"}, {file = "lingua_language_detector-2.0.2-cp311-none-win_amd64.whl", hash = "sha256:7ca5e4643cbb229c4eaae198458a5fafdeb812576edb3a160a5c2e4951d3cd1c"}, {file = "lingua_language_detector-2.0.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f5abfba01b9d1d4e23c647871203692f6e14cbd41a5d99a19ae3504e987a175c"}, @@ -2097,9 +2091,6 @@ files = [ {file = "lingua_language_detector-2.0.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3a9395f4030cf6eaaa7e432cb167fbaa577109c38114ab1dbdfdd75693b3048b"}, {file = "lingua_language_detector-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed54511cc9e4bb721c7f0530870494918985fabf3a30c1fe9a26649416ed83c7"}, {file = "lingua_language_detector-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1571a68601a60b3eaf246ce9c2ad7b9d515609116f3a01c7536f20e2f9e7437"}, - {file = "lingua_language_detector-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:652936f5e109784528f643062c704ad02572994cf05cfb7c609f96f0ae6259ed"}, - {file = "lingua_language_detector-2.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5fcc06b49c65cf6083afc7b6bd6ea26a43da8107d849842e4647a19c0ce68f66"}, - {file = "lingua_language_detector-2.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9012c74eea7d07c63c47fceaa3a6bc1e216954107b08beb421b64c717912be0d"}, {file = "lingua_language_detector-2.0.2-cp312-none-win32.whl", hash = "sha256:9a256aadabf76a915910dd430724592f417942a443dc980a325a154c3f93f547"}, {file = "lingua_language_detector-2.0.2-cp312-none-win_amd64.whl", hash = "sha256:72866175ff3d78b3d9244932ffbbb731471bca3758a2a825c60331ecdfb10851"}, {file = "lingua_language_detector-2.0.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:99e59214d7f9a7f11f812b416cabfccfcdb6bc52a0cf67aa59f4d984d5e1296f"}, @@ -2107,9 +2098,6 @@ files = [ {file = "lingua_language_detector-2.0.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b30bd3e63d8f0df6527b626c6eaf3836427ebf67dbdd527affbcedad0aa62cc4"}, {file = "lingua_language_detector-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bc34b9331fc2ded8a78610ac406fa0cb4772a43d6280ee7830cb507ff78a9d5"}, {file = "lingua_language_detector-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b75e2669df01fc49429a586aada9b316d0142aa5e1fcb692efe679c0beaef4"}, - {file = "lingua_language_detector-2.0.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:acc85b33c2f5faa46c1f49d184b990c8e6ef9b8d9aabcc720a2f018c2392de44"}, - {file = "lingua_language_detector-2.0.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f1fd7d870148dcc73f871f05ad321884efb08d26325ffb5d2a12b03ab9d25043"}, - {file = "lingua_language_detector-2.0.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bd4ee12cb7e8e6b6a201617d2a45b5ca6bbae0c29396326ab247f574997f556b"}, {file = "lingua_language_detector-2.0.2-cp38-none-win32.whl", hash = "sha256:d9cf3b724c422c9902c8370c20725e321df5d6a53f98cba7210c02cd5d0fcb30"}, {file = "lingua_language_detector-2.0.2-cp38-none-win_amd64.whl", hash = "sha256:278fa16dcb6b595daae796606dade38f80bcbf630f4816489a3ce0d719a71214"}, {file = "lingua_language_detector-2.0.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:c568d1bc24ccf61a76d3b181139dbc519180f14e2eca437ba1e10a62efaf9e4a"}, @@ -2117,9 +2105,6 @@ files = [ {file = "lingua_language_detector-2.0.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:815f3290ab251907e142b82969a1d251c1c03d9ec2c71c8fbe5dc87f46152590"}, {file = "lingua_language_detector-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01b69fc794474611978bbc922cbff154ef390287df47c1a48699c589a78587a2"}, {file = "lingua_language_detector-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40629aeac21a3cbc6ea45b925c6adab66badd6c9fc1885285f2aa27658b86157"}, - {file = "lingua_language_detector-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15beab4230e16c38cc88e50548076943e960476b2681e9873d764770173c1d3d"}, - {file = "lingua_language_detector-2.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2f788707484686e584e947bbc526fae13759c2bcfe57d8076e3b20c2278d0e0"}, - {file = "lingua_language_detector-2.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:daf792f938601d161e93ab8c46b0aee2facc187c2bb9e87a4ee314d7fc7471a1"}, {file = "lingua_language_detector-2.0.2-cp39-none-win32.whl", hash = "sha256:183c335b8f73286bb67a8a1a780145335af7fd03cc4e4de926da792d1ed120fe"}, {file = "lingua_language_detector-2.0.2-cp39-none-win_amd64.whl", hash = "sha256:48203ec1fbd6be0b6af3888b9494d543b86f3cf8de6f9b1cd08867fa12cd673c"}, {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:fc6f2548fe6aa94ac0a0868cd67b468dc6b03982ecb9d6d04aeb6716d45995c2"}, @@ -2127,25 +2112,16 @@ files = [ {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aa499e82d66e12a242f51de51517d86e4cf0969c29379a9bae16a12853519c80"}, {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eb520f8de3906db10df68c4dcd48c5ed9a3c6eb593d3d94a9875627eead010a"}, {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccb2aa354d659abddcaa067bc403fc32549d1f531ce99b5d4d336b7c796ed111"}, - {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1eeb4390c7b2b570013bbcbfb2292beda4b60e6c22631b27937160814fa38f8d"}, - {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:8286b031302e32ac7a81d4f4f0a379b8ce1031422424eba3b1c8d721b956c4cb"}, - {file = "lingua_language_detector-2.0.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3d2e8a34e4d9830714f1de6728eec182a36d243f038d1b7b71a29cc63408ad2d"}, {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d012d95f863c627d4a57a69084ec768a7add7d8ca5f87eb0b51b05d7f4b17232"}, {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9d26936378cf2d8c081be332f60d5b1b7e6ead66986cff85df00105f146f8aa2"}, {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d4115466f8dc4e63b6dc71fdd17ac39bc5ab334a0f2567237cff5a9f7515655c"}, {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade311c8f7f419e4ad79065b5d757a49550131fc3b18fccb76cb949c562e0705"}, {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e861e49e75d37d26eb5c62c384b473d0641390b5f5f52c5ca30667b6573425"}, - {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9fd26d458356942db1d92b2951f9f6fa3aca0ef843a939c2cdcd8779a5148912"}, - {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:80eaaf6db600303665ab13c582c7818894e28270fee1e1d6af2a36ccc4d5095a"}, - {file = "lingua_language_detector-2.0.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:eb5dc7f0f867e52cc66b2fee861f7442f95a6be7fdca84fc375b8d57b2cae008"}, {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0b5415d527be8e8ef9216c8d5aab8cc8e5271361342777a39133ca7e0e5e9944"}, {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:796ba624c026ef978819d124d0d47685f2aeeec5b92315827187126347e7f406"}, {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4c164c7c9e0a151a986ab52668f57e3de265f0b04fb804a8ff2a5cb8a2fd83d"}, {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1ca58c8b273ac3ea1a0aa5dccb613c4539b1e4eaf236b565836898a70bd03d"}, {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae33435d749478623466aa6315917432de9114226ad0faa7dc02b5bf42faae77"}, - {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:177fd7d5073a96b885daa2059c55d19a306550fed7aadafcfd3037cd8ce44ae1"}, - {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:c7d1ea36a200f5d7e72eca06a3f1648dcd15fa482bf3b075ec3ef90ed57120a0"}, - {file = "lingua_language_detector-2.0.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:436de99680cbe4418295f961d82958bed76c029ab10696a4c46ce0b8d33e369c"}, ] [package.extras] @@ -2899,7 +2875,6 @@ optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, @@ -2920,7 +2895,6 @@ files = [ {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, @@ -3506,7 +3480,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},