]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Merge branch 'dev' into feature-ai
authorshamoon <4887959+shamoon@users.noreply.github.com>
Wed, 6 Aug 2025 20:04:06 +0000 (16:04 -0400)
committershamoon <4887959+shamoon@users.noreply.github.com>
Wed, 6 Aug 2025 20:04:06 +0000 (16:04 -0400)
1  2 
docs/configuration.md
docs/usage.md
pyproject.toml
src-ui/src/app/components/admin/config/config.component.html
src/documents/signals/handlers.py
src/paperless/settings.py
uv.lock

Simple merge
diff --cc docs/usage.md
Simple merge
diff --cc pyproject.toml
index 8e2d38a9a3b7c84ba1b48628b316a60315e6e171,385458aeba7e59c572e7e8f78cd644aa90e5d2cc..d113edf6674f1c9831c8a5b5ac8783e466442e65
@@@ -49,17 -48,11 +49,18 @@@ dependencies = 
    "inotifyrecursive~=0.3",
    "jinja2~=3.1.5",
    "langdetect~=1.0.9",
 +  "llama-index-core>=0.12.33.post1",
 +  "llama-index-embeddings-huggingface>=0.5.3",
 +  "llama-index-embeddings-openai>=0.3.1",
 +  "llama-index-llms-ollama>=0.5.4",
 +  "llama-index-llms-openai>=0.3.38",
 +  "llama-index-vector-stores-faiss>=0.3",
    "nltk~=3.9.1",
    "ocrmypdf~=16.10.0",
 +  "openai>=1.76",
    "pathvalidate~=3.3.1",
    "pdf2image~=1.17.0",
+   "psycopg-pool",
    "python-dateutil~=2.9.0",
    "python-dotenv~=1.1.0",
    "python-gnupg~=0.5.4",
@@@ -69,9 -62,8 +70,9 @@@
    "rapidfuzz~=3.13.0",
    "redis[hiredis]~=5.2.1",
    "scikit-learn~=1.7.0",
 +  "sentence-transformers>=4.1",
    "setproctitle~=1.3.4",
-   "tika-client~=0.9.0",
+   "tika-client~=0.10.0",
    "tqdm~=4.67.1",
    "watchdog~=6.0",
    "whitenoise~=6.9",
index c6fb6ee1ecb930e08d26ae1913b9a4cb55fb9211,76df8d4e4aaab066dcf3bd19dfa052ba9ccea502..e4971f525d19c05044357f5f5b13b873d7e7e685
@@@ -48,11 -49,8 +50,9 @@@ from documents.models import WorkflowTr
  from documents.permissions import get_objects_for_user_owner_aware
  from documents.permissions import set_permissions_for_object
  from documents.templating.workflows import parse_w_workflow_placeholders
 +from paperless.config import AIConfig
  
  if TYPE_CHECKING:
-     from pathlib import Path
      from documents.classifier import DocumentClassifier
      from documents.data_models import ConsumableDocument
      from documents.data_models import DocumentMetadataOverrides
@@@ -1452,24 -1441,16 +1452,39 @@@ def task_failure_handler
          logger.exception("Updating PaperlessTask failed")
  
  
+ @worker_process_init.connect
+ def close_connection_pool_on_worker_init(**kwargs):
+     """
+     Close the DB connection pool for each Celery child process after it starts.
+     This is necessary because the parent process parse the Django configuration,
+     initializes connection pools then forks.
+     Closing these pools after forking ensures child processes have a valid connection.
+     """
+     for conn in connections.all(initialized_only=True):
+         if conn.alias == "default" and hasattr(conn, "pool") and conn.pool:
+             conn.close_pool()
++
++
 +def add_or_update_document_in_llm_index(sender, document, **kwargs):
 +    """
 +    Add or update a document in the LLM index when it is created or updated.
 +    """
 +    ai_config = AIConfig()
 +    if ai_config.llm_index_enabled():
 +        from documents.tasks import update_document_in_llm_index
 +
 +        update_document_in_llm_index.delay(document)
 +
 +
 +@receiver(models.signals.post_delete, sender=Document)
 +def delete_document_from_llm_index(sender, instance: Document, **kwargs):
 +    """
 +    Delete a document from the LLM index when it is deleted.
 +    """
 +    ai_config = AIConfig()
 +    if ai_config.llm_index_enabled():
 +        from documents.tasks import remove_document_from_llm_index
 +
 +        remove_document_from_llm_index.delay(instance)
Simple merge
diff --cc uv.lock
index db57301a583ab1eb2f63e21e83f48325269f4524,fe673a5b8980603219aa9a67b6c618584b4f18e7..0f32a7b77eaee4be028d68147a22ccac055dc3de
+++ b/uv.lock
@@@ -1,15 -1,11 +1,15 @@@
  version = 1
- revision = 2
+ revision = 3
  requires-python = ">=3.10"
  resolution-markers = [
 -    "sys_platform == 'darwin'",
 +    "python_full_version >= '3.12' and sys_platform == 'darwin'",
 +    "python_full_version == '3.11.*' and sys_platform == 'darwin'",
 +    "python_full_version < '3.11' and sys_platform == 'darwin'",
      "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux'",
      "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'",
 -    "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux')",
 +    "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_machine != 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux')",
 +    "python_full_version == '3.11.*' and sys_platform == 'linux'",
 +    "python_full_version < '3.11' and sys_platform == 'linux'",
  ]
  supported-markers = [
      "sys_platform == 'darwin'",
@@@ -2751,17 -1942,11 +2751,18 @@@ dependencies = 
      { name = "inotifyrecursive", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "jinja2", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "langdetect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-embeddings-huggingface", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-embeddings-openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-llms-ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-llms-openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "llama-index-vector-stores-faiss", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "nltk", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "ocrmypdf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "openai", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "pathvalidate", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "pdf2image", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
+     { name = "psycopg-pool", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "python-dotenv", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "python-gnupg", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
@@@ -2901,10 -2079,9 +2903,10 @@@ requires-dist = 
      { name = "mysqlclient", marker = "extra == 'mariadb'", specifier = "~=2.2.7" },
      { name = "nltk", specifier = "~=3.9.1" },
      { name = "ocrmypdf", specifier = "~=16.10.0" },
 +    { name = "openai", specifier = ">=1.76" },
      { name = "pathvalidate", specifier = "~=3.3.1" },
      { name = "pdf2image", specifier = "~=1.17.0" },
-     { name = "psycopg", extras = ["c"], marker = "extra == 'postgres'", specifier = "==3.2.9" },
+     { name = "psycopg", extras = ["c", "pool"], marker = "extra == 'postgres'", specifier = "==3.2.9" },
      { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_aarch64.whl" },
      { name = "psycopg-c", marker = "python_full_version == '3.12.*' and platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'postgres'", url = "https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.9/psycopg_c-3.2.9-cp312-cp312-linux_x86_64.whl" },
      { name = "psycopg-c", marker = "(python_full_version != '3.12.*' and platform_machine == 'aarch64' and extra == 'postgres') or (python_full_version != '3.12.*' and platform_machine == 'x86_64' and extra == 'postgres') or (platform_machine != 'aarch64' and platform_machine != 'x86_64' and extra == 'postgres') or (sys_platform != 'linux' and extra == 'postgres')", specifier = "==3.2.9" },
      { name = "rapidfuzz", specifier = "~=3.13.0" },
      { name = "redis", extras = ["hiredis"], specifier = "~=5.2.1" },
      { name = "scikit-learn", specifier = "~=1.7.0" },
 +    { name = "sentence-transformers", specifier = ">=4.1" },
      { name = "setproctitle", specifier = "~=1.3.4" },
-     { name = "tika-client", specifier = "~=0.9.0" },
+     { name = "tika-client", specifier = "~=0.10.0" },
      { name = "tqdm", specifier = "~=4.67.1" },
      { name = "watchdog", specifier = "~=6.0" },
      { name = "whitenoise", specifier = "~=6.9" },
@@@ -4445,66 -3365,11 +4464,66 @@@ dependencies = 
      { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
      { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" },
  ]
- sdist = { url = "https://files.pythonhosted.org/packages/94/ad/3508e42b470a037b3f5c19ca9993893d0faa30ba7ec7e6ac33db9bc3bf51/tika_client-0.9.0.tar.gz", hash = "sha256:c10bba8e40ede23c039f84ccd821fb2d290d339cc26cbd267ab9b561a1e83659", size = 2175246, upload-time = "2025-01-15T18:46:23.901Z" }
+ sdist = { url = "https://files.pythonhosted.org/packages/21/be/65bfc47e4689ecd5ead20cf47dc0084fd767b7e71e8cfabf5fddc42aae3c/tika_client-0.10.0.tar.gz", hash = "sha256:3101e8b2482ae4cb7f87be13ada970ff691bdc3404d94cd52f5e57a09c99370c", size = 2178257, upload-time = "2025-08-04T17:47:30.414Z" }
  wheels = [
-     { url = "https://files.pythonhosted.org/packages/36/8c/90ba51e014fb548ee34dd5ed14e85ec4a205ff97b89ca393e4de321304ac/tika_client-0.9.0-py3-none-any.whl", hash = "sha256:2464e8335b5e92c276641c729e7707f1e894a2bfb51cc59abdd3bdfb532da8a0", size = 17963, upload-time = "2025-01-15T18:46:21.143Z" },
+     { url = "https://files.pythonhosted.org/packages/b1/31/002e0fa5bca67d6a19da8c294273486f6c46cbcc83d6879719a38a181461/tika_client-0.10.0-py3-none-any.whl", hash = "sha256:f5486cc884e4522575662aa295bda761bf9f101ac8d92840155b58ab8b96f6e2", size = 18237, upload-time = "2025-08-04T17:47:28.966Z" },
  ]
  
 +[[package]]
 +name = "tiktoken"
 +version = "0.9.0"
 +source = { registry = "https://pypi.org/simple" }
 +dependencies = [
 +    { name = "regex", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +    { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +]
 +sdist = { url = "https://files.pythonhosted.org/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d", size = 35991 }
 +wheels = [
 +    { url = "https://files.pythonhosted.org/packages/64/f3/50ec5709fad61641e4411eb1b9ac55b99801d71f1993c29853f256c726c9/tiktoken-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:586c16358138b96ea804c034b8acf3f5d3f0258bd2bc3b0227af4af5d622e382", size = 1065770 },
 +    { url = "https://files.pythonhosted.org/packages/d6/f8/5a9560a422cf1755b6e0a9a436e14090eeb878d8ec0f80e0cd3d45b78bf4/tiktoken-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9c59ccc528c6c5dd51820b3474402f69d9a9e1d656226848ad68a8d5b2e5108", size = 1009314 },
 +    { url = "https://files.pythonhosted.org/packages/bc/20/3ed4cfff8f809cb902900ae686069e029db74567ee10d017cb254df1d598/tiktoken-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0968d5beeafbca2a72c595e8385a1a1f8af58feaebb02b227229b69ca5357fd", size = 1143140 },
 +    { url = "https://files.pythonhosted.org/packages/f1/95/cc2c6d79df8f113bdc6c99cdec985a878768120d87d839a34da4bd3ff90a/tiktoken-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a5fb085a6a3b7350b8fc838baf493317ca0e17bd95e8642f95fc69ecfed1de", size = 1197860 },
 +    { url = "https://files.pythonhosted.org/packages/c7/6c/9c1a4cc51573e8867c9381db1814223c09ebb4716779c7f845d48688b9c8/tiktoken-0.9.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:15a2752dea63d93b0332fb0ddb05dd909371ededa145fe6a3242f46724fa7990", size = 1259661 },
 +    { url = "https://files.pythonhosted.org/packages/4d/ae/4613a59a2a48e761c5161237fc850eb470b4bb93696db89da51b79a871f1/tiktoken-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f32cc56168eac4851109e9b5d327637f15fd662aa30dd79f964b7c39fbadd26e", size = 1065987 },
 +    { url = "https://files.pythonhosted.org/packages/3f/86/55d9d1f5b5a7e1164d0f1538a85529b5fcba2b105f92db3622e5d7de6522/tiktoken-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:45556bc41241e5294063508caf901bf92ba52d8ef9222023f83d2483a3055348", size = 1009155 },
 +    { url = "https://files.pythonhosted.org/packages/03/58/01fb6240df083b7c1916d1dcb024e2b761213c95d576e9f780dfb5625a76/tiktoken-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03935988a91d6d3216e2ec7c645afbb3d870b37bcb67ada1943ec48678e7ee33", size = 1142898 },
 +    { url = "https://files.pythonhosted.org/packages/b1/73/41591c525680cd460a6becf56c9b17468d3711b1df242c53d2c7b2183d16/tiktoken-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b3d80aad8d2c6b9238fc1a5524542087c52b860b10cbf952429ffb714bc1136", size = 1197535 },
 +    { url = "https://files.pythonhosted.org/packages/7d/7c/1069f25521c8f01a1a182f362e5c8e0337907fae91b368b7da9c3e39b810/tiktoken-0.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b2a21133be05dc116b1d0372af051cd2c6aa1d2188250c9b553f9fa49301b336", size = 1259548 },
 +    { url = "https://files.pythonhosted.org/packages/cf/e5/21ff33ecfa2101c1bb0f9b6df750553bd873b7fb532ce2cb276ff40b197f/tiktoken-0.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e88f121c1c22b726649ce67c089b90ddda8b9662545a8aeb03cfef15967ddd03", size = 1065073 },
 +    { url = "https://files.pythonhosted.org/packages/8e/03/a95e7b4863ee9ceec1c55983e4cc9558bcfd8f4f80e19c4f8a99642f697d/tiktoken-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6600660f2f72369acb13a57fb3e212434ed38b045fd8cc6cdd74947b4b5d210", size = 1008075 },
 +    { url = "https://files.pythonhosted.org/packages/40/10/1305bb02a561595088235a513ec73e50b32e74364fef4de519da69bc8010/tiktoken-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95e811743b5dfa74f4b227927ed86cbc57cad4df859cb3b643be797914e41794", size = 1140754 },
 +    { url = "https://files.pythonhosted.org/packages/1b/40/da42522018ca496432ffd02793c3a72a739ac04c3794a4914570c9bb2925/tiktoken-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99376e1370d59bcf6935c933cb9ba64adc29033b7e73f5f7569f3aad86552b22", size = 1196678 },
 +    { url = "https://files.pythonhosted.org/packages/5c/41/1e59dddaae270ba20187ceb8aa52c75b24ffc09f547233991d5fd822838b/tiktoken-0.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:badb947c32739fb6ddde173e14885fb3de4d32ab9d8c591cbd013c22b4c31dd2", size = 1259283 },
 +    { url = "https://files.pythonhosted.org/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb", size = 1064919 },
 +    { url = "https://files.pythonhosted.org/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63", size = 1007877 },
 +    { url = "https://files.pythonhosted.org/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01", size = 1140095 },
 +    { url = "https://files.pythonhosted.org/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139", size = 1195649 },
 +    { url = "https://files.pythonhosted.org/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a", size = 1258465 },
 +]
 +
 +[[package]]
 +name = "tokenizers"
 +version = "0.21.1"
 +source = { registry = "https://pypi.org/simple" }
 +dependencies = [
 +    { name = "huggingface-hub", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },
 +]
 +sdist = { url = "https://files.pythonhosted.org/packages/92/76/5ac0c97f1117b91b7eb7323dcd61af80d72f790b4df71249a7850c195f30/tokenizers-0.21.1.tar.gz", hash = "sha256:a1bb04dc5b448985f86ecd4b05407f5a8d97cb2c0532199b2a302a604a0165ab", size = 343256 }
 +wheels = [
 +    { url = "https://files.pythonhosted.org/packages/a5/1f/328aee25f9115bf04262e8b4e5a2050b7b7cf44b59c74e982db7270c7f30/tokenizers-0.21.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e78e413e9e668ad790a29456e677d9d3aa50a9ad311a40905d6861ba7692cf41", size = 2780767 },
 +    { url = "https://files.pythonhosted.org/packages/ae/1a/4526797f3719b0287853f12c5ad563a9be09d446c44ac784cdd7c50f76ab/tokenizers-0.21.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:cd51cd0a91ecc801633829fcd1fda9cf8682ed3477c6243b9a095539de4aecf3", size = 2650555 },
 +    { url = "https://files.pythonhosted.org/packages/4d/7a/a209b29f971a9fdc1da86f917fe4524564924db50d13f0724feed37b2a4d/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28da6b72d4fb14ee200a1bd386ff74ade8992d7f725f2bde2c495a9a98cf4d9f", size = 2937541 },
 +    { url = "https://files.pythonhosted.org/packages/3c/1e/b788b50ffc6191e0b1fc2b0d49df8cff16fe415302e5ceb89f619d12c5bc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:34d8cfde551c9916cb92014e040806122295a6800914bab5865deb85623931cf", size = 2819058 },
 +    { url = "https://files.pythonhosted.org/packages/36/aa/3626dfa09a0ecc5b57a8c58eeaeb7dd7ca9a37ad9dd681edab5acd55764c/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaa852d23e125b73d283c98f007e06d4595732104b65402f46e8ef24b588d9f8", size = 3133278 },
 +    { url = "https://files.pythonhosted.org/packages/a4/4d/8fbc203838b3d26269f944a89459d94c858f5b3f9a9b6ee9728cdcf69161/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a21a15d5c8e603331b8a59548bbe113564136dc0f5ad8306dd5033459a226da0", size = 3144253 },
 +    { url = "https://files.pythonhosted.org/packages/d8/1b/2bd062adeb7c7511b847b32e356024980c0ffcf35f28947792c2d8ad2288/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fdbd4c067c60a0ac7eca14b6bd18a5bebace54eb757c706b47ea93204f7a37c", size = 3398225 },
 +    { url = "https://files.pythonhosted.org/packages/8a/63/38be071b0c8e06840bc6046991636bcb30c27f6bb1e670f4f4bc87cf49cc/tokenizers-0.21.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dd9a0061e403546f7377df940e866c3e678d7d4e9643d0461ea442b4f89e61a", size = 3038874 },
 +    { url = "https://files.pythonhosted.org/packages/ec/83/afa94193c09246417c23a3c75a8a0a96bf44ab5630a3015538d0c316dd4b/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:db9484aeb2e200c43b915a1a0150ea885e35f357a5a8fabf7373af333dcc8dbf", size = 9014448 },
 +    { url = "https://files.pythonhosted.org/packages/ae/b3/0e1a37d4f84c0f014d43701c11eb8072704f6efe8d8fc2dcdb79c47d76de/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:ed248ab5279e601a30a4d67bdb897ecbe955a50f1e7bb62bd99f07dd11c2f5b6", size = 8937877 },
 +    { url = "https://files.pythonhosted.org/packages/ac/33/ff08f50e6d615eb180a4a328c65907feb6ded0b8f990ec923969759dc379/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:9ac78b12e541d4ce67b4dfd970e44c060a2147b9b2a21f509566d556a509c67d", size = 9186645 },
 +    { url = "https://files.pythonhosted.org/packages/5f/aa/8ae85f69a9f6012c6f8011c6f4aa1c96154c816e9eea2e1b758601157833/tokenizers-0.21.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e5a69c1a4496b81a5ee5d2c1f3f7fbdf95e90a0196101b0ee89ed9956b8a168f", size = 9384380 },
 +]
 +
  [[package]]
  name = "tomli"
  version = "2.2.1"