diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b4e2b67c..e3534ee8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -33,9 +33,7 @@ jobs: --output-file /tmp/slm-runtime-requirements.txt uvx --from pip-audit==2.9.0 pip-audit \ --requirement /tmp/slm-runtime-requirements.txt \ - --no-deps --disable-pip \ - --ignore-vuln GHSA-rrmf-rvhw-rf47 \ - --ignore-vuln PYSEC-2026-3447 + --no-deps --disable-pip - name: Reject high-confidence high-severity Python findings run: uvx --from bandit==1.8.6 bandit -r src/superlocalmemory -q -lll -iii diff --git a/README.md b/README.md index 0b3dc8d7..3df4e19e 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,36 @@

-

SuperLocalMemory V4.1.17

+

SuperLocalMemory — local-first memory for AI agents

Rent the LLM. Own the memory.

Rent an LLM — but own the memory, for your company and for your industry.

+Store context once and recall it across agent sessions through the CLI or MCP. Start with local memory, then choose the operating mode and integrations your workspace needs. SuperLocalMemory is part of Qualixar's AI Reliability Engineering work. + +**[Research and evidence](https://www.superlocalmemory.com/research)** · **[Qualixar product overview](https://qualixar.com/products/superlocalmemory)** · **[Author and research context](https://varunpratap.com/products/superlocalmemory)** + +**[Install](https://www.superlocalmemory.com/install)** · **[Product walkthrough](https://www.superlocalmemory.com/demo)** · **[CLI proof](docs/QUICK_PROOF.md)** · **[Release notes](CHANGELOG.md)** + +```bash +npm install -g superlocalmemory # Primary CLI install path +slm setup # Select mode A for local-only operation; review integration choices. +slm doctor +slm remember "Synthetic demo: the release checklist requires a human approval after tests pass." --tags demo --json --sync +slm recall "release checklist human approval" --json +``` + +The synthetic CLI proof returned the stored sentence in mode A on version 4.1.17. It tests store-and-recall behavior; it is not a retrieval accuracy benchmark. +[See the commands, scope and isolation settings](docs/QUICK_PROOF.md). + +If the proof is useful for your agent workflow, [star the repository](https://github.com/qualixar/superlocalmemory) to find the project again. Stars are optional; installation and documentation are open without one. + +**Source security repair:** dependency changes on this branch do not update already published packages. [See dependency security and the temporary optional-backend restriction](docs/dependency-security.md). + +## Governance, architecture and research + +

The governed memory layer for AI agents: local-first, auditable, and built for the compliance obligations teams now actually carry.
Models are interchangeable and rented by the token. What your agents remember is yours — it is your customers' data, your retention obligations, and your audit trail. SLM diff --git a/docs/QUICK_PROOF.md b/docs/QUICK_PROOF.md new file mode 100644 index 00000000..0f725495 --- /dev/null +++ b/docs/QUICK_PROOF.md @@ -0,0 +1,20 @@ +# Store and recall one synthetic fact + +Install using the [Quick Start](../README.md#quick-start), choose operating mode +A in `slm setup`, and run `slm doctor` before using the CLI. + +```bash +slm remember "Synthetic demo: the release checklist requires a human approval after tests pass." --tags demo --json --sync +slm recall "release checklist human approval" --json +``` + +On 1 October 2026, source version 4.1.17 returned a durable `queryable` receipt +and recalled that exact synthetic sentence. Recall returned one result with +`calibration_status: uncalibrated` and `answer_confidence: null`. A ranking score +is not an accuracy measurement. This one-fact check is not a retrieval benchmark. + +The verification used a separate `SLM_DATA_DIR`, `SLM_DAEMON_PORT=8893` and +`SLM_DISABLE_LEGACY_PORT=1` to avoid an existing memory service. It did not write +real customer data or change host hooks. Use an unused port and a dedicated +absolute data directory if you reproduce that isolation. Setup and integrations +remain explicit choices; review them before changing an existing workspace. diff --git a/docs/dependency-security.md b/docs/dependency-security.md new file mode 100644 index 00000000..477d1a02 --- /dev/null +++ b/docs/dependency-security.md @@ -0,0 +1,34 @@ +# Dependency security repair in source + +The October 2026 repair updates affected runtime dependency floors and the lock +without adding a blanket audit exception. It covers sentence-transformers, +transformers, NLTK removal, HTTP clients, AnyIO, PyJWT, accelerate and urllib3. +The build-system setuptools floor is 83.0.0 or newer. This is a source repair; +a published package does not acquire these changes until a new release ships. + +## Optional aggressive compression + +NLTK through 3.10.3 has an unpatched High advisory, +[GHSA-8mgp-746c-j5xp](https://github.com/advisories/GHSA-8mgp-746c-j5xp). +LLMLingua 0.2.2 depends on NLTK. These packages are temporarily omitted from +shipped requirements rather than hidden by an audit ignore or moved into an +unsafe extra. The LLMLingua implementation and selected model remain in source. + +An existing installation cannot activate this backend with a known-affected, +missing, malformed or prerelease NLTK version: the guard runs before importing +the backend. Setup uses the same guarded constructor. The router retains its +lossless fallback and records why the optional backend is unavailable. +Local memory, retrieval, cache, safe normalization and reversible storage are +separate capabilities. No new aggressive compression ratio is claimed. + +## Native dependency and integration updates + +Torch 2.13 removes the prior Low Torch advisory and permits a patched setuptools +runtime. Optional ingestion dependencies receive floors for httplib2, icalendar, +oauthlib and pyasn1, so an all-extras install follows the repaired graph too. +There is no blanket vulnerability ignore. Exact lock, runtime and all-extras +audit results must be recorded before release. + +Before release, verify the exact wheel/lock, runtime and optional-backend behavior, +embedding/reranker compatibility, tests, and both filtered and unfiltered audits. +Do not present source-only changes as already fixed in the published PyPI/npm package. diff --git a/pyproject.toml b/pyproject.toml index 18c04b06..3917b9d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,12 +68,12 @@ dependencies = [ # sentence-transformers[onnx] — its extras pull optimum which # overrides the sentence-transformers pin via transitive deps. # Pin all three explicitly instead. - "sentence-transformers==5.3.0", + "sentence-transformers==5.6.0", "optimum==2.1.0", "onnxruntime==1.24.4", - "transformers==5.5.4", + "transformers==5.10.1", "huggingface_hub==1.5.0", - "torch==2.11.0", + "torch==2.13.0", "scikit-learn==1.8.0", # Vector KNN extension for the semantic channel. "sqlite-vec==0.1.9", @@ -86,14 +86,18 @@ dependencies = [ # bindings. Existing SLM graph stores were created by 0.3.0; upgrading the # wheel without an export/import migration makes daemon startup panic. "pycozo[embedded]==0.3.0", - # v3.6.10: LLMLingua-2 prose compression (aggressive mode, opt-in at runtime). - # Hard dependency so `pip install superlocalmemory` ships compression-ready; - # the ~560MB model downloads on first setup/warmup (fail-open). Verified the - # pin does NOT disturb the transformers/torch/numpy pins above. - "llmlingua==0.2.2", - # LLMLingua pulls NLTK transitively. Pin above the disclosed traversal - # advisories so clean installs cannot resolve to the vulnerable 3.9.x line. - "nltk==3.10.0", + # LLMLingua/NLTK are temporarily not shipped: the latest NLTK has an + # unpatched High advisory. Default/lossless compression stays available. + # See docs/dependency-security.md before restoring this optional backend. + "packaging>=24.0", + # Security floors apply to pip installations as well as the uv lock. + "accelerate>=1.15.0,<2", + "anyio==4.14.2", + "httpcore2>=2.10.0,<3", + "httpx2>=2.12.0,<3", + "pyjwt>=2.15.1,<3", + "urllib3>=2.8.0,<3", + "setuptools>=83.0.0", ] [project.optional-dependencies] @@ -102,10 +106,10 @@ dependencies = [ # works but installs nothing extra. search = [ # Same hard pin as core deps — no [onnx] extra. - "sentence-transformers==5.3.0", + "sentence-transformers==5.6.0", "optimum==2.1.0", "einops==0.8.2", - "torch==2.11.0", + "torch==2.13.0", "scikit-learn==1.8.0", "onnxruntime==1.24.4", ] @@ -139,7 +143,10 @@ ingestion = [ "keyring>=25.0.0", "google-auth-oauthlib>=1.2.0", "google-api-python-client>=2.100.0", - "icalendar>=6.0.0", + "icalendar>=7.1.3", + "httplib2>=0.32.0", + "oauthlib>=4.0.0,<5", + "pyasn1>=0.6.4", ] full = [ "superlocalmemory[search,ui,learning,performance,ingestion,injection,scale]", @@ -151,7 +158,7 @@ dev = [ "sqlite-vec>=0.1.6", # Starlette TestClient's maintained synchronous backend. Test-only: the # product runtime continues to use the separately pinned httpx client. - "httpx2==2.5.0", + "httpx2==2.13.1", ] [project.urls] @@ -164,7 +171,7 @@ Issues = "https://github.com/qualixar/superlocalmemory/issues" slm = "superlocalmemory.cli.main:main" [build-system] -requires = ["setuptools>=77.0.3", "wheel"] +requires = ["setuptools>=83.0.0", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] @@ -242,7 +249,7 @@ select = ["E", "F", "I", "W"] [dependency-groups] dev = [ "build>=1.4.0", - "httpx2==2.5.0", + "httpx2==2.13.1", "pytest>=9.0.2", "pytest-asyncio>=0.21", "twine>=6.2.0", diff --git a/src/superlocalmemory/__init__.py b/src/superlocalmemory/__init__.py index 074ada10..2fcb75f5 100644 --- a/src/superlocalmemory/__init__.py +++ b/src/superlocalmemory/__init__.py @@ -35,7 +35,7 @@ __version__ = "4.1.17" _REQUIRED_VERSIONS = { - "sentence_transformers": "5.3.0", + "sentence_transformers": "5.6.0", "onnxruntime": "1.24.4", } diff --git a/src/superlocalmemory/cli/setup_wizard.py b/src/superlocalmemory/cli/setup_wizard.py index 38f833d3..9f3a1e9a 100644 --- a/src/superlocalmemory/cli/setup_wizard.py +++ b/src/superlocalmemory/cli/setup_wizard.py @@ -37,7 +37,7 @@ def _resolve_slm_home() -> Path: return canonical_data_root() _EMBED_MODEL = "nomic-ai/nomic-embed-text-v1.5" _RERANKER_MODEL = "cross-encoder/ms-marco-MiniLM-L-12-v2" -# v3.6.10: compulsory LLMLingua-2 prose compression model (~560MB, aggressive mode). +# Selected optional LLMLingua model; backend restricted pending dependency review. _COMPRESSOR_MODEL = "microsoft/llmlingua-2-xlm-roberta-large-meetingbank" @@ -211,17 +211,16 @@ def _download_compressor(model_name: str) -> bool: """Download the LLMLingua-2 prose compression model (v3.6.10). Mirrors _download_reranker: a subprocess forces the HF download with visible - progress. Fail-open — a network hiccup must NOT break setup; the model also - lazy-downloads on first use in prose_llmlingua.py. + progress. The shared backend guard runs before model loading; a restricted + backend stays unavailable and does not trigger an automatic dependency install. """ print(f"\n Downloading compression model: {model_name}") print(f" (LLMLingua-2 prose compressor, ~560MB — aggressive mode only)\n") # H-03: model name via argv, never interpolated into executed source. script = ( - "import sys; from llmlingua import PromptCompressor; " - "PromptCompressor(model_name=sys.argv[1], use_llmlingua2=True, " - "device_map='cpu'); " + "import sys; from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor; " + "LLMLinguaCompressor(model_name=sys.argv[1], device_map='cpu'); " "print('OK')" ) @@ -241,10 +240,10 @@ def _download_compressor(model_name: str) -> bool: if result.returncode == 0: print(f" ✓ Compression model ready") return True - print(f" ✗ Compression model download failed (will lazy-download on first use)") + print(f" ✗ Compression backend unavailable; default/lossless compression remains available") return False except ImportError: - print(f" ⚠ llmlingua not installed — compression model will download on first use") + print(f" ⚠ Compression backend not shipped pending upstream security fix; lossless compression remains available") return False except Exception as exc: print(f" ✗ Compression model error: {exc}") diff --git a/src/superlocalmemory/core/component_registry.py b/src/superlocalmemory/core/component_registry.py index 21ca128d..e886046f 100644 --- a/src/superlocalmemory/core/component_registry.py +++ b/src/superlocalmemory/core/component_registry.py @@ -368,6 +368,15 @@ def probe_cozo() -> Component: def probe_llmlingua() -> Component: + from superlocalmemory.optimize.compress.prose_llmlingua import backend_restriction + + restriction = backend_restriction() + if restriction is not None: + return Component( + key="llmlingua", label="LLMLingua compressor lib", + category=CATEGORY_OPTIONAL, status=STATUS_DEGRADED, + detail=restriction, fix_cmd="", auto_fixable=False, last_checked=time.time(), + ) return _probe_optional_pkg( "llmlingua", "LLMLingua compressor lib", "llmlingua", "llmlingua", "not installed (optional prose compression)", diff --git a/src/superlocalmemory/core/engine_wiring.py b/src/superlocalmemory/core/engine_wiring.py index a8d16aee..22004bc6 100644 --- a/src/superlocalmemory/core/engine_wiring.py +++ b/src/superlocalmemory/core/engine_wiring.py @@ -331,9 +331,9 @@ def _init_vector_store(config: SLMConfig) -> Any | None: if vs.available: logger.info("VectorStore initialized (sqlite-vec KNN enabled)") return vs - logger.debug("VectorStore unavailable; using ANNIndex fallback") + logger.warning("VectorStore unavailable; using ANNIndex fallback") except Exception as exc: - logger.debug("VectorStore init failed: %s", exc) + logger.warning("VectorStore init failed: %s", exc) return None diff --git a/src/superlocalmemory/optimize/compress/prose_llmlingua.py b/src/superlocalmemory/optimize/compress/prose_llmlingua.py index c0cda43d..db84411a 100644 --- a/src/superlocalmemory/optimize/compress/prose_llmlingua.py +++ b/src/superlocalmemory/optimize/compress/prose_llmlingua.py @@ -18,8 +18,11 @@ from __future__ import annotations import logging +from importlib.metadata import PackageNotFoundError, version from typing import Any +from packaging.version import InvalidVersion, Version + logger = logging.getLogger("slm.optimize.compress.llmlingua") _DEFAULT_RATE: float = 0.5 @@ -27,6 +30,28 @@ _MODEL_XLM: str = "microsoft/llmlingua-2-xlm-roberta-large-meetingbank" +# Empty until an upstream patched release has been independently reviewed. +_REVIEWED_NLTK_VERSIONS: frozenset[str] = frozenset() + + +def backend_restriction() -> str | None: + """Check metadata only; never import model code or download a model.""" + try: + installed = Version(version("nltk")) + except (PackageNotFoundError, InvalidVersion): + return "Optional LLMLingua backend unavailable: NLTK safety version cannot be verified." + if ( + installed.is_prerelease + or installed.is_devrelease + or str(installed) not in _REVIEWED_NLTK_VERSIONS + ): + return ( + "Optional LLMLingua backend restricted pending a reviewed NLTK fix " + "for GHSA-8mgp-746c-j5xp. Default/lossless compression remains available." + ) + return None + + class LLMLinguaCompressor: """Opt-in LLMLingua-2 prose compressor.""" @@ -36,11 +61,15 @@ def __init__( device_map: str = "cpu", rate: float = _DEFAULT_RATE, ) -> None: + restriction = backend_restriction() + if restriction is not None: + raise ImportError(restriction) try: from llmlingua import PromptCompressor # type: ignore[import] except ImportError as e: raise ImportError( - "llmlingua package not installed. Install: pip install llmlingua." + "LLMLingua backend is not shipped while its NLTK dependency has an " + "unpatched High advisory. Default/lossless compression remains available." ) from e logger.info("Loading LLMLingua-2 model=%s device=%s", model_name, device_map) diff --git a/src/superlocalmemory/optimize/compress/router.py b/src/superlocalmemory/optimize/compress/router.py index 3c415386..6c9983be 100644 --- a/src/superlocalmemory/optimize/compress/router.py +++ b/src/superlocalmemory/optimize/compress/router.py @@ -369,8 +369,8 @@ def _get_llmlingua_compressor(self) -> "LLMLinguaCompressor | None": # pragma: try: from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor self._llmlingua_compressor = LLMLinguaCompressor() - except ImportError: - logger.warning("LLMLinguaCompressor not available — prose compression disabled") + except ImportError as exc: + logger.warning("LLMLinguaCompressor unavailable — using lossless compression: %s", exc) return None return self._llmlingua_compressor diff --git a/src/superlocalmemory/retrieval/vector_store.py b/src/superlocalmemory/retrieval/vector_store.py index 99ac86db..3fea66a6 100644 --- a/src/superlocalmemory/retrieval/vector_store.py +++ b/src/superlocalmemory/retrieval/vector_store.py @@ -243,7 +243,7 @@ def _ensure_vec0_table(self) -> None: conn.execute(row_map_idx) conn.commit() except Exception as exc: - logger.debug("vec0 table creation failed: %s", exc) + logger.warning("vec0 table creation failed: %s", exc) self._available = False # -- Serialization ------------------------------------------------------ diff --git a/src/superlocalmemory/storage/backup.py b/src/superlocalmemory/storage/backup.py index 3aaa1045..fdd2c640 100644 --- a/src/superlocalmemory/storage/backup.py +++ b/src/superlocalmemory/storage/backup.py @@ -206,7 +206,9 @@ def _backup_via_sqlite_api(src: Path, dest: Path) -> None: # Verify and durably flush BEFORE the rename, so the final name never # appears over incomplete or corrupt content. try: - fd = os.open(str(staging), os.O_RDONLY) + # Windows durable flush requires write access. This is our temporary + # snapshot, not the source database; do not suppress a failed flush. + fd = os.open(str(staging), os.O_RDWR | getattr(os, "O_BINARY", 0)) try: os.fsync(fd) finally: diff --git a/tests/docs/test_readme_wp13.py b/tests/docs/test_readme_wp13.py index 506fb109..4ca8559b 100644 --- a/tests/docs/test_readme_wp13.py +++ b/tests/docs/test_readme_wp13.py @@ -8,7 +8,6 @@ from __future__ import annotations import re -import os import tomllib from pathlib import Path @@ -94,9 +93,7 @@ def _gh_slug(heading: str) -> str: def test_line_count_le_720(): """AC1: README must be ≤720 lines (was 953).""" lines = _readme_lines() - assert len(lines) <= 720, ( - f"README has {len(lines)} lines — hard ceiling is 720 (LLD AC1)." - ) + assert len(lines) <= 720, f"README has {len(lines)} lines — hard ceiling is 720 (LLD AC1)." # --------------------------------------------------------------------------- @@ -109,9 +106,7 @@ def test_single_quick_start(): text = _readme_text() h2_matches = re.findall(r"^## Quick Start", text, re.MULTILINE) h3_matches = re.findall(r"^### Quick Start", text, re.MULTILINE) - assert len(h2_matches) == 1, ( - f"Expected exactly 1 '## Quick Start', found {len(h2_matches)}." - ) + assert len(h2_matches) == 1, f"Expected exactly 1 '## Quick Start', found {len(h2_matches)}." assert len(h3_matches) == 0, ( f"Expected zero '### Quick Start', found {len(h3_matches)} " "(duplicate accordion Quick Start must be deleted — LLD AC2)." @@ -140,15 +135,21 @@ def test_current_version_in_hero(): assert current_version in text, ( f"README must contain current project version {current_version!r} (LLD AC3)." ) - # h1 check — first heading - lines = _readme_lines() - h1_lines = [l for l in lines if l.startswith("# ") or l.startswith("SuperLocalMemory — local-first memory for AI agents' in text + assert f'alt="v{current_version} — Current Release"' in text + + +def test_current_release_badge_rejects_a_stale_version(monkeypatch): + current = _project_version() + text = _readme_text().replace( + f'alt="v{current} — Current Release"', 'alt="v0.0.0 — Current Release"' + ) + monkeypatch.setattr( + __import__(__name__, fromlist=["_readme_text"]), "_readme_text", lambda: text ) + with pytest.raises(AssertionError): + test_current_version_in_hero() # --------------------------------------------------------------------------- @@ -206,9 +207,7 @@ def test_internal_links_resolve(): if not full_path.exists(): broken.append(rel_path) - assert not broken, ( - f"Broken internal links found: {broken} (LLD AC5 — resolve or remove)." - ) + assert not broken, f"Broken internal links found: {broken} (LLD AC5 — resolve or remove)." # --------------------------------------------------------------------------- @@ -252,8 +251,7 @@ def test_evidence_safe_positioning_near_hero(): "carried into the release (LLD AC7)." ) assert "not a claim of a newly rerun v4 package benchmark" in opening, ( - "Opening copy must preserve the protocol boundary of the published evidence " - "(LLD AC7)." + "Opening copy must preserve the protocol boundary of the published evidence (LLD AC7)." ) assert "different products solve different boundaries" in opening, ( "Opening copy must frame the comparison by product boundary, not an " @@ -274,7 +272,8 @@ def test_four_install_paths(): "npm i -g superlocalmemory" in text or "npm install -g superlocalmemory" in text ), "pip install superlocalmemory": "pip install superlocalmemory" in text, - "/plugin install superlocalmemory@qualixar": "/plugin install superlocalmemory@qualixar" in text, + "/plugin install superlocalmemory@qualixar": "/plugin install superlocalmemory@qualixar" + in text, "slm connect": "slm connect" in text, "slm wrap claude": "slm wrap claude" in text, } @@ -306,7 +305,7 @@ def test_claim_audit_dropped_absent(): def test_section_order(): - """LLD §6: Why SLM < Quick Start < Three Pillars < Papers (no Support-before-Why regressions).""" + """Preserve Why SLM < Quick Start < Three Pillars < Papers section order.""" text = _readme_text() positions: dict[str, int] = {} # Use first match position for each section diff --git a/tests/optimize/compress/test_backend_security.py b/tests/optimize/compress/test_backend_security.py new file mode 100644 index 00000000..62fa028b --- /dev/null +++ b/tests/optimize/compress/test_backend_security.py @@ -0,0 +1,61 @@ +"""Known affected NLTK installations must not activate the optional backend.""" + +from importlib.metadata import PackageNotFoundError +from unittest.mock import MagicMock, patch + +import pytest + +from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + + +@pytest.mark.parametrize( + "installed", + [ + "3.9.4", + "3.10.0", + "3.10.3", + "3.10.4rc1", + "3.10.3.0", + "3.10.3.1", + "3.10.3.post1", + "3.10.3+local", + "1!3.10.3", + "3.10.4", + "unknown", + ], +) +def test_affected_or_unknown_nltk_is_blocked_before_backend_import(installed: str) -> None: + backend = MagicMock() + with ( + patch( + "superlocalmemory.optimize.compress.prose_llmlingua.version", + return_value=installed, + create=True, + ), + patch.dict("sys.modules", {"llmlingua": backend}), + ): + with pytest.raises(ImportError): + LLMLinguaCompressor() + backend.PromptCompressor.assert_not_called() + + +def test_missing_nltk_keeps_backend_unavailable() -> None: + with ( + patch( + "superlocalmemory.optimize.compress.prose_llmlingua.version", + side_effect=PackageNotFoundError("nltk"), + create=True, + ), + patch.dict("sys.modules", {"llmlingua": MagicMock()}), + ): + with pytest.raises(ImportError): + LLMLinguaCompressor() + + +def test_readiness_does_not_recommend_installing_restricted_backend() -> None: + from superlocalmemory.core.component_registry import probe_llmlingua + + result = probe_llmlingua() + assert result.status != "ok" + assert result.auto_fixable is False + assert not result.fix_cmd diff --git a/tests/optimize/compress/test_prose_llmlingua.py b/tests/optimize/compress/test_prose_llmlingua.py index 3069f46a..ccc0ecc0 100644 --- a/tests/optimize/compress/test_prose_llmlingua.py +++ b/tests/optimize/compress/test_prose_llmlingua.py @@ -8,8 +8,8 @@ # Skip if HF download is blocked in CI to avoid multi-GB downloads. # Set LLMLINGUA_INTEGRATION=1 locally to run live. requires_llmlingua = pytest.mark.skipif( - os.environ.get('LLMLINGUA_INTEGRATION') != '1', - reason='Set LLMLINGUA_INTEGRATION=1 to run live LLMLingua-2 tests', + os.environ.get("LLMLINGUA_INTEGRATION") != "1", + reason="Set LLMLINGUA_INTEGRATION=1 to run live LLMLingua-2 tests", ) @@ -17,19 +17,20 @@ def test_basic_compression_reduces_length() -> None: """LLMLinguaCompressor.compress() returns a shorter string for long prose.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + compressor = LLMLinguaCompressor() long_prose = ( - 'The capital of France is Paris. Paris is a large city. ' - 'It is located in western Europe. The Eiffel Tower is a famous landmark. ' - 'Many tourists visit Paris every year for its art, culture and cuisine. ' - 'The city is divided into arrondissements. The Seine river flows through it. ' - 'Paris hosted the Olympics in 1900 and 1924 and again in 2024.' + "The capital of France is Paris. Paris is a large city. " + "It is located in western Europe. The Eiffel Tower is a famous landmark. " + "Many tourists visit Paris every year for its art, culture and cuisine. " + "The city is divided into arrondissements. The Seine river flows through it. " + "Paris hosted the Olympics in 1900 and 1924 and again in 2024." ) compressed = compressor.compress(long_prose) assert isinstance(compressed, str) assert len(compressed) > 0 assert len(compressed) <= len(long_prose), ( - f'Expected compression, got expansion: {len(compressed)} > {len(long_prose)}' + f"Expected compression, got expansion: {len(compressed)} > {len(long_prose)}" ) @@ -37,14 +38,15 @@ def test_basic_compression_reduces_length() -> None: def test_rate_parameter_override_produces_shorter_output() -> None: """Passing a lower rate should produce more aggressive compression.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + compressor = LLMLinguaCompressor(rate=0.7) prose = ( - 'The mitochondria is the powerhouse of the cell. ' - 'It produces ATP via oxidative phosphorylation. ' - 'The inner membrane has cristae that increase surface area. ' - 'Electrons pass through the electron transport chain releasing energy.' + "The mitochondria is the powerhouse of the cell. " + "It produces ATP via oxidative phosphorylation. " + "The inner membrane has cristae that increase surface area. " + "Electrons pass through the electron transport chain releasing energy." ) - out_default = compressor.compress(prose) # uses default rate 0.7 + out_default = compressor.compress(prose) # uses default rate 0.7 out_aggressive = compressor.compress(prose, rate=0.3) # override to 0.3 # Both must be valid strings; aggressive should be shorter or equal assert isinstance(out_default, str) and len(out_default) > 0 @@ -55,15 +57,17 @@ def test_rate_parameter_override_produces_shorter_output() -> None: def test_empty_input_returns_original() -> None: """Empty string must not raise — fail-open returns original empty string.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + compressor = LLMLinguaCompressor() - result = compressor.compress('') - assert result == '', f'Expected empty string passthrough, got {result!r}' + result = compressor.compress("") + assert result == "", f"Expected empty string passthrough, got {result!r}" def test_default_model_is_xlm_roberta() -> None: """Default model must be xlm-roberta-large (compulsory per LOCKED DECISION).""" from superlocalmemory.optimize.compress.prose_llmlingua import _MODEL_XLM, LLMLinguaCompressor import inspect + sig = inspect.signature(LLMLinguaCompressor.__init__) default = sig.parameters["model_name"].default assert default == _MODEL_XLM, ( @@ -75,32 +79,34 @@ def test_default_model_is_xlm_roberta() -> None: def test_compress_fail_open_when_compressor_raises() -> None: """If compress_prompt raises, fail-open returns the original text.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + # Construct without hitting HF by injecting a fake _compressor instance = object.__new__(LLMLinguaCompressor) instance._rate = 0.5 class _BrokenCompressor: def compress_prompt(self, *a, **kw): - raise RuntimeError('GPU OOM') + raise RuntimeError("GPU OOM") instance._compressor = _BrokenCompressor() - original = 'This is original text that should come back unchanged.' + original = "This is original text that should come back unchanged." result = instance.compress(original) - assert result == original, f'Expected passthrough on error, got {result!r}' + assert result == original, f"Expected passthrough on error, got {result!r}" def test_compress_passthrough_when_compressed_prompt_empty() -> None: """compressed_prompt == '' triggers the guard on line 71-73 — returns original.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + instance = object.__new__(LLMLinguaCompressor) instance._rate = 0.5 class _EmptyCompressor: def compress_prompt(self, *a, **kw): - return {'compressed_prompt': ''} + return {"compressed_prompt": ""} instance._compressor = _EmptyCompressor() - original = 'The original text' + original = "The original text" result = instance.compress(original) assert result == original @@ -108,21 +114,23 @@ def compress_prompt(self, *a, **kw): def test_compress_passthrough_when_compressed_prompt_non_string() -> None: """compressed_prompt of non-str type triggers the guard on line 71-73.""" from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + instance = object.__new__(LLMLinguaCompressor) instance._rate = 0.5 class _NonStrCompressor: def compress_prompt(self, *a, **kw): - return {'compressed_prompt': 42} + return {"compressed_prompt": 42} instance._compressor = _NonStrCompressor() - original = 'Original text here' + original = "Original text here" result = instance.compress(original) assert result == original # ---- mocked constructor path (covers lines 45-59) ---- + def test_constructor_with_mocked_llmlingua_import(monkeypatch) -> None: """Mock llmlingua.PromptCompressor to cover constructor lines 45-59.""" from unittest.mock import MagicMock, patch @@ -135,15 +143,23 @@ def test_constructor_with_mocked_llmlingua_import(monkeypatch) -> None: fake_llmlingua = MagicMock() fake_llmlingua.PromptCompressor = fake_compressor_class - with patch.dict(sys.modules, {'llmlingua': fake_llmlingua}): + with ( + patch.dict(sys.modules, {"llmlingua": fake_llmlingua}), + patch("superlocalmemory.optimize.compress.prose_llmlingua.version", return_value="3.10.4"), + patch( + "superlocalmemory.optimize.compress.prose_llmlingua._REVIEWED_NLTK_VERSIONS", + frozenset({"3.10.4"}), + ), + ): from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + comp = LLMLinguaCompressor() assert comp._compressor is fake_compressor_instance assert comp._rate == 0.5 fake_compressor_class.assert_called_once_with( - model_name='microsoft/llmlingua-2-xlm-roberta-large-meetingbank', + model_name="microsoft/llmlingua-2-xlm-roberta-large-meetingbank", use_llmlingua2=True, - device_map='cpu', + device_map="cpu", ) @@ -153,15 +169,21 @@ def test_compress_successful_path_returns_compressed(monkeypatch) -> None: import sys fake_compressor = MagicMock() - fake_compressor.compress_prompt.return_value = { - 'compressed_prompt': 'compressed result text' - } + fake_compressor.compress_prompt.return_value = {"compressed_prompt": "compressed result text"} fake_compressor_class = MagicMock(return_value=fake_compressor) fake_llmlingua = MagicMock() fake_llmlingua.PromptCompressor = fake_compressor_class - with patch.dict(sys.modules, {'llmlingua': fake_llmlingua}): + with ( + patch.dict(sys.modules, {"llmlingua": fake_llmlingua}), + patch("superlocalmemory.optimize.compress.prose_llmlingua.version", return_value="3.10.4"), + patch( + "superlocalmemory.optimize.compress.prose_llmlingua._REVIEWED_NLTK_VERSIONS", + frozenset({"3.10.4"}), + ), + ): from superlocalmemory.optimize.compress.prose_llmlingua import LLMLinguaCompressor + comp = LLMLinguaCompressor() - result = comp.compress('some long text to compress') - assert result == 'compressed result text' + result = comp.compress("some long text to compress") + assert result == "compressed result text" diff --git a/tests/optimize/metrics/test_estimator.py b/tests/optimize/metrics/test_estimator.py index c1975d35..b7a8f3cc 100644 --- a/tests/optimize/metrics/test_estimator.py +++ b/tests/optimize/metrics/test_estimator.py @@ -2,6 +2,8 @@ # Licensed under AGPL-3.0-or-later """Tests for SavingsEstimator (optimize/metrics/estimator.py).""" +from datetime import date, timedelta + import pytest from superlocalmemory.optimize.metrics.estimator import SavingsEstimator @@ -54,7 +56,16 @@ def test_estimate_unknown_provider_falls_back(): assert result["usd"] == 3.00 # anthropic fallback -def test_is_stale(): - est = SavingsEstimator() - # Pricing date is 2026-06-07, so it's not stale yet - assert est._is_stale() is False +@pytest.mark.parametrize("age, expected", [(0, False), (90, False), (91, True)]) +def test_is_stale(monkeypatch, age, expected): + from superlocalmemory.optimize.metrics import estimator + + table_date = date.fromisoformat(SavingsEstimator._PRICING_DATE) + + class ClockDate(date): + @classmethod + def today(cls): + return table_date + timedelta(days=age) + + monkeypatch.setattr(estimator, "date", ClockDate) + assert SavingsEstimator()._is_stale() is expected diff --git a/tests/release/test_testclient_dependency.py b/tests/release/test_testclient_dependency.py index 1f494c28..3fcbefe3 100644 --- a/tests/release/test_testclient_dependency.py +++ b/tests/release/test_testclient_dependency.py @@ -7,9 +7,8 @@ import tomllib from pathlib import Path - ROOT = Path(__file__).resolve().parents[2] -HTTPX2_PIN = "httpx2==2.5.0" +HTTPX2_PIN = "httpx2==2.13.1" def test_httpx2_is_pinned_in_both_developer_dependency_surfaces() -> None: diff --git a/tests/test_plugin/test_hermes_plugin.py b/tests/test_plugin/test_hermes_plugin.py index c68675b4..cc231d8f 100644 --- a/tests/test_plugin/test_hermes_plugin.py +++ b/tests/test_plugin/test_hermes_plugin.py @@ -2,15 +2,14 @@ from __future__ import annotations -import json import importlib.util +import json import pathlib import re import subprocess import sys import types - REPO = pathlib.Path(__file__).resolve().parents[2] PLUGIN = REPO / "hermes-plugin" @@ -62,10 +61,10 @@ def test_inventory_matches_the_real_slm_parser_tree() -> None: """A CLI addition cannot ship without Hermes reachability.""" inventory = json.loads((PLUGIN / "command-inventory.json").read_text(encoding="utf-8")) result = subprocess.run( - [str(REPO / ".venv" / "bin" / "slm"), "--help"], + [sys.executable, "-c", "from superlocalmemory.cli.main import main; main()", "--help"], text=True, capture_output=True, check=True, timeout=30, ) - match = re.search(r"\{([^}]+)\} \.\.\.", result.stdout) + match = re.search(r"\{([^}]+)\}\s+\.\.\.", result.stdout) assert match, result.stdout[:500] parser_commands = set(match.group(1).split(",")) expected = set(inventory["primary_commands"]) | set(inventory["aliases"]) diff --git a/tests/test_storage/test_backup_flush_portability.py b/tests/test_storage/test_backup_flush_portability.py new file mode 100644 index 00000000..d96a8d02 --- /dev/null +++ b/tests/test_storage/test_backup_flush_portability.py @@ -0,0 +1,64 @@ +"""Windows durability needs a write-capable staging descriptor, not ignored errors.""" + +from __future__ import annotations + +import errno +import os +import sqlite3 +from pathlib import Path + +import pytest + +from superlocalmemory.storage import backup + + +def _source(path: Path) -> None: + with sqlite3.connect(path) as conn: + conn.execute("CREATE TABLE proof(value TEXT)") + conn.execute("INSERT INTO proof VALUES ('synthetic snapshot')") + + +def test_snapshot_flush_uses_write_capable_descriptor(tmp_path, monkeypatch) -> None: + source = tmp_path / "source.db" + target = tmp_path / "snapshot.db" + _source(source) + original = source.read_bytes() + real_open, real_fsync = os.open, os.fsync + flags_by_fd: dict[int, int] = {} + flushed: list[int] = [] + + def opened(path, flags, *args, **kwargs): + fd = real_open(path, flags, *args, **kwargs) + flags_by_fd[fd] = flags + return fd + + def windows_flush(fd): + if flags_by_fd.get(fd, 0) & os.O_RDWR != os.O_RDWR: + raise OSError(errno.EBADF, "Windows requires write access to flush") + flushed.append(fd) + return real_fsync(fd) + + monkeypatch.setattr(backup.os, "open", opened) + monkeypatch.setattr(backup.os, "fsync", windows_flush) + backup._backup_via_sqlite_api(source, target) + assert flushed + assert source.read_bytes() == original + with sqlite3.connect(target) as conn: + assert conn.execute("SELECT value FROM proof").fetchone()[0] == "synthetic snapshot" + assert not target.with_name(target.name + ".partial").exists() + + +def test_flush_failure_cannot_publish_snapshot(tmp_path, monkeypatch) -> None: + source = tmp_path / "source.db" + target = tmp_path / "snapshot.db" + _source(source) + original = source.read_bytes() + + def failed(fd): + raise OSError(errno.EIO, "synthetic durable flush failure") + + monkeypatch.setattr(backup.os, "fsync", failed) + with pytest.raises(OSError): + backup._backup_via_sqlite_api(source, target) + assert not target.exists() + assert source.read_bytes() == original diff --git a/tests/test_version_consistency.py b/tests/test_version_consistency.py index a3e0987d..079d70d1 100644 --- a/tests/test_version_consistency.py +++ b/tests/test_version_consistency.py @@ -207,6 +207,6 @@ def test_packaging_uses_pep639_license_metadata() -> None: for classifier in metadata["project"]["classifiers"] ) assert any( - requirement.startswith("setuptools>=77.0.3") + requirement.startswith("setuptools>=83.0.0") for requirement in metadata["build-system"]["requires"] ) diff --git a/uv.lock b/uv.lock index cc65ef0e..ced641a1 100644 --- a/uv.lock +++ b/uv.lock @@ -4,12 +4,13 @@ requires-python = ">=3.11, <3.15" resolution-markers = [ "python_full_version >= '3.14'", "python_full_version == '3.13.*'", - "python_full_version < '3.13'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "(python_full_version < '3.13' and sys_platform != 'emscripten') or (python_full_version < '3.12' and sys_platform == 'emscripten')", ] [[package]] name = "accelerate" -version = "1.14.0" +version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -20,9 +21,9 @@ dependencies = [ { name = "safetensors" }, { name = "torch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/75/94cd5d389649578aca399e5aa822637eec18319a1dadc400ffe2f9a7493f/accelerate-1.14.0.tar.gz", hash = "sha256:41b9c4377a54e0b460a959b0defa1b736e4ca0a2373252d9a539964c2afe3c8d", size = 412167, upload-time = "2026-06-11T13:45:52.326Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/b5/1d3ed029ac71d3f2961346829a268da923698e9fd63f218f78841f216bfd/accelerate-1.15.0.tar.gz", hash = "sha256:5654f8c5eaa0d4fa68b33e287a97765da6849bf6d51dcac874e73fbbddfb6134", size = 422615, upload-time = "2026-09-09T13:04:49.078Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/db/253133d7e7cb40d3af384bb2f5c0b4a2b7fdcffbc95c688cc67a20a3c103/accelerate-1.14.0-py3-none-any.whl", hash = "sha256:e94390c2863b873be18f623f9df48a0d8fe5eff13ea7f1a00092b0a7904888c6", size = 389246, upload-time = "2026-06-11T13:45:50.477Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/34f0450479d01195027260da68d8a3880683f1640c3ca5adf64acb3185f1/accelerate-1.15.0-py3-none-any.whl", hash = "sha256:97eacca0b73e45cb867dbf8c5d5d4dc32219544300e0c8992c7334dc2ef33cec", size = 394295, upload-time = "2026-09-09T13:04:47.331Z" }, ] [[package]] @@ -45,15 +46,15 @@ wheels = [ [[package]] name = "anyio" -version = "4.13.0" +version = "4.14.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/cc/a381afa6efea9f496eff839d4a6a1aed3bfafc7b3ab4b0d1b243a12573dd/anyio-4.14.2.tar.gz", hash = "sha256:cfa139f3ed1a23ee8f88a145ddb5ac7605b8bbfd8592baacd7ce3d8bb4313c7f", size = 260176, upload-time = "2026-07-12T20:29:07.082Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/da/35/f2287558c17e29fafc8ef3daf819bb9834061cfa43bff8014f7df7f63bdc/anyio-4.14.2-py3-none-any.whl", hash = "sha256:9f505dda5ac9f0c8309b5e8bd445a8c2bf7246f3ce950121e45ea15bc41d1494", size = 125813, upload-time = "2026-07-12T20:29:05.763Z" }, ] [[package]] @@ -453,7 +454,7 @@ name = "cuda-bindings" version = "13.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cuda-pathfinder" }, + { name = "cuda-pathfinder", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/e0/a9/3a8241c6e19483ac1f1dcf5c10238205dcb8a6e9d0d4d4709240dff28ff4/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:721104c603f059780d287969be3d194a18d0cc3b713ed9049065a1107706759d", size = 5730273, upload-time = "2026-03-11T00:12:37.18Z" }, @@ -478,54 +479,51 @@ wheels = [ [[package]] name = "cuda-toolkit" -version = "13.0.2" +version = "13.0.3.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c7/a79086a62c98befcdb8349656c6f114e2db3b8b2422f6e25c97a7f2a9a3c/cuda_toolkit-13.0.3.0-py2.py3-none-any.whl", hash = "sha256:d693caaa261214ddd7dbb60d68e71cbed884e68c2be7509778f3051da0b91c3f", size = 2512, upload-time = "2026-04-14T00:50:08.173Z" }, ] [package.optional-dependencies] cublas = [ - { name = "nvidia-cublas", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cudart = [ - { name = "nvidia-cuda-runtime", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-runtime", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cufft = [ - { name = "nvidia-cufft", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cufft", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cufile = [ - { name = "nvidia-cufile", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufile", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, ] cupti = [ - { name = "nvidia-cuda-cupti", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-cupti", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] curand = [ - { name = "nvidia-curand", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-curand", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cusolver = [ - { name = "nvidia-cusolver", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cublas", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusolver", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] cusparse = [ - { name = "nvidia-cusparse", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cusparse", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvjitlink = [ - { name = "nvidia-nvjitlink", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-nvjitlink", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvrtc = [ - { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "nvidia-cuda-nvrtc", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] nvtx = [ - { name = "nvidia-nvtx", marker = "sys_platform == 'linux' or sys_platform == 'win32'" }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, + { name = "nvidia-nvtx", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'AMD64' and sys_platform == 'win32')" }, ] [[package]] @@ -915,27 +913,27 @@ wheels = [ [[package]] name = "httpcore2" -version = "2.5.0" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "h11" }, { name = "truststore" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/47/06/5c12df521b5322fb1114a83d46911b2fbcb8855ddb3a635f11c01a214af5/httpcore2-2.5.0.tar.gz", hash = "sha256:88aa170137c17328d5ac44234f9fd10706466d5fb347f3edac4d39b91137b09d", size = 64808, upload-time = "2026-06-25T14:16:56.472Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/f3/1db7aa2bc2524062192bb0e0323969492d1883152a232fe36eea65f4e35c/httpcore2-2.13.1.tar.gz", hash = "sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103", size = 68071, upload-time = "2026-09-23T07:47:22.372Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/a1/7564199d1a8728fe737b0a72e5b3f8d92dfe085a74ddf7cdd83bce5f206d/httpcore2-2.5.0-py3-none-any.whl", hash = "sha256:5ce35188de461d31e8d000bfb8ef8bf22c6c16587a211e5571deaa5e9bdf842a", size = 80330, upload-time = "2026-06-25T14:16:53.634Z" }, + { url = "https://files.pythonhosted.org/packages/09/ba/a4568248771ce81957bfb7cc600264a40fbcda092391ee1c415c50be4bea/httpcore2-2.13.1-py3-none-any.whl", hash = "sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a", size = 83423, upload-time = "2026-09-23T07:47:19.365Z" }, ] [[package]] name = "httplib2" -version = "0.31.2" +version = "0.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/1f/e86365613582c027dda5ddb64e1010e57a3d53e99ab8a72093fa13d565ec/httplib2-0.31.2.tar.gz", hash = "sha256:385e0869d7397484f4eab426197a4c020b606edd43372492337c0b4010ae5d24", size = 250800, upload-time = "2026-01-23T11:04:44.165Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/f5/ccf58de92d61e3ad921119668f54ed36ca1d0cf5dcc5c1657dfb164fd78b/httplib2-0.32.0.tar.gz", hash = "sha256:48a0ef30a42db65d8f3399045e1d09ab0ba66e3b9efc360d07f80ea55d286025", size = 254283, upload-time = "2026-06-26T10:13:56.265Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/90/fd509079dfcab01102c0fdd87f3a9506894bc70afcf9e9785ef6b2b3aff6/httplib2-0.31.2-py3-none-any.whl", hash = "sha256:dbf0c2fa3862acf3c55c078ea9c0bc4481d7dc5117cae71be9514912cf9f8349", size = 91099, upload-time = "2026-01-23T11:04:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/33/a0/550eec327e5f5c7b732531c489f5307efec41f047b0d703bd4ca1e5ad2db/httplib2-0.32.0-py3-none-any.whl", hash = "sha256:dc6705cacdf3fb0a2aba7629fa33c90fd93e30035db0c157325826be177e4816", size = 93148, upload-time = "2026-06-26T10:13:54.985Z" }, ] [[package]] @@ -991,18 +989,28 @@ wheels = [ [[package]] name = "httpx2" -version = "2.5.0" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, - { name = "httpcore2" }, + { name = "anyio", marker = "sys_platform != 'emscripten'" }, + { name = "httpcore2", marker = "sys_platform != 'emscripten'" }, + { name = "httpx2-jsfetch", marker = "python_full_version >= '3.12' and sys_platform == 'emscripten'" }, { name = "idna" }, - { name = "truststore" }, + { name = "truststore", marker = "sys_platform != 'emscripten'" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d0/e2/b5dedc0cf35aa65de5f541ccd30d2bc1fd7f1d43c9ab09f8ed9a7342317b/httpx2-2.5.0.tar.gz", hash = "sha256:e2df9cb4611021527ff8a675b1c320b610a2ec397acc8d6fe6e91df2d9b33c29", size = 83121, upload-time = "2026-06-25T14:16:57.491Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/44/474bef2a0e9d90f1715d32cb98b0738695ca17ba324095fb2497ed7fbd59/httpx2-2.13.1.tar.gz", hash = "sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa", size = 100405, upload-time = "2026-09-23T07:47:23.052Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/9c/6fe8931fd9f381042a9e4c7d5a7b4cbf7016b252bec0c99a49fce42c3326/httpx2-2.13.1-py3-none-any.whl", hash = "sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4", size = 95597, upload-time = "2026-09-23T07:47:20.995Z" }, +] + +[[package]] +name = "httpx2-jsfetch" +version = "1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/22/859d8252dad9bc9adee34b52e62cde621ece07b042ccb2ab4da1be46695f/httpx2-2.5.0-py3-none-any.whl", hash = "sha256:3d2d4d9cf4b61f1a1f46a95947cfdb47e80cb56a2f91c6256ac8f58e4891df41", size = 76652, upload-time = "2026-06-25T14:16:55.23Z" }, + { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" }, ] [[package]] @@ -1027,16 +1035,16 @@ wheels = [ [[package]] name = "icalendar" -version = "7.1.1" +version = "7.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/10/1b/f02e4d997f50d8274c877bbf4f7809e6b04216c4d0b859e6ac7f8566165a/icalendar-7.1.1.tar.gz", hash = "sha256:df80df31f57d345b68b2d07be579a24e8103f7b6555c548e8ef8246cb2353186", size = 469560, upload-time = "2026-05-18T11:11:25.188Z" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2b/1bbf82d316df18c3331d9a06228819c8a5814ceda545a3e9980e52ffce1b/icalendar-7.3.0.tar.gz", hash = "sha256:7bd001c8e648205e1bde5c6a5b77096598e8d0893dcf57755c6c597635620132", size = 525811, upload-time = "2026-08-19T15:10:21.05Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/86/33636ea5600a30f4674650f460903ca817d4aa0f3a5c655db1b5511fd6d6/icalendar-7.1.1-py3-none-any.whl", hash = "sha256:5e581b8376df7c66972edcf1597c99efc07011829f73df420c2648784c424b42", size = 472071, upload-time = "2026-05-18T11:11:23.904Z" }, + { url = "https://files.pythonhosted.org/packages/bb/82/50bff78b0bb0c7d7c0cb39e0ee189b92f611fff6bd7cf57f25e92d5a7551/icalendar-7.3.0-py3-none-any.whl", hash = "sha256:8355acfe17be81b368f0b1e3740817cea9b56ea889931f8f1a87c62f2d28db0b", size = 542540, upload-time = "2026-08-19T15:10:19.525Z" }, ] [[package]] @@ -1074,7 +1082,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp", marker = "python_full_version < '3.13'" }, + { name = "zipp", marker = "(python_full_version < '3.13' and sys_platform != 'emscripten') or (python_full_version < '3.12' and sys_platform == 'emscripten')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -1277,23 +1285,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5e/23/f8b28ca248bb629b9e08f877dd2965d1994e1674a03d67cd10c5246da248/lightgbm-4.6.0-py3-none-win_amd64.whl", hash = "sha256:37089ee95664b6550a7189d887dbf098e3eadab03537e411f52c63c121e3ba4b", size = 1451509, upload-time = "2025-02-15T04:03:01.515Z" }, ] -[[package]] -name = "llmlingua" -version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "accelerate" }, - { name = "nltk" }, - { name = "numpy" }, - { name = "tiktoken" }, - { name = "torch" }, - { name = "transformers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/02/7ed8ad9cec4b2f0a8a45c5b50a2435b559d2c764b5865e896d1c511080b1/llmlingua-0.2.2.tar.gz", hash = "sha256:1a0caedd8d5a65512a85dadb6bfda6f5b3c4b45e5cb9e7b1c6009573f9058572", size = 59753, upload-time = "2024-04-09T08:21:56.88Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/3e/221fe46a3338f2babdb2082ee42df88fcaa8ea0e639e832cbb1b93c5923a/llmlingua-0.2.2-py3-none-any.whl", hash = "sha256:da55137efe0db78063b3395396efe8a0dcfe4ae5a09aea0d503c34b7bf1d800c", size = 30536, upload-time = "2024-04-09T08:21:55.428Z" }, -] - [[package]] name = "markdown-it-py" version = "4.2.0" @@ -1488,22 +1479,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/80/7c/19cd0671d1ba2762fb388fc149697d20d0568ccfeef833b11280a619e526/nh3-0.3.5-cp38-abi3-win_arm64.whl", hash = "sha256:8f85285700a18e9f3fc5bff41fe573fa84f81542ef13b48a89f9fecca0474d3b", size = 611069, upload-time = "2026-04-25T10:44:14.934Z" }, ] -[[package]] -name = "nltk" -version = "3.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "defusedxml" }, - { name = "joblib" }, - { name = "regex" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/02/df4f105b28a7c16b0e41423bc09cf0f1b8a305df4ef0b10ca74a2e4c648c/nltk-3.10.0.tar.gz", hash = "sha256:4fbac1d98203cbcd1b5d94a2877fb822300072d80604a5e7fae49d2c5f84e8c1", size = 3089244, upload-time = "2026-07-08T02:39:13.562Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/89/a0b0f35e2820d6a99d75ea1c11977ee6d5c9e6658eceb45b0c7620881faa/nltk-3.10.0-py3-none-any.whl", hash = "sha256:54ff84d4916d3ef127e8953bee0023f6a6b320b75d634a19e06ef056d3d244bf", size = 1716144, upload-time = "2026-07-08T02:39:09.753Z" }, -] - [[package]] name = "numpy" version = "2.4.4" @@ -1585,11 +1560,14 @@ wheels = [ [[package]] name = "nvidia-cublas" -version = "13.1.0.3" +version = "13.1.1.3" source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cuda-nvrtc", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, +] wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/a5/fce49e2ae977e0ccc084e5adafceb4f0ac0c8333cb6863501618a7277f67/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c86fc7f7ae36d7528288c5d88098edcb7b02c633d262e7ddbb86b0ad91be5df2", size = 542851226, upload-time = "2025-10-09T08:59:04.818Z" }, - { url = "https://files.pythonhosted.org/packages/e7/44/423ac00af4dd95a5aeb27207e2c0d9b7118702149bf4704c3ddb55bb7429/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:ee8722c1f0145ab246bccb9e452153b5e0515fd094c3678df50b2a0888b8b171", size = 423133236, upload-time = "2025-10-09T08:59:32.536Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a1/0bd24ee8c8d03adac032fd2909426a00c88f8c57961b1277ded97f91119f/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b7a210458267ac818974c53038fbec2e969d5c99f305ab15c72522fa9f001dd5", size = 542848918, upload-time = "2026-04-08T18:46:22.985Z" }, + { url = "https://files.pythonhosted.org/packages/3b/cd/154ca20c38269e05eff77c1464e6c1da89f50a6390b565e9d82e06bc11e1/nvidia_cublas-13.1.1.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:37936a16db8fe4ac1f065c2139360608a543a09275cb1a1af612e08cfa065436", size = 423138758, upload-time = "2026-04-08T18:46:58.655Z" }, ] [[package]] @@ -1621,14 +1599,14 @@ wheels = [ [[package]] name = "nvidia-cudnn-cu13" -version = "9.19.0.56" +version = "9.20.0.48" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas" }, + { name = "nvidia-cublas", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/84/26025437c1e6b61a707442184fa0c03d083b661adf3a3eecfd6d21677740/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:6ed29ffaee1176c612daf442e4dd6cfeb6a0caa43ddcbeb59da94953030b1be4", size = 433781201, upload-time = "2026-02-03T20:40:53.805Z" }, - { url = "https://files.pythonhosted.org/packages/a3/22/0b4b932655d17a6da1b92fa92ab12844b053bb2ac2475e179ba6f043da1e/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:d20e1734305e9d68889a96e3f35094d733ff1f83932ebe462753973e53a572bf", size = 366066321, upload-time = "2026-02-03T20:44:52.837Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/83384d846b2fd17c44bd499b36c75a45ed4f095fbbb2252294e89cea5c5c/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:e31454ae00094b0c55319d9d15b6fa2fc50a9e1c0f5c8c80fb75258234e731e1", size = 444574296, upload-time = "2026-03-09T19:28:27.751Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/edb9c0ae051602c3ccaffe424256463636d639e27d7f302dde9975ef9e7a/nvidia_cudnn_cu13-9.20.0.48-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0c45dd8eeb50b603f07995b1b300c62ffe6a1980482b82b3bcf94a4ca9d49304", size = 366173588, upload-time = "2026-03-09T19:29:34.474Z" }, ] [[package]] @@ -1636,7 +1614,7 @@ name = "nvidia-cufft" version = "12.0.0.61" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink" }, + { name = "nvidia-nvjitlink", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, @@ -1666,9 +1644,9 @@ name = "nvidia-cusolver" version = "12.0.4.66" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas" }, - { name = "nvidia-cusparse" }, - { name = "nvidia-nvjitlink" }, + { name = "nvidia-cublas", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, + { name = "nvidia-cusparse", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, + { name = "nvidia-nvjitlink", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, @@ -1680,7 +1658,7 @@ name = "nvidia-cusparse" version = "12.6.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink" }, + { name = "nvidia-nvjitlink", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, @@ -1689,20 +1667,20 @@ wheels = [ [[package]] name = "nvidia-cusparselt-cu13" -version = "0.8.0" +version = "0.8.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/10/8dcd1175260706a2fc92a16a52e306b71d4c1ea0b0cc4a9484183399818a/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:400c6ed1cf6780fc6efedd64ec9f1345871767e6a1a0a552a1ea0578117ea77c", size = 220791277, upload-time = "2025-08-13T19:22:40.982Z" }, - { url = "https://files.pythonhosted.org/packages/fd/53/43b0d71f4e702fa9733f8b4571fdca50a8813f1e450b656c239beff12315/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25e30a8a7323935d4ad0340b95a0b69926eee755767e8e0b1cf8dd85b197d3fd", size = 169884119, upload-time = "2025-08-13T19:23:41.967Z" }, + { url = "https://files.pythonhosted.org/packages/46/e1/cdc1797eadf82d3a9a575a19b33fdc871a97edbec42c00b5b5e914f4aff4/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4dca476c50bf4780d46cd0bfbd82e2bc10a08e4fef7950917ce8d7578d22a23f", size = 221051344, upload-time = "2025-09-05T18:49:51.289Z" }, + { url = "https://files.pythonhosted.org/packages/34/7d/2661f2fb3ac4302f3a246f5fc030213ac60c1fe0bce84f9783dbd831dbb7/nvidia_cusparselt_cu13-0.8.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:786ce87568c303fadb5afcc7102d454cd3040d75f6f8626f5db460d1871f4dd0", size = 170148586, upload-time = "2025-09-05T18:50:50.248Z" }, ] [[package]] name = "nvidia-nccl-cu13" -version = "2.28.9" +version = "2.29.7" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/55/1920646a2e43ffd4fc958536b276197ed740e9e0c54105b4bb3521591fc7/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:01c873ba1626b54caa12272ed228dc5b2781545e0ae8ba3f432a8ef1c6d78643", size = 196561677, upload-time = "2025-11-18T05:49:03.45Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b4/878fefaad5b2bcc6fcf8d474a25e3e3774bc5133e4b58adff4d0bca238bc/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:e4553a30f34195f3fa1da02a6da3d6337d28f2003943aa0a3d247bbc25fefc42", size = 196493177, upload-time = "2025-11-18T05:49:17.677Z" }, + { url = "https://files.pythonhosted.org/packages/72/0d/daf50d44177ee0cbc7ff0a0c91eb5ff676c82be42f9a970bc7597f440c3a/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:674a12383e3c38a1bcccae7d4f3633b37852230b6047883cb2f4c2d1b36d9bf5", size = 206014712, upload-time = "2026-03-03T05:34:20.843Z" }, + { url = "https://files.pythonhosted.org/packages/67/f4/58e4e91b6919367c7aafb8e36fce9aad1a3047e536bf7e2fd560927d3a4c/nvidia_nccl_cu13-2.29.7-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:edd81538446786ec3b73972543e53bb43bcaf0bfc8ef76cb679fcc390ffe136d", size = 205976000, upload-time = "2026-03-03T05:36:24.472Z" }, ] [[package]] @@ -1734,11 +1712,11 @@ wheels = [ [[package]] name = "oauthlib" -version = "3.3.1" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/d8/a1bcc8ba112a627f8ffbdc212a78ce18d3ac07e91a5ca65d27918eee25a1/oauthlib-4.0.0.tar.gz", hash = "sha256:efb274799819440f95b4ab3b818869f1ce9ae26c5beacba0201d1a1b76b54f86", size = 187232, upload-time = "2026-09-28T06:01:18.77Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f4/78229a1066068ca14fc60fb26cf7381cabe4382261392b90e5f9552722d4/oauthlib-4.0.0-py3-none-any.whl", hash = "sha256:624c28c13a0a59cabf9747dfa52af63be3e512a7f2714df16e91b5b3a145e6cd", size = 159715, upload-time = "2026-09-28T06:01:17.008Z" }, ] [[package]] @@ -2014,11 +1992,11 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.3" +version = "0.6.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a4/9a/23310166d960def5897e91fe20e5b724601b02a22e84ba1f94232c0b7f67/pyasn1-0.6.4.tar.gz", hash = "sha256:9c447d8431c947fe4c8febc4ed9e760bc29011a5b01e5c74b67025bd9fb8ce81", size = 151262, upload-time = "2026-07-09T01:12:33.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3b/6163796d69c3977d1e4287bea4a6979161cbbdd170ebb430511e8e1999ce/pyasn1-0.6.4-py3-none-any.whl", hash = "sha256:deda9277cfd454080ec40b207fb6df82206a3a2688735233cdcd8d3d565f088b", size = 84410, upload-time = "2026-07-09T01:12:32.92Z" }, ] [[package]] @@ -2216,11 +2194,11 @@ wheels = [ [[package]] name = "pyjwt" -version = "2.13.0" +version = "2.15.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515, upload-time = "2026-05-21T19:54:36.618Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/ea/5194e52748b0da83d71e082d75496eaec6e58f419f5e184786ded517e6a9/pyjwt-2.15.1.tar.gz", hash = "sha256:4f259e80cdfb6b3fc18a7de51fd1ef9ec79652f25019bae68975ca2468a34df8", size = 121252, upload-time = "2026-09-28T18:40:42.598Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274, upload-time = "2026-05-21T19:54:35.362Z" }, + { url = "https://files.pythonhosted.org/packages/50/ca/44de4e75f8aadc457f0634be3b542815078ded46dca30efb960edeecad6e/pyjwt-2.15.1-py3-none-any.whl", hash = "sha256:42d59d631f7768a1028a64c7ff581a9bf7519804daf91fc5b6c56e30eec5e193", size = 33860, upload-time = "2026-09-28T18:40:41.429Z" }, ] [package.optional-dependencies] @@ -2997,8 +2975,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "jeepney" }, + { name = "cryptography", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, + { name = "jeepney", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -3007,7 +2985,7 @@ wheels = [ [[package]] name = "sentence-transformers" -version = "5.3.0" +version = "5.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -3019,9 +2997,9 @@ dependencies = [ { name = "transformers" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/26/448453925b6ce0c29d8b54327caa71ee4835511aef02070467402273079c/sentence_transformers-5.3.0.tar.gz", hash = "sha256:414a0a881f53a4df0e6cbace75f823bfcb6b94d674c42a384b498959b7c065e2", size = 403330, upload-time = "2026-03-12T14:53:40.778Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/56/d2cb00765a6b15c994a7fccf20f9032f16e8193ca49147cb5155166ad744/sentence_transformers-5.6.0.tar.gz", hash = "sha256:0e7164d051e416c1853ade7c274ff52af3f9da0f4be7f0b83d734c27699e1057", size = 453194, upload-time = "2026-06-16T14:01:56.42Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/9c/2fa7224058cad8df68d84bafee21716f30892cecc7ad1ad73bde61d23754/sentence_transformers-5.3.0-py3-none-any.whl", hash = "sha256:dca6b98db790274a68185d27a65801b58b4caf653a4e556b5f62827509347c7d", size = 512390, upload-time = "2026-03-12T14:53:39.035Z" }, + { url = "https://files.pythonhosted.org/packages/76/c1/dc1582b79e9a2eb0cddf9559cd9bcdff084f541d6fe881fdd9d98630dba7/sentence_transformers-5.6.0-py3-none-any.whl", hash = "sha256:d2075b5e687a1611005e20ab04a6846994d51adfcf39610aed066af3c0c0b81f", size = 596411, upload-time = "2026-06-16T14:01:55.103Z" }, ] [[package]] @@ -3039,11 +3017,11 @@ wheels = [ [[package]] name = "setuptools" -version = "81.0.0" +version = "84.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz", hash = "sha256:f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73", size = 1168449, upload-time = "2026-08-08T18:27:58.365Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", hash = "sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", size = 818216, upload-time = "2026-08-08T18:27:56.719Z" }, ] [[package]] @@ -3116,25 +3094,29 @@ name = "superlocalmemory" version = "4.1.17" source = { editable = "." } dependencies = [ + { name = "accelerate" }, + { name = "anyio" }, { name = "cryptography" }, { name = "einops" }, { name = "fastapi", extra = ["all"] }, + { name = "httpcore2" }, { name = "httpx" }, + { name = "httpx2" }, { name = "huggingface-hub" }, { name = "jsonschema" }, { name = "lancedb" }, { name = "lightgbm" }, - { name = "llmlingua" }, { name = "mcp" }, { name = "networkx" }, - { name = "nltk" }, { name = "numpy" }, { name = "onnxruntime" }, { name = "optimum" }, { name = "orjson" }, + { name = "packaging" }, { name = "portalocker" }, { name = "psutil" }, { name = "pycozo", extra = ["embedded"] }, + { name = "pyjwt" }, { name = "python-dateutil" }, { name = "pywin32", marker = "sys_platform == 'win32'" }, { name = "rank-bm25" }, @@ -3142,6 +3124,7 @@ dependencies = [ { name = "scikit-learn" }, { name = "scipy" }, { name = "sentence-transformers" }, + { name = "setuptools" }, { name = "sqlite-vec" }, { name = "structlog" }, { name = "tomli-w" }, @@ -3149,6 +3132,7 @@ dependencies = [ { name = "transformers" }, { name = "tree-sitter" }, { name = "tree-sitter-language-pack" }, + { name = "urllib3" }, { name = "uvicorn" }, { name = "vadersentiment" }, { name = "watchdog" }, @@ -3172,13 +3156,16 @@ full = [ { name = "fastapi", extra = ["all"] }, { name = "google-api-python-client" }, { name = "google-auth-oauthlib" }, + { name = "httplib2" }, { name = "icalendar" }, { name = "keyring" }, { name = "lancedb" }, { name = "lightgbm" }, + { name = "oauthlib" }, { name = "onnxruntime" }, { name = "optimum" }, { name = "orjson" }, + { name = "pyasn1" }, { name = "pycozo", extra = ["embedded"] }, { name = "python-multipart" }, { name = "scikit-learn" }, @@ -3190,8 +3177,11 @@ full = [ ingestion = [ { name = "google-api-python-client" }, { name = "google-auth-oauthlib" }, + { name = "httplib2" }, { name = "icalendar" }, { name = "keyring" }, + { name = "oauthlib" }, + { name = "pyasn1" }, ] injection = [ { name = "tiktoken" }, @@ -3235,6 +3225,8 @@ dev = [ [package.metadata] requires-dist = [ + { name = "accelerate", specifier = ">=1.15.0,<2" }, + { name = "anyio", specifier = "==4.14.2" }, { name = "cryptography", specifier = "==50.0.0" }, { name = "einops", specifier = "==0.8.2" }, { name = "einops", marker = "extra == 'search'", specifier = "==0.8.2" }, @@ -3242,10 +3234,13 @@ requires-dist = [ { name = "fastapi", extras = ["all"], marker = "extra == 'ui'", specifier = ">=0.135.1" }, { name = "google-api-python-client", marker = "extra == 'ingestion'", specifier = ">=2.100.0" }, { name = "google-auth-oauthlib", marker = "extra == 'ingestion'", specifier = ">=1.2.0" }, + { name = "httpcore2", specifier = ">=2.10.0,<3" }, + { name = "httplib2", marker = "extra == 'ingestion'", specifier = ">=0.32.0" }, { name = "httpx", specifier = "==0.28.1" }, - { name = "httpx2", marker = "extra == 'dev'", specifier = "==2.5.0" }, + { name = "httpx2", specifier = ">=2.12.0,<3" }, + { name = "httpx2", marker = "extra == 'dev'", specifier = "==2.13.1" }, { name = "huggingface-hub", specifier = "==1.5.0" }, - { name = "icalendar", marker = "extra == 'ingestion'", specifier = ">=6.0.0" }, + { name = "icalendar", marker = "extra == 'ingestion'", specifier = ">=7.1.3" }, { name = "jsonschema", specifier = "==4.26.0" }, { name = "keyring", marker = "extra == 'ingestion'", specifier = ">=25.0.0" }, { name = "lancedb", specifier = "==0.30.2" }, @@ -3253,22 +3248,24 @@ requires-dist = [ { name = "lancedb", marker = "extra == 'scale'", specifier = "==0.30.2" }, { name = "lightgbm", specifier = "==4.6.0" }, { name = "lightgbm", marker = "extra == 'learning'", specifier = ">=4.0.0" }, - { name = "llmlingua", specifier = "==0.2.2" }, { name = "mcp", specifier = "==2.0.0" }, { name = "networkx", specifier = "==3.6.1" }, - { name = "nltk", specifier = "==3.10.0" }, { name = "numpy", specifier = "==2.4.4" }, + { name = "oauthlib", marker = "extra == 'ingestion'", specifier = ">=4.0.0,<5" }, { name = "onnxruntime", specifier = "==1.24.4" }, { name = "onnxruntime", marker = "extra == 'search'", specifier = "==1.24.4" }, { name = "optimum", specifier = "==2.1.0" }, { name = "optimum", marker = "extra == 'search'", specifier = "==2.1.0" }, { name = "orjson", specifier = "==3.11.9" }, { name = "orjson", marker = "extra == 'performance'", specifier = ">=3.9.0" }, + { name = "packaging", specifier = ">=24.0" }, { name = "portalocker", specifier = "==3.2.0" }, { name = "psutil", specifier = "==7.2.2" }, + { name = "pyasn1", marker = "extra == 'ingestion'", specifier = ">=0.6.4" }, { name = "pycozo", extras = ["embedded"], specifier = "==0.3.0" }, { name = "pycozo", extras = ["embedded"], marker = "extra == 'cozo'", specifier = "==0.3.0" }, { name = "pycozo", extras = ["embedded"], marker = "extra == 'scale'", specifier = "==0.3.0" }, + { name = "pyjwt", specifier = ">=2.15.1,<3" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.1" }, @@ -3280,19 +3277,21 @@ requires-dist = [ { name = "scikit-learn", specifier = "==1.8.0" }, { name = "scikit-learn", marker = "extra == 'search'", specifier = "==1.8.0" }, { name = "scipy", specifier = "==1.17.1" }, - { name = "sentence-transformers", specifier = "==5.3.0" }, - { name = "sentence-transformers", marker = "extra == 'search'", specifier = "==5.3.0" }, + { name = "sentence-transformers", specifier = "==5.6.0" }, + { name = "sentence-transformers", marker = "extra == 'search'", specifier = "==5.6.0" }, + { name = "setuptools", specifier = ">=83.0.0" }, { name = "sqlite-vec", specifier = "==0.1.9" }, { name = "sqlite-vec", marker = "extra == 'dev'", specifier = ">=0.1.6" }, { name = "structlog", specifier = "==25.5.0" }, { name = "superlocalmemory", extras = ["search", "ui", "learning", "performance", "ingestion", "injection", "scale"], marker = "extra == 'full'" }, { name = "tiktoken", marker = "extra == 'injection'", specifier = ">=0.8.0" }, { name = "tomli-w", specifier = "==1.2.0" }, - { name = "torch", specifier = "==2.11.0" }, - { name = "torch", marker = "extra == 'search'", specifier = "==2.11.0" }, - { name = "transformers", specifier = "==5.5.4" }, + { name = "torch", specifier = "==2.13.0" }, + { name = "torch", marker = "extra == 'search'", specifier = "==2.13.0" }, + { name = "transformers", specifier = "==5.10.1" }, { name = "tree-sitter", specifier = "==0.25.2" }, { name = "tree-sitter-language-pack", specifier = "==0.13.0" }, + { name = "urllib3", specifier = ">=2.8.0,<3" }, { name = "uvicorn", specifier = "==0.46.0" }, { name = "uvicorn", marker = "extra == 'ui'", specifier = ">=0.42.0" }, { name = "vadersentiment", specifier = "==3.3.2" }, @@ -3305,7 +3304,7 @@ provides-extras = ["search", "ui", "injection", "learning", "performance", "lanc [package.metadata.requires-dev] dev = [ { name = "build", specifier = ">=1.4.0" }, - { name = "httpx2", specifier = "==2.5.0" }, + { name = "httpx2", specifier = "==2.13.1" }, { name = "pytest", specifier = ">=9.0.2" }, { name = "pytest-asyncio", specifier = ">=0.21" }, { name = "twine", specifier = ">=6.2.0" }, @@ -3478,7 +3477,7 @@ wheels = [ [[package]] name = "torch" -version = "2.11.0" +version = "2.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, @@ -3497,30 +3496,26 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/0d/98b410492609e34a155fa8b121b55c7dca229f39636851c3a9ec20edea21/torch-2.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7b6a60d48062809f58595509c524b88e6ddec3ebe25833d6462eeab81e5f2ce4", size = 80529712, upload-time = "2026-03-23T18:12:02.608Z" }, - { url = "https://files.pythonhosted.org/packages/84/03/acea680005f098f79fd70c1d9d5ccc0cb4296ec2af539a0450108232fc0c/torch-2.11.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d91aac77f24082809d2c5a93f52a5f085032740a1ebc9252a7b052ef5a4fddc6", size = 419718178, upload-time = "2026-03-23T18:10:46.675Z" }, - { url = "https://files.pythonhosted.org/packages/8c/8b/d7be22fbec9ffee6cff31a39f8750d4b3a65d349a286cf4aec74c2375662/torch-2.11.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:7aa2f9bbc6d4595ba72138026b2074be1233186150e9292865e04b7a63b8c67a", size = 530604548, upload-time = "2026-03-23T18:10:03.569Z" }, - { url = "https://files.pythonhosted.org/packages/d1/bd/9912d30b68845256aabbb4a40aeefeef3c3b20db5211ccda653544ada4b6/torch-2.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:73e24aaf8f36ab90d95cd1761208b2eb70841c2a9ca1a3f9061b39fc5331b708", size = 114519675, upload-time = "2026-03-23T18:11:52.995Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/69e3008d78e5cee2b30183340cc425081b78afc5eff3d080daab0adda9aa/torch-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b5866312ee6e52ea625cd211dcb97d6a2cdc1131a5f15cc0d87eec948f6dd34", size = 80606338, upload-time = "2026-03-23T18:11:34.781Z" }, - { url = "https://files.pythonhosted.org/packages/13/16/42e5915ebe4868caa6bac83a8ed59db57f12e9a61b7d749d584776ed53d5/torch-2.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f99924682ef0aa6a4ab3b1b76f40dc6e273fca09f367d15a524266db100a723f", size = 419731115, upload-time = "2026-03-23T18:11:06.944Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c9/82638ef24d7877510f83baf821f5619a61b45568ce21c0a87a91576510aa/torch-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0f68f4ac6d95d12e896c3b7a912b5871619542ec54d3649cf48cc1edd4dd2756", size = 530712279, upload-time = "2026-03-23T18:10:31.481Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ff/6756f1c7ee302f6d202120e0f4f05b432b839908f9071157302cedfc5232/torch-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbf39280699d1b869f55eac536deceaa1b60bd6788ba74f399cc67e60a5fab10", size = 114556047, upload-time = "2026-03-23T18:10:55.931Z" }, - { url = "https://files.pythonhosted.org/packages/87/89/5ea6722763acee56b045435fb84258db7375c48165ec8be7880ab2b281c5/torch-2.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6debd97ccd3205bbb37eb806a9d8219e1139d15419982c09e23ef7d4369d18", size = 80606801, upload-time = "2026-03-23T18:10:18.649Z" }, - { url = "https://files.pythonhosted.org/packages/32/d1/8ed2173589cbfe744ed54e5a73efc107c0085ba5777ee93a5f4c1ab90553/torch-2.11.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:63a68fa59de8f87acc7e85a5478bb2dddbb3392b7593ec3e78827c793c4b73fd", size = 419732382, upload-time = "2026-03-23T18:08:30.835Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e1/b73f7c575a4b8f87a5928f50a1e35416b5e27295d8be9397d5293e7e8d4c/torch-2.11.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:cc89b9b173d9adfab59fd227f0ab5e5516d9a52b658ae41d64e59d2e55a418db", size = 530711509, upload-time = "2026-03-23T18:08:47.213Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/3e3fcdd388fbe54e29fd3f991f36846ff4ac90b0d0181e9c8f7236565f82/torch-2.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dda3b3f52d121063a731ddb835f010dc137b920d7fec2778e52f60d8e4bf0cd", size = 114555842, upload-time = "2026-03-23T18:09:52.111Z" }, - { url = "https://files.pythonhosted.org/packages/db/38/8ac78069621b8c2b4979c2f96dc8409ef5e9c4189f6aac629189a78677ca/torch-2.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8b394322f49af4362d4f80e424bcaca7efcd049619af03a4cf4501520bdf0fb4", size = 80959574, upload-time = "2026-03-23T18:10:14.214Z" }, - { url = "https://files.pythonhosted.org/packages/6d/6c/56bfb37073e7136e6dd86bfc6af7339946dd684e0ecf2155ac0eee687ae1/torch-2.11.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2658f34ce7e2dabf4ec73b45e2ca68aedad7a5be87ea756ad656eaf32bf1e1ea", size = 419732324, upload-time = "2026-03-23T18:09:36.604Z" }, - { url = "https://files.pythonhosted.org/packages/07/f4/1b666b6d61d3394cca306ea543ed03a64aad0a201b6cd159f1d41010aeb1/torch-2.11.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:98bb213c3084cfe176302949bdc360074b18a9da7ab59ef2edc9d9f742504778", size = 530596026, upload-time = "2026-03-23T18:09:20.842Z" }, - { url = "https://files.pythonhosted.org/packages/48/6b/30d1459fa7e4b67e9e3fe1685ca1d8bb4ce7c62ef436c3a615963c6c866c/torch-2.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a97b94bbf62992949b4730c6cd2cc9aee7b335921ee8dc207d930f2ed09ae2db", size = 114793702, upload-time = "2026-03-23T18:09:47.304Z" }, - { url = "https://files.pythonhosted.org/packages/26/0d/8603382f61abd0db35841148ddc1ffd607bf3100b11c6e1dab6d2fc44e72/torch-2.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:01018087326984a33b64e04c8cb5c2795f9120e0d775ada1f6638840227b04d7", size = 80573442, upload-time = "2026-03-23T18:09:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/c7/86/7cd7c66cb9cec6be330fff36db5bd0eef386d80c031b581ec81be1d4b26c/torch-2.11.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:2bb3cc54bd0dea126b0060bb1ec9de0f9c7f7342d93d436646516b0330cd5be7", size = 419749385, upload-time = "2026-03-23T18:07:33.77Z" }, - { url = "https://files.pythonhosted.org/packages/47/e8/b98ca2d39b2e0e4730c0ee52537e488e7008025bc77ca89552ff91021f7c/torch-2.11.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4dc8b3809469b6c30b411bb8c4cad3828efd26236153d9beb6a3ec500f211a60", size = 530716756, upload-time = "2026-03-23T18:07:50.02Z" }, - { url = "https://files.pythonhosted.org/packages/78/88/d4a4cda8362f8a30d1ed428564878c3cafb0d87971fbd3947d4c84552095/torch-2.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:2b4e811728bd0cc58fb2b0948fe939a1ee2bf1422f6025be2fca4c7bd9d79718", size = 114552300, upload-time = "2026-03-23T18:09:05.617Z" }, - { url = "https://files.pythonhosted.org/packages/bf/46/4419098ed6d801750f26567b478fc185c3432e11e2cad712bc6b4c2ab0d0/torch-2.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8245477871c3700d4370352ffec94b103cfcb737229445cf9946cddb7b2ca7cd", size = 80959460, upload-time = "2026-03-23T18:09:00.818Z" }, - { url = "https://files.pythonhosted.org/packages/fd/66/54a56a4a6ceaffb567231994a9745821d3af922a854ed33b0b3a278e0a99/torch-2.11.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:ab9a8482f475f9ba20e12db84b0e55e2f58784bdca43a854a6ccd3fd4b9f75e6", size = 419735835, upload-time = "2026-03-23T18:07:18.974Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e7/0b6665f533aa9e337662dc190425abc0af1fe3234088f4454c52393ded61/torch-2.11.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:563ed3d25542d7e7bbc5b235ccfacfeb97fb470c7fee257eae599adb8005c8a2", size = 530613405, upload-time = "2026-03-23T18:08:07.014Z" }, - { url = "https://files.pythonhosted.org/packages/cf/bf/c8d12a2c86dbfd7f40fb2f56fbf5a505ccf2d9ce131eb559dfc7c51e1a04/torch-2.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b2a43985ff5ef6ddd923bbcf99943e5f58059805787c5c9a2622bf05ca2965b0", size = 114792991, upload-time = "2026-03-23T18:08:19.216Z" }, + { url = "https://files.pythonhosted.org/packages/5b/fe/cba54dc58523434919b66f13a667e36e436deddd77ca519e96553617d4ec/torch-2.13.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:e76f9bcecc52b8ff711239a2f7547d5353df95878ab232f0773c1d95928b92f8", size = 111187938, upload-time = "2026-07-08T16:05:17.065Z" }, + { url = "https://files.pythonhosted.org/packages/c2/59/1e3160e18e12aa3038390efab3ce02b36a9d4d6a527ecdd8520dca2e68d8/torch-2.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:092790c696a760c729fd5722835f50b9d81fd7c8f141571f3f3cf4081a8f664c", size = 427199369, upload-time = "2026-07-08T16:04:51.054Z" }, + { url = "https://files.pythonhosted.org/packages/01/79/1f2d34ad7034ee1c7ffc1cf8bf0f8213af2a81df6ecdb3997ecec107c09d/torch-2.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60fcdcb2f3876e21146cb4524ef06397d727ca9ad5f020818547e25075fe3cb7", size = 526574961, upload-time = "2026-07-08T16:04:07.075Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/0f2ce40f58aefbdb3392f9acce3c8171940943ae2d661f70558bfa73befb/torch-2.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a0d8b11f16a48d60e2015d8213aa0390744cbebb98e58b62b3514dddc656e330", size = 122015870, upload-time = "2026-07-08T16:05:27.59Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3a/ed0f4d4d1dcde03bced7aac9a28e800abcdc0cbd06b6775044c9fbd877b7/torch-2.13.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2fe228aba290d14b9f31b049be550dbd469c3fd3013d7a19705b30454da97027", size = 111213045, upload-time = "2026-07-08T16:05:22.997Z" }, + { url = "https://files.pythonhosted.org/packages/df/a9/f6a2a4d763ff1df02e9a64c477029db614295bc9367f4131223791ccc243/torch-2.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:572df8be8ffb4599c88cbd6a0726f1f854f4da65d2e3c09f0e2c2283333cd6d4", size = 427210998, upload-time = "2026-07-08T16:04:37.708Z" }, + { url = "https://files.pythonhosted.org/packages/f3/82/fea946351658e6534db52d2cc12bc53087cbf87f9440c5f180f367c1950b/torch-2.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:796633c4cdf0fe2cdced72d8f88f22e73dbcfce83132763162f6d4bff13b820b", size = 526605292, upload-time = "2026-07-08T16:04:22.81Z" }, + { url = "https://files.pythonhosted.org/packages/21/d6/e8f3c6f7e01f626f77259de9860d2a78bc84c40539e28e79b7e98b0bb659/torch-2.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:024c6cc0c1b085f2f91f20a3dc27b0471d021c31ce84b81be3afdc39f791fd9d", size = 122057313, upload-time = "2026-07-08T16:03:53.43Z" }, + { url = "https://files.pythonhosted.org/packages/0d/fa/c1c10b7aff4a9a3e8956d4f0a5f468fa6db7abc3208805719076772b4833/torch-2.13.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:33449899ce5496c1b84b4853179d94fd102028ae1407314d9fb956bb79e70d09", size = 111213743, upload-time = "2026-07-08T16:03:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/11/18/9ecb37b56293a0be8d80f810bf672a72fe7e02f8b475d5ef1b9bf8a0d748/torch-2.13.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:1e09d6a722504957c694faceca843acde562786df1144ebcc5a74075ec7f6005", size = 427213008, upload-time = "2026-07-08T16:03:44.106Z" }, + { url = "https://files.pythonhosted.org/packages/d4/5a/7c50ba1b7b713d71d34669c6d13dab0a11531a3eceb0307a5162dbfec0f7/torch-2.13.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:a3a9a21312872af8a26950b2c15680335a386a1f56ed03e780653d78b9607e9e", size = 526602329, upload-time = "2026-07-08T16:03:12.649Z" }, + { url = "https://files.pythonhosted.org/packages/91/3d/e7adcc6aaf36961cd18f56cf8ad0f3058c3a5c84ccf391762176c94581b8/torch-2.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:49b58f1e2c52440abb6f17c28f0335fe6c6d01ad1a7f55b0183b81e4b34d64e6", size = 122057920, upload-time = "2026-07-08T16:03:01.808Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/6dcc7f0c07052102dd36f83cbc5800842a909c8c3fbf1a7f8a5844954de9/torch-2.13.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d849b390e07d8d333ce8ecaf91b273c656c598379a19c9acf1318a883f6b391c", size = 111227066, upload-time = "2026-07-08T16:03:33.6Z" }, + { url = "https://files.pythonhosted.org/packages/e9/09/2c10e8cd0e00fa5d23c052df6ce467eaa7182399f5e0f824f1e4ff42ccae/torch-2.13.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:a3893dc2da0a972a8ca5d698c85a9f967559ac5f8ee1797b77408aa8734d073c", size = 427226309, upload-time = "2026-07-08T16:02:53.127Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/22c2102bbef14ca6a6cb4c20e42f088e49c5f812be4e160ae57502e325f9/torch-2.13.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:49f1ea385c754e54919408a9bb3b5a72b0b755bbe2c916c1d6f70afbec4908a2", size = 526614507, upload-time = "2026-07-08T16:02:16.441Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0c/7d1deb6bce5bc3e6042caf39100ac768eba3b9a098e1dddd16f75bd6489b/torch-2.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f8573e3ce9ebcd53fe922f01077a6085ccdfbe5f12fd215883a9d87d7a744fd", size = 122051871, upload-time = "2026-07-08T16:03:23.521Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ce/aa8b7f9949d32e0f2f624f342bc3b48112c1b8a130288465938bc83bcbf9/torch-2.13.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c28def70706c2f9ecc752574766e8ae4da9b810ab6676b611166761a78a9f1e1", size = 111537025, upload-time = "2026-07-08T16:02:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/69/d1/491e3a0389430946145888b0203f2b6a759ce2a61481b96a85c2da4f2ced/torch-2.13.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:31061ff56ed8fbf26c749806905aeb749ebeb819810fd5d52508aa5afd90dddc", size = 427219769, upload-time = "2026-07-08T16:02:31.18Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1d/38006e045bf0a1fc28ef01e757c554e59e59a8770c284bc4f47b14e60441/torch-2.13.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:cc26eead4cf51d0b544e31e364dcf000846549c273bd148936fe9d24d29acb92", size = 526571320, upload-time = "2026-07-08T16:01:59.348Z" }, + { url = "https://files.pythonhosted.org/packages/56/94/655c91992a882bd5071aa0b5d22a07dbb130d801e872be97c0b627a7c693/torch-2.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a7de8a313090dc5c7d7ba4bfe5c3be222528f9a4dba1acc83bddb1157360c4b8", size = 122306773, upload-time = "2026-07-08T16:02:39.832Z" }, ] [[package]] @@ -3537,7 +3532,7 @@ wheels = [ [[package]] name = "transformers" -version = "5.5.4" +version = "5.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -3550,9 +3545,9 @@ dependencies = [ { name = "tqdm" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/1e/1e244ab2ab50a863e6b52cc55761910567fa532b69a6740f6e99c5fdbd98/transformers-5.5.4.tar.gz", hash = "sha256:2e67cadba81fc7608cc07c4dd54f524820bc3d95b1cabd0ef3db7733c4f8b82e", size = 8227649, upload-time = "2026-04-13T16:55:55.181Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/d3/5b7c2f1a52ff0e57355efdc21554aab7e4602f6592ab4582a34c988ab956/transformers-5.10.1.tar.gz", hash = "sha256:31112d1dcdfcf9934242acbba891f44e2279ff74b9b8ba4595640e0e04195a3a", size = 8798372, upload-time = "2026-06-03T15:37:03.289Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/fb/162a66789c65e5afa3b051309240c26bf37fbc8fea285b4546ae747995a2/transformers-5.5.4-py3-none-any.whl", hash = "sha256:0bd6281b82966fe5a7a16f553ea517a9db1dee6284d7cb224dfd88fc0dd1c167", size = 10236696, upload-time = "2026-04-13T16:55:51.497Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8c/3119596c7fcd9b8b8d924d5b5ba1bfdfafd6d8738bdd81ca09c60b4a38b3/transformers-5.10.1-py3-none-any.whl", hash = "sha256:ccb919ea1b77338b44d0d45d23f7472081906b1bb6ed8e5f5cf4d692d1da03d4", size = 11003770, upload-time = "2026-06-03T15:37:00.433Z" }, ] [[package]] @@ -3660,21 +3655,19 @@ wheels = [ [[package]] name = "triton" -version = "3.6.0" +version = "3.7.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/2c/96f92f3c60387e14cc45aed49487f3486f89ea27106c1b1376913c62abe4/triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49df5ef37379c0c2b5c0012286f80174fcf0e073e5ade1ca9a86c36814553651", size = 176081190, upload-time = "2026-01-20T16:16:00.523Z" }, - { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640, upload-time = "2026-01-20T16:00:35.869Z" }, - { url = "https://files.pythonhosted.org/packages/17/5d/08201db32823bdf77a0e2b9039540080b2e5c23a20706ddba942924ebcd6/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4", size = 176128243, upload-time = "2026-01-20T16:16:07.857Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, - { url = "https://files.pythonhosted.org/packages/3c/12/34d71b350e89a204c2c7777a9bba0dcf2f19a5bfdd70b57c4dbc5ffd7154/triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448e02fe6dc898e9e5aa89cf0ee5c371e99df5aa5e8ad976a80b93334f3494fd", size = 176133521, upload-time = "2026-01-20T16:16:13.321Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450, upload-time = "2026-01-20T16:00:49.136Z" }, - { url = "https://files.pythonhosted.org/packages/ce/4e/41b0c8033b503fd3cfcd12392cdd256945026a91ff02452bef40ec34bee7/triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1722e172d34e32abc3eb7711d0025bb69d7959ebea84e3b7f7a341cd7ed694d6", size = 176276087, upload-time = "2026-01-20T16:16:18.989Z" }, - { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" }, - { url = "https://files.pythonhosted.org/packages/49/55/5ecf0dcaa0f2fbbd4420f7ef227ee3cb172e91e5fede9d0ecaddc43363b4/triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5523241e7d1abca00f1d240949eebdd7c673b005edbbce0aca95b8191f1d43", size = 176138577, upload-time = "2026-01-20T16:16:25.426Z" }, - { url = "https://files.pythonhosted.org/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", size = 188273063, upload-time = "2026-01-20T16:01:07.278Z" }, - { url = "https://files.pythonhosted.org/packages/48/db/56ee649cab5eaff4757541325aca81f52d02d4a7cd3506776cad2451e060/triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b3a97e8ed304dfa9bd23bb41ca04cdf6b2e617d5e782a8653d616037a5d537d", size = 176274804, upload-time = "2026-01-20T16:16:31.528Z" }, - { url = "https://files.pythonhosted.org/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", size = 188397994, upload-time = "2026-01-20T16:01:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f9/19d842d06a08559534fa1eaab6ca551b1bcf40f06620bddec1babaa2772d/triton-3.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4a0e1cd4c4a76370ed74a8432a53cea28716827d19e40ffc732233e35ceb3f6", size = 184664887, upload-time = "2026-06-17T20:03:42.913Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5e/fce69606f7f240297f163e25539906732b199530d486ce67ae319877e821/triton-3.7.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6744957e9fd610a29680ec2346057d0c86948ed3812468670719f391e94b44a5", size = 197701306, upload-time = "2026-06-17T19:53:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/94/fa/f856e24deb462d5f18bd4b5a746957862ab9b6ee5834bda60605ec348366/triton-3.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9497f2e696ee368862a181a90b2dcc03ca978cc4f602abd67c7d81022a6988e1", size = 184692359, upload-time = "2026-06-17T20:03:48.288Z" }, + { url = "https://files.pythonhosted.org/packages/c4/6f/fb96d15db6f36d6eae4cafb998c2e0353bf59d7c4ea1662d7497f269134a/triton-3.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e40869937a68206ec70d7f25bb7ec6433cb083f9135e1f36dbd318dc449a728", size = 197719725, upload-time = "2026-06-17T19:53:20.419Z" }, + { url = "https://files.pythonhosted.org/packages/00/42/c5089d4d9327fcd1e862c599cc2927f39418f84dd11a84cb2ccff9d4787a/triton-3.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdbfc09d9ec58bc5e68321525653220de7515c199e7a8097a97c85e62b52cd0a", size = 184694629, upload-time = "2026-06-17T20:03:53.444Z" }, + { url = "https://files.pythonhosted.org/packages/07/42/2c3ac59253ae8892b6f307875263dd23dc875cdf732d3aea40d6d41fb7cb/triton-3.7.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58c0e131da05134a2a4788ccbcc0c1105cf0f54c8e98f19e34cd465396dc15eb", size = 197729241, upload-time = "2026-06-17T19:53:27.801Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/e01aa7ad573883ed9456f130226babdec70b005e098c4d6226a6238e761b/triton-3.7.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe4ea396a06171f1f1f58cbd39c70b09294398f7dd7c620939bab54ad6f934fa", size = 184705764, upload-time = "2026-06-17T20:03:59.064Z" }, + { url = "https://files.pythonhosted.org/packages/a4/09/5683146fda6a2b569deb78ccfd8fbfea8bfe55f726b081c0a6bb18dd6f28/triton-3.7.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2020153b08280415ec0da6607834e79166442147e78e144df06b508c75b186d2", size = 197729537, upload-time = "2026-06-17T19:53:35.516Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f8/448220c3092019f9fdfab39ec47985968181d67da34b44f6a7f6280a5cbb/triton-3.7.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c58e4c61f0c73b5dba3b5d19b4a7093c32f90dc18b2a7f121a7c16ccd31107b7", size = 184814760, upload-time = "2026-06-17T20:04:04.984Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ac/229b7d4589d2e5937310e72c6d46e89599d16a4a12b479ffa1499fee8eb8/triton-3.7.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10ba85fa2cca4a2fbdeb36bf1cb082f2c252bda55bf9fccd74f65ec5bc647e68", size = 197824404, upload-time = "2026-06-17T19:53:42.772Z" }, ] [[package]] @@ -3723,11 +3716,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.15.0" +version = "4.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, ] [[package]] @@ -3762,11 +3755,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.7.0" +version = "2.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz", hash = "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size = 458972, upload-time = "2026-09-15T19:29:36.253Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, + { url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl", hash = "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size = 135717, upload-time = "2026-09-15T19:29:34.577Z" }, ] [[package]]