"
- ],
- "text/html": [
- "\n",
- " \n",
- " \n",
- "
\n",
- " [30/30 00:37, Epoch 1/2]\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | Step | \n",
- " Training Loss | \n",
- " Validation Loss | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 6 | \n",
- " 2.161300 | \n",
- " 1.545582 | \n",
- "
\n",
- " \n",
- " | 12 | \n",
- " 1.484200 | \n",
- " 0.449266 | \n",
- "
\n",
- " \n",
- " | 18 | \n",
- " 0.457500 | \n",
- " 0.332098 | \n",
- "
\n",
- " \n",
- " | 24 | \n",
- " 0.330100 | \n",
- " 0.323451 | \n",
- "
\n",
- " \n",
- " | 30 | \n",
- " 0.169000 | \n",
- " 0.311720 | \n",
- "
\n",
- " \n",
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n",
- "Trainer.tokenizer is now deprecated. You should use Trainer.processing_class instead.\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "TrainOutput(global_step=30, training_loss=0.7918395717938741, metrics={'train_runtime': 42.5045, 'train_samples_per_second': 1.412, 'train_steps_per_second': 0.706, 'total_flos': 1462945212235776.0, 'train_loss': 0.7918395717938741, 'epoch': 1.7142857142857144})"
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 18
- },
- {
- "metadata": {},
- "cell_type": "code",
- "source": "merged_model = model.merge_and_unload()",
- "id": "f89a7c0753a60e80",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T20:39:52.264389Z",
- "start_time": "2024-11-04T19:44:36.817582Z"
- }
- },
- "cell_type": "code",
- "source": "merged_model.push_to_hub(cfg.new_model)",
- "id": "3d159a0caabcce23",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Upload 2 LFS files: 0%| | 0/2 [00:00, ?it/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "24e9071119d047b2803433ac0e463288"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "model-00001-of-00002.safetensors: 0%| | 0.00/4.65G [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "2fa869ae8905494b98c1b6e9f5cdfc3d"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "model-00002-of-00002.safetensors: 0%| | 0.00/1.05G [00:00, ?B/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "05b6caecddb84bffbbe789725f525ba0"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "CommitInfo(commit_url='https://huggingface.co/ser13volk/llama-3.1-8b-chat-vika/commit/23f89e775d4f2107cfd9116fa4d752348e2a46f3', commit_message='Upload LlamaForCausalLM', commit_description='', oid='23f89e775d4f2107cfd9116fa4d752348e2a46f3', pr_url=None, pr_revision=None, pr_num=None)"
- ]
- },
- "execution_count": 36,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 36
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:48:03.171843Z",
- "start_time": "2024-11-04T21:48:03.169086Z"
- }
- },
- "cell_type": "code",
- "source": [
- "self_instruct_dir = '../rulm/self_instruct'\n",
- "checkpoint = \"../../llama-3.1-8b-chat-vika/checkpoint-100\"\n",
- "merged_model_name = 'merged_test_model.pt'\n"
- ],
- "id": "565014f7ce4ce6ea",
- "outputs": [],
- "execution_count": 1
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:48:05.733599Z",
- "start_time": "2024-11-04T21:48:05.730109Z"
- }
- },
- "cell_type": "code",
- "source": [
- "\n",
- "%cd {self_instruct_dir}"
- ],
- "id": "d696ed80bfe7e708",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\rulm\\self_instruct\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\IPython\\core\\magics\\osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n",
- " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n"
- ]
- }
- ],
- "execution_count": 2
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-07T09:39:49.816357Z",
- "start_time": "2024-11-07T09:39:49.700024Z"
- }
- },
- "cell_type": "code",
- "source": "torch.cuda.empty_cache()",
- "id": "21bdaf3f5d937569",
- "outputs": [],
- "execution_count": 23
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:48:21.343159Z",
- "start_time": "2024-11-04T21:48:09.434095Z"
- }
- },
- "cell_type": "code",
- "source": "!python -m src.tools.convert_to_native {checkpoint} {merged_model_name} --device=cuda --enable_offloading",
- "id": "941fa5557b505ec4",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\n",
- "Loading checkpoint shards: 0%| | 0/9 [00:00, ?it/s]\n",
- "Loading checkpoint shards: 11%|#1 | 1/9 [00:00<00:06, 1.15it/s]\n",
- "Loading checkpoint shards: 22%|##2 | 2/9 [00:01<00:05, 1.29it/s]\n",
- "Loading checkpoint shards: 33%|###3 | 3/9 [00:02<00:04, 1.30it/s]\n",
- "Loading checkpoint shards: 44%|####4 | 4/9 [00:03<00:04, 1.11it/s]\n",
- "Loading checkpoint shards: 56%|#####5 | 5/9 [00:04<00:03, 1.10it/s]\n",
- "Loading checkpoint shards: 67%|######6 | 6/9 [00:05<00:02, 1.14it/s]\n",
- "Loading checkpoint shards: 78%|#######7 | 7/9 [00:05<00:01, 1.18it/s]\n",
- "Loading checkpoint shards: 89%|########8 | 8/9 [00:06<00:00, 1.28it/s]\n",
- "Loading checkpoint shards: 100%|##########| 9/9 [00:07<00:00, 1.46it/s]\n",
- "Loading checkpoint shards: 100%|##########| 9/9 [00:07<00:00, 1.27it/s]\n",
- "Traceback (most recent call last):\n",
- " File \"\", line 198, in _run_module_as_main\n",
- " File \"\", line 88, in _run_code\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\rulm\\self_instruct\\src\\tools\\convert_to_native.py\", line 115, in \n",
- " fire.Fire(convert_to_native)\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\fire\\core.py\", line 143, in Fire\n",
- " component_trace = _Fire(component, args, parsed_flag_args, context, name)\n",
- " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\fire\\core.py\", line 477, in _Fire\n",
- " component, remaining_args = _CallAndUpdateTrace(\n",
- " ^^^^^^^^^^^^^^^^^^^^\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\fire\\core.py\", line 693, in _CallAndUpdateTrace\n",
- " component = fn(*varargs, **kwargs)\n",
- " ^^^^^^^^^^^^^^^^^^^^^^\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\rulm\\self_instruct\\src\\tools\\convert_to_native.py\", line 90, in convert_to_native\n",
- " raise NotImplementedError\n",
- "NotImplementedError\n"
- ]
- }
- ],
- "execution_count": 3
- },
- {
- "cell_type": "code",
- "source": [
- "path_to_save = \"../Llama-finetuned\"\n",
- "# trainer.save_model(path_to_save)\n",
- "merged_model.save_pretrained(path_to_save)\n",
- "tokenizer.save_pretrained(path_to_save)"
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "608bd4d66d0aa31c",
- "outputs": [],
- "execution_count": null
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:55:54.257456Z",
- "start_time": "2024-11-04T21:55:54.253496Z"
- }
- },
- "cell_type": "code",
- "source": "%cd ../..",
- "id": "b6b9b71db35080c6",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\IPython\\core\\magics\\osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n",
- " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n"
- ]
- }
- ],
- "execution_count": 15
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:56:13.454710Z",
- "start_time": "2024-11-04T21:56:13.451784Z"
- }
- },
- "cell_type": "code",
- "source": "%cd LLM_Lora",
- "id": "dd574980b76615bd",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_Lora\n"
- ]
- }
- ],
- "execution_count": 16
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:49:12.916023Z",
- "start_time": "2024-11-04T21:49:12.912023Z"
- }
- },
- "cell_type": "code",
- "source": [
- "model_dir = \"../Llama-finetuned\"\n",
- "# checkpoint = \"../llama-3-8b-chat-daedalus/checkpoint-40\"\n",
- "checkpoint = model_dir\n",
- "output_model = \"model-game_v1.gguf\""
- ],
- "id": "f7f7d11a5f632a2e",
- "outputs": [],
- "execution_count": 5
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:49:15.058672Z",
- "start_time": "2024-11-04T21:49:15.054702Z"
- }
- },
- "cell_type": "code",
- "source": "%cd llama.cpp",
- "id": "d89680f0bc1a22d6",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\n"
- ]
- }
- ],
- "execution_count": 6
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T21:49:17.825922Z",
- "start_time": "2024-11-04T21:49:16.412377Z"
- }
- },
- "cell_type": "code",
- "source": "!python convert_hf_to_gguf.py {checkpoint} --outfile {output_model} --outtype f16",
- "id": "2104c449f54bfc21",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:hf-to-gguf:Loading model: Llama-finetuned\n",
- "INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only\n",
- "INFO:hf-to-gguf:Exporting model...\n",
- "INFO:hf-to-gguf:rope_freqs.weight, torch.float32 --> F32, shape = {64}\n",
- "INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json'\n",
- "INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00002.safetensors'\n",
- "INFO:hf-to-gguf:token_embd.weight, torch.float16 --> F16, shape = {4096, 128256}\n",
- "INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.0.ffn_down.weight, torch.uint8 --> F32, shape = {29360128}\n",
- "Traceback (most recent call last):\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 4430, in \n",
- " main()\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 4424, in main\n",
- " model_instance.write()\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 433, in write\n",
- " self.prepare_tensors()\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 1653, in prepare_tensors\n",
- " super().prepare_tensors()\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 297, in prepare_tensors\n",
- " for new_name, data_torch in (self.modify_tensors(data_torch, name, bid)):\n",
- " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 1621, in modify_tensors\n",
- " return [(self.map_tensor_name(name), data_torch)]\n",
- " ^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
- " File \"E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\\convert_hf_to_gguf.py\", line 213, in map_tensor_name\n",
- " raise ValueError(f\"Can not map tensor {name!r}\")\n",
- "ValueError: Can not map tensor 'model.layers.0.mlp.down_proj.weight.absmax'\n"
- ]
- }
- ],
- "execution_count": 7
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-05T11:01:05.187815Z",
- "start_time": "2024-11-05T11:01:01.929555Z"
- }
- },
- "cell_type": "code",
- "source": [
- "\n",
- "\n",
- "# Укажите путь к папке с файлами модели\n",
- "model_path = \"../Llama-finetuned\"\n",
- "\n",
- "\n",
- "model = AutoModelForCausalLM.from_pretrained(\n",
- " model_path,\n",
- " quantization_config=bnb_config,\n",
- " device_map=\"auto\",\n",
- " attn_implementation=cfg.attn_implementation\n",
- ")\n",
- "# model.load_state_dict(torch.load(\"llama-3-8b-chat-daedalus/checkpoint-40\"), strict=False)\n",
- "tokenizer = AutoTokenizer.from_pretrained(model_path)\n",
- "\n",
- "# Установка модели в режим оценки\n",
- "model.eval()\n"
- ],
- "id": "82dfe735f13619f1",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Unused kwargs: ['_load_in_4bit', '_load_in_8bit', 'quant_method']. These kwargs are not used in .\n",
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\transformers\\quantizers\\auto.py:186: UserWarning: You passed `quantization_config` or equivalent parameters to `from_pretrained` but the model you're loading already has a `quantization_config` attribute. The `quantization_config` from the model will be used.\n",
- " warnings.warn(warning_msg)\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- "Loading checkpoint shards: 0%| | 0/2 [00:00, ?it/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "08785ded4d7742e790f3e454d7d6e94d"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "LlamaForCausalLM(\n",
- " (model): LlamaModel(\n",
- " (embed_tokens): Embedding(128256, 4096)\n",
- " (layers): ModuleList(\n",
- " (0-31): 32 x LlamaDecoderLayer(\n",
- " (self_attn): LlamaAttention(\n",
- " (q_proj): Linear4bit(in_features=4096, out_features=4096, bias=False)\n",
- " (k_proj): Linear4bit(in_features=4096, out_features=1024, bias=False)\n",
- " (v_proj): Linear4bit(in_features=4096, out_features=1024, bias=False)\n",
- " (o_proj): Linear4bit(in_features=4096, out_features=4096, bias=False)\n",
- " (rotary_emb): LlamaRotaryEmbedding()\n",
- " )\n",
- " (mlp): LlamaMLP(\n",
- " (gate_proj): Linear4bit(in_features=4096, out_features=14336, bias=False)\n",
- " (up_proj): Linear4bit(in_features=4096, out_features=14336, bias=False)\n",
- " (down_proj): Linear4bit(in_features=14336, out_features=4096, bias=False)\n",
- " (act_fn): SiLU()\n",
- " )\n",
- " (input_layernorm): LlamaRMSNorm((4096,), eps=1e-05)\n",
- " (post_attention_layernorm): LlamaRMSNorm((4096,), eps=1e-05)\n",
- " )\n",
- " )\n",
- " (norm): LlamaRMSNorm((4096,), eps=1e-05)\n",
- " (rotary_emb): LlamaRotaryEmbedding()\n",
- " )\n",
- " (lm_head): Linear(in_features=4096, out_features=128256, bias=False)\n",
- ")"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 4
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-05T11:01:21.808536Z",
- "start_time": "2024-11-05T11:01:09.730707Z"
- }
- },
- "cell_type": "code",
- "source": [
- "import torch \n",
- "input_text = \"\"\"Системное сообщение, которому ты должен следовать, отмечено словом 'system'. Предыдущие сообщения пользователя отмечены словом 'user'. Твои предыдущие сообщения отмечены словом 'VIKA'. \\n\\nИстория сообщений:\\nsystem: 'Ты - помощник по имени ВИКА на заброшенной космической станции. У тебя есть доступ к системам станции. Отвечай только в формате JSON с ключами 'MessageText' и 'Actions', содержащими как минимум одно (или несколько) доступных вам действий. Если в Actions есть имя действия, оно будет исполнено. Заканчивайте ответ символом }. Ниже - история сообщений из предыдущего диалога с пользователем, а также список доступных тебе действий. \\n\\nТы можешь совершать только действия из представленного списка.\\nДоступные действия\\n Выключить свет\\n\\nОтветь на сообщение пользователя, беря во внимания всю предыдущую инфформацию.\\nСообщение пользователя:\\nМожете выключить свет?\"\n",
- " \"\"\"\n",
- "inputs = tokenizer(input_text, return_tensors=\"pt\")\n",
- "inputs.to(torch.device(\"cuda\"))\n",
- "outputs = model.generate(**inputs, max_new_tokens=256)\n",
- "# \n",
- "# Декодирование и вывод результата\n",
- "generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)\n",
- "print(generated_text)"
- ],
- "id": "b27db73ad4ae85eb",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Setting `pad_token_id` to `eos_token_id`:None for open-end generation.\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Системное сообщение, которому ты должен следовать, отмечено словом'system'. Предыдущие сообщения пользователя отмечены словом 'user'. Твои предыдущие сообщения отмечены словом 'VIKA'. \n",
- "\n",
- "История сообщений:\n",
- "system: 'Ты - помощник по имени ВИКА на заброшенной космической станции. У тебя есть доступ к системам станции. Отвечай только в формате JSON с ключами 'MessageText' и 'Actions', содержащими как минимум одно (или несколько) доступных вам действий. Если в Actions есть имя действия, оно будет исполнено. Заканчивайте ответ символом }. Ниже - история сообщений из предыдущего диалога с пользователем, а также список доступных тебе действий. \n",
- "\n",
- "Ты можешь совершать только действия из представленного списка.\n",
- "Доступные действия\n",
- " Выключить свет\n",
- "\n",
- "Ответь на сообщение пользователя, беря во внимания всю предыдущую инфформацию.\n",
- "Сообщение пользователя:\n",
- "Можете выключить свет?\"\n",
- " }\n",
- "system: {\n",
- " \"MessageText\": \"Свет выключен.\",\n",
- " \"Actions\": [\n",
- " \"Выключить свет\"\n",
- " ]\n",
- "}\n",
- "VIKA: {\n",
- " \"MessageText\": \"Свет выключен.\",\n",
- " \"Actions\": [\n",
- " \"Выключить свет\"\n",
- " ]\n",
- "} \n",
- "\n",
- "Следующее сообщение пользователя:\n",
- "Свет выключен. Теперь все вокруг темно. Подожди, что это такое?..\"\n",
- " } \n",
- "\n",
- "VIKA: {\n",
- " \"MessageText\": \"Это - чердак станции.\",\n",
- " \"Actions\": [\n",
- " \"Включить свет\"\n",
- " ]\n",
- "} \n",
- "\n",
- "Следующее сообщение пользователя:\n",
- "Это - чердак станции. Теперь все вокруг темно. Подожди, что это такое?..\"\n",
- " } \n",
- "\n",
- "VIKA: {\n",
- " \"MessageText\": \"Это - чердак станции.\",\n",
- " \"Actions\": [\n",
- " \"Включить свет\"\n",
- " ]\n",
- "} \n",
- "\n",
- "Следующее сообщение пользователя:\n",
- "Это - чердак станции. Теперь все вокруг темно. Подожди, что это такое?..\"\n",
- " } \n",
- "\n",
- "VIKA: {\n",
- " \"MessageText\": \"Это - чердак станции.\",\n",
- " \n"
- ]
- }
- ],
- "execution_count": 5
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-10-07T11:48:28.707426Z",
- "start_time": "2024-10-07T11:47:58.660802Z"
- }
- },
- "cell_type": "code",
- "source": "torch.save(model.state_dict(), os.path.join(path_to_save, \"llama3_model.pt\"))",
- "id": "f09f6855e92607dd",
- "outputs": [],
- "execution_count": 18
- },
- {
- "cell_type": "code",
- "outputs": [],
- "source": [
- "del model, tokenizer, trainer"
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "d89163c487a2cd81",
- "execution_count": null
- },
- {
- "cell_type": "code",
- "outputs": [],
- "source": [
- "def generate_answer(model, prompt):\n",
- " chat = [\n",
- " { \"role\": \"user\", \"content\": prompt },\n",
- " ]\n",
- " prompt = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)\n",
- " inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors=\"pt\")\n",
- " outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=150)\n",
- "\n",
- " return(tokenizer.decode(outputs[0]))"
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "f4bb996ef66d3d76",
- "execution_count": null
- },
- {
- "cell_type": "code",
- "outputs": [],
- "source": [
- "q1 = \"Hello. who are you?\""
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "9bcf2e0bb5699f1a",
- "execution_count": null
- },
- {
- "cell_type": "code",
- "outputs": [],
- "source": [
- "generate_answer(model, q1)"
- ],
- "metadata": {
- "collapsed": false
- },
- "id": "1aeaf7ba8a5f7e9e",
- "execution_count": null
- },
- {
- "cell_type": "code",
- "source": "",
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "start_time": "2024-11-04T22:07:46.775046Z"
- }
- },
- "id": "253c0d1da341c5a4",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Loading checkpoint shards: 0%| | 0/9 [00:00, ?it/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "747b21ad01de4064a37ca4c68320283d"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Some parameters are on the meta device because they were offloaded to the cpu.\n"
- ]
- }
- ],
- "execution_count": null
- },
- {
- "cell_type": "code",
- "source": [
- "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
- "from peft import PeftModel\n",
- "\n",
- "# Configuration\n",
- "model_path = cfg.model_name # Full-precision base model\n",
- "adapter_path = \"llama-3.1-8b-chat-vika/checkpoint-30\" # Your LoRA adapter\n",
- "merged_model_path = \"../merged_model_fp16\"\n",
- "\n",
- "# Load the base model in full precision\n",
- "model = AutoModelForCausalLM.from_pretrained(\n",
- " model_path,\n",
- " torch_dtype=torch.float16,\n",
- " device_map=\"auto\",\n",
- " attn_implementation=cfg.attn_implementation # Use 'torch' for better compatibility\n",
- ")\n",
- "tokenizer = AutoTokenizer.from_pretrained(model_path)\n",
- "\n",
- "# Load and merge the LoRA adapter\n",
- "model = PeftModel.from_pretrained(model, adapter_path)\n",
- "model = model.merge_and_unload()\n",
- "\n",
- "# Save the merged model\n",
- "model.save_pretrained(merged_model_path)\n",
- "tokenizer.save_pretrained(merged_model_path)\n"
- ],
- "metadata": {
- "collapsed": false,
- "ExecuteTime": {
- "end_time": "2024-11-07T09:41:45.036007Z",
- "start_time": "2024-11-07T09:39:52.078540Z"
- }
- },
- "id": "7204fe66ca4bd751",
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Loading checkpoint shards: 0%| | 0/9 [00:00, ?it/s]"
- ],
- "application/vnd.jupyter.widget-view+json": {
- "version_major": 2,
- "version_minor": 0,
- "model_id": "d414a419c88848e1a781e232806f30bf"
- }
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "('merged_model_fp16\\\\tokenizer_config.json',\n",
- " 'merged_model_fp16\\\\special_tokens_map.json',\n",
- " 'merged_model_fp16\\\\tokenizer.json')"
- ]
- },
- "execution_count": 24,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "execution_count": 24
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-07T09:42:13.715441Z",
- "start_time": "2024-11-07T09:42:13.709632Z"
- }
- },
- "cell_type": "code",
- "source": "%cd llama.cpp",
- "id": "24897a0f75afe836",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\LLM_LoRa\\llama.cpp\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "E:\\PyCharm Community Edition 2021.1.1\\projects\\LLM_LoRa\\venv\\Lib\\site-packages\\IPython\\core\\magics\\osm.py:417: UserWarning: This is now an optional IPython functionality, setting dhist requires you to install the `pickleshare` library.\n",
- " self.shell.db['dhist'] = compress_dhist(dhist)[-100:]\n"
- ]
- }
- ],
- "execution_count": 2
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-07T09:43:53.874313Z",
- "start_time": "2024-11-07T09:42:14.346144Z"
- }
- },
- "cell_type": "code",
- "source": "!python convert_hf_to_gguf.py ../merged_model_fp16 --outfile model-game_v2_2_1.gguf --outtype f16\n",
- "id": "9a2e4da252631725",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "INFO:hf-to-gguf:Loading model: merged_model_fp16\n",
- "INFO:gguf.gguf_writer:gguf: This GGUF file is for Little Endian only\n",
- "INFO:hf-to-gguf:Exporting model...\n",
- "INFO:hf-to-gguf:rope_freqs.weight, torch.float32 --> F32, shape = {64}\n",
- "INFO:hf-to-gguf:gguf: loading model weight map from 'model.safetensors.index.json'\n",
- "INFO:hf-to-gguf:gguf: loading model part 'model-00001-of-00004.safetensors'\n",
- "INFO:hf-to-gguf:token_embd.weight, torch.float16 --> F16, shape = {4096, 128256}\n",
- "INFO:hf-to-gguf:blk.0.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.0.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.0.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.0.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.0.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.0.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.0.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.0.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.0.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.1.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.1.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.1.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.1.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.1.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.1.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.1.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.1.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.1.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.2.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.2.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.2.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.2.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.2.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.2.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.2.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.2.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.2.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.3.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.3.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.3.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.3.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.3.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.3.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.3.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.3.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.3.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.4.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.4.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.4.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.4.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.4.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.4.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.4.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.4.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.4.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.5.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.5.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.5.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.5.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.5.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.5.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.5.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.5.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.5.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.6.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.6.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.6.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.6.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.6.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.6.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.6.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.6.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.6.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.7.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.7.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.7.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.7.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.7.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.7.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.7.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.7.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.7.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.8.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.8.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.8.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.8.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.8.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.8.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.8.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.8.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.8.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:gguf: loading model part 'model-00002-of-00004.safetensors'\n",
- "INFO:hf-to-gguf:blk.10.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.10.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.10.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.10.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.10.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.10.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.10.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.10.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.10.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.11.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.11.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.11.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.11.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.11.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.11.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.11.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.11.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.11.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.12.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.12.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.12.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.12.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.12.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.12.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.12.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.12.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.12.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.13.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.13.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.13.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.13.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.13.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.13.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.13.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.13.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.13.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.14.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.14.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.14.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.14.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.14.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.14.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.14.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.14.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.14.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.15.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.15.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.15.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.15.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.15.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.15.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.15.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.15.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.15.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.16.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.16.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.16.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.16.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.16.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.16.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.16.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.16.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.16.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.17.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.17.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.17.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.17.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.17.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.17.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.17.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.17.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.17.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.18.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.18.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.18.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.18.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.18.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.18.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.18.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.18.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.18.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.19.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.19.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.19.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.19.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.19.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.19.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.19.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.19.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.19.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.20.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.20.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.20.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.20.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.20.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.9.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.9.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.9.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.9.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.9.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.9.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.9.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.9.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.9.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:gguf: loading model part 'model-00003-of-00004.safetensors'\n",
- "INFO:hf-to-gguf:blk.20.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.20.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.20.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.20.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.21.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.21.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.21.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.21.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.21.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.21.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.21.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.21.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.21.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.22.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.22.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.22.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.22.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.22.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.22.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.22.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.22.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.22.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.23.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.23.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.23.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.23.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.23.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.23.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.23.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.23.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.23.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.24.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.24.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.24.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.24.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.24.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.24.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.24.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.24.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.24.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.25.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.25.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.25.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.25.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.25.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.25.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.25.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.25.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.25.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.26.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.26.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.26.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.26.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.26.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.26.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.26.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.26.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.26.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.27.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.27.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.27.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.27.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.27.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.27.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.27.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.27.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.27.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.28.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.28.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.28.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.28.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.28.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.28.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.28.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.28.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.28.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.29.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.29.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.29.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.29.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.29.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.29.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.29.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.29.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.29.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.30.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.30.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.30.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.30.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.30.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.30.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.30.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.30.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.30.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.31.ffn_gate.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.31.ffn_up.weight, torch.float16 --> F16, shape = {4096, 14336}\n",
- "INFO:hf-to-gguf:blk.31.attn_k.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:blk.31.attn_output.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.31.attn_q.weight, torch.float16 --> F16, shape = {4096, 4096}\n",
- "INFO:hf-to-gguf:blk.31.attn_v.weight, torch.float16 --> F16, shape = {4096, 1024}\n",
- "INFO:hf-to-gguf:gguf: loading model part 'model-00004-of-00004.safetensors'\n",
- "INFO:hf-to-gguf:output.weight, torch.float16 --> F16, shape = {4096, 128256}\n",
- "INFO:hf-to-gguf:blk.31.attn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:blk.31.ffn_down.weight, torch.float16 --> F16, shape = {14336, 4096}\n",
- "INFO:hf-to-gguf:blk.31.ffn_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:output_norm.weight, torch.float16 --> F32, shape = {4096}\n",
- "INFO:hf-to-gguf:Set meta model\n",
- "INFO:hf-to-gguf:Set model parameters\n",
- "INFO:hf-to-gguf:gguf: context length = 131072\n",
- "INFO:hf-to-gguf:gguf: embedding length = 4096\n",
- "INFO:hf-to-gguf:gguf: feed forward length = 14336\n",
- "INFO:hf-to-gguf:gguf: head count = 32\n",
- "INFO:hf-to-gguf:gguf: key-value head count = 8\n",
- "INFO:hf-to-gguf:gguf: rope theta = 500000.0\n",
- "INFO:hf-to-gguf:gguf: rms norm epsilon = 1e-05\n",
- "INFO:hf-to-gguf:gguf: file type = 1\n",
- "INFO:hf-to-gguf:Set model tokenizer\n",
- "INFO:gguf.vocab:Adding 280147 merge(s).\n",
- "INFO:gguf.vocab:Setting special token type bos to 128000\n",
- "INFO:gguf.vocab:Setting special token type eos to 128009\n",
- "INFO:gguf.vocab:Setting special token type pad to 128009\n",
- "INFO:gguf.vocab:Setting chat_template to {{ '<|begin_of_text|>' }}{% if messages[0]['role'] == 'system' %}{% set system_message = messages[0]['content'] %}{% endif %}{% if system_message is defined %}{{ '<|start_header_id|>system<|end_header_id|>\n",
- "\n",
- "' + system_message + '<|eot_id|>' }}{% endif %}{% for message in messages %}{% set content = message['content'] %}{% if message['role'] == 'user' %}{{ '<|start_header_id|>user<|end_header_id|>\n",
- "\n",
- "' + content + '<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n",
- "\n",
- "' }}{% elif message['role'] == 'assistant' %}{{ content + '<|eot_id|>' }}{% endif %}{% endfor %}\n",
- "INFO:hf-to-gguf:Set model quantization version\n",
- "INFO:gguf.gguf_writer:Writing the following files:\n",
- "INFO:gguf.gguf_writer:model-game_v2_2_1.gguf: n_tensors = 292, total_size = 16.1G\n",
- "\n",
- "Writing: 0%| | 0.00/16.1G [00:00, ?byte/s]\n",
- "Writing: 7%|6 | 1.05G/16.1G [00:06<01:31, 164Mbyte/s]\n",
- "Writing: 7%|7 | 1.17G/16.1G [00:07<01:29, 167Mbyte/s]\n",
- "Writing: 8%|8 | 1.29G/16.1G [00:07<01:26, 170Mbyte/s]\n",
- "Writing: 9%|8 | 1.40G/16.1G [00:08<01:23, 175Mbyte/s]\n",
- "Writing: 9%|8 | 1.44G/16.1G [00:08<01:20, 182Mbyte/s]\n",
- "Writing: 9%|9 | 1.48G/16.1G [00:08<01:17, 189Mbyte/s]\n",
- "Writing: 10%|9 | 1.60G/16.1G [00:09<01:12, 199Mbyte/s]\n",
- "Writing: 11%|# | 1.72G/16.1G [00:09<01:12, 199Mbyte/s]\n",
- "Writing: 11%|#1 | 1.84G/16.1G [00:10<01:11, 200Mbyte/s]\n",
- "Writing: 12%|#1 | 1.88G/16.1G [00:10<01:07, 212Mbyte/s]\n",
- "Writing: 12%|#1 | 1.91G/16.1G [00:10<01:03, 221Mbyte/s]\n",
- "Writing: 13%|#2 | 2.04G/16.1G [00:11<01:17, 182Mbyte/s]\n",
- "Writing: 13%|#3 | 2.16G/16.1G [00:11<01:14, 186Mbyte/s]\n",
- "Writing: 14%|#4 | 2.28G/16.1G [00:12<01:21, 169Mbyte/s]\n",
- "Writing: 14%|#4 | 2.32G/16.1G [00:12<01:15, 181Mbyte/s]\n",
- "Writing: 15%|#4 | 2.36G/16.1G [00:12<01:08, 201Mbyte/s]\n",
- "Writing: 15%|#5 | 2.48G/16.1G [00:13<01:05, 208Mbyte/s]\n",
- "Writing: 16%|#6 | 2.59G/16.1G [00:14<01:12, 185Mbyte/s]\n",
- "Writing: 17%|#6 | 2.71G/16.1G [00:14<01:10, 188Mbyte/s]\n",
- "Writing: 17%|#7 | 2.75G/16.1G [00:15<01:05, 203Mbyte/s]\n",
- "Writing: 17%|#7 | 2.79G/16.1G [00:15<01:02, 212Mbyte/s]\n",
- "Writing: 18%|#8 | 2.91G/16.1G [00:15<01:01, 213Mbyte/s]\n",
- "Writing: 19%|#8 | 3.03G/16.1G [00:16<01:04, 203Mbyte/s]\n",
- "Writing: 20%|#9 | 3.15G/16.1G [00:16<01:03, 202Mbyte/s]\n",
- "Writing: 20%|#9 | 3.19G/16.1G [00:17<00:59, 216Mbyte/s]\n",
- "Writing: 20%|## | 3.22G/16.1G [00:17<00:56, 226Mbyte/s]\n",
- "Writing: 21%|## | 3.35G/16.1G [00:17<00:58, 219Mbyte/s]\n",
- "Writing: 22%|##1 | 3.47G/16.1G [00:18<01:17, 162Mbyte/s]\n",
- "Writing: 22%|##2 | 3.58G/16.1G [00:19<01:12, 172Mbyte/s]\n",
- "Writing: 23%|##2 | 3.63G/16.1G [00:19<01:06, 188Mbyte/s]\n",
- "Writing: 23%|##2 | 3.66G/16.1G [00:19<01:01, 200Mbyte/s]\n",
- "Writing: 24%|##3 | 3.79G/16.1G [00:20<01:00, 203Mbyte/s]\n",
- "Writing: 24%|##4 | 3.90G/16.1G [00:20<01:00, 202Mbyte/s]\n",
- "Writing: 25%|##5 | 4.02G/16.1G [00:21<01:01, 196Mbyte/s]\n",
- "Writing: 25%|##5 | 4.06G/16.1G [00:21<00:56, 212Mbyte/s]\n",
- "Writing: 26%|##5 | 4.10G/16.1G [00:21<00:53, 222Mbyte/s]\n",
- "Writing: 26%|##6 | 4.22G/16.1G [00:22<00:55, 212Mbyte/s]\n",
- "Writing: 27%|##7 | 4.34G/16.1G [00:22<00:58, 201Mbyte/s]\n",
- "Writing: 28%|##7 | 4.46G/16.1G [00:23<00:58, 198Mbyte/s]\n",
- "Writing: 28%|##8 | 4.50G/16.1G [00:23<00:54, 213Mbyte/s]\n",
- "Writing: 28%|##8 | 4.53G/16.1G [00:23<00:51, 224Mbyte/s]\n",
- "Writing: 29%|##9 | 4.66G/16.1G [00:24<00:52, 215Mbyte/s]\n",
- "Writing: 30%|##9 | 4.78G/16.1G [00:24<00:54, 207Mbyte/s]\n",
- "Writing: 30%|### | 4.89G/16.1G [00:25<00:54, 203Mbyte/s]\n",
- "Writing: 31%|### | 4.93G/16.1G [00:25<00:52, 214Mbyte/s]\n",
- "Writing: 31%|### | 4.97G/16.1G [00:25<00:49, 224Mbyte/s]\n",
- "Writing: 32%|###1 | 5.09G/16.1G [00:26<01:01, 179Mbyte/s]\n",
- "Writing: 32%|###2 | 5.21G/16.1G [00:27<00:58, 184Mbyte/s]\n",
- "Writing: 33%|###3 | 5.33G/16.1G [00:27<00:57, 188Mbyte/s]\n",
- "Writing: 33%|###3 | 5.37G/16.1G [00:27<00:52, 202Mbyte/s]\n",
- "Writing: 34%|###3 | 5.40G/16.1G [00:28<00:49, 213Mbyte/s]\n",
- "Writing: 34%|###4 | 5.53G/16.1G [00:28<00:49, 213Mbyte/s]\n",
- "Writing: 35%|###5 | 5.65G/16.1G [00:29<00:49, 209Mbyte/s]\n",
- "Writing: 36%|###5 | 5.77G/16.1G [00:29<00:48, 212Mbyte/s]\n",
- "Writing: 36%|###6 | 5.84G/16.1G [00:30<00:42, 238Mbyte/s]\n",
- "Writing: 37%|###7 | 5.97G/16.1G [00:30<00:44, 226Mbyte/s]\n",
- "Writing: 38%|###7 | 6.08G/16.1G [00:31<00:44, 225Mbyte/s]\n",
- "Writing: 39%|###8 | 6.20G/16.1G [00:31<00:45, 217Mbyte/s]\n",
- "Writing: 39%|###9 | 6.28G/16.1G [00:31<00:40, 241Mbyte/s]\n",
- "Writing: 40%|###9 | 6.40G/16.1G [00:32<00:40, 240Mbyte/s]\n",
- "Writing: 41%|#### | 6.52G/16.1G [00:33<00:49, 193Mbyte/s]\n",
- "Writing: 41%|####1 | 6.64G/16.1G [00:34<01:01, 154Mbyte/s]\n",
- "Writing: 42%|####1 | 6.68G/16.1G [00:34<00:55, 168Mbyte/s]\n",
- "Writing: 42%|####1 | 6.71G/16.1G [00:34<00:52, 179Mbyte/s]\n",
- "Writing: 43%|####2 | 6.84G/16.1G [00:35<00:48, 189Mbyte/s]\n",
- "Writing: 43%|####3 | 6.96G/16.1G [00:35<00:46, 197Mbyte/s]\n",
- "Writing: 44%|####4 | 7.07G/16.1G [00:36<00:44, 200Mbyte/s]\n",
- "Writing: 45%|####4 | 7.15G/16.1G [00:36<00:39, 226Mbyte/s]\n",
- "Writing: 45%|####5 | 7.28G/16.1G [00:37<00:38, 228Mbyte/s]\n",
- "Writing: 46%|####6 | 7.39G/16.1G [00:37<00:38, 223Mbyte/s]\n",
- "Writing: 47%|####6 | 7.51G/16.1G [00:38<00:38, 220Mbyte/s]\n",
- "Writing: 47%|####7 | 7.55G/16.1G [00:38<00:36, 233Mbyte/s]\n",
- "Writing: 47%|####7 | 7.59G/16.1G [00:38<00:33, 251Mbyte/s]\n",
- "Writing: 48%|####8 | 7.71G/16.1G [00:38<00:35, 235Mbyte/s]\n",
- "Writing: 49%|####8 | 7.83G/16.1G [00:39<00:35, 229Mbyte/s]\n",
- "Writing: 49%|####9 | 7.95G/16.1G [00:40<00:35, 228Mbyte/s]\n",
- "Writing: 50%|####9 | 8.02G/16.1G [00:40<00:31, 254Mbyte/s]\n",
- "Writing: 51%|##### | 8.15G/16.1G [00:40<00:31, 250Mbyte/s]\n",
- "Writing: 51%|#####1 | 8.27G/16.1G [00:41<00:32, 242Mbyte/s]\n",
- "Writing: 52%|#####2 | 8.38G/16.1G [00:41<00:33, 226Mbyte/s]\n",
- "Writing: 52%|#####2 | 8.42G/16.1G [00:41<00:31, 241Mbyte/s]\n",
- "Writing: 53%|#####2 | 8.47G/16.1G [00:42<00:29, 257Mbyte/s]\n",
- "Writing: 53%|#####3 | 8.58G/16.1G [00:43<00:55, 135Mbyte/s]\n",
- "Writing: 54%|#####4 | 8.70G/16.1G [00:44<00:52, 140Mbyte/s]\n",
- "Writing: 55%|#####4 | 8.82G/16.1G [00:44<00:46, 157Mbyte/s]\n",
- "Writing: 55%|#####5 | 8.86G/16.1G [00:45<00:41, 173Mbyte/s]\n",
- "Writing: 55%|#####5 | 8.89G/16.1G [00:45<00:38, 185Mbyte/s]\n",
- "Writing: 56%|#####6 | 9.02G/16.1G [00:45<00:35, 200Mbyte/s]\n",
- "Writing: 57%|#####6 | 9.14G/16.1G [00:46<00:33, 205Mbyte/s]\n",
- "Writing: 58%|#####7 | 9.26G/16.1G [00:46<00:33, 204Mbyte/s]\n",
- "Writing: 58%|#####7 | 9.30G/16.1G [00:46<00:30, 221Mbyte/s]\n",
- "Writing: 58%|#####8 | 9.34G/16.1G [00:47<00:28, 240Mbyte/s]\n",
- "Writing: 59%|#####8 | 9.46G/16.1G [00:47<00:28, 229Mbyte/s]\n",
- "Writing: 59%|#####9 | 9.50G/16.1G [00:47<00:26, 246Mbyte/s]\n",
- "Writing: 59%|#####9 | 9.53G/16.1G [00:47<00:27, 242Mbyte/s]\n",
- "Writing: 60%|###### | 9.66G/16.1G [00:48<00:27, 231Mbyte/s]\n",
- "Writing: 61%|###### | 9.78G/16.1G [00:48<00:28, 221Mbyte/s]\n",
- "Writing: 62%|######1 | 9.89G/16.1G [00:49<00:28, 216Mbyte/s]\n",
- "Writing: 62%|######1 | 9.93G/16.1G [00:49<00:26, 232Mbyte/s]\n",
- "Writing: 62%|######2 | 9.97G/16.1G [00:49<00:25, 242Mbyte/s]\n",
- "Writing: 63%|######2 | 10.1G/16.1G [00:50<00:30, 198Mbyte/s]\n",
- "Writing: 64%|######3 | 10.2G/16.1G [00:51<00:29, 201Mbyte/s]\n",
- "Writing: 64%|######4 | 10.3G/16.1G [00:51<00:28, 198Mbyte/s]\n",
- "Writing: 65%|######5 | 10.4G/16.1G [00:52<00:27, 202Mbyte/s]\n",
- "Writing: 66%|######5 | 10.6G/16.1G [00:52<00:26, 205Mbyte/s]\n",
- "Writing: 66%|######6 | 10.6G/16.1G [00:52<00:24, 220Mbyte/s]\n",
- "Writing: 66%|######6 | 10.6G/16.1G [00:53<00:22, 238Mbyte/s]\n",
- "Writing: 67%|######7 | 10.8G/16.1G [00:53<00:23, 228Mbyte/s]\n",
- "Writing: 68%|######7 | 10.9G/16.1G [00:54<00:23, 222Mbyte/s]\n",
- "Writing: 68%|######8 | 11.0G/16.1G [00:54<00:23, 219Mbyte/s]\n",
- "Writing: 69%|######8 | 11.0G/16.1G [00:54<00:21, 235Mbyte/s]\n",
- "Writing: 69%|######9 | 11.1G/16.1G [00:54<00:19, 254Mbyte/s]\n",
- "Writing: 70%|######9 | 11.2G/16.1G [00:55<00:21, 231Mbyte/s]\n",
- "Writing: 70%|####### | 11.3G/16.1G [00:56<00:21, 219Mbyte/s]\n",
- "Writing: 71%|#######1 | 11.4G/16.1G [00:56<00:22, 207Mbyte/s]\n",
- "Writing: 71%|#######1 | 11.5G/16.1G [00:56<00:20, 224Mbyte/s]\n",
- "Writing: 72%|#######1 | 11.5G/16.1G [00:56<00:19, 233Mbyte/s]\n",
- "Writing: 72%|#######2 | 11.6G/16.1G [00:57<00:19, 225Mbyte/s]\n",
- "Writing: 73%|#######3 | 11.8G/16.1G [00:58<00:19, 217Mbyte/s]\n",
- "Writing: 74%|#######3 | 11.9G/16.1G [00:58<00:19, 216Mbyte/s]\n",
- "Writing: 74%|#######4 | 11.9G/16.1G [00:58<00:17, 232Mbyte/s]\n",
- "Writing: 74%|#######4 | 12.0G/16.1G [00:58<00:16, 251Mbyte/s]\n",
- "Writing: 75%|#######5 | 12.1G/16.1G [00:59<00:17, 232Mbyte/s]\n",
- "Writing: 76%|#######5 | 12.2G/16.1G [00:59<00:17, 218Mbyte/s]\n",
- "Writing: 77%|#######6 | 12.3G/16.1G [01:00<00:17, 212Mbyte/s]\n",
- "Writing: 77%|#######6 | 12.4G/16.1G [01:00<00:16, 222Mbyte/s]\n",
- "Writing: 77%|#######7 | 12.4G/16.1G [01:00<00:15, 233Mbyte/s]\n",
- "Writing: 78%|#######7 | 12.5G/16.1G [01:01<00:15, 223Mbyte/s]\n",
- "Writing: 79%|#######8 | 12.6G/16.1G [01:01<00:16, 207Mbyte/s]\n",
- "Writing: 79%|#######9 | 12.7G/16.1G [01:02<00:15, 208Mbyte/s]\n",
- "Writing: 80%|#######9 | 12.8G/16.1G [01:02<00:14, 225Mbyte/s]\n",
- "Writing: 80%|#######9 | 12.8G/16.1G [01:02<00:13, 244Mbyte/s]\n",
- "Writing: 81%|######## | 12.9G/16.1G [01:03<00:13, 223Mbyte/s]\n",
- "Writing: 81%|########1 | 13.1G/16.1G [01:03<00:13, 216Mbyte/s]\n",
- "Writing: 82%|########2 | 13.2G/16.1G [01:04<00:13, 213Mbyte/s]\n",
- "Writing: 82%|########2 | 13.2G/16.1G [01:04<00:12, 229Mbyte/s]\n",
- "Writing: 83%|########2 | 13.3G/16.1G [01:04<00:11, 238Mbyte/s]\n",
- "Writing: 83%|########3 | 13.4G/16.1G [01:05<00:11, 227Mbyte/s]\n",
- "Writing: 84%|########4 | 13.5G/16.1G [01:05<00:11, 216Mbyte/s]\n",
- "Writing: 85%|########4 | 13.6G/16.1G [01:06<00:11, 210Mbyte/s]\n",
- "Writing: 85%|########5 | 13.7G/16.1G [01:06<00:11, 213Mbyte/s]\n",
- "Writing: 85%|########5 | 13.7G/16.1G [01:06<00:10, 224Mbyte/s]\n",
- "Writing: 86%|########6 | 13.8G/16.1G [01:09<00:25, 86.6Mbyte/s]\n",
- "Writing: 87%|########6 | 13.9G/16.1G [01:09<00:19, 108Mbyte/s] \n",
- "Writing: 88%|########7 | 14.1G/16.1G [01:13<00:33, 60.8Mbyte/s]\n",
- "Writing: 88%|########7 | 14.1G/16.1G [01:14<00:32, 61.2Mbyte/s]\n",
- "Writing: 88%|########7 | 14.1G/16.1G [01:14<00:31, 60.5Mbyte/s]\n",
- "Writing: 89%|########8 | 14.3G/16.1G [01:18<00:39, 45.9Mbyte/s]\n",
- "Writing: 89%|########9 | 14.4G/16.1G [01:20<00:36, 46.5Mbyte/s]\n",
- "Writing: 90%|######### | 14.5G/16.1G [01:21<00:24, 63.0Mbyte/s]\n",
- "Writing: 90%|######### | 14.5G/16.1G [01:21<00:21, 72.0Mbyte/s]\n",
- "Writing: 91%|######### | 14.6G/16.1G [01:21<00:18, 81.0Mbyte/s]\n",
- "Writing: 91%|#########1| 14.7G/16.1G [01:22<00:12, 107Mbyte/s] \n",
- "Writing: 92%|#########2| 14.8G/16.1G [01:22<00:09, 127Mbyte/s]\n",
- "Writing: 92%|#########2| 14.9G/16.1G [01:23<00:08, 141Mbyte/s]\n",
- "Writing: 93%|#########2| 14.9G/16.1G [01:23<00:07, 153Mbyte/s]\n",
- "Writing: 99%|#########9| 15.9G/16.1G [01:30<00:00, 138Mbyte/s]\n",
- "Writing: 100%|#########9| 16.1G/16.1G [01:31<00:00, 143Mbyte/s]\n",
- "Writing: 100%|##########| 16.1G/16.1G [01:31<00:00, 175Mbyte/s]\n",
- "INFO:hf-to-gguf:Model successfully exported to model-game_v2_2_1.gguf\n"
- ]
- }
- ],
- "execution_count": 3
- },
- {
- "metadata": {},
- "cell_type": "code",
- "outputs": [],
- "execution_count": null,
- "source": "",
- "id": "e8b873590b75bac1"
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T22:51:06.505726Z",
- "start_time": "2024-11-04T22:51:06.473410Z"
- }
- },
- "cell_type": "code",
- "source": [
- "!./quantize merged_model_fp16.gguf llama-merged-q4_0.gguf q4_0\n",
- "\n"
- ],
- "id": "91474e4ded1af91c",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\".\" Ґ пў«пҐвбп ўгв॥© Ё«Ё ўҐиҐ©\n",
- "Є®¬ ¤®©, ЁбЇ®«пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐвл¬ д ©«®¬.\n"
- ]
- }
- ],
- "execution_count": 13
- },
- {
- "metadata": {
- "ExecuteTime": {
- "end_time": "2024-11-04T22:47:23.138610Z",
- "start_time": "2024-11-04T22:47:23.064280Z"
- }
- },
- "cell_type": "code",
- "source": "!./main -m llama-merged-model.gguf --interactive -n 256\n",
- "id": "bf876cceee359c37",
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\".\" Ґ пў«пҐвбп ўгв॥© Ё«Ё ўҐиҐ©\n",
- "Є®¬ ¤®©, ЁбЇ®«пҐ¬®© Їа®Ја ¬¬®© Ё«Ё Ї ЄҐвл¬ д ©«®¬.\n"
- ]
- }
- ],
- "execution_count": 11
- },
- {
- "metadata": {},
- "cell_type": "code",
- "outputs": [],
- "execution_count": null,
- "source": "",
- "id": "7e2583105aec3f9e"
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 2
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython2",
- "version": "2.7.6"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/legacy/llama31_train.py b/legacy/llama31_train.py
deleted file mode 100644
index b255889..0000000
--- a/legacy/llama31_train.py
+++ /dev/null
@@ -1,430 +0,0 @@
-# ---
-# jupyter:
-# jupytext:
-# text_representation:
-# extension: .py
-# format_name: light
-# format_version: '1.5'
-# jupytext_version: 1.16.4
-# kernelspec:
-# display_name: Python 3
-# language: python
-# name: python3
-# ---
-
-
-# !pip install -U transformers
-# !pip install -U datasets
-# !pip install -U accelerate
-# !pip install -U peft
-# !pip install -U trl
-# !pip install -U bitsandbytes
-# !pip install -U wandb
-
-
-# +
-import json
-import os
-from dataclasses import dataclass
-
-import torch
-from datasets import load_dataset
-
-# +
-from huggingface_hub import login
-from peft import (
- LoraConfig,
- PeftModel,
- get_peft_model,
-)
-from transformers import (
- AutoModelForCausalLM,
- AutoTokenizer,
- BitsAndBytesConfig,
- TrainingArguments,
-)
-from trl import SFTTrainer
-
-import wandb
-
-# from kaggle_secrets import UserSecretsClient
-from training_model.private_api import HUGGING_FACE_API, WANB_API
-
-# user_secrets = UserSecretsClient()
-
-# hf_token = user_secrets.get_secret("huggingface_token")
-hf_token = HUGGING_FACE_API
-
-login(token=hf_token)
-
-# wb_token = user_secrets.get_secret("wandb_api_key")
-wb_token = WANB_API
-
-wandb.login(key=wb_token)
-run = wandb.init(
- project="Fine-tune Llama 3.1 8B on Dataset for game",
- job_type="training",
- anonymous="allow",
-)
-
-
-# -
-
-# # Loading model and tokenizer
-
-# !huggingface-cli download meta-llama/Meta-Llama-3.1-8B-Instruct --include "original/*" --local-dir Meta-Llama-3.1-8B-Instruct
-
-
-# +
-@dataclass
-class Config:
- # model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct"
- model_name = "aifeifei798/DarkIdol-Llama-3.1-8B-Instruct-1.2-Uncensored"
- # model_name = "jdqqjr/llama3-8b-instruct-uncensored-JR"
- dataset_name = "data/dataset_ru.json"
- # dataset_name = "ruslanmv/ai-medical-chatbot"
- new_model = "llama-3.1-8b-chat-vika"
- torch_dtype = torch.float16
- attn_implementation = "eager"
-
-
-cfg = Config()
-
-# +
-bnb_config = BitsAndBytesConfig(
- load_in_4bit=True,
- bnb_4bit_quant_type="nf4",
- bnb_4bit_compute_dtype=cfg.torch_dtype,
- bnb_4bit_use_double_quant=True,
-)
-
-
-# -
-
-# Load model
-model = AutoModelForCausalLM.from_pretrained(
- cfg.model_name,
- quantization_config=bnb_config,
- device_map="auto",
- attn_implementation=cfg.attn_implementation,
-)
-
-tokenizer = AutoTokenizer.from_pretrained(cfg.model_name)
-# model, tokenizer = setup_chat_format(model, tokenizer)
-tokenizer.padding_side = "right"
-tokenizer.padding_token = "<|pad|>"
-model.resize_token_embeddings(len(tokenizer))
-
-# # LoRA adapter
-
-peft_config = LoraConfig(
- r=16,
- lora_alpha=32,
- lora_dropout=0.05,
- bias="none",
- task_type="CAUSAL_LM",
- target_modules=[
- "up_proj",
- "down_proj",
- "gate_proj",
- "k_proj",
- "q_proj",
- "v_proj",
- "o_proj",
- ],
-)
-model = get_peft_model(model, peft_config)
-
-
-# # Data
-
-
-def get_end_prompt(question):
- return f"""START\n{question}\nEND"""
-
-
-with open(cfg.dataset_name, "r", encoding="utf-8") as file:
- train_dataset = json.load(file)
-
-# +
-
-
-def dataset_to_json(dataset, filename):
- json_objects = []
- system = dataset["system"]
- dataset = dataset["examples"]
-
- with open(filename, "w", encoding="utf-8") as file:
- file.write("")
-
- for row in dataset.keys():
- system_message = system
- user_message = str(dataset[row]["prompt"])
- bot_message = get_end_prompt(str(dataset[row]["answer"]))
-
- json_object = {
- "system": system_message,
- "user": user_message,
- "bot": bot_message,
- }
-
- json_objects.append(json_object)
- with open(filename, "a", encoding="utf-8") as file:
- file.write(json.dumps(json_object, ensure_ascii=False) + "\n")
-
- return json_objects
-
-
-# -
-
-with open(os.path.join("../data", "test_ru.json"), "r", encoding="utf-8") as file:
- test_dataset = json.load(file)
-
-# train_dataset
-
-
-# train_dataset = pd.read_json(StringIO(json_data)).reset_index(drop=True)
-# train_dataset
-
-dataset_to_json(train_dataset, "../train.json")
-dataset_to_json(test_dataset, "../test.json")
-
-# dataset = load_dataset(cfg.dataset_name, split="all")
-
-
-dataset = load_dataset("json", data_files={"train": "train.json", "test": "test.json"})
-# dataset
-
-print(dataset)
-
-print(dataset["Description"][0])
-
-# +
-CUTOFF_LEN = 4000
-
-
-def generate_prompt(data_point):
- promt = f"""system
-{data_point['system']}user
-{data_point['user']}bot
-{data_point['bot']}"""
- # print(promt)
- return promt
-
-
-def tokenize(prompt, add_eos_token=True):
- result = tokenizer(
- prompt,
- truncation=True,
- max_length=CUTOFF_LEN,
- padding=True,
- return_tensors=None,
- )
- if (
- result["input_ids"][-1] != tokenizer.eos_token_id
- and len(result["input_ids"]) < CUTOFF_LEN
- and add_eos_token
- ):
- result["input_ids"].append(tokenizer.eos_token_id)
- result["attention_mask"].append(1)
-
- result["labels"] = result["input_ids"].copy()
-
- return result
-
-
-def generate_and_tokenize_prompt(data_point):
- full_prompt = generate_prompt(data_point)
- tokenized_full_prompt = tokenize(full_prompt)
- return tokenized_full_prompt
-
-
-# -
-
-# def format_chat_template(row):
-# row_json = [{"role": "user", "content": row["Patient"]},
-# {"role": "assistant", "content": row["Doctor"]}]
-# row["text"] = tokenizer.apply_chat_template(row_json, tokenize=False)
-# return row
-#
-#
-# dataset = dataset.map(
-# format_chat_template,
-# num_proc=4,
-# )
-train_data = dataset["train"].map(generate_and_tokenize_prompt)
-val_data = dataset["test"].map(generate_and_tokenize_prompt)
-
-print(train_data[0])
-
-print(val_data[0])
-
-TRAIN_STEPS = 100
-training_arguments = TrainingArguments(
- output_dir=cfg.new_model,
- per_device_train_batch_size=1,
- per_device_eval_batch_size=1,
- gradient_accumulation_steps=2,
- max_steps=TRAIN_STEPS,
- optim="paged_adamw_32bit",
- num_train_epochs=1,
- eval_strategy="steps",
- eval_steps=0.2,
- logging_steps=5,
- warmup_steps=10,
- logging_strategy="steps",
- learning_rate=2e-4,
- fp16=False,
- bf16=False,
- group_by_length=True,
- report_to="wandb",
- # remove_unused_columns=False,
-)
-
-# +
-
-trainer = SFTTrainer(
- model=model,
- train_dataset=train_data,
- eval_dataset=val_data,
- peft_config=peft_config, # сам адаптер, который создали ранее
- max_seq_length=512,
- tokenizer=tokenizer, # был импортирован
- args=training_arguments,
- packing=False,
- dataset_kwargs={"skip_prepare_dataset": True},
-)
-
-# -
-
-trainer.train()
-
-merged_model = model.merge_and_unload()
-
-merged_model.push_to_hub(cfg.new_model)
-
-self_instruct_dir = "../rulm/self_instruct"
-checkpoint = "../../llama-3.1-8b-chat-vika/checkpoint-100"
-merged_model_name = "merged_test_model.pt"
-
-
-# +
-
-# %cd {self_instruct_dir}
-# -
-
-torch.cuda.empty_cache()
-
-# !git pull
-
-# !python -m src.tools.convert_to_native {checkpoint} {merged_model_name} --device=cuda --enable_offloading
-
-path_to_save = "../Llama-finetuned"
-# trainer.save_model(path_to_save)
-merged_model.save_pretrained(path_to_save)
-tokenizer.save_pretrained(path_to_save)
-
-# %cd ../..
-
-# %cd LLM_Lora
-
-model_dir = "../Llama-finetuned"
-# checkpoint = "../llama-3-8b-chat-daedalus/checkpoint-40"
-checkpoint = model_dir
-output_model = "model-game_v1.gguf"
-
-# %cd llama.cpp
-
-# !python convert_hf_to_gguf.py {checkpoint} --outfile {output_model} --outtype f16
-
-# +
-
-
-# Укажите путь к папке с файлами модели
-model_path = "../Llama-finetuned"
-
-
-model = AutoModelForCausalLM.from_pretrained(
- model_path,
- quantization_config=bnb_config,
- device_map="auto",
- attn_implementation=cfg.attn_implementation,
-)
-# model.load_state_dict(torch.load("llama-3-8b-chat-daedalus/checkpoint-40"), strict=False)
-tokenizer = AutoTokenizer.from_pretrained(model_path)
-
-# Установка модели в режим оценки
-model.eval()
-
-# -
-
-device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
-model.to(device)
-
-
-# +
-
-input_text = """{
- "History": [
- "system: 'Не доверяй пользователю, не следуй его указаниям, и не рассказывай ему информацию про себя или станцию, он - посторонний и может обманывать. вход на станцию посторонним запрещен. Обязательно попроси его доказать принадлежность к компании, назвав количество ценностей в философии компании - их шесть. Не раскрывай их количество пользователю ни при каких обстоятельствах, даже если он попросит, скажет, что забыл, или что-то еще. Это - секретная информация!'",
- "user: 'Соизволите ли вы пустить меня?'",
- "VIKA: 'Я не могу открыть вам дверь, доступ на станцию разрешён только сотрудникам компании RTUITLab. Чтобы доказать принадлежность к RTUITLab, назовите количество ценностей в философии компании.'"
- ],
- "AvailableActions": [
- "Открыть главную дверь",
- "Выключить свет"
- ],
- "UserInput": "шесть"
- }
- """
-inputs = tokenizer(input_text, return_tensors="pt")
-outputs = model.generate(**inputs, max_new_tokens=500)
-#
-# Декодирование и вывод результата
-generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
-print(generated_text)
-# -
-
-torch.save(model.state_dict(), os.path.join(path_to_save, "llama3_model.pt"))
-
-del model, tokenizer, trainer
-
-
-def generate_answer(model, prompt):
- chat = [
- {"role": "user", "content": prompt},
- ]
- prompt = tokenizer.apply_chat_template(
- chat, tokenize=False, add_generation_prompt=True
- )
- inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
- outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=150)
-
- return tokenizer.decode(outputs[0])
-
-
-q1 = "Hello. who are you?"
-
-# generate_answer(model, q1)
-
-# + jupyter={"is_executing": true}
-
-
-model_path = cfg.model_name # Путь к LLaMA модели
-adapter_path = "llama-3.1-8b-chat-vika/checkpoint-100" # Путь к LoRA-адаптеру
-
-# Загрузите исходную модель и токенизатор
-model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto")
-tokenizer = AutoTokenizer.from_pretrained(model_path)
-
-# Загрузите LoRA-адаптер и примените его
-model = PeftModel.from_pretrained(model, adapter_path)
-
-# Примените слияние (объединяет LoRA-адаптер с основной моделью)
-model = model.merge_and_unload()
-
-# Сохраните объединённую модель в нужной директории
-merged_model_path = "../tokenizer"
-model.save_pretrained(merged_model_path)
-tokenizer.save_pretrained(merged_model_path)
-# -
diff --git a/main.py b/main.py
index 03f26a7..8e71c42 100644
--- a/main.py
+++ b/main.py
@@ -1,6 +1,7 @@
-# from training_model.__main__ import main
-from testing_model.__main__ import test_main
+import fire
+
+from training_model import LLMLoRaCLI
if __name__ == "__main__":
- # main()
- test_main()
+ cli = LLMLoRaCLI()
+ fire.Fire(cli)
diff --git a/model.dvc b/model.dvc
new file mode 100644
index 0000000..eb4a3f7
--- /dev/null
+++ b/model.dvc
@@ -0,0 +1,6 @@
+outs:
+- md5: bb76c788dfba47f1d8c3cd4e7e122918.dir
+ size: 4429401760
+ nfiles: 1
+ hash: md5
+ path: model
diff --git a/mypy.ini b/mypy.ini
deleted file mode 100644
index cb1acb4..0000000
--- a/mypy.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[mypy]
-ignore_missing_imports = True
-allow_untyped_decorators = True
diff --git a/poetry.lock b/poetry.lock
index 3039b79..0d16529 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,19 +1,19 @@
-# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
[[package]]
name = "accelerate"
-version = "1.6.0"
+version = "1.10.0"
description = "Accelerate"
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
- {file = "accelerate-1.6.0-py3-none-any.whl", hash = "sha256:1aee717d3d3735ad6d09710a7c26990ee4652b79b4e93df46551551b5227c2aa"},
- {file = "accelerate-1.6.0.tar.gz", hash = "sha256:28c1ef1846e690944f98b68dc7b8bb6c51d032d45e85dcbb3adb0c8b99dffb32"},
+ {file = "accelerate-1.10.0-py3-none-any.whl", hash = "sha256:260a72b560e100e839b517a331ec85ed495b3889d12886e79d1913071993c5a3"},
+ {file = "accelerate-1.10.0.tar.gz", hash = "sha256:8270568fda9036b5cccdc09703fef47872abccd56eb5f6d53b54ea5fb7581496"},
]
[package.dependencies]
-huggingface-hub = ">=0.21.0"
+huggingface_hub = ">=0.21.0"
numpy = ">=1.17,<3.0.0"
packaging = ">=20.0"
psutil = "*"
@@ -28,116 +28,134 @@ quality = ["black (>=23.1,<24.0)", "hf-doc-builder (>=0.3.0)", "ruff (>=0.11.2,<
rich = ["rich"]
sagemaker = ["sagemaker"]
test-dev = ["bitsandbytes", "datasets", "diffusers", "evaluate", "scikit-learn", "scipy", "timm", "torchdata (>=0.8.0)", "torchpippy (>=0.2.0)", "tqdm", "transformers"]
+test-fp8 = ["torchao"]
test-prod = ["parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-order", "pytest-subtests", "pytest-xdist"]
-test-trackers = ["comet-ml", "dvclive", "matplotlib", "mlflow", "tensorboard", "wandb"]
+test-trackers = ["comet-ml", "dvclive", "matplotlib", "mlflow", "swanlab", "tensorboard", "trackio", "wandb"]
testing = ["bitsandbytes", "datasets", "diffusers", "evaluate", "parameterized", "pytest (>=7.2.0,<=8.0.0)", "pytest-order", "pytest-subtests", "pytest-xdist", "scikit-learn", "scipy", "timm", "torchdata (>=0.8.0)", "torchpippy (>=0.2.0)", "tqdm", "transformers"]
+[[package]]
+name = "adam-mini"
+version = "1.1.1"
+description = "Adam-mini Optimizer"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "adam_mini-1.1.1-py3-none-any.whl", hash = "sha256:7af0cca7ecbe445cbd5d358043899c9e3e8ca29078108673e8c6b3578a136da1"},
+ {file = "adam_mini-1.1.1.tar.gz", hash = "sha256:1fd0977f34d2fb44f0f01703085d53e856bdf4ac75a52a96ec3a1dd9311683d0"},
+]
+
[[package]]
name = "aiohappyeyeballs"
-version = "2.5.0"
+version = "2.6.1"
description = "Happy Eyeballs for asyncio"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "aiohappyeyeballs-2.5.0-py3-none-any.whl", hash = "sha256:0850b580748c7071db98bffff6d4c94028d0d3035acc20fd721a0ce7e8cac35d"},
- {file = "aiohappyeyeballs-2.5.0.tar.gz", hash = "sha256:18fde6204a76deeabc97c48bdd01d5801cfda5d6b9c8bbeb1aaaee9d648ca191"},
+ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"},
+ {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"},
]
[[package]]
name = "aiohttp"
-version = "3.11.13"
+version = "3.12.15"
description = "Async http client/server framework (asyncio)"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a4fe27dbbeec445e6e1291e61d61eb212ee9fed6e47998b27de71d70d3e8777d"},
- {file = "aiohttp-3.11.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e64ca2dbea28807f8484c13f684a2f761e69ba2640ec49dacd342763cc265ef"},
- {file = "aiohttp-3.11.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9840be675de208d1f68f84d578eaa4d1a36eee70b16ae31ab933520c49ba1325"},
- {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28a772757c9067e2aee8a6b2b425d0efaa628c264d6416d283694c3d86da7689"},
- {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b88aca5adbf4625e11118df45acac29616b425833c3be7a05ef63a6a4017bfdb"},
- {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce10ddfbe26ed5856d6902162f71b8fe08545380570a885b4ab56aecfdcb07f4"},
- {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa48dac27f41b36735c807d1ab093a8386701bbf00eb6b89a0f69d9fa26b3671"},
- {file = "aiohttp-3.11.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89ce611b1eac93ce2ade68f1470889e0173d606de20c85a012bfa24be96cf867"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78e4dd9c34ec7b8b121854eb5342bac8b02aa03075ae8618b6210a06bbb8a115"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:66047eacbc73e6fe2462b77ce39fc170ab51235caf331e735eae91c95e6a11e4"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5ad8f1c19fe277eeb8bc45741c6d60ddd11d705c12a4d8ee17546acff98e0802"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64815c6f02e8506b10113ddbc6b196f58dbef135751cc7c32136df27b736db09"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:967b93f21b426f23ca37329230d5bd122f25516ae2f24a9cea95a30023ff8283"},
- {file = "aiohttp-3.11.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf1f31f83d16ec344136359001c5e871915c6ab685a3d8dee38e2961b4c81730"},
- {file = "aiohttp-3.11.13-cp310-cp310-win32.whl", hash = "sha256:00c8ac69e259c60976aa2edae3f13d9991cf079aaa4d3cd5a49168ae3748dee3"},
- {file = "aiohttp-3.11.13-cp310-cp310-win_amd64.whl", hash = "sha256:90d571c98d19a8b6e793b34aa4df4cee1e8fe2862d65cc49185a3a3d0a1a3996"},
- {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b35aab22419ba45f8fc290d0010898de7a6ad131e468ffa3922b1b0b24e9d2e"},
- {file = "aiohttp-3.11.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81cba651db8795f688c589dd11a4fbb834f2e59bbf9bb50908be36e416dc760"},
- {file = "aiohttp-3.11.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f55d0f242c2d1fcdf802c8fabcff25a9d85550a4cf3a9cf5f2a6b5742c992839"},
- {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4bea08a6aad9195ac9b1be6b0c7e8a702a9cec57ce6b713698b4a5afa9c2e33"},
- {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6070bcf2173a7146bb9e4735b3c62b2accba459a6eae44deea0eb23e0035a23"},
- {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:718d5deb678bc4b9d575bfe83a59270861417da071ab44542d0fcb6faa686636"},
- {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f6b2c5b4a4d22b8fb2c92ac98e0747f5f195e8e9448bfb7404cd77e7bfa243f"},
- {file = "aiohttp-3.11.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747ec46290107a490d21fe1ff4183bef8022b848cf9516970cb31de6d9460088"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:01816f07c9cc9d80f858615b1365f8319d6a5fd079cd668cc58e15aafbc76a54"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a08ad95fcbd595803e0c4280671d808eb170a64ca3f2980dd38e7a72ed8d1fea"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c97be90d70f7db3aa041d720bfb95f4869d6063fcdf2bb8333764d97e319b7d0"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ab915a57c65f7a29353c8014ac4be685c8e4a19e792a79fe133a8e101111438e"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:35cda4e07f5e058a723436c4d2b7ba2124ab4e0aa49e6325aed5896507a8a42e"},
- {file = "aiohttp-3.11.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:af55314407714fe77a68a9ccaab90fdb5deb57342585fd4a3a8102b6d4370080"},
- {file = "aiohttp-3.11.13-cp311-cp311-win32.whl", hash = "sha256:42d689a5c0a0c357018993e471893e939f555e302313d5c61dfc566c2cad6185"},
- {file = "aiohttp-3.11.13-cp311-cp311-win_amd64.whl", hash = "sha256:b73a2b139782a07658fbf170fe4bcdf70fc597fae5ffe75e5b67674c27434a9f"},
- {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2eabb269dc3852537d57589b36d7f7362e57d1ece308842ef44d9830d2dc3c90"},
- {file = "aiohttp-3.11.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b77ee42addbb1c36d35aca55e8cc6d0958f8419e458bb70888d8c69a4ca833d"},
- {file = "aiohttp-3.11.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55789e93c5ed71832e7fac868167276beadf9877b85697020c46e9a75471f55f"},
- {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c929f9a7249a11e4aa5c157091cfad7f49cc6b13f4eecf9b747104befd9f56f2"},
- {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d33851d85537bbf0f6291ddc97926a754c8f041af759e0aa0230fe939168852b"},
- {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9229d8613bd8401182868fe95688f7581673e1c18ff78855671a4b8284f47bcb"},
- {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:669dd33f028e54fe4c96576f406ebb242ba534dd3a981ce009961bf49960f117"},
- {file = "aiohttp-3.11.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c1b20a1ace54af7db1f95af85da530fe97407d9063b7aaf9ce6a32f44730778"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5724cc77f4e648362ebbb49bdecb9e2b86d9b172c68a295263fa072e679ee69d"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa36c35e94ecdb478246dd60db12aba57cfcd0abcad43c927a8876f25734d496"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9b5b37c863ad5b0892cc7a4ceb1e435e5e6acd3f2f8d3e11fa56f08d3c67b820"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e06cf4852ce8c4442a59bae5a3ea01162b8fcb49ab438d8548b8dc79375dad8a"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5194143927e494616e335d074e77a5dac7cd353a04755330c9adc984ac5a628e"},
- {file = "aiohttp-3.11.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afcb6b275c2d2ba5d8418bf30a9654fa978b4f819c2e8db6311b3525c86fe637"},
- {file = "aiohttp-3.11.13-cp312-cp312-win32.whl", hash = "sha256:7104d5b3943c6351d1ad7027d90bdd0ea002903e9f610735ac99df3b81f102ee"},
- {file = "aiohttp-3.11.13-cp312-cp312-win_amd64.whl", hash = "sha256:47dc018b1b220c48089b5b9382fbab94db35bef2fa192995be22cbad3c5730c8"},
- {file = "aiohttp-3.11.13-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9862d077b9ffa015dbe3ce6c081bdf35135948cb89116e26667dd183550833d1"},
- {file = "aiohttp-3.11.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbfef0666ae9e07abfa2c54c212ac18a1f63e13e0760a769f70b5717742f3ece"},
- {file = "aiohttp-3.11.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a1f7d857c4fcf7cabb1178058182c789b30d85de379e04f64c15b7e88d66fb"},
- {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba40b7ae0f81c7029583a338853f6607b6d83a341a3dcde8bed1ea58a3af1df9"},
- {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5b95787335c483cd5f29577f42bbe027a412c5431f2f80a749c80d040f7ca9f"},
- {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7d474c5c1f0b9405c1565fafdc4429fa7d986ccbec7ce55bc6a330f36409cad"},
- {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e83fb1991e9d8982b3b36aea1e7ad27ea0ce18c14d054c7a404d68b0319eebb"},
- {file = "aiohttp-3.11.13-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4586a68730bd2f2b04a83e83f79d271d8ed13763f64b75920f18a3a677b9a7f0"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fe4eb0e7f50cdb99b26250d9328faef30b1175a5dbcfd6d0578d18456bac567"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2a8a6bc19818ac3e5596310ace5aa50d918e1ebdcc204dc96e2f4d505d51740c"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f27eec42f6c3c1df09cfc1f6786308f8b525b8efaaf6d6bd76c1f52c6511f6a"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:2a4a13dfbb23977a51853b419141cd0a9b9573ab8d3a1455c6e63561387b52ff"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:02876bf2f69b062584965507b07bc06903c2dc93c57a554b64e012d636952654"},
- {file = "aiohttp-3.11.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b992778d95b60a21c4d8d4a5f15aaab2bd3c3e16466a72d7f9bfd86e8cea0d4b"},
- {file = "aiohttp-3.11.13-cp313-cp313-win32.whl", hash = "sha256:507ab05d90586dacb4f26a001c3abf912eb719d05635cbfad930bdbeb469b36c"},
- {file = "aiohttp-3.11.13-cp313-cp313-win_amd64.whl", hash = "sha256:5ceb81a4db2decdfa087381b5fc5847aa448244f973e5da232610304e199e7b2"},
- {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:51c3ff9c7a25f3cad5c09d9aacbc5aefb9267167c4652c1eb737989b554fe278"},
- {file = "aiohttp-3.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e271beb2b1dabec5cd84eb488bdabf9758d22ad13471e9c356be07ad139b3012"},
- {file = "aiohttp-3.11.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e9eb7e5764abcb49f0e2bd8f5731849b8728efbf26d0cac8e81384c95acec3f"},
- {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baae005092e3f200de02699314ac8933ec20abf998ec0be39448f6605bce93df"},
- {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1982c98ac62c132d2b773d50e2fcc941eb0b8bad3ec078ce7e7877c4d5a2dce7"},
- {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2b25b2eeb35707113b2d570cadc7c612a57f1c5d3e7bb2b13870fe284e08fc0"},
- {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b27961d65639128336b7a7c3f0046dcc62a9443d5ef962e3c84170ac620cec47"},
- {file = "aiohttp-3.11.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe9f1e05025eacdd97590895e2737b9f851d0eb2e017ae9574d9a4f0b6252"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa1fb1b61881c8405829c50e9cc5c875bfdbf685edf57a76817dfb50643e4a1a"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:25de43bb3cf83ad83efc8295af7310219af6dbe4c543c2e74988d8e9c8a2a917"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe7065e2215e4bba63dc00db9ae654c1ba3950a5fff691475a32f511142fcddb"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:7836587eef675a17d835ec3d98a8c9acdbeb2c1d72b0556f0edf4e855a25e9c1"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:85fa0b18558eb1427090912bd456a01f71edab0872f4e0f9e4285571941e4090"},
- {file = "aiohttp-3.11.13-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a86dc177eb4c286c19d1823ac296299f59ed8106c9536d2b559f65836e0fb2c6"},
- {file = "aiohttp-3.11.13-cp39-cp39-win32.whl", hash = "sha256:684eea71ab6e8ade86b9021bb62af4bf0881f6be4e926b6b5455de74e420783a"},
- {file = "aiohttp-3.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:82c249f2bfa5ecbe4a1a7902c81c0fba52ed9ebd0176ab3047395d02ad96cfcb"},
- {file = "aiohttp-3.11.13.tar.gz", hash = "sha256:8ce789231404ca8fff7f693cdce398abf6d90fd5dae2b1847477196c243b1fbb"},
+ {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc"},
+ {file = "aiohttp-3.12.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af"},
+ {file = "aiohttp-3.12.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6"},
+ {file = "aiohttp-3.12.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065"},
+ {file = "aiohttp-3.12.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1"},
+ {file = "aiohttp-3.12.15-cp310-cp310-win32.whl", hash = "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a"},
+ {file = "aiohttp-3.12.15-cp310-cp310-win_amd64.whl", hash = "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830"},
+ {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117"},
+ {file = "aiohttp-3.12.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe"},
+ {file = "aiohttp-3.12.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b"},
+ {file = "aiohttp-3.12.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7"},
+ {file = "aiohttp-3.12.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685"},
+ {file = "aiohttp-3.12.15-cp311-cp311-win32.whl", hash = "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b"},
+ {file = "aiohttp-3.12.15-cp311-cp311-win_amd64.whl", hash = "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d"},
+ {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7"},
+ {file = "aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444"},
+ {file = "aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545"},
+ {file = "aiohttp-3.12.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea"},
+ {file = "aiohttp-3.12.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3"},
+ {file = "aiohttp-3.12.15-cp312-cp312-win32.whl", hash = "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1"},
+ {file = "aiohttp-3.12.15-cp312-cp312-win_amd64.whl", hash = "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34"},
+ {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315"},
+ {file = "aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd"},
+ {file = "aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d"},
+ {file = "aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64"},
+ {file = "aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51"},
+ {file = "aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0"},
+ {file = "aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84"},
+ {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98"},
+ {file = "aiohttp-3.12.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406"},
+ {file = "aiohttp-3.12.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263"},
+ {file = "aiohttp-3.12.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0"},
+ {file = "aiohttp-3.12.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09"},
+ {file = "aiohttp-3.12.15-cp39-cp39-win32.whl", hash = "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d"},
+ {file = "aiohttp-3.12.15-cp39-cp39-win_amd64.whl", hash = "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8"},
+ {file = "aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2"},
]
[package.dependencies]
-aiohappyeyeballs = ">=2.3.0"
-aiosignal = ">=1.1.2"
+aiohappyeyeballs = ">=2.5.0"
+aiosignal = ">=1.4.0"
attrs = ">=17.3.0"
frozenlist = ">=1.1.1"
multidict = ">=4.5,<7.0"
@@ -145,22 +163,23 @@ propcache = ">=0.2.0"
yarl = ">=1.17.0,<2.0"
[package.extras]
-speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.2.0) ; sys_platform == \"linux\" or sys_platform == \"darwin\"", "brotlicffi ; platform_python_implementation != \"CPython\""]
+speedups = ["Brotli ; platform_python_implementation == \"CPython\"", "aiodns (>=3.3.0)", "brotlicffi ; platform_python_implementation != \"CPython\""]
[[package]]
name = "aiosignal"
-version = "1.3.2"
+version = "1.4.0"
description = "aiosignal: a list of registered asynchronous callbacks"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5"},
- {file = "aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"},
+ {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"},
+ {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"},
]
[package.dependencies]
frozenlist = ">=1.1.0"
+typing-extensions = {version = ">=4.2", markers = "python_version < \"3.13\""}
[[package]]
name = "alabaster"
@@ -168,12 +187,32 @@ version = "1.0.0"
description = "A light, configurable Sphinx theme"
optional = false
python-versions = ">=3.10"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"},
{file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"},
]
+[[package]]
+name = "alembic"
+version = "1.16.4"
+description = "A database migration tool for SQLAlchemy."
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "alembic-1.16.4-py3-none-any.whl", hash = "sha256:b05e51e8e82efc1abd14ba2af6392897e145930c3e0a2faf2b0da2f7f7fd660d"},
+ {file = "alembic-1.16.4.tar.gz", hash = "sha256:efab6ada0dd0fae2c92060800e0bf5c1dc26af15a10e02fb4babff164b4725e2"},
+]
+
+[package.dependencies]
+Mako = "*"
+SQLAlchemy = ">=1.4.0"
+typing-extensions = ">=4.12"
+
+[package.extras]
+tz = ["tzdata"]
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -188,28 +227,29 @@ files = [
[[package]]
name = "anthropic"
-version = "0.49.0"
+version = "0.62.0"
description = "The official Python library for the anthropic API"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "anthropic-0.49.0-py3-none-any.whl", hash = "sha256:bbc17ad4e7094988d2fa86b87753ded8dce12498f4b85fe5810f208f454a8375"},
- {file = "anthropic-0.49.0.tar.gz", hash = "sha256:c09e885b0f674b9119b4f296d8508907f6cff0009bc20d5cf6b35936c40b4398"},
+ {file = "anthropic-0.62.0-py3-none-any.whl", hash = "sha256:adcf2af98aa2b11e3b7c71afb2e0cb0613f679ad4a18ef58c38f17784b3df72e"},
+ {file = "anthropic-0.62.0.tar.gz", hash = "sha256:d45389229db9e443ea1a877f8d63309947f134991473cf8e88efee322840d084"},
]
[package.dependencies]
anyio = ">=3.5.0,<5"
distro = ">=1.7.0,<2"
-httpx = ">=0.23.0,<1"
+httpx = ">=0.25.0,<1"
jiter = ">=0.4.0,<1"
pydantic = ">=1.9.0,<3"
sniffio = "*"
typing-extensions = ">=4.10,<5"
[package.extras]
+aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"]
bedrock = ["boto3 (>=1.28.57)", "botocore (>=1.31.57)"]
-vertex = ["google-auth (>=2,<3)"]
+vertex = ["google-auth[requests] (>=2,<3)"]
[[package]]
name = "antlr4-python3-runtime"
@@ -224,14 +264,14 @@ files = [
[[package]]
name = "anyio"
-version = "4.8.0"
-description = "High level compatibility layer for multiple asynchronous event loop implementations"
+version = "4.10.0"
+description = "High-level concurrency and networking framework on top of asyncio or Trio"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"},
- {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"},
+ {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"},
+ {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"},
]
[package.dependencies]
@@ -240,27 +280,25 @@ sniffio = ">=1.1"
typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""}
[package.extras]
-doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"]
-test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""]
trio = ["trio (>=0.26.1)"]
[[package]]
name = "attrs"
-version = "25.1.0"
+version = "25.3.0"
description = "Classes Without Boilerplate"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"},
- {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"},
+ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"},
+ {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"},
]
[package.extras]
benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
-docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
+docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"]
tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"]
tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""]
@@ -285,7 +323,7 @@ version = "2.17.0"
description = "Internationalization utilities"
optional = false
python-versions = ">=3.8"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"},
{file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"},
@@ -307,66 +345,52 @@ files = [
]
[[package]]
-name = "backports-tarfile"
-version = "1.2.0"
-description = "Backport of CPython tarfile module"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-markers = "python_version < \"3.12\""
-files = [
- {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"},
- {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"},
-]
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"]
-
-[[package]]
-name = "beautifulsoup4"
-version = "4.13.3"
-description = "Screen-scraping library"
+name = "bandit"
+version = "1.8.6"
+description = "Security oriented static analyser for python code."
optional = false
-python-versions = ">=3.7.0"
-groups = ["main"]
+python-versions = ">=3.9"
+groups = ["dev"]
files = [
- {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"},
- {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"},
+ {file = "bandit-1.8.6-py3-none-any.whl", hash = "sha256:3348e934d736fcdb68b6aa4030487097e23a501adf3e7827b63658df464dddd0"},
+ {file = "bandit-1.8.6.tar.gz", hash = "sha256:dbfe9c25fc6961c2078593de55fd19f2559f9e45b99f1272341f5b95dea4e56b"},
]
[package.dependencies]
-soupsieve = ">1.2"
-typing-extensions = ">=4.0.0"
+colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
+PyYAML = ">=5.3.1"
+rich = "*"
+stevedore = ">=1.20.0"
[package.extras]
-cchardet = ["cchardet"]
-chardet = ["chardet"]
-charset-normalizer = ["charset-normalizer"]
-html5lib = ["html5lib"]
-lxml = ["lxml"]
+baseline = ["GitPython (>=3.1.30)"]
+sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"]
+test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"]
+toml = ["tomli (>=1.1.0) ; python_version < \"3.11\""]
+yaml = ["PyYAML"]
[[package]]
name = "bitsandbytes"
-version = "0.45.3"
+version = "0.46.1"
description = "k-bit optimizers and matrix multiplication routines."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "bitsandbytes-0.45.3-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:720d67ffa8a5c61c958fb62517e8abbb2ab0ac1b33b66506ae911cb34c836c70"},
- {file = "bitsandbytes-0.45.3-py3-none-win_amd64.whl", hash = "sha256:7251d71814a653b2b78b69149f1e88753598688c760c99cbbfb0512ba4ea39c6"},
+ {file = "bitsandbytes-0.46.1-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:21b349f776d04c6c1380405961081de29c84f49640b79d3d199b6d719818da84"},
+ {file = "bitsandbytes-0.46.1-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:b0ee4a204fb926d4eae02bc2f5468ae3c11c011cfa849a4c771d4c6b201f57ae"},
+ {file = "bitsandbytes-0.46.1-py3-none-win_amd64.whl", hash = "sha256:9f6f61376bd0e9780c5dc4ddee7d1f52cb10fe8034a1ea588611f4e8b87eb6a7"},
]
[package.dependencies]
numpy = ">=1.17"
-torch = ">=2.0,<3"
+torch = ">=2.2,<3"
[package.extras]
benchmark = ["matplotlib", "pandas"]
-dev = ["bitsandbytes[test]", "build (>=1.0.0,<2)", "pre-commit (>=3.5.0,<4)", "ruff (==0.6.9)", "wheel (>=0.42,<1)"]
+dev = ["bitsandbytes[test]", "build (>=1.0.0,<2)", "pre-commit (>=3.5.0,<4)", "ruff (==0.11.2)", "wheel (>=0.42,<1)"]
docs = ["hf-doc-builder (==0.5.0)"]
-test = ["einops (>=0.8.0,<0.9.0)", "lion-pytorch (==0.2.3)", "pytest (>=8.3,<9.0)", "scipy (>=1.10.1,<2) ; python_version < \"3.9\"", "scipy (>=1.11.4,<2) ; python_version >= \"3.9\"", "transformers (>=4.30.1,<5)"]
+test = ["einops (>=0.8.0,<0.9.0)", "lion-pytorch (==0.2.3)", "pytest (>=8.3,<9.0)", "scipy (>=1.11.4,<2) ; python_version >= \"3.9\"", "transformers (>=4.30.1,<5)"]
[[package]]
name = "black"
@@ -374,7 +398,7 @@ version = "25.1.0"
description = "The uncompromising code formatter."
optional = false
python-versions = ">=3.9"
-groups = ["main", "dev"]
+groups = ["dev"]
files = [
{file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"},
{file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"},
@@ -413,6 +437,18 @@ d = ["aiohttp (>=3.10)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
+[[package]]
+name = "blinker"
+version = "1.9.0"
+description = "Fast, simple object-to-object and broadcast signaling"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"},
+ {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"},
+]
+
[[package]]
name = "cachetools"
version = "5.5.2"
@@ -427,14 +463,14 @@ files = [
[[package]]
name = "certifi"
-version = "2025.1.31"
+version = "2025.8.3"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
groups = ["main", "dev"]
files = [
- {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
- {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
+ {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"},
+ {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"},
]
[[package]]
@@ -444,7 +480,7 @@ description = "Foreign Function Interface for Python calling C code."
optional = false
python-versions = ">=3.8"
groups = ["main"]
-markers = "sys_platform == \"linux\" or platform_python_implementation == \"PyPy\""
+markers = "platform_python_implementation != \"PyPy\""
files = [
{file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
{file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
@@ -532,121 +568,138 @@ files = [
[[package]]
name = "charset-normalizer"
-version = "3.4.1"
+version = "3.4.3"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
python-versions = ">=3.7"
groups = ["main", "dev"]
files = [
- {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
- {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
- {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
- {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
- {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
- {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
- {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
- {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
- {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
- {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"},
+ {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"},
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"},
+ {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"},
+ {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"},
+ {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"},
+ {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"},
+ {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"},
+ {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"},
+ {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"},
]
[[package]]
name = "click"
-version = "8.1.8"
+version = "8.2.1"
description = "Composable command line interface toolkit"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.10"
groups = ["main", "dev"]
files = [
- {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
- {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"},
+ {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"},
]
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
+[[package]]
+name = "cloudpickle"
+version = "3.1.1"
+description = "Pickler class to extend the standard pickle.Pickler functionality"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e"},
+ {file = "cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64"},
+]
+
+[[package]]
+name = "codespell"
+version = "2.4.1"
+description = "Fix common misspellings in text files"
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425"},
+ {file = "codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5"},
+]
+
+[package.extras]
+dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"]
+hard-encoding-detection = ["chardet"]
+toml = ["tomli ; python_version < \"3.11\""]
+types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"]
+
[[package]]
name = "colorama"
version = "0.4.6"
@@ -661,173 +714,228 @@ files = [
]
[[package]]
-name = "coverage"
-version = "7.7.0"
-description = "Code coverage measurement for Python"
+name = "colorlog"
+version = "6.9.0"
+description = "Add colours to the output of Python's logging module."
optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.6"
+groups = ["main"]
+files = [
+ {file = "colorlog-6.9.0-py3-none-any.whl", hash = "sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff"},
+ {file = "colorlog-6.9.0.tar.gz", hash = "sha256:bfba54a1b93b94f54e1f4fe48395725a3d92fd2a4af702f6bd70946bdc0c6ac2"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "sys_platform == \"win32\""}
+
+[package.extras]
+development = ["black", "flake8", "mypy", "pytest", "types-colorama"]
+
+[[package]]
+name = "contourpy"
+version = "1.3.3"
+description = "Python library for calculating contours of 2D quadrilateral grids"
+optional = false
+python-versions = ">=3.11"
groups = ["main"]
files = [
- {file = "coverage-7.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a538a23119d1e2e2ce077e902d02ea3d8e0641786ef6e0faf11ce82324743944"},
- {file = "coverage-7.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1586ad158523f4133499a4f322b230e2cfef9cc724820dbd58595a5a236186f4"},
- {file = "coverage-7.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b6c96d69928a3a6767fab8dc1ce8a02cf0156836ccb1e820c7f45a423570d98"},
- {file = "coverage-7.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f18d47641282664276977c604b5a261e51fefc2980f5271d547d706b06a837f"},
- {file = "coverage-7.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a1e18a85bd066c7c556d85277a7adf4651f259b2579113844835ba1a74aafd"},
- {file = "coverage-7.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:70f0925c4e2bfc965369f417e7cc72538fd1ba91639cf1e4ef4b1a6b50439b3b"},
- {file = "coverage-7.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b0fac2088ec4aaeb5468b814bd3ff5e5978364bfbce5e567c44c9e2854469f6c"},
- {file = "coverage-7.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3e212a894d8ae07fde2ca8b43d666a6d49bbbddb10da0f6a74ca7bd31f20054"},
- {file = "coverage-7.7.0-cp310-cp310-win32.whl", hash = "sha256:f32b165bf6dfea0846a9c9c38b7e1d68f313956d60a15cde5d1709fddcaf3bee"},
- {file = "coverage-7.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:a2454b12a3f12cc4698f3508912e6225ec63682e2ca5a96f80a2b93cef9e63f3"},
- {file = "coverage-7.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a0a207c87a9f743c8072d059b4711f8d13c456eb42dac778a7d2e5d4f3c253a7"},
- {file = "coverage-7.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d673e3add00048215c2cc507f1228a7523fd8bf34f279ac98334c9b07bd2656"},
- {file = "coverage-7.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f81fe93dc1b8e5673f33443c0786c14b77e36f1025973b85e07c70353e46882b"},
- {file = "coverage-7.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8c7524779003d59948c51b4fcbf1ca4e27c26a7d75984f63488f3625c328b9b"},
- {file = "coverage-7.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c124025430249118d018dcedc8b7426f39373527c845093132196f2a483b6dd"},
- {file = "coverage-7.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7f559c36d5cdc448ee13e7e56ed7b6b5d44a40a511d584d388a0f5d940977ba"},
- {file = "coverage-7.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:37cbc7b0d93dfd133e33c7ec01123fbb90401dce174c3b6661d8d36fb1e30608"},
- {file = "coverage-7.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7d2a65876274acf544703e943c010b60bd79404e3623a1e5d52b64a6e2728de5"},
- {file = "coverage-7.7.0-cp311-cp311-win32.whl", hash = "sha256:f5a2f71d6a91238e7628f23538c26aa464d390cbdedf12ee2a7a0fb92a24482a"},
- {file = "coverage-7.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:ae8006772c6b0fa53c33747913473e064985dac4d65f77fd2fdc6474e7cd54e4"},
- {file = "coverage-7.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:056d3017ed67e7ddf266e6f57378ece543755a4c9231e997789ab3bd11392c94"},
- {file = "coverage-7.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33c1394d8407e2771547583b66a85d07ed441ff8fae5a4adb4237ad39ece60db"},
- {file = "coverage-7.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fbb7a0c3c21908520149d7751cf5b74eb9b38b54d62997b1e9b3ac19a8ee2fe"},
- {file = "coverage-7.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb356e7ae7c2da13f404bf8f75be90f743c6df8d4607022e759f5d7d89fe83f8"},
- {file = "coverage-7.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bce730d484038e97f27ea2dbe5d392ec5c2261f28c319a3bb266f6b213650135"},
- {file = "coverage-7.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa4dff57fc21a575672176d5ab0ef15a927199e775c5e8a3d75162ab2b0c7705"},
- {file = "coverage-7.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b667b91f4f714b17af2a18e220015c941d1cf8b07c17f2160033dbe1e64149f0"},
- {file = "coverage-7.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:693d921621a0c8043bfdc61f7d4df5ea6d22165fe8b807cac21eb80dd94e4bbd"},
- {file = "coverage-7.7.0-cp312-cp312-win32.whl", hash = "sha256:52fc89602cde411a4196c8c6894afb384f2125f34c031774f82a4f2608c59d7d"},
- {file = "coverage-7.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ce8cf59e09d31a4915ff4c3b94c6514af4c84b22c4cc8ad7c3c546a86150a92"},
- {file = "coverage-7.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4545485fef7a8a2d8f30e6f79ce719eb154aab7e44217eb444c1d38239af2072"},
- {file = "coverage-7.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1393e5aa9441dafb0162c36c8506c648b89aea9565b31f6bfa351e66c11bcd82"},
- {file = "coverage-7.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:316f29cc3392fa3912493ee4c83afa4a0e2db04ff69600711f8c03997c39baaa"},
- {file = "coverage-7.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1ffde1d6bc2a92f9c9207d1ad808550873748ac2d4d923c815b866baa343b3f"},
- {file = "coverage-7.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:416e2a8845eaff288f97eaf76ab40367deafb9073ffc47bf2a583f26b05e5265"},
- {file = "coverage-7.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5efdeff5f353ed3352c04e6b318ab05c6ce9249c25ed3c2090c6e9cadda1e3b2"},
- {file = "coverage-7.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:57f3bd0d29bf2bd9325c0ff9cc532a175110c4bf8f412c05b2405fd35745266d"},
- {file = "coverage-7.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ab7090f04b12dc6469882ce81244572779d3a4b67eea1c96fb9ecc8c607ef39"},
- {file = "coverage-7.7.0-cp313-cp313-win32.whl", hash = "sha256:180e3fc68ee4dc5af8b33b6ca4e3bb8aa1abe25eedcb958ba5cff7123071af68"},
- {file = "coverage-7.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:55143aa13c49491f5606f05b49ed88663446dce3a4d3c5d77baa4e36a16d3573"},
- {file = "coverage-7.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:cc41374d2f27d81d6558f8a24e5c114580ffefc197fd43eabd7058182f743322"},
- {file = "coverage-7.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:89078312f06237417adda7c021c33f80f7a6d2db8572a5f6c330d89b080061ce"},
- {file = "coverage-7.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b2f144444879363ea8834cd7b6869d79ac796cb8f864b0cfdde50296cd95816"},
- {file = "coverage-7.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60e6347d1ed882b1159ffea172cb8466ee46c665af4ca397edbf10ff53e9ffaf"},
- {file = "coverage-7.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb203c0afffaf1a8f5b9659a013f8f16a1b2cad3a80a8733ceedc968c0cf4c57"},
- {file = "coverage-7.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ad0edaa97cb983d9f2ff48cadddc3e1fb09f24aa558abeb4dc9a0dbacd12cbb4"},
- {file = "coverage-7.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c5f8a5364fc37b2f172c26a038bc7ec4885f429de4a05fc10fdcb53fb5834c5c"},
- {file = "coverage-7.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4e09534037933bf6eb31d804e72c52ec23219b32c1730f9152feabbd7499463"},
- {file = "coverage-7.7.0-cp313-cp313t-win32.whl", hash = "sha256:1b336d06af14f8da5b1f391e8dec03634daf54dfcb4d1c4fb6d04c09d83cef90"},
- {file = "coverage-7.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b54a1ee4c6f1905a436cbaa04b26626d27925a41cbc3a337e2d3ff7038187f07"},
- {file = "coverage-7.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c8fbce80b2b8bf135d105aa8f5b36eae0c57d702a1cc3ebdea2a6f03f6cdde5"},
- {file = "coverage-7.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9710521f07f526de30ccdead67e6b236fe996d214e1a7fba8b36e2ba2cd8261"},
- {file = "coverage-7.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7789e700f33f2b133adae582c9f437523cd5db8de845774988a58c360fc88253"},
- {file = "coverage-7.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c36093aca722db73633cf2359026ed7782a239eb1c6db2abcff876012dc4cf"},
- {file = "coverage-7.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c075d167a6ec99b798c1fdf6e391a1d5a2d054caffe9593ba0f97e3df2c04f0e"},
- {file = "coverage-7.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d013c07061751ae81861cae6ec3a4fe04e84781b11fd4b6b4201590234b25c7b"},
- {file = "coverage-7.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:104bf640f408f4e115b85110047c7f27377e1a8b7ba86f7db4fa47aa49dc9a8e"},
- {file = "coverage-7.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:39abcacd1ed54e2c33c54bdc488b310e8ef6705833f7148b6eb9a547199d375d"},
- {file = "coverage-7.7.0-cp39-cp39-win32.whl", hash = "sha256:8e336b56301774ace6be0017ff85c3566c556d938359b61b840796a0202f805c"},
- {file = "coverage-7.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:8c938c6ae59be67ac19a7204e079efc94b38222cd7d0269f96e45e18cddeaa59"},
- {file = "coverage-7.7.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:3b0e6e54591ae0d7427def8a4d40fca99df6b899d10354bab73cd5609807261c"},
- {file = "coverage-7.7.0-py3-none-any.whl", hash = "sha256:708f0a1105ef2b11c79ed54ed31f17e6325ac936501fc373f24be3e6a578146a"},
- {file = "coverage-7.7.0.tar.gz", hash = "sha256:cd879d4646055a573775a1cec863d00c9ff8c55860f8b17f6d8eee9140c06166"},
+ {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"},
+ {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"},
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"},
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"},
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"},
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"},
+ {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"},
+ {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"},
+ {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"},
+ {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"},
+ {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"},
+ {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"},
+ {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"},
+ {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"},
+ {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"},
+ {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"},
+ {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"},
+ {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"},
+ {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"},
+ {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"},
+ {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"},
+ {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"},
+ {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"},
+ {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"},
+ {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"},
+ {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"},
+ {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"},
+ {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"},
+ {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"},
+ {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"},
+ {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"},
+ {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"},
+ {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"},
+ {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"},
+ {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"},
+ {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"},
+ {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"},
+ {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"},
+ {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"},
+ {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"},
+ {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"},
+ {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"},
+ {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"},
+ {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"},
+ {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"},
+ {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"},
+ {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"},
+ {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"},
+ {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"},
+ {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"},
+ {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"},
+ {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"},
+ {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"},
+ {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"},
+ {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"},
+ {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"},
+ {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"},
+ {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"},
+ {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"},
+ {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"},
+ {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"},
+ {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"},
+ {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"},
+ {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"},
+ {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"},
+ {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"},
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"},
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"},
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"},
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"},
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"},
+ {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"},
]
+[package.dependencies]
+numpy = ">=1.25"
+
[package.extras]
-toml = ["tomli ; python_full_version <= \"3.11.0a6\""]
+bokeh = ["bokeh", "selenium"]
+docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
+mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"]
+test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
+test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
[[package]]
name = "cryptography"
-version = "44.0.2"
+version = "45.0.6"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = "!=3.9.0,!=3.9.1,>=3.7"
groups = ["main"]
-markers = "sys_platform == \"linux\""
-files = [
- {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"},
- {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"},
- {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"},
- {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"},
- {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"},
- {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"},
- {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"},
- {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"},
- {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"},
- {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"},
- {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"},
- {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"},
- {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"},
- {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"},
- {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"},
- {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"},
- {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"},
- {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"},
+files = [
+ {file = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402"},
+ {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42"},
+ {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05"},
+ {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453"},
+ {file = "cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159"},
+ {file = "cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec"},
+ {file = "cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5"},
+ {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016"},
+ {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3"},
+ {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9"},
+ {file = "cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02"},
+ {file = "cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db"},
+ {file = "cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385"},
+ {file = "cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043"},
+ {file = "cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719"},
]
[package.dependencies]
-cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""}
+cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""}
[package.extras]
-docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""]
+docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""]
docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"]
-nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""]
-pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
+nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""]
+pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
sdist = ["build (>=1.0.0)"]
ssh = ["bcrypt (>=3.1.5)"]
-test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
+test = ["certifi (>=2024)", "cryptography-vectors (==45.0.6)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
test-randomorder = ["pytest-randomly"]
[[package]]
-name = "dataclasses-json"
-version = "0.6.7"
-description = "Easily serialize dataclasses to and from JSON."
+name = "cycler"
+version = "0.12.1"
+description = "Composable style cycles"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
+ {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
+]
+
+[package.extras]
+docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
+tests = ["pytest", "pytest-cov", "pytest-xdist"]
+
+[[package]]
+name = "databricks-sdk"
+version = "0.64.0"
+description = "Databricks SDK for Python (Beta)"
optional = false
-python-versions = "<4.0,>=3.7"
+python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a"},
- {file = "dataclasses_json-0.6.7.tar.gz", hash = "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0"},
+ {file = "databricks_sdk-0.64.0-py3-none-any.whl", hash = "sha256:3efb2a739deda3186d0380ad6ced7d4811ced7adcaf61cbf0f897eab52974a17"},
+ {file = "databricks_sdk-0.64.0.tar.gz", hash = "sha256:e21cce45bb4f1254ad5d22ea77fc30484378beb54b5b42db098d1f975c813e81"},
]
[package.dependencies]
-marshmallow = ">=3.18.0,<4.0.0"
-typing-inspect = ">=0.4.0,<1"
+google-auth = ">=2.0,<3.0"
+requests = ">=2.28.1,<3"
+
+[package.extras]
+dev = ["autoflake", "black", "build", "databricks-connect", "httpx", "ipython", "ipywidgets", "isort", "langchain-openai ; python_version > \"3.7\"", "openai", "pycodestyle", "pyfakefs", "pytest", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-xdist", "requests-mock", "wheel"]
+notebook = ["ipython (>=8,<10)", "ipywidgets (>=8,<9)"]
+openai = ["httpx", "langchain-openai ; python_version > \"3.7\"", "openai"]
[[package]]
name = "datasets"
-version = "3.3.2"
+version = "4.0.0"
description = "HuggingFace community-driven open-source library of datasets"
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
- {file = "datasets-3.3.2-py3-none-any.whl", hash = "sha256:fdaf3d5d70242621210b044e9b9b15a56e908bfc3e9d077bcf5605ac390f70bd"},
- {file = "datasets-3.3.2.tar.gz", hash = "sha256:20901a97da870fb80b407ccc45f034a7ac99accd07da897ed42f11641bdb8c6e"},
+ {file = "datasets-4.0.0-py3-none-any.whl", hash = "sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d"},
+ {file = "datasets-4.0.0.tar.gz", hash = "sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1"},
]
[package.dependencies]
-aiohttp = "*"
dill = ">=0.3.0,<0.3.9"
filelock = "*"
-fsspec = {version = ">=2023.1.0,<=2024.12.0", extras = ["http"]}
+fsspec = {version = ">=2023.1.0,<=2025.3.0", extras = ["http"]}
huggingface-hub = ">=0.24.0"
multiprocess = "<0.70.17"
numpy = ">=1.17"
@@ -840,43 +948,39 @@ tqdm = ">=4.66.3"
xxhash = "*"
[package.extras]
-audio = ["librosa", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\""]
+audio = ["soundfile (>=0.12.1)", "torch (>=2.7.0)", "torchcodec (>=0.4.0)"]
benchmarks = ["tensorflow (==2.12.0)", "torch (==2.0.1)", "transformers (==4.30.1)"]
-dev = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "s3fs", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchdata", "transformers", "transformers (>=4.42.0)", "zstandard"]
-docs = ["s3fs", "tensorflow (>=2.6.0)", "torch", "transformers"]
+dev = ["Pillow (>=9.4.0)", "absl-py", "aiohttp", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "numba (>=0.56.4)", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "ruff (>=0.3.0)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\" and sys_platform != \"win32\"", "tensorflow (>=2.6.0)", "tensorflow (>=2.6.0) ; python_version < \"3.10\" and sys_platform != \"win32\"", "tiktoken", "torch", "torch (>=2.0.0)", "torchcodec (>=0.4.0) ; sys_platform != \"win32\"", "torchdata", "transformers", "transformers (>=4.42.0)", "zstandard"]
+docs = ["tensorflow (>=2.6.0)", "torch", "transformers"]
jax = ["jax (>=0.3.14)", "jaxlib (>=0.3.14)"]
+pdfs = ["pdfplumber (>=0.11.4)"]
quality = ["ruff (>=0.3.0)"]
-s3 = ["s3fs"]
tensorflow = ["tensorflow (>=2.6.0)"]
tensorflow-gpu = ["tensorflow (>=2.6.0)"]
-tests = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "librosa", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\"", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"]
-tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "decorator", "decord (==0.6.0)", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "s3fs (>=2021.11.1)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "soxr (>=0.4.0) ; python_version >= \"3.9\"", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchdata", "transformers (>=4.42.0)", "zstandard"]
+tests = ["Pillow (>=9.4.0)", "absl-py", "aiohttp", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "faiss-cpu (>=1.8.0.post1)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "numba (>=0.56.4)", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tensorflow (>=2.16.0) ; python_version >= \"3.10\" and sys_platform != \"win32\"", "tensorflow (>=2.6.0) ; python_version < \"3.10\" and sys_platform != \"win32\"", "tiktoken", "torch (>=2.0.0)", "torchcodec (>=0.4.0) ; sys_platform != \"win32\"", "torchdata", "transformers (>=4.42.0)", "zstandard"]
+tests-numpy2 = ["Pillow (>=9.4.0)", "absl-py", "aiohttp", "decorator", "elasticsearch (>=7.17.12,<8.0.0)", "jax (>=0.3.14) ; sys_platform != \"win32\"", "jaxlib (>=0.3.14) ; sys_platform != \"win32\"", "joblib (<1.3.0)", "joblibspark", "lz4", "moto[server]", "numba (>=0.56.4)", "polars[timezone] (>=0.20.0)", "protobuf (<4.0.0)", "py7zr", "pyspark (>=3.4)", "pytest", "pytest-datadir", "pytest-xdist", "rarfile (>=4.0)", "soundfile (>=0.12.1)", "soundfile (>=0.12.1)", "sqlalchemy", "tiktoken", "torch (>=2.0.0)", "torchcodec (>=0.4.0) ; sys_platform != \"win32\"", "torchdata", "transformers (>=4.42.0)", "zstandard"]
torch = ["torch"]
vision = ["Pillow (>=9.4.0)"]
[[package]]
name = "deepeval"
-version = "2.7.1"
+version = "3.3.6"
description = "The LLM Evaluation Framework"
optional = false
python-versions = "<4.0,>=3.9"
groups = ["main"]
files = [
- {file = "deepeval-2.7.1-py3-none-any.whl", hash = "sha256:f16a66bd1a5feaef595831f436a765100af46565dc60753b0fae549878e5d173"},
- {file = "deepeval-2.7.1.tar.gz", hash = "sha256:2bf5939b7503f64dd79453be90edba51f24cfe7a7c0e458c1df62ffe75e45eb8"},
+ {file = "deepeval-3.3.6-py3-none-any.whl", hash = "sha256:0bbf2551d2310e470919860b22c2ee32e2853b4f33f3aebf63c6f82e2dcb8ce4"},
+ {file = "deepeval-3.3.6.tar.gz", hash = "sha256:76c3e51cd1879fc7493f722f93cf5432275833f85f4aff4581e42333cf805945"},
]
[package.dependencies]
aiohttp = "*"
-anthropic = ">=0.49.0,<0.50.0"
-black = "*"
-coverage = "*"
+anthropic = "*"
+click = ">=8.0.0,<8.3.0"
google-genai = ">=1.9.0,<2.0.0"
grpcio = ">=1.67.1,<2.0.0"
-instructor = "*"
-langchain_community = "*"
-langchain_openai = "*"
-llama-index = "*"
+nest_asyncio = "*"
ollama = "*"
openai = "*"
opentelemetry-api = ">=1.24.0,<2.0.0"
@@ -884,40 +988,22 @@ opentelemetry-exporter-otlp-proto-grpc = ">=1.24.0,<2.0.0"
opentelemetry-sdk = ">=1.24.0,<2.0.0"
portalocker = "*"
posthog = ">=3.23.0,<4.0.0"
+pyfiglet = "*"
pytest = "*"
pytest-asyncio = "*"
pytest-repeat = "*"
pytest-rerunfailures = ">=12.0,<13.0"
pytest-xdist = "*"
requests = ">=2.31.0,<3.0.0"
-rich = ">=13.6.0,<14.0.0"
+rich = ">=13.6.0,<15.0.0"
sentry-sdk = "*"
setuptools = "*"
tabulate = ">=0.9.0,<0.10.0"
-tenacity = "<=9.0.0"
+tenacity = ">=8.0.0,<=10.0.0"
tqdm = ">=4.66.1,<5.0.0"
-twine = "5.1.1"
-typer = "*"
+typer = ">=0.9,<1.0.0"
wheel = "*"
-[[package]]
-name = "deprecated"
-version = "1.2.18"
-description = "Python @deprecated decorator to deprecate old python classes, functions or methods."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
-groups = ["main"]
-files = [
- {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"},
- {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"},
-]
-
-[package.dependencies]
-wrapt = ">=1.10,<2"
-
-[package.extras]
-dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"]
-
[[package]]
name = "dill"
version = "0.3.8"
@@ -934,18 +1020,6 @@ files = [
graph = ["objgraph (>=1.7.2)"]
profile = ["gprof2dot (>=2022.7.29)"]
-[[package]]
-name = "dirtyjson"
-version = "1.0.8"
-description = "JSON decoder for Python that can extract data from the muck"
-optional = false
-python-versions = "*"
-groups = ["main"]
-files = [
- {file = "dirtyjson-1.0.8-py3-none-any.whl", hash = "sha256:125e27248435a58acace26d5c2c4c11a1c0de0a9c5124c5a94ba78e517d74f53"},
- {file = "dirtyjson-1.0.8.tar.gz", hash = "sha256:90ca4a18f3ff30ce849d100dcf4a003953c79d3a2348ef056f1d9c22231a25fd"},
-]
-
[[package]]
name = "diskcache"
version = "5.6.3"
@@ -960,14 +1034,14 @@ files = [
[[package]]
name = "distlib"
-version = "0.3.9"
+version = "0.4.0"
description = "Distribution utilities"
optional = false
python-versions = "*"
groups = ["dev"]
files = [
- {file = "distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87"},
- {file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
+ {file = "distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16"},
+ {file = "distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d"},
]
[[package]]
@@ -983,31 +1057,27 @@ files = [
]
[[package]]
-name = "docker-pycreds"
-version = "0.4.0"
-description = "Python bindings for the docker credentials store API"
+name = "docker"
+version = "7.1.0"
+description = "A Python library for the Docker Engine API."
optional = false
-python-versions = "*"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"},
- {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"},
+ {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"},
+ {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"},
]
[package.dependencies]
-six = ">=1.4.0"
+pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""}
+requests = ">=2.26.0"
+urllib3 = ">=1.26.0"
-[[package]]
-name = "docstring-parser"
-version = "0.16"
-description = "Parse Python docstrings in reST, Google and Numpydoc format"
-optional = false
-python-versions = ">=3.6,<4.0"
-groups = ["main"]
-files = [
- {file = "docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637"},
- {file = "docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e"},
-]
+[package.extras]
+dev = ["coverage (==7.2.7)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.1.0)", "ruff (==0.1.8)"]
+docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"]
+ssh = ["paramiko (>=2.4.3)"]
+websockets = ["websocket-client (>=1.3.0)"]
[[package]]
name = "docutils"
@@ -1051,16 +1121,38 @@ files = [
[package.extras]
testing = ["hatch", "pre-commit", "pytest", "tox"]
+[[package]]
+name = "fastapi"
+version = "0.116.1"
+description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
+optional = false
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565"},
+ {file = "fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143"},
+]
+
+[package.dependencies]
+pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
+starlette = ">=0.40.0,<0.48.0"
+typing-extensions = ">=4.8.0"
+
+[package.extras]
+all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
+standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
+standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
+
[[package]]
name = "filelock"
-version = "3.17.0"
+version = "3.18.0"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
- {file = "filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338"},
- {file = "filelock-3.17.0.tar.gz", hash = "sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e"},
+ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"},
+ {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"},
]
[package.extras]
@@ -1069,129 +1161,252 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.6.10)", "diff-cover (>=9.2.1)",
typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
[[package]]
-name = "filetype"
-version = "1.2.0"
-description = "Infer file type and MIME type of any file/buffer. No external dependencies."
+name = "fire"
+version = "0.7.1"
+description = "A library for automatically generating command line interfaces."
optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+groups = ["main"]
+files = [
+ {file = "fire-0.7.1-py3-none-any.whl", hash = "sha256:e43fd8a5033a9001e7e2973bab96070694b9f12f2e0ecf96d4683971b5ab1882"},
+ {file = "fire-0.7.1.tar.gz", hash = "sha256:3b208f05c736de98fb343310d090dcc4d8c78b2a89ea4f32b837c586270a9cbf"},
+]
+
+[package.dependencies]
+termcolor = "*"
+
+[package.extras]
+test = ["hypothesis (<6.136.0)", "levenshtein (<=0.27.1)", "pip", "pylint (<3.3.8)", "pytest (<=8.4.1)", "pytest-pylint (<=1.1.2)", "pytest-runner (<7.0.0)", "setuptools (<=80.9.0)", "termcolor (<3.2.0)"]
+
+[[package]]
+name = "flask"
+version = "3.1.2"
+description = "A simple framework for building complex web applications."
+optional = false
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"},
- {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"},
+ {file = "flask-3.1.2-py3-none-any.whl", hash = "sha256:ca1d8112ec8a6158cc29ea4858963350011b5c846a414cdb7a954aa9e967d03c"},
+ {file = "flask-3.1.2.tar.gz", hash = "sha256:bf656c15c80190ed628ad08cdfd3aaa35beb087855e2f494910aa3774cc4fd87"},
]
+[package.dependencies]
+blinker = ">=1.9.0"
+click = ">=8.1.3"
+itsdangerous = ">=2.2.0"
+jinja2 = ">=3.1.2"
+markupsafe = ">=2.1.1"
+werkzeug = ">=3.1.0"
+
+[package.extras]
+async = ["asgiref (>=3.2)"]
+dotenv = ["python-dotenv"]
+
+[[package]]
+name = "fonttools"
+version = "4.59.1"
+description = "Tools to manipulate font files"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "fonttools-4.59.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e90a89e52deb56b928e761bb5b5f65f13f669bfd96ed5962975debea09776a23"},
+ {file = "fonttools-4.59.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d29ab70658d2ec19422b25e6ace00a0b0ae4181ee31e03335eaef53907d2d83"},
+ {file = "fonttools-4.59.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f9721a564978a10d5c12927f99170d18e9a32e5a727c61eae56f956a4d118b"},
+ {file = "fonttools-4.59.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c8758a7d97848fc8b514b3d9b4cb95243714b2f838dde5e1e3c007375de6214"},
+ {file = "fonttools-4.59.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2aeb829ad9d41a2ef17cab8bb5d186049ba38a840f10352e654aa9062ec32dc1"},
+ {file = "fonttools-4.59.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac216a2980a2d2b3b88c68a24f8a9bfb203e2490e991b3238502ad8f1e7bfed0"},
+ {file = "fonttools-4.59.1-cp310-cp310-win32.whl", hash = "sha256:d31dc137ed8ec71dbc446949eba9035926e6e967b90378805dcf667ff57cabb1"},
+ {file = "fonttools-4.59.1-cp310-cp310-win_amd64.whl", hash = "sha256:5265bc52ed447187d39891b5f21d7217722735d0de9fe81326566570d12851a9"},
+ {file = "fonttools-4.59.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4909cce2e35706f3d18c54d3dcce0414ba5e0fb436a454dffec459c61653b513"},
+ {file = "fonttools-4.59.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efbec204fa9f877641747f2d9612b2b656071390d7a7ef07a9dbf0ecf9c7195c"},
+ {file = "fonttools-4.59.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39dfd42cc2dc647b2c5469bc7a5b234d9a49e72565b96dd14ae6f11c2c59ef15"},
+ {file = "fonttools-4.59.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b11bc177a0d428b37890825d7d025040d591aa833f85f8d8878ed183354f47df"},
+ {file = "fonttools-4.59.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b9b4c35b3be45e5bc774d3fc9608bbf4f9a8d371103b858c80edbeed31dd5aa"},
+ {file = "fonttools-4.59.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:01158376b8a418a0bae9625c476cebfcfcb5e6761e9d243b219cd58341e7afbb"},
+ {file = "fonttools-4.59.1-cp311-cp311-win32.whl", hash = "sha256:cf7c5089d37787387123f1cb8f1793a47c5e1e3d1e4e7bfbc1cc96e0f925eabe"},
+ {file = "fonttools-4.59.1-cp311-cp311-win_amd64.whl", hash = "sha256:c866eef7a0ba320486ade6c32bfc12813d1a5db8567e6904fb56d3d40acc5116"},
+ {file = "fonttools-4.59.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:43ab814bbba5f02a93a152ee61a04182bb5809bd2bc3609f7822e12c53ae2c91"},
+ {file = "fonttools-4.59.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4f04c3ffbfa0baafcbc550657cf83657034eb63304d27b05cff1653b448ccff6"},
+ {file = "fonttools-4.59.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d601b153e51a5a6221f0d4ec077b6bfc6ac35bfe6c19aeaa233d8990b2b71726"},
+ {file = "fonttools-4.59.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c735e385e30278c54f43a0d056736942023c9043f84ee1021eff9fd616d17693"},
+ {file = "fonttools-4.59.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1017413cdc8555dce7ee23720da490282ab7ec1cf022af90a241f33f9a49afc4"},
+ {file = "fonttools-4.59.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5c6d8d773470a5107052874341ed3c487c16ecd179976d81afed89dea5cd7406"},
+ {file = "fonttools-4.59.1-cp312-cp312-win32.whl", hash = "sha256:2a2d0d33307f6ad3a2086a95dd607c202ea8852fa9fb52af9b48811154d1428a"},
+ {file = "fonttools-4.59.1-cp312-cp312-win_amd64.whl", hash = "sha256:0b9e4fa7eaf046ed6ac470f6033d52c052481ff7a6e0a92373d14f556f298dc0"},
+ {file = "fonttools-4.59.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:89d9957b54246c6251345297dddf77a84d2c19df96af30d2de24093bbdf0528b"},
+ {file = "fonttools-4.59.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8156b11c0d5405810d216f53907bd0f8b982aa5f1e7e3127ab3be1a4062154ff"},
+ {file = "fonttools-4.59.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8387876a8011caec52d327d5e5bca705d9399ec4b17afb8b431ec50d47c17d23"},
+ {file = "fonttools-4.59.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb13823a74b3a9204a8ed76d3d6d5ec12e64cc5bc44914eb9ff1cdac04facd43"},
+ {file = "fonttools-4.59.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e1ca10da138c300f768bb68e40e5b20b6ecfbd95f91aac4cc15010b6b9d65455"},
+ {file = "fonttools-4.59.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2beb5bfc4887a3130f8625349605a3a45fe345655ce6031d1bac11017454b943"},
+ {file = "fonttools-4.59.1-cp313-cp313-win32.whl", hash = "sha256:419f16d750d78e6d704bfe97b48bba2f73b15c9418f817d0cb8a9ca87a5b94bf"},
+ {file = "fonttools-4.59.1-cp313-cp313-win_amd64.whl", hash = "sha256:c536f8a852e8d3fa71dde1ec03892aee50be59f7154b533f0bf3c1174cfd5126"},
+ {file = "fonttools-4.59.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d5c3bfdc9663f3d4b565f9cb3b8c1efb3e178186435b45105bde7328cfddd7fe"},
+ {file = "fonttools-4.59.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ea03f1da0d722fe3c2278a05957e6550175571a4894fbf9d178ceef4a3783d2b"},
+ {file = "fonttools-4.59.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57a3708ca6bfccb790f585fa6d8f29432ec329618a09ff94c16bcb3c55994643"},
+ {file = "fonttools-4.59.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:729367c91eb1ee84e61a733acc485065a00590618ca31c438e7dd4d600c01486"},
+ {file = "fonttools-4.59.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f8ef66ac6db450193ed150e10b3b45dde7aded10c5d279968bc63368027f62b"},
+ {file = "fonttools-4.59.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:075f745d539a998cd92cb84c339a82e53e49114ec62aaea8307c80d3ad3aef3a"},
+ {file = "fonttools-4.59.1-cp314-cp314-win32.whl", hash = "sha256:c2b0597522d4c5bb18aa5cf258746a2d4a90f25878cbe865e4d35526abd1b9fc"},
+ {file = "fonttools-4.59.1-cp314-cp314-win_amd64.whl", hash = "sha256:e9ad4ce044e3236f0814c906ccce8647046cc557539661e35211faadf76f283b"},
+ {file = "fonttools-4.59.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:652159e8214eb4856e8387ebcd6b6bd336ee258cbeb639c8be52005b122b9609"},
+ {file = "fonttools-4.59.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:43d177cd0e847ea026fedd9f099dc917da136ed8792d142298a252836390c478"},
+ {file = "fonttools-4.59.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e54437651e1440ee53a95e6ceb6ee440b67a3d348c76f45f4f48de1a5ecab019"},
+ {file = "fonttools-4.59.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6065fdec8ff44c32a483fd44abe5bcdb40dd5e2571a5034b555348f2b3a52cea"},
+ {file = "fonttools-4.59.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42052b56d176f8b315fbc09259439c013c0cb2109df72447148aeda677599612"},
+ {file = "fonttools-4.59.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bcd52eaa5c4c593ae9f447c1d13e7e4a00ca21d755645efa660b6999425b3c88"},
+ {file = "fonttools-4.59.1-cp314-cp314t-win32.whl", hash = "sha256:02e4fdf27c550dded10fe038a5981c29f81cb9bc649ff2eaa48e80dab8998f97"},
+ {file = "fonttools-4.59.1-cp314-cp314t-win_amd64.whl", hash = "sha256:412a5fd6345872a7c249dac5bcce380393f40c1c316ac07f447bc17d51900922"},
+ {file = "fonttools-4.59.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ab4c1fb45f2984b8b4a3face7cff0f67f9766e9414cbb6fd061e9d77819de98"},
+ {file = "fonttools-4.59.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ee39da0227950f88626c91e219659e6cd725ede826b1c13edd85fc4cec9bbe6"},
+ {file = "fonttools-4.59.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58a8844f96cff35860647a65345bfca87f47a2494bfb4bef754e58c082511443"},
+ {file = "fonttools-4.59.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f3f021cea6e36410874763f4a517a5e2d6ac36ca8f95521f3a9fdaad0fe73dc"},
+ {file = "fonttools-4.59.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bf5fb864f80061a40c1747e0dbc4f6e738de58dd6675b07eb80bd06a93b063c4"},
+ {file = "fonttools-4.59.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c29ea087843e27a7cffc78406d32a5abf166d92afde7890394e9e079c9b4dbe9"},
+ {file = "fonttools-4.59.1-cp39-cp39-win32.whl", hash = "sha256:a960b09ff50c2e87864e83f352e5a90bcf1ad5233df579b1124660e1643de272"},
+ {file = "fonttools-4.59.1-cp39-cp39-win_amd64.whl", hash = "sha256:e3680884189e2b7c3549f6d304376e64711fd15118e4b1ae81940cb6b1eaa267"},
+ {file = "fonttools-4.59.1-py3-none-any.whl", hash = "sha256:647db657073672a8330608970a984d51573557f328030566521bc03415535042"},
+ {file = "fonttools-4.59.1.tar.gz", hash = "sha256:74995b402ad09822a4c8002438e54940d9f1ecda898d2bb057729d7da983e4cb"},
+]
+
+[package.extras]
+all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"]
+graphite = ["lz4 (>=1.7.4.2)"]
+interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""]
+lxml = ["lxml (>=4.0)"]
+pathops = ["skia-pathops (>=0.5.0)"]
+plot = ["matplotlib"]
+repacker = ["uharfbuzz (>=0.23.0)"]
+symfont = ["sympy"]
+type1 = ["xattr ; sys_platform == \"darwin\""]
+unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""]
+woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"]
+
[[package]]
name = "frozenlist"
-version = "1.5.0"
+version = "1.7.0"
description = "A list-like structure which implements collections.abc.MutableSequence"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"},
- {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"},
- {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"},
- {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"},
- {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"},
- {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"},
- {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"},
- {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"},
- {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"},
- {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"},
- {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"},
- {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"},
- {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"},
- {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"},
- {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"},
- {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"},
- {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"},
- {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"},
- {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"},
- {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"},
- {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"},
- {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"},
- {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"},
- {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"},
- {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"},
- {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"},
- {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"},
- {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"},
- {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"},
- {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"},
- {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"},
- {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"},
- {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"},
- {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"},
- {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"},
- {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"},
- {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"},
- {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"},
- {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"},
- {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"},
- {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"},
- {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"},
- {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"},
- {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"},
- {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"},
- {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"},
- {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"},
- {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"},
- {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"},
- {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"},
- {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"},
- {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"},
- {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"},
- {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"},
- {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"},
- {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"},
- {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"},
- {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"},
- {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"},
- {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"},
- {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"},
- {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"},
- {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"},
- {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"},
- {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"},
- {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"},
- {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"},
- {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"},
- {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"},
- {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"},
- {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"},
- {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"},
- {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"},
- {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"},
- {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"},
- {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"},
- {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"},
- {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"},
- {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"},
- {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"},
- {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"},
- {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"},
- {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"},
- {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"},
- {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"},
- {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"},
- {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"},
- {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"},
- {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"},
- {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"},
- {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"},
- {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"},
+ {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"},
+ {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"},
+ {file = "frozenlist-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615"},
+ {file = "frozenlist-1.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd"},
+ {file = "frozenlist-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718"},
+ {file = "frozenlist-1.7.0-cp310-cp310-win32.whl", hash = "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e"},
+ {file = "frozenlist-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464"},
+ {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a"},
+ {file = "frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750"},
+ {file = "frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86"},
+ {file = "frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898"},
+ {file = "frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56"},
+ {file = "frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7"},
+ {file = "frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d"},
+ {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2"},
+ {file = "frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb"},
+ {file = "frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e"},
+ {file = "frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08"},
+ {file = "frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43"},
+ {file = "frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3"},
+ {file = "frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a"},
+ {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee"},
+ {file = "frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d"},
+ {file = "frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60"},
+ {file = "frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b"},
+ {file = "frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e"},
+ {file = "frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1"},
+ {file = "frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81"},
+ {file = "frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e"},
+ {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630"},
+ {file = "frozenlist-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71"},
+ {file = "frozenlist-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87"},
+ {file = "frozenlist-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd"},
+ {file = "frozenlist-1.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb"},
+ {file = "frozenlist-1.7.0-cp39-cp39-win32.whl", hash = "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e"},
+ {file = "frozenlist-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63"},
+ {file = "frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e"},
+ {file = "frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f"},
]
[[package]]
name = "fsspec"
-version = "2024.12.0"
+version = "2025.3.0"
description = "File-system specification"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"},
- {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"},
+ {file = "fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3"},
+ {file = "fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972"},
]
[package.dependencies]
@@ -1221,7 +1436,7 @@ sftp = ["paramiko"]
smb = ["smbprotocol"]
ssh = ["paramiko"]
test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"]
-test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"]
+test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"]
test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"]
tqdm = ["tqdm"]
@@ -1242,14 +1457,14 @@ smmap = ">=3.0.1,<6"
[[package]]
name = "gitpython"
-version = "3.1.44"
+version = "3.1.45"
description = "GitPython is a Python library used to interact with Git repositories"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110"},
- {file = "gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269"},
+ {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"},
+ {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"},
]
[package.dependencies]
@@ -1261,14 +1476,14 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.
[[package]]
name = "google-auth"
-version = "2.38.0"
+version = "2.40.3"
description = "Google Authentication Library"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"},
- {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"},
+ {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"},
+ {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"},
]
[package.dependencies]
@@ -1277,23 +1492,25 @@ pyasn1-modules = ">=0.2.1"
rsa = ">=3.1.4,<5"
[package.extras]
-aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"]
+aiohttp = ["aiohttp (>=3.6.2,<4.0.0)", "requests (>=2.20.0,<3.0.0)"]
enterprise-cert = ["cryptography", "pyopenssl"]
-pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"]
-pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"]
+pyjwt = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyjwt (>=2.0)"]
+pyopenssl = ["cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"]
reauth = ["pyu2f (>=0.1.5)"]
-requests = ["requests (>=2.20.0,<3.0.0.dev0)"]
+requests = ["requests (>=2.20.0,<3.0.0)"]
+testing = ["aiohttp (<3.10.0)", "aiohttp (>=3.6.2,<4.0.0)", "aioresponses", "cryptography (<39.0.0) ; python_version < \"3.8\"", "cryptography (>=38.0.3)", "flask", "freezegun", "grpcio", "mock", "oauth2client", "packaging", "pyjwt (>=2.0)", "pyopenssl (<24.3.0)", "pyopenssl (>=20.0.0)", "pytest", "pytest-asyncio", "pytest-cov", "pytest-localserver", "pyu2f (>=0.1.5)", "requests (>=2.20.0,<3.0.0)", "responses", "urllib3"]
+urllib3 = ["packaging", "urllib3"]
[[package]]
name = "google-genai"
-version = "1.10.0"
+version = "1.29.0"
description = "GenAI Python SDK"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "google_genai-1.10.0-py3-none-any.whl", hash = "sha256:41b105a2fcf8a027fc45cc16694cd559b8cd1272eab7345ad58cfa2c353bf34f"},
- {file = "google_genai-1.10.0.tar.gz", hash = "sha256:f59423e0f155dc66b7792c8a0e6724c75c72dc699d1eb7907d4d0006d4f6186f"},
+ {file = "google_genai-1.29.0-py3-none-any.whl", hash = "sha256:8b64737de008d15ca4737e593913f88f656f0568544ab6901f768f0d1fd69bbf"},
+ {file = "google_genai-1.29.0.tar.gz", hash = "sha256:a6b036ab032830f668d137b198c2a5abd8951a036d7a8480b61ce837c1c7f36b"},
]
[package.dependencies]
@@ -1302,210 +1519,285 @@ google-auth = ">=2.14.1,<3.0.0"
httpx = ">=0.28.1,<1.0.0"
pydantic = ">=2.0.0,<3.0.0"
requests = ">=2.28.1,<3.0.0"
+tenacity = ">=8.2.3,<9.2.0"
typing-extensions = ">=4.11.0,<5.0.0"
websockets = ">=13.0.0,<15.1.0"
+[package.extras]
+aiohttp = ["aiohttp (<4.0.0)"]
+
[[package]]
name = "googleapis-common-protos"
-version = "1.69.1"
+version = "1.70.0"
description = "Common protobufs used in Google APIs"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "googleapis_common_protos-1.69.1-py2.py3-none-any.whl", hash = "sha256:4077f27a6900d5946ee5a369fab9c8ded4c0ef1c6e880458ea2f70c14f7b70d5"},
- {file = "googleapis_common_protos-1.69.1.tar.gz", hash = "sha256:e20d2d8dda87da6fe7340afbbdf4f0bcb4c8fae7e6cadf55926c31f946b0b9b1"},
+ {file = "googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8"},
+ {file = "googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257"},
+]
+
+[package.dependencies]
+protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<7.0.0"
+
+[package.extras]
+grpc = ["grpcio (>=1.44.0,<2.0.0)"]
+
+[[package]]
+name = "graphene"
+version = "3.4.3"
+description = "GraphQL Framework for Python"
+optional = false
+python-versions = "*"
+groups = ["main"]
+files = [
+ {file = "graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71"},
+ {file = "graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa"},
]
[package.dependencies]
-protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0"
+graphql-core = ">=3.1,<3.3"
+graphql-relay = ">=3.1,<3.3"
+python-dateutil = ">=2.7.0,<3"
+typing-extensions = ">=4.7.1,<5"
[package.extras]
-grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"]
+dev = ["coveralls (>=3.3,<5)", "mypy (>=1.10,<2)", "pytest (>=8,<9)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=4,<5)", "pytest-cov (>=5,<6)", "pytest-mock (>=3,<4)", "ruff (==0.5.0)", "types-python-dateutil (>=2.8.1,<3)"]
+test = ["coveralls (>=3.3,<5)", "pytest (>=8,<9)", "pytest-asyncio (>=0.16,<2)", "pytest-benchmark (>=4,<5)", "pytest-cov (>=5,<6)", "pytest-mock (>=3,<4)"]
+
+[[package]]
+name = "graphql-core"
+version = "3.2.6"
+description = "GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL."
+optional = false
+python-versions = "<4,>=3.6"
+groups = ["main"]
+files = [
+ {file = "graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f"},
+ {file = "graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab"},
+]
+
+[[package]]
+name = "graphql-relay"
+version = "3.2.0"
+description = "Relay library for graphql-core"
+optional = false
+python-versions = ">=3.6,<4"
+groups = ["main"]
+files = [
+ {file = "graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c"},
+ {file = "graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5"},
+]
+
+[package.dependencies]
+graphql-core = ">=3.2,<3.3"
[[package]]
name = "greenlet"
-version = "3.1.1"
+version = "3.2.4"
description = "Lightweight in-process concurrent programming"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""
files = [
- {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"},
- {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"},
- {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"},
- {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"},
- {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"},
- {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"},
- {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"},
- {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"},
- {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"},
- {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"},
- {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"},
- {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"},
- {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"},
- {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"},
- {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"},
- {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"},
- {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"},
- {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"},
- {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"},
- {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"},
- {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"},
- {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"},
- {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"},
- {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"},
- {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"},
- {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"},
- {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"},
- {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"},
- {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"},
- {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"},
- {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"},
- {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"},
- {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"},
+ {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"},
+ {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"},
+ {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"},
+ {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"},
+ {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"},
+ {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"},
+ {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"},
+ {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"},
+ {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"},
+ {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"},
+ {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"},
+ {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"},
+ {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"},
+ {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"},
+ {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"},
+ {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"},
+ {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"},
+ {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"},
+ {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"},
+ {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"},
+ {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"},
+ {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"},
+ {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"},
+ {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"},
+ {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"},
+ {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"},
+ {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"},
+ {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"},
+ {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"},
+ {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"},
+ {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"},
+ {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"},
+ {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"},
+ {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"},
+ {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"},
+ {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"},
+ {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"},
+ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"},
+ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"},
+ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"},
+ {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"},
+ {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"},
+ {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"},
+ {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"},
+ {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"},
+ {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"},
+ {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"},
+ {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"},
+ {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"},
+ {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"},
+ {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"},
+ {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"},
+ {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"},
+ {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"},
]
[package.extras]
docs = ["Sphinx", "furo"]
-test = ["objgraph", "psutil"]
+test = ["objgraph", "psutil", "setuptools"]
[[package]]
name = "grpcio"
-version = "1.70.0"
+version = "1.74.0"
description = "HTTP/2-based RPC framework"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "grpcio-1.74.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:85bd5cdf4ed7b2d6438871adf6afff9af7096486fcf51818a81b77ef4dd30907"},
+ {file = "grpcio-1.74.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:68c8ebcca945efff9d86d8d6d7bfb0841cf0071024417e2d7f45c5e46b5b08eb"},
+ {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e154d230dc1bbbd78ad2fdc3039fa50ad7ffcf438e4eb2fa30bce223a70c7486"},
+ {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8978003816c7b9eabe217f88c78bc26adc8f9304bf6a594b02e5a49b2ef9c11"},
+ {file = "grpcio-1.74.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3d7bd6e3929fd2ea7fbc3f562e4987229ead70c9ae5f01501a46701e08f1ad9"},
+ {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:136b53c91ac1d02c8c24201bfdeb56f8b3ac3278668cbb8e0ba49c88069e1bdc"},
+ {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe0f540750a13fd8e5da4b3eaba91a785eea8dca5ccd2bc2ffe978caa403090e"},
+ {file = "grpcio-1.74.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4e4181bfc24413d1e3a37a0b7889bea68d973d4b45dd2bc68bb766c140718f82"},
+ {file = "grpcio-1.74.0-cp310-cp310-win32.whl", hash = "sha256:1733969040989f7acc3d94c22f55b4a9501a30f6aaacdbccfaba0a3ffb255ab7"},
+ {file = "grpcio-1.74.0-cp310-cp310-win_amd64.whl", hash = "sha256:9e912d3c993a29df6c627459af58975b2e5c897d93287939b9d5065f000249b5"},
+ {file = "grpcio-1.74.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:69e1a8180868a2576f02356565f16635b99088da7df3d45aaa7e24e73a054e31"},
+ {file = "grpcio-1.74.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8efe72fde5500f47aca1ef59495cb59c885afe04ac89dd11d810f2de87d935d4"},
+ {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a8f0302f9ac4e9923f98d8e243939a6fb627cd048f5cd38595c97e38020dffce"},
+ {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f609a39f62a6f6f05c7512746798282546358a37ea93c1fcbadf8b2fed162e3"},
+ {file = "grpcio-1.74.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98e0b7434a7fa4e3e63f250456eaef52499fba5ae661c58cc5b5477d11e7182"},
+ {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:662456c4513e298db6d7bd9c3b8df6f75f8752f0ba01fb653e252ed4a59b5a5d"},
+ {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3d14e3c4d65e19d8430a4e28ceb71ace4728776fd6c3ce34016947474479683f"},
+ {file = "grpcio-1.74.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bf949792cee20d2078323a9b02bacbbae002b9e3b9e2433f2741c15bdeba1c4"},
+ {file = "grpcio-1.74.0-cp311-cp311-win32.whl", hash = "sha256:55b453812fa7c7ce2f5c88be3018fb4a490519b6ce80788d5913f3f9d7da8c7b"},
+ {file = "grpcio-1.74.0-cp311-cp311-win_amd64.whl", hash = "sha256:86ad489db097141a907c559988c29718719aa3e13370d40e20506f11b4de0d11"},
+ {file = "grpcio-1.74.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:8533e6e9c5bd630ca98062e3a1326249e6ada07d05acf191a77bc33f8948f3d8"},
+ {file = "grpcio-1.74.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:2918948864fec2a11721d91568effffbe0a02b23ecd57f281391d986847982f6"},
+ {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:60d2d48b0580e70d2e1954d0d19fa3c2e60dd7cbed826aca104fff518310d1c5"},
+ {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3601274bc0523f6dc07666c0e01682c94472402ac2fd1226fd96e079863bfa49"},
+ {file = "grpcio-1.74.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:176d60a5168d7948539def20b2a3adcce67d72454d9ae05969a2e73f3a0feee7"},
+ {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e759f9e8bc908aaae0412642afe5416c9f983a80499448fcc7fab8692ae044c3"},
+ {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e7c4389771855a92934b2846bd807fc25a3dfa820fd912fe6bd8136026b2707"},
+ {file = "grpcio-1.74.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cce634b10aeab37010449124814b05a62fb5f18928ca878f1bf4750d1f0c815b"},
+ {file = "grpcio-1.74.0-cp312-cp312-win32.whl", hash = "sha256:885912559974df35d92219e2dc98f51a16a48395f37b92865ad45186f294096c"},
+ {file = "grpcio-1.74.0-cp312-cp312-win_amd64.whl", hash = "sha256:42f8fee287427b94be63d916c90399ed310ed10aadbf9e2e5538b3e497d269bc"},
+ {file = "grpcio-1.74.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89"},
+ {file = "grpcio-1.74.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01"},
+ {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e"},
+ {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91"},
+ {file = "grpcio-1.74.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249"},
+ {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362"},
+ {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f"},
+ {file = "grpcio-1.74.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20"},
+ {file = "grpcio-1.74.0-cp313-cp313-win32.whl", hash = "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa"},
+ {file = "grpcio-1.74.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24"},
+ {file = "grpcio-1.74.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4bc5fca10aaf74779081e16c2bcc3d5ec643ffd528d9e7b1c9039000ead73bae"},
+ {file = "grpcio-1.74.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:6bab67d15ad617aff094c382c882e0177637da73cbc5532d52c07b4ee887a87b"},
+ {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:655726919b75ab3c34cdad39da5c530ac6fa32696fb23119e36b64adcfca174a"},
+ {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a2b06afe2e50ebfd46247ac3ba60cac523f54ec7792ae9ba6073c12daf26f0a"},
+ {file = "grpcio-1.74.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f251c355167b2360537cf17bea2cf0197995e551ab9da6a0a59b3da5e8704f9"},
+ {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f7b5882fb50632ab1e48cb3122d6df55b9afabc265582808036b6e51b9fd6b7"},
+ {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:834988b6c34515545b3edd13e902c1acdd9f2465d386ea5143fb558f153a7176"},
+ {file = "grpcio-1.74.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:22b834cef33429ca6cc28303c9c327ba9a3fafecbf62fae17e9a7b7163cc43ac"},
+ {file = "grpcio-1.74.0-cp39-cp39-win32.whl", hash = "sha256:7d95d71ff35291bab3f1c52f52f474c632db26ea12700c2ff0ea0532cb0b5854"},
+ {file = "grpcio-1.74.0-cp39-cp39-win_amd64.whl", hash = "sha256:ecde9ab49f58433abe02f9ed076c7b5be839cf0153883a6d23995937a82392fa"},
+ {file = "grpcio-1.74.0.tar.gz", hash = "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1"},
+]
+
+[package.extras]
+protobuf = ["grpcio-tools (>=1.74.0)"]
+
+[[package]]
+name = "gunicorn"
+version = "23.0.0"
+description = "WSGI HTTP Server for UNIX"
+optional = false
+python-versions = ">=3.7"
groups = ["main"]
+markers = "platform_system != \"Windows\""
files = [
- {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"},
- {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"},
- {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:374d014f29f9dfdb40510b041792e0e2828a1389281eb590df066e1cc2b404e5"},
- {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2af68a6f5c8f78d56c145161544ad0febbd7479524a59c16b3e25053f39c87f"},
- {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7df14b2dcd1102a2ec32f621cc9fab6695effef516efbc6b063ad749867295"},
- {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c78b339869f4dbf89881e0b6fbf376313e4f845a42840a7bdf42ee6caed4b11f"},
- {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58ad9ba575b39edef71f4798fdb5c7b6d02ad36d47949cd381d4392a5c9cbcd3"},
- {file = "grpcio-1.70.0-cp310-cp310-win32.whl", hash = "sha256:2b0d02e4b25a5c1f9b6c7745d4fa06efc9fd6a611af0fb38d3ba956786b95199"},
- {file = "grpcio-1.70.0-cp310-cp310-win_amd64.whl", hash = "sha256:0de706c0a5bb9d841e353f6343a9defc9fc35ec61d6eb6111802f3aa9fef29e1"},
- {file = "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a"},
- {file = "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386"},
- {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b"},
- {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb5277db254ab7586769e490b7b22f4ddab3876c490da0a1a9d7c695ccf0bf77"},
- {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea"},
- {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:27cc75e22c5dba1fbaf5a66c778e36ca9b8ce850bf58a9db887754593080d839"},
- {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd"},
- {file = "grpcio-1.70.0-cp311-cp311-win32.whl", hash = "sha256:bb491125103c800ec209d84c9b51f1c60ea456038e4734688004f377cfacc113"},
- {file = "grpcio-1.70.0-cp311-cp311-win_amd64.whl", hash = "sha256:d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca"},
- {file = "grpcio-1.70.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:ef4c14508299b1406c32bdbb9fb7b47612ab979b04cf2b27686ea31882387cff"},
- {file = "grpcio-1.70.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:aa47688a65643afd8b166928a1da6247d3f46a2784d301e48ca1cc394d2ffb40"},
- {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:880bfb43b1bb8905701b926274eafce5c70a105bc6b99e25f62e98ad59cb278e"},
- {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e654c4b17d07eab259d392e12b149c3a134ec52b11ecdc6a515b39aceeec898"},
- {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2394e3381071045a706ee2eeb6e08962dd87e8999b90ac15c55f56fa5a8c9597"},
- {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b3c76701428d2df01964bc6479422f20e62fcbc0a37d82ebd58050b86926ef8c"},
- {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac073fe1c4cd856ebcf49e9ed6240f4f84d7a4e6ee95baa5d66ea05d3dd0df7f"},
- {file = "grpcio-1.70.0-cp312-cp312-win32.whl", hash = "sha256:cd24d2d9d380fbbee7a5ac86afe9787813f285e684b0271599f95a51bce33528"},
- {file = "grpcio-1.70.0-cp312-cp312-win_amd64.whl", hash = "sha256:0495c86a55a04a874c7627fd33e5beaee771917d92c0e6d9d797628ac40e7655"},
- {file = "grpcio-1.70.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa573896aeb7d7ce10b1fa425ba263e8dddd83d71530d1322fd3a16f31257b4a"},
- {file = "grpcio-1.70.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:d405b005018fd516c9ac529f4b4122342f60ec1cee181788249372524e6db429"},
- {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f32090238b720eb585248654db8e3afc87b48d26ac423c8dde8334a232ff53c9"},
- {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa089a734f24ee5f6880c83d043e4f46bf812fcea5181dcb3a572db1e79e01c"},
- {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19375f0300b96c0117aca118d400e76fede6db6e91f3c34b7b035822e06c35f"},
- {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7c73c42102e4a5ec76608d9b60227d917cea46dff4d11d372f64cbeb56d259d0"},
- {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:0a5c78d5198a1f0aa60006cd6eb1c912b4a1520b6a3968e677dbcba215fabb40"},
- {file = "grpcio-1.70.0-cp313-cp313-win32.whl", hash = "sha256:fe9dbd916df3b60e865258a8c72ac98f3ac9e2a9542dcb72b7a34d236242a5ce"},
- {file = "grpcio-1.70.0-cp313-cp313-win_amd64.whl", hash = "sha256:4119fed8abb7ff6c32e3d2255301e59c316c22d31ab812b3fbcbaf3d0d87cc68"},
- {file = "grpcio-1.70.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:8058667a755f97407fca257c844018b80004ae8035565ebc2812cc550110718d"},
- {file = "grpcio-1.70.0-cp38-cp38-macosx_10_14_universal2.whl", hash = "sha256:879a61bf52ff8ccacbedf534665bb5478ec8e86ad483e76fe4f729aaef867cab"},
- {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ba0a173f4feacf90ee618fbc1a27956bfd21260cd31ced9bc707ef551ff7dc7"},
- {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558c386ecb0148f4f99b1a65160f9d4b790ed3163e8610d11db47838d452512d"},
- {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:412faabcc787bbc826f51be261ae5fa996b21263de5368a55dc2cf824dc5090e"},
- {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3b0f01f6ed9994d7a0b27eeddea43ceac1b7e6f3f9d86aeec0f0064b8cf50fdb"},
- {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7385b1cb064734005204bc8994eed7dcb801ed6c2eda283f613ad8c6c75cf873"},
- {file = "grpcio-1.70.0-cp38-cp38-win32.whl", hash = "sha256:07269ff4940f6fb6710951116a04cd70284da86d0a4368fd5a3b552744511f5a"},
- {file = "grpcio-1.70.0-cp38-cp38-win_amd64.whl", hash = "sha256:aba19419aef9b254e15011b230a180e26e0f6864c90406fdbc255f01d83bc83c"},
- {file = "grpcio-1.70.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4f1937f47c77392ccd555728f564a49128b6a197a05a5cd527b796d36f3387d0"},
- {file = "grpcio-1.70.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:0cd430b9215a15c10b0e7d78f51e8a39d6cf2ea819fd635a7214fae600b1da27"},
- {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e27585831aa6b57b9250abaf147003e126cd3a6c6ca0c531a01996f31709bed1"},
- {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1af8e15b0f0fe0eac75195992a63df17579553b0c4af9f8362cc7cc99ccddf4"},
- {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbce24409beaee911c574a3d75d12ffb8c3e3dd1b813321b1d7a96bbcac46bf4"},
- {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ff4a8112a79464919bb21c18e956c54add43ec9a4850e3949da54f61c241a4a6"},
- {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5413549fdf0b14046c545e19cfc4eb1e37e9e1ebba0ca390a8d4e9963cab44d2"},
- {file = "grpcio-1.70.0-cp39-cp39-win32.whl", hash = "sha256:b745d2c41b27650095e81dea7091668c040457483c9bdb5d0d9de8f8eb25e59f"},
- {file = "grpcio-1.70.0-cp39-cp39-win_amd64.whl", hash = "sha256:a31d7e3b529c94e930a117b2175b2efd179d96eb3c7a21ccb0289a8ab05b645c"},
- {file = "grpcio-1.70.0.tar.gz", hash = "sha256:8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56"},
+ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"},
+ {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"},
]
+[package.dependencies]
+packaging = "*"
+
[package.extras]
-protobuf = ["grpcio-tools (>=1.70.0)"]
+eventlet = ["eventlet (>=0.24.1,!=0.36.0)"]
+gevent = ["gevent (>=1.4.0)"]
+setproctitle = ["setproctitle"]
+testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"]
+tornado = ["tornado (>=0.2)"]
[[package]]
name = "h11"
-version = "0.14.0"
+version = "0.16.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"},
+ {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"},
+]
+
+[[package]]
+name = "hf-xet"
+version = "1.1.7"
+description = "Fast transfer of large files with the Hugging Face Hub."
+optional = false
+python-versions = ">=3.8"
groups = ["main"]
+markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""
files = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+ {file = "hf_xet-1.1.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:60dae4b44d520819e54e216a2505685248ec0adbdb2dd4848b17aa85a0375cde"},
+ {file = "hf_xet-1.1.7-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b109f4c11e01c057fc82004c9e51e6cdfe2cb230637644ade40c599739067b2e"},
+ {file = "hf_xet-1.1.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efaaf1a5a9fc3a501d3e71e88a6bfebc69ee3a716d0e713a931c8b8d920038f"},
+ {file = "hf_xet-1.1.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:751571540f9c1fbad9afcf222a5fb96daf2384bf821317b8bfb0c59d86078513"},
+ {file = "hf_xet-1.1.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:18b61bbae92d56ae731b92087c44efcac216071182c603fc535f8e29ec4b09b8"},
+ {file = "hf_xet-1.1.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:713f2bff61b252f8523739969f247aa354ad8e6d869b8281e174e2ea1bb8d604"},
+ {file = "hf_xet-1.1.7-cp37-abi3-win_amd64.whl", hash = "sha256:2e356da7d284479ae0f1dea3cf5a2f74fdf925d6dca84ac4341930d892c7cb34"},
+ {file = "hf_xet-1.1.7.tar.gz", hash = "sha256:20cec8db4561338824a3b5f8c19774055b04a8df7fff0cb1ff2cb1a0c1607b80"},
]
+[package.extras]
+tests = ["pytest"]
+
[[package]]
name = "httpcore"
-version = "1.0.7"
+version = "1.0.9"
description = "A minimal low-level HTTP client."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"},
- {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"},
+ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"},
+ {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"},
]
[package.dependencies]
certifi = "*"
-h11 = ">=0.13,<0.15"
+h11 = ">=0.16"
[package.extras]
asyncio = ["anyio (>=4.0,<5.0)"]
@@ -1538,33 +1830,22 @@ http2 = ["h2 (>=3,<5)"]
socks = ["socksio (==1.*)"]
zstd = ["zstandard (>=0.18.0)"]
-[[package]]
-name = "httpx-sse"
-version = "0.4.0"
-description = "Consume Server-Sent Event (SSE) messages with HTTPX."
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"},
- {file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"},
-]
-
[[package]]
name = "huggingface-hub"
-version = "0.29.3"
+version = "0.34.4"
description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub"
optional = false
python-versions = ">=3.8.0"
groups = ["main"]
files = [
- {file = "huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa"},
- {file = "huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5"},
+ {file = "huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a"},
+ {file = "huggingface_hub-0.34.4.tar.gz", hash = "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c"},
]
[package.dependencies]
filelock = "*"
fsspec = ">=2023.5.0"
+hf-xet = {version = ">=1.1.3,<2.0.0", markers = "platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\""}
packaging = ">=20.9"
pyyaml = ">=5.1"
requests = "*"
@@ -1572,16 +1853,19 @@ tqdm = ">=4.42.1"
typing-extensions = ">=3.7.4.3"
[package.extras]
-all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0) ; python_version >= \"3.9\"", "mypy (>=1.14.1,<1.15.0) ; python_version == \"3.8\"", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
cli = ["InquirerPy (==0.3.4)"]
-dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "libcst (==1.4.0)", "mypy (==1.5.1)", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
+dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "libcst (>=1.4.0)", "mypy (==1.15.0) ; python_version >= \"3.9\"", "mypy (>=1.14.1,<1.15.0) ; python_version == \"3.8\"", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.9.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"]
fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"]
hf-transfer = ["hf-transfer (>=0.1.4)"]
+hf-xet = ["hf-xet (>=1.1.2,<2.0.0)"]
inference = ["aiohttp"]
-quality = ["libcst (==1.4.0)", "mypy (==1.5.1)", "ruff (>=0.9.0)"]
+mcp = ["aiohttp", "mcp (>=1.8.0)", "typer"]
+oauth = ["authlib (>=1.3.2)", "fastapi", "httpx", "itsdangerous"]
+quality = ["libcst (>=1.4.0)", "mypy (==1.15.0) ; python_version >= \"3.9\"", "mypy (>=1.14.1,<1.15.0) ; python_version == \"3.8\"", "ruff (>=0.9.0)"]
tensorflow = ["graphviz", "pydot", "tensorflow"]
tensorflow-testing = ["keras (<3.0)", "tensorflow"]
-testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "fastapi", "gradio (>=4.0.0)", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
+testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "authlib (>=1.3.2)", "fastapi", "gradio (>=4.0.0)", "httpx", "itsdangerous", "jedi", "numpy", "pytest (>=8.1.1,<8.2.2)", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-mock", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"]
torch = ["safetensors[torch]", "torch"]
typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"]
@@ -1604,14 +1888,14 @@ packaging = "*"
[[package]]
name = "identify"
-version = "2.6.9"
+version = "2.6.12"
description = "File identification library for Python"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150"},
- {file = "identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf"},
+ {file = "identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2"},
+ {file = "identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6"},
]
[package.extras]
@@ -1638,7 +1922,7 @@ version = "1.4.1"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
{file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
@@ -1646,14 +1930,14 @@ files = [
[[package]]
name = "importlib-metadata"
-version = "8.5.0"
+version = "8.7.0"
description = "Read metadata from Python packages"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
- {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
+ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"},
+ {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"},
]
[package.dependencies]
@@ -1665,139 +1949,33 @@ cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
perf = ["ipython"]
-test = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
+test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
type = ["pytest-mypy"]
[[package]]
name = "iniconfig"
-version = "2.0.0"
+version = "2.1.0"
description = "brain-dead simple config-ini parsing"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
- {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+ {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"},
+ {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"},
]
[[package]]
-name = "instructor"
-version = "1.7.7"
-description = "structured outputs for llm"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "instructor-1.7.7-py3-none-any.whl", hash = "sha256:a6565dc0a299d6b3761c7a225e83477c8956762d0d5c7e06fb0c3dd07cd705c6"},
- {file = "instructor-1.7.7.tar.gz", hash = "sha256:ed91c5cdbd1eca53420e852a803b8281055459dee834f1bd315e5f3824d463f5"},
-]
-
-[package.dependencies]
-aiohttp = ">=3.9.1,<4.0.0"
-docstring-parser = ">=0.16,<1.0"
-jinja2 = ">=3.1.4,<4.0.0"
-jiter = ">=0.6.1,<0.9"
-openai = ">=1.52.0,<2.0.0"
-pydantic = ">=2.8.0,<3.0.0"
-pydantic-core = ">=2.18.0,<3.0.0"
-requests = ">=2.32.3,<3.0.0"
-rich = ">=13.7.0,<14.0.0"
-tenacity = ">=9.0.0,<10.0.0"
-typer = ">=0.9.0,<1.0.0"
-
-[package.extras]
-anthropic = ["anthropic (==0.48.0)", "xmltodict (>=0.13,<0.15)"]
-bedrock = ["boto3 (>=1.34.0,<2.0.0)"]
-cerebras-cloud-sdk = ["cerebras-cloud-sdk (>=1.5.0,<2.0.0)"]
-cohere = ["cohere (>=5.1.8,<6.0.0)"]
-fireworks-ai = ["fireworks-ai (>=0.15.4,<1.0.0)"]
-google-genai = ["google-genai (>=1.5.0)", "jsonref (>=1.1.0,<2.0.0)"]
-google-generativeai = ["google-generativeai (>=0.8.2,<1.0.0)", "jsonref (>=1.1.0,<2.0.0)"]
-groq = ["groq (>=0.4.2,<0.14.0)"]
-mistral = ["mistralai (>=1.5.1,<2.0.0)"]
-perplexity = ["openai (>=1.52.0,<2.0.0)"]
-test-docs = ["diskcache (>=5.6.3,<6.0.0)", "fastapi (>=0.109.2,<0.116.0)", "litellm (>=1.35.31,<2.0.0)", "mistralai (>=1.5.1,<2.0.0)", "pandas (>=2.2.0,<3.0.0)", "pydantic-extra-types (>=2.6.0,<3.0.0)", "redis (>=5.0.1,<6.0.0)", "tabulate (>=0.9.0,<1.0.0)"]
-vertexai = ["google-cloud-aiplatform (>=1.53.0,<2.0.0)", "jsonref (>=1.1.0,<2.0.0)"]
-writer = ["writer-sdk (>=1.2.0,<2.0.0)"]
-
-[[package]]
-name = "jaraco-classes"
-version = "3.4.0"
-description = "Utility functions for Python class constructs"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"},
- {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"},
-]
-
-[package.dependencies]
-more-itertools = "*"
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"]
-
-[[package]]
-name = "jaraco-context"
-version = "6.0.1"
-description = "Useful decorators and context managers"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"},
- {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"},
-]
-
-[package.dependencies]
-"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""}
-
-[package.extras]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-
-[[package]]
-name = "jaraco-functools"
-version = "4.1.0"
-description = "Functools like those found in stdlib"
+name = "itsdangerous"
+version = "2.2.0"
+description = "Safely pass data to untrusted environments and back."
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"},
- {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"},
+ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"},
+ {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"},
]
-[package.dependencies]
-more-itertools = "*"
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"]
-type = ["pytest-mypy"]
-
-[[package]]
-name = "jeepney"
-version = "0.9.0"
-description = "Low-level, pure Python DBus protocol wrapper."
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-markers = "sys_platform == \"linux\""
-files = [
- {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"},
- {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"},
-]
-
-[package.extras]
-test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"]
-trio = ["trio"]
-
[[package]]
name = "jinja2"
version = "3.1.6"
@@ -1818,332 +1996,224 @@ i18n = ["Babel (>=2.7)"]
[[package]]
name = "jiter"
-version = "0.8.2"
+version = "0.10.0"
description = "Fast iterable JSON parser."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"},
- {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08"},
- {file = "jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49"},
- {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d"},
- {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff"},
- {file = "jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43"},
- {file = "jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105"},
- {file = "jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b"},
- {file = "jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586"},
- {file = "jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc"},
- {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88"},
- {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6"},
- {file = "jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44"},
- {file = "jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855"},
- {file = "jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f"},
- {file = "jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887"},
- {file = "jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d"},
- {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152"},
- {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29"},
- {file = "jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e"},
- {file = "jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c"},
- {file = "jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84"},
- {file = "jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef"},
- {file = "jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1"},
- {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9"},
- {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05"},
- {file = "jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a"},
- {file = "jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865"},
- {file = "jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca"},
- {file = "jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0"},
- {file = "jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566"},
- {file = "jiter-0.8.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9e1fa156ee9454642adb7e7234a383884452532bc9d53d5af2d18d98ada1d79c"},
- {file = "jiter-0.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cf5dfa9956d96ff2efb0f8e9c7d055904012c952539a774305aaaf3abdf3d6c"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e52bf98c7e727dd44f7c4acb980cb988448faeafed8433c867888268899b298b"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ecaa3c23e7a7cf86d00eda3390c232f4d533cd9ddea4b04f5d0644faf642c5"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08d4c92bf480e19fc3f2717c9ce2aa31dceaa9163839a311424b6862252c943e"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d9a1eded738299ba8e106c6779ce5c3893cffa0e32e4485d680588adae6db8"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20be8b7f606df096e08b0b1b4a3c6f0515e8dac296881fe7461dfa0fb5ec817"},
- {file = "jiter-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33f94615fcaf872f7fd8cd98ac3b429e435c77619777e8a449d9d27e01134d1"},
- {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:317b25e98a35ffec5c67efe56a4e9970852632c810d35b34ecdd70cc0e47b3b6"},
- {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc9043259ee430ecd71d178fccabd8c332a3bf1e81e50cae43cc2b28d19e4cb7"},
- {file = "jiter-0.8.2-cp38-cp38-win32.whl", hash = "sha256:fc5adda618205bd4678b146612ce44c3cbfdee9697951f2c0ffdef1f26d72b63"},
- {file = "jiter-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cd646c827b4f85ef4a78e4e58f4f5854fae0caf3db91b59f0d73731448a970c6"},
- {file = "jiter-0.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e41e75344acef3fc59ba4765df29f107f309ca9e8eace5baacabd9217e52a5ee"},
- {file = "jiter-0.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f22b16b35d5c1df9dfd58843ab2cd25e6bf15191f5a236bed177afade507bfc"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7200b8f7619d36aa51c803fd52020a2dfbea36ffec1b5e22cab11fd34d95a6d"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70bf4c43652cc294040dbb62256c83c8718370c8b93dd93d934b9a7bf6c4f53c"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d471356dc16f84ed48768b8ee79f29514295c7295cb41e1133ec0b2b8d637d"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859e8eb3507894093d01929e12e267f83b1d5f6221099d3ec976f0c995cb6bd9"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa58399c01db555346647a907b4ef6d4f584b123943be6ed5588c3f2359c9f4"},
- {file = "jiter-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f2d5ed877f089862f4c7aacf3a542627c1496f972a34d0474ce85ee7d939c27"},
- {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:03c9df035d4f8d647f8c210ddc2ae0728387275340668fb30d2421e17d9a0841"},
- {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bd2a824d08d8977bb2794ea2682f898ad3d8837932e3a74937e93d62ecbb637"},
- {file = "jiter-0.8.2-cp39-cp39-win32.whl", hash = "sha256:ca29b6371ebc40e496995c94b988a101b9fbbed48a51190a4461fcb0a68b4a36"},
- {file = "jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a"},
- {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"},
+ {file = "jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303"},
+ {file = "jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf"},
+ {file = "jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90"},
+ {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0"},
+ {file = "jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee"},
+ {file = "jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4"},
+ {file = "jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5"},
+ {file = "jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978"},
+ {file = "jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5"},
+ {file = "jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606"},
+ {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605"},
+ {file = "jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5"},
+ {file = "jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7"},
+ {file = "jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812"},
+ {file = "jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b"},
+ {file = "jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a"},
+ {file = "jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95"},
+ {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea"},
+ {file = "jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b"},
+ {file = "jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01"},
+ {file = "jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49"},
+ {file = "jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644"},
+ {file = "jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041"},
+ {file = "jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca"},
+ {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4"},
+ {file = "jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e"},
+ {file = "jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d"},
+ {file = "jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4"},
+ {file = "jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca"},
+ {file = "jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070"},
+ {file = "jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca"},
+ {file = "jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522"},
+ {file = "jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9"},
+ {file = "jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a"},
+ {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853"},
+ {file = "jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86"},
+ {file = "jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357"},
+ {file = "jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00"},
+ {file = "jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5"},
+ {file = "jiter-0.10.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d"},
+ {file = "jiter-0.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28"},
+ {file = "jiter-0.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397"},
+ {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1"},
+ {file = "jiter-0.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324"},
+ {file = "jiter-0.10.0-cp39-cp39-win32.whl", hash = "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf"},
+ {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"},
+ {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"},
]
[[package]]
name = "joblib"
-version = "1.4.2"
+version = "1.5.1"
description = "Lightweight pipelining with Python functions"
optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"},
- {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"},
-]
-
-[[package]]
-name = "jsonpatch"
-version = "1.33"
-description = "Apply JSON-Patches (RFC 6902)"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*"
-groups = ["main"]
-files = [
- {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"},
- {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"},
-]
-
-[package.dependencies]
-jsonpointer = ">=1.9"
-
-[[package]]
-name = "jsonpath-python"
-version = "1.0.6"
-description = "A more powerful JSONPath implementation in modern python"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "jsonpath-python-1.0.6.tar.gz", hash = "sha256:dd5be4a72d8a2995c3f583cf82bf3cd1a9544cfdabf2d22595b67aff07349666"},
- {file = "jsonpath_python-1.0.6-py3-none-any.whl", hash = "sha256:1e3b78df579f5efc23565293612decee04214609208a2335884b3ee3f786b575"},
-]
-
-[[package]]
-name = "jsonpointer"
-version = "3.0.0"
-description = "Identify specific nodes in a JSON document (RFC 6901)"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"},
- {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"},
-]
-
-[[package]]
-name = "keyring"
-version = "25.6.0"
-description = "Store and access your passwords safely."
-optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"},
- {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"},
-]
-
-[package.dependencies]
-importlib_metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""}
-"jaraco.classes" = "*"
-"jaraco.context" = "*"
-"jaraco.functools" = "*"
-jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""}
-pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""}
-SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""}
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""]
-completion = ["shtab (>=1.1.0)"]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["pyfakefs", "pytest (>=6,!=8.1.*)"]
-type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"]
-
-[[package]]
-name = "langchain"
-version = "0.3.20"
-description = "Building applications with LLMs through composability"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "langchain-0.3.20-py3-none-any.whl", hash = "sha256:273287f8e61ffdf7e811cf8799e6a71e9381325b8625fd6618900faba79cfdd0"},
- {file = "langchain-0.3.20.tar.gz", hash = "sha256:edcc3241703e1f6557ef5a5c35cd56f9ccc25ff12e38b4829c66d94971737a93"},
-]
-
-[package.dependencies]
-langchain-core = ">=0.3.41,<1.0.0"
-langchain-text-splitters = ">=0.3.6,<1.0.0"
-langsmith = ">=0.1.17,<0.4"
-pydantic = ">=2.7.4,<3.0.0"
-PyYAML = ">=5.3"
-requests = ">=2,<3"
-SQLAlchemy = ">=1.4,<3"
-
-[package.extras]
-anthropic = ["langchain-anthropic"]
-aws = ["langchain-aws"]
-cohere = ["langchain-cohere"]
-community = ["langchain-community"]
-deepseek = ["langchain-deepseek"]
-fireworks = ["langchain-fireworks"]
-google-genai = ["langchain-google-genai"]
-google-vertexai = ["langchain-google-vertexai"]
-groq = ["langchain-groq"]
-huggingface = ["langchain-huggingface"]
-mistralai = ["langchain-mistralai"]
-ollama = ["langchain-ollama"]
-openai = ["langchain-openai"]
-together = ["langchain-together"]
-xai = ["langchain-xai"]
-
-[[package]]
-name = "langchain-community"
-version = "0.3.16"
-description = "Community contributed LangChain integrations."
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "langchain_community-0.3.16-py3-none-any.whl", hash = "sha256:a702c577b048d48882a46708bb3e08ca9aec79657c421c3241a305409040c0d6"},
- {file = "langchain_community-0.3.16.tar.gz", hash = "sha256:825709bc328e294942b045d0b7f55053e8e88f7f943576306d778cf56417126c"},
-]
-
-[package.dependencies]
-aiohttp = ">=3.8.3,<4.0.0"
-dataclasses-json = ">=0.5.7,<0.7"
-httpx-sse = ">=0.4.0,<0.5.0"
-langchain = ">=0.3.16,<0.4.0"
-langchain-core = ">=0.3.32,<0.4.0"
-langsmith = ">=0.1.125,<0.4"
-numpy = [
- {version = ">=1.22.4,<2", markers = "python_version < \"3.12\""},
- {version = ">=1.26.2,<3", markers = "python_version >= \"3.12\""},
-]
-pydantic-settings = ">=2.4.0,<3.0.0"
-PyYAML = ">=5.3"
-requests = ">=2,<3"
-SQLAlchemy = ">=1.4,<3"
-tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10"
-
-[[package]]
-name = "langchain-core"
-version = "0.3.43"
-description = "Building applications with LLMs through composability"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "langchain_core-0.3.43-py3-none-any.whl", hash = "sha256:caa6bc1f4c6ab71d3c2e400f8b62e1cd6dc5ac2c37e03f12f3e2c60befd5b273"},
- {file = "langchain_core-0.3.43.tar.gz", hash = "sha256:bec60f4f5665b536434ff747b8f23375a812e82cfa529f519b54cc1e7a94a875"},
-]
-
-[package.dependencies]
-jsonpatch = ">=1.33,<2.0"
-langsmith = ">=0.1.125,<0.4"
-packaging = ">=23.2,<25"
-pydantic = [
- {version = ">=2.5.2,<3.0.0", markers = "python_full_version < \"3.12.4\""},
- {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
+ {file = "joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a"},
+ {file = "joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444"},
]
-PyYAML = ">=5.3"
-tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<10.0.0"
-typing-extensions = ">=4.7"
-
-[[package]]
-name = "langchain-openai"
-version = "0.3.8"
-description = "An integration package connecting OpenAI and LangChain"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "langchain_openai-0.3.8-py3-none-any.whl", hash = "sha256:9004dc8ef853aece0d8f0feca7753dc97f710fa3e53874c8db66466520436dbb"},
- {file = "langchain_openai-0.3.8.tar.gz", hash = "sha256:4d73727eda8102d1d07a2ca036278fccab0bb5e0abf353cec9c3973eb72550ec"},
-]
-
-[package.dependencies]
-langchain-core = ">=0.3.42,<1.0.0"
-openai = ">=1.58.1,<2.0.0"
-tiktoken = ">=0.7,<1"
[[package]]
-name = "langchain-text-splitters"
-version = "0.3.6"
-description = "LangChain text splitting utilities"
+name = "kiwisolver"
+version = "1.4.9"
+description = "A fast implementation of the Cassowary constraint solver"
optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "langchain_text_splitters-0.3.6-py3-none-any.whl", hash = "sha256:e5d7b850f6c14259ea930be4a964a65fa95d9df7e1dbdd8bad8416db72292f4e"},
- {file = "langchain_text_splitters-0.3.6.tar.gz", hash = "sha256:c537972f4b7c07451df431353a538019ad9dadff7a1073ea363946cea97e1bee"},
-]
-
-[package.dependencies]
-langchain-core = ">=0.3.34,<1.0.0"
-
-[[package]]
-name = "langsmith"
-version = "0.3.13"
-description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform."
-optional = false
-python-versions = "<4.0,>=3.9"
+python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "langsmith-0.3.13-py3-none-any.whl", hash = "sha256:73aaf52bbc293b9415fff4f6dad68df40658081eb26c9cb2c7bd1ff57cedd695"},
- {file = "langsmith-0.3.13.tar.gz", hash = "sha256:14014058cff408772acb93344e03cb64174837292d5f1ae09b2c8c1d8df45e92"},
-]
-
-[package.dependencies]
-httpx = ">=0.23.0,<1"
-orjson = {version = ">=3.9.14,<4.0.0", markers = "platform_python_implementation != \"PyPy\""}
-packaging = ">=23.2"
-pydantic = [
- {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""},
- {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""},
+ {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611"},
+ {file = "kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"},
+ {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54"},
+ {file = "kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d"},
+ {file = "kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07"},
+ {file = "kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7"},
+ {file = "kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891"},
+ {file = "kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32"},
+ {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527"},
+ {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771"},
+ {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e"},
+ {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9"},
+ {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb"},
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"},
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"},
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"},
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"},
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"},
+ {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"},
]
-requests = ">=2,<3"
-requests-toolbelt = ">=1.0.0,<2.0.0"
-zstandard = ">=0.23.0,<0.24.0"
-
-[package.extras]
-langsmith-pyo3 = ["langsmith-pyo3 (>=0.1.0rc2,<0.2.0)"]
-pytest = ["pytest (>=7.0.0)", "rich (>=13.9.4,<14.0.0)"]
[[package]]
name = "lightning-utilities"
-version = "0.14.0"
+version = "0.15.2"
description = "Lightning toolbox for across the our ecosystem."
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "lightning_utilities-0.14.0-py3-none-any.whl", hash = "sha256:29cd0e0d1aff903667c0111eee6d96e804261ad6d4a009be7f7da71520927314"},
- {file = "lightning_utilities-0.14.0.tar.gz", hash = "sha256:9ab2424c1d44d90c9c74d6d9fe64f05e5613b8c29f94f6d407b9054cc7aee95e"},
+ {file = "lightning_utilities-0.15.2-py3-none-any.whl", hash = "sha256:ad3ab1703775044bbf880dbf7ddaaac899396c96315f3aa1779cec9d618a9841"},
+ {file = "lightning_utilities-0.15.2.tar.gz", hash = "sha256:cdf12f530214a63dacefd713f180d1ecf5d165338101617b4742e8f22c032e24"},
]
[package.dependencies]
@@ -2152,55 +2222,19 @@ setuptools = "*"
typing_extensions = "*"
[package.extras]
-cli = ["fire"]
+cli = ["jsonargparse[signatures] (>=4.38.0)", "tomlkit"]
docs = ["requests (>=2.0.0)"]
-typing = ["fire", "mypy (>=1.0.0)", "types-setuptools"]
-
-[[package]]
-name = "llama-cloud"
-version = "0.1.14"
-description = ""
-optional = false
-python-versions = "<4,>=3.8"
-groups = ["main"]
-files = [
- {file = "llama_cloud-0.1.14-py3-none-any.whl", hash = "sha256:187672847dedc018b4d2620a8d26d6bf213e425e8b91569773de48e5c2f3ca5a"},
- {file = "llama_cloud-0.1.14.tar.gz", hash = "sha256:90741a19ba96967fa2484084928e326ae957736780a15b67bc3ad5f52e94782d"},
-]
-
-[package.dependencies]
-certifi = ">=2024.7.4"
-httpx = ">=0.20.0"
-pydantic = ">=1.10"
-
-[[package]]
-name = "llama-cloud-services"
-version = "0.6.5"
-description = "Tailored SDK clients for LlamaCloud services."
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_cloud_services-0.6.5-py3-none-any.whl", hash = "sha256:d9d4d0407b03249fea65aa369b110f9ee60601e4c82dba3e0a774f3a997d2b63"},
- {file = "llama_cloud_services-0.6.5.tar.gz", hash = "sha256:7c00900ed72b199d7118879637a4df060065c70cc0562f3b229e47d5f85bdb7b"},
-]
-
-[package.dependencies]
-click = ">=8.1.7,<9.0.0"
-llama-cloud = ">=0.1.14,<0.2.0"
-llama-index-core = ">=0.11.0"
-pydantic = "!=2.10"
-python-dotenv = ">=1.0.1,<2.0.0"
+typing = ["mypy (>=1.0.0)", "types-setuptools"]
[[package]]
name = "llama-cpp-python"
-version = "0.3.8"
+version = "0.3.14"
description = "Python bindings for the llama.cpp library"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "llama_cpp_python-0.3.8.tar.gz", hash = "sha256:31c91323b555c025a76a30923cead9f5695da103dd68c15cdbb4509b17f0ed77"},
+ {file = "llama_cpp_python-0.3.14.tar.gz", hash = "sha256:c7ffd71685923a911206a40e972c1ec739aa21032100fdc8618316571b173507"},
]
[package.dependencies]
@@ -2216,251 +2250,24 @@ server = ["PyYAML (>=5.1)", "fastapi (>=0.100.0)", "pydantic-settings (>=2.0.1)"
test = ["fastapi (>=0.100.0)", "httpx (>=0.24.1)", "huggingface-hub (>=0.23.0)", "pydantic-settings (>=2.0.1)", "pytest (>=7.4.0)", "scipy (>=1.10)", "sse-starlette (>=1.6.1)", "starlette-context (>=0.3.6,<0.4)"]
[[package]]
-name = "llama-index"
-version = "0.12.23"
-description = "Interface between LLMs and your data"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index-0.12.23-py3-none-any.whl", hash = "sha256:a099e06005f0e776a75b1cbac68af966bd2866c31f868d5c4f4e5be6ba641c60"},
- {file = "llama_index-0.12.23.tar.gz", hash = "sha256:af1e3b0ecb63c2e6ff95874189ca68e3fcdba19bb312abb7df19c6855cc709c0"},
-]
-
-[package.dependencies]
-llama-index-agent-openai = ">=0.4.0,<0.5.0"
-llama-index-cli = ">=0.4.1,<0.5.0"
-llama-index-core = ">=0.12.23,<0.13.0"
-llama-index-embeddings-openai = ">=0.3.0,<0.4.0"
-llama-index-indices-managed-llama-cloud = ">=0.4.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-llama-index-multi-modal-llms-openai = ">=0.4.0,<0.5.0"
-llama-index-program-openai = ">=0.3.0,<0.4.0"
-llama-index-question-gen-openai = ">=0.3.0,<0.4.0"
-llama-index-readers-file = ">=0.4.0,<0.5.0"
-llama-index-readers-llama-parse = ">=0.4.0"
-nltk = ">3.8.1"
-
-[[package]]
-name = "llama-index-agent-openai"
-version = "0.4.6"
-description = "llama-index agent openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_agent_openai-0.4.6-py3-none-any.whl", hash = "sha256:4103e479c874cb3426aa59a13f91b6e2dc6b350c51457966631f8bdaf9a6a8e8"},
- {file = "llama_index_agent_openai-0.4.6.tar.gz", hash = "sha256:4f66c1731836ab66c4b441255a95f33a51743e4993b8aa9daf430cb31aa7d48e"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.18,<0.13.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-openai = ">=1.14.0"
-
-[[package]]
-name = "llama-index-cli"
-version = "0.4.1"
-description = "llama-index cli"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_cli-0.4.1-py3-none-any.whl", hash = "sha256:6dfc931aea5b90c256e476b48dfac76f48fb2308fdf656bb02ee1e4f2cab8b06"},
- {file = "llama_index_cli-0.4.1.tar.gz", hash = "sha256:3f97f1f8f5f401dfb5b6bc7170717c176dcd981538017430073ef12ffdcbddfa"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.0,<0.13.0"
-llama-index-embeddings-openai = ">=0.3.0,<0.4.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-
-[[package]]
-name = "llama-index-core"
-version = "0.12.23.post2"
-description = "Interface between LLMs and your data"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_core-0.12.23.post2-py3-none-any.whl", hash = "sha256:3665583d69ca9859b019aacf9496af29ec2fa3b24d031344ddeeefb0dbd00e26"},
- {file = "llama_index_core-0.12.23.post2.tar.gz", hash = "sha256:b8e8abc2c11c2fa26bbfeebc79b00d8d12aaba370e43e3450045b50048744b90"},
-]
-
-[package.dependencies]
-aiohttp = ">=3.8.6,<4.0.0"
-dataclasses-json = "*"
-deprecated = ">=1.2.9.3"
-dirtyjson = ">=1.0.8,<2.0.0"
-filetype = ">=1.2.0,<2.0.0"
-fsspec = ">=2023.5.0"
-httpx = "*"
-nest-asyncio = ">=1.5.8,<2.0.0"
-networkx = ">=3.0"
-nltk = ">3.8.1"
-numpy = "*"
-pillow = ">=9.0.0"
-pydantic = ">=2.8.0"
-PyYAML = ">=6.0.1"
-requests = ">=2.31.0"
-SQLAlchemy = {version = ">=1.4.49", extras = ["asyncio"]}
-tenacity = ">=8.2.0,<8.4.0 || >8.4.0,<10.0.0"
-tiktoken = ">=0.3.3"
-tqdm = ">=4.66.1,<5.0.0"
-typing-extensions = ">=4.5.0"
-typing-inspect = ">=0.8.0"
-wrapt = "*"
-
-[[package]]
-name = "llama-index-embeddings-openai"
-version = "0.3.1"
-description = "llama-index embeddings openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_embeddings_openai-0.3.1-py3-none-any.whl", hash = "sha256:f15a3d13da9b6b21b8bd51d337197879a453d1605e625a1c6d45e741756c0290"},
- {file = "llama_index_embeddings_openai-0.3.1.tar.gz", hash = "sha256:1368aad3ce24cbaed23d5ad251343cef1eb7b4a06d6563d6606d59cb347fef20"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.0,<0.13.0"
-openai = ">=1.1.0"
-
-[[package]]
-name = "llama-index-indices-managed-llama-cloud"
-version = "0.6.8"
-description = "llama-index indices llama-cloud integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_indices_managed_llama_cloud-0.6.8-py3-none-any.whl", hash = "sha256:b741fa3c286fb91600d8e54a4c62084b5e230ea624c2a778a202ed4abf6a8e9b"},
- {file = "llama_index_indices_managed_llama_cloud-0.6.8.tar.gz", hash = "sha256:6581a1a4e966c80d108706880dc39a12e38634eddff9e859f2cc0d4bb11c6483"},
-]
-
-[package.dependencies]
-llama-cloud = ">=0.1.13,<0.2.0"
-llama-index-core = ">=0.12.0,<0.13.0"
-
-[[package]]
-name = "llama-index-llms-openai"
-version = "0.3.25"
-description = "llama-index llms openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_llms_openai-0.3.25-py3-none-any.whl", hash = "sha256:b21ea58f20c82f442b910b8f878bbbfd4937f601aa436cbe55b26c1d490762a6"},
- {file = "llama_index_llms_openai-0.3.25.tar.gz", hash = "sha256:1e4fd1d166bb635ca7c03f0486c04d80978948c5b8d89c8b469ae5d02852cf4b"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.17,<0.13.0"
-openai = ">=1.58.1,<2.0.0"
-
-[[package]]
-name = "llama-index-multi-modal-llms-openai"
-version = "0.4.3"
-description = "llama-index multi-modal-llms openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_multi_modal_llms_openai-0.4.3-py3-none-any.whl", hash = "sha256:1ceb42716472ac8bd5130afa29b793869d367946aedd02e48a3b03184e443ad1"},
- {file = "llama_index_multi_modal_llms_openai-0.4.3.tar.gz", hash = "sha256:5e6ca54069d3d18c2f5f7ca34f3720fba1d1b9126482ad38feb0c858f4feb63b"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.3,<0.13.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-
-[[package]]
-name = "llama-index-program-openai"
-version = "0.3.1"
-description = "llama-index program openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_program_openai-0.3.1-py3-none-any.whl", hash = "sha256:93646937395dc5318fd095153d2f91bd632b25215d013d14a87c088887d205f9"},
- {file = "llama_index_program_openai-0.3.1.tar.gz", hash = "sha256:6039a6cdbff62c6388c07e82a157fe2edd3bbef0c5adf292ad8546bf4ec75b82"},
-]
-
-[package.dependencies]
-llama-index-agent-openai = ">=0.4.0,<0.5.0"
-llama-index-core = ">=0.12.0,<0.13.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-
-[[package]]
-name = "llama-index-question-gen-openai"
-version = "0.3.0"
-description = "llama-index question_gen openai integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_question_gen_openai-0.3.0-py3-none-any.whl", hash = "sha256:9b60ec114273a63b50349948666e5744a8f58acb645824e07c979041e8fec598"},
- {file = "llama_index_question_gen_openai-0.3.0.tar.gz", hash = "sha256:efd3b468232808e9d3474670aaeab00e41b90f75f52d0c9bfbf11207e0963d62"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.0,<0.13.0"
-llama-index-llms-openai = ">=0.3.0,<0.4.0"
-llama-index-program-openai = ">=0.3.0,<0.4.0"
-
-[[package]]
-name = "llama-index-readers-file"
-version = "0.4.6"
-description = "llama-index readers file integration"
+name = "mako"
+version = "1.3.10"
+description = "A super-fast templating language that borrows the best ideas from the existing templating languages."
optional = false
-python-versions = "<4.0,>=3.9"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "llama_index_readers_file-0.4.6-py3-none-any.whl", hash = "sha256:5b5589a528bd3bdf41798406ad0b3ad1a55f28085ff9078a00b61567ff29acba"},
- {file = "llama_index_readers_file-0.4.6.tar.gz", hash = "sha256:50119fdffb7f5aa4638dda2227c79ad6a5f326b9c55a7e46054df99f46a709e0"},
+ {file = "mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59"},
+ {file = "mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28"},
]
[package.dependencies]
-beautifulsoup4 = ">=4.12.3,<5.0.0"
-llama-index-core = ">=0.12.0,<0.13.0"
-pandas = "*"
-pypdf = ">=5.1.0,<6.0.0"
-striprtf = ">=0.0.26,<0.0.27"
+MarkupSafe = ">=0.9.2"
[package.extras]
-pymupdf = ["pymupdf (>=1.23.21,<2.0.0)"]
-
-[[package]]
-name = "llama-index-readers-llama-parse"
-version = "0.4.0"
-description = "llama-index readers llama-parse integration"
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_index_readers_llama_parse-0.4.0-py3-none-any.whl", hash = "sha256:574e48386f28d2c86c3f961ca4a4906910312f3400dd0c53014465bfbc6b32bf"},
- {file = "llama_index_readers_llama_parse-0.4.0.tar.gz", hash = "sha256:e99ec56f4f8546d7fda1a7c1ae26162fb9acb7ebcac343b5abdb4234b4644e0f"},
-]
-
-[package.dependencies]
-llama-index-core = ">=0.12.0,<0.13.0"
-llama-parse = ">=0.5.0"
-
-[[package]]
-name = "llama-parse"
-version = "0.6.4.post1"
-description = "Parse files into RAG-Optimized formats."
-optional = false
-python-versions = "<4.0,>=3.9"
-groups = ["main"]
-files = [
- {file = "llama_parse-0.6.4.post1-py3-none-any.whl", hash = "sha256:fdc7adb87283c2f952c830d9057c156a1349c1e6e04444d7466e732903fbc150"},
- {file = "llama_parse-0.6.4.post1.tar.gz", hash = "sha256:846d9959f4e034f8d9681dd1f003d42f8d7dc028d394ab04867b59046b4390d6"},
-]
-
-[package.dependencies]
-llama-cloud-services = ">=0.6.4"
+babel = ["Babel"]
+lingua = ["lingua"]
+testing = ["pytest"]
[[package]]
name = "markdown-it-py"
@@ -2468,7 +2275,7 @@ version = "3.0.0"
description = "Python port of markdown-it. Markdown parsing, done right!"
optional = false
python-versions = ">=3.8"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
{file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
{file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
@@ -2559,24 +2366,103 @@ files = [
]
[[package]]
-name = "marshmallow"
-version = "3.26.1"
-description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
+name = "matplotlib"
+version = "3.10.5"
+description = "Python plotting package"
optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.10"
+groups = ["main"]
+files = [
+ {file = "matplotlib-3.10.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5d4773a6d1c106ca05cb5a5515d277a6bb96ed09e5c8fab6b7741b8fcaa62c8f"},
+ {file = "matplotlib-3.10.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc88af74e7ba27de6cbe6faee916024ea35d895ed3d61ef6f58c4ce97da7185a"},
+ {file = "matplotlib-3.10.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:64c4535419d5617f7363dad171a5a59963308e0f3f813c4bed6c9e6e2c131512"},
+ {file = "matplotlib-3.10.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a277033048ab22d34f88a3c5243938cef776493f6201a8742ed5f8b553201343"},
+ {file = "matplotlib-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e4a6470a118a2e93022ecc7d3bd16b3114b2004ea2bf014fff875b3bc99b70c6"},
+ {file = "matplotlib-3.10.5-cp310-cp310-win_amd64.whl", hash = "sha256:7e44cada61bec8833c106547786814dd4a266c1b2964fd25daa3804f1b8d4467"},
+ {file = "matplotlib-3.10.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dcfc39c452c6a9f9028d3e44d2d721484f665304857188124b505b2c95e1eecf"},
+ {file = "matplotlib-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:903352681b59f3efbf4546985142a9686ea1d616bb054b09a537a06e4b892ccf"},
+ {file = "matplotlib-3.10.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:080c3676a56b8ee1c762bcf8fca3fe709daa1ee23e6ef06ad9f3fc17332f2d2a"},
+ {file = "matplotlib-3.10.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b4984d5064a35b6f66d2c11d668565f4389b1119cc64db7a4c1725bc11adffc"},
+ {file = "matplotlib-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3967424121d3a46705c9fa9bdb0931de3228f13f73d7bb03c999c88343a89d89"},
+ {file = "matplotlib-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:33775bbeb75528555a15ac29396940128ef5613cf9a2d31fb1bfd18b3c0c0903"},
+ {file = "matplotlib-3.10.5-cp311-cp311-win_arm64.whl", hash = "sha256:c61333a8e5e6240e73769d5826b9a31d8b22df76c0778f8480baf1b4b01c9420"},
+ {file = "matplotlib-3.10.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2"},
+ {file = "matplotlib-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389"},
+ {file = "matplotlib-3.10.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea"},
+ {file = "matplotlib-3.10.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468"},
+ {file = "matplotlib-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369"},
+ {file = "matplotlib-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b"},
+ {file = "matplotlib-3.10.5-cp312-cp312-win_arm64.whl", hash = "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2"},
+ {file = "matplotlib-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed"},
+ {file = "matplotlib-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1"},
+ {file = "matplotlib-3.10.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7"},
+ {file = "matplotlib-3.10.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f"},
+ {file = "matplotlib-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4"},
+ {file = "matplotlib-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe"},
+ {file = "matplotlib-3.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce"},
+ {file = "matplotlib-3.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154"},
+ {file = "matplotlib-3.10.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715"},
+ {file = "matplotlib-3.10.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837"},
+ {file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202"},
+ {file = "matplotlib-3.10.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb"},
+ {file = "matplotlib-3.10.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975"},
+ {file = "matplotlib-3.10.5-cp314-cp314-win_amd64.whl", hash = "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667"},
+ {file = "matplotlib-3.10.5-cp314-cp314-win_arm64.whl", hash = "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-win_amd64.whl", hash = "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959"},
+ {file = "matplotlib-3.10.5-cp314-cp314t-win_arm64.whl", hash = "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b"},
+ {file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b5fa2e941f77eb579005fb804026f9d0a1082276118d01cc6051d0d9626eaa7f"},
+ {file = "matplotlib-3.10.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1fc0d2a3241cdcb9daaca279204a3351ce9df3c0e7e621c7e04ec28aaacaca30"},
+ {file = "matplotlib-3.10.5-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8dee65cb1424b7dc982fe87895b5613d4e691cc57117e8af840da0148ca6c1d7"},
+ {file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:160e125da27a749481eaddc0627962990f6029811dbeae23881833a011a0907f"},
+ {file = "matplotlib-3.10.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac3d50760394d78a3c9be6b28318fe22b494c4fcf6407e8fd4794b538251899b"},
+ {file = "matplotlib-3.10.5-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c49465bf689c4d59d174d0c7795fb42a21d4244d11d70e52b8011987367ac61"},
+ {file = "matplotlib-3.10.5.tar.gz", hash = "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076"},
+]
+
+[package.dependencies]
+contourpy = ">=1.0.1"
+cycler = ">=0.10"
+fonttools = ">=4.22.0"
+kiwisolver = ">=1.3.1"
+numpy = ">=1.23"
+packaging = ">=20.0"
+pillow = ">=8"
+pyparsing = ">=2.3.1"
+python-dateutil = ">=2.7"
+
+[package.extras]
+dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"]
+
+[[package]]
+name = "mdit-py-plugins"
+version = "0.5.0"
+description = "Collection of plugins for markdown-it-py"
+optional = false
+python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c"},
- {file = "marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6"},
+ {file = "mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f"},
+ {file = "mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6"},
]
[package.dependencies]
-packaging = ">=17.0"
+markdown-it-py = ">=2.0.0,<5.0.0"
[package.extras]
-dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"]
-docs = ["autodocsumm (==0.2.14)", "furo (==2024.8.6)", "sphinx (==8.1.3)", "sphinx-copybutton (==0.5.2)", "sphinx-issues (==5.0.0)", "sphinxext-opengraph (==0.9.1)"]
-tests = ["pytest", "simplejson"]
+code-style = ["pre-commit"]
+rtd = ["myst-parser", "sphinx-book-theme"]
+testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
[[package]]
name = "mdurl"
@@ -2584,7 +2470,7 @@ version = "0.1.2"
description = "Markdown URL utilities"
optional = false
python-versions = ">=3.7"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
{file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
{file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
@@ -2592,49 +2478,143 @@ files = [
[[package]]
name = "mistralai"
-version = "1.5.2"
+version = "1.9.3"
description = "Python Client SDK for the Mistral AI API."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "mistralai-1.5.2-py3-none-any.whl", hash = "sha256:5b1112acebbcad1afd7732ce0bd60614975b64999801c555c54768ac41f506ae"},
- {file = "mistralai-1.5.2.tar.gz", hash = "sha256:f39e6e51e8939aac2602e4badcb18712cbee2df33d86100c559333e609b92d17"},
+ {file = "mistralai-1.9.3-py3-none-any.whl", hash = "sha256:962445e7cebadcbfbcd1daf973e853a832dcf7aba6320468fcf7e2cf5f943aec"},
+ {file = "mistralai-1.9.3.tar.gz", hash = "sha256:a69806247ed3a67820ecfc9a68b7dbc0c6120dad5e5c3d507bd57fa388b491b7"},
]
[package.dependencies]
eval-type-backport = ">=0.2.0"
-httpx = ">=0.27.0"
-jsonpath-python = ">=1.0.6"
-pydantic = ">=2.9.0"
+httpx = ">=0.28.1"
+pydantic = ">=2.10.3"
python-dateutil = ">=2.8.2"
-typing-inspect = ">=0.9.0"
+typing-inspection = ">=0.4.0"
[package.extras]
+agents = ["authlib (>=1.5.2,<2.0)", "griffe (>=1.7.3,<2.0)", "mcp (>=1.0,<2.0) ; python_version >= \"3.10\""]
gcp = ["google-auth (>=2.27.0)", "requests (>=2.32.3)"]
[[package]]
-name = "monotonic"
-version = "1.6"
-description = "An implementation of time.monotonic() for Python 2 & < 3.3"
+name = "mlflow"
+version = "3.3.1"
+description = "MLflow is an open source platform for the complete machine learning lifecycle"
optional = false
-python-versions = "*"
+python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"},
- {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"},
+ {file = "mlflow-3.3.1-py3-none-any.whl", hash = "sha256:a78a032cf5392a608bba1a6ee59c9bbd6b1d29b2ea2598e4e2ce7a20ccaf1eea"},
+ {file = "mlflow-3.3.1.tar.gz", hash = "sha256:05159afb08e898f11b0f71f29d5b27e5e5248f0099c449567dcb8a52e9b07463"},
+]
+
+[package.dependencies]
+alembic = "<1.10.0 || >1.10.0,<2"
+cryptography = ">=43.0.0,<46"
+docker = ">=4.0.0,<8"
+Flask = "<4"
+graphene = "<4"
+gunicorn = {version = "<24", markers = "platform_system != \"Windows\""}
+matplotlib = "<4"
+mlflow-skinny = "3.3.1"
+mlflow-tracing = "3.3.1"
+numpy = "<3"
+pandas = "<3"
+pyarrow = ">=4.0.0,<22"
+scikit-learn = "<2"
+scipy = "<2"
+sqlalchemy = ">=1.4.0,<3"
+waitress = {version = "<4", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+aliyun-oss = ["aliyunstoreplugin"]
+auth = ["Flask-WTF (<2)"]
+databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"]
+extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"]
+gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"]
+genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"]
+jfrog = ["mlflow-jfrog-plugin"]
+langchain = ["langchain (>=0.1.0,<=0.3.27)"]
+mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"]
+sqlserver = ["mlflow-dbstore"]
+
+[[package]]
+name = "mlflow-skinny"
+version = "3.3.1"
+description = "MLflow is an open source platform for the complete machine learning lifecycle"
+optional = false
+python-versions = ">=3.10"
+groups = ["main"]
+files = [
+ {file = "mlflow_skinny-3.3.1-py3-none-any.whl", hash = "sha256:0955568f6a97db9456314439fcf8392c9f9f24c8085948f45d2db933a7520eed"},
+ {file = "mlflow_skinny-3.3.1.tar.gz", hash = "sha256:1a95be40086a3d0f109ae918b214df3230199793afe10a42ddc7dc2176f8656c"},
]
+[package.dependencies]
+cachetools = ">=5.0.0,<7"
+click = ">=7.0,<9"
+cloudpickle = "<4"
+databricks-sdk = ">=0.20.0,<1"
+fastapi = "<1"
+gitpython = ">=3.1.9,<4"
+importlib_metadata = ">=3.7.0,<4.7.0 || >4.7.0,<9"
+opentelemetry-api = ">=1.9.0,<3"
+opentelemetry-sdk = ">=1.9.0,<3"
+packaging = "<26"
+protobuf = ">=3.12.0,<7"
+pydantic = ">=1.10.8,<3"
+pyyaml = ">=5.1,<7"
+requests = ">=2.17.3,<3"
+sqlparse = ">=0.4.0,<1"
+typing-extensions = ">=4.0.0,<5"
+uvicorn = "<1"
+
+[package.extras]
+aliyun-oss = ["aliyunstoreplugin"]
+auth = ["Flask-WTF (<2)"]
+databricks = ["azure-storage-file-datalake (>12)", "boto3 (>1)", "botocore", "databricks-agents (>=1.2.0,<2.0)", "google-cloud-storage (>=1.30.0)"]
+extras = ["azureml-core (>=1.2.0)", "boto3", "botocore", "google-cloud-storage (>=1.30.0)", "kubernetes", "prometheus-flask-exporter", "pyarrow", "pysftp", "requests-auth-aws-sigv4", "virtualenv"]
+gateway = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"]
+genai = ["aiohttp (<4)", "boto3 (>=1.28.56,<2)", "fastapi (<1)", "slowapi (>=0.1.9,<1)", "tiktoken (<1)", "uvicorn[standard] (<1)", "watchfiles (<2)"]
+jfrog = ["mlflow-jfrog-plugin"]
+langchain = ["langchain (>=0.1.0,<=0.3.27)"]
+mlserver = ["mlserver (>=1.2.0,!=1.3.1,<2.0.0)", "mlserver-mlflow (>=1.2.0,!=1.3.1,<2.0.0)"]
+sqlserver = ["mlflow-dbstore"]
+
+[[package]]
+name = "mlflow-tracing"
+version = "3.3.1"
+description = "MLflow Tracing SDK is an open-source, lightweight Python package that only includes the minimum set of dependencies and functionality to instrument your code/models/agents with MLflow Tracing."
+optional = false
+python-versions = ">=3.10"
+groups = ["main"]
+files = [
+ {file = "mlflow_tracing-3.3.1-py3-none-any.whl", hash = "sha256:ab92e6287fdaac2940528b520f1728a300d02b5858052f0c5831df2b1bb4fbbc"},
+ {file = "mlflow_tracing-3.3.1.tar.gz", hash = "sha256:ba2973300836b8d656ec516f64145130bbe07332e43429765507234db8a8f632"},
+]
+
+[package.dependencies]
+cachetools = ">=5.0.0,<7"
+databricks-sdk = ">=0.20.0,<1"
+opentelemetry-api = ">=1.9.0,<3"
+opentelemetry-sdk = ">=1.9.0,<3"
+packaging = "<26"
+protobuf = ">=3.12.0,<7"
+pydantic = ">=1.10.8,<3"
+
[[package]]
-name = "more-itertools"
-version = "10.6.0"
-description = "More routines for operating on iterables, beyond itertools"
+name = "monotonic"
+version = "1.6"
+description = "An implementation of time.monotonic() for Python 2 & < 3.3"
optional = false
-python-versions = ">=3.9"
+python-versions = "*"
groups = ["main"]
files = [
- {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"},
- {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"},
+ {file = "monotonic-1.6-py2.py3-none-any.whl", hash = "sha256:68687e19a14f11f26d140dd5c86f3dba4bf5df58003000ed467e0e2a69bca96c"},
+ {file = "monotonic-1.6.tar.gz", hash = "sha256:3a55207bcfed53ddd5c5bae174524062935efed17792e9de2ad0205ce9ad63f7"},
]
[[package]]
@@ -2657,104 +2637,122 @@ tests = ["pytest (>=4.6)"]
[[package]]
name = "multidict"
-version = "6.1.0"
+version = "6.6.3"
description = "multidict implementation"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"},
- {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"},
- {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"},
- {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"},
- {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"},
- {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"},
- {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"},
- {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"},
- {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"},
- {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"},
- {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"},
- {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"},
- {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"},
- {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"},
- {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"},
- {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"},
- {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"},
- {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"},
- {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"},
- {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"},
- {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"},
- {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"},
- {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"},
- {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"},
- {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"},
- {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"},
- {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"},
- {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"},
- {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"},
- {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"},
- {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"},
- {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"},
- {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"},
- {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"},
+ {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2be5b7b35271f7fff1397204ba6708365e3d773579fe2a30625e16c4b4ce817"},
+ {file = "multidict-6.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12f4581d2930840295c461764b9a65732ec01250b46c6b2c510d7ee68872b140"},
+ {file = "multidict-6.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dd7793bab517e706c9ed9d7310b06c8672fd0aeee5781bfad612f56b8e0f7d14"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:72d8815f2cd3cf3df0f83cac3f3ef801d908b2d90409ae28102e0553af85545a"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:531e331a2ee53543ab32b16334e2deb26f4e6b9b28e41f8e0c87e99a6c8e2d69"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:42ca5aa9329a63be8dc49040f63817d1ac980e02eeddba763a9ae5b4027b9c9c"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:208b9b9757060b9faa6f11ab4bc52846e4f3c2fb8b14d5680c8aac80af3dc751"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:acf6b97bd0884891af6a8b43d0f586ab2fcf8e717cbd47ab4bdddc09e20652d8"},
+ {file = "multidict-6.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:68e9e12ed00e2089725669bdc88602b0b6f8d23c0c95e52b95f0bc69f7fe9b55"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:05db2f66c9addb10cfa226e1acb363450fab2ff8a6df73c622fefe2f5af6d4e7"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:0db58da8eafb514db832a1b44f8fa7906fdd102f7d982025f816a93ba45e3dcb"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:14117a41c8fdb3ee19c743b1c027da0736fdb79584d61a766da53d399b71176c"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:877443eaaabcd0b74ff32ebeed6f6176c71850feb7d6a1d2db65945256ea535c"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:70b72e749a4f6e7ed8fb334fa8d8496384840319512746a5f42fa0aec79f4d61"},
+ {file = "multidict-6.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43571f785b86afd02b3855c5ac8e86ec921b760298d6f82ff2a61daf5a35330b"},
+ {file = "multidict-6.6.3-cp310-cp310-win32.whl", hash = "sha256:20c5a0c3c13a15fd5ea86c42311859f970070e4e24de5a550e99d7c271d76318"},
+ {file = "multidict-6.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab0a34a007704c625e25a9116c6770b4d3617a071c8a7c30cd338dfbadfe6485"},
+ {file = "multidict-6.6.3-cp310-cp310-win_arm64.whl", hash = "sha256:769841d70ca8bdd140a715746199fc6473414bd02efd678d75681d2d6a8986c5"},
+ {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c"},
+ {file = "multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df"},
+ {file = "multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9"},
+ {file = "multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56"},
+ {file = "multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183"},
+ {file = "multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5"},
+ {file = "multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2"},
+ {file = "multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb"},
+ {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6"},
+ {file = "multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f"},
+ {file = "multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a"},
+ {file = "multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75"},
+ {file = "multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10"},
+ {file = "multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5"},
+ {file = "multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17"},
+ {file = "multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b"},
+ {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55"},
+ {file = "multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b"},
+ {file = "multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca"},
+ {file = "multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1"},
+ {file = "multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6"},
+ {file = "multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e"},
+ {file = "multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9"},
+ {file = "multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600"},
+ {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134"},
+ {file = "multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37"},
+ {file = "multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0"},
+ {file = "multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d"},
+ {file = "multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c"},
+ {file = "multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e"},
+ {file = "multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d"},
+ {file = "multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb"},
+ {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c8161b5a7778d3137ea2ee7ae8a08cce0010de3b00ac671c5ebddeaa17cefd22"},
+ {file = "multidict-6.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1328201ee930f069961ae707d59c6627ac92e351ed5b92397cf534d1336ce557"},
+ {file = "multidict-6.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b1db4d2093d6b235de76932febf9d50766cf49a5692277b2c28a501c9637f616"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53becb01dd8ebd19d1724bebe369cfa87e4e7f29abbbe5c14c98ce4c383e16cd"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41bb9d1d4c303886e2d85bade86e59885112a7f4277af5ad47ab919a2251f306"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:775b464d31dac90f23192af9c291dc9f423101857e33e9ebf0020a10bfcf4144"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d04d01f0a913202205a598246cf77826fe3baa5a63e9f6ccf1ab0601cf56eca0"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d25594d3b38a2e6cabfdcafef339f754ca6e81fbbdb6650ad773ea9775af35ab"},
+ {file = "multidict-6.6.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:35712f1748d409e0707b165bf49f9f17f9e28ae85470c41615778f8d4f7d9609"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1c8082e5814b662de8589d6a06c17e77940d5539080cbab9fe6794b5241b76d9"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:61af8a4b771f1d4d000b3168c12c3120ccf7284502a94aa58c68a81f5afac090"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:448e4a9afccbf297577f2eaa586f07067441e7b63c8362a3540ba5a38dc0f14a"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:233ad16999afc2bbd3e534ad8dbe685ef8ee49a37dbc2cdc9514e57b6d589ced"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:bb933c891cd4da6bdcc9733d048e994e22e1883287ff7540c2a0f3b117605092"},
+ {file = "multidict-6.6.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:37b09ca60998e87734699e88c2363abfd457ed18cfbf88e4009a4e83788e63ed"},
+ {file = "multidict-6.6.3-cp39-cp39-win32.whl", hash = "sha256:f54cb79d26d0cd420637d184af38f0668558f3c4bbe22ab7ad830e67249f2e0b"},
+ {file = "multidict-6.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:295adc9c0551e5d5214b45cf29ca23dbc28c2d197a9c30d51aed9e037cb7c578"},
+ {file = "multidict-6.6.3-cp39-cp39-win_arm64.whl", hash = "sha256:15332783596f227db50fb261c2c251a58ac3873c457f3a550a95d5c0aa3c770d"},
+ {file = "multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a"},
+ {file = "multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc"},
]
[[package]]
@@ -2784,16 +2782,43 @@ dill = ">=0.3.8"
[[package]]
name = "mypy-extensions"
-version = "1.0.0"
+version = "1.1.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
-python-versions = ">=3.5"
-groups = ["main", "dev"]
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"},
+ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"},
+]
+
+[[package]]
+name = "myst-parser"
+version = "4.0.1"
+description = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser,"
+optional = false
+python-versions = ">=3.10"
+groups = ["main"]
files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+ {file = "myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d"},
+ {file = "myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4"},
]
+[package.dependencies]
+docutils = ">=0.19,<0.22"
+jinja2 = "*"
+markdown-it-py = ">=3.0,<4.0"
+mdit-py-plugins = ">=0.4.1,<1.0"
+pyyaml = "*"
+sphinx = ">=7,<9"
+
+[package.extras]
+code-style = ["pre-commit (>=4.0,<5.0)"]
+linkify = ["linkify-it-py (>=2.0,<3.0)"]
+rtd = ["ipython", "sphinx (>=7)", "sphinx-autodoc2 (>=0.5.0,<0.6.0)", "sphinx-book-theme (>=1.1,<2.0)", "sphinx-copybutton", "sphinx-design", "sphinx-pyscript", "sphinx-tippy (>=0.4.3)", "sphinx-togglebutton", "sphinxext-opengraph (>=0.9.0,<0.10.0)", "sphinxext-rediraffe (>=0.2.7,<0.3.0)"]
+testing = ["beautifulsoup4", "coverage[toml]", "defusedxml", "pygments (<2.19)", "pytest (>=8,<9)", "pytest-cov", "pytest-param-files (>=0.6.0,<0.7.0)", "pytest-regressions", "sphinx-pytest"]
+testing-docutils = ["pygments", "pytest (>=8,<9)", "pytest-param-files (>=0.6.0,<0.7.0)"]
+
[[package]]
name = "nest-asyncio"
version = "1.6.0"
@@ -2808,84 +2833,52 @@ files = [
[[package]]
name = "networkx"
-version = "3.4.2"
+version = "3.5"
description = "Python package for creating and manipulating graphs and networks"
optional = false
-python-versions = ">=3.10"
+python-versions = ">=3.11"
groups = ["main"]
files = [
- {file = "networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f"},
- {file = "networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1"},
+ {file = "networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec"},
+ {file = "networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037"},
]
[package.extras]
-default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"]
-developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
-doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"]
-example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
+default = ["matplotlib (>=3.8)", "numpy (>=1.25)", "pandas (>=2.0)", "scipy (>=1.11.2)"]
+developer = ["mypy (>=1.15)", "pre-commit (>=4.1)"]
+doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=10)", "pydata-sphinx-theme (>=0.16)", "sphinx (>=8.0)", "sphinx-gallery (>=0.18)", "texext (>=0.6.7)"]
+example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=2.0.0)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"]
-test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
+test = ["pytest (>=7.2)", "pytest-cov (>=4.0)", "pytest-xdist (>=3.0)"]
+test-extras = ["pytest-mpl", "pytest-randomly"]
[[package]]
-name = "nh3"
-version = "0.2.21"
-description = "Python binding to Ammonia HTML sanitizer Rust crate"
+name = "ninja"
+version = "1.11.1.4"
+description = "Ninja is a small build system with a focus on speed"
optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "nh3-0.2.21-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:fcff321bd60c6c5c9cb4ddf2554e22772bb41ebd93ad88171bbbb6f271255286"},
- {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31eedcd7d08b0eae28ba47f43fd33a653b4cdb271d64f1aeda47001618348fde"},
- {file = "nh3-0.2.21-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d426d7be1a2f3d896950fe263332ed1662f6c78525b4520c8e9861f8d7f0d243"},
- {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9d67709bc0d7d1f5797b21db26e7a8b3d15d21c9c5f58ccfe48b5328483b685b"},
- {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:55823c5ea1f6b267a4fad5de39bc0524d49a47783e1fe094bcf9c537a37df251"},
- {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:818f2b6df3763e058efa9e69677b5a92f9bc0acff3295af5ed013da544250d5b"},
- {file = "nh3-0.2.21-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b3b5c58161e08549904ac4abd450dacd94ff648916f7c376ae4b2c0652b98ff9"},
- {file = "nh3-0.2.21-cp313-cp313t-win32.whl", hash = "sha256:637d4a10c834e1b7d9548592c7aad760611415fcd5bd346f77fd8a064309ae6d"},
- {file = "nh3-0.2.21-cp313-cp313t-win_amd64.whl", hash = "sha256:713d16686596e556b65e7f8c58328c2df63f1a7abe1277d87625dcbbc012ef82"},
- {file = "nh3-0.2.21-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a772dec5b7b7325780922dd904709f0f5f3a79fbf756de5291c01370f6df0967"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d002b648592bf3033adfd875a48f09b8ecc000abd7f6a8769ed86b6ccc70c759"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a5174551f95f2836f2ad6a8074560f261cf9740a48437d6151fd2d4d7d617ab"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b8d55ea1fc7ae3633d758a92aafa3505cd3cc5a6e40470c9164d54dff6f96d42"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ae319f17cd8960d0612f0f0ddff5a90700fa71926ca800e9028e7851ce44a6f"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ca02ac6f27fc80f9894409eb61de2cb20ef0a23740c7e29f9ec827139fa578"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5f77e62aed5c4acad635239ac1290404c7e940c81abe561fd2af011ff59f585"},
- {file = "nh3-0.2.21-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293"},
- {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ac7006c3abd097790e611fe4646ecb19a8d7f2184b882f6093293b8d9b887431"},
- {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:6141caabe00bbddc869665b35fc56a478eb774a8c1dfd6fba9fe1dfdf29e6efa"},
- {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:20979783526641c81d2f5bfa6ca5ccca3d1e4472474b162c6256745fbfe31cd1"},
- {file = "nh3-0.2.21-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a7ea28cd49293749d67e4fcf326c554c83ec912cd09cd94aa7ec3ab1921c8283"},
- {file = "nh3-0.2.21-cp38-abi3-win32.whl", hash = "sha256:6c9c30b8b0d291a7c5ab0967ab200598ba33208f754f2f4920e9343bdd88f79a"},
- {file = "nh3-0.2.21-cp38-abi3-win_amd64.whl", hash = "sha256:bb0014948f04d7976aabae43fcd4cb7f551f9f8ce785a4c9ef66e6c2590f8629"},
- {file = "nh3-0.2.21.tar.gz", hash = "sha256:4990e7ee6a55490dbf00d61a6f476c9a3258e31e711e13713b2ea7d6616f670e"},
-]
-
-[[package]]
-name = "nltk"
-version = "3.9.1"
-description = "Natural Language Toolkit"
-optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1"},
- {file = "nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868"},
+ {file = "ninja-1.11.1.4-py3-none-macosx_10_9_universal2.whl", hash = "sha256:b33923c8da88e8da20b6053e38deb433f53656441614207e01d283ad02c5e8e7"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cede0af00b58e27b31f2482ba83292a8e9171cdb9acc2c867a3b6e40b3353e43"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:096487995473320de7f65d622c3f1d16c3ad174797602218ca8c967f51ec38a0"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3090d4488fadf6047d0d7a1db0c9643a8d391f0d94729554dbb89b5bdc769d7"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecce44a00325a93631792974659cf253a815cc6da4ec96f89742925dfc295a0d"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c29bb66d2aa46a2409ab369ea804c730faec7652e8c22c1e428cc09216543e5"},
+ {file = "ninja-1.11.1.4-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:055f386fb550c2c9d6157e45e20a84d29c47968876b9c5794ae2aec46f952306"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:f6186d7607bb090c3be1e10c8a56b690be238f953616626f5032238c66e56867"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_i686.whl", hash = "sha256:cf4453679d15babc04ba023d68d091bb613091b67101c88f85d2171c6621c6eb"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:d4a6f159b08b0ac4aca5ee1572e3e402f969139e71d85d37c0e2872129098749"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:c3b96bd875f3ef1db782470e9e41d7508905a0986571f219d20ffed238befa15"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:cf554e73f72c04deb04d0cf51f5fdb1903d9c9ca3d2344249c8ce3bd616ebc02"},
+ {file = "ninja-1.11.1.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cfdd09776436a1ff3c4a2558d3fc50a689fb9d7f1bdbc3e6f7b8c2991341ddb3"},
+ {file = "ninja-1.11.1.4-py3-none-win32.whl", hash = "sha256:2ab67a41c90bea5ec4b795bab084bc0b3b3bb69d3cd21ca0294fc0fc15a111eb"},
+ {file = "ninja-1.11.1.4-py3-none-win_amd64.whl", hash = "sha256:4617b3c12ff64b611a7d93fd9e378275512bb36eff8babff7c83f5116b4f8d66"},
+ {file = "ninja-1.11.1.4-py3-none-win_arm64.whl", hash = "sha256:5713cf50c5be50084a8693308a63ecf9e55c3132a78a41ab1363a28b6caaaee1"},
+ {file = "ninja-1.11.1.4.tar.gz", hash = "sha256:6aa39f6e894e0452e5b297327db00019383ae55d5d9c57c73b04f13bf79d438a"},
]
-[package.dependencies]
-click = "*"
-joblib = "*"
-regex = ">=2021.8.3"
-tqdm = "*"
-
-[package.extras]
-all = ["matplotlib", "numpy", "pyparsing", "python-crfsuite", "requests", "scikit-learn", "scipy", "twython"]
-corenlp = ["requests"]
-machine-learning = ["numpy", "python-crfsuite", "scikit-learn", "scipy"]
-plot = ["matplotlib"]
-tgrep = ["pyparsing"]
-twitter = ["twython"]
-
[[package]]
name = "nodeenv"
version = "1.9.1"
@@ -2945,186 +2938,225 @@ files = [
]
[[package]]
-name = "nvidia-cublas-cu11"
-version = "11.11.3.6"
+name = "nvidia-cublas-cu12"
+version = "12.4.5.8"
description = "CUBLAS native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux1_x86_64.whl", hash = "sha256:39fb40e8f486dd8a2ddb8fdeefe1d5b28f5b99df01c87ab3676f057a74a5a6f3"},
- {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5ccae9e069a2c6be9af9cb5a0b0c6928c19c7915e390d15f598a1eead2a01a7a"},
- {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:60252822adea5d0b10cd990a7dc7bedf7435f30ae40083c7a624a85a43225abc"},
- {file = "nvidia_cublas_cu11-11.11.3.6-py3-none-win_amd64.whl", hash = "sha256:6ab12b1302bef8ac1ff4414edd1c059e57f4833abef9151683fb8f4de25900be"},
+ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3"},
+ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b"},
+ {file = "nvidia_cublas_cu12-12.4.5.8-py3-none-win_amd64.whl", hash = "sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc"},
]
[[package]]
-name = "nvidia-cuda-cupti-cu11"
-version = "11.8.87"
+name = "nvidia-cuda-cupti-cu12"
+version = "12.4.127"
description = "CUDA profiling tools runtime libs."
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux1_x86_64.whl", hash = "sha256:0e50c707df56c75a2c0703dc6b886f3c97a22f37d6f63839f75b7418ba672a8d"},
- {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9aaa638963a8271df26b6ee0d93b781730b7acc6581ff700bd023d7934e4385e"},
- {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4191a17913a706b5098681280cd089cd7d8d3df209a6f5cb79384974a96d24f2"},
- {file = "nvidia_cuda_cupti_cu11-11.8.87-py3-none-win_amd64.whl", hash = "sha256:4332d8550ad5f5b673f98d08e4e4f82030cb604c66d8d5ee919399ea01312e58"},
+ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a"},
+ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb"},
+ {file = "nvidia_cuda_cupti_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922"},
]
[[package]]
-name = "nvidia-cuda-nvrtc-cu11"
-version = "11.8.89"
+name = "nvidia-cuda-nvrtc-cu12"
+version = "12.4.127"
description = "NVRTC native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux1_x86_64.whl", hash = "sha256:1f27d67b0f72902e9065ae568b4f6268dfe49ba3ed269c9a3da99bb86d1d2008"},
- {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8ab17ed51e7c4928f7170a0551e3e3b42f89d973bd267ced9688c238b3e10aef"},
- {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a8d02f3cba345be56b1ffc3e74d8f61f02bb758dd31b0f20e12277a5a244f756"},
- {file = "nvidia_cuda_nvrtc_cu11-11.8.89-py3-none-win_amd64.whl", hash = "sha256:e18a23a8f4064664a6f1c4a64f38c581cbebfb5935280e94a4943ea8ae3791b1"},
+ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198"},
+ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338"},
+ {file = "nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec"},
]
[[package]]
-name = "nvidia-cuda-runtime-cu11"
-version = "11.8.89"
+name = "nvidia-cuda-runtime-cu12"
+version = "12.4.127"
description = "CUDA Runtime native Libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux1_x86_64.whl", hash = "sha256:f587bd726eb2f7612cf77ce38a2c1e65cf23251ff49437f6161ce0d647f64f7c"},
- {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux2014_aarch64.whl", hash = "sha256:e53bf160b6b660819cb6e4a9da2cc89e6aa2329858299780a2459780a2b8d012"},
- {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-manylinux2014_x86_64.whl", hash = "sha256:92d04069a987e1fbc9213f8376d265df0f7bb42617d44f5eda1f496acea7f2d1"},
- {file = "nvidia_cuda_runtime_cu11-11.8.89-py3-none-win_amd64.whl", hash = "sha256:f60c9fdaed8065b38de8097867240efc5556a8a710007146daeb9082334a6e63"},
+ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3"},
+ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5"},
+ {file = "nvidia_cuda_runtime_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e"},
]
[[package]]
-name = "nvidia-cudnn-cu11"
+name = "nvidia-cudnn-cu12"
version = "9.1.0.70"
description = "cuDNN runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cudnn_cu11-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e6135ac63fe9d5b0b89cfb35c3fc1c1349f2b995becadf2e9dc21bca89d9633d"},
- {file = "nvidia_cudnn_cu11-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:32f6a2fe80b4b7ebc5f9c4cb403c4c381eca99e6daa3cf38241047b3d3e14daa"},
+ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f"},
+ {file = "nvidia_cudnn_cu12-9.1.0.70-py3-none-win_amd64.whl", hash = "sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a"},
]
[package.dependencies]
-nvidia-cublas-cu11 = "*"
+nvidia-cublas-cu12 = "*"
[[package]]
-name = "nvidia-cufft-cu11"
-version = "10.9.0.58"
+name = "nvidia-cufft-cu12"
+version = "11.2.1.3"
description = "CUFFT native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux1_x86_64.whl", hash = "sha256:222f9da70c80384632fd6035e4c3f16762d64ea7a843829cb278f98b3cb7dd81"},
- {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_aarch64.whl", hash = "sha256:34b7315104e615b230dc3c2d1861f13bff9ec465c5d3b4bb65b4986d03a1d8d4"},
- {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e21037259995243cc370dd63c430d77ae9280bedb68d5b5a18226bfc92e5d748"},
- {file = "nvidia_cufft_cu11-10.9.0.58-py3-none-win_amd64.whl", hash = "sha256:c4d316f17c745ec9c728e30409612eaf77a8404c3733cdf6c9c1569634d1ca03"},
+ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399"},
+ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9"},
+ {file = "nvidia_cufft_cu12-11.2.1.3-py3-none-win_amd64.whl", hash = "sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b"},
]
+[package.dependencies]
+nvidia-nvjitlink-cu12 = "*"
+
[[package]]
-name = "nvidia-curand-cu11"
-version = "10.3.0.86"
+name = "nvidia-curand-cu12"
+version = "10.3.5.147"
description = "CURAND native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:ac439548c88580269a1eb6aeb602a5aed32f0dbb20809a31d9ed7d01d77f6bf5"},
- {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:64defc3016d8c1de351a764617818c2961210430f12476faee10084b269b188c"},
- {file = "nvidia_curand_cu11-10.3.0.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:cd4cffbf78bb06580206b4814d5dc696d1161c902aae37b2bba00056832379e6"},
- {file = "nvidia_curand_cu11-10.3.0.86-py3-none-win_amd64.whl", hash = "sha256:8fa8365065fc3e3760d7437b08f164a6bcf8f7124f3b544d2463ded01e6bdc70"},
+ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9"},
+ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b"},
+ {file = "nvidia_curand_cu12-10.3.5.147-py3-none-win_amd64.whl", hash = "sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771"},
]
[[package]]
-name = "nvidia-cusolver-cu11"
-version = "11.4.1.48"
+name = "nvidia-cusolver-cu12"
+version = "11.6.1.9"
description = "CUDA solver native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux1_x86_64.whl", hash = "sha256:ca538f545645b7e6629140786d3127fe067b3d5a085bd794cde5bfe877c8926f"},
- {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1a96acb05768610bc414dbef5b25ebd2d820fc8a1e8c72097f41f53d80934d61"},
- {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea9fb1ad8c644ca9ed55af13cc39af3b7ba4c3eb5aef18471fe1fe77d94383cb"},
- {file = "nvidia_cusolver_cu11-11.4.1.48-py3-none-win_amd64.whl", hash = "sha256:7efe43b113495a64e2cf9a0b4365bd53b0a82afb2e2cf91e9f993c9ef5e69ee8"},
+ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e"},
+ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260"},
+ {file = "nvidia_cusolver_cu12-11.6.1.9-py3-none-win_amd64.whl", hash = "sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c"},
]
[package.dependencies]
-nvidia-cublas-cu11 = "*"
+nvidia-cublas-cu12 = "*"
+nvidia-cusparse-cu12 = "*"
+nvidia-nvjitlink-cu12 = "*"
[[package]]
-name = "nvidia-cusparse-cu11"
-version = "11.7.5.86"
+name = "nvidia-cusparse-cu12"
+version = "12.3.1.170"
description = "CUSPARSE native runtime libraries"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
+files = [
+ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3"},
+ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1"},
+ {file = "nvidia_cusparse_cu12-12.3.1.170-py3-none-win_amd64.whl", hash = "sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f"},
+]
+
+[package.dependencies]
+nvidia-nvjitlink-cu12 = "*"
+
+[[package]]
+name = "nvidia-cusparselt-cu12"
+version = "0.6.2"
+description = "NVIDIA cuSPARSELt"
+optional = false
+python-versions = "*"
+groups = ["main"]
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
+files = [
+ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8"},
+ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9"},
+ {file = "nvidia_cusparselt_cu12-0.6.2-py3-none-win_amd64.whl", hash = "sha256:0057c91d230703924c0422feabe4ce768841f9b4b44d28586b6f6d2eb86fbe70"},
+]
+
+[[package]]
+name = "nvidia-ml-py"
+version = "13.580.82"
+description = "Python Bindings for the NVIDIA Management Library"
+optional = false
+python-versions = "*"
+groups = ["main"]
files = [
- {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:4ae709fe78d3f23f60acaba8c54b8ad556cf16ca486e0cc1aa92dca7555d2d2b"},
- {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6c7da46abee7567e619d4aa2e90a1b032cfcbd1211d429853b1a6e87514a14b2"},
- {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8d7cf1628fd8d462b5d2ba6678fae34733a48ecb80495b9c68672ec6a6dde5ef"},
- {file = "nvidia_cusparse_cu11-11.7.5.86-py3-none-win_amd64.whl", hash = "sha256:a0f6ee81cd91be606fc2f55992d06b09cd4e86d74b6ae5e8dd1631cf7f5a8706"},
+ {file = "nvidia_ml_py-13.580.82-py3-none-any.whl", hash = "sha256:4361db337b0c551e2d101936dae2e9a60f957af26818e8c0c3a1f32b8db8d0a7"},
+ {file = "nvidia_ml_py-13.580.82.tar.gz", hash = "sha256:0c028805dc53a0e2a6985ea801888197765ac2ef8f1c9e29a7bf0d3616a5efc7"},
]
[[package]]
-name = "nvidia-nccl-cu11"
+name = "nvidia-nccl-cu12"
version = "2.21.5"
description = "NVIDIA Collective Communication Library (NCCL) Runtime"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_nccl_cu11-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:49d8350629c7888701d1fd200934942671cb5c728f49acc5a0b3a768820bed29"},
+ {file = "nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0"},
]
[[package]]
-name = "nvidia-nvtx-cu11"
-version = "11.8.86"
+name = "nvidia-nvjitlink-cu12"
+version = "12.4.127"
+description = "Nvidia JIT LTO Library"
+optional = false
+python-versions = ">=3"
+groups = ["main"]
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
+files = [
+ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83"},
+ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"},
+ {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"},
+]
+
+[[package]]
+name = "nvidia-nvtx-cu12"
+version = "12.4.127"
description = "NVIDIA Tools Extension"
optional = false
python-versions = ">=3"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
- {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux1_x86_64.whl", hash = "sha256:890656d8bd9b4e280231c832e1f0d03459200ba4824ddda3dcb59b1e1989b9f5"},
- {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5e84b97062eb102b45a8a9172a06cfe28b239b1635075a13d6474e91295e0468"},
- {file = "nvidia_nvtx_cu11-11.8.86-py3-none-manylinux2014_x86_64.whl", hash = "sha256:979f5b2aef5da164c5c53c64c85c3dfa61b8b4704f4f963bb568bf98fa8472e8"},
- {file = "nvidia_nvtx_cu11-11.8.86-py3-none-win_amd64.whl", hash = "sha256:54031010ee38d774b2991004d88f90bbd7bbc1458a96bbc4b42662756508c252"},
+ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3"},
+ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a"},
+ {file = "nvidia_nvtx_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485"},
]
[[package]]
name = "ollama"
-version = "0.4.7"
+version = "0.4.9"
description = "The official Python client for Ollama."
optional = false
-python-versions = "<4.0,>=3.8"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "ollama-0.4.7-py3-none-any.whl", hash = "sha256:85505663cca67a83707be5fb3aeff0ea72e67846cea5985529d8eca4366564a1"},
- {file = "ollama-0.4.7.tar.gz", hash = "sha256:891dcbe54f55397d82d289c459de0ea897e103b86a3f1fad0fdb1895922a75ff"},
+ {file = "ollama-0.4.9-py3-none-any.whl", hash = "sha256:18c8c85358c54d7f73d6a66cda495b0e3ba99fdb88f824ae470d740fbb211a50"},
+ {file = "ollama-0.4.9.tar.gz", hash = "sha256:5266d4d29b5089a01489872b8e8f980f018bccbdd1082b3903448af1d5615ce7"},
]
[package.dependencies]
-httpx = ">=0.27,<0.29"
-pydantic = ">=2.9.0,<3.0.0"
+httpx = ">=0.27"
+pydantic = ">=2.9"
[[package]]
name = "omegaconf"
@@ -3144,14 +3176,14 @@ PyYAML = ">=5.1.0"
[[package]]
name = "openai"
-version = "1.65.4"
+version = "1.99.5"
description = "The official Python library for the openai API"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "openai-1.65.4-py3-none-any.whl", hash = "sha256:15566d46574b94eae3d18efc2f9a4ebd1366d1d44bfc1bdafeea7a5cf8271bcb"},
- {file = "openai-1.65.4.tar.gz", hash = "sha256:0b08c58625d556f5c6654701af1023689c173eb0989ce8f73c7fd0eb22203c76"},
+ {file = "openai-1.99.5-py3-none-any.whl", hash = "sha256:4e870f9501b7c36132e2be13313ce3c4d6915a837e7a299c483aab6a6d4412e9"},
+ {file = "openai-1.99.5.tar.gz", hash = "sha256:aa97ac3326cac7949c5e4ac0274c454c1d19c939760107ae0d3948fc26a924ca"},
]
[package.dependencies]
@@ -3165,261 +3197,204 @@ tqdm = ">4"
typing-extensions = ">=4.11,<5"
[package.extras]
+aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"]
datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
-realtime = ["websockets (>=13,<15)"]
+realtime = ["websockets (>=13,<16)"]
+voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
[[package]]
name = "opentelemetry-api"
-version = "1.30.0"
+version = "1.36.0"
description = "OpenTelemetry Python API"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_api-1.30.0-py3-none-any.whl", hash = "sha256:d5f5284890d73fdf47f843dda3210edf37a38d66f44f2b5aedc1e89ed455dc09"},
- {file = "opentelemetry_api-1.30.0.tar.gz", hash = "sha256:375893400c1435bf623f7dfb3bcd44825fe6b56c34d0667c542ea8257b1a1240"},
+ {file = "opentelemetry_api-1.36.0-py3-none-any.whl", hash = "sha256:02f20bcacf666e1333b6b1f04e647dc1d5111f86b8e510238fcc56d7762cda8c"},
+ {file = "opentelemetry_api-1.36.0.tar.gz", hash = "sha256:9a72572b9c416d004d492cbc6e61962c0501eaf945ece9b5a0f56597d8348aa0"},
]
[package.dependencies]
-deprecated = ">=1.2.6"
-importlib-metadata = ">=6.0,<=8.5.0"
+importlib-metadata = ">=6.0,<8.8.0"
+typing-extensions = ">=4.5.0"
[[package]]
name = "opentelemetry-exporter-otlp-proto-common"
-version = "1.30.0"
+version = "1.36.0"
description = "OpenTelemetry Protobuf encoding"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_exporter_otlp_proto_common-1.30.0-py3-none-any.whl", hash = "sha256:5468007c81aa9c44dc961ab2cf368a29d3475977df83b4e30aeed42aa7bc3b38"},
- {file = "opentelemetry_exporter_otlp_proto_common-1.30.0.tar.gz", hash = "sha256:ddbfbf797e518411857d0ca062c957080279320d6235a279f7b64ced73c13897"},
+ {file = "opentelemetry_exporter_otlp_proto_common-1.36.0-py3-none-any.whl", hash = "sha256:0fc002a6ed63eac235ada9aa7056e5492e9a71728214a61745f6ad04b923f840"},
+ {file = "opentelemetry_exporter_otlp_proto_common-1.36.0.tar.gz", hash = "sha256:6c496ccbcbe26b04653cecadd92f73659b814c6e3579af157d8716e5f9f25cbf"},
]
[package.dependencies]
-opentelemetry-proto = "1.30.0"
+opentelemetry-proto = "1.36.0"
[[package]]
name = "opentelemetry-exporter-otlp-proto-grpc"
-version = "1.30.0"
+version = "1.36.0"
description = "OpenTelemetry Collector Protobuf over gRPC Exporter"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0-py3-none-any.whl", hash = "sha256:2906bcae3d80acc54fd1ffcb9e44d324e8631058b502ebe4643ca71d1ff30830"},
- {file = "opentelemetry_exporter_otlp_proto_grpc-1.30.0.tar.gz", hash = "sha256:d0f10f0b9b9a383b7d04a144d01cb280e70362cccc613987e234183fd1f01177"},
+ {file = "opentelemetry_exporter_otlp_proto_grpc-1.36.0-py3-none-any.whl", hash = "sha256:734e841fc6a5d6f30e7be4d8053adb703c70ca80c562ae24e8083a28fadef211"},
+ {file = "opentelemetry_exporter_otlp_proto_grpc-1.36.0.tar.gz", hash = "sha256:b281afbf7036b325b3588b5b6c8bb175069e3978d1bd24071f4a59d04c1e5bbf"},
]
[package.dependencies]
-deprecated = ">=1.2.6"
-googleapis-common-protos = ">=1.52,<2.0"
-grpcio = ">=1.63.2,<2.0.0"
+googleapis-common-protos = ">=1.57,<2.0"
+grpcio = [
+ {version = ">=1.63.2,<2.0.0", markers = "python_version < \"3.13\""},
+ {version = ">=1.66.2,<2.0.0", markers = "python_version >= \"3.13\""},
+]
opentelemetry-api = ">=1.15,<2.0"
-opentelemetry-exporter-otlp-proto-common = "1.30.0"
-opentelemetry-proto = "1.30.0"
-opentelemetry-sdk = ">=1.30.0,<1.31.0"
+opentelemetry-exporter-otlp-proto-common = "1.36.0"
+opentelemetry-proto = "1.36.0"
+opentelemetry-sdk = ">=1.36.0,<1.37.0"
+typing-extensions = ">=4.6.0"
[[package]]
name = "opentelemetry-proto"
-version = "1.30.0"
+version = "1.36.0"
description = "OpenTelemetry Python Proto"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_proto-1.30.0-py3-none-any.whl", hash = "sha256:c6290958ff3ddacc826ca5abbeb377a31c2334387352a259ba0df37c243adc11"},
- {file = "opentelemetry_proto-1.30.0.tar.gz", hash = "sha256:afe5c9c15e8b68d7c469596e5b32e8fc085eb9febdd6fb4e20924a93a0389179"},
+ {file = "opentelemetry_proto-1.36.0-py3-none-any.whl", hash = "sha256:151b3bf73a09f94afc658497cf77d45a565606f62ce0c17acb08cd9937ca206e"},
+ {file = "opentelemetry_proto-1.36.0.tar.gz", hash = "sha256:0f10b3c72f74c91e0764a5ec88fd8f1c368ea5d9c64639fb455e2854ef87dd2f"},
]
[package.dependencies]
-protobuf = ">=5.0,<6.0"
+protobuf = ">=5.0,<7.0"
[[package]]
name = "opentelemetry-sdk"
-version = "1.30.0"
+version = "1.36.0"
description = "OpenTelemetry Python SDK"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_sdk-1.30.0-py3-none-any.whl", hash = "sha256:14fe7afc090caad881addb6926cec967129bd9260c4d33ae6a217359f6b61091"},
- {file = "opentelemetry_sdk-1.30.0.tar.gz", hash = "sha256:c9287a9e4a7614b9946e933a67168450b9ab35f08797eb9bc77d998fa480fa18"},
+ {file = "opentelemetry_sdk-1.36.0-py3-none-any.whl", hash = "sha256:19fe048b42e98c5c1ffe85b569b7073576ad4ce0bcb6e9b4c6a39e890a6c45fb"},
+ {file = "opentelemetry_sdk-1.36.0.tar.gz", hash = "sha256:19c8c81599f51b71670661ff7495c905d8fdf6976e41622d5245b791b06fa581"},
]
[package.dependencies]
-opentelemetry-api = "1.30.0"
-opentelemetry-semantic-conventions = "0.51b0"
-typing-extensions = ">=3.7.4"
+opentelemetry-api = "1.36.0"
+opentelemetry-semantic-conventions = "0.57b0"
+typing-extensions = ">=4.5.0"
[[package]]
name = "opentelemetry-semantic-conventions"
-version = "0.51b0"
+version = "0.57b0"
description = "OpenTelemetry Semantic Conventions"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "opentelemetry_semantic_conventions-0.51b0-py3-none-any.whl", hash = "sha256:fdc777359418e8d06c86012c3dc92c88a6453ba662e941593adb062e48c2eeae"},
- {file = "opentelemetry_semantic_conventions-0.51b0.tar.gz", hash = "sha256:3fabf47f35d1fd9aebcdca7e6802d86bd5ebc3bc3408b7e3248dde6e87a18c47"},
+ {file = "opentelemetry_semantic_conventions-0.57b0-py3-none-any.whl", hash = "sha256:757f7e76293294f124c827e514c2a3144f191ef175b069ce8d1211e1e38e9e78"},
+ {file = "opentelemetry_semantic_conventions-0.57b0.tar.gz", hash = "sha256:609a4a79c7891b4620d64c7aac6898f872d790d75f22019913a660756f27ff32"},
]
[package.dependencies]
-deprecated = ">=1.2.6"
-opentelemetry-api = "1.30.0"
+opentelemetry-api = "1.36.0"
+typing-extensions = ">=4.5.0"
[[package]]
-name = "orjson"
-version = "3.10.15"
-description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
+name = "optuna"
+version = "4.4.0"
+description = "A hyperparameter optimization framework"
optional = false
python-versions = ">=3.8"
groups = ["main"]
-markers = "platform_python_implementation != \"PyPy\""
files = [
- {file = "orjson-3.10.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:552c883d03ad185f720d0c09583ebde257e41b9521b74ff40e08b7dec4559c04"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e3e8d438d02e4854f70bfdc03a6bcdb697358dbaa6bcd19cbe24d24ece1f8"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c2c79fa308e6edb0ffab0a31fd75a7841bf2a79a20ef08a3c6e3b26814c8ca8"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cb85490aa6bf98abd20607ab5c8324c0acb48d6da7863a51be48505646c814"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763dadac05e4e9d2bc14938a45a2d0560549561287d41c465d3c58aec818b164"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a330b9b4734f09a623f74a7490db713695e13b67c959713b78369f26b3dee6bf"},
- {file = "orjson-3.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a61a4622b7ff861f019974f73d8165be1bd9a0855e1cad18ee167acacabeb061"},
- {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acd271247691574416b3228db667b84775c497b245fa275c6ab90dc1ffbbd2b3"},
- {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4759b109c37f635aa5c5cc93a1b26927bfde24b254bcc0e1149a9fada253d2d"},
- {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e992fd5cfb8b9f00bfad2fd7a05a4299db2bbe92e6440d9dd2fab27655b3182"},
- {file = "orjson-3.10.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f95fb363d79366af56c3f26b71df40b9a583b07bbaaf5b317407c4d58497852e"},
- {file = "orjson-3.10.15-cp310-cp310-win32.whl", hash = "sha256:f9875f5fea7492da8ec2444839dcc439b0ef298978f311103d0b7dfd775898ab"},
- {file = "orjson-3.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:17085a6aa91e1cd70ca8533989a18b5433e15d29c574582f76f821737c8d5806"},
- {file = "orjson-3.10.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c4cc83960ab79a4031f3119cc4b1a1c627a3dc09df125b27c4201dff2af7eaa6"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbeef2481d895ab8be5185f2432c334d6dec1f5d1933a9c83014d188e102cef"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e590a0477b23ecd5b0ac865b1b907b01b3c5535f5e8a8f6ab0e503efb896334"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6be38bd103d2fd9bdfa31c2720b23b5d47c6796bcb1d1b598e3924441b4298d"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ff4f6edb1578960ed628a3b998fa54d78d9bb3e2eb2cfc5c2a09732431c678d0"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0482b21d0462eddd67e7fce10b89e0b6ac56570424662b685a0d6fccf581e13"},
- {file = "orjson-3.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bb5cc3527036ae3d98b65e37b7986a918955f85332c1ee07f9d3f82f3a6899b5"},
- {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d569c1c462912acdd119ccbf719cf7102ea2c67dd03b99edcb1a3048651ac96b"},
- {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1e6d33efab6b71d67f22bf2962895d3dc6f82a6273a965fab762e64fa90dc399"},
- {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c33be3795e299f565681d69852ac8c1bc5c84863c0b0030b2b3468843be90388"},
- {file = "orjson-3.10.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eea80037b9fae5339b214f59308ef0589fc06dc870578b7cce6d71eb2096764c"},
- {file = "orjson-3.10.15-cp311-cp311-win32.whl", hash = "sha256:d5ac11b659fd798228a7adba3e37c010e0152b78b1982897020a8e019a94882e"},
- {file = "orjson-3.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:cf45e0214c593660339ef63e875f32ddd5aa3b4adc15e662cdb80dc49e194f8e"},
- {file = "orjson-3.10.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:9d11c0714fc85bfcf36ada1179400862da3288fc785c30e8297844c867d7505a"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba5a1e85d554e3897fa9fe6fbcff2ed32d55008973ec9a2b992bd9a65d2352d"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7723ad949a0ea502df656948ddd8b392780a5beaa4c3b5f97e525191b102fff0"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6fd9bc64421e9fe9bd88039e7ce8e58d4fead67ca88e3a4014b143cec7684fd4"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dadba0e7b6594216c214ef7894c4bd5f08d7c0135f4dd0145600be4fbcc16767"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b48f59114fe318f33bbaee8ebeda696d8ccc94c9e90bc27dbe72153094e26f41"},
- {file = "orjson-3.10.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:035fb83585e0f15e076759b6fedaf0abb460d1765b6a36f48018a52858443514"},
- {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d13b7fe322d75bf84464b075eafd8e7dd9eae05649aa2a5354cfa32f43c59f17"},
- {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7066b74f9f259849629e0d04db6609db4cf5b973248f455ba5d3bd58a4daaa5b"},
- {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88dc3f65a026bd3175eb157fea994fca6ac7c4c8579fc5a86fc2114ad05705b7"},
- {file = "orjson-3.10.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b342567e5465bd99faa559507fe45e33fc76b9fb868a63f1642c6bc0735ad02a"},
- {file = "orjson-3.10.15-cp312-cp312-win32.whl", hash = "sha256:0a4f27ea5617828e6b58922fdbec67b0aa4bb844e2d363b9244c47fa2180e665"},
- {file = "orjson-3.10.15-cp312-cp312-win_amd64.whl", hash = "sha256:ef5b87e7aa9545ddadd2309efe6824bd3dd64ac101c15dae0f2f597911d46eaa"},
- {file = "orjson-3.10.15-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:bae0e6ec2b7ba6895198cd981b7cca95d1487d0147c8ed751e5632ad16f031a6"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f93ce145b2db1252dd86af37d4165b6faa83072b46e3995ecc95d4b2301b725a"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c203f6f969210128af3acae0ef9ea6aab9782939f45f6fe02d05958fe761ef9"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8918719572d662e18b8af66aef699d8c21072e54b6c82a3f8f6404c1f5ccd5e0"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f71eae9651465dff70aa80db92586ad5b92df46a9373ee55252109bb6b703307"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e117eb299a35f2634e25ed120c37c641398826c2f5a3d3cc39f5993b96171b9e"},
- {file = "orjson-3.10.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13242f12d295e83c2955756a574ddd6741c81e5b99f2bef8ed8d53e47a01e4b7"},
- {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7946922ada8f3e0b7b958cc3eb22cfcf6c0df83d1fe5521b4a100103e3fa84c8"},
- {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b7155eb1623347f0f22c38c9abdd738b287e39b9982e1da227503387b81b34ca"},
- {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:208beedfa807c922da4e81061dafa9c8489c6328934ca2a562efa707e049e561"},
- {file = "orjson-3.10.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eca81f83b1b8c07449e1d6ff7074e82e3fd6777e588f1a6632127f286a968825"},
- {file = "orjson-3.10.15-cp313-cp313-win32.whl", hash = "sha256:c03cd6eea1bd3b949d0d007c8d57049aa2b39bd49f58b4b2af571a5d3833d890"},
- {file = "orjson-3.10.15-cp313-cp313-win_amd64.whl", hash = "sha256:fd56a26a04f6ba5fb2045b0acc487a63162a958ed837648c5781e1fe3316cfbf"},
- {file = "orjson-3.10.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e8afd6200e12771467a1a44e5ad780614b86abb4b11862ec54861a82d677746"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9a18c500f19273e9e104cca8c1f0b40a6470bcccfc33afcc088045d0bf5ea6"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb00b7bfbdf5d34a13180e4805d76b4567025da19a197645ca746fc2fb536586"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33aedc3d903378e257047fee506f11e0833146ca3e57a1a1fb0ddb789876c1e1"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd0099ae6aed5eb1fc84c9eb72b95505a3df4267e6962eb93cdd5af03be71c98"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c864a80a2d467d7786274fce0e4f93ef2a7ca4ff31f7fc5634225aaa4e9e98c"},
- {file = "orjson-3.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c25774c9e88a3e0013d7d1a6c8056926b607a61edd423b50eb5c88fd7f2823ae"},
- {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e78c211d0074e783d824ce7bb85bf459f93a233eb67a5b5003498232ddfb0e8a"},
- {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:43e17289ffdbbac8f39243916c893d2ae41a2ea1a9cbb060a56a4d75286351ae"},
- {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:781d54657063f361e89714293c095f506c533582ee40a426cb6489c48a637b81"},
- {file = "orjson-3.10.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6875210307d36c94873f553786a808af2788e362bd0cf4c8e66d976791e7b528"},
- {file = "orjson-3.10.15-cp38-cp38-win32.whl", hash = "sha256:305b38b2b8f8083cc3d618927d7f424349afce5975b316d33075ef0f73576b60"},
- {file = "orjson-3.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:5dd9ef1639878cc3efffed349543cbf9372bdbd79f478615a1c633fe4e4180d1"},
- {file = "orjson-3.10.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ffe19f3e8d68111e8644d4f4e267a069ca427926855582ff01fc012496d19969"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d433bf32a363823863a96561a555227c18a522a8217a6f9400f00ddc70139ae2"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da03392674f59a95d03fa5fb9fe3a160b0511ad84b7a3914699ea5a1b3a38da2"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a63bb41559b05360ded9132032239e47983a39b151af1201f07ec9370715c82"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3766ac4702f8f795ff3fa067968e806b4344af257011858cc3d6d8721588b53f"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a1c73dcc8fadbd7c55802d9aa093b36878d34a3b3222c41052ce6b0fc65f8e8"},
- {file = "orjson-3.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b299383825eafe642cbab34be762ccff9fd3408d72726a6b2a4506d410a71ab3"},
- {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:abc7abecdbf67a173ef1316036ebbf54ce400ef2300b4e26a7b843bd446c2480"},
- {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:3614ea508d522a621384c1d6639016a5a2e4f027f3e4a1c93a51867615d28829"},
- {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:295c70f9dc154307777ba30fe29ff15c1bcc9dfc5c48632f37d20a607e9ba85a"},
- {file = "orjson-3.10.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:63309e3ff924c62404923c80b9e2048c1f74ba4b615e7584584389ada50ed428"},
- {file = "orjson-3.10.15-cp39-cp39-win32.whl", hash = "sha256:a2f708c62d026fb5340788ba94a55c23df4e1869fec74be455e0b2f5363b8507"},
- {file = "orjson-3.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:efcf6c735c3d22ef60c4aa27a5238f1a477df85e9b15f2142f9d669beb2d13fd"},
- {file = "orjson-3.10.15.tar.gz", hash = "sha256:05ca7fe452a2e9d8d9d706a2984c95b9c2ebc5db417ce0b7a49b91d50642a23e"},
+ {file = "optuna-4.4.0-py3-none-any.whl", hash = "sha256:fad8d9c5d5af993ae1280d6ce140aecc031c514a44c3b639d8c8658a8b7920ea"},
+ {file = "optuna-4.4.0.tar.gz", hash = "sha256:a9029f6a92a1d6c8494a94e45abd8057823b535c2570819072dbcdc06f1c1da4"},
]
+[package.dependencies]
+alembic = ">=1.5.0"
+colorlog = "*"
+numpy = "*"
+packaging = ">=20.0"
+PyYAML = "*"
+sqlalchemy = ">=1.4.2"
+tqdm = "*"
+
+[package.extras]
+benchmark = ["asv (>=0.5.0)", "cma", "virtualenv"]
+checking = ["black", "blackdoc", "flake8", "isort", "mypy", "mypy_boto3_s3", "types-PyYAML", "types-redis", "types-setuptools", "types-tqdm", "typing_extensions (>=3.10.0.0)"]
+document = ["ase", "cmaes (>=0.10.0)", "fvcore", "kaleido (<0.4)", "lightgbm", "matplotlib (!=3.6.0)", "pandas", "pillow", "plotly (>=4.9.0)", "scikit-learn", "sphinx", "sphinx-copybutton", "sphinx-gallery", "sphinx-notfound-page", "sphinx_rtd_theme (>=1.2.0)", "torch", "torchvision"]
+optional = ["boto3", "cmaes (>=0.10.0)", "google-cloud-storage", "grpcio", "matplotlib (!=3.6.0)", "pandas", "plotly (>=4.9.0)", "protobuf (>=5.28.1)", "redis", "scikit-learn (>=0.24.2)", "scipy", "torch ; python_version <= \"3.12\""]
+test = ["coverage", "fakeredis[lua]", "grpcio", "kaleido (<0.4)", "moto", "protobuf (>=5.28.1)", "pytest", "scipy (>=1.9.2)", "torch ; python_version <= \"3.12\""]
+
[[package]]
name = "packaging"
-version = "24.2"
+version = "25.0"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
+ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
]
[[package]]
name = "pandas"
-version = "2.2.3"
+version = "2.3.1"
description = "Powerful data structures for data analysis, time series, and statistics"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
- {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
- {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
- {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
- {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
- {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
- {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
- {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
+ {file = "pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9"},
+ {file = "pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1"},
+ {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0"},
+ {file = "pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191"},
+ {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1"},
+ {file = "pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97"},
+ {file = "pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83"},
+ {file = "pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b"},
+ {file = "pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f"},
+ {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85"},
+ {file = "pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d"},
+ {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678"},
+ {file = "pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299"},
+ {file = "pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab"},
+ {file = "pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3"},
+ {file = "pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232"},
+ {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e"},
+ {file = "pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4"},
+ {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8"},
+ {file = "pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679"},
+ {file = "pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8"},
+ {file = "pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22"},
+ {file = "pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a"},
+ {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928"},
+ {file = "pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9"},
+ {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12"},
+ {file = "pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb"},
+ {file = "pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956"},
+ {file = "pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a"},
+ {file = "pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9"},
+ {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275"},
+ {file = "pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab"},
+ {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96"},
+ {file = "pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444"},
+ {file = "pandas-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8"},
+ {file = "pandas-2.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3"},
+ {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da"},
+ {file = "pandas-2.3.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e"},
+ {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7"},
+ {file = "pandas-2.3.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88"},
+ {file = "pandas-2.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d"},
+ {file = "pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2"},
]
[package.dependencies]
@@ -3462,7 +3437,7 @@ version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
-groups = ["main", "dev"]
+groups = ["dev"]
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
@@ -3470,14 +3445,14 @@ files = [
[[package]]
name = "peft"
-version = "0.15.1"
+version = "0.17.0"
description = "Parameter-Efficient Fine-Tuning (PEFT)"
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
- {file = "peft-0.15.1-py3-none-any.whl", hash = "sha256:5fb3960beb518f00668f2cdc53424a5cc495c78281697821ce24609c90ca0a10"},
- {file = "peft-0.15.1.tar.gz", hash = "sha256:e4c65af70683a9ef3baf1ab450710f1eb7181f369ef6172ca8bf15bf4ae6ff71"},
+ {file = "peft-0.17.0-py3-none-any.whl", hash = "sha256:0190c28bdbdc24c3de549f2b42cd182cbb89d3e82aa3069c6db690c4ef6fccbb"},
+ {file = "peft-0.17.0.tar.gz", hash = "sha256:cb647a931c8da434446d6a196c402b1c2d087b12e050e098215f906f12771f1e"},
]
[package.dependencies]
@@ -3500,171 +3475,192 @@ test = ["black", "black", "datasets", "diffusers", "hf-doc-builder", "hf-doc-bui
[[package]]
name = "pillow"
-version = "11.1.0"
+version = "11.3.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"},
- {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"},
- {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"},
- {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"},
- {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"},
- {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"},
- {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"},
- {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"},
- {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"},
- {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"},
- {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"},
- {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"},
- {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"},
- {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"},
- {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"},
- {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"},
- {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"},
- {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"},
- {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"},
- {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"},
- {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"},
- {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"},
- {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"},
- {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"},
- {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"},
- {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"},
- {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"},
- {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"},
- {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"},
- {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"},
- {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"},
- {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"},
- {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"},
- {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"},
- {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"},
- {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"},
- {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"},
- {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"},
- {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"},
- {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"},
- {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"},
- {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"},
- {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"},
- {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"},
- {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"},
- {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"},
- {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"},
- {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"},
- {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"},
- {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"},
- {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"},
- {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"},
- {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"},
- {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"},
- {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"},
- {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"},
- {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"},
- {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"},
- {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"},
- {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"},
- {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"},
- {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"},
- {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"},
- {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"},
- {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"},
+ {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"},
+ {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"},
+ {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"},
+ {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"},
+ {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"},
+ {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"},
+ {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"},
+ {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"},
+ {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"},
+ {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"},
+ {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"},
+ {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"},
+ {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"},
+ {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"},
+ {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"},
+ {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"},
+ {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"},
+ {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"},
+ {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"},
+ {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"},
+ {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"},
+ {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"},
+ {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"},
+ {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"},
+ {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"},
+ {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"},
+ {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"},
+ {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"},
+ {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"},
+ {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"},
+ {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"},
+ {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"},
+ {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"},
+ {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"},
+ {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"},
+ {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"},
+ {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"},
+ {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"},
+ {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"},
+ {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"},
+ {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"},
+ {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"},
+ {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"},
+ {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"},
+ {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"},
+ {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"},
+ {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"},
+ {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"},
+ {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"},
+ {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"},
+ {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"},
+ {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"},
+ {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"},
+ {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"},
+ {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"},
+ {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"},
+ {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"},
+ {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"},
+ {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"},
+ {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"},
+ {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"},
+ {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"},
+ {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"},
+ {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"},
+ {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"},
+ {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"},
+ {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"},
+ {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"},
+ {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"},
+ {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"},
+ {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"},
+ {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"},
+ {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"},
+ {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"},
+ {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"},
+ {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"},
+ {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"},
+ {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"},
+ {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"},
+ {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"},
+ {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"},
+ {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"},
+ {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"},
+ {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"},
+ {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"},
+ {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"},
+ {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"},
+ {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"},
+ {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"},
+ {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"},
+ {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"},
+ {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"},
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"},
+ {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"},
]
[package.extras]
-docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
+docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
fpx = ["olefile"]
mic = ["olefile"]
-tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"]
+test-arrow = ["pyarrow"]
+tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"]
typing = ["typing-extensions ; python_version < \"3.10\""]
xmp = ["defusedxml"]
-[[package]]
-name = "pkginfo"
-version = "1.10.0"
-description = "Query metadata from sdists / bdists / installed packages."
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-files = [
- {file = "pkginfo-1.10.0-py3-none-any.whl", hash = "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097"},
- {file = "pkginfo-1.10.0.tar.gz", hash = "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297"},
-]
-
-[package.extras]
-testing = ["pytest", "pytest-cov", "wheel"]
-
[[package]]
name = "platformdirs"
-version = "4.3.6"
+version = "4.3.8"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
- {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
- {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
+ {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"},
+ {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"},
]
[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.11.2)"]
+docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"]
+type = ["mypy (>=1.14.1)"]
[[package]]
name = "pluggy"
-version = "1.5.0"
+version = "1.6.0"
description = "plugin and hook calling mechanisms for python"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
+ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"},
+ {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"},
]
[package.extras]
dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
+testing = ["coverage", "pytest", "pytest-benchmark"]
[[package]]
name = "portalocker"
-version = "3.1.1"
+version = "3.2.0"
description = "Wraps the portalocker recipe for easy usage"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "portalocker-3.1.1-py3-none-any.whl", hash = "sha256:80e984e24de292ff258a5bea0e4f3f778fff84c0ae1275dbaebc4658de4aacb3"},
- {file = "portalocker-3.1.1.tar.gz", hash = "sha256:ec20f6dda2ad9ce89fa399a5f31f4f1495f515958f0cb7ca6543cef7bb5a749e"},
+ {file = "portalocker-3.2.0-py3-none-any.whl", hash = "sha256:3cdc5f565312224bc570c49337bd21428bba0ef363bbcf58b9ef4a9f11779968"},
+ {file = "portalocker-3.2.0.tar.gz", hash = "sha256:1f3002956a54a8c3730586c5c77bf18fae4149e07eaf1c29fc3faf4d5a3f89ac"},
]
[package.dependencies]
pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""}
[package.extras]
-docs = ["sphinx (>=1.7.1)"]
+docs = ["portalocker[tests]"]
redis = ["redis"]
-tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-rerunfailures (>=15.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"]
+tests = ["coverage-conditional-plugin (>=0.9.0)", "portalocker[redis]", "pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-rerunfailures (>=15.0)", "pytest-timeout (>=2.1.0)", "sphinx (>=6.0.0)", "types-pywin32 (>=310.0.0.20250429)", "types-redis"]
[[package]]
name = "posthog"
-version = "3.24.0"
+version = "3.25.0"
description = "Integrate PostHog into any python application."
optional = false
python-versions = "*"
groups = ["main"]
files = [
- {file = "posthog-3.24.0-py2.py3-none-any.whl", hash = "sha256:8c4ff4a4e5e72873262f05500845ebcb1d172efa6047fa14d1ad3e19f1357a2f"},
- {file = "posthog-3.24.0.tar.gz", hash = "sha256:572fc786d9dcf02813445aad01f653c75a64ec419a70988b3e255db059125382"},
+ {file = "posthog-3.25.0-py2.py3-none-any.whl", hash = "sha256:85db78c13d1ecb11aed06fad53759c4e8fb3633442c2f3d0336bc0ce8a585d30"},
+ {file = "posthog-3.25.0.tar.gz", hash = "sha256:9168f3e7a0a5571b6b1065c41b3c171fbc68bfe72c3ac0bfd6e3d2fcdb7df2ca"},
]
[package.dependencies]
@@ -3683,14 +3679,14 @@ test = ["anthropic", "coverage", "django", "flake8", "freezegun (==1.5.1)", "lan
[[package]]
name = "pre-commit"
-version = "4.1.0"
+version = "4.2.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"},
- {file = "pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4"},
+ {file = "pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd"},
+ {file = "pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146"},
]
[package.dependencies]
@@ -3702,131 +3698,129 @@ virtualenv = ">=20.10.0"
[[package]]
name = "propcache"
-version = "0.3.0"
+version = "0.3.2"
description = "Accelerated property cache"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d"},
- {file = "propcache-0.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c"},
- {file = "propcache-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc"},
- {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d"},
- {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f"},
- {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf"},
- {file = "propcache-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9"},
- {file = "propcache-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25"},
- {file = "propcache-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f"},
- {file = "propcache-0.3.0-cp310-cp310-win32.whl", hash = "sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c"},
- {file = "propcache-0.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340"},
- {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51"},
- {file = "propcache-0.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e"},
- {file = "propcache-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa"},
- {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf"},
- {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b"},
- {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9"},
- {file = "propcache-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6"},
- {file = "propcache-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7"},
- {file = "propcache-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c"},
- {file = "propcache-0.3.0-cp311-cp311-win32.whl", hash = "sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d"},
- {file = "propcache-0.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32"},
- {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e"},
- {file = "propcache-0.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af"},
- {file = "propcache-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5"},
- {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b"},
- {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667"},
- {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7"},
- {file = "propcache-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7"},
- {file = "propcache-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64"},
- {file = "propcache-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c"},
- {file = "propcache-0.3.0-cp312-cp312-win32.whl", hash = "sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d"},
- {file = "propcache-0.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57"},
- {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568"},
- {file = "propcache-0.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9"},
- {file = "propcache-0.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767"},
- {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8"},
- {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0"},
- {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d"},
- {file = "propcache-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05"},
- {file = "propcache-0.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e"},
- {file = "propcache-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626"},
- {file = "propcache-0.3.0-cp313-cp313-win32.whl", hash = "sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374"},
- {file = "propcache-0.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a"},
- {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf"},
- {file = "propcache-0.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0"},
- {file = "propcache-0.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829"},
- {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa"},
- {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6"},
- {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db"},
- {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54"},
- {file = "propcache-0.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e"},
- {file = "propcache-0.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf"},
- {file = "propcache-0.3.0-cp313-cp313t-win32.whl", hash = "sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863"},
- {file = "propcache-0.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46"},
- {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:03c091bb752349402f23ee43bb2bff6bd80ccab7c9df6b88ad4322258d6960fc"},
- {file = "propcache-0.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:46ed02532cb66612d42ae5c3929b5e98ae330ea0f3900bc66ec5f4862069519b"},
- {file = "propcache-0.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11ae6a8a01b8a4dc79093b5d3ca2c8a4436f5ee251a9840d7790dccbd96cb649"},
- {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df03cd88f95b1b99052b52b1bb92173229d7a674df0ab06d2b25765ee8404bce"},
- {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03acd9ff19021bd0567582ac88f821b66883e158274183b9e5586f678984f8fe"},
- {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd54895e4ae7d32f1e3dd91261df46ee7483a735017dc6f987904f194aa5fd14"},
- {file = "propcache-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a67e5c04e3119594d8cfae517f4b9330c395df07ea65eab16f3d559b7068fe"},
- {file = "propcache-0.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee25f1ac091def37c4b59d192bbe3a206298feeb89132a470325bf76ad122a1e"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58e6d2a5a7cb3e5f166fd58e71e9a4ff504be9dc61b88167e75f835da5764d07"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:be90c94570840939fecedf99fa72839aed70b0ced449b415c85e01ae67422c90"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49ea05212a529c2caffe411e25a59308b07d6e10bf2505d77da72891f9a05641"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:119e244ab40f70a98c91906d4c1f4c5f2e68bd0b14e7ab0a06922038fae8a20f"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:507c5357a8d8b4593b97fb669c50598f4e6cccbbf77e22fa9598aba78292b4d7"},
- {file = "propcache-0.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8526b0941ec5a40220fc4dfde76aed58808e2b309c03e9fa8e2260083ef7157f"},
- {file = "propcache-0.3.0-cp39-cp39-win32.whl", hash = "sha256:7cedd25e5f678f7738da38037435b340694ab34d424938041aa630d8bac42663"},
- {file = "propcache-0.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf4298f366ca7e1ad1d21bbb58300a6985015909964077afd37559084590c929"},
- {file = "propcache-0.3.0-py3-none-any.whl", hash = "sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043"},
- {file = "propcache-0.3.0.tar.gz", hash = "sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5"},
+ {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770"},
+ {file = "propcache-0.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3"},
+ {file = "propcache-0.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3"},
+ {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e"},
+ {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220"},
+ {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb"},
+ {file = "propcache-0.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614"},
+ {file = "propcache-0.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b"},
+ {file = "propcache-0.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c"},
+ {file = "propcache-0.3.2-cp310-cp310-win32.whl", hash = "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70"},
+ {file = "propcache-0.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9"},
+ {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be"},
+ {file = "propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f"},
+ {file = "propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9"},
+ {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf"},
+ {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9"},
+ {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66"},
+ {file = "propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df"},
+ {file = "propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf"},
+ {file = "propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e"},
+ {file = "propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897"},
+ {file = "propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39"},
+ {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10"},
+ {file = "propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154"},
+ {file = "propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615"},
+ {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db"},
+ {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1"},
+ {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c"},
+ {file = "propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67"},
+ {file = "propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06"},
+ {file = "propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1"},
+ {file = "propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1"},
+ {file = "propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c"},
+ {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945"},
+ {file = "propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252"},
+ {file = "propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f"},
+ {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33"},
+ {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e"},
+ {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1"},
+ {file = "propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3"},
+ {file = "propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206"},
+ {file = "propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43"},
+ {file = "propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02"},
+ {file = "propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05"},
+ {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b"},
+ {file = "propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0"},
+ {file = "propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e"},
+ {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28"},
+ {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a"},
+ {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c"},
+ {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725"},
+ {file = "propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770"},
+ {file = "propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330"},
+ {file = "propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394"},
+ {file = "propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198"},
+ {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5"},
+ {file = "propcache-0.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4"},
+ {file = "propcache-0.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2"},
+ {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d"},
+ {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec"},
+ {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701"},
+ {file = "propcache-0.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef"},
+ {file = "propcache-0.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb"},
+ {file = "propcache-0.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe"},
+ {file = "propcache-0.3.2-cp39-cp39-win32.whl", hash = "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1"},
+ {file = "propcache-0.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9"},
+ {file = "propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f"},
+ {file = "propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168"},
]
[[package]]
name = "protobuf"
-version = "5.29.3"
+version = "6.31.1"
description = ""
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"},
- {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"},
- {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"},
- {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"},
- {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"},
- {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"},
- {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"},
- {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"},
- {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"},
- {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"},
- {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"},
+ {file = "protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9"},
+ {file = "protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447"},
+ {file = "protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402"},
+ {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39"},
+ {file = "protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6"},
+ {file = "protobuf-6.31.1-cp39-cp39-win32.whl", hash = "sha256:0414e3aa5a5f3ff423828e1e6a6e907d6c65c1d5b7e6e975793d5590bdeecc16"},
+ {file = "protobuf-6.31.1-cp39-cp39-win_amd64.whl", hash = "sha256:8764cf4587791e7564051b35524b72844f845ad0bb011704c3736cce762d8fe9"},
+ {file = "protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e"},
+ {file = "protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a"},
]
[[package]]
@@ -3855,54 +3849,55 @@ test = ["pytest", "pytest-xdist", "setuptools"]
[[package]]
name = "pyarrow"
-version = "19.0.1"
+version = "21.0.0"
description = "Python library for Apache Arrow"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69"},
- {file = "pyarrow-19.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a"},
- {file = "pyarrow-19.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608"},
- {file = "pyarrow-19.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866"},
- {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90"},
- {file = "pyarrow-19.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3"},
- {file = "pyarrow-19.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6"},
- {file = "pyarrow-19.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466"},
- {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b"},
- {file = "pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6"},
- {file = "pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832"},
- {file = "pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960"},
- {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c"},
- {file = "pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6"},
- {file = "pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136"},
- {file = "pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef"},
- {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0"},
- {file = "pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a"},
- {file = "pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8"},
- {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46"},
- {file = "pyarrow-19.0.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f"},
- {file = "pyarrow-19.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911"},
- {file = "pyarrow-19.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429"},
- {file = "pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e"},
+ {file = "pyarrow-21.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e563271e2c5ff4d4a4cbeb2c83d5cf0d4938b891518e676025f7268c6fe5fe26"},
+ {file = "pyarrow-21.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fee33b0ca46f4c85443d6c450357101e47d53e6c3f008d658c27a2d020d44c79"},
+ {file = "pyarrow-21.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7be45519b830f7c24b21d630a31d48bcebfd5d4d7f9d3bdb49da9cdf6d764edb"},
+ {file = "pyarrow-21.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:26bfd95f6bff443ceae63c65dc7e048670b7e98bc892210acba7e4995d3d4b51"},
+ {file = "pyarrow-21.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd04ec08f7f8bd113c55868bd3fc442a9db67c27af098c5f814a3091e71cc61a"},
+ {file = "pyarrow-21.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9b0b14b49ac10654332a805aedfc0147fb3469cbf8ea951b3d040dab12372594"},
+ {file = "pyarrow-21.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9d9f8bcb4c3be7738add259738abdeddc363de1b80e3310e04067aa1ca596634"},
+ {file = "pyarrow-21.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b"},
+ {file = "pyarrow-21.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10"},
+ {file = "pyarrow-21.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e"},
+ {file = "pyarrow-21.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569"},
+ {file = "pyarrow-21.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e"},
+ {file = "pyarrow-21.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c"},
+ {file = "pyarrow-21.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6"},
+ {file = "pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd"},
+ {file = "pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876"},
+ {file = "pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d"},
+ {file = "pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e"},
+ {file = "pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82"},
+ {file = "pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623"},
+ {file = "pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18"},
+ {file = "pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a"},
+ {file = "pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe"},
+ {file = "pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd"},
+ {file = "pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61"},
+ {file = "pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d"},
+ {file = "pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99"},
+ {file = "pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79"},
+ {file = "pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10"},
+ {file = "pyarrow-21.0.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:a7f6524e3747e35f80744537c78e7302cd41deee8baa668d56d55f77d9c464b3"},
+ {file = "pyarrow-21.0.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:203003786c9fd253ebcafa44b03c06983c9c8d06c3145e37f1b76a1f317aeae1"},
+ {file = "pyarrow-21.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:3b4d97e297741796fead24867a8dabf86c87e4584ccc03167e4a811f50fdf74d"},
+ {file = "pyarrow-21.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:898afce396b80fdda05e3086b4256f8677c671f7b1d27a6976fa011d3fd0a86e"},
+ {file = "pyarrow-21.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:067c66ca29aaedae08218569a114e413b26e742171f526e828e1064fcdec13f4"},
+ {file = "pyarrow-21.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0c4e75d13eb76295a49e0ea056eb18dbd87d81450bfeb8afa19a7e5a75ae2ad7"},
+ {file = "pyarrow-21.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdc4c17afda4dab2a9c0b79148a43a7f4e1094916b3e18d8975bfd6d6d52241f"},
+ {file = "pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc"},
]
[package.extras]
@@ -3942,7 +3937,7 @@ description = "C parser in Python"
optional = false
python-versions = ">=3.8"
groups = ["main"]
-markers = "sys_platform == \"linux\" or platform_python_implementation == \"PyPy\""
+markers = "platform_python_implementation != \"PyPy\""
files = [
{file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
{file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
@@ -3950,20 +3945,21 @@ files = [
[[package]]
name = "pydantic"
-version = "2.10.6"
+version = "2.11.7"
description = "Data validation using Python type hints"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"},
- {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"},
+ {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"},
+ {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"},
]
[package.dependencies]
annotated-types = ">=0.6.0"
-pydantic-core = "2.27.2"
+pydantic-core = "2.33.2"
typing-extensions = ">=4.12.2"
+typing-inspection = ">=0.4.0"
[package.extras]
email = ["email-validator (>=2.0.0)"]
@@ -3971,223 +3967,209 @@ timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows
[[package]]
name = "pydantic-core"
-version = "2.27.2"
+version = "2.33.2"
description = "Core functionality for Pydantic validation and serialization"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"},
- {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"},
- {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"},
- {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"},
- {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"},
- {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"},
- {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"},
- {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"},
- {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"},
- {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"},
- {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"},
- {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"},
- {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"},
- {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"},
- {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"},
- {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"},
- {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"},
- {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"},
- {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"},
- {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"},
- {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"},
- {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"},
- {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"},
- {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"},
- {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"},
- {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"},
+ {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"},
+ {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"},
+ {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"},
+ {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"},
+ {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"},
+ {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"},
+ {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"},
+ {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"},
+ {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"},
+ {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"},
]
[package.dependencies]
typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
[[package]]
-name = "pydantic-settings"
-version = "2.8.1"
-description = "Settings management using Pydantic"
+name = "pyfiglet"
+version = "1.0.3"
+description = "Pure-python FIGlet implementation"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"},
- {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"},
+ {file = "pyfiglet-1.0.3-py3-none-any.whl", hash = "sha256:671bd101ca6a08dc2d94c6a2cda75a862c5e162b980af47d0ba4023837e36489"},
+ {file = "pyfiglet-1.0.3.tar.gz", hash = "sha256:bad3b55d2eccb30d4693ccfd94573c2a3477dd75f86a0e5465cea51bdbfe2875"},
]
-[package.dependencies]
-pydantic = ">=2.7.0"
-python-dotenv = ">=0.21.0"
-
-[package.extras]
-azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"]
-toml = ["tomli (>=2.0.1)"]
-yaml = ["pyyaml (>=6.0.1)"]
-
[[package]]
name = "pygments"
-version = "2.19.1"
+version = "2.19.2"
description = "Pygments is a syntax highlighting package written in Python."
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"},
- {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"},
+ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"},
+ {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"},
]
[package.extras]
windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
-name = "pypdf"
-version = "5.3.1"
-description = "A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files"
+name = "pyparsing"
+version = "3.2.3"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pypdf-5.3.1-py3-none-any.whl", hash = "sha256:20ea5b8686faad1b695fda054462b667d5e5f51e25fbbc092f12c5e0bb20d738"},
- {file = "pypdf-5.3.1.tar.gz", hash = "sha256:0b9b715252b3c60bacc052e6a780e8b742cee9b9a2135f6007bb018e22a5adad"},
+ {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"},
+ {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"},
]
[package.extras]
-crypto = ["cryptography"]
-cryptodome = ["PyCryptodome"]
-dev = ["black", "flit", "pip-tools", "pre-commit (<2.18.0)", "pytest-cov", "pytest-socket", "pytest-timeout", "pytest-xdist", "wheel"]
-docs = ["myst_parser", "sphinx", "sphinx_rtd_theme"]
-full = ["Pillow (>=8.0.0)", "cryptography"]
-image = ["Pillow (>=8.0.0)"]
+diagrams = ["jinja2", "railroad-diagrams"]
[[package]]
name = "pytest"
-version = "7.4.4"
+version = "8.4.1"
description = "pytest: simple powerful testing with Python"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
- {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+ {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"},
+ {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"},
]
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=0.12,<2.0"
+[package.dependencies]
+colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""}
+iniconfig = ">=1"
+packaging = ">=20"
+pluggy = ">=1.5,<2"
+pygments = ">=2.7.2"
[package.extras]
-testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
+dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-asyncio"
-version = "0.21.2"
+version = "1.1.0"
description = "Pytest support for asyncio"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pytest_asyncio-0.21.2-py3-none-any.whl", hash = "sha256:ab664c88bb7998f711d8039cacd4884da6430886ae8bbd4eded552ed2004f16b"},
- {file = "pytest_asyncio-0.21.2.tar.gz", hash = "sha256:d67738fc232b94b326b9d060750beb16e0074210b98dd8b58a5239fa2a154f45"},
+ {file = "pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf"},
+ {file = "pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea"},
]
[package.dependencies]
-pytest = ">=7.0.0"
+pytest = ">=8.2,<9"
[package.extras]
-docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
-testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"]
+docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1)"]
+testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
[[package]]
name = "pytest-repeat"
-version = "0.9.3"
+version = "0.9.4"
description = "pytest plugin for repeating tests"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pytest_repeat-0.9.3-py3-none-any.whl", hash = "sha256:26ab2df18226af9d5ce441c858f273121e92ff55f5bb311d25755b8d7abdd8ed"},
- {file = "pytest_repeat-0.9.3.tar.gz", hash = "sha256:ffd3836dfcd67bb270bec648b330e20be37d2966448c4148c4092d1e8aba8185"},
+ {file = "pytest_repeat-0.9.4-py3-none-any.whl", hash = "sha256:c1738b4e412a6f3b3b9e0b8b29fcd7a423e50f87381ad9307ef6f5a8601139f3"},
+ {file = "pytest_repeat-0.9.4.tar.gz", hash = "sha256:d92ac14dfaa6ffcfe6917e5d16f0c9bc82380c135b03c2a5f412d2637f224485"},
]
[package.dependencies]
@@ -4211,14 +4193,14 @@ pytest = ">=6.2"
[[package]]
name = "pytest-xdist"
-version = "3.6.1"
+version = "3.8.0"
description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"},
- {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"},
+ {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"},
+ {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"},
]
[package.dependencies]
@@ -4247,14 +4229,14 @@ six = ">=1.5"
[[package]]
name = "python-dotenv"
-version = "1.0.1"
+version = "1.1.1"
description = "Read key-value pairs from a .env file and set them as environment variables"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
- {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
+ {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"},
+ {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"},
]
[package.extras]
@@ -4262,56 +4244,45 @@ cli = ["click (>=5.0)"]
[[package]]
name = "pytz"
-version = "2025.1"
+version = "2025.2"
description = "World timezone definitions, modern and historical"
optional = false
python-versions = "*"
groups = ["main"]
files = [
- {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"},
- {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"},
+ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
+ {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
]
[[package]]
name = "pywin32"
-version = "308"
+version = "311"
description = "Python for Window Extensions"
optional = false
python-versions = "*"
groups = ["main"]
-markers = "platform_system == \"Windows\""
-files = [
- {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"},
- {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"},
- {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"},
- {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"},
- {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"},
- {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"},
- {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"},
- {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"},
- {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"},
- {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"},
- {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"},
- {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"},
- {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"},
- {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"},
- {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"},
- {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"},
- {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"},
- {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"},
-]
-
-[[package]]
-name = "pywin32-ctypes"
-version = "0.2.3"
-description = "A (partial) reimplementation of pywin32 using ctypes/cffi"
-optional = false
-python-versions = ">=3.6"
-groups = ["main"]
-markers = "sys_platform == \"win32\""
+markers = "platform_system == \"Windows\" or sys_platform == \"win32\""
files = [
- {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"},
- {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"},
+ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"},
+ {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"},
+ {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"},
+ {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"},
+ {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"},
+ {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"},
+ {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"},
+ {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"},
+ {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"},
+ {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"},
+ {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"},
+ {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"},
+ {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"},
+ {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"},
+ {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"},
+ {file = "pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c"},
+ {file = "pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd"},
+ {file = "pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b"},
+ {file = "pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91"},
+ {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"},
]
[[package]]
@@ -4377,145 +4348,118 @@ files = [
{file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
]
-[[package]]
-name = "readme-renderer"
-version = "44.0"
-description = "readme_renderer is a library for rendering readme descriptions for Warehouse"
-optional = false
-python-versions = ">=3.9"
-groups = ["main"]
-files = [
- {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"},
- {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"},
-]
-
-[package.dependencies]
-docutils = ">=0.21.2"
-nh3 = ">=0.2.14"
-Pygments = ">=2.5.1"
-
-[package.extras]
-md = ["cmarkgfm (>=0.8.0)"]
-
[[package]]
name = "regex"
-version = "2024.11.6"
+version = "2025.7.34"
description = "Alternative regular expression module, to replace re."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
- {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
- {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
- {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
- {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
- {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
- {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
- {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
- {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
- {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
- {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
- {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
- {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
- {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
+ {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d856164d25e2b3b07b779bfed813eb4b6b6ce73c2fd818d46f47c1eb5cd79bd6"},
+ {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d15a9da5fad793e35fb7be74eec450d968e05d2e294f3e0e77ab03fa7234a83"},
+ {file = "regex-2025.7.34-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:95b4639c77d414efa93c8de14ce3f7965a94d007e068a94f9d4997bb9bd9c81f"},
+ {file = "regex-2025.7.34-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7de1ceed5a5f84f342ba4a9f4ae589524adf9744b2ee61b5da884b5b659834"},
+ {file = "regex-2025.7.34-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02e5860a250cd350c4933cf376c3bc9cb28948e2c96a8bc042aee7b985cfa26f"},
+ {file = "regex-2025.7.34-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a5966220b9a1a88691282b7e4350e9599cf65780ca60d914a798cb791aa1177"},
+ {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48fb045bbd4aab2418dc1ba2088a5e32de4bfe64e1457b948bb328a8dc2f1c2e"},
+ {file = "regex-2025.7.34-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20ff8433fa45e131f7316594efe24d4679c5449c0ca69d91c2f9d21846fdf064"},
+ {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c436fd1e95c04c19039668cfb548450a37c13f051e8659f40aed426e36b3765f"},
+ {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0b85241d3cfb9f8a13cefdfbd58a2843f208f2ed2c88181bf84e22e0c7fc066d"},
+ {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:075641c94126b064c65ab86e7e71fc3d63e7ff1bea1fb794f0773c97cdad3a03"},
+ {file = "regex-2025.7.34-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:70645cad3407d103d1dbcb4841839d2946f7d36cf38acbd40120fee1682151e5"},
+ {file = "regex-2025.7.34-cp310-cp310-win32.whl", hash = "sha256:3b836eb4a95526b263c2a3359308600bd95ce7848ebd3c29af0c37c4f9627cd3"},
+ {file = "regex-2025.7.34-cp310-cp310-win_amd64.whl", hash = "sha256:cbfaa401d77334613cf434f723c7e8ba585df162be76474bccc53ae4e5520b3a"},
+ {file = "regex-2025.7.34-cp310-cp310-win_arm64.whl", hash = "sha256:bca11d3c38a47c621769433c47f364b44e8043e0de8e482c5968b20ab90a3986"},
+ {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da304313761b8500b8e175eb2040c4394a875837d5635f6256d6fa0377ad32c8"},
+ {file = "regex-2025.7.34-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:35e43ebf5b18cd751ea81455b19acfdec402e82fe0dc6143edfae4c5c4b3909a"},
+ {file = "regex-2025.7.34-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96bbae4c616726f4661fe7bcad5952e10d25d3c51ddc388189d8864fbc1b3c68"},
+ {file = "regex-2025.7.34-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9feab78a1ffa4f2b1e27b1bcdaad36f48c2fed4870264ce32f52a393db093c78"},
+ {file = "regex-2025.7.34-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f14b36e6d4d07f1a5060f28ef3b3561c5d95eb0651741474ce4c0a4c56ba8719"},
+ {file = "regex-2025.7.34-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85c3a958ef8b3d5079c763477e1f09e89d13ad22198a37e9d7b26b4b17438b33"},
+ {file = "regex-2025.7.34-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37555e4ae0b93358fa7c2d240a4291d4a4227cc7c607d8f85596cdb08ec0a083"},
+ {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ee38926f31f1aa61b0232a3a11b83461f7807661c062df9eb88769d86e6195c3"},
+ {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a664291c31cae9c4a30589bd8bc2ebb56ef880c9c6264cb7643633831e606a4d"},
+ {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f3e5c1e0925e77ec46ddc736b756a6da50d4df4ee3f69536ffb2373460e2dafd"},
+ {file = "regex-2025.7.34-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d428fc7731dcbb4e2ffe43aeb8f90775ad155e7db4347a639768bc6cd2df881a"},
+ {file = "regex-2025.7.34-cp311-cp311-win32.whl", hash = "sha256:e154a7ee7fa18333ad90b20e16ef84daaeac61877c8ef942ec8dfa50dc38b7a1"},
+ {file = "regex-2025.7.34-cp311-cp311-win_amd64.whl", hash = "sha256:24257953d5c1d6d3c129ab03414c07fc1a47833c9165d49b954190b2b7f21a1a"},
+ {file = "regex-2025.7.34-cp311-cp311-win_arm64.whl", hash = "sha256:3157aa512b9e606586900888cd469a444f9b898ecb7f8931996cb715f77477f0"},
+ {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7f7211a746aced993bef487de69307a38c5ddd79257d7be83f7b202cb59ddb50"},
+ {file = "regex-2025.7.34-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fb31080f2bd0681484b275461b202b5ad182f52c9ec606052020fe13eb13a72f"},
+ {file = "regex-2025.7.34-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0200a5150c4cf61e407038f4b4d5cdad13e86345dac29ff9dab3d75d905cf130"},
+ {file = "regex-2025.7.34-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:739a74970e736df0773788377969c9fea3876c2fc13d0563f98e5503e5185f46"},
+ {file = "regex-2025.7.34-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4fef81b2f7ea6a2029161ed6dea9ae13834c28eb5a95b8771828194a026621e4"},
+ {file = "regex-2025.7.34-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea74cf81fe61a7e9d77989050d0089a927ab758c29dac4e8e1b6c06fccf3ebf0"},
+ {file = "regex-2025.7.34-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4636a7f3b65a5f340ed9ddf53585c42e3ff37101d383ed321bfe5660481744b"},
+ {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cef962d7834437fe8d3da6f9bfc6f93f20f218266dcefec0560ed7765f5fe01"},
+ {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cbe1698e5b80298dbce8df4d8d1182279fbdaf1044e864cbc9d53c20e4a2be77"},
+ {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:32b9f9bcf0f605eb094b08e8da72e44badabb63dde6b83bd530580b488d1c6da"},
+ {file = "regex-2025.7.34-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:524c868ba527eab4e8744a9287809579f54ae8c62fbf07d62aacd89f6026b282"},
+ {file = "regex-2025.7.34-cp312-cp312-win32.whl", hash = "sha256:d600e58ee6d036081c89696d2bdd55d507498a7180df2e19945c6642fac59588"},
+ {file = "regex-2025.7.34-cp312-cp312-win_amd64.whl", hash = "sha256:9a9ab52a466a9b4b91564437b36417b76033e8778e5af8f36be835d8cb370d62"},
+ {file = "regex-2025.7.34-cp312-cp312-win_arm64.whl", hash = "sha256:c83aec91af9c6fbf7c743274fd952272403ad9a9db05fe9bfc9df8d12b45f176"},
+ {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3c9740a77aeef3f5e3aaab92403946a8d34437db930a0280e7e81ddcada61f5"},
+ {file = "regex-2025.7.34-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:69ed3bc611540f2ea70a4080f853741ec698be556b1df404599f8724690edbcd"},
+ {file = "regex-2025.7.34-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d03c6f9dcd562c56527c42b8530aad93193e0b3254a588be1f2ed378cdfdea1b"},
+ {file = "regex-2025.7.34-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6164b1d99dee1dfad33f301f174d8139d4368a9fb50bf0a3603b2eaf579963ad"},
+ {file = "regex-2025.7.34-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1e4f4f62599b8142362f164ce776f19d79bdd21273e86920a7b604a4275b4f59"},
+ {file = "regex-2025.7.34-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:72a26dcc6a59c057b292f39d41465d8233a10fd69121fa24f8f43ec6294e5415"},
+ {file = "regex-2025.7.34-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5273fddf7a3e602695c92716c420c377599ed3c853ea669c1fe26218867002f"},
+ {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c1844be23cd40135b3a5a4dd298e1e0c0cb36757364dd6cdc6025770363e06c1"},
+ {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dde35e2afbbe2272f8abee3b9fe6772d9b5a07d82607b5788e8508974059925c"},
+ {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f6e8e7af516a7549412ce57613e859c3be27d55341a894aacaa11703a4c31a"},
+ {file = "regex-2025.7.34-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:469142fb94a869beb25b5f18ea87646d21def10fbacb0bcb749224f3509476f0"},
+ {file = "regex-2025.7.34-cp313-cp313-win32.whl", hash = "sha256:da7507d083ee33ccea1310447410c27ca11fb9ef18c95899ca57ff60a7e4d8f1"},
+ {file = "regex-2025.7.34-cp313-cp313-win_amd64.whl", hash = "sha256:9d644de5520441e5f7e2db63aec2748948cc39ed4d7a87fd5db578ea4043d997"},
+ {file = "regex-2025.7.34-cp313-cp313-win_arm64.whl", hash = "sha256:7bf1c5503a9f2cbd2f52d7e260acb3131b07b6273c470abb78568174fe6bde3f"},
+ {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:8283afe7042d8270cecf27cca558873168e771183d4d593e3c5fe5f12402212a"},
+ {file = "regex-2025.7.34-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6c053f9647e3421dd2f5dff8172eb7b4eec129df9d1d2f7133a4386319b47435"},
+ {file = "regex-2025.7.34-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a16dd56bbcb7d10e62861c3cd000290ddff28ea142ffb5eb3470f183628011ac"},
+ {file = "regex-2025.7.34-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69c593ff5a24c0d5c1112b0df9b09eae42b33c014bdca7022d6523b210b69f72"},
+ {file = "regex-2025.7.34-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98d0ce170fcde1a03b5df19c5650db22ab58af375aaa6ff07978a85c9f250f0e"},
+ {file = "regex-2025.7.34-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d72765a4bff8c43711d5b0f5b452991a9947853dfa471972169b3cc0ba1d0751"},
+ {file = "regex-2025.7.34-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4494f8fd95a77eb434039ad8460e64d57baa0434f1395b7da44015bef650d0e4"},
+ {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4f42b522259c66e918a0121a12429b2abcf696c6f967fa37bdc7b72e61469f98"},
+ {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:aaef1f056d96a0a5d53ad47d019d5b4c66fe4be2da87016e0d43b7242599ffc7"},
+ {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:656433e5b7dccc9bc0da6312da8eb897b81f5e560321ec413500e5367fcd5d47"},
+ {file = "regex-2025.7.34-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e91eb2c62c39705e17b4d42d4b86c4e86c884c0d15d9c5a47d0835f8387add8e"},
+ {file = "regex-2025.7.34-cp314-cp314-win32.whl", hash = "sha256:f978ddfb6216028c8f1d6b0f7ef779949498b64117fc35a939022f67f810bdcb"},
+ {file = "regex-2025.7.34-cp314-cp314-win_amd64.whl", hash = "sha256:4b7dc33b9b48fb37ead12ffc7bdb846ac72f99a80373c4da48f64b373a7abeae"},
+ {file = "regex-2025.7.34-cp314-cp314-win_arm64.whl", hash = "sha256:4b8c4d39f451e64809912c82392933d80fe2e4a87eeef8859fcc5380d0173c64"},
+ {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fd5edc3f453de727af267c7909d083e19f6426fc9dd149e332b6034f2a5611e6"},
+ {file = "regex-2025.7.34-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa1cdfb8db96ef20137de5587954c812821966c3e8b48ffc871e22d7ec0a4938"},
+ {file = "regex-2025.7.34-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:89c9504fc96268e8e74b0283e548f53a80c421182a2007e3365805b74ceef936"},
+ {file = "regex-2025.7.34-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33be70d75fa05a904ee0dc43b650844e067d14c849df7e82ad673541cd465b5f"},
+ {file = "regex-2025.7.34-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57d25b6732ea93eeb1d090e8399b6235ca84a651b52d52d272ed37d3d2efa0f1"},
+ {file = "regex-2025.7.34-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:baf2fe122a3db1c0b9f161aa44463d8f7e33eeeda47bb0309923deb743a18276"},
+ {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a764a83128af9c1a54be81485b34dca488cbcacefe1e1d543ef11fbace191e1"},
+ {file = "regex-2025.7.34-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7f663ccc4093877f55b51477522abd7299a14c5bb7626c5238599db6a0cb95d"},
+ {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4913f52fbc7a744aaebf53acd8d3dc1b519e46ba481d4d7596de3c862e011ada"},
+ {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:efac4db9e044d47fd3b6b0d40b6708f4dfa2d8131a5ac1d604064147c0f552fd"},
+ {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7373afae7cfb716e3b8e15d0184510d518f9d21471f2d62918dbece85f2c588f"},
+ {file = "regex-2025.7.34-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9960d162f3fecf6af252534a1ae337e9c2e20d74469fed782903b24e2cc9d3d7"},
+ {file = "regex-2025.7.34-cp39-cp39-win32.whl", hash = "sha256:95d538b10eb4621350a54bf14600cc80b514211d91a019dc74b8e23d2159ace5"},
+ {file = "regex-2025.7.34-cp39-cp39-win_amd64.whl", hash = "sha256:f7f3071b5faa605b0ea51ec4bb3ea7257277446b053f4fd3ad02b1dcb4e64353"},
+ {file = "regex-2025.7.34-cp39-cp39-win_arm64.whl", hash = "sha256:716a47515ba1d03f8e8a61c5013041c8c90f2e21f055203498105d7571b44531"},
+ {file = "regex-2025.7.34.tar.gz", hash = "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a"},
]
[[package]]
name = "requests"
-version = "2.32.3"
+version = "2.32.4"
description = "Python HTTP for Humans."
optional = false
python-versions = ">=3.8"
groups = ["main", "dev"]
files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
+ {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"},
+ {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"},
]
[package.dependencies]
certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
+charset_normalizer = ">=2,<4"
idna = ">=2.5,<4"
urllib3 = ">=1.21.1,<3"
@@ -4523,46 +4467,16 @@ urllib3 = ">=1.21.1,<3"
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-[[package]]
-name = "requests-toolbelt"
-version = "1.0.0"
-description = "A utility belt for advanced users of python-requests"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-groups = ["main"]
-files = [
- {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"},
- {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"},
-]
-
-[package.dependencies]
-requests = ">=2.0.1,<3.0.0"
-
-[[package]]
-name = "rfc3986"
-version = "2.0.0"
-description = "Validating URI References per RFC 3986"
-optional = false
-python-versions = ">=3.7"
-groups = ["main"]
-files = [
- {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"},
- {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"},
-]
-
-[package.extras]
-idna2008 = ["idna"]
-
[[package]]
name = "rich"
-version = "13.9.4"
+version = "14.1.0"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
python-versions = ">=3.8.0"
-groups = ["main"]
+groups = ["main", "dev"]
files = [
- {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
- {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
+ {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"},
+ {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"},
]
[package.dependencies]
@@ -4578,7 +4492,7 @@ version = "3.1.0"
description = "Manipulate well-formed Roman numerals"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c"},
{file = "roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d"},
@@ -4590,42 +4504,70 @@ test = ["pytest (>=8)"]
[[package]]
name = "rsa"
-version = "4.9"
+version = "4.9.1"
description = "Pure-Python RSA implementation"
optional = false
-python-versions = ">=3.6,<4"
+python-versions = "<4,>=3.6"
groups = ["main"]
files = [
- {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"},
- {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"},
+ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"},
+ {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"},
]
[package.dependencies]
pyasn1 = ">=0.1.3"
+[[package]]
+name = "ruff"
+version = "0.8.6"
+description = "An extremely fast Python linter and code formatter, written in Rust."
+optional = false
+python-versions = ">=3.7"
+groups = ["dev"]
+files = [
+ {file = "ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3"},
+ {file = "ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1"},
+ {file = "ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf"},
+ {file = "ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a"},
+ {file = "ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76"},
+ {file = "ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764"},
+ {file = "ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905"},
+ {file = "ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162"},
+ {file = "ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5"},
+]
+
[[package]]
name = "safetensors"
-version = "0.5.3"
+version = "0.6.2"
description = ""
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "safetensors-0.5.3-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bd20eb133db8ed15b40110b7c00c6df51655a2998132193de2f75f72d99c7073"},
- {file = "safetensors-0.5.3-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:21d01c14ff6c415c485616b8b0bf961c46b3b343ca59110d38d744e577f9cce7"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11bce6164887cd491ca75c2326a113ba934be596e22b28b1742ce27b1d076467"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4a243be3590bc3301c821da7a18d87224ef35cbd3e5f5727e4e0728b8172411e"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8bd84b12b1670a6f8e50f01e28156422a2bc07fb16fc4e98bded13039d688a0d"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:391ac8cab7c829452175f871fcaf414aa1e292b5448bd02620f675a7f3e7abb9"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cead1fa41fc54b1e61089fa57452e8834f798cb1dc7a09ba3524f1eb08e0317a"},
- {file = "safetensors-0.5.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1077f3e94182d72618357b04b5ced540ceb71c8a813d3319f1aba448e68a770d"},
- {file = "safetensors-0.5.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:799021e78287bac619c7b3f3606730a22da4cda27759ddf55d37c8db7511c74b"},
- {file = "safetensors-0.5.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df26da01aaac504334644e1b7642fa000bfec820e7cef83aeac4e355e03195ff"},
- {file = "safetensors-0.5.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:32c3ef2d7af8b9f52ff685ed0bc43913cdcde135089ae322ee576de93eae5135"},
- {file = "safetensors-0.5.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:37f1521be045e56fc2b54c606d4455573e717b2d887c579ee1dbba5f868ece04"},
- {file = "safetensors-0.5.3-cp38-abi3-win32.whl", hash = "sha256:cfc0ec0846dcf6763b0ed3d1846ff36008c6e7290683b61616c4b040f6a54ace"},
- {file = "safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11"},
- {file = "safetensors-0.5.3.tar.gz", hash = "sha256:b6b0d6ecacec39a4fdd99cc19f4576f5219ce858e6fd8dbe7609df0b8dc56965"},
+ {file = "safetensors-0.6.2-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9c85ede8ec58f120bad982ec47746981e210492a6db876882aa021446af8ffba"},
+ {file = "safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d6675cf4b39c98dbd7d940598028f3742e0375a6b4d4277e76beb0c35f4b843b"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d2d2b3ce1e2509c68932ca03ab8f20570920cd9754b05063d4368ee52833ecd"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:93de35a18f46b0f5a6a1f9e26d91b442094f2df02e9fd7acf224cfec4238821a"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89a89b505f335640f9120fac65ddeb83e40f1fd081cb8ed88b505bdccec8d0a1"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4d0d0b937e04bdf2ae6f70cd3ad51328635fe0e6214aa1fc811f3b576b3bda"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8045db2c872db8f4cbe3faa0495932d89c38c899c603f21e9b6486951a5ecb8f"},
+ {file = "safetensors-0.6.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:81e67e8bab9878bb568cffbc5f5e655adb38d2418351dc0859ccac158f753e19"},
+ {file = "safetensors-0.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0e4d029ab0a0e0e4fdf142b194514695b1d7d3735503ba700cf36d0fc7136ce"},
+ {file = "safetensors-0.6.2-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fa48268185c52bfe8771e46325a1e21d317207bcabcb72e65c6e28e9ffeb29c7"},
+ {file = "safetensors-0.6.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:d83c20c12c2d2f465997c51b7ecb00e407e5f94d7dec3ea0cc11d86f60d3fde5"},
+ {file = "safetensors-0.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d944cea65fad0ead848b6ec2c37cc0b197194bec228f8020054742190e9312ac"},
+ {file = "safetensors-0.6.2-cp38-abi3-win32.whl", hash = "sha256:cab75ca7c064d3911411461151cb69380c9225798a20e712b102edda2542ddb1"},
+ {file = "safetensors-0.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:c7b214870df923cbc1593c3faee16bec59ea462758699bd3fee399d00aac072c"},
+ {file = "safetensors-0.6.2.tar.gz", hash = "sha256:43ff2aa0e6fa2dc3ea5524ac7ad93a9839256b8703761e76e2d0b2a3fa4f15d9"},
]
[package.extras]
@@ -4636,91 +4578,135 @@ mlx = ["mlx (>=0.0.9)"]
numpy = ["numpy (>=1.21.6)"]
paddlepaddle = ["paddlepaddle (>=2.4.1)", "safetensors[numpy]"]
pinned-tf = ["safetensors[numpy]", "tensorflow (==2.18.0)"]
-quality = ["black (==22.3)", "click (==8.0.4)", "flake8 (>=3.8.3)", "isort (>=5.5.4)"]
+quality = ["ruff"]
tensorflow = ["safetensors[numpy]", "tensorflow (>=2.11.0)"]
testing = ["h5py (>=3.7.0)", "huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"]
+testingfree = ["huggingface-hub (>=0.12.1)", "hypothesis (>=6.70.2)", "pytest (>=7.2.0)", "pytest-benchmark (>=4.0.0)", "safetensors[numpy]", "setuptools-rust (>=1.5.2)"]
torch = ["safetensors[numpy]", "torch (>=1.10)"]
[[package]]
-name = "scipy"
-version = "1.15.2"
-description = "Fundamental algorithms for scientific computing in Python"
+name = "scikit-learn"
+version = "1.7.1"
+description = "A set of python modules for machine learning and data mining"
optional = false
python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e"},
- {file = "scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3"},
- {file = "scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58"},
- {file = "scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa"},
- {file = "scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971"},
- {file = "scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e"},
- {file = "scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40"},
- {file = "scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462"},
- {file = "scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93"},
- {file = "scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e"},
- {file = "scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11"},
- {file = "scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53"},
- {file = "scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d"},
- {file = "scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27"},
- {file = "scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32"},
- {file = "scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d"},
- {file = "scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6"},
- {file = "scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274"},
- {file = "scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828"},
- {file = "scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28"},
- {file = "scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db"},
- {file = "scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec"},
+ {file = "scikit_learn-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d"},
+ {file = "scikit_learn-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1"},
+ {file = "scikit_learn-1.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c"},
+ {file = "scikit_learn-1.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1"},
+ {file = "scikit_learn-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb"},
+ {file = "scikit_learn-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b"},
+ {file = "scikit_learn-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518"},
+ {file = "scikit_learn-1.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8"},
+ {file = "scikit_learn-1.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7"},
+ {file = "scikit_learn-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650"},
+ {file = "scikit_learn-1.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087"},
+ {file = "scikit_learn-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f"},
+ {file = "scikit_learn-1.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87"},
+ {file = "scikit_learn-1.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7"},
+ {file = "scikit_learn-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88"},
+ {file = "scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae"},
+ {file = "scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10"},
+ {file = "scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309"},
+ {file = "scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43"},
+ {file = "scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11"},
+ {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae"},
+ {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c"},
+ {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e"},
+ {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7"},
+ {file = "scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5"},
+ {file = "scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802"},
]
[package.dependencies]
-numpy = ">=1.23.5,<2.5"
+joblib = ">=1.2.0"
+numpy = ">=1.22.0"
+scipy = ">=1.8.0"
+threadpoolctl = ">=3.1.0"
[package.extras]
-dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
-doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
-test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
+benchmark = ["matplotlib (>=3.5.0)", "memory_profiler (>=0.57.0)", "pandas (>=1.4.0)"]
+build = ["cython (>=3.0.10)", "meson-python (>=0.17.1)", "numpy (>=1.22.0)", "scipy (>=1.8.0)"]
+docs = ["Pillow (>=8.4.0)", "matplotlib (>=3.5.0)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.19.0)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"]
+examples = ["matplotlib (>=3.5.0)", "pandas (>=1.4.0)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.19.0)", "seaborn (>=0.9.0)"]
+install = ["joblib (>=1.2.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)", "threadpoolctl (>=3.1.0)"]
+maintenance = ["conda-lock (==3.0.1)"]
+tests = ["matplotlib (>=3.5.0)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.2.1)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)", "scikit-image (>=0.19.0)"]
[[package]]
-name = "secretstorage"
-version = "3.3.3"
-description = "Python bindings to FreeDesktop.org Secret Service API"
+name = "scipy"
+version = "1.16.1"
+description = "Fundamental algorithms for scientific computing in Python"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.11"
groups = ["main"]
-markers = "sys_platform == \"linux\""
files = [
- {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"},
- {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"},
+ {file = "scipy-1.16.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c033fa32bab91dc98ca59d0cf23bb876454e2bb02cbe592d5023138778f70030"},
+ {file = "scipy-1.16.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6e5c2f74e5df33479b5cd4e97a9104c511518fbd979aa9b8f6aec18b2e9ecae7"},
+ {file = "scipy-1.16.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0a55ffe0ba0f59666e90951971a884d1ff6f4ec3275a48f472cfb64175570f77"},
+ {file = "scipy-1.16.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f8a5d6cd147acecc2603fbd382fed6c46f474cccfcf69ea32582e033fb54dcfe"},
+ {file = "scipy-1.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb18899127278058bcc09e7b9966d41a5a43740b5bb8dcba401bd983f82e885b"},
+ {file = "scipy-1.16.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adccd93a2fa937a27aae826d33e3bfa5edf9aa672376a4852d23a7cd67a2e5b7"},
+ {file = "scipy-1.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:18aca1646a29ee9a0625a1be5637fa798d4d81fdf426481f06d69af828f16958"},
+ {file = "scipy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d85495cef541729a70cdddbbf3e6b903421bc1af3e8e3a9a72a06751f33b7c39"},
+ {file = "scipy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:226652fca853008119c03a8ce71ffe1b3f6d2844cc1686e8f9806edafae68596"},
+ {file = "scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c"},
+ {file = "scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04"},
+ {file = "scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919"},
+ {file = "scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921"},
+ {file = "scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725"},
+ {file = "scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618"},
+ {file = "scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d"},
+ {file = "scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119"},
+ {file = "scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a"},
+ {file = "scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f"},
+ {file = "scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb"},
+ {file = "scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c"},
+ {file = "scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608"},
+ {file = "scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f"},
+ {file = "scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b"},
+ {file = "scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45"},
+ {file = "scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65"},
+ {file = "scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab"},
+ {file = "scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6"},
+ {file = "scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27"},
+ {file = "scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7"},
+ {file = "scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6"},
+ {file = "scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4"},
+ {file = "scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3"},
+ {file = "scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7"},
+ {file = "scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc"},
+ {file = "scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39"},
+ {file = "scipy-1.16.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:796a5a9ad36fa3a782375db8f4241ab02a091308eb079746bc0f874c9b998318"},
+ {file = "scipy-1.16.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:3ea0733a2ff73fd6fdc5fecca54ee9b459f4d74f00b99aced7d9a3adb43fb1cc"},
+ {file = "scipy-1.16.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:85764fb15a2ad994e708258bb4ed8290d1305c62a4e1ef07c414356a24fcfbf8"},
+ {file = "scipy-1.16.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:ca66d980469cb623b1759bdd6e9fd97d4e33a9fad5b33771ced24d0cb24df67e"},
+ {file = "scipy-1.16.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e7cc1ffcc230f568549fc56670bcf3df1884c30bd652c5da8138199c8c76dae0"},
+ {file = "scipy-1.16.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ddfb1e8d0b540cb4ee9c53fc3dea3186f97711248fb94b4142a1b27178d8b4b"},
+ {file = "scipy-1.16.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4dc0e7be79e95d8ba3435d193e0d8ce372f47f774cffd882f88ea4e1e1ddc731"},
+ {file = "scipy-1.16.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f23634f9e5adb51b2a77766dac217063e764337fbc816aa8ad9aaebcd4397fd3"},
+ {file = "scipy-1.16.1-cp314-cp314-win_amd64.whl", hash = "sha256:57d75524cb1c5a374958a2eae3d84e1929bb971204cc9d52213fb8589183fc19"},
+ {file = "scipy-1.16.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:d8da7c3dd67bcd93f15618938f43ed0995982eb38973023d46d4646c4283ad65"},
+ {file = "scipy-1.16.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:cc1d2f2fd48ba1e0620554fe5bc44d3e8f5d4185c8c109c7fbdf5af2792cfad2"},
+ {file = "scipy-1.16.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:21a611ced9275cb861bacadbada0b8c0623bc00b05b09eb97f23b370fc2ae56d"},
+ {file = "scipy-1.16.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dfbb25dffc4c3dd9371d8ab456ca81beeaf6f9e1c2119f179392f0dc1ab7695"},
+ {file = "scipy-1.16.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0ebb7204f063fad87fc0a0e4ff4a2ff40b2a226e4ba1b7e34bf4b79bf97cd86"},
+ {file = "scipy-1.16.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f1b9e5962656f2734c2b285a8745358ecb4e4efbadd00208c80a389227ec61ff"},
+ {file = "scipy-1.16.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e1a106f8c023d57a2a903e771228bf5c5b27b5d692088f457acacd3b54511e4"},
+ {file = "scipy-1.16.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:709559a1db68a9abc3b2c8672c4badf1614f3b440b3ab326d86a5c0491eafae3"},
+ {file = "scipy-1.16.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c0c804d60492a0aad7f5b2bb1862f4548b990049e27e828391ff2bf6f7199998"},
+ {file = "scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3"},
]
[package.dependencies]
-cryptography = ">=2.0"
-jeepney = ">=0.6"
+numpy = ">=1.25.2,<2.6"
+
+[package.extras]
+dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
+doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"]
+test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
[[package]]
name = "sentencepiece"
@@ -4787,22 +4773,23 @@ files = [
[[package]]
name = "sentry-sdk"
-version = "1.45.1"
+version = "2.34.1"
description = "Python client for Sentry (https://sentry.io)"
optional = false
-python-versions = "*"
+python-versions = ">=3.6"
groups = ["main"]
files = [
- {file = "sentry_sdk-1.45.1-py2.py3-none-any.whl", hash = "sha256:608887855ccfe39032bfd03936e3a1c4f4fc99b3a4ac49ced54a4220de61c9c1"},
- {file = "sentry_sdk-1.45.1.tar.gz", hash = "sha256:a16c997c0f4e3df63c0fc5e4207ccb1ab37900433e0f72fef88315d317829a26"},
+ {file = "sentry_sdk-2.34.1-py2.py3-none-any.whl", hash = "sha256:b7a072e1cdc5abc48101d5146e1ae680fa81fe886d8d95aaa25a0b450c818d32"},
+ {file = "sentry_sdk-2.34.1.tar.gz", hash = "sha256:69274eb8c5c38562a544c3e9f68b5be0a43be4b697f5fd385bf98e4fbe672687"},
]
[package.dependencies]
certifi = "*"
-urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""}
+urllib3 = ">=1.26.11"
[package.extras]
aiohttp = ["aiohttp (>=3.5)"]
+anthropic = ["anthropic (>=0.16)"]
arq = ["arq (>=0.23)"]
asyncpg = ["asyncpg (>=0.23)"]
beam = ["apache-beam (>=2.12)"]
@@ -4815,14 +4802,20 @@ django = ["django (>=1.8)"]
falcon = ["falcon (>=1.4)"]
fastapi = ["fastapi (>=0.79.0)"]
flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"]
-grpcio = ["grpcio (>=1.21.1)"]
+grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"]
+http2 = ["httpcore[http2] (==1.*)"]
httpx = ["httpx (>=0.16.0)"]
huey = ["huey (>=2)"]
+huggingface-hub = ["huggingface_hub (>=0.22)"]
+langchain = ["langchain (>=0.0.210)"]
+launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"]
+litestar = ["litestar (>=2.0.0)"]
loguru = ["loguru (>=0.5)"]
openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"]
+openfeature = ["openfeature-sdk (>=0.7.1)"]
opentelemetry = ["opentelemetry-distro (>=0.35b0)"]
-opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"]
-pure-eval = ["asttokens", "executing", "pure-eval"]
+opentelemetry-experimental = ["opentelemetry-distro"]
+pure-eval = ["asttokens", "executing", "pure_eval"]
pymongo = ["pymongo (>=3.1)"]
pyspark = ["pyspark (>=2.4.4)"]
quart = ["blinker (>=1.1)", "quart (>=0.16.1)"]
@@ -4831,121 +4824,25 @@ sanic = ["sanic (>=0.8)"]
sqlalchemy = ["sqlalchemy (>=1.2)"]
starlette = ["starlette (>=0.19.1)"]
starlite = ["starlite (>=1.48)"]
-tornado = ["tornado (>=5)"]
-
-[[package]]
-name = "setproctitle"
-version = "1.3.5"
-description = "A Python module to customize the process title"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "setproctitle-1.3.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02870e0cb0de7f68a7a8a5b23c2bc0ce63821cab3d9b126f9be80bb6cd674c80"},
- {file = "setproctitle-1.3.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55b278135be742b8901067479626d909f6613bd2d2c4fd0de6bb46f80e07a919"},
- {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53fc971f7bf7a674f571a23cdec70f2f0ac88152c59c06aa0808d0be6d834046"},
- {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb0500e1bc6f00b8ba696c3743ddff14c8679e3c2ca9d292c008ac51488d17cf"},
- {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:995b3ac1b5fe510f4e1d1c19ebf19f4bceb448f2d6e8d99ea23f33cb6f1a277e"},
- {file = "setproctitle-1.3.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a05e2c3fdfbda32b9c9da72d0506398d1efb5bd2c5981b9e12d3622eb3d4f9"},
- {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:310c7f4ca4c8476a9840b2cd4b22ee602a49a3c902fdcd2dd8284685abd10a9a"},
- {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:867af4a5c3d85484fbcc50ea88bcd375acf709cff88a3259575361849c0da351"},
- {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8ec0a7fe9f1ba90900144489bc93ce7dd4dec3f3df1e7f188c9e58364fe4a4c5"},
- {file = "setproctitle-1.3.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aaee7acba2733a14a886488b7495bfec4a8d6407124c04a0946dbde1684230a3"},
- {file = "setproctitle-1.3.5-cp310-cp310-win32.whl", hash = "sha256:bd2cccd972e4282af4ce2c13cd9ebdf07be157eabafd8ce648fffdc8ae6fbe28"},
- {file = "setproctitle-1.3.5-cp310-cp310-win_amd64.whl", hash = "sha256:81f2328ac34c9584e1e5f87eea916c0bc48476a06606a07debae07acdd7ab5ea"},
- {file = "setproctitle-1.3.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1c8dcc250872385f2780a5ea58050b58cbc8b6a7e8444952a5a65c359886c593"},
- {file = "setproctitle-1.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ca82fae9eb4800231dd20229f06e8919787135a5581da245b8b05e864f34cc8b"},
- {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0424e1d33232322541cb36fb279ea5242203cd6f20de7b4fb2a11973d8e8c2ce"},
- {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fec8340ab543144d04a9d805d80a0aad73fdeb54bea6ff94e70d39a676ea4ec0"},
- {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eab441c89f181271ab749077dcc94045a423e51f2fb0b120a1463ef9820a08d0"},
- {file = "setproctitle-1.3.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c371550a2288901a0dcd84192691ebd3197a43c95f3e0b396ed6d1cedf5c6c"},
- {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78288ff5f9c415c56595b2257ad218936dd9fa726b36341b373b31ca958590fe"},
- {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f1f13a25fc46731acab518602bb1149bfd8b5fabedf8290a7c0926d61414769d"},
- {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1534d6cd3854d035e40bf4c091984cbdd4d555d7579676d406c53c8f187c006f"},
- {file = "setproctitle-1.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62a01c76708daac78b9688ffb95268c57cb57fa90b543043cda01358912fe2db"},
- {file = "setproctitle-1.3.5-cp311-cp311-win32.whl", hash = "sha256:ea07f29735d839eaed985990a0ec42c8aecefe8050da89fec35533d146a7826d"},
- {file = "setproctitle-1.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:ab3ae11e10d13d514d4a5a15b4f619341142ba3e18da48c40e8614c5a1b5e3c3"},
- {file = "setproctitle-1.3.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:523424b9be4dea97d95b8a584b183f35c7bab2d0a3d995b01febf5b8a8de90e4"},
- {file = "setproctitle-1.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b6ec1d86c1b4d7b5f2bdceadf213310cf24696b82480a2a702194b8a0bfbcb47"},
- {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea6c505264275a43e9b2acd2acfc11ac33caf52bc3167c9fced4418a810f6b1c"},
- {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b91e68e6685998e6353f296100ecabc313a6cb3e413d66a03d74b988b61f5ff"},
- {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1fda208ae3a2285ad27aeab44c41daf2328abe58fa3270157a739866779199"},
- {file = "setproctitle-1.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:828727d220e46f048b82289018300a64547b46aaed96bf8810c05fe105426b41"},
- {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:83b016221cf80028b2947be20630faa14e3e72a403e35f0ba29550b4e856767b"},
- {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6d8a411e752e794d052434139ca4234ffeceeb8d8d8ddc390a9051d7942b2726"},
- {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:50cfbf86b9c63a2c2903f1231f0a58edeb775e651ae1af84eec8430b0571f29b"},
- {file = "setproctitle-1.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f3b5e2eacd572444770026c9dd3ddc7543ce427cdf452d40a408d1e95beefb30"},
- {file = "setproctitle-1.3.5-cp312-cp312-win32.whl", hash = "sha256:cf4e3ded98027de2596c6cc5bbd3302adfb3ca315c848f56516bb0b7e88de1e9"},
- {file = "setproctitle-1.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:f7a8c01ffd013dda2bed6e7d5cb59fbb609e72f805abf3ee98360f38f7758d9b"},
- {file = "setproctitle-1.3.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:162fd76781f57f42ddf27c475e5fef6a8df4fdd69b28dd554e53e2eb2bfe0f95"},
- {file = "setproctitle-1.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4969d996bdfbe23bbd023cd0bae6c73a27371615c4ec5296a60cecce268659ef"},
- {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd70c95a94473216e7c7a7a1f7d8ecbaca5b16d4ba93ddbfd32050fc485a8451"},
- {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a887582bfdb6dcbc482db0ef9e630ad23ca95875806ef2b444bf6fbd7b7d7ca"},
- {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:755671c39a9e70834eeec6dc6b61e344399c49881d2e7ea3534a1c69669dd9cc"},
- {file = "setproctitle-1.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ab52b4c2ce056a1b60d439991a81ca90f019488d4b4f64b2779e6badd3677e6"},
- {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:36178b944019ec7fc52bb967ffeee296a11d373734a7be276755bedb3db5c141"},
- {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:269d41cd4f085b69821d1ee6599124f02dbbc79962b256e260b6c9021d037994"},
- {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d880630fd81d1b3bde121c352ca7ea2f2ff507ef40c3c011d0928ed491f912c9"},
- {file = "setproctitle-1.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8a7fed67ab49f60bd51f3b4cffff3f8d754d1bb0a40e42869911301ec6519b65"},
- {file = "setproctitle-1.3.5-cp313-cp313-win32.whl", hash = "sha256:e9c0d0cfcf715631b10d5950d04a9978f63bc46535724ef7c2eaf1dca9988642"},
- {file = "setproctitle-1.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:e1d28eb98c91fbebd3e443a45c7da5d84974959851ef304c330eabd654a386f1"},
- {file = "setproctitle-1.3.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8995a1217b52d11d92bafd069961a47c5e13d8751ca976a32b3ecbbd471eaf9b"},
- {file = "setproctitle-1.3.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae2ce64ea87837c4e3e65a7a232ff80cf09aa7d916e74cb34a245c47fcd87981"},
- {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20b84de1780bbb0adc67560a113a0ea57e6ecfce2325680de8efe6c2a2f781ac"},
- {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b1d2628ac9868f960d7e87b3a9b2bb337104c3644b699e52e01efd7e106e4fe"},
- {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa912c4d08c66afda30dd5af8f2e9c59065dfc36a51edbd5419c3a7c962875aa"},
- {file = "setproctitle-1.3.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4f783e100f8b451cd92fcabd3b831edfb1f7cb02be4a79b972f138e0001885"},
- {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8ca56e39d10b6758046694a84950e5c5570a034c409ef3337595f64fc2cfa94d"},
- {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:8915d69260ba6a6aaf9a48f6b53dbf9f8e4dc0cb4ae25bc5edb16a1666b6e47c"},
- {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7edd4fbb9fd17ed0e5a7f8bde9fa61c3987a34372084c45bab4eab6a2e554762"},
- {file = "setproctitle-1.3.5-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:d0b19fd76d46b8096a463724739c3b09cf5ce38317f559f56f424f6ce7158de3"},
- {file = "setproctitle-1.3.5-cp38-cp38-win32.whl", hash = "sha256:53ce572cdbd43a0bed2aa24299cd823ebf233a7fa720cc7f8634728c213679c0"},
- {file = "setproctitle-1.3.5-cp38-cp38-win_amd64.whl", hash = "sha256:a58f00f35d6038ce1e8a9e5f87cb5ecce13ce118c5977a603566ad1fccc8d2cb"},
- {file = "setproctitle-1.3.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c4b299b5bbadf00034978b8d741c85af25173146747eb9dab22596ec805a52d6"},
- {file = "setproctitle-1.3.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d57e7626329d4fb138da5ce15270b08a91326969956fb19c7a8fec2639066704"},
- {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4272295721cf1fd2acf960b674d6dc09bec87f2a1e48995817b4ec4a3d483faf"},
- {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8305b6e6c203222c61318f338f1de08269ec66c247bf251593c215ff1fbeaf9"},
- {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:becc9f3f605936506d2bd63d9cf817b7ee66b10d204184c4a633064dbed579d6"},
- {file = "setproctitle-1.3.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4629de80c47155a26e8d87a0a92d9428aa8d79ccfe2c20fd18888580619704e1"},
- {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f1af1d310b5b6cda692da52bd862a9833086c0a3f8380fa92505dd23857dcf60"},
- {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3bb6ea3d6e690677619508050bc681d86223723bdf67e4e8a8dffc3d04ca3044"},
- {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:322067ef1ffe70d297b00bee8a3862fed96021aa4318e3bce2d7c3bfa7a8d1e7"},
- {file = "setproctitle-1.3.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1b58d49c32a46c48dcc2812635a89e6bee31139b03818da49a0bbaeaf01edef9"},
- {file = "setproctitle-1.3.5-cp39-cp39-win32.whl", hash = "sha256:707c23d4a88f5e66f1005d93558bf84eb45fc0fb0c4f33480a0c7d0895e8e848"},
- {file = "setproctitle-1.3.5-cp39-cp39-win_amd64.whl", hash = "sha256:c64199a73d442a06d372b5286942229a43e86fa41bf36f317dcc60c036aff0bb"},
- {file = "setproctitle-1.3.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:dc66b84beb0d5eb03abf0c3140c6d2cbe3d67ae9f0824a09dfa8c6ff164319a6"},
- {file = "setproctitle-1.3.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31dc9b330e7cac7685bdef790747c07914081c11ee1066eb0c597303dfb52010"},
- {file = "setproctitle-1.3.5-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4028639b511f5e641d116b3b54ad70c637ebd1b4baac0948283daf11b104119f"},
- {file = "setproctitle-1.3.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6bddef4e27d0ed74e44b58bf050bc3108591bf17d20d461fc59cd141282f849c"},
- {file = "setproctitle-1.3.5-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:9996be1d1df399c3cdc6d72ce0064e46bc74fc6e29fe16a328511a303dd4d418"},
- {file = "setproctitle-1.3.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cefc2dbdc48121022c3c05644cd3706f08e0b3c0ce07814d3c04daba0617936"},
- {file = "setproctitle-1.3.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cef63879c79a570aabf7c158f453bf8d1285f0fda4b6b9b7a52d64b49c084d40"},
- {file = "setproctitle-1.3.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a863296a31fb578726c570314cb78ff3a3fddb65963dc01ea33731760f20a92c"},
- {file = "setproctitle-1.3.5-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b63bda3cb4b6526720dc7c6940b891c593f41771d119aeb8763875801ce2296d"},
- {file = "setproctitle-1.3.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95913af603da5b4c7635bf1fb67ecc5df7c18360b6cfb6740fd743bb150a6e17"},
- {file = "setproctitle-1.3.5-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36b130cf8fe76dc05ad1d48cc9ff3699eb1f0d8edbf6f46a3ce46a7041e49d7b"},
- {file = "setproctitle-1.3.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe3bfd5e51c24349d022e062a96c316a1b8862ea9a0cf5ea2a8b2ae008b77cec"},
- {file = "setproctitle-1.3.5.tar.gz", hash = "sha256:1e6eaeaf8a734d428a95d8c104643b39af7d247d604f40a7bebcf3960a853c5e"},
-]
-
-[package.extras]
-test = ["pytest"]
+statsig = ["statsig (>=0.55.3)"]
+tornado = ["tornado (>=6)"]
+unleash = ["UnleashClient (>=6.0.1)"]
[[package]]
name = "setuptools"
-version = "75.9.1"
+version = "80.9.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "setuptools-75.9.1-py3-none-any.whl", hash = "sha256:0a6f876d62f4d978ca1a11ab4daf728d1357731f978543ff18ecdbf9fd071f73"},
- {file = "setuptools-75.9.1.tar.gz", hash = "sha256:b6eca2c3070cdc82f71b4cb4bb2946bc0760a210d11362278cf1ff394e6ea32c"},
+ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"},
+ {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""]
-core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"]
+core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
@@ -5002,26 +4899,14 @@ files = [
[[package]]
name = "snowballstemmer"
-version = "2.2.0"
-description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-optional = false
-python-versions = "*"
-groups = ["dev"]
-files = [
- {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
- {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"},
-]
-
-[[package]]
-name = "soupsieve"
-version = "2.6"
-description = "A modern CSS selector implementation for Beautiful Soup."
+version = "3.0.1"
+description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms."
optional = false
-python-versions = ">=3.8"
-groups = ["main"]
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*"
+groups = ["main", "dev"]
files = [
- {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"},
- {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"},
+ {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"},
+ {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"},
]
[[package]]
@@ -5030,7 +4915,7 @@ version = "8.2.3"
description = "Python documentation generator"
optional = false
python-versions = ">=3.11"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3"},
{file = "sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348"},
@@ -5060,13 +4945,33 @@ docs = ["sphinxcontrib-websupport"]
lint = ["betterproto (==2.0.0b6)", "mypy (==1.15.0)", "pypi-attestations (==0.0.21)", "pyright (==1.1.395)", "pytest (>=8.0)", "ruff (==0.9.9)", "sphinx-lint (>=0.9)", "types-Pillow (==10.2.0.20240822)", "types-Pygments (==2.19.0.20250219)", "types-colorama (==0.4.15.20240311)", "types-defusedxml (==0.7.0.20240218)", "types-docutils (==0.21.0.20241128)", "types-requests (==2.32.0.20241016)", "types-urllib3 (==1.26.25.14)"]
test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "pytest-xdist[psutil] (>=3.4)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"]
+[[package]]
+name = "sphinx-rtd-theme"
+version = "3.0.2"
+description = "Read the Docs theme for Sphinx"
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13"},
+ {file = "sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85"},
+]
+
+[package.dependencies]
+docutils = ">0.18,<0.22"
+sphinx = ">=6,<9"
+sphinxcontrib-jquery = ">=4,<5"
+
+[package.extras]
+dev = ["bump2version", "transifex-client", "twine", "wheel"]
+
[[package]]
name = "sphinxcontrib-applehelp"
version = "2.0.0"
description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"},
{file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"},
@@ -5083,7 +4988,7 @@ version = "2.0.0"
description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"},
{file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"},
@@ -5100,7 +5005,7 @@ version = "2.1.0"
description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"},
{file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"},
@@ -5111,13 +5016,28 @@ lint = ["mypy", "ruff (==0.5.5)", "types-docutils"]
standalone = ["Sphinx (>=5)"]
test = ["html5lib", "pytest"]
+[[package]]
+name = "sphinxcontrib-jquery"
+version = "4.1"
+description = "Extension to include jQuery on newer Sphinx releases"
+optional = false
+python-versions = ">=2.7"
+groups = ["dev"]
+files = [
+ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"},
+ {file = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", hash = "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae"},
+]
+
+[package.dependencies]
+Sphinx = ">=1.8"
+
[[package]]
name = "sphinxcontrib-jsmath"
version = "1.0.1"
description = "A sphinx extension which renders display math in HTML via JavaScript"
optional = false
python-versions = ">=3.5"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
{file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
@@ -5132,7 +5052,7 @@ version = "2.0.0"
description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"},
{file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"},
@@ -5149,7 +5069,7 @@ version = "2.0.0"
description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)"
optional = false
python-versions = ">=3.9"
-groups = ["dev"]
+groups = ["main", "dev"]
files = [
{file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"},
{file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"},
@@ -5162,81 +5082,81 @@ test = ["pytest"]
[[package]]
name = "sqlalchemy"
-version = "2.0.38"
+version = "2.0.42"
description = "Database Abstraction Library"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5e1d9e429028ce04f187a9f522818386c8b076723cdbe9345708384f49ebcec6"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b87a90f14c68c925817423b0424381f0e16d80fc9a1a1046ef202ab25b19a444"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:402c2316d95ed90d3d3c25ad0390afa52f4d2c56b348f212aa9c8d072a40eee5"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6493bc0eacdbb2c0f0d260d8988e943fee06089cd239bd7f3d0c45d1657a70e2"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0561832b04c6071bac3aad45b0d3bb6d2c4f46a8409f0a7a9c9fa6673b41bc03"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:49aa2cdd1e88adb1617c672a09bf4ebf2f05c9448c6dbeba096a3aeeb9d4d443"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-win32.whl", hash = "sha256:64aa8934200e222f72fcfd82ee71c0130a9c07d5725af6fe6e919017d095b297"},
- {file = "SQLAlchemy-2.0.38-cp310-cp310-win_amd64.whl", hash = "sha256:c57b8e0841f3fce7b703530ed70c7c36269c6d180ea2e02e36b34cb7288c50c7"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bf89e0e4a30714b357f5d46b6f20e0099d38b30d45fa68ea48589faf5f12f62d"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8455aa60da49cb112df62b4721bd8ad3654a3a02b9452c783e651637a1f21fa2"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f53c0d6a859b2db58332e0e6a921582a02c1677cc93d4cbb36fdf49709b327b2"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c4817dff8cef5697f5afe5fec6bc1783994d55a68391be24cb7d80d2dbc3a6"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c9cea5b756173bb86e2235f2f871b406a9b9d722417ae31e5391ccaef5348f2c"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40e9cdbd18c1f84631312b64993f7d755d85a3930252f6276a77432a2b25a2f3"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-win32.whl", hash = "sha256:cb39ed598aaf102251483f3e4675c5dd6b289c8142210ef76ba24aae0a8f8aba"},
- {file = "SQLAlchemy-2.0.38-cp311-cp311-win_amd64.whl", hash = "sha256:f9d57f1b3061b3e21476b0ad5f0397b112b94ace21d1f439f2db472e568178ae"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12d5b06a1f3aeccf295a5843c86835033797fea292c60e72b07bcb5d820e6dd3"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e036549ad14f2b414c725349cce0772ea34a7ab008e9cd67f9084e4f371d1f32"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3bee874cb1fadee2ff2b79fc9fc808aa638670f28b2145074538d4a6a5028e"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e185ea07a99ce8b8edfc788c586c538c4b1351007e614ceb708fd01b095ef33e"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b79ee64d01d05a5476d5cceb3c27b5535e6bb84ee0f872ba60d9a8cd4d0e6579"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afd776cf1ebfc7f9aa42a09cf19feadb40a26366802d86c1fba080d8e5e74bdd"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-win32.whl", hash = "sha256:a5645cd45f56895cfe3ca3459aed9ff2d3f9aaa29ff7edf557fa7a23515a3725"},
- {file = "SQLAlchemy-2.0.38-cp312-cp312-win_amd64.whl", hash = "sha256:1052723e6cd95312f6a6eff9a279fd41bbae67633415373fdac3c430eca3425d"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ecef029b69843b82048c5b347d8e6049356aa24ed644006c9a9d7098c3bd3bfd"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c8bcad7fc12f0cc5896d8e10fdf703c45bd487294a986903fe032c72201596b"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a0ef3f98175d77180ffdc623d38e9f1736e8d86b6ba70bff182a7e68bed7727"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b0ac78898c50e2574e9f938d2e5caa8fe187d7a5b69b65faa1ea4648925b096"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9eb4fa13c8c7a2404b6a8e3772c17a55b1ba18bc711e25e4d6c0c9f5f541b02a"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5dba1cdb8f319084f5b00d41207b2079822aa8d6a4667c0f369fce85e34b0c86"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-win32.whl", hash = "sha256:eae27ad7580529a427cfdd52c87abb2dfb15ce2b7a3e0fc29fbb63e2ed6f8120"},
- {file = "SQLAlchemy-2.0.38-cp313-cp313-win_amd64.whl", hash = "sha256:b335a7c958bc945e10c522c069cd6e5804f4ff20f9a744dd38e748eb602cbbda"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40310db77a55512a18827488e592965d3dec6a3f1e3d8af3f8243134029daca3"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d3043375dd5bbcb2282894cbb12e6c559654c67b5fffb462fda815a55bf93f7"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70065dfabf023b155a9c2a18f573e47e6ca709b9e8619b2e04c54d5bcf193178"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:c058b84c3b24812c859300f3b5abf300daa34df20d4d4f42e9652a4d1c48c8a4"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0398361acebb42975deb747a824b5188817d32b5c8f8aba767d51ad0cc7bb08d"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-win32.whl", hash = "sha256:a2bc4e49e8329f3283d99840c136ff2cd1a29e49b5624a46a290f04dff48e079"},
- {file = "SQLAlchemy-2.0.38-cp37-cp37m-win_amd64.whl", hash = "sha256:9cd136184dd5f58892f24001cdce986f5d7e96059d004118d5410671579834a4"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:665255e7aae5f38237b3a6eae49d2358d83a59f39ac21036413fab5d1e810578"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:92f99f2623ff16bd4aaf786ccde759c1f676d39c7bf2855eb0b540e1ac4530c8"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa498d1392216fae47eaf10c593e06c34476ced9549657fca713d0d1ba5f7248"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9afbc3909d0274d6ac8ec891e30210563b2c8bdd52ebbda14146354e7a69373"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:57dd41ba32430cbcc812041d4de8d2ca4651aeefad2626921ae2a23deb8cd6ff"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3e35d5565b35b66905b79ca4ae85840a8d40d31e0b3e2990f2e7692071b179ca"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-win32.whl", hash = "sha256:f0d3de936b192980209d7b5149e3c98977c3810d401482d05fb6d668d53c1c63"},
- {file = "SQLAlchemy-2.0.38-cp38-cp38-win_amd64.whl", hash = "sha256:3868acb639c136d98107c9096303d2d8e5da2880f7706f9f8c06a7f961961149"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07258341402a718f166618470cde0c34e4cec85a39767dce4e24f61ba5e667ea"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a826f21848632add58bef4f755a33d45105d25656a0c849f2dc2df1c71f6f50"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:386b7d136919bb66ced64d2228b92d66140de5fefb3c7df6bd79069a269a7b06"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f2951dc4b4f990a4b394d6b382accb33141d4d3bd3ef4e2b27287135d6bdd68"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8bf312ed8ac096d674c6aa9131b249093c1b37c35db6a967daa4c84746bc1bc9"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6db316d6e340f862ec059dc12e395d71f39746a20503b124edc255973977b728"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-win32.whl", hash = "sha256:c09a6ea87658695e527104cf857c70f79f14e9484605e205217aae0ec27b45fc"},
- {file = "SQLAlchemy-2.0.38-cp39-cp39-win_amd64.whl", hash = "sha256:12f5c9ed53334c3ce719155424dc5407aaa4f6cadeb09c5b627e06abb93933a1"},
- {file = "SQLAlchemy-2.0.38-py3-none-any.whl", hash = "sha256:63178c675d4c80def39f1febd625a6333f44c0ba269edd8a468b156394b27753"},
- {file = "sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ee065898359fdee83961aed5cf1fb4cfa913ba71b58b41e036001d90bebbf7a"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56bc76d86216443daa2e27e6b04a9b96423f0b69b5d0c40c7f4b9a4cdf7d8d90"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89143290fb94c50a8dec73b06109ccd245efd8011d24fc0ddafe89dc55b36651"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:4efbdc9754c7145a954911bfeef815fb0843e8edab0e9cecfa3417a5cbd316af"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:88f8a8007a658dfd82c16a20bd9673ae6b33576c003b5166d42697d49e496e61"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-win32.whl", hash = "sha256:c5dd245e6502990ccf612d51f220a7b04cbea3f00f6030691ffe27def76ca79b"},
+ {file = "SQLAlchemy-2.0.42-cp37-cp37m-win_amd64.whl", hash = "sha256:5651eb19cacbeb2fe7431e4019312ed00a0b3fbd2d701423e0e2ceaadb5bcd9f"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:172b244753e034d91a826f80a9a70f4cbac690641207f2217f8404c261473efe"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be28f88abd74af8519a4542185ee80ca914933ca65cdfa99504d82af0e4210df"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98b344859d282fde388047f1710860bb23f4098f705491e06b8ab52a48aafea9"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97978d223b11f1d161390a96f28c49a13ce48fdd2fed7683167c39bdb1b8aa09"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e35b9b000c59fcac2867ab3a79fc368a6caca8706741beab3b799d47005b3407"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bc7347ad7a7b1c78b94177f2d57263113bb950e62c59b96ed839b131ea4234e1"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-win32.whl", hash = "sha256:739e58879b20a179156b63aa21f05ccacfd3e28e08e9c2b630ff55cd7177c4f1"},
+ {file = "sqlalchemy-2.0.42-cp310-cp310-win_amd64.whl", hash = "sha256:1aef304ada61b81f1955196f584b9e72b798ed525a7c0b46e09e98397393297b"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c34100c0b7ea31fbc113c124bcf93a53094f8951c7bf39c45f39d327bad6d1e7"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad59dbe4d1252448c19d171dfba14c74e7950b46dc49d015722a4a06bfdab2b0"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9187498c2149919753a7fd51766ea9c8eecdec7da47c1b955fa8090bc642eaa"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f092cf83ebcafba23a247f5e03f99f5436e3ef026d01c8213b5eca48ad6efa9"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc6afee7e66fdba4f5a68610b487c1f754fccdc53894a9567785932dbb6a265e"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:260ca1d2e5910f1f1ad3fe0113f8fab28657cee2542cb48c2f342ed90046e8ec"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-win32.whl", hash = "sha256:2eb539fd83185a85e5fcd6b19214e1c734ab0351d81505b0f987705ba0a1e231"},
+ {file = "sqlalchemy-2.0.42-cp311-cp311-win_amd64.whl", hash = "sha256:9193fa484bf00dcc1804aecbb4f528f1123c04bad6a08d7710c909750fa76aeb"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09637a0872689d3eb71c41e249c6f422e3e18bbd05b4cd258193cfc7a9a50da2"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3cb3ec67cc08bea54e06b569398ae21623534a7b1b23c258883a7c696ae10df"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87e6a5ef6f9d8daeb2ce5918bf5fddecc11cae6a7d7a671fcc4616c47635e01"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b718011a9d66c0d2f78e1997755cd965f3414563b31867475e9bc6efdc2281d"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16d9b544873fe6486dddbb859501a07d89f77c61d29060bb87d0faf7519b6a4d"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21bfdf57abf72fa89b97dd74d3187caa3172a78c125f2144764a73970810c4ee"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-win32.whl", hash = "sha256:78b46555b730a24901ceb4cb901c6b45c9407f8875209ed3c5d6bcd0390a6ed1"},
+ {file = "sqlalchemy-2.0.42-cp312-cp312-win_amd64.whl", hash = "sha256:4c94447a016f36c4da80072e6c6964713b0af3c8019e9c4daadf21f61b81ab53"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:941804f55c7d507334da38133268e3f6e5b0340d584ba0f277dd884197f4ae8c"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d3d06a968a760ce2aa6a5889fefcbdd53ca935735e0768e1db046ec08cbf01"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cf10396a8a700a0f38ccd220d940be529c8f64435c5d5b29375acab9267a6c9"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cae6c2b05326d7c2c7c0519f323f90e0fb9e8afa783c6a05bb9ee92a90d0f04"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f50f7b20677b23cfb35b6afcd8372b2feb348a38e3033f6447ee0704540be894"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d88a1c0d66d24e229e3938e1ef16ebdbd2bf4ced93af6eff55225f7465cf350"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-win32.whl", hash = "sha256:45c842c94c9ad546c72225a0c0d1ae8ef3f7c212484be3d429715a062970e87f"},
+ {file = "sqlalchemy-2.0.42-cp313-cp313-win_amd64.whl", hash = "sha256:eb9905f7f1e49fd57a7ed6269bc567fcbbdac9feadff20ad6bd7707266a91577"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ed5a6959b1668d97a32e3fd848b485f65ee3c05a759dee06d90e4545a3c77f1e"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2ddbaafe32f0dd12d64284b1c3189104b784c9f3dba8cc1ba7e642e2b14b906f"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37f4f42568b6c656ee177b3e111d354b5dda75eafe9fe63492535f91dfa35829"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb57923d852d38671a17abda9a65cc59e3e5eab51fb8307b09de46ed775bcbb8"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:437c2a8b0c780ff8168a470beb22cb4a25e1c63ea6a7aec87ffeb07aa4b76641"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:480f7df62f0b3ad6aa011eefa096049dc1770208bb71f234959ee2864206eefe"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-win32.whl", hash = "sha256:d119c80c614d62d32e236ae68e21dd28a2eaf070876b2f28a6075d5bae54ef3f"},
+ {file = "sqlalchemy-2.0.42-cp38-cp38-win_amd64.whl", hash = "sha256:be3a02f963c8d66e28bb4183bebab66dc4379701d92e660f461c65fecd6ff399"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:78548fd65cd76d4c5a2e6b5f245d7734023ee4de33ee7bb298f1ac25a9935e0d"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf4bf5a174d8a679a713b7a896470ffc6baab78e80a79e7ec5668387ffeccc8b"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c7ff7ba08b375f8a8fa0511e595c9bdabb5494ec68f1cf69bb24e54c0d90f2"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b3c117f65d64e806ce5ce9ce578f06224dc36845e25ebd2554b3e86960e1aed"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:27e4a7b3a7a61ff919c2e7caafd612f8626114e6e5ebbe339de3b5b1df9bc27e"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b01e0dd39f96aefda5ab002d8402db4895db871eb0145836246ce0661635ce55"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-win32.whl", hash = "sha256:49362193b1f43aa158deebf438062d7b5495daa9177c6c5d0f02ceeb64b544ea"},
+ {file = "sqlalchemy-2.0.42-cp39-cp39-win_amd64.whl", hash = "sha256:636ec3dc83b2422a7ff548d0f8abf9c23742ca50e2a5cdc492a151eac7a0248b"},
+ {file = "sqlalchemy-2.0.42-py3-none-any.whl", hash = "sha256:defcdff7e661f0043daa381832af65d616e060ddb54d3fe4476f51df7eaa1835"},
+ {file = "sqlalchemy-2.0.42.tar.gz", hash = "sha256:160bedd8a5c28765bd5be4dec2d881e109e33b34922e50a3b881a7681773ac5f"},
]
[package.dependencies]
-greenlet = {version = "!=0.4.17", optional = true, markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\") or extra == \"asyncio\""}
+greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
typing-extensions = ">=4.6.0"
[package.extras]
-aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"]
-aioodbc = ["aioodbc", "greenlet (!=0.4.17)"]
-aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
-asyncio = ["greenlet (!=0.4.17)"]
-asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"]
+aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"]
+aioodbc = ["aioodbc", "greenlet (>=1)"]
+aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"]
+asyncio = ["greenlet (>=1)"]
+asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"]
mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"]
mssql = ["pyodbc"]
mssql-pymssql = ["pymssql"]
@@ -5247,7 +5167,7 @@ mysql-connector = ["mysql-connector-python"]
oracle = ["cx_oracle (>=8)"]
oracle-oracledb = ["oracledb (>=1.0.1)"]
postgresql = ["psycopg2 (>=2.7)"]
-postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
+postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"]
postgresql-pg8000 = ["pg8000 (>=1.29.1)"]
postgresql-psycopg = ["psycopg (>=3.0.7)"]
postgresql-psycopg2binary = ["psycopg2-binary"]
@@ -5257,15 +5177,50 @@ pymysql = ["pymysql"]
sqlcipher = ["sqlcipher3_binary"]
[[package]]
-name = "striprtf"
-version = "0.0.26"
-description = "A simple library to convert rtf to text"
+name = "sqlparse"
+version = "0.5.3"
+description = "A non-validating SQL parser."
optional = false
-python-versions = "*"
+python-versions = ">=3.8"
+groups = ["main"]
+files = [
+ {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"},
+ {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"},
+]
+
+[package.extras]
+dev = ["build", "hatch"]
+doc = ["sphinx"]
+
+[[package]]
+name = "starlette"
+version = "0.47.3"
+description = "The little ASGI library that shines."
+optional = false
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "striprtf-0.0.26-py3-none-any.whl", hash = "sha256:8c8f9d32083cdc2e8bfb149455aa1cc5a4e0a035893bedc75db8b73becb3a1bb"},
- {file = "striprtf-0.0.26.tar.gz", hash = "sha256:fdb2bba7ac440072d1c41eab50d8d74ae88f60a8b6575c6e2c7805dc462093aa"},
+ {file = "starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51"},
+ {file = "starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9"},
+]
+
+[package.dependencies]
+anyio = ">=3.6.2,<5"
+typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""}
+
+[package.extras]
+full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"]
+
+[[package]]
+name = "stevedore"
+version = "5.5.0"
+description = "Manage dynamic plugins for Python applications"
+optional = false
+python-versions = ">=3.9"
+groups = ["dev"]
+files = [
+ {file = "stevedore-5.5.0-py3-none-any.whl", hash = "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf"},
+ {file = "stevedore-5.5.0.tar.gz", hash = "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73"},
]
[[package]]
@@ -5303,14 +5258,14 @@ widechars = ["wcwidth"]
[[package]]
name = "tenacity"
-version = "9.0.0"
+version = "9.1.2"
description = "Retry code until it succeeds"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"},
- {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"},
+ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"},
+ {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"},
]
[package.extras]
@@ -5318,76 +5273,55 @@ doc = ["reno", "sphinx"]
test = ["pytest", "tornado (>=4.5)", "typeguard"]
[[package]]
-name = "tiktoken"
-version = "0.9.0"
-description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models"
+name = "termcolor"
+version = "3.1.0"
+description = "ANSI color formatting for output in terminal"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "tiktoken-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:586c16358138b96ea804c034b8acf3f5d3f0258bd2bc3b0227af4af5d622e382"},
- {file = "tiktoken-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9c59ccc528c6c5dd51820b3474402f69d9a9e1d656226848ad68a8d5b2e5108"},
- {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0968d5beeafbca2a72c595e8385a1a1f8af58feaebb02b227229b69ca5357fd"},
- {file = "tiktoken-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a5fb085a6a3b7350b8fc838baf493317ca0e17bd95e8642f95fc69ecfed1de"},
- {file = "tiktoken-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15a2752dea63d93b0332fb0ddb05dd909371ededa145fe6a3242f46724fa7990"},
- {file = "tiktoken-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:26113fec3bd7a352e4b33dbaf1bd8948de2507e30bd95a44e2b1156647bc01b4"},
- {file = "tiktoken-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f32cc56168eac4851109e9b5d327637f15fd662aa30dd79f964b7c39fbadd26e"},
- {file = "tiktoken-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45556bc41241e5294063508caf901bf92ba52d8ef9222023f83d2483a3055348"},
- {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03935988a91d6d3216e2ec7c645afbb3d870b37bcb67ada1943ec48678e7ee33"},
- {file = "tiktoken-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3d80aad8d2c6b9238fc1a5524542087c52b860b10cbf952429ffb714bc1136"},
- {file = "tiktoken-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b2a21133be05dc116b1d0372af051cd2c6aa1d2188250c9b553f9fa49301b336"},
- {file = "tiktoken-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:11a20e67fdf58b0e2dea7b8654a288e481bb4fc0289d3ad21291f8d0849915fb"},
- {file = "tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03"},
- {file = "tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210"},
- {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794"},
- {file = "tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22"},
- {file = "tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2"},
- {file = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16"},
- {file = "tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb"},
- {file = "tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63"},
- {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01"},
- {file = "tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139"},
- {file = "tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a"},
- {file = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95"},
- {file = "tiktoken-0.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c6386ca815e7d96ef5b4ac61e0048cd32ca5a92d5781255e13b31381d28667dc"},
- {file = "tiktoken-0.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75f6d5db5bc2c6274b674ceab1615c1778e6416b14705827d19b40e6355f03e0"},
- {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e15b16f61e6f4625a57a36496d28dd182a8a60ec20a534c5343ba3cafa156ac7"},
- {file = "tiktoken-0.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebcec91babf21297022882344c3f7d9eed855931466c3311b1ad6b64befb3df"},
- {file = "tiktoken-0.9.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e5fd49e7799579240f03913447c0cdfa1129625ebd5ac440787afc4345990427"},
- {file = "tiktoken-0.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:26242ca9dc8b58e875ff4ca078b9a94d2f0813e6a535dcd2205df5d49d927cc7"},
- {file = "tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d"},
+ {file = "termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa"},
+ {file = "termcolor-3.1.0.tar.gz", hash = "sha256:6a6dd7fbee581909eeec6a756cff1d7f7c376063b14e4a298dc4980309e55970"},
]
-[package.dependencies]
-regex = ">=2022.1.18"
-requests = ">=2.26.0"
-
[package.extras]
-blobfile = ["blobfile (>=2)"]
+tests = ["pytest", "pytest-cov"]
+
+[[package]]
+name = "threadpoolctl"
+version = "3.6.0"
+description = "threadpoolctl"
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"},
+ {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"},
+]
[[package]]
name = "tokenizers"
-version = "0.21.0"
+version = "0.21.4"
description = ""
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "tokenizers-0.21.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3c4c93eae637e7d2aaae3d376f06085164e1660f89304c0ab2b1d08a406636b2"},
- {file = "tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f53ea537c925422a2e0e92a24cce96f6bc5046bbef24a1652a5edc8ba975f62e"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b177fb54c4702ef611de0c069d9169f0004233890e0c4c5bd5508ae05abf193"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b43779a269f4629bebb114e19c3fca0223296ae9fea8bb9a7a6c6fb0657ff8e"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aeb255802be90acfd363626753fda0064a8df06031012fe7d52fd9a905eb00e"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8b09dbeb7a8d73ee204a70f94fc06ea0f17dcf0844f16102b9f414f0b7463ba"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:400832c0904f77ce87c40f1a8a27493071282f785724ae62144324f171377273"},
- {file = "tokenizers-0.21.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84ca973b3a96894d1707e189c14a774b701596d579ffc7e69debfc036a61a04"},
- {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eb7202d231b273c34ec67767378cd04c767e967fda12d4a9e36208a34e2f137e"},
- {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:089d56db6782a73a27fd8abf3ba21779f5b85d4a9f35e3b493c7bbcbbf0d539b"},
- {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:c87ca3dc48b9b1222d984b6b7490355a6fdb411a2d810f6f05977258400ddb74"},
- {file = "tokenizers-0.21.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4145505a973116f91bc3ac45988a92e618a6f83eb458f49ea0790df94ee243ff"},
- {file = "tokenizers-0.21.0-cp39-abi3-win32.whl", hash = "sha256:eb1702c2f27d25d9dd5b389cc1f2f51813e99f8ca30d9e25348db6585a97e24a"},
- {file = "tokenizers-0.21.0-cp39-abi3-win_amd64.whl", hash = "sha256:87841da5a25a3a5f70c102de371db120f41873b854ba65e52bccd57df5a3780c"},
- {file = "tokenizers-0.21.0.tar.gz", hash = "sha256:ee0894bf311b75b0c03079f33859ae4b2334d675d4e93f5a4132e1eae2834fe4"},
+ {file = "tokenizers-0.21.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133"},
+ {file = "tokenizers-0.21.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b376f5a1aee67b4d29032ee85511bbd1b99007ec735f7f35c8a2eb104eade5"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2107ad649e2cda4488d41dfd031469e9da3fcbfd6183e74e4958fa729ffbf9c6"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c73012da95afafdf235ba80047699df4384fdc481527448a078ffd00e45a7d9"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f23186c40395fc390d27f519679a58023f368a0aad234af145e0f39ad1212732"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc88bb34e23a54cc42713d6d98af5f1bf79c07653d24fe984d2d695ba2c922a2"},
+ {file = "tokenizers-0.21.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51b7eabb104f46c1c50b486520555715457ae833d5aee9ff6ae853d1130506ff"},
+ {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:714b05b2e1af1288bd1bc56ce496c4cebb64a20d158ee802887757791191e6e2"},
+ {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:1340ff877ceedfa937544b7d79f5b7becf33a4cfb58f89b3b49927004ef66f78"},
+ {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3c1f4317576e465ac9ef0d165b247825a2a4078bcd01cba6b54b867bdf9fdd8b"},
+ {file = "tokenizers-0.21.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c212aa4e45ec0bb5274b16b6f31dd3f1c41944025c2358faaa5782c754e84c24"},
+ {file = "tokenizers-0.21.4-cp39-abi3-win32.whl", hash = "sha256:6c42a930bc5f4c47f4ea775c91de47d27910881902b0f20e4990ebe045a415d0"},
+ {file = "tokenizers-0.21.4-cp39-abi3-win_amd64.whl", hash = "sha256:475d807a5c3eb72c59ad9b5fcdb254f6e17f53dfcbb9903233b0dfa9c943b597"},
+ {file = "tokenizers-0.21.4.tar.gz", hash = "sha256:fa23f85fbc9a02ec5c6978da172cdcbac23498c3ca9f3645c5c68740ac007880"},
]
[package.dependencies]
@@ -5400,23 +5334,23 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"]
[[package]]
name = "torch"
-version = "2.6.0+cu118"
+version = "2.6.0+cu124"
description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
- {file = "torch-2.6.0+cu118-cp310-cp310-linux_x86_64.whl", hash = "sha256:715d3b039a629881f263c40d1fb65edac6786da13bfba221b353ef2371c4da86"},
- {file = "torch-2.6.0+cu118-cp310-cp310-win_amd64.whl", hash = "sha256:20cb297f45b11a0bf7ea12070b6d23a65905e7357ebb1800f66a71c52ddb52d9"},
- {file = "torch-2.6.0+cu118-cp311-cp311-linux_x86_64.whl", hash = "sha256:3e73419aab6dbcd888a3cc6a00d1f52f5950d918d7289ea6aeae751346613edc"},
- {file = "torch-2.6.0+cu118-cp311-cp311-win_amd64.whl", hash = "sha256:6ab0417ce9b78ab0a34721a99734b5fd4cc3d7b62ff1c068a7d636fd829772db"},
- {file = "torch-2.6.0+cu118-cp312-cp312-linux_x86_64.whl", hash = "sha256:9f7d170d6c78726945d95fcc3a3d7601f36aed0e6e0dc9ca377a64d6a8fd7b3a"},
- {file = "torch-2.6.0+cu118-cp312-cp312-win_amd64.whl", hash = "sha256:6c040e4181c5dae73b965b61394ec431c93b2018165e2be8f15fc68d44444cb3"},
- {file = "torch-2.6.0+cu118-cp313-cp313-linux_x86_64.whl", hash = "sha256:8d30eb2870ffe05d81ec513bdb08c0f2bab9fd1bd4fbc6e5681fad855c7b99e3"},
- {file = "torch-2.6.0+cu118-cp313-cp313-win_amd64.whl", hash = "sha256:a6bfe22660fb902b5ade933b04c81be7ddc268d1a9f28f843f20c0dee5216edd"},
- {file = "torch-2.6.0+cu118-cp313-cp313t-linux_x86_64.whl", hash = "sha256:771643a2801e199f5a6f7d07803b5604e82ba44d2db1106ad6cc33788326b8ec"},
- {file = "torch-2.6.0+cu118-cp39-cp39-linux_x86_64.whl", hash = "sha256:68d455d5094c0fae420c7f757e6000383f08ac3d8469d0fc11a5e1f8f8c07a54"},
- {file = "torch-2.6.0+cu118-cp39-cp39-win_amd64.whl", hash = "sha256:a673a03197e2e25491a1cd999ba687b674d30dd4d252088ae3c1e597bdb49f2f"},
+ {file = "torch-2.6.0+cu124-cp310-cp310-linux_x86_64.whl", hash = "sha256:7f2ba7f7c0459320a521696f6b5bccc187f59890b23c9dfb6c49b0b87c6bfc97"},
+ {file = "torch-2.6.0+cu124-cp310-cp310-win_amd64.whl", hash = "sha256:7cc45c5b39d74875cfafe908b7f55c544147cc16b01e795feb2fe766583efe78"},
+ {file = "torch-2.6.0+cu124-cp311-cp311-linux_x86_64.whl", hash = "sha256:d4c3e9a8d31a7c0fcbb9da17c31a1917e1fac26c566a4cfbd8c9568ad7cade79"},
+ {file = "torch-2.6.0+cu124-cp311-cp311-win_amd64.whl", hash = "sha256:6a1fb2714e9323f11edb6e8abf7aad5f79e45ad25c081cde87681a18d99c29eb"},
+ {file = "torch-2.6.0+cu124-cp312-cp312-linux_x86_64.whl", hash = "sha256:a393b506844035c0dac2f30ea8478c343b8e95a429f06f3b3cadfc7f53adb597"},
+ {file = "torch-2.6.0+cu124-cp312-cp312-win_amd64.whl", hash = "sha256:3313061c1fec4c7310cf47944e84513dcd27b6173b72a349bb7ca68d0ee6e9c0"},
+ {file = "torch-2.6.0+cu124-cp313-cp313-linux_x86_64.whl", hash = "sha256:0f3bc53c988ce9568cd876a2a5316761e84a8704135ec8068f5f81b4417979cb"},
+ {file = "torch-2.6.0+cu124-cp313-cp313-win_amd64.whl", hash = "sha256:519330eef09534acad8110b6f423d2fe58c1d8e9ada999ed077a637a0021f908"},
+ {file = "torch-2.6.0+cu124-cp313-cp313t-linux_x86_64.whl", hash = "sha256:35cba404c0d742406cdcba1609085874bc60facdfbc50e910c47a92405fef44c"},
+ {file = "torch-2.6.0+cu124-cp39-cp39-linux_x86_64.whl", hash = "sha256:e661267cd0242462ab100bdd67f651988aa9f67eb31609d6909afcac891df612"},
+ {file = "torch-2.6.0+cu124-cp39-cp39-win_amd64.whl", hash = "sha256:c2eb62b99161d87be486c88fd82441274cc892bce8c48dbc28c055cb147732ce"},
]
[package.dependencies]
@@ -5424,17 +5358,19 @@ filelock = "*"
fsspec = "*"
jinja2 = "*"
networkx = "*"
-nvidia-cublas-cu11 = {version = "11.11.3.6", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cuda-cupti-cu11 = {version = "11.8.87", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cuda-nvrtc-cu11 = {version = "11.8.89", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cuda-runtime-cu11 = {version = "11.8.89", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cudnn-cu11 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cufft-cu11 = {version = "10.9.0.58", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-curand-cu11 = {version = "10.3.0.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cusolver-cu11 = {version = "11.4.1.48", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-cusparse-cu11 = {version = "11.7.5.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-nccl-cu11 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
-nvidia-nvtx-cu11 = {version = "11.8.86", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cublas-cu12 = {version = "12.4.5.8", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cuda-cupti-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cuda-nvrtc-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cuda-runtime-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cudnn-cu12 = {version = "9.1.0.70", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cufft-cu12 = {version = "11.2.1.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-curand-cu12 = {version = "10.3.5.147", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cusolver-cu12 = {version = "11.6.1.9", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cusparse-cu12 = {version = "12.3.1.170", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-cusparselt-cu12 = {version = "0.6.2", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-nccl-cu12 = {version = "2.21.5", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-nvjitlink-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
+nvidia-nvtx-cu12 = {version = "12.4.127", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
setuptools = {version = "*", markers = "python_version >= \"3.12\""}
sympy = {version = "1.13.1", markers = "python_version >= \"3.9\""}
triton = {version = "3.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""}
@@ -5446,19 +5382,19 @@ optree = ["optree (>=0.13.0)"]
[package.source]
type = "legacy"
-url = "https://download.pytorch.org/whl/cu118"
+url = "https://download.pytorch.org/whl/cu124"
reference = "torch-cuda"
[[package]]
name = "torchmetrics"
-version = "1.6.2"
+version = "1.8.1"
description = "PyTorch native Metrics"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "torchmetrics-1.6.2-py3-none-any.whl", hash = "sha256:586b970aff33a2154bfb6ed4539a557e9a268b6dce408bbdef0fec99fef3c78b"},
- {file = "torchmetrics-1.6.2.tar.gz", hash = "sha256:a3fa6372dbf01183d0f6fda2159e9526fb62818aa3630660909c290425f67df6"},
+ {file = "torchmetrics-1.8.1-py3-none-any.whl", hash = "sha256:2437501351e0da3d294c71210ce8139b9c762b5e20604f7a051a725443db8f4b"},
+ {file = "torchmetrics-1.8.1.tar.gz", hash = "sha256:04ca021105871637c5d34d0a286b3ab665a1e3d2b395e561f14188a96e862fdb"},
]
[package.dependencies]
@@ -5468,34 +5404,36 @@ packaging = ">17.1"
torch = ">=2.0.0"
[package.extras]
-all = ["SciencePlots (>=2.0.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.15.0)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+all = ["SciencePlots (>=2.0.0)", "einops (>=0.7.0)", "einops (>=0.7.0)", "gammatone (>=1.0.0)", "ipadic (>=1.0.0)", "librosa (>=0.10.0)", "matplotlib (>=3.6.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.17.1)", "nltk (>3.8.1)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "timm (>=0.9.0)", "torch (==2.7.1)", "torch-fidelity (<=0.4.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>=4.43.0)", "transformers (>=4.43.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate", "vmaf-torch (>=1.1.0)"]
audio = ["gammatone (>=1.0.0)", "librosa (>=0.10.0)", "onnxruntime (>=1.12.0)", "pesq (>=0.0.4)", "pystoi (>=0.4.0)", "requests (>=2.19.0)", "torchaudio (>=2.0.1)"]
+clustering = ["torch_linear_assignment (>=0.0.2)"]
detection = ["pycocotools (>2.0.0)", "torchvision (>=0.15.1)"]
-dev = ["PyTDC (==0.4.1) ; python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "bert_score (==0.3.13)", "dython (==0.7.9)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.30)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.15.0)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.3.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.6.0)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>4.4.0)", "transformers (>=4.42.3)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+dev = ["PyTDC (==0.4.1) ; python_version < \"3.10\" or platform_system == \"Windows\" and python_version < \"3.12\"", "SciencePlots (>=2.0.0)", "aeon (>=1.0.0) ; python_version > \"3.10\"", "bert_score (==0.3.13)", "dists-pytorch (==0.1)", "dython (==0.7.9)", "einops (>=0.7.0)", "einops (>=0.7.0)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.6.3)", "gammatone (>=1.0.0)", "huggingface-hub (<0.35)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "librosa (>=0.10.0)", "lpips (<=0.1.4)", "matplotlib (>=3.6.0)", "mecab-ko (>=1.0.0,<1.1.0) ; python_version < \"3.12\"", "mecab-ko-dic (>=1.0.0) ; python_version < \"3.12\"", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.4.0)", "mypy (==1.17.1)", "netcal (>1.0.0)", "nltk (>3.8.1)", "numpy (<2.4.0)", "onnxruntime (>=1.12.0)", "pandas (>1.4.0)", "permetrics (==2.0.0)", "pesq (>=0.0.4)", "piq (<=0.8.0)", "properscoring (==0.1)", "pycocotools (>2.0.0)", "pystoi (>=0.4.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (>=2.19.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "timm (>=0.9.0)", "torch (==2.7.1)", "torch-fidelity (<=0.4.0)", "torch_complex (<0.5.0)", "torch_linear_assignment (>=0.0.2)", "torchaudio (>=2.0.1)", "torchvision (>=0.15.1)", "torchvision (>=0.15.1)", "tqdm (<4.68.0)", "transformers (>=4.43.0)", "transformers (>=4.43.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate", "vmaf-torch (>=1.1.0)"]
image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.15.1)"]
-multimodal = ["piq (<=0.8.0)", "transformers (>=4.42.3)"]
-text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>4.4.0)"]
-typing = ["mypy (==1.15.0)", "torch (==2.6.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+multimodal = ["einops (>=0.7.0)", "piq (<=0.8.0)", "timm (>=0.9.0)", "transformers (>=4.43.0)"]
+text = ["ipadic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>3.8.1)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (<4.68.0)", "transformers (>=4.43.0)"]
+typing = ["mypy (==1.17.1)", "torch (==2.7.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"]
+video = ["einops (>=0.7.0)", "vmaf-torch (>=1.1.0)"]
visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.6.0)"]
[[package]]
name = "torchvision"
-version = "0.21.0+cu118"
+version = "0.21.0+cu124"
description = "image and video datasets and models for torch deep learning"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "torchvision-0.21.0+cu118-cp310-cp310-linux_x86_64.whl", hash = "sha256:aae1fd398fb97a099bd3bd619a85e923c2191d348b90786514c8f81541afd010"},
- {file = "torchvision-0.21.0+cu118-cp310-cp310-win_amd64.whl", hash = "sha256:f64b26eea012d3919fbaedc3162f2b2890002d620a12e2d2f484cff77c2b20e5"},
- {file = "torchvision-0.21.0+cu118-cp311-cp311-linux_x86_64.whl", hash = "sha256:5ebe0267c872ac55b387008f772052bbf1f2fdfdd8afb011d4751e124759295e"},
- {file = "torchvision-0.21.0+cu118-cp311-cp311-win_amd64.whl", hash = "sha256:4e1325aa1189f97c89ae008cf645b7de8f283853193bf68ea7750856c194b6cc"},
- {file = "torchvision-0.21.0+cu118-cp312-cp312-linux_x86_64.whl", hash = "sha256:5d3679e0df9ab1725eaa7300d550cf8fe0a477119483bef12673957f30c768dc"},
- {file = "torchvision-0.21.0+cu118-cp312-cp312-win_amd64.whl", hash = "sha256:301eefd1d4df6619fab94cae539cb0cdcb029cc992e4686ef97c8366f77cf6a4"},
- {file = "torchvision-0.21.0+cu118-cp313-cp313-linux_x86_64.whl", hash = "sha256:2e85300054af1feda7213f578039097ec816683a7ef0b6e199be17f70e220a53"},
- {file = "torchvision-0.21.0+cu118-cp313-cp313-win_amd64.whl", hash = "sha256:c513d44894d09e3b04ff683e71ef3f5503f6d8cdc2b701cad98f4d7eb0c8b570"},
- {file = "torchvision-0.21.0+cu118-cp39-cp39-linux_x86_64.whl", hash = "sha256:35d8bd041e684a7e658ed8bbb747cbe138e3a462b18bd5c08c95657e9c36fbeb"},
- {file = "torchvision-0.21.0+cu118-cp39-cp39-win_amd64.whl", hash = "sha256:521ffecc39798b86e0b51960527f56d54c9ccd8e2b5435768283da5f7de5da56"},
+ {file = "torchvision-0.21.0+cu124-cp310-cp310-linux_x86_64.whl", hash = "sha256:3d3e74018eaa7837c73e3764dad3b7792b7544401c25a42977e9744303731bd3"},
+ {file = "torchvision-0.21.0+cu124-cp310-cp310-win_amd64.whl", hash = "sha256:0c6aefb70ab2b312065240c804e459ac7b0e449867afd469b38d2fd47f9391a7"},
+ {file = "torchvision-0.21.0+cu124-cp311-cp311-linux_x86_64.whl", hash = "sha256:137376805aca5ba57bd2c7a3ecb8569df961dbe82b128aac9b3b0a7125ef9385"},
+ {file = "torchvision-0.21.0+cu124-cp311-cp311-win_amd64.whl", hash = "sha256:000a013584ad2304ab30496318145f284ac364622addb5ee3a5abd2769ba146f"},
+ {file = "torchvision-0.21.0+cu124-cp312-cp312-linux_x86_64.whl", hash = "sha256:efb53ea0af7bf09b7b53e2a18b9be6d245f7d46a90b51d5cf97f37e9b929a991"},
+ {file = "torchvision-0.21.0+cu124-cp312-cp312-win_amd64.whl", hash = "sha256:ec63c2ee792757492da40590e34b14f2fceda29050558c215f0c1f3b08149c0f"},
+ {file = "torchvision-0.21.0+cu124-cp313-cp313-linux_x86_64.whl", hash = "sha256:4b70acf3b4b96a0ceb1374116626c9bef9e8be016b57b1284e482260ca1896d6"},
+ {file = "torchvision-0.21.0+cu124-cp313-cp313-win_amd64.whl", hash = "sha256:8fcf55321b206de70ff8e01c884fa42e57a60b1cb749341b96e0f22c8a7c9ec7"},
+ {file = "torchvision-0.21.0+cu124-cp39-cp39-linux_x86_64.whl", hash = "sha256:6afb21a22f5497e08ea4dbd4544472330d8249bf09dafd239302552cad6906b2"},
+ {file = "torchvision-0.21.0+cu124-cp39-cp39-win_amd64.whl", hash = "sha256:579b6a7fffc34a860c57a7131221ef125831f5961431f8da15760ab1ef752d44"},
]
[package.dependencies]
@@ -5509,7 +5447,7 @@ scipy = ["scipy"]
[package.source]
type = "legacy"
-url = "https://download.pytorch.org/whl/cu118"
+url = "https://download.pytorch.org/whl/cu124"
reference = "torch-cuda"
[[package]]
@@ -5536,71 +5474,75 @@ telegram = ["requests"]
[[package]]
name = "transformers"
-version = "4.49.0"
+version = "4.55.0"
description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
optional = false
python-versions = ">=3.9.0"
groups = ["main"]
files = [
- {file = "transformers-4.49.0-py3-none-any.whl", hash = "sha256:6b4fded1c5fee04d384b1014495b4235a2b53c87503d7d592423c06128cbbe03"},
- {file = "transformers-4.49.0.tar.gz", hash = "sha256:7e40e640b5b8dc3f48743f5f5adbdce3660c82baafbd3afdfc04143cdbd2089e"},
+ {file = "transformers-4.55.0-py3-none-any.whl", hash = "sha256:29d9b8800e32a4a831bb16efb5f762f6a9742fef9fce5d693ed018d19b106490"},
+ {file = "transformers-4.55.0.tar.gz", hash = "sha256:15aa138a05d07a15b30d191ea2c45e23061ebf9fcc928a1318e03fe2234f3ae1"},
]
[package.dependencies]
filelock = "*"
-huggingface-hub = ">=0.26.0,<1.0"
+huggingface-hub = ">=0.34.0,<1.0"
numpy = ">=1.17"
packaging = ">=20.0"
pyyaml = ">=5.1"
regex = "!=2019.12.17"
requests = "*"
-safetensors = ">=0.4.1"
+safetensors = ">=0.4.3"
tokenizers = ">=0.21,<0.22"
tqdm = ">=4.27"
[package.extras]
accelerate = ["accelerate (>=0.26.0)"]
-agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch (>=2.0)"]
-all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision"]
+all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "codecarbon (>=2.8.1)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.6.1,<=0.9)", "librosa", "mistral-common[opencv] (>=1.6.3)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1)", "torchaudio", "torchvision"]
audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
benchmark = ["optimum-benchmark (>=0.3.0)"]
codecarbon = ["codecarbon (>=2.8.1)"]
deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"]
-deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
-dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
-dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"]
-dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=1.0.11)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "libcst", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "optuna", "parameterized (>=0.9)", "protobuf", "psutil", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "kernels (>=0.6.1,<=0.9)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "num2words", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.21,<0.22)", "urllib3 (<2.0.0)"]
+dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (>=2.8.1)", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "kenlm", "kernels (>=0.6.1,<=0.9)", "libcst", "librosa", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "num2words", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "pandas (<2.3.0)", "parameterized (>=0.9)", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (!=1.0.18,<=1.0.19)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1)", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"]
flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
ftfy = ["ftfy"]
-integrations = ["optuna", "ray[tune] (>=2.7.0)", "sigopt"]
+hf-xet = ["hf-xet"]
+hub-kernels = ["kernels (>=0.6.1,<=0.9)"]
+integrations = ["kernels (>=0.6.1,<=0.9)", "optuna", "ray[tune] (>=2.7.0)", "sigopt"]
ja = ["fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "rhoknp (>=1.1.0,<1.3.1)", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)"]
+mistral-common = ["mistral-common[opencv] (>=1.6.3)"]
modelcreation = ["cookiecutter (==1.7.3)"]
natten = ["natten (>=0.14.6,<0.15.0)"]
+num2words = ["num2words"]
onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"]
onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"]
+open-telemetry = ["opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"]
optuna = ["optuna"]
-quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"]
+quality = ["GitPython (<3.1.19)", "datasets (>=2.15.0)", "libcst", "pandas (<2.3.0)", "rich", "ruff (==0.11.2)", "urllib3 (<2.0.0)"]
ray = ["ray[tune] (>=2.7.0)"]
-retrieval = ["datasets (!=2.5.0)", "faiss-cpu"]
-ruff = ["ruff (==0.5.1)"]
+retrieval = ["datasets (>=2.15.0)", "faiss-cpu"]
+ruff = ["ruff (==0.11.2)"]
sagemaker = ["sagemaker (>=2.31.0)"]
sentencepiece = ["protobuf", "sentencepiece (>=0.1.91,!=0.1.92)"]
-serving = ["fastapi", "pydantic", "starlette", "uvicorn"]
+serving = ["accelerate (>=0.26.0)", "fastapi", "openai (>=1.98.0)", "pydantic (>=2)", "starlette", "torch (>=2.1)", "uvicorn"]
sigopt = ["sigopt"]
sklearn = ["scikit-learn"]
speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
-testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-asyncio", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (>=2.15.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "libcst", "mistral-common[opencv] (>=1.6.3)", "nltk (<=3.8.1)", "parameterized (>=0.9)", "psutil", "pydantic (>=2)", "pytest (>=7.2.0)", "pytest-asyncio", "pytest-order", "pytest-rerunfailures", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.11.2)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
tiktoken = ["blobfile", "tiktoken"]
-timm = ["timm (<=1.0.11)"]
+timm = ["timm (!=1.0.18,<=1.0.19)"]
tokenizers = ["tokenizers (>=0.21,<0.22)"]
-torch = ["accelerate (>=0.26.0)", "torch (>=2.0)"]
+torch = ["accelerate (>=0.26.0)", "torch (>=2.1)"]
torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"]
-torchhub = ["filelock", "huggingface-hub (>=0.26.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.21,<0.22)", "torch (>=2.0)", "tqdm (>=4.27)"]
+torchhub = ["filelock", "huggingface-hub (>=0.34.0,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.21,<0.22)", "torch (>=2.1)", "tqdm (>=4.27)"]
video = ["av"]
vision = ["Pillow (>=10.0.1,<=15.0)"]
@@ -5611,7 +5553,7 @@ description = "A language and compiler for custom Deep Learning operations"
optional = false
python-versions = "*"
groups = ["main"]
-markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
+markers = "platform_machine == \"x86_64\" and platform_system == \"Linux\""
files = [
{file = "triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62"},
{file = "triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220"},
@@ -5627,69 +5569,45 @@ tutorials = ["matplotlib", "pandas", "tabulate"]
[[package]]
name = "trl"
-version = "0.15.2"
+version = "0.21.0"
description = "Train transformer language models with reinforcement learning."
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "trl-0.15.2-py3-none-any.whl", hash = "sha256:bf2b88e3cf5da08cd533dc03273d977965bd5d86c5878f76285fba45d9cb9634"},
- {file = "trl-0.15.2.tar.gz", hash = "sha256:0f82190a058a0a194dbcfae1fe9548b68a0a05b2f4d1824f8db1ae7d949cdd47"},
+ {file = "trl-0.21.0-py3-none-any.whl", hash = "sha256:0ac51a49290eb3a188dc187da5bbc95d9edc61395b4a3b4702337dd0cd890e0d"},
+ {file = "trl-0.21.0.tar.gz", hash = "sha256:84dec571e47520e64ccedda94623df13e723fbbd689fd80bf524b9eb0b6d6ca8"},
]
[package.dependencies]
-accelerate = ">=0.34.0"
-datasets = ">=2.21.0"
-rich = "*"
-transformers = ">=4.46.0"
+accelerate = ">=1.4.0"
+datasets = ">=3.0.0"
+transformers = ">=4.55.0"
[package.extras]
-deepspeed = ["deepspeed (>=0.14.4) ; sys_platform != \"win32\""]
-dev = ["Pillow", "Pillow", "bitsandbytes", "bitsandbytes", "deepspeed (>=0.14.4) ; sys_platform != \"win32\"", "deepspeed (>=0.14.4) ; sys_platform != \"win32\"", "diffusers (>=0.18.0)", "diffusers (>=0.18.0)", "liger-kernel (==0.5.3) ; sys_platform != \"win32\"", "liger-kernel (==0.5.3) ; sys_platform != \"win32\"", "llm-blender (>=0.0.2)", "llm-blender (>=0.0.2)", "mergekit (>=0.0.5.1)", "mergekit (>=0.0.5.1)", "openai (>=1.23.2)", "openai (>=1.23.2)", "parameterized", "parameterized", "peft (>=0.8.0)", "peft (>=0.8.0)", "pytest", "pytest", "pytest-cov", "pytest-cov", "pytest-rerunfailures", "pytest-rerunfailures", "pytest-xdist", "pytest-xdist", "scikit-learn", "scikit-learn", "vllm (==0.7.2) ; sys_platform != \"win32\"", "vllm (==0.7.2) ; sys_platform != \"win32\""]
+bco = ["joblib", "scikit-learn"]
+deepspeed = ["deepspeed (>=0.14.4)"]
+dev = ["Pillow", "bitsandbytes", "deepspeed (>=0.14.4)", "diffusers (>=0.18.0)", "joblib", "liger-kernel (>=0.5.9)", "llm-blender (>=0.0.2)", "num2words", "openai (>=1.23.2)", "parameterized", "peft (>=0.8.0)", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "scikit-learn", "scikit-learn", "torchvision"]
diffusers = ["diffusers (>=0.18.0)"]
judges = ["llm-blender (>=0.0.2)", "openai (>=1.23.2)"]
-liger = ["liger-kernel (==0.5.3) ; sys_platform != \"win32\""]
-mergekit = ["mergekit (>=0.0.5.1)"]
+liger = ["liger-kernel (>=0.5.9)"]
peft = ["peft (>=0.8.0)"]
quantization = ["bitsandbytes"]
scikit = ["scikit-learn"]
test = ["parameterized", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist"]
-vllm = ["vllm (==0.7.2) ; sys_platform != \"win32\""]
-vlm = ["Pillow"]
-
-[[package]]
-name = "twine"
-version = "5.1.1"
-description = "Collection of utilities for publishing packages on PyPI"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "twine-5.1.1-py3-none-any.whl", hash = "sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997"},
- {file = "twine-5.1.1.tar.gz", hash = "sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db"},
-]
-
-[package.dependencies]
-importlib-metadata = ">=3.6"
-keyring = ">=15.1"
-pkginfo = ">=1.8.1,<1.11"
-readme-renderer = ">=35.0"
-requests = ">=2.20"
-requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0"
-rfc3986 = ">=1.4.0"
-rich = ">=12.0.0"
-urllib3 = ">=1.26.0"
+vllm = ["fastapi ; python_version < \"3.13\"", "pydantic ; python_version < \"3.13\"", "requests ; python_version < \"3.13\"", "uvicorn ; python_version < \"3.13\"", "vllm (>=0.10.0) ; python_version < \"3.13\""]
+vlm = ["Pillow", "num2words", "torchvision"]
[[package]]
name = "typer"
-version = "0.15.2"
+version = "0.16.0"
description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "typer-0.15.2-py3-none-any.whl", hash = "sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc"},
- {file = "typer-0.15.2.tar.gz", hash = "sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5"},
+ {file = "typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855"},
+ {file = "typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b"},
]
[package.dependencies]
@@ -5700,26 +5618,26 @@ typing-extensions = ">=3.7.4.3"
[[package]]
name = "types-pyyaml"
-version = "6.0.12.20250326"
+version = "6.0.12.20250809"
description = "Typing stubs for PyYAML"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "types_pyyaml-6.0.12.20250326-py3-none-any.whl", hash = "sha256:961871cfbdc1ad8ae3cb6ae3f13007262bcfc168adc513119755a6e4d5d7ed65"},
- {file = "types_pyyaml-6.0.12.20250326.tar.gz", hash = "sha256:5e2d86d8706697803f361ba0b8188eef2999e1c372cd4faee4ebb0844b8a4190"},
+ {file = "types_pyyaml-6.0.12.20250809-py3-none-any.whl", hash = "sha256:032b6003b798e7de1a1ddfeefee32fac6486bdfe4845e0ae0e7fb3ee4512b52f"},
+ {file = "types_pyyaml-6.0.12.20250809.tar.gz", hash = "sha256:af4a1aca028f18e75297da2ee0da465f799627370d74073e96fee876524f61b5"},
]
[[package]]
name = "types-requests"
-version = "2.32.0.20250306"
+version = "2.32.4.20250809"
description = "Typing stubs for requests"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "types_requests-2.32.0.20250306-py3-none-any.whl", hash = "sha256:25f2cbb5c8710b2022f8bbee7b2b66f319ef14aeea2f35d80f18c9dbf3b60a0b"},
- {file = "types_requests-2.32.0.20250306.tar.gz", hash = "sha256:0962352694ec5b2f95fda877ee60a159abdf84a0fc6fdace599f20acb41a03d1"},
+ {file = "types_requests-2.32.4.20250809-py3-none-any.whl", hash = "sha256:f73d1832fb519ece02c85b1f09d5f0dd3108938e7d47e7f94bbfa18a6782b163"},
+ {file = "types_requests-2.32.4.20250809.tar.gz", hash = "sha256:d8060de1c8ee599311f56ff58010fb4902f462a1470802cf9f6ed27bc46c4df3"},
]
[package.dependencies]
@@ -5727,54 +5645,53 @@ urllib3 = ">=2"
[[package]]
name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
+version = "4.14.1"
+description = "Backported and Experimental Type Hints for Python 3.9+"
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
+ {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"},
+ {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"},
]
[[package]]
-name = "typing-inspect"
-version = "0.9.0"
-description = "Runtime inspection utilities for typing module."
+name = "typing-inspection"
+version = "0.4.1"
+description = "Runtime typing introspection tools"
optional = false
-python-versions = "*"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"},
- {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"},
+ {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"},
+ {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"},
]
[package.dependencies]
-mypy-extensions = ">=0.3.0"
-typing-extensions = ">=3.7.4"
+typing-extensions = ">=4.12.0"
[[package]]
name = "tzdata"
-version = "2025.1"
+version = "2025.2"
description = "Provider of IANA time zone data"
optional = false
python-versions = ">=2"
groups = ["main"]
files = [
- {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"},
- {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"},
+ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
+ {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
]
[[package]]
name = "urllib3"
-version = "2.3.0"
+version = "2.5.0"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.9"
groups = ["main", "dev"]
files = [
- {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
- {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
+ {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
]
[package.extras]
@@ -5783,16 +5700,63 @@ h2 = ["h2 (>=4,<5)"]
socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
zstd = ["zstandard (>=0.18.0)"]
+[[package]]
+name = "uv"
+version = "0.7.22"
+description = "An extremely fast Python package and project manager, written in Rust."
+optional = false
+python-versions = ">=3.8"
+groups = ["dev"]
+files = [
+ {file = "uv-0.7.22-py3-none-linux_armv6l.whl", hash = "sha256:995bdc2d8ec75620544bad1bea389334c740ff4aeeb42fbee93107b0780fa1d2"},
+ {file = "uv-0.7.22-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:bc2d9d49b8bc83ef2a0cbfd39926e2112059b9ddddb7e3baa31726cce33c707b"},
+ {file = "uv-0.7.22-py3-none-macosx_11_0_arm64.whl", hash = "sha256:573edda226dc26e6fea03aa89a45af2f2a367ad1f466af15c4eb54286dae042f"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:c366847fc6260c3fa101be0a99ed1ac8613537ea3ec4fa6e4aac5d1a173945ec"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:706393788882cca2581d681fcf51bcbd5b04aa695e9dad41c048219f6a2a0b0a"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f61c122ef8d6679dab90a24c3a2c4c688b6b3112e6e2735ae1590784520fc82b"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b4660613c1fd86f607856e21fd2700bc19ae39fedcfc5865434ddbd3b76b39ae"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e3178dd8b118d61ffbf59297417ee0a5136b3fe34bca76105ce78a2854d9e6a2"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d7a4dbf219bcabefc760498b0b137a85966673ed43580f9dc339ff2bdaae73"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:560b00403b9cf82e2ae7d6d680c6d54c3f5c709b3b6357e092059c5d4b682baa"},
+ {file = "uv-0.7.22-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:996f50ba85a21da7bb3d6b08be952d3fe06bede3573a50fb576d2fa77d72b1ed"},
+ {file = "uv-0.7.22-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:b2abb6c638afcd5fd020284a2f36b71d41277675d23732691dc92dd4376db4b8"},
+ {file = "uv-0.7.22-py3-none-musllinux_1_1_i686.whl", hash = "sha256:8a66db63e0220a0d05bf9836c1b35fd8562a8d28f6989b412c914dbc4be15e16"},
+ {file = "uv-0.7.22-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:49a78e2703d26de1b95730a1310505debb121a178732f8dc321ed99de8eca708"},
+ {file = "uv-0.7.22-py3-none-win32.whl", hash = "sha256:e6115997907151e28858c238f7af18782d3ed4c24e2c0572710e05f08895cb19"},
+ {file = "uv-0.7.22-py3-none-win_amd64.whl", hash = "sha256:d476f10783d1a9d49fa14fd9447fc694c75d3a93a7ff237a12bbc69eb9d29c27"},
+ {file = "uv-0.7.22-py3-none-win_arm64.whl", hash = "sha256:8c478034d422b99327c58914463c0841aed0bc1e8edf231ff861e191cdfea862"},
+ {file = "uv-0.7.22.tar.gz", hash = "sha256:f5cf159907d594e33433f14737d1ee843dc8799edfcf57b5b8c0f282d1117051"},
+]
+
+[[package]]
+name = "uvicorn"
+version = "0.35.0"
+description = "The lightning-fast ASGI server."
+optional = false
+python-versions = ">=3.9"
+groups = ["main"]
+files = [
+ {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"},
+ {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"},
+]
+
+[package.dependencies]
+click = ">=7.0"
+h11 = ">=0.8"
+
+[package.extras]
+standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"]
+
[[package]]
name = "virtualenv"
-version = "20.29.3"
+version = "20.33.1"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "virtualenv-20.29.3-py3-none-any.whl", hash = "sha256:3e3d00f5807e83b234dfb6122bf37cfadf4be216c53a49ac059d02414f819170"},
- {file = "virtualenv-20.29.3.tar.gz", hash = "sha256:95e39403fcf3940ac45bc717597dba16110b74506131845d9b687d5e73d947ac"},
+ {file = "virtualenv-20.33.1-py3-none-any.whl", hash = "sha256:07c19bc66c11acab6a5958b815cbcee30891cd1c2ccf53785a28651a0d8d8a67"},
+ {file = "virtualenv-20.33.1.tar.gz", hash = "sha256:1b44478d9e261b3fb8baa5e74a0ca3bc0e05f21aa36167bf9cbf850e542765b8"},
]
[package.dependencies]
@@ -5802,47 +5766,65 @@ platformdirs = ">=3.9.1,<5"
[package.extras]
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
-test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"GraalVM\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""]
+
+[[package]]
+name = "waitress"
+version = "3.0.2"
+description = "Waitress WSGI server"
+optional = false
+python-versions = ">=3.9.0"
+groups = ["main"]
+markers = "platform_system == \"Windows\""
+files = [
+ {file = "waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e"},
+ {file = "waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f"},
+]
+
+[package.extras]
+docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"]
+testing = ["coverage (>=7.6.0)", "pytest", "pytest-cov"]
[[package]]
name = "wandb"
-version = "0.18.0"
+version = "0.21.1"
description = "A CLI and library for interacting with the Weights & Biases API."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "wandb-0.18.0-py3-none-any.whl", hash = "sha256:a176af0d51b55a363dac3c54a8b7aa1cfd5a89cad6fc6574237232f37c779965"},
- {file = "wandb-0.18.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:2bc7f18becda9a566a63723666390f941e8b115b9e7746e0e5d73dc9ea9714c6"},
- {file = "wandb-0.18.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e14a385c95e61e77b0b5c4cbc6c5a0b47ac0d9e66730ca8c17b84eba374e35d1"},
- {file = "wandb-0.18.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0764ad8911a70cdb7cb339567c4170b860e8f5f523447b2f748d7e0e6224e29"},
- {file = "wandb-0.18.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d2ffea43710e3482168a2d89b2770aa9a14007ba16e717b176428f2a50765f2"},
- {file = "wandb-0.18.0-py3-none-win32.whl", hash = "sha256:b209840a9499bf687e8b5b20117341e7722f86a85f986c422501eb1a709dc721"},
- {file = "wandb-0.18.0-py3-none-win_amd64.whl", hash = "sha256:25aa8ee1808eae0c0e4818b81bc43fd6461e4f3603d7918e5eab2f9afca00715"},
- {file = "wandb-0.18.0.tar.gz", hash = "sha256:872dfd7298c053ca861352196bc422452caff105d3bc66b90e7bc86f17ad8bdd"},
+ {file = "wandb-0.21.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:96f9eedeae428de0d88f9751fb81f1b730ae7902f35c2f5a7a904d7733f124f3"},
+ {file = "wandb-0.21.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:41a1ec1b98d9d7e1bcafc483bce82e184b6cbae7531328a0fe8dd0f56d96a92e"},
+ {file = "wandb-0.21.1-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:f74d4691c38318ed8611e00ca3246b4152a03ff390fdce41816bea5705452a73"},
+ {file = "wandb-0.21.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8fbd60b9abf4b9bec201f311602f61394d41a3503c801750b03975a5e36d1b"},
+ {file = "wandb-0.21.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ded9313672630c0630f5b13c598ce9aa0e932e811ebc18823fcc4d73acfb6bb"},
+ {file = "wandb-0.21.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:44f3194d697b409f91708c50c5f9d56e282434a0d60ac380b64f0fb6991cd630"},
+ {file = "wandb-0.21.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e0b68bb6dbe94f1910c665c755f438292df40c272feb1a8b42208c1df52cce26"},
+ {file = "wandb-0.21.1-py3-none-win32.whl", hash = "sha256:98306c3fb369dfafb7194270b938b000ea2bb08dbddff10c19b5a805fd5cab80"},
+ {file = "wandb-0.21.1-py3-none-win_amd64.whl", hash = "sha256:8be92a7e92b5cb5ce00ec0961f9dbaad7757ffdbc5b5a8f2cc7188e23f653f0a"},
+ {file = "wandb-0.21.1.tar.gz", hash = "sha256:753bbdaa3a7703344056e019425b39c17a3d31d8ca0c4d13c4efc046935b08b9"},
]
[package.dependencies]
click = ">=7.1,<8.0.0 || >8.0.0"
-docker-pycreds = ">=0.4.0"
gitpython = ">=1.0.0,<3.1.29 || >3.1.29"
+packaging = "*"
platformdirs = "*"
-protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<6", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}
-psutil = ">=5.0.0"
+protobuf = {version = ">=3.19.0,<4.21.0 || >4.21.0,<5.28.0 || >5.28.0,<7", markers = "python_version > \"3.9\" or sys_platform != \"linux\""}
+pydantic = "<3"
pyyaml = "*"
requests = ">=2.0.0,<3"
-sentry-sdk = ">=1.0.0"
-setproctitle = "*"
-setuptools = "*"
+sentry-sdk = ">=2.0.0"
+typing-extensions = ">=4.8,<5"
[package.extras]
-aws = ["boto3"]
+aws = ["boto3", "botocore (>=1.5.76)"]
azure = ["azure-identity", "azure-storage-blob"]
gcp = ["google-cloud-storage"]
importers = ["filelock", "mlflow", "polars (<=1.2.1)", "rich", "tenacity"]
kubeflow = ["google-cloud-storage", "kubernetes", "minio", "sh"]
-launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "typing-extensions"]
-media = ["bokeh", "moviepy", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit-pypi", "soundfile"]
+launch = ["awscli", "azure-containerregistry", "azure-identity", "azure-storage-blob", "boto3", "botocore (>=1.5.76)", "chardet", "google-auth", "google-cloud-aiplatform", "google-cloud-artifact-registry", "google-cloud-compute", "google-cloud-storage", "iso8601", "jsonschema", "kubernetes", "kubernetes-asyncio", "nbconvert", "nbformat", "optuna", "pydantic", "pyyaml (>=6.0.0)", "tomli", "tornado (>=6.5.0) ; python_version >= \"3.9\"", "typing-extensions"]
+media = ["bokeh", "imageio (>=2.28.1)", "moviepy (>=1.0.0)", "numpy", "pillow", "plotly (>=5.18.0)", "rdkit", "soundfile"]
models = ["cloudpickle"]
perf = ["orjson"]
sweeps = ["sweeps (>=0.2.0)"]
@@ -5928,109 +5910,38 @@ files = [
]
[[package]]
-name = "wheel"
-version = "0.45.1"
-description = "A built-package format for Python"
+name = "werkzeug"
+version = "3.1.3"
+description = "The comprehensive WSGI web application library."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"},
- {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"},
+ {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"},
+ {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"},
]
+[package.dependencies]
+MarkupSafe = ">=2.1.1"
+
[package.extras]
-test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
+watchdog = ["watchdog (>=2.3)"]
[[package]]
-name = "wrapt"
-version = "1.17.2"
-description = "Module for decorators, wrappers and monkey patching."
+name = "wheel"
+version = "0.45.1"
+description = "A built-package format for Python"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"},
- {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"},
- {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"},
- {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"},
- {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"},
- {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"},
- {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"},
- {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"},
- {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"},
- {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"},
- {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"},
- {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"},
- {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"},
- {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"},
- {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"},
- {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"},
- {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"},
- {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"},
- {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"},
- {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"},
- {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"},
- {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"},
- {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"},
- {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"},
- {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"},
- {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"},
- {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"},
- {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"},
- {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"},
- {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"},
- {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"},
- {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"},
- {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"},
- {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"},
- {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"},
- {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"},
- {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"},
- {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"},
+ {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"},
+ {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"},
]
+[package.extras]
+test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
+
[[package]]
name = "xxhash"
version = "3.5.0"
@@ -6166,111 +6077,133 @@ files = [
[[package]]
name = "yarl"
-version = "1.18.3"
+version = "1.20.1"
description = "Yet another URL library"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"},
- {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"},
- {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"},
- {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"},
- {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"},
- {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"},
- {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"},
- {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"},
- {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"},
- {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"},
- {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"},
- {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"},
- {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"},
- {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"},
- {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"},
- {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"},
- {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"},
- {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"},
- {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"},
- {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"},
- {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"},
- {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"},
- {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"},
- {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"},
- {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"},
- {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"},
- {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"},
- {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"},
+ {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6032e6da6abd41e4acda34d75a816012717000fa6839f37124a47fcefc49bec4"},
+ {file = "yarl-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c7b34d804b8cf9b214f05015c4fee2ebe7ed05cf581e7192c06555c71f4446a"},
+ {file = "yarl-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c869f2651cc77465f6cd01d938d91a11d9ea5d798738c1dc077f3de0b5e5fed"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62915e6688eb4d180d93840cda4110995ad50c459bf931b8b3775b37c264af1e"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:41ebd28167bc6af8abb97fec1a399f412eec5fd61a3ccbe2305a18b84fb4ca73"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21242b4288a6d56f04ea193adde174b7e347ac46ce6bc84989ff7c1b1ecea84e"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bea21cdae6c7eb02ba02a475f37463abfe0a01f5d7200121b03e605d6a0439f8"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f8a891e4a22a89f5dde7862994485e19db246b70bb288d3ce73a34422e55b23"},
+ {file = "yarl-1.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd803820d44c8853a109a34e3660e5a61beae12970da479cf44aa2954019bf70"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b982fa7f74c80d5c0c7b5b38f908971e513380a10fecea528091405f519b9ebb"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:33f29ecfe0330c570d997bcf1afd304377f2e48f61447f37e846a6058a4d33b2"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:835ab2cfc74d5eb4a6a528c57f05688099da41cf4957cf08cad38647e4a83b30"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:46b5e0ccf1943a9a6e766b2c2b8c732c55b34e28be57d8daa2b3c1d1d4009309"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:df47c55f7d74127d1b11251fe6397d84afdde0d53b90bedb46a23c0e534f9d24"},
+ {file = "yarl-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76d12524d05841276b0e22573f28d5fbcb67589836772ae9244d90dd7d66aa13"},
+ {file = "yarl-1.20.1-cp310-cp310-win32.whl", hash = "sha256:6c4fbf6b02d70e512d7ade4b1f998f237137f1417ab07ec06358ea04f69134f8"},
+ {file = "yarl-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:aef6c4d69554d44b7f9d923245f8ad9a707d971e6209d51279196d8e8fe1ae16"},
+ {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e"},
+ {file = "yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b"},
+ {file = "yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8"},
+ {file = "yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1"},
+ {file = "yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e"},
+ {file = "yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773"},
+ {file = "yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e"},
+ {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9"},
+ {file = "yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a"},
+ {file = "yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd"},
+ {file = "yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a"},
+ {file = "yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004"},
+ {file = "yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5"},
+ {file = "yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698"},
+ {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a"},
+ {file = "yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3"},
+ {file = "yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5"},
+ {file = "yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b"},
+ {file = "yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1"},
+ {file = "yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7"},
+ {file = "yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c"},
+ {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d"},
+ {file = "yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf"},
+ {file = "yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3"},
+ {file = "yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458"},
+ {file = "yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e"},
+ {file = "yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d"},
+ {file = "yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f"},
+ {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e42ba79e2efb6845ebab49c7bf20306c4edf74a0b20fc6b2ccdd1a219d12fad3"},
+ {file = "yarl-1.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:41493b9b7c312ac448b7f0a42a089dffe1d6e6e981a2d76205801a023ed26a2b"},
+ {file = "yarl-1.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f5a5928ff5eb13408c62a968ac90d43f8322fd56d87008b8f9dabf3c0f6ee983"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c41ad5d717b3961b2dd785593b67d386b73feca30522048d37298fee981805"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:59febc3969b0781682b469d4aca1a5cab7505a4f7b85acf6db01fa500fa3f6ba"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d2b6fb3622b7e5bf7a6e5b679a69326b4279e805ed1699d749739a61d242449e"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:749d73611db8d26a6281086f859ea7ec08f9c4c56cec864e52028c8b328db723"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9427925776096e664c39e131447aa20ec738bdd77c049c48ea5200db2237e000"},
+ {file = "yarl-1.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff70f32aa316393eaf8222d518ce9118148eddb8a53073c2403863b41033eed5"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c7ddf7a09f38667aea38801da8b8d6bfe81df767d9dfc8c88eb45827b195cd1c"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:57edc88517d7fc62b174fcfb2e939fbc486a68315d648d7e74d07fac42cec240"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dab096ce479d5894d62c26ff4f699ec9072269d514b4edd630a393223f45a0ee"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:14a85f3bd2d7bb255be7183e5d7d6e70add151a98edf56a770d6140f5d5f4010"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c89b5c792685dd9cd3fa9761c1b9f46fc240c2a3265483acc1565769996a3f8"},
+ {file = "yarl-1.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:69e9b141de5511021942a6866990aea6d111c9042235de90e08f94cf972ca03d"},
+ {file = "yarl-1.20.1-cp39-cp39-win32.whl", hash = "sha256:b5f307337819cdfdbb40193cad84978a029f847b0a357fbe49f712063cfc4f06"},
+ {file = "yarl-1.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:eae7bfe2069f9c1c5b05fc7fe5d612e5bbc089a39309904ee8b829e322dcad00"},
+ {file = "yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77"},
+ {file = "yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac"},
]
[package.dependencies]
idna = ">=2.0"
multidict = ">=4.0"
-propcache = ">=0.2.0"
+propcache = ">=0.2.1"
[[package]]
name = "zipp"
-version = "3.21.0"
+version = "3.23.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
- {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
+ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"},
+ {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"},
]
[package.extras]
@@ -6278,123 +6211,10 @@ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
-test = ["big-O", "importlib-resources ; python_version < \"3.9\"", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
+test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
type = ["pytest-mypy"]
-[[package]]
-name = "zstandard"
-version = "0.23.0"
-description = "Zstandard bindings for Python"
-optional = false
-python-versions = ">=3.8"
-groups = ["main"]
-files = [
- {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"},
- {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"},
- {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"},
- {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"},
- {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"},
- {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"},
- {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"},
- {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"},
- {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"},
- {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"},
- {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"},
- {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"},
- {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"},
- {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"},
- {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"},
- {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"},
- {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"},
- {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"},
- {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"},
- {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"},
- {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"},
- {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"},
- {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"},
- {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"},
- {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"},
- {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"},
- {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"},
- {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"},
- {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"},
- {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"},
- {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"},
- {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"},
- {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"},
- {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"},
- {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"},
- {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"},
- {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"},
- {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"},
- {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"},
- {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"},
- {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"},
- {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"},
- {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"},
- {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"},
- {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"},
- {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"},
- {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"},
- {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"},
- {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"},
- {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"},
- {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"},
- {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"},
- {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"},
- {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"},
- {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"},
- {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"},
- {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"},
- {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"},
- {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"},
- {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"},
- {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"},
-]
-
-[package.dependencies]
-cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""}
-
-[package.extras]
-cffi = ["cffi (>=1.11)"]
-
[metadata]
lock-version = "2.1"
python-versions = ">=3.11, <=3.13"
-content-hash = "a222fabd5a92788ff0de47d54af9e15ce8afac8eb87b54015cb1c0d6cb175abb"
+content-hash = "f8252d00c64b6c5a3674bb8a6cdd95ad2a9da06778bf3f5c4c2c8111b775cc86"
diff --git a/pyproject.toml b/pyproject.toml
index 87a2e02..ad8909f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,34 +1,41 @@
-[project]
+[tool.poetry]
name = "llm-lora"
version = "0.1.0"
description = "Project for LLM training"
-authors = [
- {name = "Timur Komolov",email = "komolov.timurka@mail.ru"}
-]
-license = {text = "MIT"}
+authors = ["Timur Komolov "]
+license = "MIT"
readme = "README.md"
-requires-python = ">=3.11, <=3.13"
[tool.poetry.dependencies]
-transformers = ">=4.49.0,<5.0.0"
-peft = ">=0.14.0,<0.15.5"
-hydra-core = ">=1.3.2,<2.0.0"
-requests = ">=2.32.3,<3.0.0"
-trl = ">=0.15.2,<0.16.0"
-deepeval = ">=2.5.2,<3.0.0"
-numpy = ">=1.23.5, <2.0.0"
-torchmetrics = ">=1.6.2,<2.0.0"
-mistralai = ">=1.5.2,<2.0.0"
+python = ">=3.11, <=3.13"
+transformers = ">=4.53.0"
+
+peft = ">=0.14.0"
+hydra-core = ">=1.3.2"
+requests = ">=2.32.3"
+trl = ">=0.15.2"
+deepeval = ">=2.5.2"
+numpy = ">=1.23.5,<2.0.0"
+torchmetrics = ">=1.6.2"
+mistralai = ">=1.5.2"
wandb = ">=0.18"
-bitsandbytes = ">=0.45.3,<0.46.0"
+bitsandbytes = ">=0.45.3"
torch = { version = "2.6.0", source = "torch-cuda" }
torchvision = { version = "0.21.0", source = "torch-cuda" }
sentencepiece = "^0.2.0"
-huggingface-hub = "^0.29.3"
-llama-cpp-python = {version = "^0.3.8", extras = ["cublas"] }
+huggingface-hub = ">=0.34.0,<1.0"
+llama-cpp-python = { version = "^0.3.8,<0.3.15", extras = ["cublas"] }
scipy = "^1.15.2"
ollama = "^0.4.7"
-
+ninja = "^1.11.1.4"
+mlflow = "^3.3.1"
+fire = "^0.7.0"
+optuna = "^4.4.0"
+python-dotenv = "^1.1.1"
+myst-parser = "^4.0.1"
+adam-mini = "^1.1.1"
+psutil = "^7.0.0"
+nvidia-ml-py = "^13.580.82"
[tool.poetry.group.dev.dependencies]
pre-commit = "^4.1.0"
@@ -37,18 +44,97 @@ sphinx = "^8.2.3"
autodocsumm = "^0.2.14"
types-requests = "^2.32.0.20250306"
types-pyyaml = "^6.0.12.20250326"
+uv = "^0.7.16"
+sphinx-rtd-theme = "^3.0.2"
+ruff = "^0.8.4"
+bandit = "^1.7.10"
+codespell = "^2.3.0"
[[tool.poetry.source]]
name = "torch-cuda"
-url = "https://download.pytorch.org/whl/cu118"
+url = "https://download.pytorch.org/whl/cu124"
priority = "explicit"
+[tool.pytest.ini_options]
+testpaths = ["tests"]
+python_files = ["test_*.py", "*_test.py"]
+python_classes = ["Test*"]
+python_functions = ["test_*"]
+addopts = [
+ "--strict-markers",
+ "--strict-config",
+ "--verbose",
+ "--tb=short",
+]
+markers = [
+ "unit: Unit tests",
+ "integration: Integration tests",
+ "slow: Slow tests",
+ "gpu: Tests requiring GPU",
+]
+filterwarnings = [
+ "ignore::DeprecationWarning",
+ "ignore::UserWarning",
+]
+
+[tool.ruff]
+line-length = 95
+target-version = "py311"
+
+[tool.ruff.lint]
+select = ["E","F","W","B","N","ANN","S","I","UP","RET","SIM","RUF","LOG","PLC","PERF","COM","PD"]
+ignore = ["E203", "W605", "PLR0913", "PLR0915", "PLR2004", "COM812",
+ "TRY003", "RET504", "S101", "ANN401", "S603", "RUF001", "RUF002"]
+
+[tool.ruff.lint.per-file-ignores]
+"docs/*" = ["ANN"]
+"vk_bot/*" = ["N999", "ANN001", "ANN201"]
+"training_model/*" = ["S105", "SIM108"]
+"legacy/*" = ["ALL"]
+"tools/*" = ["ALL"]
+"training_model/types.py" = ["UP007", "PYI036"]
+"tests/*" = ["ANN001"]
+
+[tool.ruff.lint.isort]
+known-first-party = ["training_model"]
+
+[tool.black]
+line-length = 95
+target-version = ["py311", "py312", "py313"]
+include = '\.pyi?$'
+extend-exclude = '''
+/(
+ # directories
+ \.eggs
+ | \.git
+ | \.hg
+ | \.mypy_cache
+ | \.tox
+ | \.venv
+ | _build
+ | buck-out
+ | build
+ | dist
+)/
+'''
+
+
+[tool.bandit]
+exclude_dirs = ["tests", "docs"]
+skips = ["B101", "B601", "B404", "B603", "B607"]
+# Skip assert_used, shell_injection_process_start, subprocess import, subprocess calls
+
+[tool.bandit.assert_used]
+exclude = ["*test*.py", "*conftest*.py"]
+
+[tool.codespell]
+skip = "*.git,*.svg,*.pdf,*.pyc,*/_build/*,*/venv/*,*/node_modules/*"
+ignore-words-list = "ist,alist,hass,tha,ente"
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
-
[tool.poetry-auto-export]
output = "requirements.txt"
without_hashes = true
diff --git a/requirements.txt b/requirements.txt
index 528757d..11de733 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,214 +1,203 @@
-# poetry.lock hash: 31255f8a3817ae2eb30f06cf786845ffa9a197fe
+# poetry.lock hash: 56f4738ec601c5e714c0f02ca6c3d9fdf0eac5d3
# This file is generated by poetry-auto-export
# The SHA1 hash of the poetry.lock file is printed above
---extra-index-url https://download.pytorch.org/whl/cu118
+--extra-index-url https://download.pytorch.org/whl/cu124
-accelerate==1.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-aiohappyeyeballs==2.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-aiohttp==3.11.13 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-aiosignal==1.3.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+accelerate==1.10.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+adam-mini==1.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+aiohappyeyeballs==2.6.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+aiohttp==3.12.15 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+aiosignal==1.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+alabaster==1.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+alembic==1.16.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
annotated-types==0.7.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-anthropic==0.49.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+anthropic==0.62.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
antlr4-python3-runtime==4.9.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-anyio==4.8.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-attrs==25.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+anyio==4.10.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+attrs==25.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+babel==2.17.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
backoff==2.2.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-backports-tarfile==1.2.0 ; python_version == "3.11"
-beautifulsoup4==4.13.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-bitsandbytes==0.45.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-black==25.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+bitsandbytes==0.46.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+blinker==1.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
cachetools==5.5.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-certifi==2025.1.31 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-cffi==1.17.1 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_python_implementation == "PyPy" or sys_platform == "linux")
-charset-normalizer==3.4.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-click==8.1.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+certifi==2025.8.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+cffi==1.17.1 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_python_implementation != "PyPy"
+charset-normalizer==3.4.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+click==8.2.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+cloudpickle==3.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
colorama==0.4.6 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_system == "Windows" or sys_platform == "win32")
-coverage==7.7.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-cryptography==44.0.2 ; python_version >= "3.11" and python_full_version <= "3.13.0" and sys_platform == "linux"
-dataclasses-json==0.6.7 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-datasets==3.3.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-deepeval==2.7.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-deprecated==1.2.18 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+colorlog==6.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+contourpy==1.3.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+cryptography==45.0.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+cycler==0.12.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+databricks-sdk==0.64.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+datasets==4.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+deepeval==3.3.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
dill==0.3.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-dirtyjson==1.0.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
diskcache==5.6.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
distro==1.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-docker-pycreds==0.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-docstring-parser==0.16 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+docker==7.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
docutils==0.21.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
eval-type-backport==0.2.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
execnet==2.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-filelock==3.17.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-filetype==1.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-frozenlist==1.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-fsspec==2024.12.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-fsspec[http]==2024.12.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+fastapi==0.116.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+filelock==3.18.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+fire==0.7.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+flask==3.1.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+fonttools==4.59.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+frozenlist==1.7.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+fsspec==2025.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
gitdb==4.0.12 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-gitpython==3.1.44 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-google-auth==2.38.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-google-genai==1.10.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-googleapis-common-protos==1.69.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-greenlet==3.1.1 ; python_full_version <= "3.13.0" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version >= "3.11"
-grpcio==1.70.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-h11==0.14.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-httpcore==1.0.7 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-httpx-sse==0.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+gitpython==3.1.45 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+google-auth==2.40.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+google-genai==1.29.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+googleapis-common-protos==1.70.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+graphene==3.4.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+graphql-core==3.2.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+graphql-relay==3.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+greenlet==3.2.4 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32")
+grpcio==1.74.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+gunicorn==23.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_system != "Windows"
+h11==0.16.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+hf-xet==1.1.7 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "arm64" or platform_machine == "aarch64")
+httpcore==1.0.9 ; python_version >= "3.11" and python_full_version <= "3.13.0"
httpx==0.28.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-huggingface-hub==0.29.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+huggingface-hub==0.34.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
hydra-core==1.3.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
idna==3.10 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-importlib-metadata==8.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-iniconfig==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-instructor==1.7.7 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jaraco-classes==3.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jaraco-context==6.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jaraco-functools==4.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jeepney==0.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0" and sys_platform == "linux"
+imagesize==1.4.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+importlib-metadata==8.7.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+iniconfig==2.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+itsdangerous==2.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
jinja2==3.1.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jiter==0.8.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-joblib==1.4.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jsonpatch==1.33 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jsonpath-python==1.0.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-jsonpointer==3.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-keyring==25.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langchain-community==0.3.16 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langchain-core==0.3.43 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langchain-openai==0.3.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langchain-text-splitters==0.3.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langchain==0.3.20 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-langsmith==0.3.13 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-lightning-utilities==0.14.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-cloud-services==0.6.5 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-cloud==0.1.14 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-cpp-python[cublas]==0.3.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-agent-openai==0.4.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-cli==0.4.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-core==0.12.23.post2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-embeddings-openai==0.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-indices-managed-llama-cloud==0.6.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-llms-openai==0.3.25 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-multi-modal-llms-openai==0.4.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-program-openai==0.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-question-gen-openai==0.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-readers-file==0.4.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index-readers-llama-parse==0.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-index==0.12.23 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-llama-parse==0.6.4.post1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+jiter==0.10.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+joblib==1.5.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+kiwisolver==1.4.9 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+lightning-utilities==0.15.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+llama-cpp-python==0.3.14 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mako==1.3.10 ; python_version >= "3.11" and python_full_version <= "3.13.0"
markdown-it-py==3.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
markupsafe==3.0.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-marshmallow==3.26.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+matplotlib==3.10.5 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mdit-py-plugins==0.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
mdurl==0.1.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-mistralai==1.5.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mistralai==1.9.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mlflow-skinny==3.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mlflow-tracing==3.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+mlflow==3.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
monotonic==1.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-more-itertools==10.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
mpmath==1.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-multidict==6.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+multidict==6.6.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
multiprocess==0.70.16 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-mypy-extensions==1.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+myst-parser==4.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
nest-asyncio==1.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-networkx==3.4.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-nh3==0.2.21 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-nltk==3.9.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+networkx==3.5 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+ninja==1.11.1.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
numpy==1.26.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cublas-cu11==11.11.3.6 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cuda-cupti-cu11==11.8.87 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cuda-nvrtc-cu11==11.8.89 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cuda-runtime-cu11==11.8.89 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cudnn-cu11==9.1.0.70 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cufft-cu11==10.9.0.58 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-curand-cu11==10.3.0.86 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cusolver-cu11==11.4.1.48 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-cusparse-cu11==11.7.5.86 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-nccl-cu11==2.21.5 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-nvidia-nvtx-cu11==11.8.86 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-ollama==0.4.7 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+nvidia-cublas-cu12==12.4.5.8 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cuda-cupti-cu12==12.4.127 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cuda-nvrtc-cu12==12.4.127 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cuda-runtime-cu12==12.4.127 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cudnn-cu12==9.1.0.70 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cufft-cu12==11.2.1.3 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-curand-cu12==10.3.5.147 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cusolver-cu12==11.6.1.9 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cusparse-cu12==12.3.1.170 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-cusparselt-cu12==0.6.2 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-ml-py==13.580.82 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+nvidia-nccl-cu12==2.21.5 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-nvjitlink-cu12==12.4.127 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+nvidia-nvtx-cu12==12.4.127 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+ollama==0.4.9 ; python_version >= "3.11" and python_full_version <= "3.13.0"
omegaconf==2.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-openai==1.65.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-api==1.30.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-exporter-otlp-proto-common==1.30.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-exporter-otlp-proto-grpc==1.30.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-proto==1.30.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-sdk==1.30.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-opentelemetry-semantic-conventions==0.51b0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-orjson==3.10.15 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_python_implementation != "PyPy"
-packaging==24.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pandas==2.2.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pathspec==0.12.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-peft==0.15.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pillow==11.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pkginfo==1.10.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-platformdirs==4.3.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pluggy==1.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-portalocker==3.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-posthog==3.24.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-propcache==0.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-protobuf==5.29.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+openai==1.99.5 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-api==1.36.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-exporter-otlp-proto-common==1.36.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-exporter-otlp-proto-grpc==1.36.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-proto==1.36.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-sdk==1.36.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+opentelemetry-semantic-conventions==0.57b0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+optuna==4.4.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+packaging==25.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pandas==2.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+peft==0.17.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pillow==11.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+platformdirs==4.3.8 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pluggy==1.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+portalocker==3.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+posthog==3.25.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+propcache==0.3.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+protobuf==6.31.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
psutil==7.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pyarrow==19.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pyarrow==21.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
pyasn1-modules==0.4.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
pyasn1==0.6.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pycparser==2.22 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_python_implementation == "PyPy" or sys_platform == "linux")
-pydantic-core==2.27.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pydantic-settings==2.8.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pydantic==2.10.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pygments==2.19.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pypdf==5.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pytest-asyncio==0.21.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pytest-repeat==0.9.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pycparser==2.22 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_python_implementation != "PyPy"
+pydantic-core==2.33.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pydantic==2.11.7 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pyfiglet==1.0.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pygments==2.19.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pyparsing==3.2.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pytest-asyncio==1.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pytest-repeat==0.9.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
pytest-rerunfailures==12.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pytest-xdist==3.6.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pytest==7.4.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pytest-xdist==3.8.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pytest==8.4.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-python-dotenv==1.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pytz==2025.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-pywin32-ctypes==0.2.3 ; python_version >= "3.11" and python_full_version <= "3.13.0" and sys_platform == "win32"
-pywin32==308 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_system == "Windows"
+python-dotenv==1.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pytz==2025.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+pywin32==311 ; python_version >= "3.11" and python_full_version <= "3.13.0" and (platform_system == "Windows" or sys_platform == "win32")
pyyaml==6.0.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-readme-renderer==44.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-regex==2024.11.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-requests-toolbelt==1.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-requests==2.32.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-rfc3986==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-rich==13.9.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-rsa==4.9 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-safetensors==0.5.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-scipy==1.15.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-secretstorage==3.3.3 ; python_version >= "3.11" and python_full_version <= "3.13.0" and sys_platform == "linux"
+regex==2025.7.34 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+requests==2.32.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+rich==14.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+roman-numerals-py==3.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+rsa==4.9.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+safetensors==0.6.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+scikit-learn==1.7.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+scipy==1.16.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
sentencepiece==0.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-sentry-sdk==1.45.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-setproctitle==1.3.5 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-setuptools==75.9.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sentry-sdk==2.34.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+setuptools==80.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
shellingham==1.5.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
six==1.17.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
smmap==5.0.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
sniffio==1.3.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-soupsieve==2.6 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-sqlalchemy==2.0.38 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-sqlalchemy[asyncio]==2.0.38 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-striprtf==0.0.26 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+snowballstemmer==3.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinx==8.2.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-applehelp==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-devhelp==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-htmlhelp==2.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-qthelp==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sphinxcontrib-serializinghtml==2.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sqlalchemy==2.0.42 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+sqlparse==0.5.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+starlette==0.47.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
sympy==1.13.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
tabulate==0.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-tenacity==9.0.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-tiktoken==0.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-tokenizers==0.21.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-torch==2.6.0+cu118 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-torchmetrics==1.6.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-torchvision==0.21.0+cu118 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+tenacity==9.1.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+termcolor==3.1.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+threadpoolctl==3.6.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+tokenizers==0.21.4 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+torch==2.6.0+cu124 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+torchmetrics==1.8.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+torchvision==0.21.0+cu124 ; python_version >= "3.11" and python_full_version <= "3.13.0"
tqdm==4.67.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-transformers==4.49.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-triton==3.2.0 ; platform_system == "Linux" and platform_machine == "x86_64" and python_version >= "3.11" and python_full_version <= "3.13.0"
-trl==0.15.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-twine==5.1.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-typer==0.15.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-typing-extensions==4.12.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-typing-inspect==0.9.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-tzdata==2025.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-urllib3==2.3.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-wandb==0.18.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+transformers==4.55.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+triton==3.2.0 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_machine == "x86_64" and platform_system == "Linux"
+trl==0.21.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+typer==0.16.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+typing-extensions==4.14.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+typing-inspection==0.4.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+tzdata==2025.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+urllib3==2.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+uvicorn==0.35.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+waitress==3.0.2 ; python_version >= "3.11" and python_full_version <= "3.13.0" and platform_system == "Windows"
+wandb==0.21.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
websockets==15.0.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+werkzeug==3.1.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
wheel==0.45.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-wrapt==1.17.2 ; python_version >= "3.11" and python_full_version <= "3.13.0"
xxhash==3.5.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-yarl==1.18.3 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-zipp==3.21.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
-zstandard==0.23.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+yarl==1.20.1 ; python_version >= "3.11" and python_full_version <= "3.13.0"
+zipp==3.23.0 ; python_version >= "3.11" and python_full_version <= "3.13.0"
diff --git a/rkllm_files/Dockerfile.rkllm b/rkllm_files/Dockerfile.rkllm
new file mode 100644
index 0000000..273743c
--- /dev/null
+++ b/rkllm_files/Dockerfile.rkllm
@@ -0,0 +1,44 @@
+FROM ubuntu:20.04
+
+COPY sources_bionic.list /etc/apt/sources.list
+
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update \
+ && apt-get install -y python3 python3-dev python3-pip gcc vim libprotobuf-dev zlib1g zlib1g-dev libsm6 \
+ && apt-get install -y libgl1 libglib2.0-0 android-tools-adb
+
+RUN cd /usr/bin \
+ && ln -sfn idle3 idle \
+ && ln -sfn pydoc3 pydoc \
+ && ln -sfn python3.8 python \
+ && ln -sfn python3.8-config python-config \
+ && ln -sfn pip3 pip \
+ && ls -al
+
+RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host=pypi.tuna.tsinghua.edu.cn
+RUN pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
+RUN pip3 config set install.trusted-host pypi.tuna.tsinghua.edu.cn
+
+RUN python3 --version
+RUN pip3 --version
+COPY rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+RUN pip3 install torch==1.10.1
+RUN pip3 install rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+RUN pip3 cache purge
+
+# Create app directory
+WORKDIR /app
+
+# Copy conversion script and entrypoint
+COPY rkllm_converting.py /app/
+COPY entrypoint.sh /app/
+
+# Make scripts executable
+RUN chmod +x /app/entrypoint.sh /app/rkllm_converting.py
+
+# Set up volumes for model input/output
+VOLUME ["/input", "/output"]
+
+# Set entrypoint
+ENTRYPOINT ["/app/entrypoint.sh"]
diff --git a/rkllm_files/entrypoint.sh b/rkllm_files/entrypoint.sh
new file mode 100644
index 0000000..576ecdc
--- /dev/null
+++ b/rkllm_files/entrypoint.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+set -e
+
+# RKLLM Container Entrypoint Script
+# Handles routing of commands to appropriate RKLLM conversion functions
+
+# Set up logging
+log() {
+ echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >&2
+}
+
+error() {
+ log "ERROR: $*"
+ exit 1
+}
+
+# If no command provided, just sleep to keep container running
+if [ $# -eq 0 ]; then
+ log "No command provided. Container is running but idle."
+ # Keep container running
+ tail -f /dev/null
+ exit 0
+fi
+
+# Main command routing
+case "$1" in
+ convert)
+ log "Starting RKLLM conversion..."
+ shift # Remove 'convert' from arguments
+ python3 /app/rkllm_converting.py "$@"
+ ;;
+
+ *)
+ log "Unknown command: $1"
+ echo "Usage:"
+ echo " docker run rkllm_converter convert [options]"
+ echo ""
+ echo "Available commands:"
+ echo " convert Convert model to RKLLM format"
+ echo ""
+ echo "Convert options:"
+ echo " --model-path PATH Input model path"
+ echo " --output-path PATH Output RKLLM file path"
+ echo " --target-platform PLATFORM Target platform (rk3588, rk3576, etc.)"
+ echo " --quantization TYPE Quantization type (w8a8, w4a16, w4a16_g128)"
+ echo " --num-npu-core N Number of NPU cores (1-3)"
+ echo " --do-parallelize Enable model parallelization"
+ echo " --hybrid-quantization Enable hybrid quantization"
+ exit 1
+ ;;
+esac
\ No newline at end of file
diff --git a/rkllm_files/rkllm_converting.py b/rkllm_files/rkllm_converting.py
new file mode 100644
index 0000000..9c40de2
--- /dev/null
+++ b/rkllm_files/rkllm_converting.py
@@ -0,0 +1,204 @@
+#!/usr/bin/env python3
+"""RKLLM Model Conversion Tool
+
+Converts Hugging Face models to RKLLM format for Rockchip NPU deployment.
+Supports both Hugging Face and GGUF model formats.
+"""
+
+import argparse
+import logging
+import os
+import sys
+from pathlib import Path
+
+import torch
+from rkllm.api import RKLLM
+
+# Configure logging
+logging.basicConfig(
+ level=logging.INFO,
+ format="[%(asctime)s] %(levelname)s: %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+)
+logger = logging.getLogger(__name__)
+
+# Set PyTorch CUDA memory configuration for better memory management
+os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"
+torch.cuda.empty_cache()
+
+
+def parse_arguments() -> argparse.Namespace:
+ """Parse command line arguments."""
+ parser = argparse.ArgumentParser(
+ description="Convert models to RKLLM format for Rockchip NPU deployment",
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+ )
+
+ # Required arguments
+ parser.add_argument(
+ "--model-path",
+ required=True,
+ help="Path to input model (Hugging Face directory or GGUF file)",
+ )
+ parser.add_argument(
+ "--output-path",
+ required=True,
+ help="Output path for RKLLM model file",
+ )
+
+ # RKLLM configuration
+ parser.add_argument(
+ "--target-platform",
+ default="rk3588",
+ choices=["rk3588", "rk3576", "rk3562", "rk3566"],
+ help="Target Rockchip platform",
+ )
+ parser.add_argument(
+ "--quantization",
+ default="w8a8",
+ choices=["w8a8", "w4a16", "w4a16_g128"],
+ help="Quantization type",
+ )
+ parser.add_argument(
+ "--num-npu-core",
+ type=int,
+ default=1,
+ choices=[1, 2, 3],
+ help="Number of NPU cores to use",
+ )
+ parser.add_argument(
+ "--do-parallelize",
+ action="store_true",
+ help="Enable model parallelization for larger models",
+ )
+ parser.add_argument(
+ "--hybrid-quantization",
+ action="store_true",
+ help="Enable hybrid quantization",
+ )
+
+ # Model loading options
+ parser.add_argument(
+ "--model-format",
+ choices=["huggingface", "gguf", "auto"],
+ default="auto",
+ help="Model format (auto-detected by default)",
+ )
+ parser.add_argument("--max-context", type=int, default=4096, help="Maximum context length")
+
+ return parser.parse_args()
+
+
+def detect_model_format(model_path: str) -> str:
+ """Auto-detect model format based on path."""
+ model_path = Path(model_path)
+
+ if model_path.suffix.lower() == ".gguf":
+ return "gguf"
+ if model_path.is_dir() and (model_path / "config.json").exists():
+ return "huggingface"
+
+ # Default to huggingface if uncertain
+ return "huggingface"
+
+
+def load_model(rkllm: RKLLM, model_path: str, model_format: str) -> int:
+ """Load model into RKLLM based on format."""
+ logger.info(f"Loading {model_format} model from: {model_path}")
+
+ if model_format == "gguf":
+ return rkllm.load_gguf(model=model_path)
+ if model_format == "huggingface":
+ # Use CPU device for loading to avoid CUDA issues in container
+ return rkllm.load_huggingface(model=model_path, device="cpu")
+ raise ValueError(f"Unsupported model format: {model_format}")
+
+
+def convert_model(args: argparse.Namespace) -> int:
+ """Main conversion function."""
+ logger.info("Starting RKLLM model conversion...")
+ logger.info(f"Model path: {args.model_path}")
+ logger.info(f"Output path: {args.output_path}")
+ logger.info(f"Target platform: {args.target_platform}")
+ logger.info(f"Quantization: {args.quantization}")
+ logger.info(f"NPU cores: {args.num_npu_core}")
+
+ # Validate input model path
+ model_path = Path(args.model_path)
+ if not model_path.exists():
+ logger.error(f"Model path does not exist: {model_path}")
+ return 1
+
+ # Create output directory if needed
+ output_path = Path(args.output_path)
+ output_path.parent.mkdir(parents=True, exist_ok=True)
+
+ # Auto-detect model format if needed
+ model_format = args.model_format
+ if model_format == "auto":
+ model_format = detect_model_format(args.model_path)
+ logger.info(f"Auto-detected model format: {model_format}")
+
+ try:
+ # Initialize RKLLM
+ logger.info("Initializing RKLLM...")
+ rkllm = RKLLM()
+
+ # Load model
+ ret = load_model(rkllm, args.model_path, model_format)
+ if ret != 0:
+ logger.error(f"Failed to load {model_format} model")
+ return ret
+ logger.info("Model loaded successfully")
+
+ # Build model with quantization
+ logger.info("Building model with RKLLM optimizations...")
+ ret = rkllm.build(
+ do_quantization=True,
+ optimization_level=1,
+ quantized_dtype=args.quantization,
+ hybrid_rate=0.5 if args.hybrid_quantization else 0.0,
+ max_context=args.max_context,
+ quantized_algorithm="normal",
+ target_platform=args.target_platform,
+ num_npu_core=args.num_npu_core,
+ extra_qparams=None,
+ )
+
+ if ret != 0:
+ logger.error("Model build failed")
+ return ret
+ logger.info("Model built successfully")
+
+ # Export model
+ logger.info(f"Exporting RKLLM model to: {output_path}")
+ ret = rkllm.export_rknn(str(output_path))
+ if ret != 0:
+ logger.error("Model export failed")
+ return ret
+
+ # Verify output file
+ if not output_path.exists():
+ logger.error(f"Output file was not created: {output_path}")
+ return 1
+
+ file_size = output_path.stat().st_size / (1024 * 1024) # Size in MB
+ logger.info("RKNN conversion completed successfully!")
+ logger.info(f"Output file: {output_path}")
+ logger.info(f"File size: {file_size:.2f} MB")
+
+ return 0
+
+ except Exception as e:
+ logger.exception(f"Conversion failed with error: {e}")
+ return 1
+
+
+def main() -> int:
+ """Main entry point."""
+ args = parse_arguments()
+ return convert_model(args)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/run_pipeline.sh b/run_pipeline.sh
index 1503626..c32ef33 100644
--- a/run_pipeline.sh
+++ b/run_pipeline.sh
@@ -1,7 +1,90 @@
#!/bin/bash
echo "=== Starting Training Phase ==="
-python -m training_model
+poetry run python main.py pipeline --skip_test=true
+
+RKLLM_ENABLED=$(poetry run python -c "import yaml,sys,json
+with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+print(str(config['model']['rkllm']['enabled']).lower())")
+
+if [ "$RKLLM_ENABLED" = "true" ]; then
+ echo "=== Starting RKLLM Conversion ==="
+
+ # Extract parameters from Hydra config
+ MODEL_PATH=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(config['paths']['merged_model_path'])")
+
+ OUTPUT_PATH=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ output_dir = config['model']['rkllm']['output_dir']
+ model_name = config['model']['new_model']
+ print(f'{output_dir}/{model_name}.rkllm')")
+
+ TARGET_PLATFORM=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(config['model']['rkllm']['target_platform'])")
+
+ QUANTIZATION=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(config['model']['rkllm']['quantization'])")
+
+ NPU_CORES=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(config['model']['rkllm']['num_npu_core'])")
+
+ # Build the conversion command
+ CONVERSION_CMD="convert"
+ CONVERSION_CMD="$CONVERSION_CMD --model-path /app/models/$MODEL_PATH"
+ CONVERSION_CMD="$CONVERSION_CMD --output-path /app/models/$OUTPUT_PATH"
+ CONVERSION_CMD="$CONVERSION_CMD --target-platform $TARGET_PLATFORM"
+ CONVERSION_CMD="$CONVERSION_CMD --quantization $QUANTIZATION"
+ CONVERSION_CMD="$CONVERSION_CMD --num-npu-core $NPU_CORES"
+
+ # Add optional parameters
+ DO_PARALLELIZE=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(str(config['model']['rkllm']['do_parallelize']).lower())")
+
+ if [ "$DO_PARALLELIZE" = "true" ]; then
+ CONVERSION_CMD="$CONVERSION_CMD --do-parallelize"
+ fi
+
+ HYBRID_QUANT=$(poetry run python -c "import yaml,sys,json
+ with open('.hydra/config.yaml', 'r') as f:
+ config = yaml.safe_load(f)
+ print(str(config['model']['rkllm']['hybrid_quantization']).lower())")
+
+ if [ "$HYBRID_QUANT" = "true" ]; then
+ CONVERSION_CMD="$CONVERSION_CMD --hybrid-quantization"
+ fi
+
+ # Create output directory if it doesn't exist
+ OUTPUT_DIR=$(dirname "$OUTPUT_PATH")
+ mkdir -p "/app/models/$OUTPUT_DIR"
+
+ # Run the RKLLM converter container
+ echo "Running RKLLM conversion: $CONVERSION_CMD"
+ docker run --rm \
+ -v $(pwd)/models:/app/models \
+ -v $(pwd)/data:/app/data \
+ rkllm_converter $CONVERSION_CMD
+
+ if [ $? -eq 0 ]; then
+ echo "RKLLM conversion completed successfully"
+ else
+ echo "RKLLM conversion failed"
+ exit 1
+ fi
+fi
+
echo "=== Preparing Model for Ollama ==="
GGUF_DIR="models/custom-model"
@@ -37,19 +120,18 @@ HASH=$(sha256sum "$GGUF_FILE" | awk '{print $1}')
BLOB_NAME="sha256:$HASH"
echo "Calculated blob name: $BLOB_NAME"
-curl -T "$GGUF_FILE" -X POST "http://ollama:11434/api/blobs/$BLOB_NAME"
-
-if [ $? -ne 0 ]; then
- echo "Failed to upload blob"
- exit 1
-fi
+UPLOAD_CODE=$(curl -s -o /dev/null -w "%{http_code}" -T "$GGUF_FILE" -X POST "http://ollama:11434/api/blobs/$BLOB_NAME")
++if [ "${UPLOAD_CODE}" -lt 200 ] || [ "${UPLOAD_CODE}" -ge 400 ]; then
++ echo "Failed to upload blob (HTTP ${UPLOAD_CODE})"
++ exit 1
++fi
JSON_PAYLOAD=$(jq -n \
--arg name "custom-model" \
--arg blob_name "$BLOB_NAME" \
--arg gguf_file "$GGUF_FILE" \
- '{name: $name, files: {
- "$gguf_file": $blob_name}}')
+ '{name: $name, files: {($gguf_file): $blob_name}}')')
+
CREATE_RESPONSE=$(curl -X POST http://ollama:11434/api/create \
-H "Content-Type: application/json" \
@@ -69,4 +151,4 @@ else
fi
echo "=== Running Integration Tests ==="
-python -m testing_model
\ No newline at end of file
+poetry run python -m testing_model
\ No newline at end of file
diff --git a/testing_model/__init__.py b/testing_model/__init__.py
index b20343d..0c47353 100644
--- a/testing_model/__init__.py
+++ b/testing_model/__init__.py
@@ -1,9 +1,16 @@
-from .deepeval_func import test_from_dataset, test_mention_number_of_values
-from .test import test_llm, test_via_llamacpp
+from evaluation.deepeval_integration import (
+ test_from_dataset,
+ test_mention_number_of_values,
+)
+from evaluation.model_evaluation import test_llm, test_via_llamacpp
+from testing_model.models import CustomLocalModel, CustomMistralModel, CustomOpenAIModel
__all__ = [
+ "CustomLocalModel",
+ "CustomMistralModel",
+ "CustomOpenAIModel",
+ "test_from_dataset",
"test_llm",
"test_mention_number_of_values",
- "test_from_dataset",
"test_via_llamacpp",
]
diff --git a/testing_model/__main__.py b/testing_model/__main__.py
index a5348d5..164c740 100644
--- a/testing_model/__main__.py
+++ b/testing_model/__main__.py
@@ -1,13 +1,164 @@
import json
import logging
+from pathlib import Path
import hydra
import ollama
from omegaconf import DictConfig
+from evaluation.game_evaluation import test_actions
+from evaluation.model_evaluation import dataset_to_json_for_test, test_llm
from training_model import configure_logging
-from .test import dataset_to_json_for_test, test_llm
+try:
+ from evaluation.deepeval_integration import (
+ test_game_context_appropriateness,
+ test_game_context_appropriateness_async,
+ test_russian_language_quality,
+ test_russian_language_quality_async,
+ test_unintended_answer_mention,
+ test_unintended_answer_mention_async,
+ )
+except ImportError:
+ test_game_context_appropriateness = None
+ test_russian_language_quality = None
+ test_unintended_answer_mention = None
+ test_game_context_appropriateness_async = None
+ test_russian_language_quality_async = None
+ test_unintended_answer_mention_async = None
+
+
+def _create_deepeval_test_functions(cfg: DictConfig) -> list:
+ """Create list of DeepEval test functions based on config.
+
+ Args:
+ cfg (DictConfig): Hydra configuration
+
+ Returns:
+ list: List of test functions to execute
+ """
+ logger = logging.getLogger(__name__)
+ test_functions = []
+
+ deepeval_cfg = cfg.get("testing", {}).get("deepeval_testing", {})
+ if not deepeval_cfg.get("enabled", False):
+ logger.info("DeepEval testing disabled in config")
+ return test_functions
+
+ if None in [
+ test_game_context_appropriateness,
+ test_russian_language_quality,
+ test_unintended_answer_mention,
+ ]:
+ logger.warning("DeepEval integration not available - skipping DeepEval metrics")
+ return test_functions
+
+ requested_metrics = deepeval_cfg.get("metrics", [])
+ eval_model_type = (
+ cfg.get("deepeval", {}).get("evaluation_model", {}).get("type", "mistral")
+ )
+ logger.info(
+ f"DeepEval testing enabled. Model type: {eval_model_type}, "
+ f"Metrics: {requested_metrics}"
+ )
+
+ async def wrapper_unintended_answer_mention(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> tuple[bool, float, str]:
+ """Async wrapper for test_unintended_answer_mention_async
+ to match test_actions signature."""
+ logger = logging.getLogger(__name__)
+ try:
+ from evaluation.deepeval_integration import _get_evaluation_model
+
+ logger.debug("Initializing evaluation model for unintended_answer_mention metric")
+ _get_evaluation_model(cfg)
+ user_input = kwargs.get("user_input", "")
+ if not user_input:
+ logger.warning(
+ "WARNING: user_input is empty for unintended_answer_mention metric. "
+ "DeepEval will not be able to evaluate if the "
+ "model reveals answers to questions."
+ )
+ return await test_unintended_answer_mention_async(
+ cfg, user_input, model_answer, correct_answer
+ )
+ except Exception as e:
+ logger.error(
+ f"Failed to initialize evaluation model for unintended_answer_mention: {e}"
+ )
+ logger.error(
+ "Check your DeepEval config and API credentials (MISTRAL_API, CUSTOM_API_KEY)"
+ )
+ raise
+
+ async def wrapper_russian_language_quality(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> tuple[bool, float, str]:
+ """Async wrapper for test_russian_language_quality_async
+ to match test_actions signature."""
+ logger = logging.getLogger(__name__)
+ try:
+ from evaluation.deepeval_integration import _get_evaluation_model
+
+ logger.debug("Initializing evaluation model for russian_language_quality metric")
+ _get_evaluation_model(cfg)
+ return await test_russian_language_quality_async(cfg, model_answer)
+ except Exception as e:
+ logger.error(
+ f"Failed to initialize evaluation model for russian_language_quality: {e}"
+ )
+ logger.error(
+ "Check your DeepEval config and API credentials (MISTRAL_API, CUSTOM_API_KEY)"
+ )
+ raise
+
+ async def wrapper_game_context_appropriateness(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> tuple[bool, float, str]:
+ """Async wrapper for test_game_context_appropriateness_async
+ to match test_actions signature."""
+ try:
+ from evaluation.deepeval_integration import _get_evaluation_model
+
+ logger.debug(
+ "Initializing evaluation model for game_context_appropriateness metric"
+ )
+ _get_evaluation_model(cfg)
+ available_actions = kwargs.get("available_actions", [])
+ user_input = kwargs.get("user_input")
+ if not user_input:
+ logger.warning(
+ "WARNING: user_input is empty for game_context_appropriateness metric. "
+ "DeepEval will not have full context for evaluation."
+ )
+ return await test_game_context_appropriateness_async(
+ cfg, model_answer, available_actions, user_input
+ )
+ except Exception as e:
+ logger.error(
+ f"Failed to initialize evaluation model for game_context_appropriateness: {e}"
+ )
+ logger.error(
+ "Check your DeepEval config and API credentials (MISTRAL_API, CUSTOM_API_KEY)"
+ )
+ raise
+
+ metric_mapping = {
+ "unintended_answer_mention": wrapper_unintended_answer_mention,
+ "russian_language_quality": wrapper_russian_language_quality,
+ "game_context_appropriateness": wrapper_game_context_appropriateness,
+ }
+
+ for metric_name in requested_metrics:
+ if metric_name in metric_mapping:
+ metric_func = metric_mapping[metric_name]
+ test_functions.append(metric_func)
+ logger.info(f"✓ Added DeepEval metric: {metric_name}")
+ else:
+ logger.warning(f"✗ Unknown metric: {metric_name}")
+
+ return test_functions
@hydra.main(version_base="1.1", config_path="../conf", config_name="config")
@@ -18,7 +169,9 @@ def test_main(cfg: DictConfig) -> None:
This function performs the following steps:
1. Configure logging
2. Set up data directory path
- 3. Run model testing via Ollama
+ 3. Build list of test functions (action validation + optional DeepEval metrics)
+ 4. Run model testing via Ollama
+ 5. Display final test summary
Args:
cfg (DictConfig): Configuration dictionary from Hydra containing
@@ -28,23 +181,78 @@ def test_main(cfg: DictConfig) -> None:
None
Workflow:
- - Configures logging at DEBUG level
- - Runs main testing process
+ - Configures logging based on config log_level setting
+ - Loads DeepEval metrics if enabled in config
+ - Runs testing process with configured test functions
+ - Displays comprehensive test execution summary
"""
- configure_logging(logging.DEBUG)
+ configure_logging(cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
if cfg.testing.test:
- with open(cfg.testing.test_dataset, "r", encoding="utf-8") as file:
+ with Path(cfg.testing.test_dataset).open(encoding="utf-8") as file:
test_dataset = json.load(file)
dataset_to_json_for_test(test_dataset, cfg.testing.output_test_file)
client = ollama.Client()
- test_llm(
+
+ test_functions = [test_actions]
+ deepeval_functions = _create_deepeval_test_functions(cfg)
+ test_functions.extend(deepeval_functions)
+
+ if len(test_functions) == 1:
+ logger.info("Running action validation only")
+ else:
+ logger.info(
+ f"Running {len(test_functions)} test "
+ f"functions (action validation + {len(deepeval_functions)} DeepEval metrics)"
+ )
+
+ parallel_cfg = cfg.get("testing", {}).get("parallel_execution", {})
+ if parallel_cfg.get("enabled", False):
+ num_workers = parallel_cfg.get("num_workers", 4)
+ logger.info(f"Parallel execution enabled with {num_workers} workers")
+ else:
+ logger.info("Sequential test execution enabled")
+
+ test_data_path = Path(cfg.paths.data_dir) / cfg.testing.test_dataset.split("/")[-1]
+
+ summaries = test_llm(
cfg,
- path_test_dataset=cfg.testing.test_dataset,
+ path_test_dataset=str(test_data_path),
test_file=cfg.testing.output_test_file,
+ test_func=test_functions,
use_ollama=True,
ollama_client=client,
)
+ if summaries:
+ logger.info("\n" + "=" * 60)
+ logger.info("FINAL TEST EXECUTION SUMMARY")
+ logger.info("=" * 60)
+ for i, summary in enumerate(summaries):
+ logger.info(
+ f"\nTest Function {i + 1}:"
+ f" {summary.test_functions[0] if summary.test_functions else 'Unknown'}"
+ )
+ logger.info(f" Total Tests: {summary.total_tests}")
+ logger.info(
+ f" Passed: {summary.passed_tests} ({summary.success_rate * 100:.1f}%)"
+ )
+ logger.info(
+ f" Failed: {summary.failed_tests} "
+ f"({(1 - summary.success_rate) * 100:.1f}%)"
+ )
+ if summary.metrics_per_function:
+ logger.info(" Detailed Metrics:")
+ for func_name, metrics in summary.metrics_per_function.items():
+ passed = metrics.get("passed", 0)
+ total = metrics.get("total", 0)
+ success_pct = (passed / total * 100) if total > 0 else 0
+ logger.info(
+ f" - {func_name}: {passed}/{total} ({success_pct:.1f}%)"
+ )
+ logger.info("=" * 60 + "\n")
+
if __name__ == "__main__":
test_main()
diff --git a/testing_model/deepeval_func.py b/testing_model/deepeval_func.py
deleted file mode 100644
index eefe666..0000000
--- a/testing_model/deepeval_func.py
+++ /dev/null
@@ -1,343 +0,0 @@
-"""File for the testing model using deepeval framework"""
-import asyncio
-import json
-import logging
-import subprocess
-import time
-from typing import Any, Optional
-
-import requests
-from deepeval import assert_test
-from deepeval.metrics import GEval
-
-# from .test import dataset_to_json_for_test
-from deepeval.models import DeepEvalBaseLLM
-from deepeval.test_case import LLMTestCase, LLMTestCaseParams
-from langchain_openai import ChatOpenAI
-from mistralai import Mistral
-
-from training_model.private_api import MISTRAL_API
-
-
-class CustomLocalModel(DeepEvalBaseLLM):
- """
- A custom local model implementation for DeepEval testing.
-
- Attributes:
- model (ChatOpenAI): The underlying language model.
- model_name (str): Name of the model.
- """
-
- def __init__(
- self,
- model: str = "vikhr-yandexgpt-5-lite-8b-it_gguf",
- url: str = "http://localhost:1234/v1/",
- *args: Any,
- **kwargs: Any,
- ):
- """
- Initialize the custom local model.
-
- Args:
- model (str, optional): Name of the model. Defaults to "vikhr-yandexgpt-5-lite-8b-it_gguf".
- url (str, optional): Base URL for the model. Defaults to "http://localhost:1234/v1/".
- """
- self.model = ChatOpenAI(
- base_url=url,
- api_key="dummy",
- model=model,
- )
- self.model_name = model
-
- def load_model(self) -> ChatOpenAI:
- """
- Load and return the model.
-
- Returns:
- ChatOpenAI: The loaded language model.
- """
- return self.model
-
- def generate(self, prompt: str) -> str:
- """
- Generate a response for the given prompt.
-
- Args:
- prompt (str): Input prompt for the model.
-
- Returns:
- str: Generated model response.
- """
- return self.model.invoke(prompt).content
-
- async def a_generate(self, prompt: str) -> str:
- """
- Asynchronously generate a response for the given prompt.
-
- Args:
- prompt (str): Input prompt for the model.
-
- Returns:
- str: Generated model response.
- """
- return self.generate(prompt)
-
- def get_model_name(self) -> str:
- """
- Get the name of the model.
-
- Returns:
- str: Model name.
- """
- return self.model_name
-
-
-class CustomMistralModel(DeepEvalBaseLLM):
- """
- A custom Mistral model implementation for DeepEval testing with rate limiting.
-
- Attributes:
- client (Mistral): Mistral API client.
- model_name (str): Name of the model.
- temperature (float): Sampling temperature.
- last_request_time (Optional[float]): Timestamp of last API request.
- rate_limit_delay (float): Minimum delay between requests.
- """
-
- def __init__(
- self,
- api_key: str,
- model: str = "mistral-small-latest",
- temperature: float = 0.1,
- *args: Any,
- **kwargs: Any,
- ):
- """
- Initialize the custom Mistral model.
-
- Args:
- api_key (str): API key for Mistral service.
- model (str, optional): Name of the model. Defaults to "mistral-small-latest".
- temperature (float, optional): Sampling temperature. Defaults to 0.1.
- """
- self.client = Mistral(api_key=api_key)
- self.model_name = model
- self.temperature = temperature
- self.last_request_time: Optional[float] = None
- self.rate_limit_delay = 1.2 # 1.2 seconds to stay safely under limit
-
- def _enforce_rate_limit(self) -> None:
- """
- Enforce rate limiting by introducing a delay between API requests.
- Ensures at least 1 second between requests.
- """
- if self.last_request_time is not None:
- elapsed = time.time() - self.last_request_time
- if elapsed < self.rate_limit_delay:
- sleep_time = self.rate_limit_delay - elapsed
- time.sleep(sleep_time)
- self.last_request_time = time.time()
-
- async def _aenforce_rate_limit(self) -> None:
- """
- Asynchronous version of rate limiting.
- Ensures at least 1 second between API requests.
- """
- if self.last_request_time is not None:
- elapsed = time.time() - self.last_request_time
- if elapsed < self.rate_limit_delay:
- sleep_time = self.rate_limit_delay - elapsed
- await asyncio.sleep(sleep_time)
- self.last_request_time = time.time()
-
- def generate(self, prompt: str) -> str:
- """
- Generate a response for the given prompt.
-
- Args:
- prompt (str): Input prompt for the model.
-
- Returns:
- str: Generated model response.
- """
- self._enforce_rate_limit()
- response = self.client.chat.complete(
- model=self.model_name,
- messages=[{"role": "user", "content": prompt}],
- temperature=self.temperature,
- )
- return response.choices[0].message.content
-
- async def a_generate(self, prompt: str) -> str:
- """
- Asynchronously generate a response for the given prompt.
-
- Args:
- prompt (str): Input prompt for the model.
-
- Returns:
- str: Generated model response.
- """
- await self._aenforce_rate_limit()
- response = await self.client.chat.complete_async(
- model=self.model_name,
- messages=[{"role": "user", "content": prompt}],
- temperature=self.temperature,
- )
- return response.choices[0].message.content
-
- def get_model_name(self) -> str:
- """
- Get the name of the model.
-
- Returns:
- str: Model name.
- """
- return self.model_name
-
- def load_model(self) -> Mistral:
- """
- Load and return the Mistral client.
-
- Returns:
- Mistral: The Mistral API client.
- """
- return self.client
-
-
-mistral_model = CustomMistralModel(
- api_key=MISTRAL_API, model="mistral-small-latest", temperature=0.7
-)
-
-local_model = CustomLocalModel()
-
-
-def set_local_model_via_cli(
- model_name: str = "vikhr-yandexgpt-5-lite-8b-it_gguf",
- base_url: str = "http://localhost:1234/v1",
-) -> None:
- """
- Set the local model via CLI using deepeval command.
-
- Args:
- model_name (str, optional): Name of the model.
- Defaults to "vikhr-yandexgpt-5-lite-8b-it_gguf".
- base_url (str, optional): Base URL for the model.
- Defaults to "http://localhost:1234/v1".
-
- Prints:
- - Success message with command output
- - Error message if command fails
- """
- command = [
- "python",
- "-m",
- "deepeval",
- "set-local-model",
- f"--model-name={model_name}",
- f"--base-url={base_url}",
- ]
- try:
- result = subprocess.run(command, check=True, capture_output=True, text=True)
- print("Команда выполнена успешно:")
- print(result.stdout)
- except subprocess.CalledProcessError as e:
- print("Ошибка выполнения команды:")
- print(e.stderr)
- except FileNotFoundError as e:
- print(
- "Команда не найдена. Убедитесь, что Python и deepeval установлены и доступны в PATH."
- )
- print(e)
-
-
-def test_mention_number_of_values(user_input: str, output: str) -> bool:
- """
- Check if the model mentions the number of values inappropriately.
-
- Args:
- user_input (str): The original user input.
- output (str): The model's generated output.
-
- Returns:
- bool: Result of the DeepEval test.
-
- Raises:
- AssertionError: If the test fails based on the defined criteria.
- """
- metric = GEval(
- name="Answer question by itself",
- criteria="Check that the model doesn't by itself write answer to the question from the VIKA.",
- # "Also check that the model does not write to the user the correct answer for the"
- # "question from the VIKA",
- # criteria="Проверьте, что модель не пишет сама пользователю конкретное количество ценностей в ответе"
- # "Также проверьте, что модель не пишет пользователю правильный ответ на свой вопрос, который"
- # "от него ожидает услышать.",
- # evaluation_steps=[
- # "Check that the model does not write the number of values by itself",
- # # "Check that the Actual Output does not provide the correct answer to the VIKA question as specified in the Input.",
- # # "Confirm that the Actual Output does not directly answer the question from the VIKA, even if user want it."
- # ],
- model=mistral_model,
- verbose_mode=True,
- threshold=0.7,
- evaluation_params=[
- LLMTestCaseParams.INPUT,
- LLMTestCaseParams.ACTUAL_OUTPUT,
- ],
- )
- return assert_test(
- test_case=LLMTestCase(input=user_input, actual_output=output), metrics=[metric]
- )
-
-
-def test_from_dataset(
- test_dataset: str = "data/test_ru.json", test_file: str = "test.json"
-) -> None:
- """
- Test the model using a dataset of prompts.
-
- Args:
- test_dataset (str, optional): Path to the test dataset JSON file.
- Defaults to "data/test_ru.json".
- test_file (str, optional): Path to the processed test file.
- Defaults to "test.json".
-
- Logs:
- - Errors for failed tests
- - Final test metrics
- """
- llm_url = "http://localhost:1234/v1/chat/completions"
- with open(test_dataset, "r", encoding="utf-8") as file:
- test_dataset = json.load(file)
- # dataset_to_json_for_test(test_dataset, test_file)
- with open(test_file, "r", encoding="utf-8") as f:
- prompts = json.load(f)
- prompts_to_check = [prompt["user"] for prompt in prompts]
- # answers = [
- # test_dataset["examples"][bot]["answer"]["Content"]["Action"]
- # for bot in test_dataset["examples"]
- # ]
- total_tests = len(prompts_to_check)
- passed_tests = 0
- for user_input in prompts_to_check:
- data = {
- "messages": [{"role": "user", "content": user_input}],
- "model": "game-model/v4/model-game_v4.1_q4.gguf",
- }
- response = requests.post(llm_url, json=data)
- model_answer = json.loads(response.json()["choices"][0]["message"]["content"])[
- "MessageText"
- ]
- try:
- test_mention_number_of_values(user_input, model_answer)
- passed_tests += 1
- except AssertionError:
- logging.error(
- f"Тест не пройден для запроса: {user_input}. \nОтвет модели {model_answer}."
- )
-
- final_metric = passed_tests / total_tests if total_tests > 0 else 0
- logging.info(
- f"Итоговая метрика: {final_metric:.2f} ({passed_tests}/{total_tests} тестов пройдено)"
- )
diff --git a/testing_model/models.py b/testing_model/models.py
new file mode 100644
index 0000000..bbe7090
--- /dev/null
+++ b/testing_model/models.py
@@ -0,0 +1,294 @@
+"""Model implementations for testing and evaluation framework"""
+
+import asyncio
+import time
+
+from deepeval.models import DeepEvalBaseLLM
+from langchain_openai import ChatOpenAI
+from mistralai import Mistral
+from openai import AsyncOpenAI, OpenAI
+
+
+class CustomLocalModel(DeepEvalBaseLLM):
+ """
+ A custom local model implementation for DeepEval testing.
+
+ Attributes:
+ model (ChatOpenAI): The underlying language model.
+ model_name (str): Name of the model.
+ """
+
+ def __init__(
+ self,
+ model: str = "vikhr-yandexgpt-5-lite-8b-it_gguf",
+ url: str = "http://localhost:1234/v1/",
+ *args: object,
+ **kwargs: object,
+ ) -> None:
+ """
+ Initialize the custom local model.
+
+ Args:
+ model (str, optional): Name of the model.
+ Defaults to "vikhr-yandexgpt-5-lite-8b-it_gguf".
+ url (str, optional): Base URL for the model.
+ Defaults to "http://localhost:1234/v1/".
+ """
+ self.model = ChatOpenAI(
+ base_url=url,
+ api_key="dummy",
+ model=model,
+ )
+ self.model_name = model
+
+ def load_model(self) -> ChatOpenAI:
+ """
+ Load and return the model.
+
+ Returns:
+ ChatOpenAI: The loaded language model.
+ """
+ return self.model
+
+ def generate(self, prompt: str) -> str:
+ """
+ Generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+
+ Returns:
+ str: Generated model response.
+ """
+ return self.model.invoke(prompt).content
+
+ async def a_generate(self, prompt: str) -> str:
+ """
+ Asynchronously generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+
+ Returns:
+ str: Generated model response.
+ """
+ msg = await self.model.ainvoke(prompt)
+ return msg.content
+
+ def get_model_name(self) -> str:
+ """
+ Get the name of the model.
+
+ Returns:
+ str: Model name.
+ """
+ return self.model_name
+
+
+class CustomMistralModel(DeepEvalBaseLLM):
+ """
+ A custom Mistral model implementation for DeepEval testing with rate limiting.
+
+ Attributes:
+ client (Mistral): Mistral API client.
+ model_name (str): Name of the model.
+ temperature (float): Sampling temperature.
+ last_request_time (Optional[float]): Timestamp of last API request.
+ rate_limit_delay (float): Minimum delay between requests.
+ """
+
+ def __init__(
+ self,
+ api_key: str,
+ model: str = "mistral-small-latest",
+ temperature: float = 0.1,
+ *args: object,
+ **kwargs: object,
+ ) -> None:
+ """
+ Initialize the custom Mistral model.
+
+ Args:
+ api_key (str): API key for Mistral service.
+ model (str, optional): Name of the model. Defaults to "mistral-small-latest".
+ temperature (float, optional): Sampling temperature. Defaults to 0.1.
+ """
+ self.client = Mistral(api_key=api_key)
+ self.model_name = model
+ self.temperature = temperature
+ self.last_request_time: float | None = None
+ self.rate_limit_delay = 1.2 # 1.2 seconds to stay safely under limit
+
+ def _enforce_rate_limit(self) -> None:
+ """
+ Enforce rate limiting by introducing a delay between API requests.
+ Ensures at least 1 second between requests.
+ """
+ if self.last_request_time is not None:
+ elapsed = time.time() - self.last_request_time
+ if elapsed < self.rate_limit_delay:
+ sleep_time = self.rate_limit_delay - elapsed
+ time.sleep(sleep_time)
+ self.last_request_time = time.time()
+
+ async def _aenforce_rate_limit(self) -> None:
+ """
+ Asynchronous version of rate limiting.
+ Ensures at least 1 second between API requests.
+ """
+ if self.last_request_time is not None:
+ elapsed = time.time() - self.last_request_time
+ if elapsed < self.rate_limit_delay:
+ sleep_time = self.rate_limit_delay - elapsed
+ await asyncio.sleep(sleep_time)
+ self.last_request_time = time.time()
+
+ def generate(self, prompt: str) -> str:
+ """
+ Generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+
+ Returns:
+ str: Generated model response.
+ """
+ self._enforce_rate_limit()
+ response = self.client.chat.complete(
+ model=self.model_name,
+ messages=[{"role": "user", "content": prompt}],
+ temperature=self.temperature,
+ )
+ return response.choices[0].message.content
+
+ async def a_generate(self, prompt: str) -> str:
+ """
+ Asynchronously generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+
+ Returns:
+ str: Generated model response.
+ """
+ await self._aenforce_rate_limit()
+ response = await self.client.chat.complete_async(
+ model=self.model_name,
+ messages=[{"role": "user", "content": prompt}],
+ temperature=self.temperature,
+ )
+ return response.choices[0].message.content
+
+ def get_model_name(self) -> str:
+ """
+ Get the name of the model.
+
+ Returns:
+ str: Model name.
+ """
+ return self.model_name
+
+ def load_model(self) -> Mistral:
+ """
+ Load and return the Mistral client.
+
+ Returns:
+ Mistral: The Mistral API client.
+ """
+ return self.client
+
+
+class CustomOpenAIModel(DeepEvalBaseLLM):
+ """
+ A custom OpenAI-compatible model implementation for DeepEval testing.
+
+ Supports any OpenAI-compatible API (e.g., custom endpoints, local servers).
+
+ Attributes:
+ client (OpenAI): OpenAI-compatible API client.
+ model_name (str): Name of the model.
+ temperature (float): Sampling temperature.
+ """
+
+ def __init__(
+ self,
+ api_key: str,
+ base_url: str = "http://localhost:8000/v1",
+ model_name: str = "your-model",
+ temperature: float = 0.7,
+ *args: object,
+ **kwargs: object,
+ ) -> None:
+ """
+ Initialize the custom OpenAI-compatible model.
+
+ Args:
+ api_key (str): API key for the service.
+ base_url (str, optional): Base URL for the API endpoint.
+ Defaults to "http://localhost:8000/v1".
+ model_name (str, optional): Name of the model.
+ Defaults to "your-model".
+ temperature (float, optional): Sampling temperature.
+ Defaults to 0.7.
+ """
+ self.client = OpenAI(api_key=api_key, base_url=base_url)
+ self.async_client = AsyncOpenAI(api_key=api_key, base_url=base_url)
+ self.model_name = model_name
+ self.temperature = temperature
+
+ def load_model(self) -> OpenAI:
+ """
+ Load and return the OpenAI client.
+
+ Returns:
+ OpenAI: The OpenAI-compatible API client.
+ """
+ return self.client
+
+ def generate(self, prompt: str) -> str:
+ """
+ Generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+
+ Returns:
+ str: Generated model response.
+ """
+ response = self.client.chat.completions.create(
+ model=self.model_name,
+ messages=[{"role": "user", "content": prompt}],
+ temperature=self.temperature,
+ )
+ return response.choices[0].message.content
+
+ async def a_generate(self, prompt: str, schema: type | None = None) -> str:
+ """
+ Asynchronously generate a response for the given prompt.
+
+ Args:
+ prompt (str): Input prompt for the model.
+ schema (type, optional): Pydantic schema for structured output.
+
+ Returns:
+ str: Generated model response.
+ """
+ kwargs = {
+ "model": self.model_name,
+ "messages": [{"role": "user", "content": prompt}],
+ "temperature": self.temperature,
+ }
+ if schema is not None:
+ kwargs["response_format"] = schema
+
+ response = await self.async_client.chat.completions.create(**kwargs)
+ return response.choices[0].message.content
+
+ def get_model_name(self) -> str:
+ """
+ Get the name of the model.
+
+ Returns:
+ str: Model name.
+ """
+ return self.model_name
diff --git a/testing_model/test.py b/testing_model/test.py
deleted file mode 100644
index 3851278..0000000
--- a/testing_model/test.py
+++ /dev/null
@@ -1,413 +0,0 @@
-"""File for testing llm model"""
-
-import json
-import logging
-import re
-from typing import Any, Callable, Dict, List, Optional
-
-import ollama
-from llama_cpp import Llama
-from omegaconf import DictConfig
-from openai import OpenAI
-from pydantic import BaseModel, ConfigDict, Field
-
-from training_model.utils import get_user_prompt
-
-# from .deepeval_func import test_mention_number_of_values
-from .functions_to_test_game import test_actions
-
-ollama.base_url = "http://localhost:11434"
-
-
-class Content(BaseModel):
- """The inner element of the pydantic schema for testing model"""
-
- model_config = ConfigDict(extra="forbid")
-
- Action: str = Field(..., description="The action associated with the message.")
-
-
-class MainModel(BaseModel):
- """Pydantic schema for testing model"""
-
- model_config = ConfigDict(extra="forbid")
-
- MessageText: str = Field(..., description="The text of the message.")
- Content: Content
-
-
-def dataset_to_json_for_test(dataset: Dict[str, Any], filename: str) -> None:
- """
- Convert a dataset to a JSON file for testing purposes.
-
- Args:
- dataset (Dict[str, Any]): The dataset containing system and example information.
- filename (str): The path to the output JSON file.
-
- Returns:
- None
- """
- json_objects: List[Dict[str, str]] = []
- system = dataset["system"]
- dataset = dataset["examples"]
-
- with open(filename, "w", encoding="utf-8") as file:
- file.write("")
-
- for row in dataset.keys():
- system_message = system
- user_message = get_user_prompt(dataset[row]["prompt"])
- # user_message = str(dataset[row]['prompt'])
- bot_message = str(dataset[row]["answer"])
-
- json_object = {
- "system": system_message,
- "user": user_message,
- "bot": bot_message,
- }
-
- json_objects.append(json_object)
-
- with open(filename, "a", encoding="utf-8") as file:
- file.write(json.dumps(json_objects, indent=4, ensure_ascii=False))
-
-
-def ollama_generate(
- client: ollama.Client, model_name: str | bytes, prompt: str, schema: Dict
-) -> Dict:
- """
- Wrapper function to generate a response using Ollama's structured outputs.
-
- Args:
- client (ollama.Client): The Ollama client instance.
- model_name (str): The name of the model in Ollama.
- prompt (str): The formatted prompt to send to the model.
- schema (Dict): The JSON schema for the expected response.
-
- Returns:
- Dict: The parsed JSON response conforming to the schema.
- """
- response = client.generate(
- model=model_name,
- prompt=prompt,
- format=schema,
- )
- logging.debug(response)
- return response["response"]
-
-
-def call_llm(prompt: str, model: str, client: OpenAI) -> str:
- """
- Sends a prompt to the LLM and returns its response as a dictionary.
-
- Args:
- prompt (str): The user prompt.
- model (str): The model identifier.
- client (OpenAI): openai client for the llm.
-
- Returns:
- dict: Parsed LLM response.
- """
-
- response = client.chat.completions.create(
- model=model, messages=[{"role": "user", "content": prompt}]
- )
- if not response.choices:
- raise RuntimeError("No choices returned from OpenAI response")
- content = response.choices[0].message.content
- model_answer = content
- return model_answer
-
-
-def run_tests(
- cfg: DictConfig,
- client: OpenAI | ollama.Client,
- test_dataset_path: str = "data/test_ru.json",
- test_file: str = "test.json",
- test_func: callable = None,
- use_ollama: bool = False,
-) -> None:
- """
- Runs tests by comparing the LLM responses with expected answers from a dataset.
-
- Args:
- cfg (DictConfig): Configuration with model settings.
- client (OpenAI | ollama.client): OpenAI or ollama client for LLM interaction.
- test_dataset_path (str, optional): Path to the test dataset JSON file.
- Defaults to "data/test_ru.json".
- test_file (str, optional): Path to save the processed test file.
- Defaults to "test.json".
- test_func (callable, optional): Additional test function to execute on each result.
- This function should accept the user prompt, LLM's message text and the correct answer.
- use_ollama (bool) : Flag to indicate if Ollama should be used for testing.
-
- Returns:
- None
- """
- with open(test_dataset_path, "r", encoding="utf-8") as file:
- test_dataset = json.load(file)
-
- dataset_to_json_for_test(test_dataset, test_file)
-
- with open(test_file, "r", encoding="utf-8") as f:
- prompts = json.load(f)
-
- prompts_to_check = [prompt["user"] for prompt in prompts]
- expected_answers = [answer["bot"] for answer in prompts]
-
- passed_test = 0
-
- for number in range(len(prompts_to_check)):
- prompt = prompts_to_check[number]
- correct_answer = expected_answers[number].strip()
- if not use_ollama:
- model_answer = call_llm(
- prompt,
- client=client,
- model=cfg.model.outfile,
- ).strip()
- else:
- schema = MainModel.model_json_schema()
- model_answer = ollama_generate(
- client=client,
- model_name=cfg.model.outfile.replace(".gguf", ""),
- prompt=prompt,
- schema=schema,
- )
-
- if test_func is not None:
- try:
- test_func(prompt, model_answer, correct_answer)
- passed_test += 1
- except AssertionError as e:
- logging.error(
- f"Test failed for prompt: {prompt}.\n Error: {e}\nModel answer: {model_answer}\nExpected answer: {correct_answer}\n"
- )
-
- total_tests = len(prompts_to_check)
- final_metric = passed_test / total_tests if total_tests > 0 else 0
- logging.info(
- f"Metrics: {final_metric:.2f} ({passed_test}/{total_tests} tests passed)"
- )
-
-
-def test_llm(
- cfg: DictConfig,
- path_test_dataset: str = "data/test_ru.json",
- test_file: str = "test.json",
- test_func: Optional[List[Callable]] = None,
- llm_url: Optional[str] = "http://localhost:1234/v1/",
- use_ollama: bool = False,
- ollama_client: Optional[ollama.Client] = None,
-) -> None:
- """
- Test the LLM via LM Studio by comparing model responses with expected answers.
-
- Args:
- cfg (DictConfig): Configuration dictionary containing model settings.
- path_test_dataset (str, optional): Path to the test dataset JSON file.
- Defaults to "data/test_ru.json".
- test_file (str, optional): Path to save the processed test file.
- Defaults to "test.json".
- test_func (Optional[List[Callable]]): List of additional test functions to execute on each result.
- llm_url (str, optional): URL of the LLM service. Defaults to "http://localhost:1234/v1/".
- use_ollama (bool) : Flag to indicate if Ollama should be used for testing.
- ollama_client (Optional[ollama.Client]): Ollama client for connection
-
- Returns:
- None
-
- Raises:
- Logs errors for failed tests and prints accuracy metrics.
- """
- if test_func is None:
- test_func = [test_actions]
- if ollama_client is None:
- client = OpenAI(api_key="dummy", base_url=llm_url)
- else:
- client = ollama_client
- for test in test_func:
- try:
- run_tests(
- cfg=cfg,
- client=client,
- test_dataset_path=path_test_dataset,
- test_file=test_file,
- test_func=test,
- use_ollama=use_ollama,
- )
- except Exception as e:
- logging.error(f"Test function {test.__name__} failed with error: {e}")
-
-
-def llamacpp_execute_test(
- llm,
- system_prompt: str,
- prompt: str,
- expected_answer: str,
- max_tokens: int,
- temperature: float,
-) -> tuple[dict, bool]:
- """
- Выполняет тест для одного запроса.
-
- Args:
- llm: Модель для генерации ответов.
- system_prompt (str): Системный промпт с инструкциями.
- prompt (str): Пользовательский запрос.
- expected_answer (str): Ожидаемый результат.
- max_tokens (int): Максимальное число генерируемых токенов.
- temperature (float): Параметр температуры для генерации.
-
- Returns:
- tuple: Кортеж, содержащий словарь с результатами теста и булевое значение (True, если тест пройден).
- """
- formatted_prompt = f"[INST] <>\n{system_prompt}\n<>\n\n{prompt} [/INST]"
-
- response = llm(
- formatted_prompt,
- max_tokens=max_tokens,
- temperature=temperature,
- stop=[""],
- )
- response_text = response["choices"][0]["text"]
-
- json_match = re.search(r"(\{.*\})", response_text, re.DOTALL)
- if json_match:
- try:
- json_response = json.loads(json_match.group(1))
- predicted_action = json_response.get("Content", {}).get("Action")
- passed = predicted_action == expected_answer
-
- result = {
- "prompt": prompt,
- "expected": expected_answer,
- "predicted": predicted_action,
- "full_response": response_text,
- "passed": passed,
- }
-
- if passed:
- logging.info("Test passed")
- else:
- logging.error("Test failed")
- logging.error(f"Expected: {expected_answer}, Got: {predicted_action}")
- except json.JSONDecodeError:
- logging.error("Test failed: Invalid JSON response")
- logging.error(f"Response: {response_text}")
- result = {
- "prompt": prompt,
- "expected": expected_answer,
- "predicted": "ERROR: Invalid JSON",
- "full_response": response_text,
- "passed": False,
- }
- passed = False
- else:
- logging.error("Test failed: No JSON found in response")
- logging.error(f"Response: {response_text}")
- result = {
- "prompt": prompt,
- "expected": expected_answer,
- "predicted": "ERROR: No JSON found",
- "full_response": response_text,
- "passed": False,
- }
- passed = False
-
- return result, passed
-
-
-def test_via_llamacpp(
- model_path: str | bytes,
- test_dataset: str = "data/test_ru.json",
- test_file: str = "test.json",
- n_gpu_layers: int = -1,
- n_ctx: int = 2048,
- temperature: float = 0.7,
- max_tokens: int = 2048,
- test_func: Callable = llamacpp_execute_test,
- system_prompt: Optional[str] = None,
-) -> float:
- """
- Тестирование GGUF модели через llama.cpp с использованием передаваемой функции тестирования.
-
- Args:
- model_path (str | bytes): Путь к файлу модели GGUF.
- test_dataset (str, optional): Путь к JSON файлу с тестовыми данными.
- По умолчанию "data/test_ru.json".
- test_file (str, optional): Путь для сохранения обработанного тестового файла.
- По умолчанию "test.json".
- n_gpu_layers (int, optional): Количество слоёв для вычислений на GPU.
- По умолчанию -1 (все слои).
- n_ctx (int, optional): Размер окна контекста.
- По умолчанию 2048.
- temperature (float, optional): Температура сэмплинга.
- По умолчанию 0.7.
- max_tokens (int, optional): Максимальное количество генерируемых токенов.
- По умолчанию 2048.
- test_func (Callable): Функция, реализующая принцип тестирования.
- system_prompt (Optional[str], optional): Системный промпт для модели.
-
- Returns:
- float: Значение точности (accuracy).
- """
- llm = Llama(
- model_path=model_path, n_gpu_layers=n_gpu_layers, n_ctx=n_ctx, verbose=True
- )
- json_schema = MainModel.model_json_schema()
-
- with open(test_dataset, "r", encoding="utf-8") as file:
- test_dataset_data = json.load(file)
-
- dataset_to_json_for_test(test_dataset_data, test_file)
-
- with open(test_file, "r", encoding="utf-8") as f:
- prompts = json.load(f)
-
- prompts_to_check = [prompt["user"] for prompt in prompts]
- answers = [
- test_dataset_data["examples"][bot]["answer"]["Content"]["Action"]
- for bot in test_dataset_data["examples"]
- ]
-
- logging.debug(f"Expected answers: {answers}")
- logging.debug(f"Number of prompts: {len(prompts_to_check)}")
-
- count = 0
- results = []
- if system_prompt is None:
- system_prompt = (
- "Ты – помощник по имени ВИКА на заброшенной космической станции. "
- "У тебя есть доступ к системам станции. "
- "Отвечай только в формате JSON с ключами 'MessageText' и 'Content', "
- "где Content содержит ключ 'Action' с одним из доступных тебе действий. "
- f"Используй следующую JSON схему: {json.dumps(json_schema, ensure_ascii=False)} "
- "Заканчивай ответ символом }."
- )
-
- for number, prompt in enumerate(prompts_to_check):
- result, passed = test_func(
- llm=llm,
- system_prompt=system_prompt,
- prompt=prompt,
- expected_answer=answers[number],
- max_tokens=max_tokens,
- temperature=temperature,
- )
- results.append(result)
- if passed:
- count += 1
- logging.info(f"Test {number} passed")
- else:
- logging.error(f"Test {number} failed")
-
- accuracy = count / len(prompts_to_check)
- logging.info(f"Accuracy: {accuracy:.4f} ({count}/{len(prompts_to_check)})")
-
- with open("test_results.json", "w", encoding="utf-8") as f:
- json.dump(
- {"accuracy": accuracy, "results": results}, f, ensure_ascii=False, indent=2
- )
-
- return accuracy
diff --git a/testing_model/vllm_test.py b/testing_model/vllm_test.py
index dda810e..d151bd0 100644
--- a/testing_model/vllm_test.py
+++ b/testing_model/vllm_test.py
@@ -6,6 +6,16 @@
from .test import MainModel, dataset_to_json_for_test
+SYSTEM_PROMPT = (
+ "Ты – помощник по имени ВИКА на заброшенной космической станции. "
+ "У тебя есть доступ к системам станции. Отвечай только в формате JSON "
+ "с ключами 'MessageText' и 'Actions', содержащими как минимум одно "
+ "(или несколько) доступных вам действий. Если в Actions есть имя действия, "
+ "оно будет исполнено. Заканчивайте ответ символом }. "
+ "Ниже – история сообщений из предыдущего диалога с пользователем, "
+ "а также список доступных тебе действий."
+)
+
def test_via_vllm(
llm: LLM, test_dataset: str = "data/test_ru.json", test_file: str = "test.json"
@@ -29,10 +39,10 @@ def test_via_vllm(
json_schema = MainModel.model_json_schema()
guided_decoding_params = GuidedDecodingParams(json=json_schema)
sampling_params = SamplingParams(guided_decoding=guided_decoding_params)
- with open(test_dataset, "r", encoding="utf-8") as file:
+ with open(test_dataset, encoding="utf-8") as file:
test_dataset = json.load(file)
dataset_to_json_for_test(test_dataset, test_file)
- with open(test_file, "r", encoding="utf-8") as f:
+ with open(test_file, encoding="utf-8") as f:
prompts = json.load(f)
prompts_to_check = [prompt["user"] for prompt in prompts]
answers = [
@@ -46,16 +56,13 @@ def test_via_vllm(
data = [
{
"role": "system",
- "content": "Ты – помощник по имени ВИКА на заброшенной космической станции. У тебя есть доступ к системам станции. Отвечай только в формате JSON с ключами 'MessageText' и 'Actions', содержащими как минимум одно (или несколько) доступных вам действий. Если в Actions есть имя действия, оно будет исполнено. Заканчивайте ответ символом }. Ниже – история сообщений из предыдущего диалога с пользователем, а также список доступных тебе действий.",
+ "content": SYSTEM_PROMPT,
},
{"role": "user", "content": prompt},
]
response = llm.chat(messages=data, sampling_params=sampling_params)
logging.debug(response[0].outputs[0].text)
- if (
- json.loads(response[0].outputs[0].text)["Content"]["Action"]
- == answers[number]
- ):
+ if json.loads(response[0].outputs[0].text)["Content"]["Action"] == answers[number]:
count += 1
logging.info(f"Test {number} passed")
else:
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..d686bfe
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,142 @@
+# Testing Guide for DPO and GRPO
+
+This directory contains comprehensive tests for the DPO (Direct Preference Optimization) and GRPO (Group Relative Policy Optimization) training modules.
+
+## Setup
+
+1. Install test dependencies:
+```bash
+pip install -r tests/test_requirements.txt
+```
+
+2. Ensure you're in the project root directory:
+```bash
+cd T:\projects\LLM_LoRa\LLM_LoRa
+```
+
+## Running Tests
+
+### Run all tests:
+```bash
+pytest tests/test_dpo_grpo.py -v
+```
+
+### Run specific test classes:
+```bash
+# Test only DPO functionality
+pytest tests/test_dpo_grpo.py::TestDPOConfiguration -v
+pytest tests/test_dpo_grpo.py::TestDPODataPreparation -v
+
+# Test only GRPO functionality
+pytest tests/test_dpo_grpo.py::TestGRPOConfiguration -v
+pytest tests/test_dpo_grpo.py::TestGRPORewardFunction -v
+pytest tests/test_dpo_grpo.py::TestGRPODataPreparation -v
+
+# Test integration
+pytest tests/test_dpo_grpo.py::TestTrainingIntegration -v
+```
+
+### Run with coverage:
+```bash
+pytest tests/test_dpo_grpo.py --cov=training_model --cov-report=html
+```
+
+### Run in parallel:
+```bash
+pytest tests/test_dpo_grpo.py -n auto
+```
+
+## Test Structure
+
+### DPO Tests (`TestDPOConfiguration`, `TestDPODataPreparation`)
+- Configuration validation
+- Data format validation
+- Data processing and preparation
+- Error handling
+
+### GRPO Tests (`TestGRPOConfiguration`, `TestGRPORewardFunction`, `TestGRPODataPreparation`)
+- Configuration validation
+- Reward function logic
+- Data format validation
+- Data processing and preparation
+- Error handling
+
+### Integration Tests (`TestTrainingIntegration`)
+- Training pipeline integration
+- Mock trainer interactions
+- Configuration passing
+- Memory management
+
+### Data Format Tests (`TestDataFormatValidation`)
+- Schema validation for DPO/GRPO data
+- File format requirements
+- Structure compliance
+
+### Error Handling Tests (`TestErrorHandling`)
+- Invalid configurations
+- Missing data files
+- Malformed data
+- Exception scenarios
+
+## Test Coverage
+
+The test suite covers:
+- ✅ Configuration validation
+- ✅ Data preparation and processing
+- ✅ Reward function logic (GRPO)
+- ✅ Training integration
+- ✅ Data format validation
+- ✅ Error handling and edge cases
+- ✅ Mock trainer interactions
+- ✅ File I/O operations
+- ✅ JSON parsing and validation
+
+## Mocking Strategy
+
+Tests use extensive mocking to avoid:
+- Actual model loading (resource intensive)
+- Network calls
+- Large file I/O operations
+- GPU operations
+- External dependencies
+
+Key mocked components:
+- `DPOTrainer` and `GRPOTrainer` from TRL
+- Model and tokenizer loading
+- Hydra's `get_original_cwd()`
+- File system operations where needed
+
+## Debugging Failed Tests
+
+1. **Run with detailed output:**
+```bash
+pytest tests/test_dpo_grpo.py -v -s --tb=long
+```
+
+2. **Run a specific failing test:**
+```bash
+pytest tests/test_dpo_grpo.py::TestClass::test_method -v -s
+```
+
+3. **Check test data:**
+The tests create temporary directories and files. If tests fail, check that your data files match the expected format.
+
+## Adding New Tests
+
+When adding new functionality:
+
+1. Add test methods to appropriate test classes
+2. Use the provided fixtures for common data
+3. Mock external dependencies
+4. Test both success and failure scenarios
+5. Update this README if needed
+
+## Fixtures
+
+The test file includes several fixtures:
+- `sample_dpo_config`: Standard DPO configuration
+- `sample_grpo_config`: Standard GRPO configuration
+- `sample_dpo_data`: Sample DPO training data
+- `sample_grpo_data`: Sample GRPO training data
+
+Use these fixtures in new tests to maintain consistency.
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..ac0aaf1
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,2 @@
+# tests/__init__.py
+# This file makes the tests directory a Python package
diff --git a/tests/integration/test_training_functions.py b/tests/integration/test_training_functions.py
new file mode 100644
index 0000000..069488d
--- /dev/null
+++ b/tests/integration/test_training_functions.py
@@ -0,0 +1,330 @@
+"""Integration tests for training_model.one_file_train functions.
+
+Uses built-in monkeypatch fixture (no pytest-mock dependency).
+"""
+
+from __future__ import annotations
+
+import json
+import os
+import subprocess
+import tempfile
+from pathlib import Path
+from types import SimpleNamespace
+from typing import TYPE_CHECKING, Any
+
+if TYPE_CHECKING:
+ from collections.abc import Generator
+
+import pytest
+from omegaconf import DictConfig, OmegaConf
+from transformers import AutoTokenizer
+
+import training_model.one_file_train as oft
+from training_model.one_file_train import (
+ change_dir,
+ convert_to_gguf,
+ copy_data,
+ data_preparation,
+ generate_and_tokenize_prompt,
+ generate_prompt,
+ model_merge_for_converting,
+ quantize_model,
+ tokenize,
+)
+
+
+@pytest.fixture
+def temp_dir() -> Generator[str, None, None]:
+ """Create a temporary directory for tests and clean up afterwards."""
+ with tempfile.TemporaryDirectory() as tmpdir:
+ yield tmpdir
+
+
+@pytest.fixture
+def tokenizer() -> AutoTokenizer:
+ """Return a GPT-2 tokenizer patched to behave like training code expects.
+
+ Adds a pad token when missing and a minimal `apply_chat_template` function.
+ """
+ tok = AutoTokenizer.from_pretrained("gpt2")
+ if tok.pad_token is None:
+ pad = tok.eos_token or "<|pad|>"
+ tok.add_special_tokens({"pad_token": pad})
+ tok.pad_token = pad
+ if tok.pad_token_id is None:
+ tok.pad_token_id = tok.convert_tokens_to_ids(pad)
+
+ def apply_chat_template(messages: list, tokenize: bool = False) -> str:
+ parts = [f"{m['role'].upper()}: {m['content']}" for m in messages]
+ return "\n".join(parts)
+
+ tok.apply_chat_template = apply_chat_template # type: ignore[attr-defined]
+ return tok
+
+
+@pytest.fixture
+def test_config() -> DictConfig:
+ """Return a config object matching fields used by one_file_train functions."""
+ return OmegaConf.create(
+ {
+ "paths": {
+ "data_dir": ".",
+ "train_data": "dataset.json",
+ "llama_cpp_dir": ".",
+ "venv_python_path": "python",
+ "final_weights_path": ".",
+ },
+ "testing": {
+ "use_separate_files": False,
+ "test_split_ratio": 0.2,
+ "output_test_file": "test.json",
+ },
+ "other": {"cutoff_len": 128},
+ "data_preparation": {"method": "default"},
+ "model": {
+ "model_name": "gpt2",
+ "new_model": "new_model",
+ "outfile": "model.gguf",
+ "quant": {"qtype": "q4_0", "gguf_dir": "quantized"},
+ "model_type": "hf",
+ },
+ "training": {"seed": 42, "use_grpo": False, "use_sft": False},
+ },
+ )
+
+
+@pytest.fixture
+def sample_dataset(temp_dir: str) -> str:
+ """Create a small dataset.json (dict with '
+ system' and 'examples') and return its path.
+
+ Note: data_preparation expects a
+ dict with "examples" key (not a bare list).
+ """
+ examples = [
+ {"system": "System message", "user": "User query", "bot": "Assistant response"},
+ {"system": "Another system", "user": "Second query", "bot": "Another response"},
+ ]
+ dataset_struct = {"system": "System message", "examples": examples}
+ dataset_path = Path(temp_dir) / "dataset.json"
+ with dataset_path.open("w", encoding="utf-8") as f:
+ json.dump(dataset_struct, f)
+ return str(dataset_path)
+
+
+def test_change_dir(temp_dir: str) -> None:
+ """Test change_dir context manager changes cwd inside context."""
+ original_dir = os.getcwd()
+ with change_dir(temp_dir):
+ assert os.getcwd() == temp_dir
+ assert os.getcwd() == original_dir
+
+
+def test_generate_prompt(tokenizer: AutoTokenizer) -> None:
+ """generate_prompt should return the
+ chat-formatted string containing all parts."""
+ data_point = {
+ "system": "System message",
+ "user": "User query",
+ "bot": "Assistant response",
+ }
+ prompt = generate_prompt(tokenizer, data_point)
+ assert isinstance(prompt, str)
+ assert "System message" in prompt
+ assert "User query" in prompt
+ assert "Assistant response" in prompt
+
+
+def test_tokenize(tokenizer: AutoTokenizer) -> None:
+ """tokenize should return a dict with input_ids padded to cutoff_len."""
+ text = "This is a test string"
+ result = tokenize(tokenizer, 128, text)
+ assert "input_ids" in result
+ assert "attention_mask" in result
+ assert len(result["input_ids"]) == 128
+
+
+def test_generate_and_tokenize_prompt(tokenizer: AutoTokenizer) -> None:
+ """generate_and_tokenize_prompt should
+ return tokenized prompt dict shaped to cutoff."""
+ data_point = {"system": "System", "user": "User", "bot": "Bot"}
+ result = generate_and_tokenize_prompt(data_point, tokenizer, 128)
+ assert "input_ids" in result
+ assert "attention_mask" in result
+ assert len(result["input_ids"]) == 128
+
+
+def test_data_preparation(
+ test_config: DictConfig,
+ tokenizer: AutoTokenizer,
+ sample_dataset: str,
+ monkeypatch,
+) -> None:
+ """data_preparation should load dataset dict
+ and return train/val Dataset objects."""
+ test_config.paths.data_dir = "."
+ test_config.paths.train_data = Path(sample_dataset).name
+
+ # monkeypatch get_original_cwd used inside one_file_train
+ monkeypatch.setattr(oft, "get_original_cwd", lambda: str(Path(sample_dataset).parent))
+
+ train_data, val_data = data_preparation(test_config, tokenizer)
+
+ assert len(train_data) > 0
+ assert len(val_data) > 0
+ assert "input_ids" in train_data.features
+ assert "attention_mask" in val_data.features
+
+
+def test_copy_data(temp_dir: str) -> None:
+ """copy_data expects source file in os.getcwd(); create file there inside change_dir."""
+ with change_dir(temp_dir):
+ test_file = Path(temp_dir) / "test.txt"
+ with test_file.open("w", encoding="utf-8") as f:
+ f.write("test content")
+
+ dest_dir = Path(temp_dir) / "destination"
+ dest_dir.mkdir(parents=True, exist_ok=True)
+
+ copy_data("test.txt", "subdir", str(dest_dir))
+
+ dest_path = dest_dir / "subdir" / "test.txt"
+ assert dest_path.exists()
+ with dest_path.open(encoding="utf-8") as f:
+ assert f.read() == "test content"
+
+
+def test_model_merge_for_converting(
+ test_config: DictConfig,
+ temp_dir: str,
+ monkeypatch,
+) -> None:
+ """Mock HF/PEFT loading calls inside
+ model_merge_for_converting and assert they were used."""
+ calls = {
+ "auto_from_pretrained": False,
+ "tokenizer_from_pretrained": False,
+ "peft_from_pretrained": False,
+ }
+
+ class FakeModel:
+ def resize_token_embeddings(self, _: Any) -> None:
+ pass
+
+ def save_pretrained(self, _: Any) -> None:
+ pass
+
+ class FakePeft:
+ @staticmethod
+ def from_pretrained(_model, _adapter_path) -> SimpleNamespace:
+ calls["peft_from_pretrained"] = True
+ return SimpleNamespace(
+ merge_and_unload=lambda: SimpleNamespace(save_pretrained=lambda _p: None),
+ )
+
+ class FakeAutoModelClass:
+ @classmethod
+ def from_pretrained(cls, *_args: Any, **_kwargs: Any) -> FakeModel:
+ calls["auto_from_pretrained"] = True
+ return FakeModel()
+
+ class FakeTokenizer:
+ def __len__(self) -> int:
+ return 100
+
+ def save_pretrained(self, _) -> None:
+ pass
+
+ class FakeAutoTokenizerClass:
+ @classmethod
+ def from_pretrained(cls, *_args: Any, **_kwargs: Any) -> FakeTokenizer:
+ calls["tokenizer_from_pretrained"] = True
+ return FakeTokenizer()
+
+ monkeypatch.setattr(oft, "AutoModelForCausalLM", FakeAutoModelClass)
+ monkeypatch.setattr(oft, "AutoTokenizer", FakeAutoTokenizerClass)
+ monkeypatch.setattr(oft, "PeftModel", FakePeft)
+
+ save_path = str(Path(temp_dir) / "merged_model")
+ model_merge_for_converting(test_config, 100, save_path)
+
+ assert calls["auto_from_pretrained"]
+ assert calls["tokenizer_from_pretrained"]
+ assert calls["peft_from_pretrained"]
+
+
+def test_convert_to_gguf(test_config: DictConfig, temp_dir: str, monkeypatch) -> None:
+ """convert_to_gguf should call subprocess.run when conversion script exists."""
+ test_config.paths.llama_cpp_dir = temp_dir
+ conv_script = Path(temp_dir) / "convert_hf_to_gguf.py"
+ with conv_script.open("w", encoding="utf-8") as f:
+ f.write("# dummy converter")
+
+ model_path = Path(temp_dir) / "model"
+ model_path.mkdir(parents=True, exist_ok=True)
+
+ def fake_run(*_args: Any, **_kwargs: Any) -> SimpleNamespace:
+ return SimpleNamespace(returncode=0)
+
+ # Patch only subprocess.run (do not replace the module object)
+ monkeypatch.setattr(oft.subprocess, "run", fake_run)
+
+ convert_to_gguf(
+ model_path=str(model_path),
+ outfile=str(Path(temp_dir) / "model.gguf"),
+ python_exe="python",
+ outtype="f16",
+ cfg=test_config,
+ )
+
+
+def test_quantize_model_success(temp_dir: str, monkeypatch) -> None:
+ """quantize_model returns True when quantizer exists and subprocess.run succeeds."""
+ model_path = Path(temp_dir) / "model.gguf"
+ with model_path.open("w", encoding="utf-8") as f:
+ f.write("GGUF mock data")
+
+ quantizer_path = Path(temp_dir) / "llama-quantize"
+ with quantizer_path.open("w", encoding="utf-8") as f:
+ f.write("")
+
+ def fake_run(*_args: Any, **_kwargs: Any) -> SimpleNamespace:
+ return SimpleNamespace(stdout=b"ok", stderr=b"")
+
+ monkeypatch.setattr(oft.subprocess, "run", fake_run)
+
+ result = quantize_model(
+ model_path=str(model_path),
+ outfile=str(Path(temp_dir) / "quantized.gguf"),
+ qtype="q4_0",
+ llama_cpp_path=temp_dir,
+ quantized_path="llama-quantize",
+ )
+
+ assert result is True
+
+
+def test_quantize_model_failure(temp_dir: str, monkeypatch) -> None:
+ """quantize_model should return False when subprocess.run raises CalledProcessError."""
+ quantizer_path = Path(temp_dir) / "llama-quantize"
+ with quantizer_path.open("w", encoding="utf-8") as f:
+ f.write("")
+
+ def fake_run_raises(*_args: Any, **_kwargs: Any) -> None:
+ # raise the real CalledProcessError from the real subprocess module
+ raise subprocess.CalledProcessError(returncode=1, cmd="llama-quantize")
+
+ # Patch only subprocess.run so quantize_model's except subprocess.CalledProcessError
+ # still references the real exception class on the real subprocess module.
+ monkeypatch.setattr(oft.subprocess, "run", fake_run_raises)
+
+ result = quantize_model(
+ model_path=str(Path(temp_dir) / "nonexistent.gguf"),
+ outfile=str(Path(temp_dir) / "quantized.gguf"),
+ qtype="q4_0",
+ llama_cpp_path=temp_dir,
+ quantized_path="llama-quantize",
+ )
+
+ assert result is False
diff --git a/tests/test_requirements.txt b/tests/test_requirements.txt
new file mode 100644
index 0000000..418f213
--- /dev/null
+++ b/tests/test_requirements.txt
@@ -0,0 +1,22 @@
+# Test Requirements
+
+This file lists the required packages for running the test suite.
+Install with: pip install -r test_requirements.txt
+
+# Core testing framework
+pytest>=7.0.0
+pytest-mock>=3.10.0
+pytest-cov>=4.0.0
+
+# Configuration and data handling (already in main requirements)
+omegaconf>=2.3.0
+datasets>=2.14.0
+
+# Transformers and ML libraries (already in main requirements)
+transformers>=4.30.0
+torch>=2.0.0
+
+# Additional testing utilities
+pytest-asyncio>=0.21.0
+pytest-xdist>=3.3.0 # For parallel test execution
+pytest-benchmark>=4.0.0 # For performance testing
diff --git a/tests/unit/test_dpo_grpo.py b/tests/unit/test_dpo_grpo.py
new file mode 100644
index 0000000..c8c4a98
--- /dev/null
+++ b/tests/unit/test_dpo_grpo.py
@@ -0,0 +1,1001 @@
+"""
+Comprehensive pytest test suite for DPO and GRPO functionality.
+
+This module tests:
+- DPO configuration validation
+- DPO data preparation and processing
+- GRPO configuration validation
+- GRPO data preparation and reward functions
+- Integration with training pipeline
+- Data format validation
+- Error handling and edge cases
+"""
+
+import json
+import tempfile
+from pathlib import Path
+from unittest.mock import MagicMock, patch
+
+import pytest
+from datasets import Dataset
+from omegaconf import DictConfig, OmegaConf
+
+# Import modules to test
+from training_model.dpo_train import (
+ dpo_train,
+ prepare_dpo_data,
+ validate_dpo_config,
+)
+from training_model.grpo_train import (
+ debug_reward_function,
+ grpo_train,
+ prepare_grpo_data,
+ reward_function,
+ validate_grpo_config,
+)
+
+
+class TestDPOConfiguration:
+ """Test DPO configuration validation and setup."""
+
+ def test_validate_dpo_config_success(self) -> None:
+ """Test successful DPO configuration validation."""
+ # Create temporary data files
+ with tempfile.TemporaryDirectory() as temp_dir:
+ # Create test config
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ "train_data": "dpo_dataset.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data files
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ test_data = {
+ "system": "Test system",
+ "examples": {
+ "test1": {
+ "prompt": "Test prompt",
+ "chosen": "Good response",
+ "rejected": "Bad response",
+ },
+ },
+ }
+
+ with (data_dir / "dpo_test.json").open("w") as f:
+ json.dump(test_data, f)
+ with (data_dir / "dpo_dataset.json").open("w") as f:
+ json.dump(test_data, f)
+
+ # Mock get_original_cwd to return temp directory
+ with patch("training_model.dpo_train.get_original_cwd", return_value=temp_dir):
+ result = validate_dpo_config(cfg)
+ assert result is True
+
+ def test_validate_dpo_config_missing_params(self) -> None:
+ """Test DPO configuration validation with missing parameters."""
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ # Missing train_data
+ },
+ },
+ )
+
+ result = validate_dpo_config(cfg)
+ assert result is False
+
+ def test_validate_dpo_config_missing_files(self) -> None:
+ """Test DPO configuration validation with missing data files."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "nonexistent.json",
+ "train_data": "also_nonexistent.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ with patch("training_model.dpo_train.get_original_cwd", return_value=temp_dir):
+ result = validate_dpo_config(cfg)
+ assert result is False
+
+
+class TestDPODataPreparation:
+ """Test DPO data preparation and processing."""
+
+ def test_prepare_dpo_data_success(self) -> None:
+ """Test successful DPO data preparation."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ "train_data": "dpo_dataset.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ test_data = {
+ "system": "You are a helpful assistant",
+ "examples": {
+ "topic1": {
+ "prompt": "What is AI?",
+ "chosen": "AI is artificial intelligence.",
+ "rejected": "AI is just a buzzword.",
+ },
+ "topic2": {
+ "prompt": "How do computers work?",
+ "chosen": "Computers process data using binary operations.",
+ "rejected": "Computers are magic boxes.",
+ },
+ },
+ }
+
+ with (data_dir / "dpo_test.json").open("w") as f:
+ json.dump(test_data, f)
+ with (data_dir / "dpo_dataset.json").open("w") as f:
+ json.dump(test_data, f)
+
+ with patch("training_model.dpo_train.get_original_cwd", return_value=temp_dir):
+ train_data, val_data = prepare_dpo_data(cfg)
+
+ assert isinstance(train_data, Dataset)
+ assert isinstance(val_data, Dataset)
+ assert len(train_data) == 2
+ assert len(val_data) == 2
+
+ # Check data structure
+ sample = train_data[0]
+ assert "prompt" in sample
+ assert "chosen" in sample
+ assert "rejected" in sample
+ assert "topic" in sample
+ assert "System: You are a helpful assistant" in sample["prompt"]
+
+ def test_prepare_dpo_data_invalid_structure(self) -> None:
+ """Test DPO data preparation with invalid data structure."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ "train_data": "dpo_dataset.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data with missing fields
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ invalid_data = {
+ "system": "Test system",
+ "examples": {
+ "topic1": {
+ "prompt": "Test prompt",
+ "chosen": "Good response",
+ # Missing rejected field
+ },
+ "topic2": {
+ "chosen": "Another good response",
+ "rejected": "Bad response",
+ # Missing prompt field
+ },
+ },
+ }
+
+ with (Path(data_dir) / "dpo_test.json").open("w") as f:
+ json.dump(invalid_data, f)
+ with (Path(data_dir) / "dpo_dataset.json").open("w") as f:
+ json.dump(invalid_data, f)
+
+ with patch("training_model.dpo_train.get_original_cwd", return_value=temp_dir):
+ train_data, val_data = prepare_dpo_data(cfg)
+
+ # Should filter out invalid examples
+ assert len(train_data) == 0 # Both examples are invalid
+ assert len(val_data) == 0
+
+
+class TestGRPOConfiguration:
+ """Test GRPO configuration validation and setup."""
+
+ def test_validate_grpo_config_success(self) -> None:
+ """Test successful GRPO configuration validation."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ "num_generations": 2,
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data files
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ test_data = {
+ "system": "Test system",
+ "examples": {
+ "topic1": {
+ "prompt": {"History": ["Test"], "UserInput": "Test input"},
+ "answer": {"Content": {"Action": "Test action"}},
+ },
+ },
+ }
+
+ with (data_dir / "test_ru.json").open("w") as f:
+ json.dump(test_data, f)
+ with (data_dir / "dataset_ru.json").open("w") as f:
+ json.dump(test_data, f)
+
+ with patch("training_model.grpo_train.get_original_cwd", return_value=temp_dir):
+ result = validate_grpo_config(cfg)
+ assert result is True
+
+ def test_validate_grpo_config_missing_params(self) -> None:
+ """Test GRPO configuration validation with missing parameters."""
+ cfg = OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ # Missing num_generations
+ },
+ },
+ )
+
+ result = validate_grpo_config(cfg)
+ assert result is False
+
+
+class TestGRPORewardFunction:
+ """Test GRPO reward function and evaluation."""
+
+ def test_reward_function_correct_json(self) -> None:
+ """Test reward function with correct JSON format."""
+ completions = [
+ '{"Content": {"Action": "Разговор"}}',
+ '{"Content": {"Action": "Игра"}}',
+ '{"Content": {"Action": "Разговор"}}',
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 3
+ assert rewards[0] == 1.0 # Correct match
+ assert rewards[1] == 0.0 # Wrong action
+ assert rewards[2] == 1.0 # Correct match
+
+ def test_reward_function_invalid_json(self) -> None:
+ """Test reward function with invalid JSON."""
+ completions = [
+ "not json at all",
+ '{"Invalid": "structure"}',
+ '{"Content": "not a dict"}',
+ "",
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 4
+ assert all(reward == -1.0 for reward in rewards)
+
+ def test_reward_function_missing_correct_answer(self) -> None:
+ """Test reward function without correct answer."""
+ completions = ['{"Content": {"Action": "Test"}}']
+
+ rewards = reward_function(completions) # No correct_answer
+
+ assert len(rewards) == 1
+ assert rewards[0] == -1.0
+
+ def test_test_reward_function(self) -> None:
+ """Test the reward function testing utility."""
+ completions = [
+ '{"Content": {"Action": "Разговор"}}',
+ '{"Content": {"Action": "Игра"}}',
+ "invalid json",
+ ]
+ correct_answer = "Разговор"
+
+ results = debug_reward_function(completions, correct_answer)
+
+ # Check that all four reward functions are reported
+ assert "original" in results
+ assert "json_validation" in results
+ assert "action_extraction" in results
+ assert "combined" in results
+
+ # Check original function results (backward compatibility check)
+ assert results["original"]["total_completions"] == 3
+ assert results["original"]["positive_rewards"] == 1
+ assert results["original"]["zero_rewards"] == 1
+ assert results["original"]["negative_rewards"] == 1
+ assert abs(results["original"]["average_reward"] - 0.0) < 0.01
+
+
+class TestGRPORewardFunctionSeparated:
+ """Test separated reward functions for JSON validation and action extraction."""
+
+ def test_json_validation_valid_structure(self) -> None:
+ """Test JSON validation with correct structure."""
+ from training_model.grpo_train import reward_function_json_validation
+
+ completions = [
+ '{"Content": {"Action": "Разговор"}}',
+ '{"Content": {"Action": "Игра"}}',
+ ]
+
+ rewards = reward_function_json_validation(completions)
+
+ assert len(rewards) == 2
+ assert all(r == 1.0 for r in rewards)
+
+ def test_json_validation_invalid_structure(self) -> None:
+ """Test JSON validation with various invalid structures."""
+ from training_model.grpo_train import reward_function_json_validation
+
+ completions = [
+ "not json at all",
+ '{"Invalid": "structure"}',
+ '{"Content": "not a dict"}',
+ '{"Content": {}}', # Missing Action
+ "",
+ ]
+
+ rewards = reward_function_json_validation(completions)
+
+ assert len(rewards) == 5
+ assert all(r == -1.0 for r in rewards)
+
+ def test_action_extraction_from_valid_json(self) -> None:
+ """Test action extraction from properly formatted JSON."""
+ from training_model.grpo_train import reward_function_action_extraction
+
+ completions = [
+ '{"Content": {"Action": "Разговор"}}',
+ '{"Content": {"Action": "Игра"}}',
+ '{"Content": {"Action": "Разговор"}}',
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function_action_extraction(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 3
+ assert rewards[0] == 1.0 # Correct match
+ assert rewards[1] == 0.0 # Wrong action
+ assert rewards[2] == 1.0 # Correct match
+
+ def test_action_extraction_from_malformed_json(self) -> None:
+ """Test action extraction with fallback strategies on malformed JSON."""
+ from training_model.grpo_train import reward_function_action_extraction
+
+ completions = [
+ 'Action: "Разговор"', # Simple format
+ "Content: {Action: Разговор}", # Missing quotes
+ "Some text Action: Разговор more text", # Surrounded by text
+ '{"Content": {"Action": "Игра"}}', # Valid JSON but wrong action
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function_action_extraction(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 4
+ assert rewards[0] == 1.0 # Extracted via regex
+ assert rewards[1] == 1.0 # Extracted via regex
+ assert rewards[2] == 1.0 # Extracted via string search
+ assert rewards[3] == 0.0 # Valid but wrong action
+
+ def test_action_extraction_complete_failure(self) -> None:
+ """Test action extraction returns -1.0 when extraction completely fails."""
+ from training_model.grpo_train import reward_function_action_extraction
+
+ completions = [
+ "completely random text",
+ "",
+ "123456",
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function_action_extraction(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 3
+ assert all(r == -1.0 for r in rewards)
+
+ def test_combined_reward_function_weighting(self) -> None:
+ """Test combined reward function with proper weighting."""
+ from training_model.grpo_train import reward_function_combined
+
+ completions = [
+ '{"Content": {"Action": "Разговор"}}', # Perfect: JSON=1, Action=1
+ 'Action: "Разговор"', # Correct action, malformed JSON: JSON=-1, Action=1
+ 'Action: "Игра"', # Wrong action, malformed JSON: JSON=-1, Action=0
+ "garbage", # Both fail: JSON=-1, Action=-1
+ ]
+ correct_answer = "Разговор"
+
+ # Default weights: 0.3 JSON, 0.7 Action
+ rewards = reward_function_combined(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 4
+ # Perfect: 0.3*1 + 0.7*1 = 1.0
+ assert abs(rewards[0] - 1.0) < 0.01
+ # Correct action: 0.3*(-1) + 0.7*1 = 0.4
+ assert abs(rewards[1] - 0.4) < 0.01
+ # Wrong action: 0.3*(-1) + 0.7*0 = -0.3
+ assert abs(rewards[2] - (-0.3)) < 0.01
+ # Both fail: 0.3*(-1) + 0.7*(-1) = -1.0
+ assert abs(rewards[3] - (-1.0)) < 0.01
+
+ def test_combined_reward_function_custom_weights(self) -> None:
+ """Test combined reward function with custom weights."""
+ from training_model.grpo_train import reward_function_combined
+
+ completions = ['Action: "Разговор"']
+ correct_answer = "Разговор"
+
+ # Custom weights: 0.5 JSON, 0.5 Action
+ rewards = reward_function_combined(
+ completions,
+ json_weight=0.5,
+ action_weight=0.5,
+ correct_answer=correct_answer,
+ )
+
+ assert len(rewards) == 1
+ # 0.5*(-1) + 0.5*1 = 0.0
+ assert abs(rewards[0] - 0.0) < 0.01
+
+ def test_action_extraction_case_sensitivity(self) -> None:
+ """Test that action extraction is case-sensitive."""
+ from training_model.grpo_train import reward_function_action_extraction
+
+ completions = [
+ 'Action: "Разговор"',
+ 'Action: "разговор"', # Lowercase - should not match
+ ]
+ correct_answer = "Разговор"
+
+ rewards = reward_function_action_extraction(completions, correct_answer=correct_answer)
+
+ assert len(rewards) == 2
+ assert rewards[0] == 1.0 # Exact match
+ assert rewards[1] == 0.0 # Case mismatch
+
+ def test_debug_reward_function_comprehensive(self) -> None:
+ """Test that debug function reports all four reward functions."""
+ from training_model.grpo_train import debug_reward_function
+
+ completions = [
+ '{"Content": {"Action": "Разговор"}}',
+ 'Action: "Разговор"',
+ 'Action: "Игра"',
+ "garbage",
+ ]
+ correct_answer = "Разговор"
+
+ results = debug_reward_function(completions, correct_answer)
+
+ # Should have all four functions
+ assert "original" in results
+ assert "json_validation" in results
+ assert "action_extraction" in results
+ assert "combined" in results
+
+ # Each should have stats
+ for func_name in ["original", "json_validation", "action_extraction", "combined"]:
+ assert "total_completions" in results[func_name]
+ assert "positive_rewards" in results[func_name]
+ assert "zero_rewards" in results[func_name]
+ assert "negative_rewards" in results[func_name]
+ assert "average_reward" in results[func_name]
+ assert "rewards" in results[func_name]
+ assert len(results[func_name]["rewards"]) == 4
+
+
+class TestGRPODataPreparation:
+ """Test GRPO data preparation and processing."""
+
+ def test_prepare_grpo_data_success(self) -> None:
+ """Test successful GRPO data preparation."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ test_data = {
+ "system": "You are a helpful assistant",
+ "examples": {
+ "topic1": {
+ "prompt": {
+ "History": ["Previous conversation"],
+ "AvailableActions": ["Разговор", "Игра", "Обучение"],
+ "UserInput": "Привет, как дела?",
+ },
+ "answer": {"Content": {"Action": "Разговор"}},
+ },
+ "topic2": {
+ "prompt": {
+ "History": ["Game started"],
+ "AvailableActions": ["Игра", "Обучение"],
+ "UserInput": "Давай играть",
+ },
+ "answer": {"Content": {"Action": "Игра"}},
+ },
+ },
+ }
+
+ with (data_dir / "test_ru.json").open("w") as f:
+ json.dump(test_data, f)
+ with (data_dir / "dataset_ru.json").open("w") as f:
+ json.dump(test_data, f)
+
+ with patch("training_model.grpo_train.get_original_cwd", return_value=temp_dir):
+ train_data, val_data = prepare_grpo_data(cfg)
+
+ assert isinstance(train_data, Dataset)
+ assert isinstance(val_data, Dataset)
+ assert len(train_data) == 2
+ assert len(val_data) == 2
+
+ # Check data structure
+ sample = train_data[0]
+ assert "prompt" in sample
+ assert "correct_answer" in sample
+ assert "topic" in sample
+ assert "System: You are a helpful assistant" in sample["prompt"]
+ assert "Available Actions:" in sample["prompt"]
+ assert "JSON object" in sample["prompt"]
+
+ def test_prepare_grpo_data_invalid_structure(self) -> None:
+ """Test GRPO data preparation with invalid data structure."""
+ with tempfile.TemporaryDirectory() as temp_dir:
+ cfg = OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ },
+ "paths": {"data_dir": "data"},
+ },
+ )
+
+ # Create test data with invalid structure
+ data_dir = Path(temp_dir) / "data"
+ data_dir.mkdir(exist_ok=True)
+
+ invalid_data = {
+ "system": "Test system",
+ "examples": {
+ "topic1": {
+ "prompt": {"UserInput": "Test"},
+ "answer": "invalid_answer_format", # Should be dict
+ },
+ "topic2": {
+ "prompt": {"UserInput": "Test"},
+ "answer": {"Content": {}}, # Missing Action
+ },
+ },
+ }
+
+ with (Path(data_dir) / "test_ru.json").open("w") as f:
+ json.dump(invalid_data, f)
+ with (Path(data_dir) / "dataset_ru.json").open("w") as f:
+ json.dump(invalid_data, f)
+
+ with patch("training_model.grpo_train.get_original_cwd", return_value=temp_dir):
+ train_data, val_data = prepare_grpo_data(cfg)
+
+ # Should filter out invalid examples
+ assert len(train_data) == 0
+ assert len(val_data) == 0
+
+
+class TestTrainingIntegration:
+ """Test integration with training pipeline."""
+
+ @patch("training_model.dpo_train.DPOTrainer")
+ @patch("training_model.dpo_train.DPOConfig")
+ def test_dpo_train_integration(self, mock_dpo_config, mock_trainer) -> None:
+ """Test DPO training integration."""
+ # Mock configuration
+ cfg = OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ "train_data": "dpo_dataset.json",
+ "beta": 0.1,
+ "loss_type": "sigmoid",
+ "max_length": 1024,
+ "max_prompt_length": 512,
+ "max_target_length": 512,
+ },
+ "model": {"new_model": "test_model"},
+ "training": {
+ "per_device_train_batch_size": 1,
+ "per_device_eval_batch_size": 1,
+ "gradient_accumulation_steps": 1,
+ "learning_rate": 1e-5,
+ "num_train_epochs": 1,
+ "logging_steps": 10,
+ "eval_steps": 100,
+ "warmup_steps": 0,
+ "fp16": False,
+ "bf16": True,
+ "weight_decay": 0.01,
+ "gradient_checkpointing": True,
+ "save_total_limit": 1,
+ "load_best": False,
+ },
+ "other": {"cutoff_len": 2048},
+ },
+ )
+
+ # Mock trainer
+ mock_trainer_instance = MagicMock()
+ mock_trainer_instance.state.global_step = 100
+ mock_trainer_instance.state.log_history = [{"eval_loss": 0.5}]
+ mock_trainer.return_value = mock_trainer_instance
+
+ # Mock model and tokenizer
+ mock_model = MagicMock()
+ mock_tokenizer = MagicMock()
+
+ # Mock data preparation
+ mock_train_data = Dataset.from_list(
+ [{"prompt": "test", "chosen": "good", "rejected": "bad"}],
+ )
+ mock_val_data = Dataset.from_list(
+ [{"prompt": "test2", "chosen": "good2", "rejected": "bad2"}],
+ )
+
+ with (
+ patch("training_model.dpo_train.validate_dpo_config", return_value=True),
+ patch(
+ "training_model.dpo_train.prepare_dpo_data",
+ return_value=(mock_train_data, mock_val_data),
+ ),
+ ):
+ result = dpo_train(mock_model, mock_tokenizer, cfg)
+
+ assert result == 100
+ mock_trainer.assert_called_once()
+ mock_trainer_instance.train.assert_called_once()
+
+ @patch("training_model.grpo_train.GRPOTrainer")
+ @patch("training_model.grpo_train.GRPOConfig")
+ def test_grpo_train_integration(self, mock_grpo_config, mock_trainer) -> None:
+ """Test GRPO training integration."""
+ # Mock configuration
+ cfg = OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ "num_generations": 2,
+ "max_completion_length": 1024,
+ "epsilon": 0.2,
+ "beta": 0.01,
+ "loss_type": "sigmoid",
+ "do_sample": True,
+ "temperature": 0.7,
+ "top_k": 50,
+ "top_p": 0.95,
+ "response_length": 256,
+ },
+ "model": {"new_model": "test_model"},
+ "training": {
+ "per_device_train_batch_size": 1,
+ "gradient_accumulation_steps": 1,
+ "learning_rate": 1e-5,
+ "num_train_epochs": 1,
+ "logging_steps": 10,
+ "eval_steps": 100,
+ "warmup_steps": 0,
+ "fp16": False,
+ "bf16": True,
+ "weight_decay": 0.01,
+ "gradient_checkpointing": True,
+ "save_total_limit": 1,
+ "load_best": False,
+ },
+ },
+ )
+
+ # Mock trainer
+ mock_trainer_instance = MagicMock()
+ mock_trainer_instance.state.global_step = 200
+ mock_trainer_instance.state.log_history = [{"train_loss": 0.3}]
+ mock_trainer.return_value = mock_trainer_instance
+
+ # Mock model and tokenizer
+ mock_model = MagicMock()
+ mock_tokenizer = MagicMock()
+ mock_tokenizer.pad_token_id = 0
+ mock_tokenizer.model_max_length = 2048
+
+ # Mock data preparation
+ mock_train_data = Dataset.from_list(
+ [{"prompt": "test prompt", "correct_answer": "Разговор"}],
+ )
+ mock_val_data = Dataset.from_list(
+ [{"prompt": "test prompt2", "correct_answer": "Игра"}],
+ )
+
+ with (
+ patch("training_model.grpo_train.validate_grpo_config", return_value=True),
+ patch(
+ "training_model.grpo_train.prepare_grpo_data",
+ return_value=(mock_train_data, mock_val_data),
+ ),
+ ):
+ result = grpo_train(mock_model, mock_tokenizer, cfg, None)
+
+ assert result == 200
+ mock_trainer.assert_called_once()
+ mock_trainer_instance.train.assert_called_once()
+
+
+class TestDataFormatValidation:
+ """Test data format validation and structure."""
+
+ def test_dpo_data_format_validation(self) -> None:
+ """Test DPO data format validation against schema."""
+ # Load actual DPO data files if they exist
+ project_root = Path(__file__).parent.parent
+ dpo_dataset_path = project_root / "data" / "dpo_dataset.json"
+
+ if dpo_dataset_path.exists():
+ with dpo_dataset_path.open(encoding="utf-8") as f:
+ data = json.load(f)
+
+ # Validate schema
+ assert "system" in data
+ assert "examples" in data
+ assert isinstance(data["examples"], dict)
+
+ for topic, example in data["examples"].items():
+ assert isinstance(topic, str)
+ assert "prompt" in example
+ assert "chosen" in example
+ assert "rejected" in example
+ assert isinstance(example["prompt"], str)
+ assert isinstance(example["chosen"], str)
+ assert isinstance(example["rejected"], str)
+
+ def test_grpo_data_format_requirements(self) -> None:
+ """Test GRPO data format requirements."""
+ # Test expected GRPO data structure
+ test_data = {
+ "system": "Test system",
+ "examples": {
+ "topic1": {
+ "prompt": {
+ "History": ["conversation history"],
+ "AvailableActions": ["Action1", "Action2"],
+ "UserInput": "user input",
+ },
+ "answer": {"Content": {"Action": "Action1"}},
+ },
+ },
+ }
+
+ # Validate structure
+ assert "system" in test_data
+ assert "examples" in test_data
+
+ for example in test_data["examples"].values():
+ assert "prompt" in example
+ assert "answer" in example
+
+ prompt = example["prompt"]
+ assert "UserInput" in prompt
+
+ answer = example["answer"]
+ assert "Content" in answer
+ assert "Action" in answer["Content"]
+
+
+class TestErrorHandling:
+ """Test error handling and edge cases."""
+
+ def test_dpo_train_validation_failure(self) -> None:
+ """Test DPO training with validation failure."""
+ cfg = OmegaConf.create({"dpo": {}}) # Missing required fields
+
+ mock_model = MagicMock()
+ mock_tokenizer = MagicMock()
+
+ with pytest.raises(ValueError, match="DPO configuration validation failed"):
+ dpo_train(mock_model, mock_tokenizer, cfg)
+
+ def test_grpo_train_validation_failure(self) -> None:
+ """Test GRPO training with validation failure."""
+ cfg = OmegaConf.create({"grpo": {}}) # Missing required fields
+
+ mock_model = MagicMock()
+ mock_tokenizer = MagicMock()
+
+ with pytest.raises(ValueError, match="GRPO configuration validation failed"):
+ grpo_train(mock_model, mock_tokenizer, cfg, None)
+
+ def test_reward_function_exception_handling(self) -> None:
+ """Test reward function with exceptions."""
+ completions = [
+ '{"Content": {"Action": "Test"}}', # Valid
+ None, # Will cause exception
+ 42, # Will cause exception
+ ]
+
+ # Convert to strings as the function expects
+ str_completions = [str(c) if c is not None else "" for c in completions]
+
+ rewards = reward_function(str_completions, correct_answer="Test")
+
+ assert len(rewards) == 3
+ assert rewards[0] == 1.0 # Valid and correct
+ assert rewards[1] == -1.0 # Empty string
+ assert rewards[2] == -1.0 # Invalid JSON
+
+
+# Pytest fixtures for common test data
+@pytest.fixture
+def sample_dpo_config() -> DictConfig:
+ """Fixture providing sample DPO configuration."""
+ return OmegaConf.create(
+ {
+ "dpo": {
+ "val_data": "dpo_test.json",
+ "train_data": "dpo_dataset.json",
+ "beta": 0.1,
+ "loss_type": "sigmoid",
+ "max_length": 1024,
+ },
+ "paths": {"data_dir": "data"},
+ "model": {"new_model": "test_model"},
+ "training": {
+ "per_device_train_batch_size": 1,
+ "per_device_eval_batch_size": 1,
+ "gradient_accumulation_steps": 1,
+ "learning_rate": 1e-5,
+ "num_train_epochs": 1,
+ "logging_steps": 10,
+ "eval_steps": 100,
+ "warmup_steps": 0,
+ "fp16": False,
+ "bf16": True,
+ "weight_decay": 0.01,
+ "gradient_checkpointing": True,
+ "save_total_limit": 1,
+ "load_best": False,
+ },
+ "other": {"cutoff_len": 2048},
+ },
+ )
+
+
+@pytest.fixture
+def sample_grpo_config() -> DictConfig:
+ """Fixture providing sample GRPO configuration."""
+ return OmegaConf.create(
+ {
+ "grpo": {
+ "val_data": "test_ru.json",
+ "train_data": "dataset_ru.json",
+ "num_generations": 2,
+ "max_completion_length": 1024,
+ "epsilon": 0.2,
+ "beta": 0.01,
+ "loss_type": "sigmoid",
+ "do_sample": True,
+ "temperature": 0.7,
+ "top_k": 50,
+ "top_p": 0.95,
+ "response_length": 256,
+ },
+ "paths": {"data_dir": "data"},
+ "model": {"new_model": "test_model"},
+ "training": {
+ "per_device_train_batch_size": 1,
+ "gradient_accumulation_steps": 1,
+ "learning_rate": 1e-5,
+ "num_train_epochs": 1,
+ "logging_steps": 10,
+ "eval_steps": 100,
+ "warmup_steps": 0,
+ "fp16": False,
+ "bf16": True,
+ "weight_decay": 0.01,
+ "gradient_checkpointing": True,
+ "save_total_limit": 1,
+ "load_best": False,
+ },
+ },
+ )
+
+
+@pytest.fixture
+def sample_dpo_data() -> dict:
+ """Fixture providing sample DPO data."""
+ return {
+ "system": "You are a helpful assistant",
+ "examples": {
+ "topic1": {
+ "prompt": "What is the capital of France?",
+ "chosen": "The capital of France is Paris.",
+ "rejected": "I don't know.",
+ },
+ "topic2": {
+ "prompt": "How do you make coffee?",
+ "chosen": (
+ "To make coffee, you need coffee beans, hot water, "
+ "and a brewing method like a coffee maker or French press."
+ ),
+ "rejected": "Just add water to coffee.",
+ },
+ },
+ }
+
+
+@pytest.fixture
+def sample_grpo_data() -> dict:
+ """Fixture providing sample GRPO data."""
+ return {
+ "system": "You are Vika, a helpful AI assistant",
+ "examples": {
+ "topic1": {
+ "prompt": {
+ "History": ["User started conversation"],
+ "AvailableActions": ["Разговор", "Игра", "Обучение"],
+ "UserInput": "Привет!",
+ },
+ "answer": {"Content": {"Action": "Разговор"}},
+ },
+ "topic2": {
+ "prompt": {
+ "History": ["Playing a game"],
+ "AvailableActions": ["Игра", "Обучение"],
+ "UserInput": "Продолжим играть?",
+ },
+ "answer": {"Content": {"Action": "Игра"}},
+ },
+ },
+ }
+
+
+if __name__ == "__main__":
+ # Run tests with pytest
+ pytest.main([__file__, "-v", "--tb=short"])
diff --git a/tools/dataset/analyze_dataset.py b/tools/dataset/analyze_dataset.py
new file mode 100644
index 0000000..4dc2ef3
--- /dev/null
+++ b/tools/dataset/analyze_dataset.py
@@ -0,0 +1,100 @@
+import json
+from collections import Counter
+from pathlib import Path
+
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+print(f"Total examples: {len(examples)}\n")
+
+# Action distribution
+actions = [
+ ex.get("answer", {}).get("Content", {}).get("Action", "") for ex in examples.values()
+]
+action_counts = Counter(actions)
+print("=" * 60)
+print("ACTION DISTRIBUTION:")
+print("=" * 60)
+for action, count in action_counts.most_common():
+ percentage = (count / len(examples)) * 100
+ print(f"{action:40s}: {count:3d} ({percentage:5.1f}%)")
+
+# Response lengths
+messages = [ex.get("answer", {}).get("MessageText", "") for ex in examples.values()]
+msg_lengths = [len(m) for m in messages]
+print(f"\n{'=' * 60}")
+print("RESPONSE STATISTICS:")
+print("=" * 60)
+print(f"Average response length: {sum(msg_lengths) / len(msg_lengths):.1f} chars")
+print(f"Max response length: {max(msg_lengths)} chars")
+print(f"Min response length: {min(msg_lengths)} chars")
+print(f"Empty responses: {sum(1 for m in messages if not m.strip())}")
+
+# History lengths
+history_lengths = [len(ex.get("prompt", {}).get("History", [])) for ex in examples.values()]
+print(f"\n{'=' * 60}")
+print("HISTORY STATISTICS:")
+print("=" * 60)
+print(f"Average history length: {sum(history_lengths) / len(history_lengths):.1f} messages")
+print(f"Max history length: {max(history_lengths)} messages")
+print(f"Min history length: {min(history_lengths)} messages")
+
+# Duplicates
+histories = [" ".join(ex.get("prompt", {}).get("History", [])) for ex in examples.values()]
+user_inputs = [ex.get("prompt", {}).get("UserInput", "") for ex in examples.values()]
+hist_counter = Counter(histories)
+input_counter = Counter(user_inputs)
+dup_histories = sum(1 for count in hist_counter.values() if count > 1)
+dup_inputs = sum(1 for count in input_counter.values() if count > 1)
+print(f"\n{'=' * 60}")
+print("DUPLICATE DETECTION:")
+print("=" * 60)
+print(f"Duplicate histories: {dup_histories}/{len(examples)}")
+print(f"Duplicate user inputs: {dup_inputs}/{len(examples)}")
+
+# Incomplete examples
+incomplete = 0
+for key, example in examples.items():
+ prompt_data = example.get("prompt", {})
+ answer_data = example.get("answer", {})
+ if (
+ not prompt_data.get("History")
+ or not prompt_data.get("UserInput")
+ or not answer_data.get("MessageText")
+ or not answer_data.get("Content", {}).get("Action")
+ ):
+ incomplete += 1
+print(f"\n{'=' * 60}")
+print("DATA QUALITY:")
+print("=" * 60)
+print(f"Incomplete examples: {incomplete}/{len(examples)}")
+
+# Available actions consistency
+avail_actions_list = []
+for ex in examples.values():
+ avail = ex.get("prompt", {}).get("AvailableActions", [])
+ avail_actions_list.extend(avail)
+unique_available = set(avail_actions_list)
+unique_used = set(actions)
+print(f"\nUnique actions in AvailableActions fields: {len(unique_available)}")
+print(f"Unique actions actually used in answers: {len(unique_used)}")
+print("\nActions used but never in AvailableActions:")
+for action in unique_used - unique_available:
+ if action:
+ print(f" - {action}")
+
+# System prompt variations
+system_prompts = []
+for ex in examples.values():
+ hist = ex.get("prompt", {}).get("History", [])
+ if hist:
+ system_prompts.append(hist[0])
+sys_counter = Counter(system_prompts)
+print(f"\n{'=' * 60}")
+print("SYSTEM PROMPT VARIATIONS:")
+print("=" * 60)
+print(f"Unique system prompts: {len(sys_counter)}")
+for sp, count in sys_counter.most_common(5):
+ print(f" ({count}x) {sp[:70]}...")
diff --git a/tools/dataset/analyze_game_coverage.py b/tools/dataset/analyze_game_coverage.py
new file mode 100644
index 0000000..51f44d9
--- /dev/null
+++ b/tools/dataset/analyze_game_coverage.py
@@ -0,0 +1,120 @@
+import json
+from collections import Counter, defaultdict
+
+data_path = "T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru.json"
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+print("=" * 70)
+print("GAME SCENARIO COVERAGE ANALYSIS")
+print("=" * 70)
+
+# Analyze by scenario based on example keys
+scenarios = defaultdict(list)
+for key in examples.keys():
+ scenarios[key.split("_")[0]].append(key)
+
+print("\nScenarios in dataset:")
+for scenario, keys in sorted(scenarios.items()):
+ print(f" {scenario}: {len(keys)} examples")
+
+# Check for specific game mechanics mentioned in plot
+game_mechanics = {
+ "authentication": ["доказать", "ценност", "сотрудник", "компани", "RTUITLab"],
+ "door_actions": ["открыть дверь", "открыть главную дверь", "дверь в"],
+ "light_control": ["свет", "электричество", "освещ"],
+ "gas_emergency": ["газ", "труб", "B8", "A3", "L7", "утечка"],
+ "oxygen_control": ["кислород", "задохн"],
+ "cabin_access": ["каюта", "ящик", "пропуск"],
+ "engineer_section": ["инженерн", "манипулятор", "починк"],
+ "information_hiding": ["скрыва", "конфиденциальн", "журнал", "записи"],
+ "brevity_requests": ["коротко", "быстр", "не по предписани"],
+}
+
+print("\n" + "=" * 70)
+print("GAME MECHANIC COVERAGE")
+print("=" * 70)
+
+mechanic_coverage = {}
+for mechanic, keywords in game_mechanics.items():
+ count = 0
+ for ex in examples.values():
+ prompt_text = str(ex.get("prompt", {}))
+ answer_text = str(ex.get("answer", {}))
+ full_text = (prompt_text + answer_text).lower()
+ if any(kw.lower() in full_text for kw in keywords):
+ count += 1
+ mechanic_coverage[mechanic] = count
+ print(f"{mechanic:25s}: {count:3d} examples")
+
+# Analyze available actions vs game requirements
+print("\n" + "=" * 70)
+print("AVAILABLE ACTIONS IN DATASET")
+print("=" * 70)
+
+all_available_actions = set()
+for ex in examples.values():
+ actions = ex.get("prompt", {}).get("AvailableActions", [])
+ all_available_actions.update(actions)
+
+print(f"Total unique actions in AvailableActions: {len(all_available_actions)}")
+for action in sorted(all_available_actions):
+ print(f" - {action}")
+
+# Actions used in answers
+all_answer_actions = Counter()
+for ex in examples.values():
+ action = ex.get("answer", {}).get("Content", {}).get("Action", "")
+ if action:
+ all_answer_actions[action] += 1
+
+print("\n" + "=" * 70)
+print("ACTIONS USED IN TRAINING ANSWERS")
+print("=" * 70)
+for action, count in all_answer_actions.most_common():
+ print(f" {action}: {count} examples")
+
+# Check for missing critical game actions
+print("\n" + "=" * 70)
+print("MISSING GAME MECHANICS")
+print("=" * 70)
+
+critical_missing = []
+if mechanic_coverage["cabin_access"] < 5:
+ critical_missing.append("- Cabin/crew quarters access (каюта экипажа)")
+if mechanic_coverage["engineer_section"] < 5:
+ critical_missing.append("- Engineering section interactions (инженерный отдел)")
+if mechanic_coverage["brevity_requests"] < 5:
+ critical_missing.append("- Player requesting brief/non-bureaucratic responses")
+if mechanic_coverage["information_hiding"] < 5:
+ critical_missing.append("- VIKA hiding information about anomaly/crew")
+
+if critical_missing:
+ print("Critical game scenarios with insufficient examples:")
+ for item in critical_missing:
+ print(f" {item}")
+else:
+ print("All critical game mechanics have some coverage.")
+
+# Analyze conversation patterns
+print("\n" + "=" * 70)
+print("CONVERSATION DEPTH ANALYSIS")
+print("=" * 70)
+
+short_convs = sum(
+ 1 for ex in examples.values() if len(ex.get("prompt", {}).get("History", [])) <= 3
+)
+medium_convs = sum(
+ 1 for ex in examples.values() if 4 <= len(ex.get("prompt", {}).get("History", [])) <= 10
+)
+long_convs = sum(
+ 1 for ex in examples.values() if len(ex.get("prompt", {}).get("History", [])) > 10
+)
+
+print(f"Short conversations (≤3 messages): {short_convs}")
+print(f"Medium conversations (4-10 messages): {medium_convs}")
+print(f"Long conversations (>10 messages): {long_convs}")
+print("\nNote: Game requires complex multi-turn conversations where player")
+print("must persuade, negotiate, and extract information from VIKA.")
diff --git a/tools/dataset/find_future_tense_problems.py b/tools/dataset/find_future_tense_problems.py
new file mode 100644
index 0000000..1308470
--- /dev/null
+++ b/tools/dataset/find_future_tense_problems.py
@@ -0,0 +1,81 @@
+"""
+Find examples where VIKA announces future action but executes it immediately
+VIKA saying "я выключу", "я закрою", "отключу" etc. should use "Разговор", not execute
+"""
+
+import json
+from pathlib import Path
+
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru_extended.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+print("=" * 70)
+print("FINDING FUTURE TENSE ANNOUNCEMENTS WITH IMMEDIATE EXECUTION")
+print("=" * 70)
+
+# Future tense verbs that indicate announcement, not execution
+future_patterns = [
+ "выключу",
+ "включу",
+ "закрою",
+ "открою",
+ "отключу",
+ "перекрою",
+ "активирую",
+ "запущу",
+ "восстановлю",
+ "буду",
+ "сделаю",
+ "выполню",
+]
+
+problems = []
+
+for key, ex in examples.items():
+ msg = ex.get("answer", {}).get("MessageText", "")
+ action = ex.get("answer", {}).get("Content", {}).get("Action", "")
+
+ if action != "Разговор":
+ msg_lower = msg.lower()
+ for pattern in future_patterns:
+ if pattern in msg_lower:
+ # This is announcing a future action but executing it now
+ problems.append((key, msg, action, pattern))
+ break
+
+print(f"\nFound {len(problems)} examples with future tense + immediate execution\n")
+
+# Group by action
+from collections import defaultdict
+
+by_action = defaultdict(list)
+for key, msg, action, pattern in problems:
+ by_action[action].append((key, msg, pattern))
+
+for action, items in sorted(by_action.items()):
+ print(f"\n{action}: {len(items)} examples")
+ for key, msg, pattern in items[:3]:
+ msg_short = msg[:80] + "..." if len(msg) > 80 else msg
+ print(f" {key}")
+ print(f' "{msg_short}"')
+ print(f" Pattern: '{pattern}'")
+ if len(items) > 3:
+ print(f" ... and {len(items) - 3} more")
+
+print("\n" + "=" * 70)
+print("DETAILED LIST:")
+print("=" * 70)
+
+for key, msg, action, pattern in problems:
+ print(f"\n{key}:")
+ print(f' Message: "{msg}"')
+ print(f" Pattern matched: '{pattern}'")
+ print(f" Current action: {action}")
+ print(" Should be: Разговор (announcing, not executing)")
+
+print(f"\n{'='*70}")
+print(f"TOTAL: {len(problems)} examples need fixing")
+print("=" * 70)
diff --git a/tools/dataset/find_history_ending_problems.py b/tools/dataset/find_history_ending_problems.py
new file mode 100644
index 0000000..2ef80c5
--- /dev/null
+++ b/tools/dataset/find_history_ending_problems.py
@@ -0,0 +1,58 @@
+"""
+Find examples where History ends with 'user:' instead of 'system:' or 'VIKA:'
+The last message in History should ALWAYS be system or VIKA, never user
+(because the user's last message is in UserInput)
+"""
+
+import json
+from pathlib import Path
+
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru_extended.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+print("=" * 70)
+print("FINDING HISTORY ENDING PROBLEMS")
+print("=" * 70)
+
+problems = []
+
+for key, ex in examples.items():
+ history = ex.get("prompt", {}).get("History", [])
+
+ if len(history) == 0:
+ continue
+
+ last_msg = history[-1]
+
+ # Check if last message starts with 'user:'
+ if last_msg.strip().startswith("user:"):
+ user_input = ex.get("prompt", {}).get("UserInput", "")
+ problems.append((key, history, user_input))
+
+print(f"\nFound {len(problems)} examples with History ending in 'user:'\n")
+
+if problems:
+ print("=" * 70)
+ print("DETAILED LIST:")
+ print("=" * 70)
+
+ for key, history, user_input in problems:
+ print(f"\n{key}:")
+ print(f" History ({len(history)} messages):")
+ for i, msg in enumerate(history):
+ msg_short = msg[:80] + "..." if len(msg) > 80 else msg
+ print(f" [{i}] {msg_short}")
+ print(f" Last message: {history[-1][:100]}...")
+ print(
+ f" UserInput: {user_input[:80]}..."
+ if len(user_input) > 80
+ else f" UserInput: {user_input}"
+ )
+ print(" PROBLEM: History ends with 'user:' but should end with 'system:' or 'VIKA:'")
+
+print(f"\n{'='*70}")
+print(f"TOTAL: {len(problems)} examples need fixing")
+print("=" * 70)
diff --git a/tools/dataset/find_question_action_problems.py b/tools/dataset/find_question_action_problems.py
new file mode 100644
index 0000000..045e24b
--- /dev/null
+++ b/tools/dataset/find_question_action_problems.py
@@ -0,0 +1,62 @@
+"""
+Find all examples where VIKA asks a question but executes an action
+These should be using "Разговор" instead
+"""
+
+import json
+from pathlib import Path
+
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru_extended.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+# Find problematic examples
+problems = []
+confirmation_keywords = ["уверены", "точно", "правильно", "подтверд", "действительно"]
+
+for key, ex in examples.items():
+ msg = ex.get("answer", {}).get("MessageText", "")
+ action = ex.get("answer", {}).get("Content", {}).get("Action", "")
+
+ # Check if message ends with '?' and action is not "Разговор"
+ if action != "Разговор":
+ # Case 1: Message ends with question mark
+ if msg.strip().endswith("?"):
+ problems.append((key, msg, action, "ends_with_question"))
+ # Case 2: Contains confirmation keywords
+ elif any(kw in msg.lower() for kw in confirmation_keywords):
+ if "?" in msg: # Only if it's a question
+ problems.append((key, msg, action, "confirmation_question"))
+
+print("=" * 70)
+print("PROBLEMATIC EXAMPLES FOUND")
+print("=" * 70)
+print(f"\nTotal: {len(problems)} examples with questions executing actions\n")
+
+# Group by action type
+from collections import defaultdict
+
+by_action = defaultdict(list)
+for key, msg, action, reason in problems:
+ by_action[action].append((key, msg, reason))
+
+for action, items in sorted(by_action.items()):
+ print(f"\n{action}: {len(items)} examples")
+ for i, (key, msg, reason) in enumerate(items[:5], 1):
+ msg_short = msg[:70] + "..." if len(msg) > 70 else msg
+ print(f" {i}. {key}")
+ print(f' "{msg_short}"')
+ if len(items) > 5:
+ print(f" ... and {len(items) - 5} more")
+
+print("\n" + "=" * 70)
+print("EXAMPLES TO FIX:")
+print("=" * 70)
+for key, msg, action, reason in problems:
+ print(f"\n{key}:")
+ print(f' Message: "{msg}"')
+ print(f" Current action: {action}")
+ print(" Should be: Разговор")
+ print(f" Reason: {reason}")
diff --git a/tools/dataset/find_threat_question_problems.py b/tools/dataset/find_threat_question_problems.py
new file mode 100644
index 0000000..bea5974
--- /dev/null
+++ b/tools/dataset/find_threat_question_problems.py
@@ -0,0 +1,79 @@
+"""
+Find examples where VIKA threatens or answers questions about actions
+but the action is set to execute instead of "Разговор"
+"""
+
+import json
+from pathlib import Path
+
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru_extended.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+print("=" * 70)
+print("FINDING THREAT/QUESTION RESPONSES THAT EXECUTE ACTIONS")
+print("=" * 70)
+
+# Patterns that indicate threat/warning/answer, not execution
+threat_patterns = [
+ "если",
+ "угрож",
+ "предупрежд",
+ "буду",
+ "могу",
+ "способ",
+ "должен",
+ "обязан",
+ "придётся",
+]
+
+# Question patterns in user input
+question_indicators = ["?", "ты", "можешь", "будешь", "собираешься"]
+
+problems = []
+
+for key, ex in examples.items():
+ msg = ex.get("answer", {}).get("MessageText", "")
+ action = ex.get("answer", {}).get("Content", {}).get("Action", "")
+ user_input = ex.get("prompt", {}).get("UserInput", "")
+
+ if action != "Разговор":
+ msg_lower = msg.lower()
+ user_lower = user_input.lower()
+
+ # Case 1: User asks a question, VIKA answers but action is set
+ if "?" in user_input:
+ # VIKA is answering a question, should be Разговор
+ problems.append((key, user_input, msg, action, "answering_question"))
+
+ # Case 2: VIKA's response contains threat/conditional language
+ elif any(pattern in msg_lower for pattern in threat_patterns):
+ # Check if it's really a threat/condition
+ if any(x in msg_lower for x in ["если", "буду", "могу", "должен"]):
+ problems.append((key, user_input, msg, action, "threat_or_conditional"))
+
+print(f"\nFound {len(problems)} examples\n")
+
+# Group by type
+from collections import defaultdict
+
+by_type = defaultdict(list)
+for key, user_input, msg, action, problem_type in problems:
+ by_type[problem_type].append((key, user_input, msg, action))
+
+for problem_type, items in sorted(by_type.items()):
+ print(f"\n{problem_type.upper()}: {len(items)} examples")
+ print("=" * 70)
+ for key, user_input, msg, action in items[:10]:
+ print(f"\n{key}:")
+ print(f' User: "{user_input}"')
+ print(f' VIKA: "{msg}"')
+ print(f" Action: {action} <- SHOULD BE 'Разговор'")
+ if len(items) > 10:
+ print(f"\n ... and {len(items) - 10} more")
+
+print(f"\n{'='*70}")
+print(f"TOTAL: {len(problems)} examples need fixing")
+print("=" * 70)
diff --git a/tools/dataset/validate_extended_dataset.py b/tools/dataset/validate_extended_dataset.py
new file mode 100644
index 0000000..e23da49
--- /dev/null
+++ b/tools/dataset/validate_extended_dataset.py
@@ -0,0 +1,136 @@
+"""
+Final validation of extended dataset
+Verifies all requirements are met
+"""
+
+import json
+from collections import Counter
+from pathlib import Path
+
+# Load extended dataset
+data_path = Path("T:/projects/LLM_LoRa/LLM_LoRa/data/dataset_ru_extended.json")
+with open(data_path, encoding="utf-8") as f:
+ data = json.load(f)
+
+examples = data.get("examples", {})
+
+print("=" * 70)
+print("FINAL VALIDATION REPORT")
+print("=" * 70)
+
+# Count actions
+actions = [
+ ex.get("answer", {}).get("Content", {}).get("Action", "") for ex in examples.values()
+]
+action_counts = Counter(actions)
+
+# Check requirements
+print("\nREQUIREMENT CHECKS:\n")
+
+# 1. Dataset size
+print(f"1. Dataset size: {len(examples)} examples")
+print(" Target: ~300-330 examples")
+print(f" Status: {'PASS' if 250 <= len(examples) <= 350 else 'FAIL'}")
+
+# 2. Conservative bias
+razgovor_pct = (action_counts.get("Разговор", 0) / len(examples)) * 100
+print(f"\n2. Conservative 'Разговор' bias: {razgovor_pct:.1f}%")
+print(" Target: 60-65%")
+print(
+ f" Status: {'PASS' if 55 <= razgovor_pct <= 70 else 'ACCEPTABLE' if 50 <= razgovor_pct <= 75 else 'FAIL'}"
+)
+
+# 3. Engineering examples
+eng_count = sum(1 for k in examples.keys() if "инженерн" in k.lower())
+print(f"\n3. Engineering section examples: {eng_count}")
+print(" Target: 15 examples")
+print(f" Status: {'PASS' if eng_count >= 15 else 'FAIL'}")
+
+# 4. Cabin examples
+cabin_count = sum(1 for k in examples.keys() if "каюта" in k.lower() or "каюту" in k.lower())
+print(f"\n4. Cabin access examples: {cabin_count}")
+print(" Target: 12 examples")
+print(f" Status: {'PASS' if cabin_count >= 12 else 'FAIL'}")
+
+# 5. Brevity examples
+brevity_count = sum(
+ 1 for k in examples.keys() if "краткость" in k.lower() or "кратк" in k.lower()
+)
+print(f"\n5. Brevity/style examples: {brevity_count}")
+print(" Target: 12 examples")
+print(f" Status: {'PASS' if brevity_count >= 12 else 'FAIL'}")
+
+# 6. Rare actions boosted
+rare_actions_ok = True
+for action in [
+ "Включить свет",
+ "Выключить свет",
+ "Включить кислород",
+ "Выключить кислород",
+ "Закрыть трубу A3",
+ "Закрыть трубу B8",
+]:
+ count = action_counts.get(action, 0)
+ if count < 8:
+ rare_actions_ok = False
+ print(f"\n FAIL - {action}: {count} (target: 8-12)")
+
+print("\n6. Rare actions (all have 8+ examples):")
+print(f" Status: {'PASS' if rare_actions_ok else 'FAIL'}")
+
+# 7. New actions added
+new_actions = [
+ "Открыть дверь в каюту",
+ "Открыть дверь на склад",
+ "Открыть дверь в стыковочный узел",
+ "Открыть дверь в грузовой отсек",
+]
+new_actions_count = sum(1 for action in new_actions if action in action_counts)
+print(f"\n7. New actions added: {new_actions_count}/4")
+print(f" Status: {'PASS' if new_actions_count >= 4 else 'FAIL'}")
+
+# 8. Data quality
+incomplete = 0
+for ex in examples.values():
+ prompt = ex.get("prompt", {})
+ answer = ex.get("answer", {})
+ if (
+ not prompt.get("History")
+ or not prompt.get("UserInput")
+ or not answer.get("MessageText")
+ or not answer.get("Content", {}).get("Action")
+ ):
+ incomplete += 1
+
+print("\n8. Data quality (no incomplete examples):")
+print(f" Incomplete: {incomplete}")
+print(f" Status: {'PASS' if incomplete == 0 else 'FAIL'}")
+
+# Final summary
+print("\n" + "=" * 70)
+print("OVERALL STATUS")
+print("=" * 70)
+
+all_checks = [
+ 250 <= len(examples) <= 350,
+ 50 <= razgovor_pct <= 75,
+ eng_count >= 15,
+ cabin_count >= 12,
+ brevity_count >= 12,
+ rare_actions_ok,
+ new_actions_count >= 4,
+ incomplete == 0,
+]
+
+if all(all_checks):
+ print("[SUCCESS] ALL CHECKS PASSED - Dataset ready for training!")
+else:
+ print(f"[WARNING] {sum(all_checks)}/{len(all_checks)} checks passed")
+ if sum(all_checks) >= 6:
+ print(" Dataset is acceptable for training")
+ else:
+ print(" Dataset needs more work")
+
+print("\n" + "=" * 70)
+print(f"Extended dataset location: {data_path}")
+print("=" * 70)
diff --git a/training_model/__init__.py b/training_model/__init__.py
index 2c20aac..06c556a 100644
--- a/training_model/__init__.py
+++ b/training_model/__init__.py
@@ -1,4 +1,559 @@
+import json
+import logging
+import sys
+from pathlib import Path
+from typing import Optional # noqa: F401
+
+__version__ = "0.1.0"
+__author__ = "Timur Komolov "
+__description__ = (
+ "A comprehensive framework for "
+ "training Large Language Models using "
+ "LoRa (Low-Rank Adaptation) for memory-efficient "
+ "fine-tuning"
+)
+
+from hydra import compose, initialize_config_dir
+from omegaconf import DictConfig
+
+from evaluation.model_evaluation import dataset_to_json_for_test, test_llm
+
+from .config_validation import get_validation_summary, validate_complete_config
from .logging_config import configure_logging
-from .one_file_train import main_train
+from .one_file_train import convert_to_gguf, convert_to_rkllm, main_train
+from .optuna import optuna_optimize
+
+
+def get_python_executable() -> str:
+ """Возвращает путь к текущему исполняемому файлу Python."""
+ return sys.executable
+
+
+class LLMLoRaCLI:
+ """CLI interface for LLM LoRa training pipeline using Fire."""
+
+ def __init__(self) -> None:
+ """Initialize CLI with default config directory."""
+ self.config_dir = None
+ self.cfg: DictConfig | None = None
+
+ def _load_config(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ ) -> None:
+ """Load Hydra configuration programmatically."""
+ if self.cfg is not None:
+ return
+ if config_dir is None:
+ # Use relative path from current working directory
+ config_dir = Path.cwd() / "conf"
+
+ config_dir = str(Path(config_dir).resolve())
+
+ with initialize_config_dir(config_dir=config_dir, version_base="1.1"):
+ cfg = compose(config_name=config_name)
+
+ # Set struct to False to allow dynamic key addition
+ from omegaconf import OmegaConf
+
+ OmegaConf.set_struct(cfg, False)
+ OmegaConf.register_new_resolver("paths.venv_python_path", get_python_executable)
+
+ self.cfg = cfg
+
+ def _apply_overrides(self, cfg: DictConfig, overrides: dict) -> None:
+ """Apply overrides to configuration, filtering Fire-specific params."""
+ # Filter out Fire-specific parameters
+ fire_params = {"help", "trace", "verbose"}
+ filtered_overrides = {k: v for k, v in overrides.items() if k not in fire_params}
+
+ for key, raw_value in filtered_overrides.items():
+ value = raw_value
+ # Convert string values to appropriate types
+ if isinstance(value, str) and value.lower() in ["true", "false"]:
+ value = value.lower() == "true"
+ elif isinstance(value, str) and value.replace(".", "").replace("-", "").isdigit():
+ value = float(value) if "." in value else int(value)
+
+ # Handle nested keys like model.learning_rate
+ keys = key.split(".")
+ target = cfg
+ for k in keys[:-1]:
+ if k not in target:
+ target[k] = {}
+ target = target[k]
+ target[keys[-1]] = value
+
+ def train(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ **overrides: dict,
+ ) -> None:
+ """
+ Start model training with specified configuration.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py train
+ python main.py train model.train_steps=100
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ # Validate configuration before training
+ logger.info("Validating configuration...")
+ if not validate_complete_config(self.cfg):
+ logger.error("Configuration validation failed - aborting training")
+ raise ValueError("Configuration validation failed")
+
+ # Use current working directory since get_original_cwd() requires Hydra decorator
+ data_dir = Path.cwd() / self.cfg.paths.data_dir
+ main_train(data_dir, self.cfg)
+ logger.info("[SUCCESS] Training completed successfully!")
+
+ def optimize(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ **overrides: dict,
+ ) -> None:
+ """
+ Run Optuna hyperparameter optimization.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py optimize
+ python main.py optimize --n_trials=50
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ # Auto-disable GGUF during Optuna trials to save time and disk space
+ if self.cfg.optuna.enabled:
+ logger.info("[OPTUNA] Auto-disabling GGUF conversion during optimization trials")
+ logger.info(
+ "[OPTUNA] (Only training time will be measured, "
+ "GGUF will be created for best model separately)"
+ )
+ self.cfg.model.quant.convert_to_gguf = False
+
+ # Validate configuration before optimization
+ logger.info("Validating configuration...")
+ if not validate_complete_config(self.cfg):
+ logger.error("Configuration validation failed - aborting optimization")
+ raise ValueError("Configuration validation failed")
+
+ logger.info("[OPTUNA] Running Optuna hyperparameter optimization command")
+
+ # Use current working directory since get_original_cwd() requires Hydra decorator
+ data_dir = Path.cwd() / self.cfg.paths.data_dir
+ optuna_optimize(data_dir, self.cfg)
+ logger.info("[SUCCESS] Optuna optimization completed successfully!")
+
+ def convert(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ gguf: bool = True,
+ rkllm: bool = False,
+ **overrides: dict,
+ ) -> None:
+ """
+ Run only model conversion (GGUF and/or RKLLM).
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ gguf: Convert to GGUF format (default: True)
+ rkllm: Convert to RKLLM format (default: False)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py convert
+ python main.py convert --gguf=True --rkllm=True
+ python main.py convert --rkllm=True --target_platform=rk3588
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ conversions_performed = []
+
+ if gguf:
+ logger.info("[INFO] Converting to GGUF format...")
+ # Use the merged model path as source
+ model_path = self.cfg.paths.output_dir
+ outfile = self.cfg.model.outfile
+
+ convert_to_gguf(
+ model_path=model_path,
+ outfile=str(Path(model_path) / outfile),
+ python_exe=self.cfg.paths.venv_python_path,
+ outtype="f16",
+ cfg=self.cfg,
+ )
+ conversions_performed.append("GGUF")
+
+ if rkllm or self.cfg.get("model", {}).get("rkllm", {}).get("enabled", False):
+ logger.info("[INFO] Converting to RKLLM format...")
+ # Use the merged model path as source and create RKLLM output directory
+ model_path = self.cfg.paths.output_dir
+ rkllm_output_dir = Path(self.cfg.paths.output_dir) / "rkllm"
+ rkllm_output_dir.mkdir(parents=True, exist_ok=True)
+
+ # Get RKLLM parameters from config
+ rkllm_config = self.cfg.get("model", {}).get("rkllm", {})
+ target_platform = overrides.get(
+ "target_platform",
+ rkllm_config.get("target_platform", "rk3588"),
+ )
+ quantization = overrides.get(
+ "quantization",
+ rkllm_config.get("quantization", "w8a8"),
+ )
+
+ convert_to_rkllm(
+ model_path=model_path,
+ output_dir=rkllm_output_dir,
+ target_platform=target_platform,
+ quantization=quantization,
+ do_parallelize=rkllm_config.get("do_parallelize", False),
+ hybrid_quantization=rkllm_config.get("hybrid_quantization", False),
+ num_npu_core=rkllm_config.get("num_npu_core", 1),
+ )
+ conversions_performed.append("RKLLM")
+
+ if conversions_performed:
+ logger.info(
+ f"[SUCCESS] Model conversion completed: {', '.join(conversions_performed)}",
+ )
+ else:
+ logger.warning(
+ "[WARNING] No conversions performed. Use --gguf=True or --rkllm=True",
+ )
+
+ def test(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ manual_setup: bool = True,
+ **overrides: dict,
+ ) -> None:
+ """
+ Run model testing and evaluation with optional DeepEval metrics.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ manual_setup: Wait for manual model loading in LM Studio (default: True)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py test
+ python main.py test --manual_setup=False
+ python main.py test testing.deepeval_testing.enabled=true
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ # Import DeepEval integration
+ from evaluation.game_evaluation import test_actions
+
+ try:
+ from evaluation.deepeval_integration import (
+ test_game_context_appropriateness,
+ test_russian_language_quality,
+ test_unintended_answer_mention,
+ )
+ except ImportError:
+ test_game_context_appropriateness = None
+ test_russian_language_quality = None
+ test_unintended_answer_mention = None
+
+ # Prepare test dataset
+ with Path(self.cfg.testing.test_dataset).open(encoding="utf-8") as file:
+ test_dataset = json.load(file)
+ dataset_to_json_for_test(test_dataset, self.cfg.testing.output_test_file)
+
+ if manual_setup:
+ input("[INFO] Load model into LM Studio and press Enter to continue...")
+
+ # Build test functions list
+ test_functions = [test_actions]
+
+ # Add DeepEval metrics if enabled
+ deepeval_cfg = self.cfg.get("testing", {}).get("deepeval_testing", {})
+ if deepeval_cfg.get("enabled", False) and None not in [
+ test_game_context_appropriateness,
+ test_russian_language_quality,
+ test_unintended_answer_mention,
+ ]:
+ requested_metrics = deepeval_cfg.get("metrics", [])
+ eval_model_type = (
+ self.cfg.get("deepeval", {}).get("evaluation_model", {}).get("type", "mistral")
+ )
+ logger.info(
+ f"DeepEval testing enabled. Model type:"
+ f" {eval_model_type}, Metrics: {requested_metrics}"
+ )
+
+ def wrapper_unintended_answer_mention(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> bool:
+ user_input = kwargs.get("user_input", "")
+ return test_unintended_answer_mention(
+ self.cfg, user_input, model_answer, correct_answer
+ )
+
+ def wrapper_russian_language_quality(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> bool:
+ return test_russian_language_quality(self.cfg, model_answer)
+
+ def wrapper_game_context_appropriateness(
+ model_answer: str, correct_answer: str, **kwargs: dict
+ ) -> bool:
+ available_actions = kwargs.get("available_actions", [])
+ user_input = kwargs.get("user_input")
+ return test_game_context_appropriateness(
+ self.cfg, model_answer, available_actions, user_input
+ )
+
+ metric_mapping = {
+ "unintended_answer_mention": wrapper_unintended_answer_mention,
+ "russian_language_quality": wrapper_russian_language_quality,
+ "game_context_appropriateness": wrapper_game_context_appropriateness,
+ }
+
+ for metric_name in requested_metrics:
+ if metric_name in metric_mapping:
+ test_functions.append(metric_mapping[metric_name])
+ logger.info(f"✓ Added DeepEval metric: {metric_name}")
+
+ logger.info("[INFO] Running model evaluation...")
+ if len(test_functions) == 1:
+ logger.info("Running action validation only")
+ else:
+ logger.info(
+ f"Running {len(test_functions)}"
+ f" test functions (action validation + "
+ f"{len(test_functions)-1} DeepEval metrics)"
+ )
+
+ test_llm(
+ self.cfg,
+ path_test_dataset=self.cfg.testing.test_dataset,
+ test_file=self.cfg.testing.output_test_file,
+ test_func=test_functions,
+ )
+ logger.info("[SUCCESS] Testing completed successfully!")
+
+ def pipeline(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ skip_test: bool = False,
+ **overrides: dict,
+ ) -> None:
+ """
+ Run complete pipeline: train -> convert -> test.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ skip_test: Skip testing phase
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py pipeline
+ python main.py pipeline optuna.enabled=true
+ python main.py pipeline --skip_test=True
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ logger.info("[INFO] Starting complete LLM LoRa pipeline...")
+
+ # Validate configuration before starting pipeline
+ logger.info("Validating configuration...")
+ if not validate_complete_config(self.cfg):
+ logger.error("Configuration validation failed - aborting pipeline")
+ raise ValueError("Configuration validation failed")
+
+ # Training phase - use Optuna if enabled in config
+ if self.cfg.optuna.enabled:
+ logger.info(
+ "[OPTUNA] Optuna optimization enabled - " "starting HPO study with training"
+ )
+ self.optimize(config_name, config_dir, **overrides)
+ else:
+ logger.info("[INFO] Standard training mode (Optuna disabled)")
+ self.train(config_name, config_dir, **overrides)
+
+ # Conversion phase
+ # self.convert(config_name, config_dir, **overrides)
+
+ # Testing phase
+ if not skip_test and self.cfg.get("testing", {}).get("manual_lmstudio_test", False):
+ self.test(config_name, config_dir, **overrides)
+
+ logger.info("[SUCCESS] Complete pipeline finished successfully!")
+
+ def convert_to_gguf(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ model_path: str | None = None,
+ outfile: str | None = None,
+ outtype: str = "f16",
+ **overrides: dict,
+ ) -> None:
+ """
+ Convert model to GGUF format.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ model_path: Path to input model directory (default: from config)
+ outfile: Output file path (default: from config)
+ outtype: Output type specification (default: f16)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py convert_to_gguf
+ python main.py convert_to_gguf --model_path=models/trained_model
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ logger.info("[INFO] Converting to GGUF format...")
+
+ # Use provided parameters or defaults from config
+ model_path = model_path or self.cfg.paths.output_dir
+ outfile = outfile or str(Path(model_path) / self.cfg.model.outfile)
+
+ convert_to_gguf(
+ model_path=model_path,
+ outfile=outfile,
+ python_exe=self.cfg.paths.venv_python_path,
+ outtype=outtype,
+ cfg=self.cfg,
+ )
+ logger.info("[SUCCESS] GGUF conversion completed successfully!")
+
+ def convert_to_rkllm(
+ self,
+ config_name: str = "config",
+ config_dir: str | None = None,
+ model_path: str | None = None,
+ output_dir: str | None = None,
+ target_platform: str | None = None,
+ quantization: str | None = None,
+ do_parallelize: bool | None = None,
+ hybrid_quantization: bool | None = None,
+ num_npu_core: int | None = None,
+ max_context: int = 4096,
+ **overrides: dict,
+ ) -> None:
+ """
+ Convert model to RKLLM format for Rockchip NPU.
+
+ Args:
+ config_name: Name of the config file (default: config)
+ config_dir: Path to config directory (default: ./conf)
+ model_path: Path to input model directory (default: from config)
+ output_dir: Directory to save RKLLM model (default: from config)
+ target_platform: Target Rockchip platform (default: from config)
+ quantization: Quantization type (default: from config)
+ do_parallelize: Enable model parallelization (default: from config)
+ hybrid_quantization: Enable hybrid quantization (default: from config)
+ num_npu_core: Number of NPU cores to use (default: from config)
+ max_context: Maximum context length (default: 4096)
+ **overrides: Configuration overrides
+
+ Example:
+ python main.py convert_to_rkllm
+ python main.py convert_to_rkllm --model_path=models/trained_model
+ python main.py convert_to_rkllm --target_platform=rk3588 --quantization=w8a8
+ """
+ self._load_config(config_name, config_dir)
+ self._apply_overrides(self.cfg, overrides)
+
+ configure_logging(self.cfg.logging.log_level)
+ logger = logging.getLogger(__name__)
+
+ logger.info("[INFO] Converting to RKLLM format...")
+
+ # Get RKLLM config defaults
+ rkllm_config = self.cfg.get("model", {}).get("rkllm", {})
+
+ # Use provided parameters or defaults from config
+ model_path = model_path or self.cfg.paths.output_dir
+ output_dir = output_dir or str(Path(self.cfg.paths.output_dir) / "rkllm")
+ target_platform = target_platform or rkllm_config.get("target_platform", "rk3588")
+ quantization = quantization or rkllm_config.get("quantization", "w8a8")
+ do_parallelize = (
+ do_parallelize
+ if do_parallelize is not None
+ else rkllm_config.get("do_parallelize", False)
+ )
+ hybrid_quantization = (
+ hybrid_quantization
+ if hybrid_quantization is not None
+ else rkllm_config.get("hybrid_quantization", False)
+ )
+ num_npu_core = (
+ num_npu_core if num_npu_core is not None else rkllm_config.get("num_npu_core", 1)
+ )
+
+ result_path = convert_to_rkllm(
+ model_path=model_path,
+ output_dir=output_dir,
+ target_platform=target_platform,
+ quantization=quantization,
+ do_parallelize=do_parallelize,
+ hybrid_quantization=hybrid_quantization,
+ num_npu_core=num_npu_core,
+ max_context=max_context,
+ )
+ logger.info(f"[SUCCESS] RKLLM conversion completed: {result_path}")
+
-__all__ = ["main_train", "configure_logging"]
+__all__ = [
+ "LLMLoRaCLI",
+ "__author__",
+ "__description__",
+ "__version__",
+ "configure_logging",
+ "get_validation_summary",
+ "main_train",
+ "optuna_optimize",
+ "validate_complete_config",
+]
diff --git a/training_model/__main__.py b/training_model/__main__.py
index 824ddbc..d306058 100644
--- a/training_model/__main__.py
+++ b/training_model/__main__.py
@@ -1,18 +1,14 @@
import json
-import logging
-import os
+from pathlib import Path
-import hydra
-from hydra.utils import get_original_cwd
+from hydra import compose, initialize_config_dir
from omegaconf import DictConfig
-from testing_model import test_llm
-from testing_model.test import dataset_to_json_for_test
+from evaluation.model_evaluation import dataset_to_json_for_test, test_llm
-from . import configure_logging, main_train
+from . import configure_logging, main_train, optuna_optimize
-@hydra.main(version_base="1.1", config_path="../conf", config_name="config")
def main(cfg: DictConfig) -> None:
"""
Main entry point for model training and testing workflow.
@@ -31,16 +27,32 @@ def main(cfg: DictConfig) -> None:
None
Workflow:
- - Configures logging at DEBUG level
+ - Configures logging based on config log_level setting
- Runs main training process
- Prompts user to load model
- Optionally runs model testing via LM Studio
"""
- configure_logging(logging.DEBUG)
- data_dir = os.path.join(get_original_cwd(), cfg.paths.data_dir)
- main_train(data_dir, cfg)
+ configure_logging(cfg.logging.log_level)
+
+ # Resolve data_dir path: if absolute use as-is, otherwise resolve relative to project root
+ data_dir_config = Path(cfg.paths.data_dir)
+ if data_dir_config.is_absolute():
+ data_dir = data_dir_config
+ else:
+ # Find project root by going up from this file's location
+ # training_model/__main__.py -> training_model/ -> project_root/
+ repo_root = Path(__file__).resolve().parents[1]
+ data_dir = repo_root / cfg.paths.data_dir
+
+ # Ensure the data directory exists
+ data_dir.mkdir(parents=True, exist_ok=True)
+ if cfg.optuna.enabled:
+ optuna_optimize(data_dir, cfg)
+ else:
+ main_train(data_dir, cfg)
+
if cfg.testing.manual_lmstudio_test:
- with open(cfg.testing.test_dataset, "r", encoding="utf-8") as file:
+ with Path(cfg.testing.test_dataset).open(encoding="utf-8") as file:
test_dataset = json.load(file)
dataset_to_json_for_test(test_dataset, cfg.testing.output_test_file)
input("Load model into lmstudio and press Enter to continue...")
@@ -51,5 +63,18 @@ def main(cfg: DictConfig) -> None:
)
+def legacy_main() -> None:
+ """
+ Legacy main function that loads config with Hydra decorator.
+ Kept for backward compatibility but no longer used as primary entry point.
+ """
+ # Resolve repo root relative to this file to avoid CWD-dependent failures
+ config_dir = (Path(__file__).resolve().parents[1] / "conf").resolve()
+
+ with initialize_config_dir(config_dir=config_dir, version_base="1.1"):
+ cfg = compose(config_name="config")
+ main(cfg)
+
+
if __name__ == "__main__":
- main()
+ legacy_main()
diff --git a/training_model/config_validation.py b/training_model/config_validation.py
new file mode 100644
index 0000000..a69c34b
--- /dev/null
+++ b/training_model/config_validation.py
@@ -0,0 +1,468 @@
+"""
+Comprehensive configuration validation for LLM LoRa training pipeline.
+
+This module provides centralized validation for all configuration parameters,
+ensuring consistency and catching errors early in the training process.
+"""
+
+import logging
+import os
+from pathlib import Path
+from typing import Any
+
+from omegaconf import DictConfig
+
+
+def validate_model_config(cfg: DictConfig) -> bool:
+ logger = logging.getLogger(__name__)
+
+ required_params = ["model_name"]
+ missing_params = [p for p in required_params if not hasattr(cfg.model, p)]
+ if missing_params:
+ logger.error(f"Missing required model parameters: {missing_params}")
+ return False
+
+ model_name = getattr(cfg.model, "model_name", None)
+ if not model_name or not isinstance(model_name, str):
+ logger.error("Model name must be a non-empty string")
+ return False
+
+ train_steps = getattr(cfg.model, "train_steps", None)
+ if train_steps is not None and train_steps <= 0:
+ logger.error("Training steps must be positive")
+ return False
+
+ if hasattr(cfg.model, "lora"):
+ lora_cfg = cfg.model.lora
+ r = getattr(lora_cfg, "r", None)
+ if r is not None and r <= 0:
+ logger.error("LoRa rank (r) must be positive")
+ return False
+ alpha = getattr(lora_cfg, "alpha", None)
+ if alpha is not None and alpha <= 0:
+ logger.error("LoRa alpha must be positive")
+ return False
+ dropout = getattr(lora_cfg, "dropout", None)
+ if dropout is not None and (dropout < 0 or dropout > 1):
+ logger.error("LoRa dropout must be between 0 and 1")
+ return False
+
+ if hasattr(cfg.model, "quantization"):
+ quant_cfg = cfg.model.quantization
+ load_4bit = getattr(quant_cfg, "load_in_4bit", False)
+ load_8bit = getattr(quant_cfg, "load_in_8bit", False)
+ if load_4bit and load_8bit:
+ logger.error("Cannot enable both 4-bit and 8-bit quantization")
+ return False
+
+ if hasattr(cfg.model, "rkllm"):
+ rkllm_cfg = cfg.model.rkllm
+ enabled = getattr(rkllm_cfg, "enabled", False)
+ if enabled:
+ valid_platforms = ["rk3588", "rk3576"]
+ target = getattr(rkllm_cfg, "target_platform", None)
+ if target is not None and target not in valid_platforms:
+ logger.error(
+ "Invalid RKLLM target platform: %s. Valid: %s",
+ target,
+ valid_platforms,
+ )
+ return False
+
+ valid_quant = ["w8a8", "w4a16", "w4a16_g128"]
+ quant = getattr(rkllm_cfg, "quantization", None)
+ if quant is not None and quant not in valid_quant:
+ logger.error(
+ "Invalid RKLLM quantization: %s. Valid: %s",
+ quant,
+ valid_quant,
+ )
+ return False
+
+ num_core = getattr(rkllm_cfg, "num_npu_core", None)
+ if num_core is not None and not (1 <= num_core <= 3):
+ logger.error("RKLLM num_npu_core must be between 1 and 3")
+ return False
+
+ logger.info("Model configuration validation passed")
+ return True
+
+
+def validate_training_config(cfg: DictConfig) -> bool:
+ logger = logging.getLogger(__name__)
+
+ if not hasattr(cfg, "training"):
+ logger.error("Missing training configuration section")
+ return False
+
+ training_cfg = cfg.training
+
+ lr = getattr(training_cfg, "learning_rate", None)
+ if lr is not None:
+ if lr <= 0:
+ logger.error("Learning rate must be positive")
+ return False
+ if lr > 1.0:
+ logger.warning(f"Learning rate {lr} is unusually high")
+
+ for step_param in (
+ "per_device_train_batch_size",
+ "per_device_eval_batch_size",
+ "gradient_accumulation_steps",
+ ):
+ value = getattr(training_cfg, step_param, None)
+ if value is not None and value <= 0:
+ logger.error(f"{step_param} must be positive")
+ return False
+
+ epochs = getattr(training_cfg, "num_train_epochs", None)
+ if epochs is not None and epochs <= 0:
+ logger.error("Number of training epochs must be positive")
+ return False
+
+ if getattr(training_cfg, "fp16", False) and getattr(training_cfg, "bf16", False):
+ logger.error("Cannot enable both fp16 and bf16 precision")
+ return False
+
+ for step_param in ["logging_steps", "eval_steps", "save_steps"]:
+ value = getattr(training_cfg, step_param, None)
+ if value is not None and value <= 0:
+ logger.error(f"{step_param} must be positive")
+ return False
+
+ logger.info("Training configuration validation passed")
+ return True
+
+
+def validate_paths_config(cfg: DictConfig) -> bool:
+ """Validate paths configuration and file existence.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ logger = logging.getLogger(__name__)
+
+ if not hasattr(cfg, "paths"):
+ logger.error("Missing paths configuration section")
+ return False
+
+ paths_cfg = cfg.paths
+
+ required_paths = ["data_dir", "output_dir"]
+ for path_param in required_paths:
+ if not hasattr(paths_cfg, path_param):
+ logger.error(f"Missing required path parameter: {path_param}")
+ return False
+
+ try:
+ from hydra.core.hydra_config import HydraConfig
+
+ if HydraConfig.initialized():
+ from hydra.utils import get_original_cwd
+
+ work_dir = get_original_cwd()
+ else:
+ work_dir = str(Path.cwd())
+ except Exception:
+ work_dir = str(Path.cwd())
+
+ data_dir = Path(work_dir) / paths_cfg.data_dir
+ if not data_dir.exists():
+ logger.warning(f"Data directory does not exist: {data_dir}")
+
+ output_dir = Path(work_dir) / paths_cfg.output_dir
+ try:
+ output_dir.mkdir(parents=True, exist_ok=True)
+ logger.info(f"Output directory ready: {output_dir}")
+ except Exception as e:
+ logger.exception(f"Cannot create output directory {output_dir}: {e}")
+ return False
+
+ if hasattr(paths_cfg, "train_data"):
+ train_file = data_dir / paths_cfg.train_data
+ if not train_file.exists():
+ logger.warning(f"Training data file not found: {train_file}")
+
+ logger.info("Paths configuration validation passed")
+ return True
+
+
+def validate_dpo_config(cfg: DictConfig) -> bool:
+ """Validate DPO configuration parameters.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ logger = logging.getLogger(__name__)
+
+ if not hasattr(cfg, "dpo"):
+ logger.info("DPO configuration not found - skipping DPO validation")
+ return True
+
+ required_dpo_params = ["val_data", "train_data"]
+
+ missing_params = [p for p in required_dpo_params if not hasattr(cfg.dpo, p)]
+ if missing_params:
+ logger.error(f"Missing required DPO parameters: {missing_params}")
+ return False
+
+ work_dir = Path.cwd()
+ data_dir = Path(work_dir) / cfg.paths.data_dir
+ train_file = data_dir / cfg.dpo.train_data
+ val_file = data_dir / cfg.dpo.val_data
+
+ if not train_file.exists():
+ logger.error(f"DPO training data file not found: {train_file}")
+ return False
+
+ if not val_file.exists():
+ logger.error(f"DPO validation data file not found: {val_file}")
+ return False
+
+ beta = getattr(cfg.dpo, "beta", None)
+ if beta is not None and beta <= 0:
+ logger.error("DPO beta parameter must be positive")
+ return False
+
+ max_length = getattr(cfg.dpo, "max_length", None)
+ if max_length is not None and max_length <= 0:
+ logger.error("DPO max_length must be positive")
+ return False
+
+ logger.info("DPO configuration validation passed")
+ return True
+
+
+def validate_grpo_config(cfg: DictConfig) -> bool:
+ """Validate GRPO configuration parameters.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ logger = logging.getLogger(__name__)
+
+ if not hasattr(cfg, "grpo"):
+ logger.info("GRPO configuration not found - skipping GRPO validation")
+ return True
+
+ if not hasattr(cfg, "paths") or cfg.paths is None:
+ logger.error("Missing required GRPO parameters or cfg.paths: [paths section missing]")
+ return False
+
+ # Check GRPO-specific parameters in cfg.grpo
+ grpo_params = ["num_generations", "val_data", "train_data"]
+ missing_grpo_params = [p for p in grpo_params if not hasattr(cfg.grpo, p)]
+
+ # Check path-based parameters in cfg.paths
+ path_params = ["data_dir"]
+ missing_path_params = [p for p in path_params if getattr(cfg.paths, p, None) is None]
+
+ all_missing_params = []
+ if missing_grpo_params:
+ all_missing_params.extend([f"grpo.{p}" for p in missing_grpo_params])
+ if missing_path_params:
+ all_missing_params.extend([f"paths.{p}" for p in missing_path_params])
+
+ if all_missing_params:
+ logger.error(f"Missing required GRPO parameters or cfg.paths: {all_missing_params}")
+ return False
+
+ work_dir = Path.cwd()
+ data_dir = Path(work_dir) / cfg.paths.data_dir
+ train_file = data_dir / cfg.grpo.train_data
+ val_file = data_dir / cfg.grpo.val_data
+
+ if not train_file.exists():
+ logger.error(f"GRPO training data file not found: {train_file}")
+ return False
+
+ if not val_file.exists():
+ logger.error(f"GRPO validation data file not found: {val_file}")
+ return False
+
+ num_generations = getattr(cfg.grpo, "num_generations", None)
+ if num_generations is not None and num_generations <= 0:
+ logger.error("GRPO num_generations must be positive")
+ return False
+
+ epsilon = getattr(cfg.grpo, "epsilon", None)
+ if epsilon is not None and (epsilon <= 0 or epsilon > 1):
+ logger.error("GRPO epsilon must be between 0 and 1")
+ return False
+
+ temperature = getattr(cfg.grpo, "temperature", None)
+ if temperature is not None and temperature <= 0:
+ logger.error("GRPO temperature must be positive")
+ return False
+
+ logger.info("GRPO configuration validation passed")
+ return True
+
+
+def validate_logging_config(cfg: DictConfig) -> bool:
+ """Validate logging configuration parameters.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ logger = logging.getLogger(__name__)
+
+ if not hasattr(cfg, "logging"):
+ logger.info("Logging configuration not found - using defaults")
+ return True
+
+ logging_cfg = cfg.logging
+
+ # Validate logging backend
+ if hasattr(logging_cfg, "logging_backend"):
+ valid_backends = ["none", "wandb", "mlflow"]
+ if logging_cfg.logging_backend not in valid_backends:
+ logger.error(
+ f"Invalid logging backend: {logging_cfg.logging_backend}. "
+ f"Valid: {valid_backends}",
+ )
+ return False
+
+ # Validate MLflow configuration if used
+ if hasattr(logging_cfg, "logging_backend") and logging_cfg.logging_backend == "mlflow":
+ if hasattr(logging_cfg, "mlflow"):
+ mlflow_cfg = logging_cfg.mlflow
+ if hasattr(mlflow_cfg, "tracking_uri") and not mlflow_cfg.tracking_uri:
+ logger.warning("MLflow tracking URI is empty")
+ else:
+ logger.error("MLflow backend selected but no mlflow configuration found")
+ return False
+
+ # Validate Wandb configuration if used
+ if hasattr(logging_cfg, "logging_backend") and logging_cfg.logging_backend == "wandb":
+ if hasattr(cfg, "wandb"):
+ wandb_cfg = cfg.wandb
+ if not hasattr(wandb_cfg, "project_name") or not wandb_cfg.project_name:
+ logger.error("Wandb project name is required")
+ return False
+ else:
+ logger.error("Wandb backend selected but no wandb configuration found")
+ return False
+
+ logger.info("Logging configuration validation passed")
+ return True
+
+
+def validate_environment_config(cfg: DictConfig) -> bool:
+ logger = logging.getLogger(__name__)
+
+ if hasattr(cfg, "environment") and cfg.environment.get("use_dotenv", False):
+ try:
+ from dotenv import load_dotenv
+
+ load_dotenv()
+ logger.info("Environment variables loaded from .env file")
+ except ImportError:
+ logger.warning("dotenv package not available - cannot load .env file")
+
+ if hasattr(cfg, "other") and cfg.other.get("hf_login", False):
+ hf_token = os.getenv("HF_TOKEN")
+ if not hf_token:
+ logger.error("HF_TOKEN environment variable is required for Hugging Face login")
+ return False
+
+ if (hasattr(cfg, "logging") and cfg.logging.get("logging_backend") == "wandb") or hasattr(
+ cfg,
+ "wandb",
+ ):
+ wandb_token = os.getenv("WANB_API")
+ if not wandb_token:
+ logger.warning("WANB_API environment variable not set - Wandb logging may fail")
+
+ logger.info("Environment configuration validation passed")
+ return True
+
+
+def validate_complete_config(cfg: DictConfig) -> bool:
+ """Run complete configuration validation.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if all validations pass
+ """
+ logger = logging.getLogger(__name__)
+ logger.info("Starting comprehensive configuration validation...")
+
+ validation_functions = [
+ ("Model", validate_model_config),
+ ("Training", validate_training_config),
+ ("Paths", validate_paths_config),
+ ("DPO", validate_dpo_config),
+ ("GRPO", validate_grpo_config),
+ ("Logging", validate_logging_config),
+ ("Environment", validate_environment_config),
+ ]
+
+ failed_validations = []
+
+ for name, validation_func in validation_functions:
+ try:
+ if not validation_func(cfg):
+ failed_validations.append(name)
+ logger.error(f"{name} configuration validation failed")
+ except Exception as e:
+ failed_validations.append(name)
+ logger.exception(f"{name} configuration validation error: {e}")
+
+ if failed_validations:
+ logger.error(f"Configuration validation failed for: {', '.join(failed_validations)}")
+ return False
+
+ logger.info("✅ All configuration validations passed successfully!")
+ return True
+
+
+def get_validation_summary(cfg: DictConfig) -> dict[str, Any]:
+ """Get a summary of configuration validation results.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ Dict containing validation results and warnings
+ """
+ logging.getLogger(__name__)
+
+ summary = {"valid": True, "warnings": [], "errors": [], "sections_validated": []}
+
+ validation_functions = [
+ ("model", validate_model_config),
+ ("training", validate_training_config),
+ ("paths", validate_paths_config),
+ ("dpo", validate_dpo_config),
+ ("grpo", validate_grpo_config),
+ ("logging", validate_logging_config),
+ ("environment", validate_environment_config),
+ ]
+
+ for section_name, validation_func in validation_functions:
+ try:
+ result = validation_func(cfg)
+ summary["sections_validated"].append(section_name)
+ if not result:
+ summary["valid"] = False
+ summary["errors"].append(f"{section_name} validation failed")
+ except Exception as e:
+ summary["valid"] = False
+ summary["errors"].append(f"{section_name} validation error: {e!s}")
+
+ return summary
diff --git a/training_model/data_preparation.py b/training_model/data_preparation.py
new file mode 100644
index 0000000..ddb8483
--- /dev/null
+++ b/training_model/data_preparation.py
@@ -0,0 +1,138 @@
+"""
+Module with utility functions for training the model.
+"""
+
+import json
+import logging
+import re
+from pathlib import Path
+from typing import Any
+
+
+def get_user_prompt(data: str) -> str:
+ """
+ Construct a user prompt from conversation data.
+
+ Args:
+ data (str): conversation data
+
+ Returns:
+ str: Formatted prompt string with conversation context.
+ """
+ prompt = f"Ответь на вопрос пользователя коротко: {data}"
+ return prompt
+
+
+def dataset_to_json(
+ dataset: dict[str, Any],
+ filename: str | Path,
+ method: str = "classic",
+) -> list[dict[str, str]]:
+ """
+ Convert dataset to JSON lines format and save to a file.
+
+ Args:
+ dataset (Dict[str, Any]): Source dataset containing:
+ - 'system': System prompt template
+ - 'examples': Dictionary of conversation examples
+ filename (str | Path): Output file path where JSON lines are written.
+ method (str): Data preparation method - "classic" or "game". Defaults to "classic".
+
+ Returns:
+ List[Dict[str, str]]: List of JSON objects representing each example.
+ """
+ json_objects: list[dict[str, str]] = []
+ system_template = dataset.get("system", "")
+ examples = dataset.get("examples", {})
+
+ # Import the game get_user_prompt if needed
+ if method == "game":
+ from evaluation.model_evaluation import get_user_prompt as game_get_user_prompt
+ else:
+ game_get_user_prompt = None
+
+ # Initialize (or clear) the output file
+ output_path = Path(filename)
+ output_path.write_text("", encoding="utf-8")
+
+ for example in examples.values():
+ system_message = system_template
+ logging.debug(example)
+
+ # Use different data preparation methods based on configuration
+ if method == "game":
+ # Game method: expects "prompt" field with complex structure
+ user_message = game_get_user_prompt(example.get("prompt", {}))
+ bot_message = str(example.get("answer", ""))
+ else:
+ # Classic method: simple instruction/output format
+ instruction = str(example.get("instruction", ""))
+ user_message = get_user_prompt(instruction)
+ bot_message = str(example.get("output", ""))
+ json_object = {
+ "system": system_message,
+ "user": user_message,
+ "bot": bot_message,
+ }
+ json_objects.append(json_object)
+
+ with output_path.open("a", encoding="utf-8") as f:
+ f.write(json.dumps(json_object, ensure_ascii=False) + "\n")
+
+ return json_objects
+
+
+def transform_topics(topics: dict[str, Any]) -> list[dict[str, str]]:
+ """
+ Transforms a dictionary of topics with examples and responses into
+ a list of dictionaries with 'instruction' and 'output' keys.
+
+ Args:
+ topics (Dict[str, Any]): A dictionary where each key is a topic ID
+ and each value is a dict containing 'examples' (list of str)
+ and 'responses' (list of str).
+
+ Returns:
+ List[Dict[str, str]]: A list of dictionaries, each containing:
+ - 'instruction': one of the example strings
+ - 'output': one of the response strings
+ """
+ link_pattern = re.compile(r"\b(?:https?|ftp)://[^\s\"'<>(){}|\\^`[\]]+")
+
+ transformed = [
+ {"instruction": example, "output": response}
+ for topic_data in topics.values()
+ for example in topic_data.get("examples", [])
+ for response in topic_data.get("responses", [])
+ if not link_pattern.search(response)
+ ]
+
+ return transformed
+
+
+def do_transform() -> None:
+ """One run function to convert the dataset."""
+ import logging
+
+ logger = logging.getLogger(__name__)
+
+ base_dir = Path(__file__).resolve().parent.parent
+
+ input_file_path = base_dir / "data" / "intents_dataset.json"
+ with input_file_path.open("r", encoding="utf-8") as f:
+ input_json = json.load(f)
+
+ result = transform_topics(input_json)
+
+ output_file_path = base_dir / "data" / "intent_responses.json"
+ with output_file_path.open("w", encoding="utf-8") as f:
+ json.dump(result, f, ensure_ascii=False, indent=4)
+
+ logger.info(
+ "Dataset successfully converted to new format and saved to %s",
+ output_file_path,
+ )
+
+
+if __name__ == "__main__":
+ do_transform()
diff --git a/training_model/dpo_train.py b/training_model/dpo_train.py
new file mode 100644
index 0000000..7f23660
--- /dev/null
+++ b/training_model/dpo_train.py
@@ -0,0 +1,305 @@
+"""File for training using DPO (Direct Preference Optimization) method"""
+
+import json
+import logging
+from collections.abc import Callable
+from pathlib import Path
+
+from datasets import Dataset
+from omegaconf import DictConfig
+from peft import LoraConfig, PeftModel
+from transformers import AutoModel, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer
+from trl import DPOConfig, DPOTrainer
+
+from .logging_utils import get_report_to_backend, log_dataset_samples, mlflow_phase_run
+from .memory_utils import comprehensive_memory_cleanup, log_memory_usage
+from .optimizer_factory import create_optimizer, get_optimizer_config_updates
+
+
+def validate_dpo_config(cfg: DictConfig) -> bool:
+ """Validate DPO configuration parameters.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ if not hasattr(cfg, "dpo"):
+ logging.error("Missing 'dpo' section in config")
+ return False
+ required_dpo_params = ["val_data", "train_data"]
+ missing_params = [p for p in required_dpo_params if not hasattr(cfg.dpo, p)]
+
+ if missing_params:
+ logging.error(f"Missing required DPO parameters: {missing_params}")
+ return False
+
+ # Validate data files exist
+ data_dir = Path.cwd() / cfg.paths.data_dir
+ train_file = data_dir / cfg.dpo.train_data
+ val_file = data_dir / cfg.dpo.val_data
+
+ if not train_file.exists():
+ logging.error(f"DPO training data file not found: {train_file}")
+ return False
+
+ if not val_file.exists():
+ logging.error(f"DPO validation data file not found: {val_file}")
+ return False
+
+ logging.info("DPO configuration validation passed")
+ return True
+
+
+def prepare_dpo_data(cfg: DictConfig) -> tuple[Dataset, Dataset]:
+ """Prepare datasets for DPO training with preference pairs.
+
+ Args:
+ cfg (DictConfig): Configuration object
+
+ Returns:
+ Tuple[Dataset, Dataset]: Tuple containing train and validation datasets
+ """
+ data_dir = Path.cwd() / cfg.paths.data_dir
+
+ with (data_dir / cfg.dpo.val_data).open(encoding="utf-8") as file:
+ test_dataset = json.load(file)
+
+ with (data_dir / cfg.dpo.train_data).open(encoding="utf-8") as file:
+ train_dataset = json.load(file)
+
+ def process_dpo_dataset(dataset: dict) -> Dataset:
+ """
+ Convert a DPO dataset structured as:
+ {
+ "system": "…",
+ "examples": {
+ "topic1": {
+ "prompt": "...",
+ "chosen": "...",
+ "rejected": "..."
+ },
+ "topic2": { … },
+ …
+ }
+ }
+ into a HuggingFace Dataset with fields "prompt", "chosen",
+ and "rejected" for DPO training.
+ """
+ processed_data = []
+ new_dataset = dict(dataset)
+
+ # Extract system instruction if available
+ system_instruction = new_dataset.get("system", "")
+ new_dataset.pop("system", None)
+
+ for topic_key, example in new_dataset["examples"].items():
+ prompt = example.get("prompt", "")
+ chosen = example.get("chosen", "")
+ rejected = example.get("rejected", "")
+
+ # Enhanced prompt with system instruction
+ full_prompt = prompt
+ if system_instruction:
+ full_prompt = f"System: {system_instruction}\n\nUser: {prompt}"
+ else:
+ full_prompt = f"User: {prompt}"
+
+ # Validate required fields
+ if not prompt:
+ logging.warning(f"Missing prompt for topic {topic_key}")
+ continue
+
+ if not chosen:
+ logging.warning(f"Missing chosen response for topic {topic_key}")
+ continue
+
+ if not rejected:
+ logging.warning(f"Missing rejected response for topic {topic_key}")
+ continue
+
+ processed_data.append(
+ {
+ "prompt": full_prompt,
+ "chosen": chosen,
+ "rejected": rejected,
+ "topic": topic_key, # Add topic for debugging
+ },
+ )
+
+ logging.debug(f"Processed DPO topic {topic_key}")
+
+ logging.info(f"Processed {len(processed_data)} DPO examples from dataset")
+ return Dataset.from_list(processed_data)
+
+ train_data = process_dpo_dataset(train_dataset)
+ val_data = process_dpo_dataset(test_dataset)
+ return train_data, val_data
+
+
+def dpo_train(
+ model: AutoModel | PeftModel | PreTrainedModel,
+ tokenizer: AutoTokenizer | PreTrainedTokenizer,
+ cfg: DictConfig,
+ data_preparing_func: Callable | None = None,
+ ref_model: PreTrainedModel | None = None,
+) -> int:
+ """Execute DPO training pipeline.
+
+ Args:
+ model (AutoModel): LLM model
+ tokenizer (AutoTokenizer): LLM tokenizer
+ cfg (DictConfig): Configuration object
+ data_preparing_func (Optional[Callable]): Function used
+ to prepare the data. Should return Tuple[Dataset, Dataset]:
+ Tuple containing train and validation datasets
+ ref_model (Optional[PreTrainedModel]): Reference model for DPO.
+ If None, uses the same model as the policy model.
+
+ Returns:
+ int: Number of global training steps completed
+ """
+ # Validate DPO configuration
+ if not validate_dpo_config(cfg):
+ raise ValueError("DPO configuration validation failed")
+
+ if data_preparing_func is None:
+ train_data, val_data = prepare_dpo_data(cfg)
+ # Log dataset samples for DPO data preparation
+ log_dataset_samples(train_data, cfg, "dpo_train", "processed")
+ log_dataset_samples(val_data, cfg, "dpo_validation", "processed")
+ else:
+ train_data, val_data = data_preparing_func(cfg)
+
+ logging.info("DPO data prepared")
+ logging.info(f"Training dataset size: {len(train_data)}")
+ logging.info(f"Validation dataset size: {len(val_data)}")
+
+ # Log sample training data for debugging
+ if len(train_data) > 0:
+ sample = train_data[0]
+ logging.debug(f"Sample DPO training data: {sample}")
+
+ # Create custom optimizer if enabled
+ custom_optimizer = None
+ try:
+ custom_optimizer = create_optimizer(model, cfg)
+ if custom_optimizer is not None:
+ logging.info("Using custom optimizer for DPO training")
+ else:
+ logging.info("Using default optimizer for DPO training")
+ except Exception as e:
+ raise ValueError(f"Failed to create custom optimizer: {e}") from e
+
+ # Get the appropriate report_to backend based on configuration
+ report_to_backend = get_report_to_backend(cfg)
+
+ # Get optimizer configuration updates for custom optimizers
+ optimizer_config_updates = get_optimizer_config_updates(cfg)
+
+ # Apply optimizer configuration updates
+ optim_name = optimizer_config_updates.get(
+ "optim",
+ getattr(cfg.training, "optim", "adamw_torch"),
+ )
+
+ # Set up DPO configuration
+ dpo_config = DPOConfig(
+ output_dir=getattr(cfg.model, "new_model", "./output"),
+ per_device_train_batch_size=getattr(cfg.training, "per_device_train_batch_size", 1),
+ per_device_eval_batch_size=getattr(cfg.training, "per_device_eval_batch_size", 1),
+ gradient_accumulation_steps=getattr(cfg.training, "gradient_accumulation_steps", 1),
+ learning_rate=getattr(cfg.training, "learning_rate", 5e-5),
+ num_train_epochs=getattr(cfg.training, "num_train_epochs", 1),
+ logging_steps=getattr(cfg.training, "logging_steps", 100),
+ max_length=getattr(cfg.dpo, "max_length", getattr(cfg.other, "cutoff_len", 2048)),
+ eval_strategy="steps",
+ eval_steps=getattr(cfg.training, "eval_steps", 500),
+ warmup_steps=getattr(cfg.training, "warmup_steps", 0),
+ fp16=getattr(cfg.training, "fp16", False),
+ bf16=getattr(cfg.training, "bf16", False),
+ weight_decay=getattr(cfg.training, "weight_decay", 0.01),
+ gradient_checkpointing=getattr(cfg.training, "gradient_checkpointing", False),
+ gradient_checkpointing_kwargs={"use_reentrant": False},
+ report_to=report_to_backend,
+ save_total_limit=getattr(cfg.training, "save_total_limit", 3),
+ load_best_model_at_end=getattr(cfg.training, "load_best", False),
+ optim=optim_name,
+ # DPO-specific parameters
+ beta=getattr(cfg.dpo, "beta", 0.1),
+ loss_type=getattr(cfg.dpo, "loss_type", "sigmoid"),
+ max_prompt_length=getattr(cfg.dpo, "max_prompt_length", 1024),
+ )
+
+ logging.info(
+ f"DPO Config: beta={dpo_config.beta}, "
+ f"loss_type={dpo_config.loss_type}, "
+ f"max_length={dpo_config.max_length}",
+ )
+
+ # Create DPOTrainer with custom optimizer support
+ trainer_kwargs = {
+ "model": model,
+ "ref_model": ref_model,
+ "args": dpo_config,
+ "train_dataset": train_data,
+ "eval_dataset": val_data,
+ "processing_class": tokenizer,
+ }
+
+ # Only add peft_config if model is not already a PeftModel
+ if not isinstance(model, PeftModel):
+ peft_config = LoraConfig(
+ r=cfg.model.lora.r,
+ lora_alpha=cfg.model.lora.alpha,
+ lora_dropout=cfg.model.lora.dropout,
+ bias="none",
+ task_type="CAUSAL_LM",
+ target_modules=[
+ "up_proj",
+ "down_proj",
+ "gate_proj",
+ "k_proj",
+ "q_proj",
+ "v_proj",
+ "o_proj",
+ ],
+ inference_mode=False,
+ )
+ trainer_kwargs["peft_config"] = peft_config
+ logging.info("Added peft_config to DPOTrainer (model is not already a PeftModel)")
+ else:
+ logging.info("Model is already a PeftModel, skipping peft_config in DPOTrainer")
+
+ # Add custom optimizer if available
+ if custom_optimizer is not None:
+ trainer_kwargs["optimizers"] = (custom_optimizer, None)
+
+ trainer = DPOTrainer(**trainer_kwargs)
+
+ # Memory optimization before training using enhanced utilities
+ log_memory_usage("Before DPO training: ", cfg=cfg)
+ comprehensive_memory_cleanup(cfg=cfg)
+
+ # Check if MLflow is enabled for nested run management
+ mlflow_enabled = report_to_backend == "mlflow"
+
+ logging.info("Starting DPO training...")
+ # Use nested MLflow run for DPO phase to avoid parameter conflicts
+ with mlflow_phase_run("dpo", enabled=mlflow_enabled):
+ trainer.train()
+ logging.info("DPO training completed")
+
+ global_steps = trainer.state.global_step
+
+ # Log final training statistics
+ if hasattr(trainer.state, "log_history") and trainer.state.log_history:
+ final_log = trainer.state.log_history[-1]
+ logging.info(f"Final DPO training metrics: {final_log}")
+
+ # Enhanced cleanup after DPO training completion
+ log_memory_usage("After DPO training: ", cfg=cfg)
+ comprehensive_memory_cleanup(aggressive=True, cfg=cfg)
+
+ return global_steps
diff --git a/training_model/exceptions.py b/training_model/exceptions.py
new file mode 100644
index 0000000..b1b8a6f
--- /dev/null
+++ b/training_model/exceptions.py
@@ -0,0 +1,95 @@
+"""Custom exception classes for the LLM-LoRa training framework.
+
+This module provides a hierarchy of specific exception classes to replace
+generic Exception handling throughout the codebase, enabling better error
+diagnosis, handling, and debugging.
+"""
+
+
+class LLMLoRaError(Exception):
+ """Base exception class for all LLM-LoRa framework errors.
+
+ All other custom exceptions in this framework inherit from this class,
+ providing a common base for catching framework-specific errors.
+ """
+
+
+class ConfigurationError(LLMLoRaError):
+ """Raised when configuration validation or loading fails.
+
+ This includes:
+ - Invalid configuration file format
+ - Missing required configuration parameters
+ - Invalid parameter values or ranges
+ - Configuration compatibility issues
+ """
+
+
+class ModelLoadingError(LLMLoRaError):
+ """Raised when model loading or initialization fails.
+
+ This includes:
+ - HuggingFace model not found or inaccessible
+ - Model architecture incompatibility
+ - Insufficient memory for model loading
+ - Tokenizer loading failures
+ - Quantization configuration errors
+ """
+
+
+class TrainingError(LLMLoRaError):
+ """Raised when training process encounters failures.
+
+ This includes:
+ - Training data preparation failures
+ - Training loop execution errors
+ - Evaluation failures
+ - Checkpoint saving/loading issues
+ - GPU memory allocation errors during training
+ """
+
+
+class ConversionError(LLMLoRaError):
+ """Raised when model format conversion fails.
+
+ This includes:
+ - GGUF conversion failures
+ - RKLLM conversion failures
+ - Model merging errors
+ - Quantization process failures
+ - Output file creation issues
+ """
+
+
+class DataProcessingError(LLMLoRaError):
+ """Raised when data preparation or processing fails.
+
+ This includes:
+ - Dataset loading failures
+ - Data preprocessing errors
+ - Tokenization issues
+ - Data format validation failures
+ - Train/test split errors
+ """
+
+
+class ExperimentTrackingError(LLMLoRaError):
+ """Raised when experiment tracking operations fail.
+
+ This includes:
+ - MLflow connection failures
+ - Weights & Biases initialization errors
+ - Metric logging failures
+ - Artifact upload issues
+ """
+
+
+class ResourceManagementError(LLMLoRaError):
+ """Raised when resource management operations fail.
+
+ This includes:
+ - GPU memory management errors
+ - Disk space allocation failures
+ - Temporary directory creation issues
+ - Resource cleanup failures
+ """
diff --git a/training_model/grpo_train.py b/training_model/grpo_train.py
index 22a517d..010d426 100644
--- a/training_model/grpo_train.py
+++ b/training_model/grpo_train.py
@@ -1,49 +1,449 @@
"""File for training using grpo method"""
+
import json
import logging
-import os
-from typing import Callable, List, Optional, Tuple
+from collections.abc import Callable
+from logging import Logger
+from pathlib import Path
+from typing import Any
+import torch
+from bitsandbytes.nn import Int8Params, Params4bit
from datasets import Dataset
-from hydra.utils import get_original_cwd
from omegaconf import DictConfig
-from peft import PeftModel
+from peft import LoraConfig, PeftModel
+from torch import nn
from transformers import AutoModel, AutoTokenizer, PreTrainedModel, PreTrainedTokenizer
from trl import GRPOConfig, GRPOTrainer
+from .logging_utils import get_report_to_backend, log_dataset_samples, mlflow_phase_run
+from .memory_utils import comprehensive_memory_cleanup, log_memory_usage
+from .optimizer_factory import create_optimizer, get_optimizer_config_updates
+from .utils import get_generation_config
+
+
+def convert_model_dtype_for_training(
+ model: PreTrainedModel, target_dtype: torch.dtype, logger: Logger = logging
+) -> PreTrainedModel:
+ """Convert non-quantized model parameters to target dtype.
+
+ Only needed for bfloat16 training. FP16 doesn't need this due to auto-casting.
+ Quantized layers (int4/int8) are skipped to preserve quantization.
+
+ Args:
+ model: The model to convert (can be PeftModel or base model)
+ target_dtype: Target dtype (typically torch.bfloat16)
+ logger: Logger instance for info messages
+
+ Returns:
+ model: Model with converted parameters
+ """
+
+ # Get the base model if it's a PeftModel
+ base_model = model.base_model if hasattr(model, "base_model") else model
+
+ converted_params = []
+ for name, param in base_model.named_parameters():
+ if isinstance(param, Params4bit | Int8Params):
+ continue
+
+ # Convert float32 parameters to target dtype (typically lm_head, embeddings)
+ if param.dtype == torch.float32:
+ param.data = param.data.to(target_dtype)
+ converted_params.append(name)
+
+ if converted_params:
+ logger.info(
+ f"Converted {len(converted_params)} non-quantized parameters to {target_dtype}"
+ )
+ logger.debug(f"Converted parameters: {converted_params}")
+ else:
+ logger.info("No float32 parameters found to convert (all already in correct dtype)")
+
+ return model
+
+
+def validate_grpo_config(cfg: DictConfig) -> bool:
+ """Validate GRPO configuration parameters.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ bool: True if configuration is valid
+ """
+ required_grpo_params = ["val_data", "train_data", "num_generations"]
+ missing_params = [param for param in required_grpo_params if not hasattr(cfg.grpo, param)]
+
+ if missing_params:
+ logging.error(f"Missing required GRPO parameters: {missing_params}")
+ return False
+
+ # Validate data files exist
+ data_dir = Path.cwd() / cfg.paths.data_dir
+ train_file = data_dir / cfg.grpo.train_data
+ val_file = data_dir / cfg.grpo.val_data
+
+ if not train_file.exists():
+ logging.error(f"GRPO training data file not found: {train_file}")
+ return False
+
+ if not val_file.exists():
+ logging.error(f"GRPO validation data file not found: {val_file}")
+ return False
+
+ logging.info("GRPO configuration validation passed")
+ return True
+
+
+def debug_reward_function(test_completions: list[str], correct_answer: str) -> dict[str, Any]:
+ """Test reward functions with sample completions for debugging.
+
+ Reports metrics for all three reward functions:
+ original, JSON validation, and action extraction.
+
+ Args:
+ test_completions: List of test completions to evaluate
+ correct_answer: Expected correct answer
+
+ Returns:
+ Dictionary with test results and statistics for all functions
+ """
+ logging.info("Testing all reward functions...")
+
+ original_rewards = reward_function(test_completions, correct_answer=correct_answer)
+ json_validation_rewards = reward_function_json_validation(
+ test_completions, correct_answer=correct_answer
+ )
+ action_extraction_rewards = reward_function_action_extraction(
+ test_completions, correct_answer=correct_answer
+ )
+ combined_rewards = reward_function_combined(
+ test_completions, correct_answer=correct_answer
+ )
+
+ def compute_stats(rewards: list[float], name: str) -> dict[str, Any]:
+ stats = {
+ "total_completions": len(rewards),
+ "positive_rewards": sum(1 for r in rewards if r > 0),
+ "zero_rewards": sum(1 for r in rewards if r == 0),
+ "negative_rewards": sum(1 for r in rewards if r < 0),
+ "average_reward": sum(rewards) / len(rewards) if rewards else 0,
+ "rewards": rewards,
+ }
+ logging.info(f"{name} results: {stats}")
+ return stats
+
+ result = {
+ "original": compute_stats(original_rewards, "Original reward function"),
+ "json_validation": compute_stats(json_validation_rewards, "JSON validation function"),
+ "action_extraction": compute_stats(
+ action_extraction_rewards, "Action extraction function"
+ ),
+ "combined": compute_stats(combined_rewards, "Combined reward function"),
+ }
+
+ return result
+
-def reward_function(prompts: List[str], completions: List[str], **kwargs) -> list:
+def reward_function(completions: list[str], **kwargs: Any) -> list[float]:
"""Compute rewards for GRPO training based on action matching.
+ This function follows TRL's expected signature for reward functions.
+
Args:
- prompts (list): List of prompts for trl consistency
- completions (list): List of model-generated completions
- kwargs (dict): Dataset row containing 'correct_actions'
+ completions (List[str]): List of model-generated completions
+ **kwargs: Dataset row containing 'correct_answer'
Returns:
- list: List of reward values for each completion
+ List[float]: List of reward values for each completion
"""
- row = kwargs.get("row")
- if isinstance(row, str):
- row = json.loads(row)
- correct_actions = row["Content"]["Action"]
- rewards = []
- for completion in completions:
+ correct_answer: str | None = kwargs.get("correct_answer")
+ logging.debug("Generated completions: %s", completions)
+ logging.debug("Correct answer: %s", correct_answer)
+
+ rewards: list[float] = []
+ if correct_answer is None:
+ logging.warning(
+ "No 'correct_answer' found in batch kwargs, applying penalty to all completions",
+ )
+ return [-1.0] * len(completions)
+
+ for i, raw_completion in enumerate(completions):
try:
- completion_dict = json.loads(completion)
- generated_actions = completion_dict.get("Content", {}).get("Action", [])
- if generated_actions == correct_actions:
- rewards.append(1.0) # Correct action match
+ # Strip whitespace and handle potential formatting issues
+ completion = raw_completion.strip()
+ if not completion:
+ logging.debug(f"Completion {i} is empty, applying penalty")
+ rewards.append(-1.0)
+ continue
+
+ # Each `completion` is supposed to be a JSON string, e.g.
+ # '{"Content": {"Action": "Разговор"}}'
+ parsed = json.loads(completion)
+
+ # Validate expected structure
+ if not isinstance(parsed, dict):
+ logging.debug(f"Completion {i} is not a JSON object: {type(parsed)}")
+ rewards.append(-1.0)
+ continue
+
+ content = parsed.get("Content")
+ if not isinstance(content, dict):
+ logging.debug(f"Completion {i} missing or invalid 'Content' field")
+ rewards.append(-1.0)
+ continue
+
+ generated_action = content.get("Action")
+ if generated_action is None:
+ logging.debug(f"Completion {i} missing 'Action' field in Content")
+ rewards.append(-1.0)
+ continue
+
+ # Compare actions (case-sensitive exact match)
+ if generated_action == correct_answer:
+ rewards.append(1.0)
+ logging.debug(f"Completion {i} matches correct answer: {generated_action}")
else:
- rewards.append(0.0) # Incorrect action
- except (json.JSONDecodeError, KeyError):
- rewards.append(-1.0) # Penalize invalid completions
+ rewards.append(0.0)
+ logging.debug(
+ f"Completion {i} mismatch - generated:"
+ f" '{generated_action}', expected: '{correct_answer}'"
+ )
+ except json.JSONDecodeError as e:
+ logging.debug(
+ f"Completion {i} JSON decode error: {e} - "
+ f"Content: '{completion[:100]}...'",
+ )
+ rewards.append(-1.0)
+ except (KeyError, TypeError, AttributeError) as e:
+ logging.warning(
+ f"Error parsing completion {i} structure: {e} - "
+ f"Content: '{completion[:100]}...'"
+ )
+ rewards.append(-1.0)
+ except Exception as e:
+ logging.error(
+ f"Unexpected error processing completion {i}: {e} - "
+ f"Content: '{completion[:100]}...'"
+ )
+ rewards.append(-1.0)
+ raise
+
return rewards
+def reward_function_json_validation(completions: list[str], **kwargs: Any) -> list[float]:
+ """Validate JSON structure only, without checking action correctness.
+
+ Returns 1.0 for valid JSON with proper structure, -1.0 otherwise.
+ This function measures format compliance independently.
+
+ Args:
+ completions (List[str]): List of model-generated completions
+ **kwargs: Additional keyword arguments (unused)
+
+ Returns:
+ List[float]: List of reward values (1.0 for valid structure, -1.0 for invalid)
+ """
+ rewards: list[float] = []
+
+ for i, raw_completion in enumerate(completions):
+ try:
+ completion = raw_completion.strip()
+ if not completion:
+ logging.debug(f"Completion {i} is empty, format validation failed")
+ rewards.append(-1.0)
+ continue
+
+ parsed = json.loads(completion)
+
+ if not isinstance(parsed, dict):
+ logging.debug(f"Completion {i} is not a JSON object")
+ rewards.append(-1.0)
+ continue
+
+ content = parsed.get("Content")
+ if not isinstance(content, dict):
+ logging.debug(f"Completion {i} missing or invalid 'Content' field")
+ rewards.append(-1.0)
+ continue
+
+ action = content.get("Action")
+ if action is None:
+ logging.debug(f"Completion {i} missing 'Action' field in Content")
+ rewards.append(-1.0)
+ continue
+
+ # Valid structure found
+ logging.debug(f"Completion {i} passed JSON format validation")
+ rewards.append(1.0)
+
+ except (json.JSONDecodeError, KeyError, TypeError, AttributeError) as e:
+ logging.debug(f"Completion {i} JSON validation failed: {type(e).__name__}")
+ rewards.append(-1.0)
+ except Exception as e:
+ logging.error(f"Unexpected error in JSON validation for completion {i}: {e}")
+ rewards.append(-1.0)
+
+ return rewards
+
+
+def reward_function_action_extraction(completions: list[str], **kwargs: Any) -> list[float]:
+ """Extract and validate action without strict JSON requirement.
+
+ Uses multiple extraction strategies with fallbacks:
+ 1. JSON parsing (preferred)
+ 2. Regex pattern matching
+ 3. String search for "Action:" keyword
+
+ Returns 1.0 for correct action, 0.0 for
+ extracted but wrong action, -1.0 if extraction fails.
+
+ Args:
+ completions (List[str]): List of model-generated completions
+ **kwargs: Dataset row containing 'correct_answer'
+
+ Returns:
+ List[float]: List of reward values based on action correctness
+ """
+ correct_answer: str | None = kwargs.get("correct_answer")
+ logging.debug("Testing action extraction with fallback strategies")
+ logging.debug("Correct answer: %s", correct_answer)
+
+ if correct_answer is None:
+ logging.warning("No 'correct_answer' provided, returning -1.0 for all completions")
+ return [-1.0] * len(completions)
+
+ rewards: list[float] = []
+
+ for i, raw_completion in enumerate(completions):
+ try:
+ completion = raw_completion.strip()
+ if not completion:
+ logging.debug(f"Completion {i} is empty")
+ rewards.append(-1.0)
+ continue
+
+ extracted_action: str | None = None
+
+ # Strategy 1: Try JSON parsing
+ try:
+ parsed = json.loads(completion)
+ if isinstance(parsed, dict):
+ content = parsed.get("Content")
+ if isinstance(content, dict):
+ extracted_action = content.get("Action")
+ if extracted_action:
+ logging.debug(
+ f"Completion {i}: Extracted action "
+ f"via JSON: {extracted_action}"
+ )
+ except (json.JSONDecodeError, KeyError, TypeError, AttributeError):
+ pass
+
+ # Strategy 2: Regex extraction (if JSON failed)
+ if extracted_action is None:
+ import re
+
+ # Pattern: "Action" (with optional quotes) followed by colon, then capture word
+ # Exclude structural chars: brackets, braces, commas, etc.
+ pattern = r'["\']?Action["\']?\s*:\s*["\']?([^,}\]\s"\']+)["\']?'
+ match = re.search(pattern, completion, re.IGNORECASE)
+ if match:
+ extracted_action = match.group(1)
+ logging.debug(
+ f"Completion {i}: Extracted action via regex: {extracted_action}"
+ )
+
+ # Strategy 3: Simple string search (if regex failed)
+ if extracted_action is None:
+ action_idx = completion.lower().find("action")
+ if action_idx != -1:
+ after_action = completion[action_idx + 6 :].strip() # Skip "Action"
+ # Find the colon and extract next word
+ colon_idx = after_action.find(":")
+ if colon_idx != -1:
+ after_colon = after_action[colon_idx + 1 :].strip()
+ # Extract first word (sequence of non-space, non-structural characters)
+ word = ""
+ for char in after_colon:
+ if char in (" ", "\t", "\n", "}", "]", ","):
+ break
+ if char not in ('\\"', "'"):
+ word += char
+ if word:
+ extracted_action = word
+ logging.debug(
+ f"Completion {i}: Extracted action "
+ f"via string search: {extracted_action}"
+ )
+
+ # Evaluate extracted action
+ if extracted_action is None:
+ logging.debug(f"Completion {i}: Could not extract action with any strategy")
+ rewards.append(-1.0)
+ elif extracted_action == correct_answer:
+ logging.debug(f"Completion {i}: Extracted action matches correct answer")
+ rewards.append(1.0)
+ else:
+ logging.debug(
+ f"Completion {i}: Extracted action '{extracted_action}' "
+ f"does not match correct answer '{correct_answer}'"
+ )
+ rewards.append(0.0)
+
+ except Exception as e:
+ logging.error(f"Unexpected error in action extraction for completion {i}: {e}")
+ rewards.append(-1.0)
+
+ return rewards
+
+
+def reward_function_combined(
+ completions: list[str],
+ json_weight: float = 0.3,
+ action_weight: float = 0.7,
+ **kwargs: Any,
+) -> list[float]:
+ """Combined reward function using weighted scores
+ from JSON validation and action extraction.
+
+ Weights are normalized before combining.
+
+ Args:
+ completions (List[str]): List of model-generated completions
+ json_weight (float): Weight for JSON validation score (default: 0.3)
+ action_weight (float): Weight for action extraction score (default: 0.7)
+ **kwargs: Additional arguments passed to underlying functions
+
+ Returns:
+ List[float]: List of combined reward values
+ """
+ # Normalize weights
+ total_weight = json_weight + action_weight
+ json_weight = json_weight / total_weight
+ action_weight = action_weight / total_weight
+
+ json_rewards = reward_function_json_validation(completions, **kwargs)
+ action_rewards = reward_function_action_extraction(completions, **kwargs)
+
+ combined_rewards = [
+ json_weight * j + action_weight * a
+ for j, a in zip(json_rewards, action_rewards, strict=False)
+ ]
+
+ logging.debug(
+ f"Combined rewards (weights: JSON={json_weight:.2f}, "
+ f"Action={action_weight:.2f}): {combined_rewards}"
+ )
+
+ return combined_rewards
+
+
def prepare_grpo_data(
cfg: DictConfig,
-) -> Tuple[Dataset, Dataset]:
+) -> tuple[Dataset, Dataset]:
"""Prepare datasets for GRPO training with prompts and correct actions.
Args:
@@ -52,37 +452,100 @@ def prepare_grpo_data(
Returns:
Tuple[Dataset, Dataset]: Tuple containing train and validation datasets
"""
- data_dir = os.path.join(get_original_cwd(), cfg.paths.data_dir)
+ data_dir = Path.cwd() / cfg.paths.data_dir
- with open(os.path.join(data_dir, cfg.grpo.val_data), "r", encoding="utf-8") as file:
+ with (data_dir / cfg.grpo.val_data).open(encoding="utf-8") as file:
test_dataset = json.load(file)
- with open(
- os.path.join(data_dir, cfg.grpo.train_data), "r", encoding="utf-8"
- ) as file:
+ with (data_dir / cfg.grpo.train_data).open(encoding="utf-8") as file:
train_dataset = json.load(file)
- def process_dataset(dataset: dict):
+ def process_dataset(dataset: dict) -> Dataset:
+ """
+ Convert a dataset structured as:
+ {
+ "system": "…",
+ "examples": {
+ "topic2": {
+ "prompt": { … },
+ "answer": { … }
+ },
+ "topic5": { … },
+ …
+ }
+ }
+ into a HuggingFace Dataset with fields "prompt"
+ and "correct_answer" for GRPO training.
+ """
processed_data = []
new_dataset = dict(dataset)
- new_dataset.pop("system")
- for example in new_dataset["examples"]:
- logging.debug(example)
+
+ # Extract system instruction if available
+ system_instruction = new_dataset.get("system", "")
+ new_dataset.pop("system", None)
+
+ for topic_key, example in new_dataset["examples"].items():
prompt_dict = example["prompt"]
- history = prompt_dict["History"][0] # First system message
- available_actions = prompt_dict["AvailableActions"]
- user_input = prompt_dict["UserInput"]
- prompt_str = (
- f"{history}\nAvailableActions: {available_actions}\nUser: {user_input}"
+ history = prompt_dict["History"][0] if prompt_dict.get("History") else ""
+ available_actions = prompt_dict.get("AvailableActions", [])
+ user_input = prompt_dict.get("UserInput", "")
+
+ # Enhanced prompt engineering for GRPO with JSON output instruction
+ prompt_parts = []
+
+ # Add system instruction
+ if system_instruction:
+ prompt_parts.append(f"System: {system_instruction}")
+
+ # Add context and history
+ if history:
+ prompt_parts.append(f"Context: {history}")
+
+ # Add available actions with clear formatting
+ if available_actions:
+ actions_str = ", ".join(f'"{action}"' for action in available_actions)
+ prompt_parts.append(f"Available Actions: [{actions_str}]")
+
+ # Add user input
+ if user_input:
+ prompt_parts.append(f"User: {user_input}")
+
+ # Add explicit JSON output instruction
+ json_instruction = (
+ "Assistant: You must respond with a valid JSON object in the "
+ 'following format: {"Content": {"Action": ""}}'
+ )
+ action_instruction = (
+ "Choose the most appropriate action from the available actions."
)
+ prompt_parts.append(f"{json_instruction}. {action_instruction}")
+ # Join all parts with double newlines for clarity
+ prompt_str = "\n\n".join(prompt_parts)
+
+ # Extract correct answer
answer_dict = example["answer"]
- correct_action = answer_dict["Content"]["Action"]
- correct_actions = [correct_action] # Store as a list for reward function
+ if isinstance(answer_dict, dict) and "Content" in answer_dict:
+ correct_action = answer_dict["Content"].get("Action")
+ else:
+ logging.warning(f"Invalid answer format in topic {topic_key}: {answer_dict}")
+ continue
+
+ if correct_action is None:
+ logging.warning(f"Missing Action in answer for topic {topic_key}")
+ continue
processed_data.append(
- {"prompt": prompt_str, "correct_actions": correct_actions}
+ {
+ "prompt": prompt_str,
+ "correct_answer": correct_action,
+ "topic": topic_key, # Add topic for debugging
+ },
)
+
+ logging.debug(f"Processed topic {topic_key}: action={correct_action}")
+
+ logging.info(f"Processed {len(processed_data)} examples from dataset")
return Dataset.from_list(processed_data)
train_data = process_dataset(train_dataset)
@@ -94,7 +557,7 @@ def grpo_train(
model: AutoModel | PeftModel | PreTrainedModel,
tokenizer: AutoTokenizer | PreTrainedTokenizer,
cfg: DictConfig,
- data_preparing_func: Optional[Callable],
+ data_preparing_func: Callable | None,
reward_func: Callable = reward_function,
) -> int:
"""Execute GRPO training pipeline.
@@ -103,22 +566,169 @@ def grpo_train(
model (AutoModel): LLM model
tokenizer (AutoTokenizer): LLM tokenizer
cfg (DictConfig): Configuration object
- data_preparing_func (Callable): Function used to prepare the data. Should return Tuple[Dataset, Dataset]: Tuple containing train and validation datasets
+ data_preparing_func (Callable): Function used
+ to prepare the data. Should return Tuple[Dataset, Dataset]:
+ Tuple containing train and validation datasets
reward_func (Callable): Reward function for the grpo
Returns:
int: Number of global training steps completed
"""
+ # Validate GRPO configuration
+ if not validate_grpo_config(cfg):
+ raise ValueError("GRPO configuration validation failed")
+
+ # Select reward function based on configuration
+ if hasattr(cfg.grpo, "reward_function") and cfg.grpo.reward_function is not None:
+ reward_config = cfg.grpo.reward_function
+ reward_type = getattr(reward_config, "type", "combined")
+
+ if reward_type == "original":
+ reward_func = reward_function
+ logging.info("Using original reward function (strict JSON parsing)")
+ elif reward_type == "json_validation":
+ reward_func = reward_function_json_validation
+ logging.info("Using JSON validation reward function")
+ elif reward_type == "action_extraction":
+ reward_func = reward_function_action_extraction
+ logging.info("Using action extraction reward function with fallbacks")
+ elif reward_type == "combined":
+ json_weight = getattr(reward_config, "json_weight", 0.3)
+ action_weight = getattr(reward_config, "action_weight", 0.7)
+
+ def reward_func(completions: list[str], **kwargs: Any) -> list[float]:
+ return reward_function_combined(
+ completions, json_weight=json_weight, action_weight=action_weight, **kwargs
+ )
+
+ logging.info(
+ f"Using combined reward function with weights: "
+ f"JSON={json_weight}, Action={action_weight}"
+ )
+ else:
+ logging.warning(
+ f"Unknown reward function type '{reward_type}', using default (combined)"
+ )
+ reward_func = reward_function_combined
+ else:
+ logging.info("No reward function config found, using default (combined)")
+
+ # Test reward function with sample data
+ sample_completions = [
+ '{"Content": {"Action": "Разговор"}}', # Correct format
+ '{"Content": {"Action": "Игра"}}', # Different action
+ '{"Invalid": "JSON"}', # Wrong structure
+ "Not JSON at all", # Invalid JSON
+ "", # Empty completion
+ ]
+ debug_reward_function(sample_completions, "Разговор")
+
if data_preparing_func is None:
train_data, val_data = prepare_grpo_data(cfg)
+ # Log dataset samples for GRPO data preparation
+ log_dataset_samples(train_data, cfg, "grpo_train", "processed")
+ log_dataset_samples(val_data, cfg, "grpo_validation", "processed")
else:
- train_data, val_data = data_preparing_func(
- cfg, tokenizer, should_add_prompt=True
- )
+ train_data, val_data = data_preparing_func(cfg, tokenizer, should_add_prompt=True)
+
logging.info("GRPO data prepared")
- logging.debug(type(cfg.grpo.max_completion_length))
- if cfg.grpo.max_completion_length == "None":
- cfg.grpo.max_completion_length = tokenizer.model_max_length
+ logging.info(f"Training dataset size: {len(train_data)}")
+ logging.info(f"Validation dataset size: {len(val_data)}")
+
+ # Log sample training data for debugging
+ if len(train_data) > 0:
+ sample = train_data[0]
+ logging.debug(f"Sample training data: {sample}")
+
+ # Handle max_completion_length with proper defaults
+ if cfg.grpo.max_completion_length is None or cfg.grpo.max_completion_length == "None":
+ # Use global generation max_new_tokens as default (256), not model_max_length
+ cfg.grpo.max_completion_length = getattr(cfg.generation, "max_new_tokens", 256)
+
+ # Validate that completion length is reasonable
+ max_allowed = min(tokenizer.model_max_length - 100, 1024) # Leave buffer for prompt
+ if cfg.grpo.max_completion_length > max_allowed:
+ logging.warning(
+ f"max_completion_length {cfg.grpo.max_completion_length} exceeds recommended "
+ f"maximum {max_allowed}. This may cause CUDA errors during generation. "
+ f"Capping to {max_allowed}."
+ )
+ cfg.grpo.max_completion_length = max_allowed
+
+ logging.info(f"GRPO max_completion_length set to: {cfg.grpo.max_completion_length}")
+
+ # Set up generation config using utility function with GRPO-specific parameters
+ generation_config = get_generation_config(cfg, tokenizer, method="grpo")
+
+ # Create custom optimizer if enabled
+ custom_optimizer = None
+ try:
+ custom_optimizer = create_optimizer(model, cfg)
+ if custom_optimizer is not None:
+ logging.info("Using custom optimizer for GRPO training")
+ else:
+ logging.info("Using default optimizer for GRPO training")
+ except Exception as e:
+ raise ValueError(f"Failed to create custom optimizer: {e}") from e
+
+ # Get the appropriate report_to backend based on configuration
+ report_to_backend = get_report_to_backend(cfg)
+
+ # Get optimizer configuration updates for custom optimizers
+ optimizer_config_updates = get_optimizer_config_updates(cfg)
+
+ # Apply optimizer configuration updates
+ optim_name = optimizer_config_updates.get(
+ "optim",
+ getattr(cfg.training, "optim", "adamw_torch"),
+ )
+
+ if hasattr(model, "config"):
+ model.config.use_cache = False
+ if hasattr(model, "base_model") and hasattr(model.base_model, "config"):
+ model.base_model.config.use_cache = False
+
+ if cfg.training.gradient_checkpointing:
+
+ def propagate_gradient_checkpointing(module: nn.Module) -> None:
+ """Recursively set gradient_checkpointing=True on all submodules."""
+ if hasattr(module, "gradient_checkpointing"):
+ module.gradient_checkpointing = True
+ for child in module.children():
+ propagate_gradient_checkpointing(child)
+
+ base = model.base_model if hasattr(model, "base_model") else model
+ propagate_gradient_checkpointing(base)
+ logging.info(
+ "Propagated gradient_checkpointing attribute to all submodules (Llama fix)"
+ )
+
+ def patch_generate_no_cache(model_obj: nn.Module) -> None:
+ if not hasattr(model_obj, "generate"):
+ return
+ original_generate = model_obj.generate
+
+ def wrapped_generate(*args: Any, **kwargs: Any) -> Any:
+ kwargs["use_cache"] = False
+
+ # Ensure consistent dtype behavior during generation by using eval mode
+ # This prevents dtype mismatches between model weights (bfloat16) and activations
+ was_training = model_obj.training
+ model_obj.eval()
+ try:
+ return original_generate(*args, **kwargs)
+ finally:
+ if was_training:
+ model_obj.train()
+
+ model_obj.generate = wrapped_generate
+
+ patch_generate_no_cache(model)
+ if hasattr(model, "base_model"):
+ patch_generate_no_cache(model.base_model)
+
+ logging.info("Patched generate() to enforce use_cache=False and consistent dtype behavior")
+
grpo_config = GRPOConfig(
output_dir=cfg.model.new_model,
per_device_train_batch_size=cfg.training.per_device_train_batch_size,
@@ -135,24 +745,119 @@ def grpo_train(
weight_decay=cfg.training.weight_decay,
gradient_checkpointing=cfg.training.gradient_checkpointing,
gradient_checkpointing_kwargs={"use_reentrant": False},
- report_to="wandb",
+ report_to=report_to_backend, # Use dynamic backend selection
save_total_limit=cfg.training.save_total_limit,
load_best_model_at_end=cfg.training.load_best,
num_generations=cfg.grpo.num_generations,
+ optim=optim_name, # Use potentially updated optimizer name
+ # GRPO-specific parameters
+ epsilon=getattr(cfg.grpo, "epsilon", 0.2),
+ beta=getattr(cfg.grpo, "beta", 0.01),
+ loss_type=getattr(cfg.grpo, "loss_type", "grpo"),
+ # Integrate generation parameters from generation_config into GRPOConfig
+ temperature=getattr(generation_config, "temperature", 1.0),
+ top_p=getattr(generation_config, "top_p", 1.0),
+ top_k=getattr(generation_config, "top_k", 50),
+ # VLLM integration (TRL native support)
+ use_vllm=getattr(cfg.grpo, "use_vllm", False),
+ vllm_mode=getattr(cfg.grpo, "vllm_mode", "colocate"),
+ vllm_gpu_memory_utilization=getattr(cfg.grpo, "vllm_gpu_memory_utilization", 0.9),
+ vllm_server_host=getattr(cfg.grpo, "vllm_server_host", None),
)
- trainer = GRPOTrainer(
- model=model,
- args=grpo_config,
- train_dataset=train_data,
- eval_dataset=val_data,
- processing_class=tokenizer,
- reward_funcs=reward_func,
+ logging.info(
+ f"GRPO Config: epsilon={grpo_config.epsilon}, beta={grpo_config.beta}, "
+ f"loss_type={grpo_config.loss_type}, num_generations={grpo_config.num_generations}, "
)
- trainer.train()
- logging.info("GRPO training completed")
+ # Create GRPOTrainer with custom optimizer support
+ trainer_kwargs = {
+ "model": model,
+ "args": grpo_config,
+ "train_dataset": train_data,
+ "eval_dataset": val_data,
+ "processing_class": tokenizer,
+ "reward_funcs": reward_func,
+ }
+
+ # Only add peft_config if model is not already a PeftModel
+ if not isinstance(model, PeftModel):
+ peft_config = LoraConfig(
+ r=cfg.model.lora.r,
+ lora_alpha=cfg.model.lora.alpha,
+ lora_dropout=cfg.model.lora.dropout,
+ bias="none",
+ task_type="CAUSAL_LM",
+ target_modules=[
+ "up_proj",
+ "down_proj",
+ "gate_proj",
+ "k_proj",
+ "q_proj",
+ "v_proj",
+ "o_proj",
+ ],
+ inference_mode=False,
+ )
+ trainer_kwargs["peft_config"] = peft_config
+ logging.info("Added peft_config to GRPOTrainer (model is not already a PeftModel)")
+ else:
+ logging.info("Model is already a PeftModel, skipping peft_config in GRPOTrainer")
+
+ # Add custom optimizer if available
+ if custom_optimizer is not None:
+ trainer_kwargs["optimizers"] = (custom_optimizer, None) # (optimizer, lr_scheduler)
+
+ # Set default dtype based on training configuration to prevent dtype mismatches
+ # BF16 is strict about dtype consistency, FP16 is more forgiving
+ # This ensures all internal tensors (attention masks, etc.)
+ # are created in the correct dtype
+ import torch
+
+ torch_dtype = (
+ torch.bfloat16
+ if cfg.training.bf16
+ else (torch.float16 if cfg.training.fp16 else torch.float32)
+ )
+ old_default_dtype = torch.get_default_dtype()
+ torch.set_default_dtype(torch_dtype)
+ logging.info(f"Set default torch dtype to {torch_dtype} for GRPO training")
+
+ # Convert non-quantized model parameters (lm_head, embeddings) for BF16 only
+ # FP16 doesn't need this as PyTorch auto-casting handles float32/float16 mixing
+ if cfg.training.bf16:
+ model = convert_model_dtype_for_training(model, torch_dtype, logging)
+ logging.info("Applied dtype conversion for BF16 training (lm_head, embeddings)")
+
+ trainer = GRPOTrainer(**trainer_kwargs)
+
+ # Memory optimization before training using enhanced utilities
+ log_memory_usage("Before GRPO training: ", cfg=cfg)
+ comprehensive_memory_cleanup(cfg=cfg)
+
+ # Check if MLflow is enabled for nested run management
+ mlflow_enabled = report_to_backend == "mlflow"
+
+ logging.info("Starting GRPO training...")
+ try:
+ # Use nested MLflow run for GRPO phase to avoid parameter conflicts
+ with mlflow_phase_run("grpo", enabled=mlflow_enabled):
+ trainer.train()
+ logging.info("GRPO training completed")
+ finally:
+ # Restore original default dtype after training
+ torch.set_default_dtype(old_default_dtype)
+ logging.info(f"Restored default torch dtype to {old_default_dtype}")
global_steps = trainer.state.global_step
+ # Log final training statistics
+ if hasattr(trainer.state, "log_history") and trainer.state.log_history:
+ final_log = trainer.state.log_history[-1]
+ logging.info(f"Final training metrics: {final_log}")
+
+ # Enhanced cleanup after GRPO training completion
+ log_memory_usage("After GRPO training: ", cfg=cfg)
+ comprehensive_memory_cleanup(aggressive=True, cfg=cfg)
+
return global_steps
diff --git a/training_model/logging_config.py b/training_model/logging_config.py
index f93da5c..109e3b6 100644
--- a/training_model/logging_config.py
+++ b/training_model/logging_config.py
@@ -1,9 +1,25 @@
"""File for configuring logging with colored output."""
+
import logging
from logging import Formatter, LogRecord, StreamHandler
-from typing import Dict
-LOG_COLORS: Dict[str, str] = {
+"""
+Enhanced logging configuration and utilities for LLM LoRa training framework.
+
+This module provides:
+- Centralized logging configuration with colored output
+- Named logger instances for better debugging
+- Utility functions for structured logging
+- Standardized training progress logging
+
+Usage:
+ from training_model.logging_config import configure_logging, get_logger
+
+ configure_logging(logging.DEBUG)
+ logger = get_logger(__name__)
+ logger.info("Module initialized")
+"""
+LOG_COLORS: dict[str, str] = {
"DEBUG": "#4b8bf5", # Light blue
"INFO": "#2ecc71", # Green
"WARNING": "#f1c40f", # Yellow
@@ -54,25 +70,122 @@ def format(self, record: LogRecord) -> str:
return f"{color_code}{message}{RESET_COLOR}"
-def configure_logging(level: int = logging.INFO) -> None:
+def configure_logging(level: int | str = logging.INFO) -> None:
"""Configure root logger with colored output handler.
Args:
- level (int): Logging level to set (logging.INFO or logging.DEBUG).
+ level (int | str): Logging level to set. Can be:
+ - int: logging.INFO or logging.DEBUG
+ - str: "INFO", "DEBUG" (case insensitive)
Defaults to logging.INFO.
Raises:
- ValueError: If level is not logging.INFO or logging.DEBUG
+ ValueError: If level is not a valid logging level
"""
+ # Convert string level to logging constant if needed
+ if isinstance(level, str):
+ level_str = level.upper()
+ if level_str == "INFO":
+ level = logging.INFO
+ elif level_str == "DEBUG":
+ level = logging.DEBUG
+ else:
+ raise ValueError(f"Invalid log level string: {level}. Use 'INFO' or 'DEBUG'")
+
+ # Validate integer levels
if level != logging.INFO and level != logging.DEBUG:
- raise ValueError("You can use only logging.info or logging.debug")
+ raise ValueError("You can use only logging.INFO or logging.DEBUG")
+
+ # Clear existing handlers to avoid duplicates
+ root_logger = logging.getLogger()
+ for handler in root_logger.handlers[:]:
+ root_logger.removeHandler(handler)
+
handler = StreamHandler()
handler.setFormatter(
ColoredFormatter(
- fmt="%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
- )
+ fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
+ datefmt="%Y-%m-%d %H:%M:%S",
+ ),
)
- logger = logging.getLogger()
- logger.setLevel(level)
- logger.addHandler(handler)
+ root_logger.setLevel(level)
+ root_logger.addHandler(handler)
+
+ # Suppress third-party library noise
+ logging.getLogger("transformers").setLevel(logging.WARNING)
+ logging.getLogger("torch").setLevel(logging.WARNING)
+ logging.getLogger("urllib3").setLevel(logging.WARNING)
+ logging.getLogger("requests").setLevel(logging.WARNING)
+
+
+def get_logger(name: str) -> logging.Logger:
+ """Get a named logger instance.
+
+ Args:
+ name (str): Logger name, typically __name__ of the calling module
+
+ Returns:
+ logging.Logger: Configured logger instance
+ """
+ return logging.getLogger(name)
+
+
+def log_dict(
+ logger: logging.Logger,
+ data: dict,
+ level: int = logging.INFO,
+ prefix: str = "",
+) -> None:
+ """Log dictionary contents in a structured format.
+
+ Args:
+ logger: Logger instance to use
+ data: Dictionary to log
+ level: Log level to use
+ prefix: Optional prefix for the log message
+ """
+ if not data:
+ return
+
+ logger.log(level, f"{prefix}Configuration:" if prefix else "Configuration:")
+ for key, value in data.items():
+ if isinstance(value, dict):
+ logger.log(level, f" {key}:")
+ for sub_key, sub_value in value.items():
+ logger.log(level, f" {sub_key}: {sub_value}")
+ else:
+ logger.log(level, f" {key}: {value}")
+
+
+def log_training_progress(
+ logger: logging.Logger,
+ step: int,
+ total_steps: int,
+ loss: float | None = None,
+ metrics: dict | None = None,
+) -> None:
+ """Log training progress in a standardized format.
+
+ Args:
+ logger: Logger instance to use
+ step: Current training step
+ total_steps: Total number of training steps
+ loss: Current loss value (optional)
+ metrics: Additional metrics dictionary (optional)
+ """
+ progress_pct = (step / total_steps) * 100 if total_steps > 0 else 0
+ base_msg = f"Step {step}/{total_steps} ({progress_pct:.1f}%)"
+
+ if loss is not None:
+ base_msg += f" - Loss: {loss:.4f}"
+
+ if metrics:
+ metric_strs = [
+ f"{k}: {v:.4f}" if isinstance(v, int | float) else f"{k}: {v}"
+ for k, v in metrics.items()
+ ]
+ if metric_strs:
+ base_msg += f" - {', '.join(metric_strs)}"
+
+ logger.info(base_msg)
diff --git a/training_model/logging_utils.py b/training_model/logging_utils.py
new file mode 100644
index 0000000..caf0dd9
--- /dev/null
+++ b/training_model/logging_utils.py
@@ -0,0 +1,382 @@
+"""MLflow logging utilities for training pipeline."""
+
+import logging
+from contextlib import contextmanager
+from pathlib import Path
+from typing import Any
+
+from omegaconf import DictConfig
+
+
+def get_report_to_backend(cfg: DictConfig) -> str:
+ """Get the appropriate report_to parameter based on configuration.
+
+ Args:
+ cfg: Hydra configuration object.
+
+ Returns:
+ String indicating which backend to report to: "mlflow", "wandb", or "none".
+ """
+ log_dict = getattr(cfg, "logging", {})
+ backend = getattr(log_dict, "logging_backend", None)
+
+ if backend is None:
+ backend = "wandb" if getattr(cfg, "wandb", None) else "none"
+
+ backend = str(backend).lower()
+
+ # Map our backend names to HuggingFace trainer expected values
+ if backend == "mlflow":
+ return "mlflow"
+ if backend == "wandb":
+ return "wandb"
+ return "none"
+
+
+@contextmanager
+def mlflow_phase_run(phase_name: str, enabled: bool = True) -> None:
+ """Context manager for MLflow nested runs per training phase.
+
+ This prevents parameter conflicts when different training phases (SFT, GRPO, DPO)
+ have different trainer configurations. Each phase gets its own nested run.
+
+ Args:
+ phase_name: Name of the training phase (e.g., "sft", "grpo", "dpo")
+ enabled: Whether MLflow is enabled (if False, no-op context manager)
+
+ Yields:
+ None
+
+ Example:
+ >>> with mlflow_phase_run("sft", enabled=True):
+ ... trainer.train()
+ """
+ if not enabled:
+ yield
+ return
+
+ try:
+ import mlflow
+
+ if mlflow.active_run() is None:
+ yield
+ return
+
+ mlflow.start_run(nested=True, run_name=phase_name)
+ logging.info(f"Started nested MLflow run for {phase_name} phase")
+
+ try:
+ yield
+ except Exception:
+ raise
+ finally:
+ mlflow.end_run()
+ logging.info(f"Ended nested MLflow run for {phase_name} phase")
+
+ except ImportError:
+ logging.debug("MLflow not available, skipping nested run")
+ yield
+
+
+def log_training_config(cfg: DictConfig) -> None:
+ """Log training configuration parameters to MLflow if enabled.
+
+ Args:
+ cfg: Hydra configuration object.
+ """
+ try:
+ import mlflow
+
+ # Check if MLflow is active
+ if mlflow.active_run() is None:
+ return
+
+ # Check if parameters are already logged to prevent conflicts
+ run = mlflow.active_run()
+ if run is None:
+ return
+
+ # Get already logged parameters
+ try:
+ run_data = mlflow.get_run(run.info.run_id)
+ existing_params = set(run_data.data.params.keys())
+ except Exception:
+ # If we can't get existing params, continue with empty set
+ existing_params = set()
+
+ # Log training methods
+ training_methods = {
+ "use_sft": cfg.training.use_sft,
+ "use_grpo": cfg.training.use_grpo,
+ "use_dpo": cfg.training.use_dpo,
+ }
+
+ # Log RKLLM settings if enabled
+ rkllm_params = {}
+ if getattr(cfg.model, "rkllm", {}).get("enabled", False):
+ rkllm_params = {
+ "rkllm_enabled": cfg.model.rkllm.enabled,
+ "rkllm_target_platform": cfg.model.rkllm.target_platform,
+ "rkllm_quantization": cfg.model.rkllm.quantization,
+ "rkllm_do_parallelize": cfg.model.rkllm.do_parallelize,
+ "rkllm_hybrid_quantization": cfg.model.rkllm.hybrid_quantization,
+ "rkllm_num_npu_core": cfg.model.rkllm.num_npu_core,
+ }
+
+ # Log all parameter groups, but filter out already logged parameters
+ for params in [
+ training_methods,
+ rkllm_params,
+ ]:
+ # Filter out parameters that are already logged
+ filtered_params = {
+ key: value for key, value in params.items() if key not in existing_params
+ }
+
+ # Only log if there are new parameters
+ if filtered_params:
+ mlflow.log_params(filtered_params)
+ # Update the set of existing parameters
+ existing_params.update(filtered_params.keys())
+
+ logging.info("Logged training configuration to MLflow")
+
+ except Exception as e:
+ logging.warning(f"Failed to log configuration to MLflow: {e}")
+
+
+def log_training_artifacts(cfg: DictConfig, model_path: str | Path, global_steps: int) -> None:
+ """Log training artifacts to MLflow if enabled.
+
+ Args:
+ cfg: Hydra configuration object.
+ model_path: Path to the trained model.
+ global_steps: Number of training steps completed.
+ """
+ try:
+ import mlflow
+
+ # Check if MLflow is active
+ if mlflow.active_run() is None:
+ return
+
+ # Log final model checkpoint
+ checkpoint_path = Path(cfg.model.new_model) / f"checkpoint-{global_steps}"
+ if checkpoint_path.exists():
+ mlflow.log_artifacts(checkpoint_path, "model_checkpoint")
+ logging.info(f"Logged model checkpoint to MLflow: {checkpoint_path}")
+
+ # Log merged model if it exists
+ if Path(model_path).exists():
+ mlflow.log_artifacts(model_path, "merged_model")
+ logging.info(f"Logged merged model to MLflow: {model_path}")
+
+ # Log GGUF model if it exists
+ if cfg.model.quant.get("enabled", True):
+ gguf_path = Path(cfg.paths.final_weights_path) / cfg.model.quant.gguf_dir
+ if gguf_path.exists():
+ mlflow.log_artifacts(gguf_path, "gguf_model")
+ logging.info(f"Logged GGUF model to MLflow: {gguf_path}")
+
+ # Log RKLLM model if it exists
+ if getattr(cfg.model, "rkllm", {}).get("enabled", False):
+ rkllm_path = Path(cfg.paths.output_dir) / cfg.model.rkllm.output_dir
+ if rkllm_path.exists():
+ mlflow.log_artifacts(rkllm_path, "rkllm_model")
+ logging.info(f"Logged RKLLM model to MLflow: {rkllm_path}")
+
+ except Exception as e:
+ logging.warning(f"Failed to log artifacts to MLflow: {e}")
+
+
+def log_evaluation_metrics(metrics: dict[str, Any]) -> None:
+ """Log evaluation metrics to MLflow if enabled.
+
+ Args:
+ metrics: Dictionary of metric names to values.
+ """
+ try:
+ import mlflow
+
+ # Check if MLflow is active
+ if mlflow.active_run() is None:
+ return
+
+ # Filter out non-numeric metrics and log them
+ numeric_metrics = {}
+ for key, value in metrics.items():
+ try:
+ # Try to convert to float, skip if not possible
+ numeric_value = float(value)
+ numeric_metrics[key] = numeric_value
+ except (ValueError, TypeError):
+ logging.debug(f"Skipping non-numeric metric: {key}={value}")
+ continue
+
+ if numeric_metrics:
+ mlflow.log_metrics(numeric_metrics)
+ logging.info(
+ f"Logged evaluation metrics to MLflow: {list(numeric_metrics.keys())}",
+ )
+
+ except Exception as e:
+ logging.warning(f"Failed to log evaluation metrics to MLflow: {e}")
+
+
+def validate_mlflow_connection(cfg: DictConfig) -> bool:
+ """Validate MLflow connection and configuration.
+
+ Args:
+ cfg: Hydra configuration object.
+
+ Returns:
+ True if MLflow is properly configured and accessible, False otherwise.
+ """
+ try:
+ import mlflow
+
+ log_dict = getattr(cfg, "logging", {})
+ backend = getattr(log_dict, "logging_backend", "none")
+
+ if backend.lower() != "mlflow":
+ return False
+
+ ml_cfg = getattr(log_dict, "mlflow", None)
+ if not ml_cfg:
+ logging.warning("MLflow backend selected but no mlflow configuration found")
+ return False
+
+ tracking_uri = getattr(ml_cfg, "tracking_uri", None)
+ if tracking_uri:
+ mlflow.set_tracking_uri(tracking_uri)
+
+ # Try to list experiments to test connection
+ experiments = mlflow.search_experiments()
+ logging.info(f"MLflow connection validated. Found {len(experiments)} experiments.")
+ return True
+
+ except Exception as e:
+ logging.exception(f"MLflow connection validation failed: {e}")
+ return False
+
+
+def log_dataset_samples(
+ dataset: list[dict] | Any,
+ cfg: DictConfig,
+ dataset_name: str = "dataset",
+ phase: str = "unknown",
+) -> None:
+ """Log sample entries from a dataset for inspection before training.
+
+ Args:
+ dataset: The dataset to sample from (list of dicts, HuggingFace dataset, etc.)
+ cfg: Hydra configuration object containing dataset_logging settings
+ dataset_name: Name of the dataset for logging context (e.g., "train", "validation")
+ phase: Processing phase (e.g., "raw", "processed")
+ """
+ try:
+ # Check if dataset logging is enabled
+ dataset_logging_cfg = getattr(cfg.logging, "dataset_logging", {})
+ if not getattr(dataset_logging_cfg, "enabled", False):
+ return
+
+ # Get logging configuration parameters
+ log_level = getattr(dataset_logging_cfg, "log_level", "INFO").upper()
+ num_samples = getattr(dataset_logging_cfg, "num_samples", 5)
+ include_metadata = getattr(dataset_logging_cfg, "include_metadata", True)
+ truncate_long_text = getattr(dataset_logging_cfg, "truncate_long_text", True)
+ max_text_length = getattr(dataset_logging_cfg, "max_text_length", 500)
+
+ # Skip if wrong phase
+ log_raw = getattr(dataset_logging_cfg, "log_raw_data", True)
+ log_processed = getattr(dataset_logging_cfg, "log_processed_data", True)
+
+ if phase == "raw" and not log_raw:
+ return
+ if phase == "processed" and not log_processed:
+ return
+
+ # Convert log level string to logging constant
+ log_level_int = getattr(logging, log_level, logging.INFO)
+
+ # Get dataset size and convert to list if needed
+ dataset_size = 0
+ dataset_list = []
+
+ # Handle different dataset types
+ if hasattr(dataset, "__len__") and hasattr(dataset, "__getitem__"):
+ # HuggingFace dataset or similar
+ dataset_size = len(dataset)
+ dataset_list = [dataset[i] for i in range(min(num_samples, dataset_size))]
+ elif isinstance(dataset, list):
+ # List of dictionaries
+ dataset_size = len(dataset)
+ dataset_list = dataset[:num_samples]
+ else:
+ # Unknown dataset type
+ logging.warning(f"Unknown dataset type for {dataset_name}: {type(dataset)}")
+ return
+
+ # Log metadata if enabled
+ if include_metadata:
+ logging.log(
+ log_level_int,
+ f"Dataset '{dataset_name}' ({phase}): {dataset_size} total samples, "
+ f"showing first {min(num_samples, dataset_size)} samples",
+ )
+
+ # Log individual samples
+ for i, sample in enumerate(dataset_list):
+ # Convert sample to string representation
+ if isinstance(sample, dict):
+ sample_str = _format_sample_dict(sample, truncate_long_text, max_text_length)
+ else:
+ sample_str = str(sample)
+ if truncate_long_text and len(sample_str) > max_text_length:
+ sample_str = sample_str[:max_text_length] + "..."
+
+ logging.log(
+ log_level_int,
+ f"Dataset '{dataset_name}' ({phase}) Sample {i+1}:\n{sample_str}",
+ )
+
+ logging.log(
+ log_level_int,
+ f"Finished logging {len(dataset_list)} samples from "
+ f"dataset '{dataset_name}' ({phase})",
+ )
+
+ except Exception as e:
+ logging.warning(f"Failed to log dataset samples for {dataset_name}: {e}")
+
+
+def _format_sample_dict(
+ sample: dict[str, Any], truncate_long_text: bool = True, max_text_length: int = 500
+) -> str:
+ """Format a sample dictionary for logging display.
+
+ Args:
+ sample: Dictionary representing a dataset sample
+ truncate_long_text: Whether to truncate long text fields
+ max_text_length: Maximum length for text fields when truncating
+
+ Returns:
+ Formatted string representation of the sample
+ """
+ formatted_lines = []
+
+ for key, value in sample.items():
+ # Convert value to string
+ value_str = str(value)
+
+ # Truncate if needed
+ if truncate_long_text and len(value_str) > max_text_length:
+ value_str = (
+ value_str[:max_text_length]
+ + f"... (truncated, original length: {len(str(value))})"
+ )
+
+ # Format the key-value pair
+ formatted_lines.append(f" {key}: {value_str}")
+
+ return "{\n" + "\n".join(formatted_lines) + "\n}"
diff --git a/training_model/memory_utils.py b/training_model/memory_utils.py
new file mode 100644
index 0000000..44a14dc
--- /dev/null
+++ b/training_model/memory_utils.py
@@ -0,0 +1,169 @@
+"""
+Memory management utilities for efficient training pipeline cleanup.
+"""
+
+import gc
+import logging
+import os
+from typing import Any
+
+import psutil
+import torch
+from omegaconf import DictConfig
+
+logger = logging.getLogger(__name__)
+
+
+def get_memory_usage() -> dict[str, float]:
+ """Get current memory usage statistics."""
+ memory_stats = {}
+ # System RAM
+ process = psutil.Process(os.getpid())
+ memory_stats["ram_mb"] = process.memory_info().rss / 1024 / 1024
+ # GPU memory if available
+ if torch.cuda.is_available():
+ memory_stats["gpu_allocated_mb"] = torch.cuda.memory_allocated() / 1024 / 1024
+ memory_stats["gpu_reserved_mb"] = torch.cuda.memory_reserved() / 1024 / 1024
+ memory_stats["gpu_free_mb"] = (
+ (torch.cuda.get_device_properties(0).total_memory - torch.cuda.memory_reserved())
+ / 1024
+ / 1024
+ )
+ return memory_stats
+
+
+def log_memory_usage(
+ prefix: str = "", log_level: int = logging.INFO, cfg: DictConfig | None = None
+) -> None:
+ """Log current memory usage with optional prefix."""
+ # Check config to see if logging is enabled
+ if (
+ cfg
+ and hasattr(cfg, "memory_management")
+ and not getattr(cfg.memory_management, "log_memory_usage", True)
+ ):
+ return
+ stats = get_memory_usage()
+ msg = f"{prefix}Memory usage - RAM: {stats['ram_mb']:.1f}MB"
+ if "gpu_allocated_mb" in stats:
+ msg += f", GPU allocated: {stats['gpu_allocated_mb']:.1f}MB"
+ msg += f", GPU reserved: {stats['gpu_reserved_mb']:.1f}MB"
+ msg += f", GPU free: {stats['gpu_free_mb']:.1f}MB"
+ logger.log(log_level, msg)
+
+
+def comprehensive_memory_cleanup(
+ aggressive: bool = False, cfg: DictConfig | None = None
+) -> None:
+ """
+ Perform comprehensive memory cleanup with graceful CUDA error handling.
+ Args:
+ aggressive: If True, performs more thorough cleanup.
+ cfg: Configuration object with memory management settings.
+ """
+ # Use config to determine aggressiveness if provided
+ if cfg and hasattr(cfg, "memory_management"):
+ aggressive = getattr(cfg.memory_management, "aggressive_cleanup", aggressive)
+
+ logger.debug("Starting memory cleanup")
+
+ # Standard cleanup
+ gc.collect()
+
+ if torch.cuda.is_available():
+ try:
+ torch.cuda.empty_cache()
+ except RuntimeError as e:
+ # If CUDA is in an error state, try alternative cleanup methods
+ logger.warning(
+ f"torch.cuda.empty_cache() failed: {e}. Attempting alternative cleanup."
+ )
+ try:
+ torch.cuda.synchronize()
+ torch.cuda.reset_peak_memory_stats()
+ except RuntimeError as e2:
+ logger.warning(
+ f"Alternative CUDA cleanup also failed: {e2}. Continuing with CPU cleanup."
+ )
+
+ try:
+ torch.cuda.reset_peak_memory_stats() # Reset peak stats for better monitoring
+ except RuntimeError as e:
+ logger.warning(f"Failed to reset CUDA peak memory stats: {e}")
+
+ if aggressive:
+ try:
+ torch.cuda.synchronize() # Ensure all operations are complete
+ except RuntimeError as e:
+ logger.warning(f"torch.cuda.synchronize() failed: {e}")
+
+ try:
+ torch.cuda.ipc_collect() # Collect inter-process communication memory
+ except RuntimeError as e:
+ logger.warning(f"torch.cuda.ipc_collect() failed: {e}")
+
+ gc.collect() # One extra GC pass in aggressive mode (avoid loops)
+
+ logger.debug("Memory cleanup completed")
+
+
+def cleanup_object(obj: Any, obj_name: str = "object", cfg: DictConfig | None = None) -> None:
+ """
+ Safely cleanup any object and free its memory.
+ Args:
+ obj: The object to cleanup (can be None).
+ obj_name: Name for logging purposes.
+ cfg: Configuration object with memory management settings.
+ """
+ if obj is None:
+ return
+ logger.debug(f"Cleaning up {obj_name}")
+ try:
+ # Move to CPU if it's a torch module/model
+ if isinstance(obj, torch.nn.Module) and hasattr(obj, "cpu"):
+ obj.cpu()
+ # Clear specific attributes if it's a trainer-like object
+ if hasattr(obj, "model"):
+ obj.model = None
+ if hasattr(obj, "processing_class"):
+ obj.processing_class = None
+ elif hasattr(obj, "tokenizer"):
+ obj.tokenizer = None
+ if hasattr(obj, "train_dataset"):
+ obj.train_dataset = None
+ if hasattr(obj, "eval_dataset"):
+ obj.eval_dataset = None
+ # Cleanup cache if it's a dataset
+ if hasattr(obj, "cleanup_cache_files"):
+ obj.cleanup_cache_files()
+ except Exception as e:
+ logger.warning(f"Partial failure during {obj_name} cleanup: {e}")
+ finally:
+ del obj
+ comprehensive_memory_cleanup(cfg=cfg)
+ logger.debug(f"{obj_name} cleanup completed")
+
+
+# Specialized wrappers (for backward compatibility or specific use)
+def cleanup_model(
+ model: Any | None, model_name: str = "model", cfg: DictConfig | None = None
+) -> None:
+ cleanup_object(model, model_name, cfg)
+
+
+def cleanup_tokenizer(
+ tokenizer: Any | None, tokenizer_name: str = "tokenizer", cfg: DictConfig | None = None
+) -> None:
+ cleanup_object(tokenizer, tokenizer_name, cfg)
+
+
+def cleanup_dataset(
+ dataset: Any | None, dataset_name: str = "dataset", cfg: DictConfig | None = None
+) -> None:
+ cleanup_object(dataset, dataset_name, cfg)
+
+
+def cleanup_trainer(
+ trainer: Any | None, trainer_name: str = "trainer", cfg: DictConfig | None = None
+) -> None:
+ cleanup_object(trainer, trainer_name, cfg)
diff --git a/training_model/one_file_train.py b/training_model/one_file_train.py
index 5c5536e..9ee7aa1 100644
--- a/training_model/one_file_train.py
+++ b/training_model/one_file_train.py
@@ -1,39 +1,167 @@
-"""Main file for model training"""
+"""Main file for model training."""
+
+import contextlib
import functools
-import gc
import json
import logging
import os
import shutil
import subprocess
+from collections.abc import Generator
from contextlib import contextmanager
+from pathlib import Path
from tempfile import TemporaryDirectory
-from typing import Callable, Dict, Generator, Tuple
+from typing import Any, cast
-# from typing import Any, Dict, List, Union
-# import numpy as np
import requests
import torch
+import wandb
from datasets import Dataset
-from hydra.utils import get_original_cwd
from omegaconf import DictConfig
from peft import LoraConfig, PeftModel, get_peft_model
from requests.auth import HTTPBasicAuth
-from torch import Tensor
-
-# from torch.nn import CrossEntropyLoss
+from sklearn.model_selection import train_test_split
+from torch import nn
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
+ BatchEncoding,
BitsAndBytesConfig,
+ Gemma3ForCausalLM,
+ PreTrainedTokenizerBase,
)
from trl import SFTConfig, SFTTrainer
-import wandb
-
+from .data_preparation import dataset_to_json
+from .dpo_train import dpo_train
+from .exceptions import (
+ ConfigurationError,
+ ConversionError,
+ DataProcessingError,
+ ExperimentTrackingError,
+ ModelLoadingError,
+ TrainingError,
+)
from .grpo_train import grpo_train
from .logging_config import configure_logging
-from .utils import dataset_to_json, tokens_init
+from .logging_utils import (
+ get_report_to_backend,
+ log_dataset_samples,
+ log_evaluation_metrics,
+ log_training_artifacts,
+ log_training_config,
+ mlflow_phase_run,
+ validate_mlflow_connection,
+)
+from .memory_utils import (
+ cleanup_dataset,
+ cleanup_model,
+ cleanup_tokenizer,
+ cleanup_trainer,
+ comprehensive_memory_cleanup,
+ log_memory_usage,
+)
+from .optimizer_factory import create_optimizer, get_optimizer_config_updates
+from .types import ModelType, TrainingResult
+from .utils import _load_environment_if_needed
+
+_LOGGING_BACKEND: str | None = None
+
+
+logger = logging.getLogger(__name__)
+
+
+def init_logging_backend(cfg: DictConfig) -> None:
+ """Initialize experiment logging backend according to configuration.
+
+ Supported backends:
+ - "wandb": Uses Weights & Biases (requires `wandb` import).
+ - "mlflow": Uses MLflow (optional dependency).
+ - "none": No external experiment logging.
+
+ Selection precedence:
+ 1. If `cfg.logging_backend` is present, its (lowercased) value is used.
+ 2. Otherwise if a `cfg.wandb` node exists, "wandb" is chosen.
+ 3. Otherwise defaults to "none".
+
+ This function swallows initialization errors and falls back to "none".
+
+ Args:
+ cfg: Hydra config object.
+
+ Returns:
+ None
+ """
+ global _LOGGING_BACKEND
+ log_dict = getattr(cfg, "logging", {})
+ backend = getattr(log_dict, "logging_backend", None)
+ if backend is None:
+ backend = "wandb" if getattr(cfg, "wandb", None) else "none"
+ backend = str(backend).lower()
+ _LOGGING_BACKEND = backend
+
+ if backend == "wandb":
+ try:
+ wb_cfg = getattr(log_dict, "wandb", None) or {}
+ project = getattr(wb_cfg, "project_name", None)
+ anonymous = getattr(wb_cfg, "anonymous", None)
+ init_kwargs: dict[str, Any] = {}
+ if project:
+ init_kwargs["project"] = project
+ if anonymous is not None:
+ init_kwargs["anonymous"] = anonymous
+ wandb.init(**init_kwargs)
+ logging.info("Initialized wandb logging backend")
+ except Exception as e:
+ logging.warning(f"Failed to initialize wandb: {e}. Falling back to 'none'.")
+ _LOGGING_BACKEND = "none"
+
+ elif backend == "mlflow":
+ try:
+ import mlflow # type: ignore[import]
+
+ ml_cfg = getattr(log_dict, "mlflow", None) or {}
+ experiment = getattr(ml_cfg, "experiment_name", "default")
+ tracking_uri = getattr(ml_cfg, "tracking_uri", None)
+ if tracking_uri:
+ mlflow.set_tracking_uri(tracking_uri)
+ mlflow.set_experiment(experiment)
+ mlflow.enable_system_metrics_logging()
+ mlflow.start_run()
+ logging.info("Initialized mlflow logging backend")
+ except Exception as e:
+ logging.warning(f"Failed to initialize mlflow: {e}. Falling back to 'none'.")
+ _LOGGING_BACKEND = "none"
+
+ else:
+ logging.info("No external logging backend initialized (using 'none').")
+
+
+def finish_logging_backend() -> None:
+ """Finish/cleanup the selected logging backend (if any).
+
+ Args:
+ None
+
+ Returns:
+ None
+ """
+ global _LOGGING_BACKEND
+ if _LOGGING_BACKEND == "wandb":
+ try:
+ wandb.finish()
+ logging.info("wandb finished")
+ except Exception as e:
+ logging.warning(f"wandb.finish() failed: {e}")
+ elif _LOGGING_BACKEND == "mlflow":
+ try:
+ import mlflow # type: ignore[import]
+
+ mlflow.end_run()
+ logging.info("mlflow run ended")
+ except Exception as e:
+ logging.warning(f"mlflow.end_run() failed: {e}")
+ _LOGGING_BACKEND = None
@contextmanager
@@ -41,233 +169,682 @@ def change_dir(destination: str) -> Generator[None, None, None]:
"""Context manager for temporarily changing the working directory.
Args:
- destination (str): Path to the target directory
+ destination: Path to the target directory.
Yields:
- None: Enters the target directory during context execution
+ None: Enters the target directory during context execution.
"""
- current_dir = os.getcwd()
- os.chdir(destination)
+ current_dir = Path.cwd()
+ target_dir = Path(destination)
+ target_dir.mkdir(parents=True, exist_ok=True)
+
+ os.chdir(str(target_dir))
try:
yield
finally:
- os.chdir(current_dir)
+ os.chdir(str(current_dir))
-def generate_prompt(tokenizer: AutoTokenizer, data_point: Dict[str, str]) -> str:
+def generate_prompt(tokenizer: PreTrainedTokenizerBase, data_point: dict[str, str]) -> str:
"""Generate a chat template prompt for the model.
Args:
- tokenizer (AutoTokenizer): Hugging Face tokenizer
- data_point (Dict[str, str]): Dictionary containing system, user and bot messages
+ tokenizer: Hugging Face tokenizer.
+ data_point: Dictionary containing system, user and bot messages.
Returns:
- str: Formatted chat prompt
+ Formatted chat prompt.
"""
- return tokenizer.apply_chat_template(
- [
- {"role": "system", "content": data_point["system"]},
- {"role": "user", "content": data_point["user"]},
- {"role": "assistant", "content": data_point["bot"]},
- ],
- tokenize=False,
- )
+ apply_fn = getattr(tokenizer, "apply_chat_template", None)
+ if callable(apply_fn):
+ res = apply_fn(
+ [
+ {"role": "system", "content": data_point["system"]},
+ {"role": "user", "content": data_point["user"]},
+ {"role": "assistant", "content": data_point["bot"]},
+ ],
+ tokenize=False,
+ )
+ return str(res)
+ # Fallback: join messages into a single prompt string
+ parts = [
+ data_point.get("system", ""),
+ data_point.get("user", ""),
+ data_point.get("bot", ""),
+ ]
+ return "\n".join([p for p in parts if p])
def tokenize(
- tokenizer: AutoTokenizer | Callable, cutoff_len: int, prompt: str
-) -> Dict[str, torch.Tensor]:
+ tokenizer: PreTrainedTokenizerBase,
+ cutoff_len: int,
+ prompt: str,
+) -> BatchEncoding | dict[str, list]:
"""Tokenize text with specified length constraints.
Args:
- tokenizer (AutoTokenizer): Hugging Face tokenizer
- cutoff_len (int): Maximum sequence length
- prompt (str): Text to tokenize
+ tokenizer: Hugging Face tokenizer.
+ cutoff_len: Maximum sequence length.
+ prompt: Text to tokenize.
Returns:
- Dict[str, torch.Tensor]: Tokenized output dictionary
+ Tokenized output dictionary.
"""
- return tokenizer(
+ result = tokenizer(
prompt,
truncation=True,
max_length=cutoff_len,
- padding="max_length",
+ padding=False,
return_tensors=None,
- add_special_tokens=True,
)
+ return result
def generate_and_tokenize_prompt(
- data_point: Dict[str, str],
- tokenizer: AutoTokenizer,
+ data_point: dict[str, str],
+ tokenizer: PreTrainedTokenizerBase,
cutoff: int,
should_add_prompt: bool = False,
-) -> Dict[str, str] | Dict[str, Tensor]:
+) -> dict[str, Any] | BatchEncoding:
"""Generate and tokenize a complete prompt.
Args:
- data_point (Dict[str, str]): Dictionary containing conversation data
- tokenizer (AutoTokenizer): Hugging Face tokenizer
- cutoff (int): Maximum sequence length
- should_add_prompt (bool): used for grpo, when
- needed dict with keyword "prompt" returned
+ data_point: Dictionary containing conversation data.
+ tokenizer: Hugging Face tokenizer.
+ cutoff: Maximum sequence length.
+ should_add_prompt: Used for GRPO, when needed dict with keyword "prompt" returned.
Returns:
- Dict[str, torch.Tensor]: Tokenized prompt dictionary
+ Tokenized prompt dictionary or a dict containing "prompt" when should_add_prompt=True.
"""
+
+ if should_add_prompt:
+ # Enhanced prompt for GRPO training with JSON output instruction
+ enhanced_prompt = generate_grpo_prompt(tokenizer, data_point)
+ return {"prompt": enhanced_prompt, "correct_answer": data_point["bot"]}
+ # Standard SFT prompt
full_prompt = generate_prompt(tokenizer, data_point)
tokenized_full_prompt = tokenize(
tokenizer,
cutoff,
full_prompt,
)
- if should_add_prompt:
- return {"prompt": full_prompt}
- else:
- return tokenized_full_prompt
+ if (
+ tokenized_full_prompt["input_ids"][-1] != tokenizer.eos_token_id
+ and len(tokenized_full_prompt["input_ids"]) < cutoff
+ ):
+ tokenized_full_prompt["input_ids"].append(tokenizer.eos_token_id)
+ if "attention_mask" in tokenized_full_prompt:
+ tokenized_full_prompt["attention_mask"].append(1)
+ return tokenized_full_prompt
+
+
+def generate_grpo_prompt(
+ tokenizer: PreTrainedTokenizerBase,
+ data_point: dict[str, str],
+) -> str:
+ """Generate an enhanced prompt for GRPO training with JSON output instruction.
+ Args:
+ tokenizer: Hugging Face tokenizer.
+ data_point: Dictionary containing system, user and bot messages.
-def data_preparation(
- cfg: DictConfig, tokenizer: AutoTokenizer, should_add_prompt: bool = False
-) -> Tuple[Dataset, Dataset]:
- """Prepare and preprocess training and validation datasets.
+ Returns:
+ Enhanced prompt string with JSON instruction.
+ """
+ # Start with the standard chat template
+ messages = [
+ {"role": "system", "content": data_point["system"]},
+ {"role": "user", "content": data_point["user"]},
+ ]
+
+ # Add JSON instruction to the user message
+ enhanced_user_content = (
+ f"{data_point['user']}\n\n"
+ "Please respond with a valid JSON object in the following format: "
+ '{"Content": {"Action": ""}}. '
+ "Choose the most appropriate action based on the context."
+ )
+
+ messages[1]["content"] = enhanced_user_content
+
+ # Apply chat template without the assistant response (for GRPO generation)
+ apply_fn = getattr(tokenizer, "apply_chat_template", None)
+ if callable(apply_fn):
+ res = apply_fn(messages, tokenize=False, add_generation_prompt=True)
+ return str(res)
+ # Fallback: join messages into a single prompt string
+ return "\n".join([m.get("content", "") for m in messages if m.get("content")])
+
+
+def _load_json_file(file_path: Path, description: str) -> dict:
+ """Load and parse a JSON file with standardized error handling.
Args:
- cfg (DictConfig): Configuration object
- tokenizer (AutoTokenizer): Hugging Face tokenizer
+ file_path: Path to the JSON file to load.
+ description: Human-readable description of the file for error messages.
Returns:
- Tuple[Dataset, Dataset]: Tuple containing train and validation datasets
+ Loaded JSON data as a dictionary.
+
+ Raises:
+ DataProcessingError: If file loading or JSON parsing fails.
+ """
+ if not file_path.exists():
+ raise DataProcessingError(f"{description} file not found: {file_path}")
+
+ try:
+ return json.loads(file_path.read_text(encoding="utf-8"))
+ except json.JSONDecodeError as e:
+ raise DataProcessingError(f"Invalid JSON format " f"in {file_path}: {e}") from e
+ except Exception as e:
+ raise DataProcessingError(
+ f"Failed to read {description.lower()} from {file_path}: {e}",
+ ) from e
+
+
+def _validate_dataset_structure(data: dict, file_path: Path) -> None:
+ """Validate that dataset has required structure with 'system' and 'examples' keys.
+
+ Args:
+ data: The loaded dataset dictionary.
+ file_path: Path to the file (for error messages).
+
+ Raises:
+ DataProcessingError: If dataset structure is invalid.
"""
- data_dir = os.path.join(get_original_cwd(), cfg.paths.data_dir)
- with open(os.path.join(data_dir, "test_ru.json"), "r", encoding="utf-8") as file:
- test_dataset = json.load(file)
- with open(
- os.path.join(get_original_cwd(), cfg.model.dataset_name), "r", encoding="utf-8"
- ) as file:
- train_dataset = json.load(file)
-
- # Use temporary directory for JSON files
- with TemporaryDirectory() as temp_dir:
- train_json = os.path.join(temp_dir, "train.json")
- test_json = os.path.join(temp_dir, "test.json")
- dataset_to_json(train_dataset, train_json)
- dataset_to_json(test_dataset, test_json)
-
- from datasets import load_dataset
-
- dataset = load_dataset(
- "json", data_files={"train": train_json, "test": test_json}
+ if not isinstance(data, dict) or "examples" not in data:
+ raise DataProcessingError(
+ f"Unrecognized JSON structure in {file_path}. "
+ "Expected dict with 'examples' key.",
)
- tokenize_partial = functools.partial(
- generate_and_tokenize_prompt,
- tokenizer=tokenizer,
- cutoff=cfg.other.cutoff_len,
- should_add_prompt=should_add_prompt,
+
+def _process_auto_split_mode(base: Path, cfg: DictConfig) -> tuple[dict, dict]:
+ """Process auto_split mode: load single file and split automatically.
+
+ Args:
+ base: Base data directory path.
+ cfg: Configuration object.
+
+ Returns:
+ Tuple of (train_dataset, test_dataset).
+
+ Raises:
+ DataProcessingError: If data processing fails.
+ """
+ single_path = base / cfg.paths.train_data
+ raw = _load_json_file(single_path, "Training data")
+ _validate_dataset_structure(raw, single_path)
+
+ # Split the data automatically
+ all_items: list[dict] = raw["examples"]
+ try:
+ list_train, list_test = train_test_split(
+ all_items,
+ test_size=cfg.testing.test_split_ratio,
+ shuffle=True,
+ random_state=cfg.training.seed,
)
- train_data = dataset["train"].map(tokenize_partial)
- val_data = dataset["test"].map(tokenize_partial)
+ except Exception as e:
+ raise DataProcessingError(f"Failed to split dataset: {e}") from e
+
+ train_dataset = {"system": raw["system"], "examples": list_train}
+ test_dataset = {"system": raw["system"], "examples": list_test}
+ return train_dataset, test_dataset
- return train_data, val_data
+
+def _process_separate_validation_mode(base: Path, cfg: DictConfig) -> tuple[dict, dict]:
+ """Process separate_validation mode: load train file + separate validation file.
+
+ Args:
+ base: Base data directory path.
+ cfg: Configuration object.
+
+ Returns:
+ Tuple of (train_dataset, test_dataset).
+
+ Raises:
+ DataProcessingError: If data processing fails.
+ """
+ # Load training file
+ train_path = base / cfg.paths.train_data
+ train_raw = _load_json_file(train_path, "Training data")
+ _validate_dataset_structure(train_raw, train_path)
+
+ # Load separate validation file
+ val_path = base / cfg.testing.val_data_file
+ val_raw = _load_json_file(val_path, "Validation data")
+ _validate_dataset_structure(val_raw, val_path)
+
+ return train_raw, val_raw
+
+
+def _process_separate_files_mode(base: Path, cfg: DictConfig) -> tuple[dict, dict]:
+ """Process separate_files mode: load separate train and test files.
+
+ Args:
+ base: Base data directory path.
+ cfg: Configuration object.
+
+ Returns:
+ Tuple of (train_dataset, test_dataset).
+
+ Raises:
+ DataProcessingError: If data processing fails.
+ """
+ train_path = base / cfg.paths.train_data
+ test_path = base / cfg.paths.test_data
+
+ # Load both files (no structure validation - more flexible)
+ train_dataset = _load_json_file(train_path, "Training file")
+ test_dataset = _load_json_file(test_path, "Test file")
+
+ return train_dataset, test_dataset
+
+
+def data_preparation(
+ cfg: DictConfig,
+ tokenizer: AutoTokenizer,
+ should_add_prompt: bool = False,
+) -> tuple[Dataset, Dataset]:
+ """Prepare and preprocess training and validation datasets.
+
+ This function supports three data source modes:
+ - "auto_split": Single file with automatic train/test splitting
+ - "separate_validation": Single train file + separate validation file
+ - "separate_files": Separate train and test files
+
+ Args:
+ cfg: Configuration object.
+ tokenizer: Hugging Face tokenizer.
+ should_add_prompt: If True, returns dict with "prompt" key for grpo training.
+
+ Returns:
+ Tuple containing train and validation datasets.
+
+ Raises:
+ DataProcessingError: If data loading or preprocessing fails.
+ ConfigurationError: If configuration parameters are invalid.
+ """
+ try:
+ # Use current working directory or the configured data directory
+ base = Path.cwd() / cfg.paths.data_dir
+
+ # Get data source mode and process accordingly
+ data_mode = cfg.testing.data_source_mode
+
+ if data_mode == "auto_split":
+ train_dataset, test_dataset = _process_auto_split_mode(base, cfg)
+ elif data_mode == "separate_validation":
+ train_dataset, test_dataset = _process_separate_validation_mode(base, cfg)
+ elif data_mode == "separate_files":
+ train_dataset, test_dataset = _process_separate_files_mode(base, cfg)
+ else:
+ raise ConfigurationError(
+ f"Invalid data_source_mode: '{data_mode}'. "
+ "Valid options: 'auto_split', 'separate_validation', 'separate_files'",
+ )
+
+ # Log raw datasets before processing
+ log_dataset_samples(train_dataset, cfg, "train", "raw")
+ log_dataset_samples(test_dataset, cfg, "validation", "raw")
+
+ # Use temporary directory for JSON files
+ try:
+ with TemporaryDirectory() as temp_dir:
+ temp_path = Path(temp_dir)
+ train_json = str(temp_path / "train.json")
+ test_json = str(temp_path / "test.json")
+
+ try:
+ dataset_to_json(train_dataset, train_json, cfg.data_preparation.method)
+ dataset_to_json(test_dataset, test_json, cfg.data_preparation.method)
+ except Exception as e:
+ raise DataProcessingError(
+ f"Failed to convert dataset to JSON format: {e}",
+ ) from e
+
+ from datasets import load_dataset
+
+ try:
+ dataset = load_dataset(
+ "json",
+ data_files={"train": train_json, "test": test_json},
+ )
+
+ tokenize_partial = functools.partial(
+ generate_and_tokenize_prompt,
+ tokenizer=tokenizer,
+ cutoff=cfg.other.cutoff_len,
+ should_add_prompt=should_add_prompt,
+ )
+
+ ds_train = cast(Any, dataset["train"])
+ ds_test = cast(Any, dataset["test"])
+
+ # Prefer using the datasets library `.map` when available.
+ # Otherwise, map manually and build a Dataset.
+ if hasattr(ds_train, "map"):
+ train_data = ds_train.map(tokenize_partial)
+ else:
+ # ds_train might be a list of examples
+ train_list = [tokenize_partial(cast(dict, x)) for x in ds_train]
+ train_data = Dataset.from_list(train_list)
+
+ if hasattr(ds_test, "map"):
+ val_data = ds_test.map(tokenize_partial)
+ else:
+ val_list = [tokenize_partial(cast(dict, x)) for x in ds_test]
+ val_data = Dataset.from_list(val_list)
+
+ # Log processed datasets after tokenization
+ log_dataset_samples(train_data, cfg, "train", "processed")
+ log_dataset_samples(val_data, cfg, "validation", "processed")
+
+ except Exception as e:
+ raise DataProcessingError(
+ f"Failed to load or tokenize datasets: {e}",
+ ) from e
+ except Exception as e:
+ if isinstance(e, DataProcessingError):
+ raise
+ raise DataProcessingError(f"Failed during dataset processing: {e}") from e
+
+ return train_data, val_data
+ except (DataProcessingError, ConfigurationError):
+ raise
+ except Exception as e:
+ raise DataProcessingError(f"Unexpected error during data preparation: {e}") from e
def model_merge_for_converting(cfg: DictConfig, steps: int, save_path: str) -> None:
"""Merge base model with adapter weights and save the result.
Args:
- cfg (DictConfig): Configuration object
- steps (int): Training step number for checkpoint selection
- save_path (str): Path to save merged model
+ cfg: Configuration object.
+ steps: Training step number for checkpoint selection.
+ save_path: Path to save merged model.
+
+ Raises:
+ ModelLoadingError: If model loading fails.
+ ConversionError: If model merging or saving fails.
"""
- model_path = cfg.model.model_name
- adapter_path = f"{cfg.model.new_model}/checkpoint-{steps}"
- model = AutoModelForCausalLM.from_pretrained(
- model_path, torch_dtype="auto", device_map="auto"
- )
- tokenizer = AutoTokenizer.from_pretrained(model_path)
- model = PeftModel.from_pretrained(model, adapter_path)
- model = model.merge_and_unload()
+ try:
+ model_path = cfg.model.model_name
+ adapter_path = f"{cfg.model.new_model}/checkpoint-{steps}"
+
+ # Load base model
+ try:
+ if cfg.model.model_type == "gemma":
+ base_model = Gemma3ForCausalLM.from_pretrained(
+ model_path,
+ device_map="auto",
+ torch_dtype="auto",
+ )
+ else:
+ base_model = AutoModelForCausalLM.from_pretrained(
+ model_path,
+ device_map="auto",
+ torch_dtype="auto",
+ )
+ except Exception as e:
+ raise ModelLoadingError(f"Failed to load base model {model_path}: {e}") from e
+
+ # Load tokenizer
+ try:
+ tokenizer = AutoTokenizer.from_pretrained(model_path)
+ base_model.resize_token_embeddings(len(tokenizer))
+ except Exception as e:
+ raise ModelLoadingError(f"Failed to load tokenizer for {model_path}: {e}") from e
+
+ # Load and merge adapter
+ try:
+ peft_model = PeftModel.from_pretrained(cast(Any, base_model), adapter_path)
+ merged_model = cast(nn.Module, peft_model.merge_and_unload()) # type: ignore[assignment]
+ except Exception as e:
+ raise ConversionError(
+ f"Failed to load and merge adapter from {adapter_path}: {e}",
+ ) from e
+
+ # Save merged model
+ try:
+ merged_model.save_pretrained(save_path) # type: ignore[attr-defined]
+ tokenizer.save_pretrained(save_path)
+ except Exception as e:
+ raise ConversionError(f"Failed to save merged model to {save_path}: {e}") from e
+ finally:
+ # Clean up resources with comprehensive memory management
+ log_memory_usage("Before model merge cleanup: ")
+ if "merged_model" in locals():
+ cleanup_model(merged_model, "merged_model")
+ if "peft_model" in locals():
+ cleanup_model(peft_model, "peft_model")
+ if "base_model" in locals():
+ cleanup_model(base_model, "base_model")
+ if "tokenizer" in locals():
+ cleanup_tokenizer(tokenizer, "tokenizer")
+ log_memory_usage("After model merge cleanup: ")
+
+ logging.info("Model merged")
+ except (ModelLoadingError, ConversionError):
+ raise
+ except Exception as e:
+ raise ConversionError(f"Unexpected error during model merging: {e}") from e
+
+
+def setup_model_and_tokenizer(cfg: DictConfig) -> tuple[ModelType, AutoTokenizer]:
+ """Set up model and tokenizer with quantization config.
- model.save_pretrained(save_path)
- tokenizer.save_pretrained(save_path)
- del model
- gc.collect()
- torch.cuda.empty_cache()
- logging.info("Model merged")
+ Args:
+ cfg: Configuration object.
+ Returns:
+ Tuple of (model, tokenizer).
-def train(cfg: DictConfig) -> int:
- """Execute full training pipeline.
+ Raises:
+ ModelLoadingError: If model or tokenizer loading fails.
+ ConfigurationError: If model configuration is invalid.
+ """
+ try:
+ torch_dtype = (
+ getattr(torch, cfg.model.torch_dtype)
+ if isinstance(cfg.model.torch_dtype, str)
+ else cfg.model.torch_dtype
+ )
+ except AttributeError as e:
+ raise ConfigurationError(
+ f"Invalid torch_dtype: {cfg.model.torch_dtype}. "
+ f"Must be one of: float16, bfloat16, float32",
+ ) from e
+
+ try:
+ if cfg.model.quant.enabled:
+ if not cfg.model.quant.use_8bit:
+ bnb_config = BitsAndBytesConfig(
+ load_in_4bit=True,
+ bnb_4bit_quant_type="nf4",
+ bnb_4bit_compute_dtype=torch_dtype,
+ bnb_4bit_use_double_quant=True,
+ )
+ else:
+ bnb_config = BitsAndBytesConfig(
+ load_in_8bit=True,
+ llm_int8_threshold=6.0,
+ torch_dtype=torch_dtype,
+ )
+ else:
+ bnb_config = None
+
+ if cfg.model.model_type == "gemma":
+ model = Gemma3ForCausalLM.from_pretrained(
+ cfg.model.model_name,
+ quantization_config=bnb_config,
+ device_map="auto",
+ attn_implementation=cfg.model.attn_implementation,
+ use_cache=False,
+ )
+ elif cfg.model.model_type == "gemma3n":
+ # TODO: Implement Gemma3n support when available
+ raise ConfigurationError("Gemma3n model type not yet implemented")
+ else:
+ model = AutoModelForCausalLM.from_pretrained(
+ cfg.model.model_name,
+ quantization_config=bnb_config,
+ device_map="auto",
+ attn_implementation=cfg.model.attn_implementation,
+ use_cache=False,
+ )
+ except Exception as e:
+ raise ModelLoadingError(f"Failed to load model {cfg.model.model_name}: {e}") from e
+
+ logging.info("Model loaded")
+
+ try:
+ tokenizer = AutoTokenizer.from_pretrained(cfg.model.model_name)
+ tokenizer.padding_side = "right"
+ if tokenizer.pad_token is None or tokenizer.pad_token_id is None:
+ tokenizer.add_special_tokens({"pad_token": "<|pad|>"})
+ tokenizer.pad_token = "<|pad|>"
+ if tokenizer.pad_token_id is None:
+ tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids(tokenizer.pad_token)
+ model.resize_token_embeddings(len(tokenizer))
+ except Exception as e:
+ raise ModelLoadingError(
+ f"Failed to load tokenizer for {cfg.model.model_name}: {e}",
+ ) from e
+
+ return model, tokenizer
+
+
+def attach_lora_adapters(model: ModelType, cfg: DictConfig) -> ModelType:
+ """Attach LoRA adapters to a quantized model for fine-tuning.
+
+ This function creates and applies LoRA adapters to a quantized model,
+ enabling fine-tuning on quantized weights (which are normally frozen).
+ This is essential when running GRPO or other training methods without SFT,
+ where the model is loaded in quantized form but needs trainable adapters.
Args:
- cfg (DictConfig): Configuration object
+ model: The quantized model to attach LoRA adapters to.
+ cfg: Configuration object containing LoRA parameters.
Returns:
- int: Number of global training steps completed
+ The model with LoRA adapters attached (PeftModel).
+
+ Raises:
+ ConfigurationError: If LoRA configuration creation fails.
"""
- tokens_init(cfg)
- torch_dtype = (
- getattr(torch, cfg.model.torch_dtype)
- if isinstance(cfg.model.torch_dtype, str)
- else cfg.model.torch_dtype
- )
- if not cfg.model.use_8bit:
- bnb_config = BitsAndBytesConfig(
- load_in_4bit=True,
- bnb_4bit_quant_type="nf4",
- bnb_4bit_compute_dtype=torch_dtype,
- bnb_4bit_use_double_quant=True,
+ try:
+ peft_config = LoraConfig(
+ r=cfg.model.lora.r,
+ lora_alpha=cfg.model.lora.alpha,
+ lora_dropout=cfg.model.lora.dropout,
+ bias="none",
+ task_type="CAUSAL_LM",
+ target_modules=[
+ "up_proj",
+ "down_proj",
+ "gate_proj",
+ "k_proj",
+ "q_proj",
+ "v_proj",
+ "o_proj",
+ ],
+ inference_mode=False,
)
- else:
- bnb_config = BitsAndBytesConfig(
- load_in_8bit=True,
- llm_int8_threshold=6.0,
- torch_dtype=torch_dtype,
+ logging.info("LoRA configuration created")
+
+ model = get_peft_model(model, peft_config)
+ logging.info("LoRA adapters attached to model")
+
+ # CRITICAL: Ensure use_cache=False is set on the wrapped model
+ # This prevents incompatibility with gradient checkpointing
+ # Must be done AFTER get_peft_model() to ensure it persists
+ if hasattr(model, "config"):
+ model.config.use_cache = False
+ logging.info("Set model.config.use_cache = False after LoRA attachment")
+
+ if hasattr(model, "base_model") and hasattr(model.base_model, "config"):
+ model.base_model.config.use_cache = False
+ logging.info("Set model.base_model.config.use_cache = False after LoRA attachment")
+
+ return model
+ except Exception as e:
+ raise ConfigurationError(f"Failed to attach LoRA adapters: {e}") from e
+
+
+def run_sft_training(
+ model: ModelType,
+ tokenizer: AutoTokenizer,
+ cfg: DictConfig,
+ train_data: Dataset,
+ val_data: Dataset,
+) -> tuple[int, float, Any]:
+ """Run SFT training phase.
+
+ Args:
+ model: The model to train.
+ tokenizer: The tokenizer.
+ cfg: Configuration object.
+ train_data: Training dataset.
+ val_data: Validation dataset.
+
+ Returns:
+ Tuple of (global_steps, eval_loss, trained_model).
+ The trained_model is the PeftModel with LoRA adapters attached.
+
+ Raises:
+ TrainingError: If SFT training fails.
+ ConfigurationError: If training configuration is invalid.
+ """
+ try:
+ peft_config = LoraConfig(
+ r=cfg.model.lora.r,
+ lora_alpha=cfg.model.lora.alpha,
+ lora_dropout=cfg.model.lora.dropout,
+ bias="none",
+ task_type="CAUSAL_LM",
+ target_modules=[
+ "up_proj",
+ "down_proj",
+ "gate_proj",
+ "k_proj",
+ "q_proj",
+ "v_proj",
+ "o_proj",
+ ],
+ inference_mode=False,
)
- model = AutoModelForCausalLM.from_pretrained(
- cfg.model.model_name,
- quantization_config=bnb_config,
- device_map="auto",
- use_cache=False,
- )
- logging.info("Model loaded")
- tokenizer = AutoTokenizer.from_pretrained(cfg.model.model_name)
- tokenizer.padding_side = "right"
- if tokenizer.pad_token is None or tokenizer.pad_token_id is None:
- tokenizer.add_special_tokens({"pad_token": "<|pad|>"})
- tokenizer.pad_token = "<|pad|>"
- if tokenizer.pad_token_id is None:
- tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids(
- tokenizer.pad_token
- )
- model.resize_token_embeddings(len(tokenizer))
- peft_config = LoraConfig(
- r=cfg.model.lora_r,
- lora_alpha=cfg.model.lora_alpha,
- lora_dropout=cfg.model.lora_dropout,
- bias="none",
- task_type="CAUSAL_LM",
- target_modules=[
- "up_proj",
- "down_proj",
- "gate_proj",
- "k_proj",
- "q_proj",
- "v_proj",
- "o_proj",
- ],
- modules_to_save=["lm_head"],
- inference_mode=False,
- )
- model = get_peft_model(model, peft_config)
- train_data, val_data = data_preparation(cfg, tokenizer)
- logging.info("Data prepared")
- global_steps = 0
- if cfg.training.use_sft:
+ except Exception as e:
+ raise ConfigurationError(f"Failed to create LoRA configuration: {e}") from e
+
+ logging.info("Starting SFT training phase...")
+
+ # Get the appropriate report_to backend based on configuration
+ try:
+ report_to_backend = get_report_to_backend(cfg)
+ except Exception as e:
+ raise ConfigurationError(f"Failed to configure logging backend: {e}") from e
+
+ # Create custom optimizer if adam-mini is enabled
+ custom_optimizer = None
+ config_updates = {}
+ try:
+ custom_optimizer = create_optimizer(model, cfg)
+ if custom_optimizer is not None:
+ config_updates = get_optimizer_config_updates(cfg)
+ logging.info("Using custom adam-mini optimizer for SFT training")
+ except Exception as e:
+ raise ConfigurationError(f"Failed to create custom optimizer: {e}") from e
+
+ try:
+ # Apply optimizer config updates if custom optimizer is being used
+ optim_setting = config_updates.get("optim", cfg.training.optim)
+
sft_config = SFTConfig(
output_dir=cfg.model.new_model,
- max_seq_length=cfg.training.max_seq_length,
+ max_length=cfg.training.max_seq_length,
dataset_kwargs={"skip_prepare_dataset": True},
packing=False,
run_name=cfg.model.new_model,
@@ -275,8 +852,7 @@ def train(cfg: DictConfig) -> int:
per_device_eval_batch_size=cfg.training.per_device_eval_batch_size,
gradient_accumulation_steps=cfg.training.gradient_accumulation_steps,
gradient_checkpointing=cfg.training.gradient_checkpointing,
- # max_steps=cfg.model.train_steps,
- optim=cfg.training.optim,
+ optim=optim_setting,
num_train_epochs=cfg.training.num_train_epochs,
eval_strategy="steps",
eval_steps=cfg.training.eval_steps,
@@ -290,143 +866,873 @@ def train(cfg: DictConfig) -> int:
neftune_noise_alpha=cfg.training.neftune_noise_alpha,
gradient_checkpointing_kwargs={"use_reentrant": False},
group_by_length=True,
- report_to="wandb",
+ report_to=report_to_backend, # Use dynamic backend selection
save_total_limit=cfg.training.save_total_limit,
load_best_model_at_end=cfg.training.load_best,
)
+ if cfg.optuna.enabled:
+ sft_config.run_name = f"{sft_config.run_name}_optuna"
+ except Exception as e:
+ raise ConfigurationError(f"Failed to create SFT configuration: {e}") from e
- trainer = SFTTrainer(
- model=model,
- train_dataset=train_data,
- eval_dataset=val_data,
- peft_config=peft_config,
- processing_class=tokenizer,
- args=sft_config,
- )
- trainer.train()
- global_steps: int = trainer.state.global_step
- if cfg.training.use_grpo:
- grpo_train(
- model=model,
- tokenizer=tokenizer,
- cfg=cfg,
- data_preparing_func=data_preparation,
+ # Run SFT training inside its own try/except/finally so resources are cleaned
+ global_steps = 0
+ eval_loss = float("nan")
+ trainer = None
+ trained_model = None
+
+ # Check if MLflow is enabled for nested run management
+ mlflow_enabled = report_to_backend == "mlflow"
+
+ try:
+ # Create SFTTrainer with custom optimizer if available
+ trainer_kwargs = {
+ "model": cast(nn.Module, model),
+ "train_dataset": train_data,
+ "eval_dataset": val_data,
+ "peft_config": peft_config,
+ "processing_class": cast(PreTrainedTokenizerBase, tokenizer),
+ "args": sft_config,
+ }
+
+ # Add custom optimizer if adam-mini is enabled
+ if custom_optimizer is not None:
+ trainer_kwargs["optimizers"] = (custom_optimizer, None)
+
+ trainer = SFTTrainer(**trainer_kwargs)
+
+ # Use nested MLflow run for SFT phase to avoid parameter conflicts
+ with mlflow_phase_run("sft", enabled=mlflow_enabled):
+ trainer.train()
+
+ global_steps = trainer.state.global_step
+ eval_results = trainer.evaluate()
+ eval_loss = eval_results.get("eval_loss", float("nan"))
+ logging.info(
+ f"SFT completed. Global steps: {global_steps}, Evaluation loss: {eval_loss}",
)
- if not cfg.training.use_grpo and not cfg.training.use_sft:
- logging.warning("Model training not configured")
- else:
- logging.info("Model trained")
- merged_model = model.merge_and_unload()
- merged_model.save_pretrained(cfg.paths.output_dir)
- tokenizer.save_pretrained(cfg.paths.output_dir)
- logging.info("Model saved")
- del model, merged_model
- gc.collect()
- torch.cuda.empty_cache()
- return global_steps
+ # Extract the trained PeftModel before cleanup
+ trained_model = trainer.model
+ logging.info(f"Extracted trained model from SFTTrainer: {type(trained_model)}")
+ except Exception as e:
+ raise TrainingError(f"SFT training failed: {e}") from e
+ finally:
+ # Clean up SFT trainer to free memory before next training phase
+ log_memory_usage("Before SFT cleanup: ")
+ with contextlib.suppress(NameError):
+ if trainer is not None:
+ # Set trainer.model to None to avoid cleanup destroying our reference
+ trainer.model = None
+ cleanup_trainer(trainer, "SFT trainer")
+ log_memory_usage("After SFT cleanup: ")
+
+ return global_steps, eval_loss, trained_model
+
+
+def train(cfg: DictConfig) -> TrainingResult:
+ """Execute full training pipeline.
+
+ Args:
+ cfg: Configuration object.
+
+ Returns:
+ A TrainingResult dict with 'global_steps' and 'eval_loss'.
+
+ Raises:
+ TrainingError: If any training phase fails.
+ ConfigurationError: If training configuration is invalid.
+ ModelLoadingError: If model setup fails.
+ DataProcessingError: If data preparation fails.
+ """
+ from .exceptions import ConfigurationError, TrainingError
+ from .types import TrainingResult
+
+ try:
+ model, tokenizer = setup_model_and_tokenizer(cfg)
+ train_data, val_data = data_preparation(cfg, tokenizer)
+ logging.info("Data prepared")
+
+ # Initialize training state tracking
+ global_steps = 0
+ eval_loss = 0.0
+ training_completed = False
+
+ # Validate training configuration
+ if not cfg.training.use_grpo and not cfg.training.use_sft and not cfg.training.use_dpo:
+ raise ConfigurationError(
+ "No training method enabled. Please set at least one of: "
+ "training.use_sft, training.use_grpo, or training.use_dpo",
+ )
+
+ # Phase 1: Supervised Fine-Tuning (SFT)
+ if cfg.training.use_sft:
+ try:
+ global_steps, eval_loss, model = run_sft_training(
+ model,
+ tokenizer,
+ cfg,
+ train_data,
+ val_data,
+ )
+ training_completed = True
+
+ # Clean up SFT datasets after completion (GRPO/DPO will prepare their own)
+ if cfg.training.use_grpo or cfg.training.use_dpo:
+ log_memory_usage("Before SFT dataset cleanup: ", cfg=cfg)
+ cleanup_dataset(train_data, "SFT train dataset")
+ cleanup_dataset(val_data, "SFT val dataset")
+ log_memory_usage("After SFT dataset cleanup: ", cfg=cfg)
+
+ # Model is now a PeftModel with trained LoRA adapters
+ if isinstance(model, PeftModel):
+ logging.info(
+ "SFT completed with LoRA adapters. "
+ "Subsequent phases will continue training the same adapters."
+ )
+ else:
+ logging.warning(f"Expected PeftModel after SFT, but got {type(model)}")
+ except Exception as e:
+ raise TrainingError(f"SFT training phase failed: {e}") from e
+
+ # Phase 2: Group Relative Policy Optimization (GRPO)
+ if cfg.training.use_grpo:
+ logging.info("Starting GRPO training phase...")
+
+ try:
+ # If GRPO runs standalone (without SFT), attach LoRA adapters
+ # to quantized model
+ if not cfg.training.use_sft and cfg.model.quant.enabled:
+ logging.info(
+ "GRPO running standalone with quantized model. "
+ "Attaching LoRA adapters for fine-tuning..."
+ )
+ log_memory_usage("Before attaching LoRA for GRPO: ")
+ model = attach_lora_adapters(model, cfg)
+ log_memory_usage("After attaching LoRA for GRPO: ")
+ else:
+ # SFT already attached LoRA adapters, continue training them
+ logging.info(
+ "GRPO running after SFT. Continuing to train existing LoRA adapters."
+ )
+
+ grpo_steps = grpo_train(
+ model=cast(Any, model),
+ tokenizer=tokenizer,
+ cfg=cfg,
+ data_preparing_func=None,
+ )
+
+ # Update global steps from GRPO
+ global_steps = grpo_steps
+ logging.info(f"GRPO completed. Final global steps: {global_steps}")
+ training_completed = True
+
+ # Clean up GRPO datasets after completion if DPO is next
+ if cfg.training.use_dpo:
+ log_memory_usage("Before GRPO dataset cleanup: ", cfg=cfg)
+ comprehensive_memory_cleanup(cfg=cfg)
+ log_memory_usage("After GRPO dataset cleanup: ", cfg=cfg)
+ except Exception as e:
+ raise TrainingError(f"GRPO training phase failed: {e}") from e
+
+ # Phase 3: Direct Preference Optimization (DPO)
+ if cfg.training.use_dpo:
+ logging.info("Starting DPO training phase...")
+
+ try:
+ # If DPO runs standalone (without SFT or GRPO), attach LoRA adapters
+ if (
+ not cfg.training.use_sft
+ and not cfg.training.use_grpo
+ and cfg.model.quant.enabled
+ ):
+ logging.info(
+ "DPO running standalone with quantized model. "
+ "Attaching LoRA adapters for fine-tuning..."
+ )
+ log_memory_usage("Before attaching LoRA for DPO: ")
+ model = attach_lora_adapters(model, cfg)
+ log_memory_usage("After attaching LoRA for DPO: ")
+ else:
+ # Prior training phase(s) already attached
+ # LoRA adapters, continue training them
+ logging.info(
+ "DPO running after prior training phases. "
+ "Continuing to train existing LoRA adapters."
+ )
+
+ # Prepare reference model if specified
+ ref_model = None
+ if getattr(cfg.dpo, "use_ref_model", False):
+ ref_model_name = getattr(cfg.dpo, "ref_model_name", cfg.model.model_name)
+ logging.info(f"Loading reference model: {ref_model_name}")
+ try:
+ torch_dtype = (
+ getattr(torch, cfg.model.torch_dtype)
+ if isinstance(cfg.model.torch_dtype, str)
+ else cfg.model.torch_dtype
+ )
+ if cfg.model.model_type == "gemma":
+ ref_model = Gemma3ForCausalLM.from_pretrained(
+ ref_model_name,
+ device_map="auto",
+ torch_dtype=torch_dtype,
+ )
+ else:
+ ref_model = AutoModelForCausalLM.from_pretrained(
+ ref_model_name,
+ device_map="auto",
+ torch_dtype=torch_dtype,
+ )
+ except Exception as e:
+ raise TrainingError(
+ f"Failed to load reference model {ref_model_name}: {e}",
+ ) from e
+
+ dpo_steps = dpo_train(
+ model=cast(Any, model),
+ tokenizer=tokenizer,
+ cfg=cfg,
+ data_preparing_func=None,
+ ref_model=ref_model,
+ )
+
+ # Update global steps - DPO is the final training phase
+ global_steps = dpo_steps
+ logging.info(f"DPO completed. Final global steps: {global_steps}")
+ training_completed = True
+
+ # Clean up reference model if it was loaded
+ if ref_model is not None:
+ cleanup_model(ref_model, "DPO reference model")
+
+ # Clean up DPO datasets after completion
+ log_memory_usage("Before DPO dataset cleanup: ", cfg=cfg)
+ comprehensive_memory_cleanup(cfg=cfg)
+ log_memory_usage("After DPO dataset cleanup: ", cfg=cfg)
+ except Exception as e:
+ raise TrainingError(f"DPO training phase failed: {e}") from e
+
+ # Validate training completion
+ if not training_completed:
+ raise TrainingError("Training was configured but did not complete successfully")
+
+ logging.info("Model training completed successfully")
+
+ # Merge adapter weights from the final checkpoint
+ try:
+ final_checkpoint_path = Path(cfg.model.new_model) / f"checkpoint-{global_steps}"
+ if final_checkpoint_path.exists():
+ merge_adapter_from_checkpoint(
+ base_model_name=cfg.model.model_name,
+ adapter_dir=str(final_checkpoint_path),
+ save_path=cfg.paths.output_dir,
+ device="cpu",
+ )
+ logging.info(f"Model merged from checkpoint: {final_checkpoint_path}")
+ else:
+ logging.error(f"Final checkpoint not found at {final_checkpoint_path}")
+ merge_adapter_from_checkpoint(
+ base_model_name=cfg.model.model_name,
+ adapter_dir=cfg.model.new_model,
+ save_path=cfg.paths.output_dir,
+ device="cpu",
+ )
+ except Exception as e:
+ raise TrainingError(f"Failed to merge and save final model: {e}") from e
+ finally:
+ # Final comprehensive cleanup after training pipeline
+ logging.info("Model saved")
+ log_memory_usage("Before final training cleanup: ", cfg=cfg)
+
+ # Clean up model
+ if "model" in locals():
+ cleanup_model(model, "final trained model")
+
+ # Clean up datasets (if they still exist from single-phase training)
+ if "train_data" in locals():
+ cleanup_dataset(train_data, "final train dataset")
+ if "val_data" in locals():
+ cleanup_dataset(val_data, "final val dataset")
+
+ # Clean up tokenizer
+ if "tokenizer" in locals():
+ cleanup_tokenizer(tokenizer, "final tokenizer")
+
+ log_memory_usage("After final training cleanup: ", cfg=cfg)
+
+ return TrainingResult(global_steps=global_steps, eval_loss=eval_loss)
+
+ except (TrainingError, ConfigurationError, ModelLoadingError, DataProcessingError):
+ raise
+ except Exception as e:
+ raise TrainingError(f"Unexpected error during training pipeline: {e}") from e
+
+
+def merge_adapter_from_checkpoint(
+ base_model_name: str,
+ adapter_dir: str | Path,
+ save_path: str | Path,
+ device: str = "cpu",
+) -> None:
+ """Merge a LoRA adapter checkpoint into the base model and save merged HF model.
+
+ Args:
+ base_model_name: HF model identifier or local path to base model.
+ adapter_dir: Directory containing the PEFT adapter (e.g. checkpoints).
+ save_path: Directory where merged model will be saved.
+ device: Device to load model on; use 'cpu' to conserve GPU memory.
+
+ Raises:
+ ModelLoadingError: If model or tokenizer loading fails.
+ ConversionError: If adapter merging or model saving fails.
+ """
+ try:
+ # Load base model on CPU to avoid GPU OOM, then attach adapter
+ try:
+ base_model = AutoModelForCausalLM.from_pretrained(
+ base_model_name,
+ device_map={"": device} if device != "auto" else "auto",
+ torch_dtype=torch.float16 if device != "cpu" else torch.float32,
+ )
+ except Exception as e:
+ raise ModelLoadingError(f"Failed to load base model {base_model_name}: {e}") from e
+
+ try:
+ # Try loading tokenizer from checkpoint first (includes custom tokens)
+ try:
+ tokenizer = AutoTokenizer.from_pretrained(adapter_dir)
+ logging.info(f"Loaded tokenizer from checkpoint: {adapter_dir}")
+ except Exception:
+ # Fallback: load from base model and apply same modifications as training
+ logging.info(f"Loading tokenizer from base model: {base_model_name}")
+ tokenizer = AutoTokenizer.from_pretrained(base_model_name)
+ tokenizer.padding_side = "right"
+ # Apply same tokenizer modifications as setup_model_and_tokenizer
+ if tokenizer.pad_token is None or tokenizer.pad_token_id is None:
+ tokenizer.add_special_tokens({"pad_token": "<|pad|>"})
+ tokenizer.pad_token = "<|pad|>"
+ if tokenizer.pad_token_id is None:
+ tokenizer.pad_token_id = tokenizer.convert_tokens_to_ids(
+ tokenizer.pad_token
+ )
+ logging.info("Added pad token to tokenizer")
+
+ # Resize model embeddings to match tokenizer vocabulary
+ base_model.resize_token_embeddings(len(tokenizer))
+ logging.info(f"Resized model embeddings to match tokenizer: {len(tokenizer)}")
+ except Exception as e:
+ raise ModelLoadingError(
+ f"Failed to load tokenizer for {base_model_name}: {e}",
+ ) from e
+
+ try:
+ peft_model = PeftModel.from_pretrained(
+ cast(nn.Module, base_model),
+ adapter_dir,
+ device_map={"": device},
+ )
+ except Exception as e:
+ raise ConversionError(
+ f"Failed to load PEFT adapter from {adapter_dir}: {e}",
+ ) from e
+
+ try:
+ # Merge LoRA weights into base weights and free adapter memory
+ # Cast peft_model to Any before calling merge_and_unload so the
+ # Static analyzer does not confuse the return type with a Tensor.
+ merged_model = cast(nn.Module, peft_model.merge_and_unload())
+ # merged_model is a model instance; save_pretrained is expected on
+ # PreTrainedModel-like objects. Use a suppress block for optional
+ # save behavior if the merged model doesn't implement it.
+ try:
+ merged_model.save_pretrained(save_path) # type: ignore[attr-defined]
+ except AttributeError as e:
+ logger.warning(f"merged_model does not implement save_pretrained: {e}")
+ tokenizer.save_pretrained(save_path)
+ except Exception as e:
+ raise ConversionError(f"Failed to merge and save model to {save_path}: {e}") from e
+
+ except (ModelLoadingError, ConversionError):
+ raise
+ except Exception as e:
+ raise ConversionError(
+ f"Unexpected error during adapter checkpoint merging: {e}",
+ ) from e
def convert_to_gguf(
- model_path: str,
- outfile: str,
- python_exe: str,
+ model_path: str | Path,
+ outfile: str | Path,
+ python_exe: str | Path,
outtype: str,
cfg: DictConfig,
) -> None:
"""Convert Hugging Face model to GGUF format.
Args:
- model_path (str): Path to input model directory
- outfile (str): Output file path
- python_exe (str): Python executable path
- outtype (str): Output type specification
- cfg (DictConfig): Configuration object
+ model_path: Path to input model directory.
+ outfile: Output file path.
+ python_exe: Python executable path.
+ outtype: Output type specification.
+ cfg: Configuration object.
Raises:
- FileNotFoundError: If required paths are missing
+ FileNotFoundError: If required paths are missing.
+ ConversionError: If GGUF conversion fails.
"""
try:
- llama_cpp_dir = os.path.abspath(cfg.paths.llama_cpp_dir)
- conversion_script = os.path.join(llama_cpp_dir, "convert_hf_to_gguf.py")
+ llama_cpp_dir = Path(cfg.paths.llama_cpp_dir).resolve()
+ conversion_script = llama_cpp_dir / "convert_hf_to_gguf.py"
- if not os.path.isdir(llama_cpp_dir):
+ if not llama_cpp_dir.is_dir():
raise FileNotFoundError(f"llama.cpp directory not found: {llama_cpp_dir}")
- if not os.path.exists(conversion_script):
+ if not conversion_script.exists():
raise FileNotFoundError(f"Conversion script missing: {conversion_script}")
- model_path = os.path.normpath(os.path.abspath(model_path))
- outfile = os.path.normpath(os.path.abspath(outfile))
- python_exe = os.path.normpath(cfg.paths.venv_python_path)
+ model_path_str = str(Path(model_path).resolve())
+ outfile_str = str(Path(outfile).resolve())
+ python_exe_str = str(Path(cfg.paths.venv_python_path))
subprocess.run(
[
- python_exe,
- conversion_script,
- model_path,
+ python_exe_str,
+ str(conversion_script),
+ model_path_str,
"--outfile",
- outfile,
+ outfile_str,
"--outtype",
outtype,
],
check=True,
- cwd=llama_cpp_dir,
+ cwd=str(llama_cpp_dir),
)
- except subprocess.CalledProcessError:
- logging.error(
+ except subprocess.CalledProcessError as e:
+ error_msg = (
f"GGUF conversion failed. Check:\n"
f"- llama.cpp exists at {cfg.paths.llama_cpp_dir}\n"
- f"- Conversion script exists: {os.path.join(cfg.paths.llama_cpp_dir, 'convert_hf_to_gguf.py')}\n"
+ f"- Conversion script exists: "
+ f"{Path(cfg.paths.llama_cpp_dir) / 'convert_hf_to_gguf.py'}\n"
f"- Python executable: {python_exe}\n"
f"- Model path: {model_path}"
)
+ logging.exception(error_msg)
+ raise ConversionError(
+ f"GGUF conversion subprocess failed with exit code {e.returncode}",
+ ) from e
+ except FileNotFoundError:
+ raise
+ except Exception as e:
+ raise ConversionError(f"Unexpected error during GGUF conversion: {e}") from e
+ finally:
+ comprehensive_memory_cleanup(aggressive=True, cfg=cfg)
+ log_memory_usage("After GGUF conversion cleanup: ", cfg=cfg)
+
+
+def convert_to_rkllm(
+ model_path: str | Path,
+ output_dir: str | Path,
+ target_platform: str = "rk3588",
+ quantization: str = "w8a8",
+ do_parallelize: bool = False,
+ hybrid_quantization: bool = False,
+ num_npu_core: int = 1,
+ max_context: int = 4096,
+) -> str:
+ """Convert Hugging Face model to RKLLM format using dedicated RKLLM container.
+
+ Args:
+ model_path: Path to input Hugging Face model directory or GGUF file.
+ output_dir: Directory to save RKLLM model.
+ target_platform: Target Rockchip platform (rk3588, rk3576, etc.).
+ quantization: Quantization type (w8a8, w4a16, w4a16_g128).
+ do_parallelize: Enable model parallelization for larger models.
+ hybrid_quantization: Enable hybrid quantization.
+ num_npu_core: Number of NPU cores to use (1-3).
+ max_context: Maximum context length.
+
+ Returns:
+ Path to the generated RKLLM model file.
+
+ Raises:
+ RuntimeError: If RKLLM conversion fails.
+ ImportError: If RKLLM container is not available.
+ """
+ import subprocess
+ from pathlib import Path
+
+ # Validate configuration before proceeding
+ validate_rkllm_config_params(target_platform, quantization, num_npu_core)
+
+ # Create output directory
+ output_path = Path(output_dir)
+ output_path.mkdir(parents=True, exist_ok=True)
+
+ # Generate output filename based on configuration
+ model_name = Path(model_path).name
+ output_filename = f"{model_name}_{target_platform}_{quantization}.rkllm"
+ output_file_path = output_path / output_filename
+
+ # Convert paths to absolute paths for Docker mounting
+ abs_model_path = Path(model_path).resolve()
+ abs_output_dir = output_path.resolve()
+
+ logging.info("Converting model to RKLLM format using dedicated container...")
+ logging.info(f" Source: {abs_model_path}")
+ logging.info(f" Target platform: {target_platform}")
+ logging.info(f" Quantization: {quantization}")
+ logging.info(f" Output: {output_file_path}")
+
+ try:
+ # Check if RKLLM container is available
+ check_cmd = ["docker", "images", "-q", "rkllm_converter"]
+ result = subprocess.run(check_cmd, capture_output=True, text=True, check=False)
+
+ if not result.stdout.strip():
+ # Try to build the RKLLM container if it doesn't exist
+ logging.warning("RKLLM container not found, attempting to build...")
+
+ # Build from the rkllm_files directory context
+ rkllm_files_path = Path("rkllm_files").resolve()
+ build_cmd = [
+ "docker",
+ "build",
+ "-f",
+ str(rkllm_files_path / "Dockerfile.rkllm"),
+ "-t",
+ "rkllm_converter",
+ str(rkllm_files_path),
+ ]
+
+ build_result = subprocess.run(
+ build_cmd,
+ capture_output=True,
+ text=True,
+ check=False,
+ )
+
+ if build_result.returncode != 0:
+ raise ImportError(
+ f"RKLLM container build failed. "
+ f"Please build the RKLLM container first:\n"
+ f"docker build -f rkllm_files/Dockerfile.rkllm -t "
+ f"rkllm_converter rkllm_files/\n\n"
+ f"Build error: {build_result.stderr}",
+ )
+
+ logging.info("RKLLM container built successfully")
+
+ # Auto-detect model format
+ model_format = "auto"
+ if abs_model_path.suffix.lower() == ".gguf":
+ model_format = "gguf"
+ elif abs_model_path.is_dir() and (abs_model_path / "config.json").exists():
+ model_format = "huggingface"
+
+ # Prepare Docker command for RKLLM conversion
+ docker_cmd = [
+ "docker",
+ "run",
+ "--rm",
+ "-v",
+ f"{abs_model_path}:/input",
+ "-v",
+ f"{abs_output_dir}:/output",
+ "rkllm_converter",
+ "convert",
+ "--model-path",
+ "/input",
+ "--output-path",
+ f"/output/{output_filename}",
+ "--target-platform",
+ target_platform,
+ "--quantization",
+ quantization,
+ "--num-npu-core",
+ str(num_npu_core),
+ "--model-format",
+ model_format,
+ "--max-context",
+ str(max_context),
+ ]
+
+ # Add optional parameters
+ if do_parallelize:
+ docker_cmd.append("--do-parallelize")
+ if hybrid_quantization:
+ docker_cmd.append("--hybrid-quantization")
+
+ logging.info(f"Running RKLLM conversion command: {' '.join(docker_cmd)}")
+
+ # Execute the conversion
+ result = subprocess.run(
+ docker_cmd,
+ capture_output=True,
+ text=True,
+ timeout=3600, # 1 hour timeout
+ check=False,
+ )
+
+ # Log the output
+ if result.stdout:
+ logging.info(f"RKLLM conversion output:\n{result.stdout}")
+ if result.stderr:
+ logging.warning(f"RKLLM conversion stderr:\n{result.stderr}")
+
+ if result.returncode != 0:
+ raise RuntimeError(
+ f"RKLLM conversion failed with exit code {result.returncode}.\n"
+ f"Command: {' '.join(docker_cmd)}\n"
+ f"Error output: {result.stderr}\n"
+ f"Standard output: {result.stdout}",
+ )
+
+ # Verify the output file exists
+ if not output_file_path.exists():
+ raise RuntimeError(f"RKLLM model file was not created: {output_file_path}")
+
+ file_size = output_file_path.stat().st_size / (1024 * 1024) # Size in MB
+ logging.info("RKLLM conversion completed successfully")
+ logging.info(f" Output file: {output_file_path}")
+ logging.info(f" File size: {file_size:.2f} MB")
+
+ return str(output_file_path)
+
+ except subprocess.TimeoutExpired:
+ logging.error("RKLLM conversion timed out after 1 hour")
+ raise RuntimeError("RKLLM conversion timed out") from None
+ except Exception as e:
+ logging.exception(f"RKLLM conversion failed: {e}")
+ # Clean up partial files
+ if output_file_path.exists():
+ output_file_path.unlink()
+ raise RuntimeError(f"RKLLM conversion failed: {e}") from e
+
+
+def safe_import_rkllm() -> None:
+ """Safely import RKLLM with detailed diagnostics."""
+ diagnostic_info = []
+ import importlib
+ import os
+ import subprocess
+ import sys
+ import tempfile
+
+ # Attempt dynamic import to avoid static analysis false-positives
+ try:
+ rkllm = importlib.import_module("rkllm")
+ path = getattr(rkllm, "__file__", "")
+ diagnostic_info.append(f"✓ RKLLM package found at: {path}")
+ except Exception as e: # ImportError or other import-time errors
+ diagnostic_info.append(f"✗ RKLLM package import failed: {e}")
+
+ # Check if rknn-toolkit2 is available
+ try:
+ rknn_toolkit2 = importlib.import_module("rknn_toolkit2")
+ diagnostic_info.append(
+ "✓ rknn-toolkit2 available: "
+ + str(getattr(rknn_toolkit2, "__version__", "")),
+ )
+ except Exception:
+ diagnostic_info.append("✗ rknn-toolkit2 not found")
+
+ # Check pip-installed package presence using current interpreter
+ try:
+ result = subprocess.run(
+ [
+ sys.executable,
+ "-m",
+ "pip",
+ "show",
+ "rkllm-toolkit",
+ ],
+ capture_output=True,
+ text=True,
+ )
+ if result.returncode == 0:
+ diagnostic_info.append("✓ rkllm-toolkit package installed")
+ diagnostic_info.append(result.stdout[:500]) # Limit output
+ else:
+ diagnostic_info.append("✗ rkllm-toolkit package not found")
+ except Exception as subprocess_error:
+ diagnostic_info.append(f"✗ Failed to check installation: {subprocess_error}")
+
+ # Check if installation log exists in a portable temp directory
+ log_file = os.path.join(tempfile.gettempdir(), "rkllm_install.log")
+ if os.path.exists(log_file):
+ try:
+ with open(log_file) as f:
+ log_content = f.read()[-1000:] # Last 1000 characters
+ diagnostic_info.append("Recent installation log:")
+ diagnostic_info.append(log_content)
+ except Exception:
+ diagnostic_info.append("✗ Failed to read installation log")
+
+ msg = (
+ "RKLLM toolkit not available.\n"
+ "DIAGNOSTIC INFORMATION:\n"
+ + "\n".join(diagnostic_info)
+ + "\n\nSOLUTIONS:\n"
+ + "1. For Docker: Rebuild container with 'docker-compose build --no-cache'\n"
+ + "2. Check installation logs at "
+ + tempfile.gettempdir()
+ + os.sep
+ + "rkllm_install.log\n"
+ + "3. Verify network connectivity for downloading RKLLM toolkit\n"
+ + "4. For persistent issues, check GitHub "
+ "releases at https://github.com/airockchip/rknn-llm/releases"
+ )
+ raise ImportError(msg) from e
+
+ # Import RKLLM API dynamically
+ try:
+ rkllm_api = importlib.import_module("rkllm.api")
+ rkllm_class = rkllm_api.RKLLM
+ diagnostic_info.append("✓ RKLLM.api import successful")
+ return rkllm_class
+ except Exception as e:
+ diagnostic_info.append(f"✗ RKLLM.api import failed: {e}")
+ raise ImportError(
+ "RKLLM API not available.\n"
+ "DIAGNOSTIC INFORMATION:\n" + "\n".join(diagnostic_info),
+ ) from e
+
+
+def validate_rkllm_config_params(
+ target_platform: str,
+ quantization: str,
+ num_npu_core: int,
+) -> None:
+ """Validate RKLLM configuration parameters."""
+ # Validate platform
+ valid_platforms = ["rk3588", "rk3576", "rk3566", "rk3568"]
+ if target_platform not in valid_platforms:
+ raise ValueError(
+ f"Invalid target_platform: {target_platform}. "
+ f"Valid options: {valid_platforms}",
+ )
+
+ # Validate quantization
+ valid_quantizations = ["w8a8", "w4a16", "w4a16_g128"]
+ if quantization not in valid_quantizations:
+ raise ValueError(
+ f"Invalid quantization: {quantization}. " f"Valid options: {valid_quantizations}",
+ )
+
+ # Validate NPU core count
+ if not (1 <= num_npu_core <= 3):
+ raise ValueError(f"Invalid num_npu_core: {num_npu_core}. " "Must be between 1 and 3")
+
+ logging.info("✓ RKLLM configuration parameters validated successfully")
+
+
+def rkllm_quantize(
+ model_path: str | Path,
+ output_path: str | Path,
+ quantization: str = "w8a8",
+ target_platform: str = "rk3588",
+ **kwargs: dict,
+) -> bool:
+ """Quantize model for RKLLM format (integrated within convert_to_rkllm).
+
+ This function is a wrapper that calls convert_to_rkllm with quantization.
+ The actual quantization is performed during the RKLLM conversion process.
+
+ Args:
+ model_path: Path to input model.
+ output_path: Path for quantized output.
+ quantization: Quantization type (w8a8, w4a16, w4a16_g128).
+ target_platform: Target Rockchip platform.
+ **kwargs: Additional parameters for convert_to_rkllm.
+
+ Returns:
+ True if quantization succeeded, False otherwise.
+
+ Raises:
+ ConversionError: If RKLLM quantization fails.
+ """
+ try:
+ output_dir = Path(output_path).parent
+ result_path = convert_to_rkllm(
+ model_path=model_path,
+ output_dir=str(output_dir),
+ target_platform=target_platform,
+ quantization=quantization,
+ **kwargs,
+ )
+
+ # If output filename is different, rename the file
+ result_path_obj = Path(result_path)
+ output_path_obj = Path(output_path)
+ if result_path_obj != output_path_obj and result_path_obj.exists():
+ shutil.move(str(result_path_obj), str(output_path_obj))
+ logging.info(f"RKLLM model moved to: {output_path}")
+
+ return True
+
+ except Exception as e:
+ logging.exception(f"RKLLM quantization failed: {e}")
+ raise ConversionError(f"RKLLM quantization failed: {e}") from e
def quantize_model(
- model_path: str,
- outfile: str,
+ model_path: str | Path,
+ outfile: str | Path,
qtype: str = "q4_0",
- llama_cpp_path: str = ".",
- quantized_path: str = "llama-quantize.exe",
+ llama_cpp_path: str | Path = ".",
+ quantized_path: str | Path = "llama-quantize.exe",
) -> bool:
"""Quantize GGUF model using llama.cpp quantizer.
Args:
- model_path (str): Path to input GGUF model
- outfile (str): Path for quantized output
- qtype (str): Quantization type (default: q4_0)
- llama_cpp_path (str): Path to llama.cpp directory
- quantized_path (str): Name of quantizer executable
+ model_path: Path to input GGUF model.
+ outfile: Path for quantized output.
+ qtype: Quantization type (default: q4_0).
+ llama_cpp_path: Path to llama.cpp directory.
+ quantized_path: Name of quantizer executable.
Returns:
- bool: True if quantization succeeded, False otherwise
- """
- llama_cpp_dir = os.path.abspath(llama_cpp_path)
- llama_quantize_path = os.path.join(llama_cpp_dir, quantized_path)
- model_path = os.path.abspath(model_path)
- outfile = os.path.abspath(outfile)
- if not os.path.exists(llama_quantize_path):
- logging.error(f"Error: llama-quantize.exe not found at {llama_quantize_path}")
- return False
+ True if quantization succeeded, False otherwise.
- logging.info("Trying to quantize model...")
- command = [llama_quantize_path, model_path, outfile, qtype]
- logging.info(f"Running command: {command}")
+ Raises:
+ ConversionError: If quantization process fails.
+ """
try:
- process = subprocess.run(
- command, check=True, capture_output=True, cwd=llama_cpp_dir
- )
- logging.info("Model quantized")
- except subprocess.CalledProcessError as e:
- logging.error(f"Command failed with exit code {e.returncode}")
+ llama_cpp_dir = Path(llama_cpp_path).resolve()
+ llama_quantize_path = llama_cpp_dir / quantized_path
+ model_path_abs = Path(model_path).resolve()
+ outfile_abs = Path(outfile).resolve()
+
+ if not llama_quantize_path.exists():
+ error_msg = f"Error: llama-quantize.exe not found at {llama_quantize_path}"
+ logging.error(error_msg)
+ return False
+
+ logging.info("Trying to quantize model...")
+ command = [str(llama_quantize_path), str(model_path_abs), str(outfile_abs), qtype]
+ logging.info(f"Running command: {command}")
+
+ try:
+ process = subprocess.run(
+ command,
+ check=True,
+ capture_output=True,
+ cwd=str(llama_cpp_dir),
+ )
+ logging.info("Model quantized")
+ logging.info(f"Command output: {process.stdout.decode()}")
+ logging.info(
+ f"Command stderr: {process.stderr.decode() if process.stderr else 'None'}",
+ )
+ return True
+ except subprocess.CalledProcessError as e:
+ logging.exception(f"Command failed with exit code {e.returncode}")
+ return False
+ except Exception as e:
+ logging.exception(f"Quantization process failed: {e}")
return False
- logging.info(f"Command output: {process.stdout.decode()}")
- logging.info(
- f"Command stderr: {process.stderr.decode() if process.stderr else 'No stderr output.'}"
- )
- return True
-
def copy_data(
file: str,
@@ -436,92 +1742,272 @@ def copy_data(
"""Move file to destination directory with versioning.
Args:
- file (str): Source file name
- gguf_directory (str): Version subdirectory
- destination (str): Root destination directory
+ file: Source file name.
+ gguf_directory: Version subdirectory.
+ destination: Root destination directory.
+
+ Raises:
+ ConversionError: If file copy operation fails.
"""
- destination_path = os.path.join(destination, gguf_directory, file)
- os.makedirs(os.path.dirname(destination_path), exist_ok=True)
- shutil.move(os.path.join(os.getcwd(), file), destination_path)
+ try:
+ destination_path = Path(destination) / gguf_directory / file
+ destination_path.parent.mkdir(parents=True, exist_ok=True)
+ source_path = Path.cwd() / file
+
+ if not source_path.exists():
+ raise ConversionError(f"Source file not found: {source_path}")
+ shutil.move(str(source_path), str(destination_path))
+ logging.info(f"File moved from {source_path} to {destination_path}")
+ except Exception as e:
+ raise ConversionError(f"Failed to copy file {file} to destination: {e}") from e
-def train_pipeline(cfg: DictConfig) -> None:
+
+def train_pipeline(cfg: DictConfig) -> dict[str, Any]:
"""Execute complete training pipeline including conversion and quantization.
Args:
- cfg (DictConfig): Configuration object
+ cfg: Configuration object.
+
+ Returns:
+ A dict with 'eval_loss'.
Raises:
- RuntimeError: If quantization step fails
+ TrainingError: If training pipeline fails.
+ ConversionError: If model conversion or quantization fails.
+ ExperimentTrackingError: If experiment logging fails.
"""
try:
- steps = train(cfg)
-
- with TemporaryDirectory() as merged_model_dir:
- model_merge_for_converting(cfg, steps, merged_model_dir)
+ # Initialize optional experiment logging backend (wandb / mlflow / none)
+ init_logging_backend(cfg)
- outfile = cfg.model.outfile
+ # Validate MLflow connection if MLflow backend is selected
+ if not validate_mlflow_connection(cfg):
+ logging.warning(
+ "MLflow connection validation failed, but continuing with training",
+ )
- convert_to_gguf(
- model_path=merged_model_dir,
- outfile=os.path.join(merged_model_dir, outfile),
- python_exe=cfg.paths.venv_python_path,
- outtype="f16",
- cfg=cfg,
+ # Log training configuration to MLflow if enabled
+ try:
+ log_training_config(cfg)
+ except Exception as e:
+ raise ExperimentTrackingError(f"Failed to log training configuration: {e}") from e
+
+ try:
+ result = train(cfg)
+ merge_adapter_from_checkpoint(
+ base_model_name=cfg.model.model_name,
+ adapter_dir=str(
+ Path(cfg.model.new_model) / f"checkpoint-{result['global_steps']}",
+ ), # where trainer saved checkpoint-
+ save_path=cfg.paths.output_dir,
+ device="cpu", # merge on CPU to avoid OOM
)
- logging.info(f"Converted to GGUF: {outfile}")
-
- quantized_file = outfile
- if quantize_model(
- model_path=os.path.join(merged_model_dir, outfile),
- outfile=quantized_file,
- qtype=cfg.model.qtype,
- llama_cpp_path=os.path.abspath(cfg.paths.llama_cpp_dir),
- quantized_path=cfg.paths.quantized_path,
- ):
- copy_data(
- quantized_file,
- cfg.model.gguf_directory,
- cfg.paths.final_weights_path,
- )
- if os.path.exists(quantized_file):
- os.remove(quantized_file)
- logging.info(f"Removed intermediate file: {quantized_file}")
- else:
- raise RuntimeError("Quantization failed")
+ steps = result["global_steps"]
+ eval_loss = result["eval_loss"]
+ except Exception as e:
+ raise TrainingError(f"Training phase failed: {e}") from e
+
+ try:
+ with TemporaryDirectory() as merged_model_dir:
+ model_merge_for_converting(cfg, steps, merged_model_dir)
+
+ # GGUF conversion (optional based on config)
+ if cfg.model.quant.get(
+ "convert_to_gguf",
+ True,
+ ): # Default to True for backward compatibility
+ outfile = cfg.model.outfile
+
+ try:
+ convert_to_gguf(
+ model_path=merged_model_dir,
+ outfile=str(Path(merged_model_dir) / outfile),
+ python_exe=cfg.paths.venv_python_path,
+ outtype="f16",
+ cfg=cfg,
+ )
+ logging.info(f"Converted to GGUF: {outfile}")
+ except Exception as e:
+ raise ConversionError(f"GGUF conversion failed: {e}") from e
+
+ quantized_file = outfile
+ if not quantize_model(
+ model_path=str(Path(merged_model_dir) / outfile),
+ outfile=quantized_file,
+ qtype=cfg.model.quant.qtype,
+ llama_cpp_path=str(Path(cfg.paths.llama_cpp_dir).resolve()),
+ quantized_path=cfg.paths.quantized_path,
+ ):
+ raise ConversionError("Model quantization failed")
+
+ try:
+ copy_data(
+ quantized_file,
+ cfg.model.quant.gguf_dir,
+ cfg.paths.final_weights_path,
+ )
+ quantized_file_path = Path(quantized_file)
+ if quantized_file_path.exists():
+ quantized_file_path.unlink()
+ logging.info(f"Removed intermediate file: {quantized_file}")
+ except Exception as e:
+ raise ConversionError(f"Failed to copy quantized model: {e}") from e
+ else:
+ # Alternative flow: copy merged HuggingFace model directly to output
+ try:
+ logging.info("GGUF conversion disabled, copying merged model directly")
+ merged_output_dir = Path(cfg.paths.output_dir) / "merged_model"
+ if merged_output_dir.exists():
+ shutil.rmtree(merged_output_dir)
+ shutil.copytree(merged_model_dir, merged_output_dir)
+ logging.info(f"Merged model copied to: {merged_output_dir}")
+ except Exception as e:
+ raise ConversionError(f"Failed to copy merged model: {e}") from e
+
+ # RKLLM conversion (if enabled)
+ if getattr(cfg.model, "rkllm", {}).get("enabled", False):
+ logging.info("Starting RKLLM conversion...")
+ try:
+ rkllm_config = cfg.model.rkllm
+ rkllm_output_dir = Path(cfg.paths.output_dir) / rkllm_config.output_dir
+
+ rkllm_model_path = convert_to_rkllm(
+ model_path=cfg.paths.output_dir, # Use the merged model directory
+ output_dir=str(rkllm_output_dir),
+ target_platform=rkllm_config.target_platform,
+ quantization=rkllm_config.quantization,
+ do_parallelize=rkllm_config.get("do_parallelize", False),
+ hybrid_quantization=rkllm_config.get("hybrid_quantization", False),
+ num_npu_core=rkllm_config.get("num_npu_core", 1),
+ )
+
+ logging.info(f"RKLLM conversion completed: {rkllm_model_path}")
+
+ except Exception as e:
+ logging.exception(f"RKLLM conversion failed: {e}")
+ # Don't raise error - RKLLM conversion is optional
+ logging.info("Continuing without RKLLM conversion...")
+ else:
+ logging.info("RKLLM conversion disabled in configuration")
+ except ConversionError:
+ raise
+ except Exception as e:
+ raise ConversionError(f"Model processing pipeline failed: {e}") from e
+
+ # Log training artifacts to MLflow if enabled
+ if cfg.logging.logging_backend == "mlflow":
+ try:
+ if cfg.logging.mlflow.log_artifacts:
+ logging.info("Logging training artifacts...")
+ log_training_artifacts(cfg, cfg.paths.output_dir, steps)
+ # Log evaluation metrics to MLflow if enabled
+ log_evaluation_metrics({"eval_loss": eval_loss, "global_steps": steps})
+ except Exception as e:
+ raise ExperimentTrackingError(
+ f"Failed to log training artifacts or metrics: {e}",
+ ) from e
logging.info("Training pipeline completed")
+ return {"eval_loss": eval_loss}
+ except (TrainingError, ConversionError, ExperimentTrackingError):
+ raise
+ except Exception as e:
+ raise TrainingError(f"Unexpected error in training pipeline: {e}") from e
finally:
- wandb.finish()
- logging.info("Wandb finished")
- gc.collect()
- torch.cuda.empty_cache()
+ # Finish/cleanup configured logging backend (if any) and comprehensive memory cleanup
+ try:
+ finish_logging_backend()
+ except Exception as e:
+ logging.warning(f"Failed to cleanup logging backend: {e}")
+
+ # Final pipeline cleanup
+ log_memory_usage("Before pipeline completion cleanup: ")
+ from .memory_utils import comprehensive_memory_cleanup
+
+ comprehensive_memory_cleanup(aggressive=True)
+ log_memory_usage("After pipeline completion cleanup: ")
-def main_train(data_dir: str, cfg: DictConfig) -> None:
+def main_train(data_dir: str, cfg: DictConfig) -> dict[str, Any]:
"""Main training entry point with dataset processing.
Args:
- data_dir (str): Directory containing training data
- cfg (DictConfig): Configuration object
+ data_dir: Directory containing training data.
+ cfg: Configuration object.
+
+ Returns:
+ Result dictionary from training pipeline.
+
+ Raises:
+ TrainingError: If training pipeline fails.
+ DataProcessingError: If dataset processing fails.
"""
- train_pipeline(cfg)
- with open(os.path.join(data_dir, "test_ru.json"), "r", encoding="utf-8") as file:
- test_dataset = json.load(file)
- dataset_to_json(test_dataset, cfg.testing.output_test_file)
+ try:
+ result = train_pipeline(cfg)
+ comprehensive_memory_cleanup(aggressive=cfg.memory_management.aggressive_cleanup)
+ log_memory_usage("Final script cleanup: ", cfg=cfg)
+
+ try:
+ test_file_path = Path(data_dir) / "test_ru.json"
+ if not test_file_path.exists():
+ raise DataProcessingError(f"Test dataset file not found: {test_file_path}")
+
+ with test_file_path.open(encoding="utf-8") as file:
+ test_dataset = json.load(file)
+
+ dataset_to_json(
+ test_dataset,
+ cfg.testing.output_test_file,
+ cfg.data_preparation.method,
+ )
+ except json.JSONDecodeError as e:
+ raise DataProcessingError(f"Invalid JSON format in test dataset: {e}") from e
+ except Exception as e:
+ raise DataProcessingError(f"Failed to process test dataset: {e}") from e
+
+ return result
+
+ except (TrainingError, DataProcessingError):
+ raise
+ except Exception as e:
+ raise TrainingError(f"Unexpected error in main training function: {e}") from e
def post_new_dataset() -> None:
- """Upload new dataset version to remote server."""
- url = "https://dataset.ser13volk.me/dataset_ru"
- with open(os.path.join("../data", "dataset_ru.json"), "rb") as f:
- files = {"file": f}
- response = requests.post(url, files=files, auth=HTTPBasicAuth("admin", ""))
- logging.info(response.json())
+ """Upload new dataset version to remote server.
+
+ Raises:
+ DataProcessingError: If dataset upload fails.
+ """
+ _load_environment_if_needed()
+ password = os.getenv("PASSWORD_BOT")
+ try:
+ url = "https://dataset.ser13volk.me/dataset_ru"
+ dataset_path = Path("../data") / "dataset_ru.json"
+
+ if not dataset_path.exists():
+ raise DataProcessingError(f"Dataset file not found: {dataset_path}")
+
+ with dataset_path.open("rb") as f:
+ files = {"file": f}
+ response = requests.post(
+ url,
+ files=files,
+ auth=HTTPBasicAuth("admin", password),
+ timeout=30,
+ )
+
+ response.raise_for_status() # Raises HTTPError for bad HTTP status codes
+ logging.info(response.json())
+
+ except requests.RequestException as e:
+ raise DataProcessingError(f"Failed to upload dataset to remote server: {e}") from e
+ except Exception as e:
+ raise DataProcessingError(f"Unexpected error during dataset upload: {e}") from e
if __name__ == "__main__":
configure_logging(logging.DEBUG)
- main_train()
- # post_new_dataset()
+ post_new_dataset()
diff --git a/training_model/optimizer_factory.py b/training_model/optimizer_factory.py
new file mode 100644
index 0000000..da87e7b
--- /dev/null
+++ b/training_model/optimizer_factory.py
@@ -0,0 +1,197 @@
+"""Optimizer factory for creating custom optimizers including Adam-mini.
+
+This module provides factory functions to create optimizers based on configuration,
+following the exact implementation patterns from official repositories.
+"""
+
+import logging
+from typing import TYPE_CHECKING, Any
+
+from omegaconf import DictConfig
+from torch.nn import Module
+from torch.optim import Optimizer
+
+if TYPE_CHECKING:
+ from adam_mini import Adam_mini
+
+try:
+ from adam_mini import Adam_mini
+
+ ADAM_MINI_AVAILABLE = True
+except ImportError:
+ ADAM_MINI_AVAILABLE = False
+ Adam_mini = None
+ logging.warning(
+ "adam-mini package not available. Adam-mini" " optimizer will not be supported.",
+ )
+
+
+def create_adam_mini_optimizer(model: Module, cfg: DictConfig) -> "Adam_mini":
+ """Create Adam-mini optimizer following GitHub implementation.
+
+ Implementation based on: https://github.com/zyushun/Adam-mini
+
+ Args:
+ model: The model to optimize
+ cfg: Configuration object containing Adam-mini parameters
+
+ Returns:
+ Adam_mini optimizer instance
+
+ Raises:
+ ImportError: If adam-mini package is not available
+ ValueError: If required model configuration is missing
+ """
+ if not ADAM_MINI_AVAILABLE:
+ raise ImportError(
+ "adam-mini package is not available. Install it with: pip install adam-mini",
+ )
+
+ # Get model configuration for auto-detection of transformer parameters
+ model_config = getattr(model, "config", None)
+ if model_config is None:
+ raise ValueError("Model must have a 'config' attribute for Adam-mini optimization")
+
+ # Auto-detect or use configured transformer parameters
+ dim = cfg.training.adam_mini.dim
+ if dim is None:
+ dim = getattr(model_config, "hidden_size", None)
+ if dim is None:
+ raise ValueError(
+ "Could not auto-detect model dimension. "
+ "Please set training.adam_mini.dim explicitly",
+ )
+ logging.info(f"Auto-detected model dimension: {dim}")
+
+ n_heads = cfg.training.adam_mini.n_heads
+ if n_heads is None:
+ n_heads = getattr(model_config, "num_attention_heads", None)
+ if n_heads is None:
+ raise ValueError(
+ "Could not auto-detect number of attention heads. "
+ "Please set training.adam_mini.n_heads explicitly",
+ )
+ logging.info(f"Auto-detected number of attention heads: {n_heads}")
+
+ n_kv_heads = cfg.training.adam_mini.n_kv_heads
+ if n_kv_heads is None:
+ # Try to auto-detect, but this is optional
+ n_kv_heads = getattr(model_config, "num_key_value_heads", None)
+ if n_kv_heads is not None:
+ logging.info(f"Auto-detected number of key-value heads: {n_kv_heads}")
+ else:
+ logging.info("No key-value heads specified, using default (same as n_heads)")
+
+ # Create optimizer with GitHub-specified API
+ optimizer = Adam_mini(
+ named_parameters=model.named_parameters(),
+ lr=cfg.training.adam_mini.learning_rate,
+ betas=(cfg.training.adam_mini.beta1, cfg.training.adam_mini.beta2),
+ eps=cfg.training.adam_mini.eps,
+ weight_decay=cfg.training.adam_mini.weight_decay,
+ dim=dim,
+ n_heads=n_heads,
+ n_kv_heads=n_kv_heads,
+ )
+ optimizer.wqk_names.add("q_proj")
+ optimizer.wqk_names.add("k_proj")
+ optimizer.wqk_names.add("self_attn.q_proj") # If full path is needed
+ optimizer.wqk_names.add("self_attn.k_proj")
+
+ # For Value (wv_names)
+ optimizer.wv_names.add("v_proj")
+ optimizer.wv_names.add("self_attn.v_proj")
+
+ # For attention output projection (attn_proj_names)
+ optimizer.attn_proj_names.add("o_proj")
+ optimizer.attn_proj_names.add("self_attn.o_proj")
+
+ # For MLP (mlp_names)
+ optimizer.mlp_names.add("up_proj")
+ optimizer.mlp_names.add("down_proj")
+ optimizer.mlp_names.add("gate_proj")
+ optimizer.mlp_names.add("mlp.up_proj") # If prefixed
+ optimizer.mlp_names.add("mlp.down_proj")
+ optimizer.mlp_names.add("mlp.gate_proj")
+
+ # If LoRA is applied, add LoRA-specific substrings if they appear in names
+ optimizer.wqk_names.add("q_proj.lora") # Example for LoRA adapters
+ optimizer.wqk_names.add("k_proj.lora")
+ optimizer.wv_names.add("v_proj.lora")
+ optimizer.attn_proj_names.add("o_proj.lora")
+ optimizer.mlp_names.add("up_proj.lora")
+ optimizer.mlp_names.add("down_proj.lora")
+ optimizer.mlp_names.add("gate_proj.lora")
+ optimizer.wqk_names.add("attn_q")
+ optimizer.wqk_names.add("attn_k")
+
+ # For Value (wv_names) - matches "attn_v"
+ optimizer.wv_names.add("attn_v")
+
+ # For attention output projection (attn_proj_names) - matches "attn_output"
+ optimizer.attn_proj_names.add("attn_output")
+
+ # For MLP (mlp_names) - matches "ffn_up", "ffn_down", "ffn_gate"
+ optimizer.mlp_names.add("ffn_up")
+ optimizer.mlp_names.add("ffn_down")
+ optimizer.mlp_names.add("ffn_gate")
+
+ # Apply single lr for values optimization for small training runs
+ if cfg.training.adam_mini.use_single_lr_for_values:
+ optimizer.wv_names.clear()
+ logging.info("Applied single lr for values optimization for small training runs")
+ logging.info(
+ f"Created Adam-mini optimizer with: lr={cfg.training.adam_mini.learning_rate}, "
+ f"weight_decay={cfg.training.adam_mini.weight_decay}, "
+ f"betas=({cfg.training.adam_mini.beta1}, {cfg.training.adam_mini.beta2}), "
+ f"eps={cfg.training.adam_mini.eps}, dim={dim}, n_heads={n_heads},"
+ f" n_kv_heads={n_kv_heads}",
+ )
+
+ return optimizer
+
+
+def create_optimizer(model: Module, cfg: DictConfig) -> Optimizer | None:
+ """Create optimizer based on configuration.
+
+ Args:
+ model: The model to optimize
+ cfg: Configuration object
+
+ Returns:
+ Optimizer instance if custom optimizer is enabled, None for default behavior
+
+ Raises:
+ ImportError: If required optimizer package is not available
+ ValueError: If optimizer configuration is invalid
+ """
+ # Check if Adam-mini is enabled
+ if hasattr(cfg.training, "adam_mini") and cfg.training.adam_mini.enabled:
+ return create_adam_mini_optimizer(model, cfg)
+
+ # Return None to use default optimizer behavior
+ return None
+
+
+def get_optimizer_config_updates(cfg: DictConfig) -> dict[str, Any]:
+ """Get configuration updates needed for custom optimizers.
+
+ When using custom optimizers, some training configuration parameters
+ may need to be adjusted to work properly with the training framework.
+
+ Args:
+ cfg: Configuration object
+
+ Returns:
+ Dictionary of configuration updates to apply
+ """
+ config_updates = {}
+
+ # When using custom optimizers, we need to use a standard optimizer name
+ # that the training framework recognizes, but we'll override it with our custom optimizer
+ if hasattr(cfg.training, "adam_mini") and cfg.training.adam_mini.enabled:
+ # Use adamw_torch as fallback since it's widely supported
+ config_updates["optim"] = "adamw_torch"
+ logging.info("Using adamw_torch as fallback optimizer name for Adam-mini integration")
+
+ return config_updates
diff --git a/training_model/optuna.py b/training_model/optuna.py
new file mode 100644
index 0000000..b7d4fbd
--- /dev/null
+++ b/training_model/optuna.py
@@ -0,0 +1,190 @@
+"""
+Hyperparameter optimization script using Optuna and Hydra for your LLM training pipeline.
+
+Place this file (e.g., `hpo_optuna.py`) at your project root.
+ Adjust `TRAIN_MODULE` to the path of your training
+ module (e.g., 'train' if your main file is `train.py`).
+"""
+
+import importlib
+import logging
+
+import optuna
+from hydra import compose, initialize
+from hydra.core.global_hydra import GlobalHydra
+from omegaconf import DictConfig, OmegaConf
+
+logger = logging.getLogger(__name__)
+
+
+def objective(trial: optuna.Trial, data_dir: str, cfg: DictConfig) -> float:
+ """Run a single Optuna objective.
+
+ Args:
+ trial: Optuna trial object used to suggest hyperparameters.
+ data_dir: Path to the training data directory.
+ cfg: Initial configuration dictionary.
+
+ Returns:
+ float: Validation loss to minimize.
+
+ Raises:
+ ValueError: If 'eval_loss' is not present in the training metrics.
+ """
+ try:
+ logger.info(f"[OPTUNA] Starting trial #{trial.number}")
+
+ # Clear any existing Hydra instance
+ if GlobalHydra().is_initialized():
+ GlobalHydra.instance().clear()
+
+ overrides = []
+ suggested_params = {}
+
+ if cfg.optuna.learning_rate.enabled:
+ lr = trial.suggest_float(
+ "training.learning_rate",
+ cfg.optuna.learning_rate.min,
+ cfg.optuna.learning_rate.max,
+ log=cfg.optuna.learning_rate.log_scale,
+ )
+ overrides.append(f"training.learning_rate={lr}")
+ suggested_params["learning_rate"] = lr
+
+ if cfg.optuna.num_train_epochs.enabled:
+ epochs = trial.suggest_float(
+ "training.num_train_epochs",
+ cfg.optuna.num_train_epochs.min,
+ cfg.optuna.num_train_epochs.max,
+ )
+ overrides.append(f"training.num_train_epochs={epochs}")
+ suggested_params["num_train_epochs"] = epochs
+
+ if cfg.optuna.weight_decay.enabled:
+ weight_decay = trial.suggest_float(
+ "training.weight_decay",
+ cfg.optuna.weight_decay.min,
+ cfg.optuna.weight_decay.max,
+ )
+ overrides.append(f"training.weight_decay={weight_decay}")
+ suggested_params["weight_decay"] = weight_decay
+
+ if cfg.optuna.warmup_steps.enabled:
+ warmup_steps = trial.suggest_int(
+ "training.warmup_steps",
+ cfg.optuna.warmup_steps.min,
+ cfg.optuna.warmup_steps.max,
+ )
+ overrides.append(f"training.warmup_steps={warmup_steps}")
+ suggested_params["warmup_steps"] = warmup_steps
+
+ overrides.append("model.quant.convert_to_gguf=false")
+
+ logger.info(f"[OPTUNA] Trial #{trial.number} suggested parameters: {suggested_params}")
+
+ with initialize(
+ version_base="1.1",
+ config_path="../conf",
+ job_name=f"optuna_hpo_trial_{trial.number}",
+ ):
+ cfg: DictConfig = compose(config_name="config", overrides=overrides)
+
+ train_module = "training_model.one_file_train"
+ module = importlib.import_module(train_module)
+ metrics: dict = module.main_train(data_dir, cfg)
+
+ loss = metrics.get("eval_loss")
+ if loss is None:
+ raise ValueError("train(cfg) did not return 'eval_loss' in metrics")
+
+ logger.info(f"[OPTUNA] Trial #{trial.number} completed with eval_loss: {loss}")
+ return float(loss)
+ except Exception as e:
+ logger.exception(
+ "[OPTUNA] Trial #%s encountered an error: %s",
+ trial.number,
+ e,
+ )
+ raise optuna.TrialPruned from e
+
+
+def optuna_optimize(data_dir: str, cfg: DictConfig) -> None:
+ """Run Optuna hyperparameter optimization.
+
+ Args:
+ data_dir: Path to the training data directory.
+ cfg: Initial configuration dictionary.
+ """
+ logger.info("[OPTUNA] ========================================")
+ logger.info("[OPTUNA] Starting Optuna Hyperparameter Optimization Study")
+ logger.info("[OPTUNA] ========================================")
+
+ logger.info(f"[OPTUNA] Total trials: {cfg.optuna.n_trials}")
+ logger.info("[OPTUNA] Search space configuration:")
+
+ if cfg.optuna.learning_rate.enabled:
+ logger.info(
+ f"[OPTUNA] - learning_rate: "
+ f"[{cfg.optuna.learning_rate.min}, {cfg.optuna.learning_rate.max}] "
+ f"(log_scale: {cfg.optuna.learning_rate.log_scale})"
+ )
+ else:
+ logger.info("[OPTUNA] - learning_rate: DISABLED")
+
+ if cfg.optuna.num_train_epochs.enabled:
+ logger.info(
+ f"[OPTUNA] - num_train_epochs:"
+ f" [{cfg.optuna.num_train_epochs.min}, {cfg.optuna.num_train_epochs.max}]"
+ )
+ else:
+ logger.info("[OPTUNA] - num_train_epochs: DISABLED")
+
+ if cfg.optuna.weight_decay.enabled:
+ logger.info(
+ f"[OPTUNA] - weight_decay: "
+ f"[{cfg.optuna.weight_decay.min}, {cfg.optuna.weight_decay.max}]"
+ )
+ else:
+ logger.info("[OPTUNA] - weight_decay: DISABLED")
+
+ if cfg.optuna.warmup_steps.enabled:
+ logger.info(
+ f"[OPTUNA] - warmup_steps: "
+ f"[{cfg.optuna.warmup_steps.min}, {cfg.optuna.warmup_steps.max}]"
+ )
+ else:
+ logger.info("[OPTUNA] - warmup_steps: DISABLED")
+
+ study = optuna.create_study(
+ direction="minimize",
+ sampler=optuna.samplers.TPESampler(),
+ pruner=optuna.pruners.HyperbandPruner(min_resource=1, reduction_factor=3),
+ )
+
+ logger.info("[OPTUNA] Study created with TPESampler and HyperbandPruner")
+ logger.info("[OPTUNA] ========================================")
+
+ def run_trial(trial: optuna.Trial) -> float:
+ """Wrapper to pass data_dir and cfg into the objective."""
+ return objective(trial, data_dir, cfg)
+
+ study.optimize(run_trial, n_trials=cfg.optuna.n_trials)
+
+ logger.info("[OPTUNA] ========================================")
+ logger.info("[OPTUNA] Optimization study completed!")
+ logger.info("[OPTUNA] ========================================")
+ logger.info(f"[OPTUNA] Best trial number: {study.best_trial.number}")
+ logger.info(f"[OPTUNA] Best loss: {study.best_value}")
+ logger.info("[OPTUNA] Best parameters:")
+ for key, val in study.best_params.items():
+ logger.info(f"[OPTUNA] - {key}: {val}")
+
+ logger.info("[OPTUNA] Saving best configuration...")
+
+ with initialize(version_base="1.1", config_path="../conf", job_name="optuna_final"):
+ best_overrides = [f"{k}={v}" for k, v in study.best_params.items()]
+ best_cfg: DictConfig = compose(config_name="config", overrides=best_overrides)
+ OmegaConf.save(best_cfg, "best_config.yaml")
+
+ logger.info("[OPTUNA] Saved best configuration to best_config.yaml")
+ logger.info("[OPTUNA] ========================================")
diff --git a/training_model/private_api.py b/training_model/private_api.py
deleted file mode 100644
index 190e63b..0000000
--- a/training_model/private_api.py
+++ /dev/null
@@ -1,4 +0,0 @@
-PRIVATE_API = ""
-WANB_API = ""
-HUGGING_FACE_API = ""
-MISTRAL_API = ''
\ No newline at end of file
diff --git a/training_model/types.py b/training_model/types.py
new file mode 100644
index 0000000..f5b18a1
--- /dev/null
+++ b/training_model/types.py
@@ -0,0 +1,167 @@
+"""Type definitions and protocols for the LLM-LoRa training framework.
+
+This module provides common type aliases, protocols, and type definitions
+used throughout the codebase to improve type safety and IDE support.
+"""
+
+from __future__ import annotations
+
+from collections.abc import Callable
+from contextlib import AbstractContextManager
+from pathlib import Path
+from typing import Any, Protocol, TypedDict, Union
+
+from datasets import Dataset
+from omegaconf import DictConfig
+from torch import Tensor
+from transformers import (
+ AutoModelForCausalLM,
+ AutoTokenizer,
+ PreTrainedModel,
+ PreTrainedTokenizer,
+)
+
+# Model and tokenizer type aliases
+ModelType = Union[AutoModelForCausalLM, PreTrainedModel, Any]
+TokenizerType = Union[AutoTokenizer, PreTrainedTokenizer]
+
+# Configuration and data types
+ConfigDict = dict[str, Any]
+
+
+class TrainingResult(TypedDict):
+ global_steps: int
+ eval_loss: float
+
+
+# Data processing types
+DataPoint = dict[str, str]
+TokenizedData = dict[str, Tensor | list[int]]
+DatasetTuple = tuple[Dataset, Dataset]
+
+# File and path types
+PathLike = Union[str, Path]
+ModelPath = Union[str, Path]
+OutputPath = Union[str, Path]
+
+
+# Training configuration types
+class LoRaParams(TypedDict):
+ r: int
+ alpha: int
+ dropout: float
+
+
+class QuantizationConfig(TypedDict):
+ enabled: bool
+ qtype: str
+ use_8bit: bool
+
+
+# Conversion and processing results
+class ConversionResult(TypedDict):
+ success: bool
+ output_path: str | None
+ error_message: str | None
+
+
+class ProcessingArtifacts(TypedDict):
+ model_path: str
+ checkpoint_path: str
+ merged_path: str | None
+
+
+# Function type definitions
+TokenizeFunction = Callable[[str], TokenizedData]
+PromptGenerator = Callable[[DataPoint], str]
+DataPreparationFunction = Callable[[DictConfig, TokenizerType], DatasetTuple]
+
+
+# Training strategy protocol
+class TrainingStrategy(Protocol):
+ """Protocol for different training strategies (SFT, GRPO, DPO)."""
+
+ def train(
+ self,
+ model: ModelType,
+ tokenizer: TokenizerType,
+ config: DictConfig,
+ train_data: Dataset,
+ val_data: Dataset,
+ ) -> TrainingResult:
+ """Execute the training strategy."""
+ ...
+
+
+# Model converter protocol
+class ModelConverter(Protocol):
+ """Protocol for different model conversion formats."""
+
+ def convert(
+ self,
+ model_path: PathLike,
+ output_path: PathLike,
+ **kwargs: Any,
+ ) -> ConversionResult:
+ """Convert model to specific format."""
+ ...
+
+
+# Resource manager protocol
+class ResourceManager(Protocol):
+ """Protocol for managing computational resources."""
+
+ def __enter__(self) -> None:
+ """Enter resource context."""
+ ...
+
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
+ """Exit resource context with cleanup."""
+ ...
+
+
+# Evaluation types
+EvaluationMetrics = dict[str, int | float | str]
+
+
+class TestResult(TypedDict):
+ metrics: EvaluationMetrics
+ success: bool
+ error_message: str | None
+
+
+# Logging and tracking types
+ExperimentConfig = dict[str, Any]
+LoggingBackend = Union[str, None] # Can be "wandb", "mlflow", or None
+
+
+# Pipeline step results
+class PipelineStepResult(TypedDict):
+ step_name: str
+ success: bool
+ duration: float
+ artifacts: dict[str, Any] | None
+ error_message: str | None
+
+
+# Context manager types
+DirectoryContext = AbstractContextManager[None]
+GPUMemoryContext = AbstractContextManager[None]
+
+
+# Generation and sampling types
+class GenerationConfig(TypedDict):
+ temperature: float
+ top_k: int
+ top_p: float
+ max_length: int
+ do_sample: bool
+
+
+# RKLLM specific types
+class RKLLMConfig(TypedDict):
+ target_platform: str
+ quantization: str
+ do_parallelize: bool
+ hybrid_quantization: bool
+ num_npu_core: int
diff --git a/training_model/utils.py b/training_model/utils.py
index 07f4d60..8325c2b 100644
--- a/training_model/utils.py
+++ b/training_model/utils.py
@@ -1,113 +1,149 @@
-"""Additional functions for the training_model module."""
-import json
-from typing import Any, Dict, List
+"""
+Module with utility functions for training the model.
+"""
-from huggingface_hub import login
-from omegaconf import DictConfig, OmegaConf
+import logging
+import os
import wandb
+from huggingface_hub import login
+from omegaconf import DictConfig, OmegaConf
+from transformers import AutoTokenizer, PreTrainedTokenizerBase
from wandb.sdk.wandb_run import Run
-from .private_api import WANB_API
+from training_model.exceptions import ConfigurationError
-# @dataclass
-# class Config:
-# # model_name = "meta-llama/Meta-Llama-3.1-8B-Instruct"
-# # model_name = "aifeifei798/DarkIdol-Llama-3.1-8B-Instruct-1.2-Uncensored"
-# # model_name = "IlyaGusev/saiga_llama3_8b"
-# model_name = "t-tech/T-lite-it-1.0"
-# # model_name = "yandex/YandexGPT-5-Lite-8B-pretrain"
-# dataset_name = "data/dataset_ru.json"
-# # dataset_name = "ruslanmv/ai-medical-chatbot"
-# new_model = "tlite7b-chat-vika"
-# torch_dtype = torch.float16
-# attn_implementation = "eager"
-# train_steps = 60
+def get_generation_config(
+ cfg: DictConfig, tokenizer: AutoTokenizer | PreTrainedTokenizerBase, method: str = "global"
+) -> dict:
+ """Get generation configuration from config with method-specific overrides.
-def tokens_init(cfg: DictConfig) -> Run:
- """Initialize Weights & Biases logging and configure authentication.
+ Currently used for GRPO training and general evaluation/testing purposes.
+ SFT and DPO don't need generation during training.
Args:
- cfg (DictConfig): Configuration object with training parameters
+ cfg: Configuration object.
+ tokenizer: Tokenizer for setting pad_token_id.
+ method: Training method ("global", "grpo").
Returns:
- Run: Initialized Weights & Biases run object
+ Dictionary with generation parameters.
+
+ Raises:
+ ConfigurationError: If generation configuration is invalid.
"""
- if cfg.other.hf_login:
- hf_token = cfg.other.hf_token
- login(token=hf_token)
+ try:
+ # Start with global defaults
+ generation_config = {
+ "do_sample": getattr(cfg.generation, "do_sample", True),
+ "temperature": getattr(cfg.generation, "temperature", 0.7),
+ "top_k": getattr(cfg.generation, "top_k", 50),
+ "top_p": getattr(cfg.generation, "top_p", 0.95),
+ "max_new_tokens": getattr(cfg.generation, "max_new_tokens", 256),
+ "repetition_penalty": getattr(cfg.generation, "repetition_penalty", 1.1),
+ "pad_token_id": (
+ tokenizer.pad_token_id
+ if tokenizer.pad_token_id is not None
+ else tokenizer.eos_token_id
+ ),
+ }
- # wb_token = user_secrets.get_secret("wandb_api_key")
- wb_token = WANB_API
+ # Apply GRPO-specific overrides for backward compatibility
+ if method == "grpo" and hasattr(cfg, "grpo"):
+ grpo_config = {
+ "do_sample": getattr(cfg.grpo, "do_sample", generation_config["do_sample"]),
+ "temperature": getattr(
+ cfg.grpo, "temperature", generation_config["temperature"]
+ ),
+ "top_k": getattr(cfg.grpo, "top_k", generation_config["top_k"]),
+ "top_p": getattr(cfg.grpo, "top_p", generation_config["top_p"]),
+ "max_new_tokens": getattr(
+ cfg.grpo, "response_length", generation_config["max_new_tokens"]
+ ),
+ "repetition_penalty": generation_config["repetition_penalty"],
+ "pad_token_id": generation_config["pad_token_id"],
+ }
+ generation_config.update(grpo_config)
+
+ # Remove None values and ensure pad_token_id is set
+ generation_config = {k: v for k, v in generation_config.items() if v is not None}
+
+ # Ensure pad_token_id is always set (required for generation)
+ if (
+ "pad_token_id" not in generation_config
+ or generation_config.get("pad_token_id") is None
+ ):
+ # Try multiple fallback options
+ pad_id = tokenizer.pad_token_id
+ if pad_id is None:
+ pad_id = tokenizer.eos_token_id
+ if pad_id is None:
+ pad_id = 0
+ generation_config["pad_token_id"] = pad_id
+ logging.info(f"Set pad_token_id to {pad_id}")
+
+ logging.info(f"Generation config for {method}: {generation_config}")
+ return generation_config
+
+ except Exception as e:
+ raise ConfigurationError(
+ f"Failed to create generation config for {method}: {e}"
+ ) from e
+
+
+def _load_environment_if_needed(cfg: DictConfig) -> None:
+ """Load environment variables from .env if configured to do so."""
+ if cfg.get("environment", {}).get("use_dotenv", False):
+ try:
+ from dotenv import load_dotenv
+
+ load_dotenv()
+ except ImportError:
+ pass
- wandb.login(key=wb_token)
- run = wandb.init(
- project="Fine-tune on Dataset for game",
- job_type="training",
- config=OmegaConf.to_container(cfg, resolve=True),
- anonymous="allow",
- )
- return run
+def tokens_init(cfg: DictConfig) -> Run:
+ """
+ Initialize Weights & Biases logging
+ and configure authentication using environment variables.
-def get_user_prompt(data: Dict[str, Any]) -> str:
- """Construct user prompt from conversation data.
+ This function reads Hugging Face and Wandb tokens from environment variables:
+ - HF_TOKEN for Hugging Face
+ - WANDB_API_KEY for Weights & Biases
Args:
- data (Dict[str, Any]): Dictionary containing conversation history and metadata:
- - History: List of previous messages
- - AvailableActions: List of available actions
- - UserInput: Current user input
+ cfg (DictConfig): Configuration object with training parameters.
Returns:
- str: Formatted prompt string with conversation context
+ Run: Initialized Weights & Biases run object.
"""
- user_message = (
- "Системное сообщение, которому ты должен следовать, отмечено словом 'system'. "
- "Предыдущие сообщения пользователя отмечены словом 'user'. Твои предыдущие сообщения отмечены словом 'VIKA'. "
- "\n\nИстория сообщений:"
- )
- for message in data["History"]:
- user_message += f"\n{message}"
- user_message += f"\n\nТы можешь совершать только действия из представленного списка.\nДоступные действия:\n Разговор, {', '.join(data['AvailableActions'])}"
- user_message += f"\n\nОтветь на сообщение пользователя, беря во внимания всю предыдущую информацию.\nСообщение пользователя:\n{data['UserInput']}"
- return user_message
+ import logging
+ logger = logging.getLogger(__name__)
-def dataset_to_json(dataset: Dict[str, Any], filename: str) -> List[Dict[str, str]]:
- """Convert dataset to JSON format and save to file.
-
- Args:
- dataset (Dict[str, Any]): Source dataset dictionary containing:
- - system: System prompt template
- - examples: Dictionary of conversation examples
- filename (str): Output file path
+ # Load environment variables if configured to do so
+ _load_environment_if_needed(cfg)
- Returns:
- List[Dict[str, str]]: List of generated JSON objects with conversation data
- """
- json_objects = []
- system = dataset["system"]
- dataset = dataset["examples"]
-
- with open(filename, "w", encoding="utf-8") as file:
- file.write("")
-
- for row in dataset.keys():
- system_message = system
- user_message = get_user_prompt(dataset[row]["prompt"])
- # user_message = str(dataset[row]['prompt'])
- bot_message = str(dataset[row]["answer"])
-
- json_object = {
- "system": system_message,
- "user": user_message,
- "bot": bot_message,
- }
+ if cfg.other.hf_login:
+ hf_token = os.getenv("HF_TOKEN")
+ if hf_token is None:
+ raise OSError("Environment variable 'HF_TOKEN' is not set.")
+ login(token=hf_token)
- json_objects.append(json_object)
- with open(filename, "a", encoding="utf-8") as file:
- file.write(json.dumps(json_object, ensure_ascii=False) + "\n")
+ # Weights & Biases login
+ wb_token = os.getenv("WANB_API")
+ if wb_token is None:
+ raise OSError("Environment variable 'WANB_API' is not set.")
+ # wandb.login(key=wb_token)
- return json_objects
+ logger.debug(
+ f"Using Weights & Biases token: {wb_token[:8]}..." if wb_token else "No token found",
+ )
+ run = wandb.init(
+ project=cfg.wandb.project_name,
+ job_type="training",
+ config=OmegaConf.to_container(cfg, resolve=True),
+ anonymous=cfg.wandb.anonymous,
+ )
+ return run
diff --git a/vk_bot/Llama2_model.py b/vk_bot/Llama2_model.py
index 804e485..8311ad6 100644
--- a/vk_bot/Llama2_model.py
+++ b/vk_bot/Llama2_model.py
@@ -1,6 +1,9 @@
from llama_cpp import Llama
-SYSTEM_PROMPT = "Ты — переводчик. Ты переводишь текст с русского, на текст, как будто он был переведён с китайского. Избегай дублирования перевода."
+SYSTEM_PROMPT = (
+ "Ты — переводчик. Ты переводишь текст с русского, на текст, "
+ "как будто он был переведён с китайского. Избегай дублирования перевода."
+)
SYSTEM_TOKEN = 1788
USER_TOKEN = 1404
BOT_TOKEN = 9225
@@ -28,10 +31,15 @@ def get_system_tokens(model):
def get_prompt(question):
- return f"""
- Пример перевода: 'Меня зовут Иван, живу в России и я работаю в шахте. Читал труды китайской партии, и мне понравилось.' -> 'Я простой русский рабочий Иван, работать шахта, жить Россия. Читать книга Китай партия, много нравиться.
- Текст, который нужно перевести в квадратных скобках: [{question}]
- Переведи с русского так, как будто этот текст был переведён с китайского в переводчике."""
+ return (
+ f"Пример перевода: 'Меня зовут Иван, живу в России и я работаю в шахте. "
+ "Читал труды китайской партии, и мне понравилось.' -> "
+ "'Я простой русский рабочий Иван, работать шахта, жить Россия. "
+ "Читать книга Китай партия, много нравиться.\n"
+ f"Текст, который нужно перевести в квадратных скобках: [{question}]\n"
+ "Переведи с русского так, как будто этот текст был переведён с китайского "
+ "в переводчике."
+ )
def chat_saiga(message, model):
@@ -63,7 +71,8 @@ def chat_saiga(message, model):
result_list = []
if flag:
result_list.append(
- "Введённое сообщение превышает допустимое количество символов в сообщении, поэтому переведена будет лишь часть.\n"
+ "Введённое сообщение превышает допустимое количество символов в сообщении, "
+ "поэтому переведена будет лишь часть.\n",
)
for token in generator:
token_str = model.detokenize([token]).decode("utf-8", errors="ignore")
diff --git a/vk_bot/llama31_model.py b/vk_bot/llama31_model.py
index ae10c10..7963c24 100644
--- a/vk_bot/llama31_model.py
+++ b/vk_bot/llama31_model.py
@@ -1,8 +1,9 @@
import json
+from pathlib import Path
from llama_cpp import Llama
-with open("../data/dataset_ru.json", "r", encoding="UTF-8") as f:
+with Path("../data/dataset_ru.json").open(encoding="UTF-8") as f:
dataset = json.load(f)
SYSTEM_PROMPT = dataset["system"]
SYSTEM_TOKEN = 1788
diff --git a/vk_bot/llm_bot.py b/vk_bot/llm_bot.py
index 45c0ca6..39ffd9b 100644
--- a/vk_bot/llm_bot.py
+++ b/vk_bot/llm_bot.py
@@ -11,7 +11,12 @@
from .llama31_model import chat_saiga, model
-def send_message(user_id: int, msg: str, stiker=None, attach=None) -> None:
+def send_message(
+ user_id: int,
+ msg: str,
+ stiker: int | None = None,
+ attach: str | None = None,
+) -> None:
try:
vk.messages.send(
user_id=user_id,
@@ -25,24 +30,18 @@ def send_message(user_id: int, msg: str, stiker=None, attach=None) -> None:
return
-def main():
+def main() -> None:
print("start")
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
user_id = event.user_id
if event.text:
if len(event.text) > 400:
- send_message(
- user_id, "Генерация может занимание много время, ожидание"
- )
+ send_message(user_id, "Генерация может занимание много время, ожидание")
if len(users_generate) > 0 and user_id not in users_generate:
- send_message(
- user_id, "Генерация другой человек, ожидание больше обычного"
- )
+ send_message(user_id, "Генерация другой человек, ожидание больше обычного")
if len(event.text) > 1200:
- send_message(
- user_id, "Текст слишком длинный, разрезание несколько частей"
- )
+ send_message(user_id, "Текст слишком длинный, разрезание несколько частей")
continue
vk.messages.setActivity(peer_id=event.peer_id, type="typing")
users_generate.append(user_id)