model-library 0.1.9__tar.gz → 0.1.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. {model_library-0.1.9 → model_library-0.1.10}/PKG-INFO +2 -2
  2. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/google/google.py +14 -3
  3. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/openai.py +7 -1
  4. {model_library-0.1.9 → model_library-0.1.10}/model_library.egg-info/PKG-INFO +2 -2
  5. {model_library-0.1.9 → model_library-0.1.10}/model_library.egg-info/requires.txt +1 -1
  6. {model_library-0.1.9 → model_library-0.1.10}/pyproject.toml +1 -1
  7. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_tools.py +93 -1
  8. {model_library-0.1.9 → model_library-0.1.10}/uv.lock +154 -18
  9. {model_library-0.1.9 → model_library-0.1.10}/.gitattributes +0 -0
  10. {model_library-0.1.9 → model_library-0.1.10}/.github/workflows/publish.yml +0 -0
  11. {model_library-0.1.9 → model_library-0.1.10}/.github/workflows/style.yaml +0 -0
  12. {model_library-0.1.9 → model_library-0.1.10}/.github/workflows/test.yaml +0 -0
  13. {model_library-0.1.9 → model_library-0.1.10}/.github/workflows/typecheck.yml +0 -0
  14. {model_library-0.1.9 → model_library-0.1.10}/.gitignore +0 -0
  15. {model_library-0.1.9 → model_library-0.1.10}/LICENSE +0 -0
  16. {model_library-0.1.9 → model_library-0.1.10}/Makefile +0 -0
  17. {model_library-0.1.9 → model_library-0.1.10}/README.md +0 -0
  18. {model_library-0.1.9 → model_library-0.1.10}/examples/README.md +0 -0
  19. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/batch.py +0 -0
  20. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/custom_retrier.py +0 -0
  21. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/deep_research.py +0 -0
  22. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/stress.py +0 -0
  23. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/structured_output.py +0 -0
  24. {model_library-0.1.9 → model_library-0.1.10}/examples/advanced/web_search.py +0 -0
  25. {model_library-0.1.9 → model_library-0.1.10}/examples/basics.py +0 -0
  26. {model_library-0.1.9 → model_library-0.1.10}/examples/count_tokens.py +0 -0
  27. {model_library-0.1.9 → model_library-0.1.10}/examples/data/files.py +0 -0
  28. {model_library-0.1.9 → model_library-0.1.10}/examples/data/images.py +0 -0
  29. {model_library-0.1.9 → model_library-0.1.10}/examples/embeddings.py +0 -0
  30. {model_library-0.1.9 → model_library-0.1.10}/examples/files.py +0 -0
  31. {model_library-0.1.9 → model_library-0.1.10}/examples/images.py +0 -0
  32. {model_library-0.1.9 → model_library-0.1.10}/examples/prompt_caching.py +0 -0
  33. {model_library-0.1.9 → model_library-0.1.10}/examples/setup.py +0 -0
  34. {model_library-0.1.9 → model_library-0.1.10}/examples/token_retry.py +0 -0
  35. {model_library-0.1.9 → model_library-0.1.10}/examples/tool_calls.py +0 -0
  36. {model_library-0.1.9 → model_library-0.1.10}/model_library/__init__.py +0 -0
  37. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/__init__.py +0 -0
  38. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/base.py +0 -0
  39. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/batch.py +0 -0
  40. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/delegate_only.py +0 -0
  41. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/input.py +0 -0
  42. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/output.py +0 -0
  43. {model_library-0.1.9 → model_library-0.1.10}/model_library/base/utils.py +0 -0
  44. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/README.md +0 -0
  45. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/ai21labs_models.yaml +0 -0
  46. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/alibaba_models.yaml +0 -0
  47. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/all_models.json +0 -0
  48. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/amazon_models.yaml +0 -0
  49. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/anthropic_models.yaml +0 -0
  50. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/cohere_models.yaml +0 -0
  51. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/deepseek_models.yaml +0 -0
  52. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/dummy_model.yaml +0 -0
  53. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/fireworks_models.yaml +0 -0
  54. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/google_models.yaml +0 -0
  55. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/inception_models.yaml +0 -0
  56. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/kimi_models.yaml +0 -0
  57. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/minimax_models.yaml +0 -0
  58. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/mistral_models.yaml +0 -0
  59. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/openai_models.yaml +0 -0
  60. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/perplexity_models.yaml +0 -0
  61. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/together_models.yaml +0 -0
  62. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/xai_models.yaml +0 -0
  63. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/xiaomi_models.yaml +0 -0
  64. {model_library-0.1.9 → model_library-0.1.10}/model_library/config/zai_models.yaml +0 -0
  65. {model_library-0.1.9 → model_library-0.1.10}/model_library/exceptions.py +0 -0
  66. {model_library-0.1.9 → model_library-0.1.10}/model_library/file_utils.py +0 -0
  67. {model_library-0.1.9 → model_library-0.1.10}/model_library/logging.py +0 -0
  68. {model_library-0.1.9 → model_library-0.1.10}/model_library/model_utils.py +0 -0
  69. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/__init__.py +0 -0
  70. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/ai21labs.py +0 -0
  71. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/alibaba.py +0 -0
  72. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/amazon.py +0 -0
  73. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/anthropic.py +0 -0
  74. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/azure.py +0 -0
  75. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/cohere.py +0 -0
  76. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/deepseek.py +0 -0
  77. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/fireworks.py +0 -0
  78. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/google/__init__.py +0 -0
  79. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/google/batch.py +0 -0
  80. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/inception.py +0 -0
  81. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/kimi.py +0 -0
  82. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/minimax.py +0 -0
  83. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/mistral.py +0 -0
  84. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/openrouter.py +0 -0
  85. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/perplexity.py +0 -0
  86. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/together.py +0 -0
  87. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/vals.py +0 -0
  88. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/vercel.py +0 -0
  89. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/xai.py +0 -0
  90. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/xiaomi.py +0 -0
  91. {model_library-0.1.9 → model_library-0.1.10}/model_library/providers/zai.py +0 -0
  92. {model_library-0.1.9 → model_library-0.1.10}/model_library/py.typed +0 -0
  93. {model_library-0.1.9 → model_library-0.1.10}/model_library/register_models.py +0 -0
  94. {model_library-0.1.9 → model_library-0.1.10}/model_library/registry_utils.py +0 -0
  95. {model_library-0.1.9 → model_library-0.1.10}/model_library/retriers/__init__.py +0 -0
  96. {model_library-0.1.9 → model_library-0.1.10}/model_library/retriers/backoff.py +0 -0
  97. {model_library-0.1.9 → model_library-0.1.10}/model_library/retriers/base.py +0 -0
  98. {model_library-0.1.9 → model_library-0.1.10}/model_library/retriers/token.py +0 -0
  99. {model_library-0.1.9 → model_library-0.1.10}/model_library/retriers/utils.py +0 -0
  100. {model_library-0.1.9 → model_library-0.1.10}/model_library/settings.py +0 -0
  101. {model_library-0.1.9 → model_library-0.1.10}/model_library/utils.py +0 -0
  102. {model_library-0.1.9 → model_library-0.1.10}/model_library.egg-info/SOURCES.txt +0 -0
  103. {model_library-0.1.9 → model_library-0.1.10}/model_library.egg-info/dependency_links.txt +0 -0
  104. {model_library-0.1.9 → model_library-0.1.10}/model_library.egg-info/top_level.txt +0 -0
  105. {model_library-0.1.9 → model_library-0.1.10}/scripts/browse_models.py +0 -0
  106. {model_library-0.1.9 → model_library-0.1.10}/scripts/config.py +0 -0
  107. {model_library-0.1.9 → model_library-0.1.10}/scripts/publish.py +0 -0
  108. {model_library-0.1.9 → model_library-0.1.10}/scripts/run_models.py +0 -0
  109. {model_library-0.1.9 → model_library-0.1.10}/setup.cfg +0 -0
  110. {model_library-0.1.9 → model_library-0.1.10}/tests/README.md +0 -0
  111. {model_library-0.1.9 → model_library-0.1.10}/tests/__init__.py +0 -0
  112. {model_library-0.1.9 → model_library-0.1.10}/tests/conftest.py +0 -0
  113. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/__init__.py +0 -0
  114. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/conftest.py +0 -0
  115. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_basic.py +0 -0
  116. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_batch.py +0 -0
  117. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_files.py +0 -0
  118. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_long_problem.py +0 -0
  119. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_reasoning.py +0 -0
  120. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_retry.py +0 -0
  121. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_streaming.py +0 -0
  122. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_structured_output.py +0 -0
  123. {model_library-0.1.9 → model_library-0.1.10}/tests/integration/test_tools.py +0 -0
  124. {model_library-0.1.9 → model_library-0.1.10}/tests/test_helpers.py +0 -0
  125. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/__init__.py +0 -0
  126. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/conftest.py +0 -0
  127. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_batch.py +0 -0
  128. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_count_tokens.py +0 -0
  129. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_deep_research.py +0 -0
  130. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_get_client.py +0 -0
  131. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_openai_config.py +0 -0
  132. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_prompt_caching.py +0 -0
  133. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_query_logger.py +0 -0
  134. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_registry.py +0 -0
  135. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_result_metadata.py +0 -0
  136. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_retry.py +0 -0
  137. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_token_retry.py +0 -0
  138. {model_library-0.1.9 → model_library-0.1.10}/tests/unit/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-library
3
- Version: 0.1.9
3
+ Version: 0.1.10
4
4
  Summary: Model Library for vals.ai
5
5
  Author-email: "Vals AI, Inc." <contact@vals.ai>
6
6
  License: MIT
@@ -21,7 +21,7 @@ Requires-Dist: mistralai<2.0,>=1.9.10
21
21
  Requires-Dist: xai-sdk<2.0,>=1.0.0
22
22
  Requires-Dist: ai21<5.0,>=4.3.0
23
23
  Requires-Dist: boto3<2.0,>=1.38.27
24
- Requires-Dist: google-genai[aiohttp]>=1.51.0
24
+ Requires-Dist: google-genai[aiohttp]>=1.62.0
25
25
  Requires-Dist: google-cloud-storage>=1.26.0
26
26
  Requires-Dist: pytest-xdist>=3.8.0
27
27
  Dynamic: license-file
@@ -58,6 +58,7 @@ from model_library.exceptions import (
58
58
  ImmediateRetryException,
59
59
  InvalidStructuredOutputError,
60
60
  ModelNoOutputError,
61
+ RetryException,
61
62
  )
62
63
  from model_library.providers.google.batch import GoogleBatchMixin
63
64
  from model_library.register_models import register_provider
@@ -195,7 +196,7 @@ class GoogleModel(LLM):
195
196
  # id check
196
197
  new_input.append(
197
198
  Content(
198
- role="function",
199
+ role="user",
199
200
  parts=[
200
201
  Part.from_function_response(
201
202
  name=item.tool_call.name,
@@ -406,10 +407,20 @@ class GoogleModel(LLM):
406
407
  finish_reason = candidates[0].finish_reason
407
408
 
408
409
  if finish_reason != FinishReason.STOP:
409
- self.logger.error(f"Unexpected finish reason: {finish_reason}")
410
+ self.logger.error(
411
+ f"Unexpected finish reason: {finish_reason}, chunks: {chunks}"
412
+ )
413
+
414
+ if finish_reason == FinishReason.MALFORMED_FUNCTION_CALL:
415
+ # gemini handles malformed function calls server side
416
+ # we don't want to return the content that was supposed to have a tool call, without that tool call
417
+ # and since we don't get any info on the params, we throw an error
418
+
419
+ self.logger.error("The function call was malformed")
420
+ raise RetryException("The function call was malformed")
410
421
 
411
422
  if not text and not reasoning and not tool_calls:
412
- self.logger.error(f"Chunks: {chunks}")
423
+ self.logger.error(f"Empty response. Chunks: {chunks}")
413
424
  raise ModelNoOutputError("Model returned empty response")
414
425
 
415
426
  result = QueryResult(
@@ -611,6 +611,12 @@ class OpenAIModel(LLM):
611
611
  if tool_call_chunk.id and (
612
612
  not raw_tool_calls
613
613
  or raw_tool_calls[-1].id != tool_call_chunk.id
614
+ or (
615
+ raw_tool_calls[-1].id == tool_call_chunk.id
616
+ and self.provider == "deepseek"
617
+ and func
618
+ and func.name
619
+ ) # TODO: remove hotfix once deepseek fixes their stuff
614
620
  ):
615
621
  raw_tool_calls.append(
616
622
  ChatCompletionMessageToolCall(
@@ -625,7 +631,7 @@ class OpenAIModel(LLM):
625
631
  )
626
632
  )
627
633
  # accumulate delta
628
- elif func:
634
+ elif func and raw_tool_calls:
629
635
  if func.name:
630
636
  raw_tool_calls[-1].function.name = func.name
631
637
  if func.arguments:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: model-library
3
- Version: 0.1.9
3
+ Version: 0.1.10
4
4
  Summary: Model Library for vals.ai
5
5
  Author-email: "Vals AI, Inc." <contact@vals.ai>
6
6
  License: MIT
@@ -21,7 +21,7 @@ Requires-Dist: mistralai<2.0,>=1.9.10
21
21
  Requires-Dist: xai-sdk<2.0,>=1.0.0
22
22
  Requires-Dist: ai21<5.0,>=4.3.0
23
23
  Requires-Dist: boto3<2.0,>=1.38.27
24
- Requires-Dist: google-genai[aiohttp]>=1.51.0
24
+ Requires-Dist: google-genai[aiohttp]>=1.62.0
25
25
  Requires-Dist: google-cloud-storage>=1.26.0
26
26
  Requires-Dist: pytest-xdist>=3.8.0
27
27
  Dynamic: license-file
@@ -12,6 +12,6 @@ mistralai<2.0,>=1.9.10
12
12
  xai-sdk<2.0,>=1.0.0
13
13
  ai21<5.0,>=4.3.0
14
14
  boto3<2.0,>=1.38.27
15
- google-genai[aiohttp]>=1.51.0
15
+ google-genai[aiohttp]>=1.62.0
16
16
  google-cloud-storage>=1.26.0
17
17
  pytest-xdist>=3.8.0
@@ -27,7 +27,7 @@ dependencies = [
27
27
  "xai-sdk>=1.0.0,<2.0",
28
28
  "ai21>=4.3.0,<5.0",
29
29
  "boto3>=1.38.27,<2.0",
30
- "google-genai[aiohttp]>=1.51.0",
30
+ "google-genai[aiohttp]>=1.62.0",
31
31
  "google-cloud-storage>=1.26.0",
32
32
  "pytest-xdist>=3.8.0",
33
33
  ]
@@ -125,7 +125,7 @@ async def test_google_tool_result_roundtrip_no_storage_import(model_class, model
125
125
  body = await m.build_body([tr, TextInput(text="Thanks!")], tools=[])
126
126
  contents = body["contents"]
127
127
  roles = [getattr(c, "role", None) for c in contents]
128
- assert "function" in roles and "user" in roles
128
+ assert "user" in roles
129
129
 
130
130
 
131
131
  async def test_anthropic_rejects_invalid_tool_result():
@@ -142,3 +142,95 @@ async def test_anthropic_rejects_invalid_tool_result():
142
142
  Exception, match="Tool call result provided with no matching tool call"
143
143
  ):
144
144
  await model.parse_input([TextInput(text="Hello"), orphaned_result])
145
+
146
+
147
+ class TestStreamingToolCallAccumulation:
148
+ """
149
+ Tests for streaming tool call chunk accumulation in OpenAI _query_completions.
150
+ """
151
+
152
+ @staticmethod
153
+ def _make_chunk(
154
+ tool_call_id: str | None, func_name: str | None, func_args: str | None
155
+ ):
156
+ """Create a mock streaming chunk with tool call data."""
157
+ from openai.types.chat.chat_completion_chunk import (
158
+ ChatCompletionChunk,
159
+ Choice,
160
+ ChoiceDelta,
161
+ ChoiceDeltaToolCall,
162
+ ChoiceDeltaToolCallFunction,
163
+ )
164
+
165
+ tool_calls = None
166
+ if tool_call_id is not None or func_name is not None or func_args is not None:
167
+ tool_calls = [
168
+ ChoiceDeltaToolCall(
169
+ index=0,
170
+ id=tool_call_id,
171
+ function=ChoiceDeltaToolCallFunction(
172
+ name=func_name, arguments=func_args
173
+ ),
174
+ type="function" if tool_call_id else None,
175
+ )
176
+ ]
177
+
178
+ return ChatCompletionChunk(
179
+ id="chunk",
180
+ created=0,
181
+ model="test",
182
+ object="chat.completion.chunk",
183
+ choices=[
184
+ Choice(
185
+ index=0,
186
+ delta=ChoiceDelta(tool_calls=tool_calls),
187
+ finish_reason=None,
188
+ )
189
+ ],
190
+ )
191
+
192
+ @staticmethod
193
+ async def _run_query(model: OpenAIModel, chunks: list):
194
+ """Run _query_completions with mocked stream."""
195
+ from unittest.mock import AsyncMock, MagicMock, patch
196
+
197
+ async def mock_stream():
198
+ for c in chunks:
199
+ yield c
200
+
201
+ mock_client = MagicMock()
202
+ mock_client.chat.completions.create = AsyncMock(return_value=mock_stream())
203
+
204
+ with patch.object(model, "get_client", return_value=mock_client):
205
+ with patch.object(
206
+ model, "build_body", new_callable=AsyncMock, return_value={}
207
+ ):
208
+ return await model._query_completions([], tools=[])
209
+
210
+ async def test_openai_multiple_tool_calls_different_ids(self):
211
+ """OpenAI: different IDs should create separate tool calls."""
212
+ model = OpenAIModel("gpt-4o-mini")
213
+ chunks = [
214
+ self._make_chunk("call_1", "get_weather", '{"location": "SF"}'),
215
+ self._make_chunk("call_2", "get_time", '{"tz": "PST"}'),
216
+ ]
217
+
218
+ result = await self._run_query(model, chunks)
219
+
220
+ assert len(result.tool_calls) == 2
221
+ assert result.tool_calls[0].name == "get_weather"
222
+ assert result.tool_calls[1].name == "get_time"
223
+
224
+ async def test_openai_same_id_accumulates(self):
225
+ """OpenAI: same ID should accumulate (NOT create new call)."""
226
+ model = OpenAIModel("gpt-4o-mini")
227
+ chunks = [
228
+ self._make_chunk("call_1", "get_weather", '{"location":'),
229
+ self._make_chunk("call_1", None, ' "SF"}'), # same ID, no name = accumulate
230
+ ]
231
+
232
+ result = await self._run_query(model, chunks)
233
+
234
+ assert len(result.tool_calls) == 1 # should be 1, not 2
235
+ assert result.tool_calls[0].name == "get_weather"
236
+ assert result.tool_calls[0].args == '{"location": "SF"}'
@@ -255,15 +255,6 @@ wheels = [
255
255
  { url = "https://files.pythonhosted.org/packages/5a/29/15627031629f27230ee38bc7f55328b310794010c3039f0ecd353c06dc63/botocore-1.40.75-py3-none-any.whl", hash = "sha256:e822004688ca8035c518108e27d5b450d3ab0e0b3a73bcb8b87b80a8e5bd1910", size = 14141572, upload-time = "2025-11-17T21:58:23.896Z" },
256
256
  ]
257
257
 
258
- [[package]]
259
- name = "cachetools"
260
- version = "6.2.2"
261
- source = { registry = "https://pypi.org/simple" }
262
- sdist = { url = "https://files.pythonhosted.org/packages/fb/44/ca1675be2a83aeee1886ab745b28cda92093066590233cc501890eb8417a/cachetools-6.2.2.tar.gz", hash = "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6", size = 31571, upload-time = "2025-11-13T17:42:51.465Z" }
263
- wheels = [
264
- { url = "https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl", hash = "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace", size = 11503, upload-time = "2025-11-13T17:42:50.232Z" },
265
- ]
266
-
267
258
  [[package]]
268
259
  name = "certifi"
269
260
  version = "2025.11.12"
@@ -273,6 +264,76 @@ wheels = [
273
264
  { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
274
265
  ]
275
266
 
267
+ [[package]]
268
+ name = "cffi"
269
+ version = "2.0.0"
270
+ source = { registry = "https://pypi.org/simple" }
271
+ dependencies = [
272
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
273
+ ]
274
+ sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
275
+ wheels = [
276
+ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" },
277
+ { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" },
278
+ { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" },
279
+ { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" },
280
+ { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" },
281
+ { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" },
282
+ { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" },
283
+ { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" },
284
+ { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" },
285
+ { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" },
286
+ { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" },
287
+ { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" },
288
+ { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" },
289
+ { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
290
+ { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
291
+ { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
292
+ { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
293
+ { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
294
+ { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
295
+ { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
296
+ { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
297
+ { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
298
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
299
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
300
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
301
+ { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
302
+ { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
303
+ { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
304
+ { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
305
+ { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
306
+ { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
307
+ { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
308
+ { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
309
+ { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
310
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
311
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
312
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
313
+ { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
314
+ { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
315
+ { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
316
+ { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
317
+ { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
318
+ { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
319
+ { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
320
+ { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
321
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
322
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
323
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
324
+ { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
325
+ { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
326
+ { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
327
+ { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
328
+ { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
329
+ { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
330
+ { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
331
+ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
332
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
333
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
334
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
335
+ ]
336
+
276
337
  [[package]]
277
338
  name = "charset-normalizer"
278
339
  version = "3.4.4"
@@ -355,6 +416,65 @@ wheels = [
355
416
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
356
417
  ]
357
418
 
419
+ [[package]]
420
+ name = "cryptography"
421
+ version = "46.0.4"
422
+ source = { registry = "https://pypi.org/simple" }
423
+ dependencies = [
424
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
425
+ ]
426
+ sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301, upload-time = "2026-01-28T00:24:37.379Z" }
427
+ wheels = [
428
+ { url = "https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485", size = 7173686, upload-time = "2026-01-28T00:23:07.515Z" },
429
+ { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871, upload-time = "2026-01-28T00:23:09.439Z" },
430
+ { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124, upload-time = "2026-01-28T00:23:11.529Z" },
431
+ { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090, upload-time = "2026-01-28T00:23:13.123Z" },
432
+ { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652, upload-time = "2026-01-28T00:23:14.554Z" },
433
+ { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157, upload-time = "2026-01-28T00:23:16.443Z" },
434
+ { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078, upload-time = "2026-01-28T00:23:17.838Z" },
435
+ { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213, upload-time = "2026-01-28T00:23:19.257Z" },
436
+ { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190, upload-time = "2026-01-28T00:23:21.244Z" },
437
+ { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641, upload-time = "2026-01-28T00:23:22.866Z" },
438
+ { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159, upload-time = "2026-01-28T00:23:25.278Z" },
439
+ { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059, upload-time = "2026-01-28T00:23:26.766Z" },
440
+ { url = "https://files.pythonhosted.org/packages/eb/a7/0fca0fd3591dffc297278a61813d7f661a14243dd60f499a7a5b48acb52a/cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5", size = 3026378, upload-time = "2026-01-28T00:23:28.317Z" },
441
+ { url = "https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b", size = 3478614, upload-time = "2026-01-28T00:23:30.275Z" },
442
+ { url = "https://files.pythonhosted.org/packages/b9/27/542b029f293a5cce59349d799d4d8484b3b1654a7b9a0585c266e974a488/cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908", size = 7116417, upload-time = "2026-01-28T00:23:31.958Z" },
443
+ { url = "https://files.pythonhosted.org/packages/f8/f5/559c25b77f40b6bf828eabaf988efb8b0e17b573545edb503368ca0a2a03/cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da", size = 4264508, upload-time = "2026-01-28T00:23:34.264Z" },
444
+ { url = "https://files.pythonhosted.org/packages/49/a1/551fa162d33074b660dc35c9bc3616fefa21a0e8c1edd27b92559902e408/cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829", size = 4409080, upload-time = "2026-01-28T00:23:35.793Z" },
445
+ { url = "https://files.pythonhosted.org/packages/b0/6a/4d8d129a755f5d6df1bbee69ea2f35ebfa954fa1847690d1db2e8bca46a5/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2", size = 4270039, upload-time = "2026-01-28T00:23:37.263Z" },
446
+ { url = "https://files.pythonhosted.org/packages/4c/f5/ed3fcddd0a5e39321e595e144615399e47e7c153a1fb8c4862aec3151ff9/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085", size = 4926748, upload-time = "2026-01-28T00:23:38.884Z" },
447
+ { url = "https://files.pythonhosted.org/packages/43/ae/9f03d5f0c0c00e85ecb34f06d3b79599f20630e4db91b8a6e56e8f83d410/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b", size = 4442307, upload-time = "2026-01-28T00:23:40.56Z" },
448
+ { url = "https://files.pythonhosted.org/packages/8b/22/e0f9f2dae8040695103369cf2283ef9ac8abe4d51f68710bec2afd232609/cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd", size = 3959253, upload-time = "2026-01-28T00:23:42.827Z" },
449
+ { url = "https://files.pythonhosted.org/packages/01/5b/6a43fcccc51dae4d101ac7d378a8724d1ba3de628a24e11bf2f4f43cba4d/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2", size = 4269372, upload-time = "2026-01-28T00:23:44.655Z" },
450
+ { url = "https://files.pythonhosted.org/packages/17/b7/0f6b8c1dd0779df2b526e78978ff00462355e31c0a6f6cff8a3e99889c90/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e", size = 4891908, upload-time = "2026-01-28T00:23:46.48Z" },
451
+ { url = "https://files.pythonhosted.org/packages/83/17/259409b8349aa10535358807a472c6a695cf84f106022268d31cea2b6c97/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f", size = 4441254, upload-time = "2026-01-28T00:23:48.403Z" },
452
+ { url = "https://files.pythonhosted.org/packages/9c/fe/e4a1b0c989b00cee5ffa0764401767e2d1cf59f45530963b894129fd5dce/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82", size = 4396520, upload-time = "2026-01-28T00:23:50.26Z" },
453
+ { url = "https://files.pythonhosted.org/packages/b3/81/ba8fd9657d27076eb40d6a2f941b23429a3c3d2f56f5a921d6b936a27bc9/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c", size = 4651479, upload-time = "2026-01-28T00:23:51.674Z" },
454
+ { url = "https://files.pythonhosted.org/packages/00/03/0de4ed43c71c31e4fe954edd50b9d28d658fef56555eba7641696370a8e2/cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061", size = 3001986, upload-time = "2026-01-28T00:23:53.485Z" },
455
+ { url = "https://files.pythonhosted.org/packages/5c/70/81830b59df7682917d7a10f833c4dab2a5574cd664e86d18139f2b421329/cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7", size = 3468288, upload-time = "2026-01-28T00:23:55.09Z" },
456
+ { url = "https://files.pythonhosted.org/packages/56/f7/f648fdbb61d0d45902d3f374217451385edc7e7768d1b03ff1d0e5ffc17b/cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab", size = 7169583, upload-time = "2026-01-28T00:23:56.558Z" },
457
+ { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419, upload-time = "2026-01-28T00:23:58.364Z" },
458
+ { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058, upload-time = "2026-01-28T00:23:59.867Z" },
459
+ { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151, upload-time = "2026-01-28T00:24:01.731Z" },
460
+ { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441, upload-time = "2026-01-28T00:24:03.175Z" },
461
+ { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617, upload-time = "2026-01-28T00:24:05.403Z" },
462
+ { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774, upload-time = "2026-01-28T00:24:06.851Z" },
463
+ { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008, upload-time = "2026-01-28T00:24:08.926Z" },
464
+ { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339, upload-time = "2026-01-28T00:24:12.009Z" },
465
+ { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216, upload-time = "2026-01-28T00:24:13.975Z" },
466
+ { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299, upload-time = "2026-01-28T00:24:16.169Z" },
467
+ { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837, upload-time = "2026-01-28T00:24:17.629Z" },
468
+ { url = "https://files.pythonhosted.org/packages/0a/21/f7433d18fe6d5845329cbdc597e30caf983229c7a245bcf54afecc555938/cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc", size = 3009779, upload-time = "2026-01-28T00:24:20.198Z" },
469
+ { url = "https://files.pythonhosted.org/packages/3a/6a/bd2e7caa2facffedf172a45c1a02e551e6d7d4828658c9a245516a598d94/cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976", size = 3466633, upload-time = "2026-01-28T00:24:21.851Z" },
470
+ { url = "https://files.pythonhosted.org/packages/59/e0/f9c6c53e1f2a1c2507f00f2faba00f01d2f334b35b0fbfe5286715da2184/cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b", size = 3476316, upload-time = "2026-01-28T00:24:24.144Z" },
471
+ { url = "https://files.pythonhosted.org/packages/27/7a/f8d2d13227a9a1a9fe9c7442b057efecffa41f1e3c51d8622f26b9edbe8f/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da", size = 4216693, upload-time = "2026-01-28T00:24:25.758Z" },
472
+ { url = "https://files.pythonhosted.org/packages/c5/de/3787054e8f7972658370198753835d9d680f6cd4a39df9f877b57f0dd69c/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80", size = 4382765, upload-time = "2026-01-28T00:24:27.577Z" },
473
+ { url = "https://files.pythonhosted.org/packages/8a/5f/60e0afb019973ba6a0b322e86b3d61edf487a4f5597618a430a2a15f2d22/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822", size = 4216066, upload-time = "2026-01-28T00:24:29.056Z" },
474
+ { url = "https://files.pythonhosted.org/packages/81/8e/bf4a0de294f147fee66f879d9bae6f8e8d61515558e3d12785dd90eca0be/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947", size = 4382025, upload-time = "2026-01-28T00:24:30.681Z" },
475
+ { url = "https://files.pythonhosted.org/packages/79/f4/9ceb90cfd6a3847069b0b0b353fd3075dc69b49defc70182d8af0c4ca390/cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3", size = 3406043, upload-time = "2026-01-28T00:24:32.236Z" },
476
+ ]
477
+
358
478
  [[package]]
359
479
  name = "distro"
360
480
  version = "1.9.0"
@@ -525,16 +645,21 @@ wheels = [
525
645
 
526
646
  [[package]]
527
647
  name = "google-auth"
528
- version = "2.43.0"
648
+ version = "2.48.0"
529
649
  source = { registry = "https://pypi.org/simple" }
530
650
  dependencies = [
531
- { name = "cachetools" },
651
+ { name = "cryptography" },
532
652
  { name = "pyasn1-modules" },
533
653
  { name = "rsa" },
534
654
  ]
535
- sdist = { url = "https://files.pythonhosted.org/packages/ff/ef/66d14cf0e01b08d2d51ffc3c20410c4e134a1548fc246a6081eae585a4fe/google_auth-2.43.0.tar.gz", hash = "sha256:88228eee5fc21b62a1b5fe773ca15e67778cb07dc8363adcb4a8827b52d81483", size = 296359, upload-time = "2025-11-06T00:13:36.587Z" }
655
+ sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload-time = "2026-01-26T19:22:47.157Z" }
536
656
  wheels = [
537
- { url = "https://files.pythonhosted.org/packages/6f/d1/385110a9ae86d91cc14c5282c61fe9f4dc41c0b9f7d423c6ad77038c4448/google_auth-2.43.0-py2.py3-none-any.whl", hash = "sha256:af628ba6fa493f75c7e9dbe9373d148ca9f4399b5ea29976519e0a3848eddd16", size = 223114, upload-time = "2025-11-06T00:13:35.209Z" },
657
+ { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload-time = "2026-01-26T19:22:45.099Z" },
658
+ ]
659
+
660
+ [package.optional-dependencies]
661
+ requests = [
662
+ { name = "requests" },
538
663
  ]
539
664
 
540
665
  [[package]]
@@ -596,21 +721,23 @@ wheels = [
596
721
 
597
722
  [[package]]
598
723
  name = "google-genai"
599
- version = "1.51.0"
724
+ version = "1.62.0"
600
725
  source = { registry = "https://pypi.org/simple" }
601
726
  dependencies = [
602
727
  { name = "anyio" },
603
- { name = "google-auth" },
728
+ { name = "distro" },
729
+ { name = "google-auth", extra = ["requests"] },
604
730
  { name = "httpx" },
605
731
  { name = "pydantic" },
606
732
  { name = "requests" },
733
+ { name = "sniffio" },
607
734
  { name = "tenacity" },
608
735
  { name = "typing-extensions" },
609
736
  { name = "websockets" },
610
737
  ]
611
- sdist = { url = "https://files.pythonhosted.org/packages/c3/1c/29245699c7c274ed5709b33b6a5192af2d57da5da3d2f189f222d1895336/google_genai-1.51.0.tar.gz", hash = "sha256:596c1ec964b70fec17a6ccfe6ee4edede31022584e8b1d33371d93037c4001b1", size = 258060, upload-time = "2025-11-18T05:32:47.068Z" }
738
+ sdist = { url = "https://files.pythonhosted.org/packages/94/4c/71b32b5c8db420cf2fd0d5ef8a672adbde97d85e5d44a0b4fca712264ef1/google_genai-1.62.0.tar.gz", hash = "sha256:709468a14c739a080bc240a4f3191df597bf64485b1ca3728e0fb67517774c18", size = 490888, upload-time = "2026-02-04T22:48:41.989Z" }
612
739
  wheels = [
613
- { url = "https://files.pythonhosted.org/packages/c6/28/0185dcda66f1994171067cfdb0e44a166450239d5b11b3a8a281dd2da459/google_genai-1.51.0-py3-none-any.whl", hash = "sha256:bfb7d0c6ba48ba9bda539f0d5e69dad827d8735a8b1e4703bafa0a2945d293e1", size = 260483, upload-time = "2025-11-18T05:32:45.938Z" },
740
+ { url = "https://files.pythonhosted.org/packages/09/5f/4645d8a28c6e431d0dd6011003a852563f3da7037d36af53154925b099fd/google_genai-1.62.0-py3-none-any.whl", hash = "sha256:4c3daeff3d05fafee4b9a1a31f9c07f01bc22051081aa58b4d61f58d16d1bcc0", size = 724166, upload-time = "2026-02-04T22:48:39.956Z" },
614
741
  ]
615
742
 
616
743
  [package.optional-dependencies]
@@ -956,7 +1083,7 @@ requires-dist = [
956
1083
  { name = "backoff", specifier = ">=2.2.1,<3.0" },
957
1084
  { name = "boto3", specifier = ">=1.38.27,<2.0" },
958
1085
  { name = "google-cloud-storage", specifier = ">=1.26.0" },
959
- { name = "google-genai", extras = ["aiohttp"], specifier = ">=1.51.0" },
1086
+ { name = "google-genai", extras = ["aiohttp"], specifier = ">=1.62.0" },
960
1087
  { name = "mistralai", specifier = ">=1.9.10,<2.0" },
961
1088
  { name = "openai", specifier = ">=2.0,<3.0" },
962
1089
  { name = "pillow" },
@@ -1443,6 +1570,15 @@ wheels = [
1443
1570
  { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" },
1444
1571
  ]
1445
1572
 
1573
+ [[package]]
1574
+ name = "pycparser"
1575
+ version = "3.0"
1576
+ source = { registry = "https://pypi.org/simple" }
1577
+ sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" }
1578
+ wheels = [
1579
+ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" },
1580
+ ]
1581
+
1446
1582
  [[package]]
1447
1583
  name = "pydantic"
1448
1584
  version = "2.12.4"
File without changes
File without changes
File without changes
File without changes
File without changes