From 48931d6f4d1677a84a6cd1e75a53b0ebe36e68b1 Mon Sep 17 00:00:00 2001 From: pkuwkl Date: Sat, 18 Jul 2026 02:15:40 +0800 Subject: [PATCH 1/3] feat(rag): adopt LlamaIndex for document ingestion and retrieval --- .github/workflows/e2e.yml | 70 + contexts/design/README.md | 1 + contexts/design/flow/paper.md | 17 +- contexts/design/library/local.md | 32 +- contexts/design/preprocess/pdf.md | 37 + docs/README.md | 6 + docs/library.md | 13 +- examples/preprocess/paper_rag.py | 31 + pyproject.toml | 4 +- quantmind/library/_internal/exact_cosine.py | 236 --- .../library/_internal/llamaindex_retriever.py | 235 +++ quantmind/library/_internal/sqlite_store.py | 2 +- quantmind/library/local.py | 26 +- quantmind/preprocess/__init__.py | 20 + quantmind/preprocess/format/__init__.py | 25 +- quantmind/preprocess/format/pdf.py | 343 +++- scripts/verify_pdf_rag_e2e.py | 55 + tests/preprocess/format/test_pdf.py | 112 +- tests/test_verify_pdf_rag_e2e.py | 137 ++ uv.lock | 1520 ++++++++++++----- 20 files changed, 2144 insertions(+), 778 deletions(-) create mode 100644 contexts/design/preprocess/pdf.md create mode 100644 examples/preprocess/paper_rag.py delete mode 100644 quantmind/library/_internal/exact_cosine.py create mode 100644 quantmind/library/_internal/llamaindex_retriever.py create mode 100644 scripts/verify_pdf_rag_e2e.py create mode 100644 tests/test_verify_pdf_rag_e2e.py diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index f37551c..37de9c5 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -16,19 +16,59 @@ on: - 'quantmind/preprocess/fetch/_types.py' - 'quantmind/preprocess/fetch/http.py' - 'quantmind/preprocess/fetch/rss.py' + - 'quantmind/preprocess/fetch/arxiv.py' + - 'quantmind/preprocess/format/pdf.py' + - 'scripts/verify_pdf_rag_e2e.py' + - 'pyproject.toml' schedule: - cron: "17 3 * * *" workflow_dispatch: permissions: contents: read + pull-requests: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: + changes: + runs-on: ubuntu-latest + outputs: + news: ${{ steps.filter.outputs.news }} + pdf_rag: ${{ steps.filter.outputs.pdf_rag }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Detect component changes + id: filter + uses: dorny/paths-filter@v3 + with: + filters: | + news: + - '.github/workflows/e2e.yml' + - 'scripts/verify_news_e2e.py' + - 'quantmind/preprocess/_news_types.py' + - 'quantmind/preprocess/clean.py' + - 'quantmind/preprocess/news.py' + - 'quantmind/preprocess/pr_newswire.py' + - 'quantmind/preprocess/time.py' + - 'quantmind/preprocess/format/html.py' + - 'quantmind/preprocess/fetch/**' + - 'pyproject.toml' + pdf_rag: + - '.github/workflows/e2e.yml' + - 'scripts/verify_pdf_rag_e2e.py' + - 'quantmind/preprocess/fetch/arxiv.py' + - 'quantmind/preprocess/format/pdf.py' + - 'pyproject.toml' + news: + needs: changes + if: github.event_name != 'pull_request' || needs.changes.outputs.news == 'true' runs-on: ubuntu-latest timeout-minutes: 10 @@ -55,3 +95,33 @@ jobs: - name: Run live news E2E run: .venv/bin/python scripts/verify_news_e2e.py + + pdf-rag: + needs: changes + if: github.event_name != 'pull_request' || needs.changes.outputs.pdf_rag == 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: pyproject.toml + + - name: Create virtual environment + run: uv venv + + - name: Install project runtime dependencies + run: uv pip install --python .venv/bin/python -e . + + - name: Run live PDF RAG E2E + run: .venv/bin/python scripts/verify_pdf_rag_e2e.py diff --git a/contexts/design/README.md b/contexts/design/README.md index f137b8f..5f6b2bd 100644 --- a/contexts/design/README.md +++ b/contexts/design/README.md @@ -26,6 +26,7 @@ implementation must preserve. |---|---| | Flow | [Paper extraction from input to validated result](flow/paper.md) | | Flow | [News collection](flow/news.md) | +| Preprocess | [Page-aware multimodal PDF parsing](preprocess/pdf.md) | | Library | [Local knowledge storage and meaning-based search](library/local.md) | | Operations | [Public operation naming](operations/naming.md) | diff --git a/contexts/design/flow/paper.md b/contexts/design/flow/paper.md index ca26d50..9fabcb7 100644 --- a/contexts/design/flow/paper.md +++ b/contexts/design/flow/paper.md @@ -4,7 +4,7 @@ - **Purpose**: Define how a paper input becomes a validated `Paper`. - **Read when**: Changing paper inputs, parsing, section trees, source tracking, page ranges, or future PageIndex support. -- **Status**: Planned design; [Current Gaps](#current-gaps) lists what is not implemented yet. +- **Status**: Mixed. Page-aware PDF parsing and LlamaIndex ingestion are implemented; [Current Gaps](#current-gaps) lists the remaining paper assembly work. - **Core rule**: A model or PageIndex may suggest a section tree. Code creates the final IDs, links, order, page ranges, citations, and source-backed text. - **Page numbering**: PDF page ranges start at 1 and include both the first and last page. @@ -139,9 +139,12 @@ Required properties: - A page-based tree builder, including a future PageIndex integration, accepts only a source document whose range unit is `pdf_page`. -`PaperSourceDocument` is a temporary value used during extraction, not another -public knowledge model. The caller keeps raw PDF or HTML files; this design -does not embed them inside `Paper`. +For PDF inputs, [`ParsedDocument`](../preprocess/pdf.md) is the implemented +deterministic source value. It preserves blocks, coordinates, and optional page +screenshots as well as page text. `PaperSourceDocument` is the flow's temporary +view over that value, not another public knowledge model. The caller keeps raw +PDF, HTML, and screenshot files; this design does not embed them inside +`Paper`. ## Which Source Provides Each Field @@ -331,8 +334,10 @@ rather than create a competing test paper. The repository does not yet guarantee the target pipeline above: -- `pdf_to_markdown()` concatenates non-empty page text and drops page - boundaries and empty pages. +- `pdf_to_markdown()` remains a compatibility view, while the primary + `parse_pdf()` path now preserves pages, blocks, coordinates, and artifacts. +- `paper_flow()` has not yet adopted `ParsedDocument`; it still consumes the + compatibility Markdown view. - `paper_flow()` sends the flattened document to one extraction agent and asks it to return the final `Paper` directly. - The model currently controls IDs, edges, citations, source fields, and diff --git a/contexts/design/library/local.md b/contexts/design/library/local.md index e3aad98..691ce0c 100644 --- a/contexts/design/library/local.md +++ b/contexts/design/library/local.md @@ -16,7 +16,8 @@ - [What Can Match a Query](#what-can-match-a-query) - [When to Rebuild Search Data](#when-to-rebuild-search-data) - [Time Fields and Look-Ahead](#time-fields-and-look-ahead) -- [Why SQLite and Simple Exact Ranking](#why-sqlite-and-simple-exact-ranking) +- [Why SQLite and LlamaIndex Ranking](#why-sqlite-and-llamaindex-ranking) +- [Independent tree navigation](#independent-tree-navigation) - [Out of Scope](#out-of-scope) ## Key Decisions @@ -104,16 +105,29 @@ or have no known availability time. Filtering only by `as_of_before` can still leak future information. Apply source kind, item type, confidence, tags, tree ID, and both time cutoffs before ranking results. -## Why SQLite and Simple Exact Ranking +## Why SQLite and LlamaIndex Ranking SQLite provides transactions, foreign keys, and reliable reconstruction of -typed knowledge. NumPy can compare every embedding with cosine similarity at -the current local data size. This simple exact ranking can later be replaced -without changing user code. - -A future approximate or remote index may replace the private search -implementation. It does not replace stored knowledge and must return the same -`SemanticHit` type regardless of provider. +typed knowledge. LlamaIndex owns the private collection-wide vector retrieval +and ranking mechanics. On the first search after open or a write, private +retrieval state is rebuilt from the filtered semantic records stored in SQLite; +unchanged records reuse their persisted embeddings and are not sent to the +embedding provider again. + +LlamaIndex nodes and retrievers remain implementation details. They do not +enter `SemanticQuery`, `SemanticHit`, canonical Pydantic payloads, or public +signatures. A future approximate or remote index may replace the private +search implementation without replacing stored knowledge or changing the +public result type. + +## Independent tree navigation + +`LocalKnowledgeLibrary` is canonical knowledge storage with rebuildable +retrieval capabilities; it is not defined as a vector database. A future +PageIndex path can select a paper through collection-wide semantic retrieval, +then navigate that selected document's tree through a separate operation and +separately rebuildable state. PageIndex does not have to be served through +`search()` or LlamaIndex ranking. ## Out of Scope diff --git a/contexts/design/preprocess/pdf.md b/contexts/design/preprocess/pdf.md new file mode 100644 index 0000000..6c9c799 --- /dev/null +++ b/contexts/design/preprocess/pdf.md @@ -0,0 +1,37 @@ +# Parse PDFs without losing page or visual context + +## Quick Summary + +- **Purpose**: Define the deterministic PDF value shared by paper extraction, collection-wide RAG, and a future PageIndex adapter. +- **Read when**: Changing PDF parsing, page artifacts, LlamaIndex ingestion, or multimodal evidence. +- **Status**: Implemented by `quantmind.preprocess.parse_pdf` and the private LlamaIndex conversion helpers. +- **Core rule**: Parsing preserves every physical page and its source coordinates before any chunker or tree builder runs. + +## Contents + +- [Parsed document boundary](#parsed-document-boundary) +- [Artifacts and ownership](#artifacts-and-ownership) +- [LlamaIndex conversion](#llamaindex-conversion) +- [PageIndex compatibility](#pageindex-compatibility) + +## Parsed document boundary + +`parse_pdf()` returns a frozen QuantMind `ParsedDocument`. It records the SHA-256 hash of the exact PDF bytes, parser and cleanup versions, and one ordered `ParsedPage` for every physical page. Page numbers are 1-based. An empty page remains present with empty text and no blocks. + +Each `TextBlock` keeps its page ownership, text, bounding box, and parser-provided font and confidence values when available. Bounding boxes use PDF page coordinates `(x0, y0, x1, y1)`. These deterministic preprocessing values are not canonical knowledge models. + +## Artifacts and ownership + +The caller chooses an artifact directory. When supplied, parsing renders one PNG screenshot per page and stores a stable path reference on the page. The library does not copy screenshots or PDF bytes into canonical SQLite knowledge. Without an artifact directory, pages remain valid and `screenshot_path` is absent. + +## LlamaIndex conversion + +LlamaIndex is the required RAG data plane. QuantMind converts pages to private LlamaIndex documents, retaining source hash, page number, block coordinates, and screenshot references as metadata. `chunk_parsed_document()` applies LlamaIndex `SentenceSplitter`; supported splitter arguments pass through `SentenceSplitterConfig`. + +`retrieve_parsed_document()` performs a bounded BM25 retrieval over those chunks and converts results back to `ParsedDocumentHit`. Public QuantMind values never expose LlamaIndex `Document`, node, index, or retriever types. + +Flattened Markdown remains a compatibility view produced from the preserved pages. It is not the primary parsing result. + +## PageIndex compatibility + +PageIndex may later consume the same ordered `ParsedDocument` to propose a document tree and navigate within a selected long document. It remains independent of collection-wide LlamaIndex ranking and is not forced through `LocalKnowledgeLibrary.search()`. diff --git a/docs/README.md b/docs/README.md index ea4599d..b503689 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,6 +18,7 @@ harness. | News collection | `quantmind.flows.collect_news` | `NewsWindow`, `NewsCollectionCfg` | `NewsBatch` from `quantmind.preprocess` | [Collect news](../examples/flows/collect_news.py) | [News collection design](../contexts/design/flow/news.md) | | Bounded fan-out | `quantmind.flows.batch_run` | Operation inputs and shared config | `BatchResult` | [README usage](../README.md#-usage-examples) | API docstrings | | Local semantic search | `quantmind.library.LocalKnowledgeLibrary` | `BaseKnowledge`, `SemanticQuery` | `list[SemanticHit]` | [Library example](../examples/library/README.md) | [Library guide](library.md) | +| Page-aware PDF RAG | `quantmind.preprocess.parse_pdf` | Exact PDF bytes and optional artifact directory | `ParsedDocument` | [Paper RAG](../examples/preprocess/paper_rag.py) | [PDF preprocessing design](../contexts/design/preprocess/pdf.md) | Import public inputs and configs from `quantmind.configs` and current public operations from `quantmind.flows`. Import result contracts from the canonical @@ -28,6 +29,7 @@ layer shown in the catalog. | Source | Source selection | Operation | Live-network component smoke test | |---|---|---|---| | PR Newswire | `NewsWindow(source="pr-newswire", ...)` | `collect_news` | `python scripts/verify_news_e2e.py` | +| arXiv Transformer PDF | `fetch_arxiv("1706.03762v7")` | `parse_pdf` and LlamaIndex retrieval | `python scripts/verify_pdf_rag_e2e.py` | The PR Newswire smoke test checks the public RSS feed, a complete preceding 24-hour listing window, and ticker-hint recall on a bounded sample of up to 25 @@ -36,6 +38,10 @@ manual dispatch, and only on pull requests that change its dependency paths. It is not a required merge check, so external PR Newswire availability cannot block unrelated changes. +The PDF RAG smoke fetches the pinned 15-page Transformer paper, parses ordered +pages, creates LlamaIndex chunks, and verifies that BM25 retrieval returns a +multi-head-attention passage with page metadata. It does not call an LLM. + ## Verification Run the deterministic required verification for every change: diff --git a/docs/library.md b/docs/library.md index 703a017..f8a1883 100644 --- a/docs/library.md +++ b/docs/library.md @@ -1,7 +1,7 @@ # Local Semantic Knowledge Library `quantmind.library` persists canonical `BaseKnowledge` in SQLite and ranks -rebuildable NumPy indexes with exact cosine similarity. It is a financial +rebuildable semantic records through a private LlamaIndex vector index. It is a financial knowledge API, not a generic RAG framework: provider and storage details remain private, and search returns typed QuantMind evidence without generating an answer. @@ -37,11 +37,12 @@ SQLite is the default because canonical knowledge needs transactions, foreign keys, typed reconstruction, and explicit corrupt/stale/not-found behavior. A vector database such as Chroma optimizes the derived similarity-search layer; it does not replace those canonical-storage responsibilities. The current local -scale therefore uses a rebuildable NumPy exact-cosine index backed by -`semantic_records`, without adding another service or dependency. If corpus -size later requires an approximate or remote vector index, that derived layer -can change privately without changing `LocalKnowledgeLibrary`, the canonical -tables, or user code. +implementation rebuilds a private in-memory LlamaIndex vector index from +`semantic_records`, without adding another service. If corpus size later +requires an approximate or remote vector index, that derived layer can change +privately without changing `LocalKnowledgeLibrary`, the canonical tables, or +user code. A future PageIndex operation may navigate a selected document tree +separately; the library is not defined as vector-only. The durable vector metadata records the embedding model and dimension, exact projection hash, source content hash, knowledge schema version, and projection diff --git a/examples/preprocess/paper_rag.py b/examples/preprocess/paper_rag.py new file mode 100644 index 0000000..96a0cc7 --- /dev/null +++ b/examples/preprocess/paper_rag.py @@ -0,0 +1,31 @@ +"""Parse and retrieve evidence from a local PDF with page provenance.""" + +import asyncio +from pathlib import Path + +from quantmind.preprocess import ( + chunk_parsed_document, + parse_pdf, + retrieve_parsed_document, +) + + +async def main() -> None: + """Parse one PDF and print page-aware BM25 evidence.""" + pdf_path = Path("tests/fixtures/paper/golden/paper.pdf") + document = await parse_pdf(pdf_path.read_bytes()) + chunks = chunk_parsed_document(document) + hits = retrieve_parsed_document( + chunks, + "How is the long-short portfolio constructed?", + top_k=3, + ) + for hit in hits: + print( + f"page={hit.chunk.page_number} score={hit.score:.3f} " + f"text={hit.chunk.text[:120]!r}" + ) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/pyproject.toml b/pyproject.toml index f15b0f3..762ebe6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,6 @@ requires-python = ">=3.10" dependencies = [ "arxiv", "pyyaml", - "numpy>=2.2.4", "openai>=1.68.2", "openai-agents>=0.14", "pillow>=10.1.0,<11.0.0", @@ -20,6 +19,9 @@ dependencies = [ "python-dotenv>=1.0.0", "httpx[socks]>=0.28.1", "litellm>=1.74.0.post1", + "liteparse>=2.6,<3", + "llama-index-core>=0.14,<0.15", + "llama-index-retrievers-bm25>=0.6,<0.7", "jinja2>=3.0.0", "trafilatura>=1.10", ] diff --git a/quantmind/library/_internal/exact_cosine.py b/quantmind/library/_internal/exact_cosine.py deleted file mode 100644 index 0a6f0c1..0000000 --- a/quantmind/library/_internal/exact_cosine.py +++ /dev/null @@ -1,236 +0,0 @@ -"""Deterministic NumPy exact-cosine filtering and ranking.""" - -from collections.abc import Sequence -from dataclasses import dataclass -from datetime import datetime, timezone -from typing import Any -from uuid import UUID - -import numpy as np -from numpy.typing import NDArray - -from quantmind.library._types import SemanticQuery - - -@dataclass(frozen=True) -class _IndexRecord: - """Durable metadata and vector bytes for one searchable target.""" - - target_id: str - item_id: UUID - node_id: UUID | None - item_type: str - matched_text: str - as_of: float - available_at: float | None - source_kind: str - confidence: str - tags: frozenset[str] - tree_id: UUID | None - dimension: int - embedding: bytes - - -@dataclass(frozen=True) -class _RankedRecord: - """One exact-cosine result before canonical hit resolution.""" - - record: _IndexRecord - score: float - - -def _coerce_provider_vectors( - values: Any, - *, - expected_count: int, - expected_dimensions: int | None, -) -> NDArray[np.float32]: - """Validate provider output before it can enter the durable index.""" - try: - vectors = np.asarray(values, dtype=np.float32) - except (TypeError, ValueError) as exc: - raise ValueError( - "Embedding provider returned non-rectangular data" - ) from exc - if vectors.ndim != 2 or vectors.shape[0] != expected_count: - raise ValueError( - "Embedding provider returned an unexpected number or shape of vectors" - ) - dimensions = int(vectors.shape[1]) - if dimensions < 1: - raise ValueError("Embedding provider returned zero-dimensional vectors") - if expected_dimensions is not None and dimensions != expected_dimensions: - raise ValueError( - "Embedding dimension mismatch: provider returned " - f"{dimensions}, expected {expected_dimensions}" - ) - if not np.isfinite(vectors).all(): - raise ValueError("Embedding provider returned non-finite values") - if np.any(np.linalg.norm(vectors, axis=1) == 0): - raise ValueError("Embedding provider returned a zero vector") - return np.ascontiguousarray(vectors, dtype=np.float32) - - -def _decode_stored_vector( - blob: bytes, dimension: int, target_id: str -) -> NDArray[np.float32]: - """Decode and validate a persisted vector as corrupt-index protection.""" - if dimension < 1 or len(blob) != dimension * np.dtype(" tuple[bytes, int]: - """Encode one validated provider vector for SQLite persistence.""" - return ( - np.asarray(vector, dtype=" float: - """Normalize an aware financial timestamp for deterministic filtering.""" - if value.tzinfo is None or value.utcoffset() is None: - raise ValueError(f"{field_name} must be timezone-aware") - return value.astimezone(timezone.utc).timestamp() - - -class _CosineCandidates: - """Filtered records and normalized vectors ready for one query.""" - - def __init__( - self, - records: tuple[_IndexRecord, ...], - matrix: NDArray[np.float32], - ) -> None: - self._records = records - self._matrix = matrix - - def rank( - self, - query_vector: NDArray[np.float32], - *, - top_k: int, - ) -> list[_RankedRecord]: - """Rank candidates best-first with stable target-ID tie breaking.""" - if query_vector.shape[0] != self._matrix.shape[1]: - raise ValueError( - "Embedding dimension mismatch: query vector has " - f"{query_vector.shape[0]} dimensions but the index has " - f"{self._matrix.shape[1]}" - ) - normalized = query_vector / np.linalg.norm(query_vector) - scores = self._matrix @ normalized - ranked = sorted( - zip(self._records, scores, strict=True), - key=lambda pair: (-float(pair[1]), pair[0].target_id), - )[:top_k] - return [ - _RankedRecord(record=record, score=float(score)) - for record, score in ranked - ] - - -class _ExactCosineIndex: - """Immutable in-memory exact-cosine index rebuilt from SQLite rows.""" - - def __init__( - self, - records: tuple[_IndexRecord, ...], - matrix: NDArray[np.float32], - ) -> None: - self._records = records - self._matrix = matrix - - @classmethod - def build(cls, records: Sequence[_IndexRecord]) -> "_ExactCosineIndex": - """Validate durable vectors and build a normalized matrix.""" - vectors: list[NDArray[np.float32]] = [] - index_dimension: int | None = None - for record in records: - if index_dimension is None: - index_dimension = record.dimension - elif record.dimension != index_dimension: - raise RuntimeError( - "Corrupt index data: stored targets have inconsistent " - "embedding dimensions" - ) - vector = _decode_stored_vector( - record.embedding, - record.dimension, - record.target_id, - ) - vectors.append( - np.asarray(vector / np.linalg.norm(vector), dtype=np.float32) - ) - matrix = ( - np.ascontiguousarray(np.vstack(vectors), dtype=np.float32) - if vectors - else np.empty((0, 0), dtype=np.float32) - ) - return cls(tuple(records), matrix) - - def filter(self, query: SemanticQuery) -> _CosineCandidates | None: - """Apply metadata and financial-time filters before query embedding.""" - as_of_before = ( - _timestamp(query.as_of_before, "SemanticQuery.as_of_before") - if query.as_of_before is not None - else None - ) - available_at_before = ( - _timestamp( - query.available_at_before, - "SemanticQuery.available_at_before", - ) - if query.available_at_before is not None - else None - ) - item_types = set(query.item_types) if query.item_types else None - source_kinds = set(query.source_kinds) if query.source_kinds else None - required_tags = set(query.tags) if query.tags else None - indices: list[int] = [] - for index, record in enumerate(self._records): - if item_types is not None and record.item_type not in item_types: - continue - if ( - source_kinds is not None - and record.source_kind not in source_kinds - ): - continue - if ( - query.confidence is not None - and record.confidence != query.confidence - ): - continue - if required_tags is not None and not required_tags.issubset( - record.tags - ): - continue - if query.tree_id is not None and record.tree_id != query.tree_id: - continue - if as_of_before is not None and record.as_of > as_of_before: - continue - if available_at_before is not None and ( - record.available_at is None - or record.available_at > available_at_before - ): - continue - indices.append(index) - if not indices: - return None - return _CosineCandidates( - tuple(self._records[index] for index in indices), - np.ascontiguousarray(self._matrix[indices], dtype=np.float32), - ) diff --git a/quantmind/library/_internal/llamaindex_retriever.py b/quantmind/library/_internal/llamaindex_retriever.py new file mode 100644 index 0000000..a6e29f2 --- /dev/null +++ b/quantmind/library/_internal/llamaindex_retriever.py @@ -0,0 +1,235 @@ +"""Private LlamaIndex vector retrieval over rebuildable SQLite records.""" + +import math +import struct +from collections.abc import Sequence +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Any +from uuid import UUID + +from llama_index.core import VectorStoreIndex +from llama_index.core.embeddings import MockEmbedding +from llama_index.core.schema import QueryBundle, TextNode + +from quantmind.library._types import SemanticQuery + + +@dataclass(frozen=True) +class _IndexRecord: + """Durable metadata and vector bytes for one searchable target.""" + + target_id: str + item_id: UUID + node_id: UUID | None + item_type: str + matched_text: str + as_of: float + available_at: float | None + source_kind: str + confidence: str + tags: frozenset[str] + tree_id: UUID | None + dimension: int + embedding: bytes + + +@dataclass(frozen=True) +class _RankedRecord: + """One LlamaIndex result before canonical hit resolution.""" + + record: _IndexRecord + score: float + + +def _coerce_provider_vectors( + values: Any, + *, + expected_count: int, + expected_dimensions: int | None, +) -> list[list[float]]: + """Validate provider output before it can enter durable derived state.""" + if not isinstance(values, Sequence) or isinstance(values, (str, bytes)): + raise ValueError("Embedding provider returned non-rectangular data") + if len(values) != expected_count: + raise ValueError( + "Embedding provider returned an unexpected number or shape of vectors" + ) + vectors: list[list[float]] = [] + dimensions: int | None = None + for value in values: + if not isinstance(value, Sequence) or isinstance(value, (str, bytes)): + raise ValueError("Embedding provider returned non-rectangular data") + try: + vector = [float(component) for component in value] + except (TypeError, ValueError) as exc: + raise ValueError( + "Embedding provider returned non-rectangular data" + ) from exc + if dimensions is None: + dimensions = len(vector) + elif len(vector) != dimensions: + raise ValueError("Embedding provider returned non-rectangular data") + if not vector: + raise ValueError( + "Embedding provider returned zero-dimensional vectors" + ) + if ( + expected_dimensions is not None + and len(vector) != expected_dimensions + ): + raise ValueError( + "Embedding dimension mismatch: provider returned " + f"{len(vector)}, expected {expected_dimensions}" + ) + if not all(math.isfinite(component) for component in vector): + raise ValueError("Embedding provider returned non-finite values") + if math.sqrt(sum(component * component for component in vector)) == 0: + raise ValueError("Embedding provider returned a zero vector") + vectors.append(vector) + return vectors + + +def _decode_stored_vector( + blob: bytes, dimension: int, target_id: str +) -> list[float]: + """Decode and validate a persisted little-endian float vector.""" + if dimension < 1 or len(blob) != dimension * 4: + raise RuntimeError( + f"Corrupt index data for target '{target_id}': " + "stored byte length does not match its dimension" + ) + vector = list(struct.unpack(f"<{dimension}f", blob)) + if not all(math.isfinite(component) for component in vector): + raise RuntimeError( + f"Corrupt index data for target '{target_id}': non-finite vector" + ) + if math.sqrt(sum(component * component for component in vector)) == 0: + raise RuntimeError( + f"Corrupt index data for target '{target_id}': zero vector" + ) + return vector + + +def _encode_vector(vector: Sequence[float]) -> tuple[bytes, int]: + """Encode one validated provider vector for SQLite persistence.""" + return struct.pack(f"<{len(vector)}f", *vector), len(vector) + + +def _timestamp(value: datetime, field_name: str) -> float: + if value.tzinfo is None or value.utcoffset() is None: + raise ValueError(f"{field_name} must be timezone-aware") + return value.astimezone(timezone.utc).timestamp() + + +class _LlamaIndexRetriever: + """Filter durable records and rank them through LlamaIndex.""" + + def __init__(self, records: Sequence[_IndexRecord]) -> None: + dimensions = {record.dimension for record in records} + if len(dimensions) > 1: + raise RuntimeError( + "Corrupt index data: stored targets have inconsistent " + "embedding dimensions" + ) + for record in records: + _decode_stored_vector( + record.embedding, record.dimension, record.target_id + ) + self._records = tuple(records) + + def filter(self, query: SemanticQuery) -> tuple[_IndexRecord, ...]: + """Apply metadata and financial-time filters before ranking.""" + as_of_before = ( + _timestamp(query.as_of_before, "SemanticQuery.as_of_before") + if query.as_of_before is not None + else None + ) + available_at_before = ( + _timestamp( + query.available_at_before, + "SemanticQuery.available_at_before", + ) + if query.available_at_before is not None + else None + ) + item_types = set(query.item_types) if query.item_types else None + source_kinds = set(query.source_kinds) if query.source_kinds else None + required_tags = set(query.tags) if query.tags else None + selected: list[_IndexRecord] = [] + for record in self._records: + if item_types is not None and record.item_type not in item_types: + continue + if ( + source_kinds is not None + and record.source_kind not in source_kinds + ): + continue + if ( + query.confidence is not None + and record.confidence != query.confidence + ): + continue + if required_tags is not None and not required_tags.issubset( + record.tags + ): + continue + if query.tree_id is not None and record.tree_id != query.tree_id: + continue + if as_of_before is not None and record.as_of > as_of_before: + continue + if available_at_before is not None and ( + record.available_at is None + or record.available_at > available_at_before + ): + continue + selected.append(record) + return tuple(selected) + + @staticmethod + def rank( + records: tuple[_IndexRecord, ...], + query_vector: Sequence[float], + *, + top_k: int, + ) -> list[_RankedRecord]: + """Rank filtered records through a private LlamaIndex vector index.""" + if not records: + return [] + dimension = records[0].dimension + if len(query_vector) != dimension: + raise ValueError( + "Embedding dimension mismatch: query vector has " + f"{len(query_vector)} dimensions but the index has {dimension}" + ) + nodes = [ + TextNode( + id_=record.target_id, + text=record.matched_text, + embedding=_decode_stored_vector( + record.embedding, record.dimension, record.target_id + ), + ) + for record in records + ] + index = VectorStoreIndex( + nodes=nodes, + embed_model=MockEmbedding(embed_dim=dimension), + ) + retriever = index.as_retriever( + similarity_top_k=min(top_k, len(records)) + ) + by_target = {record.target_id: record for record in records} + ranked = [ + _RankedRecord( + record=by_target[result.node_id], + score=float(result.score or 0.0), + ) + for result in retriever.retrieve( + QueryBundle(query_str="", embedding=list(query_vector)) + ) + ] + return sorted( + ranked, + key=lambda result: (-result.score, result.record.target_id), + ) diff --git a/quantmind/library/_internal/sqlite_store.py b/quantmind/library/_internal/sqlite_store.py index 3a7eb12..cbe4ebd 100644 --- a/quantmind/library/_internal/sqlite_store.py +++ b/quantmind/library/_internal/sqlite_store.py @@ -21,7 +21,7 @@ Thesis, TreeKnowledge, ) -from quantmind.library._internal.exact_cosine import _IndexRecord +from quantmind.library._internal.llamaindex_retriever import _IndexRecord from quantmind.library._internal.retrieval_targets import ( _PROJECTION_SCHEMA_VERSION, _RetrievalTarget, diff --git a/quantmind/library/local.py b/quantmind/library/local.py index 6055d05..a2a8c58 100644 --- a/quantmind/library/local.py +++ b/quantmind/library/local.py @@ -1,4 +1,4 @@ -"""Opinionated SQLite and NumPy semantic knowledge library.""" +"""Opinionated SQLite and LlamaIndex semantic knowledge library.""" import asyncio from pathlib import Path @@ -7,16 +7,16 @@ from typing_extensions import Self from quantmind.knowledge import BaseKnowledge, TreeKnowledge -from quantmind.library._internal.exact_cosine import ( - _coerce_provider_vectors, - _decode_stored_vector, - _encode_vector, - _ExactCosineIndex, -) from quantmind.library._internal.index_embeddings import ( _EmbeddingProvider, _OpenAIEmbeddingProvider, ) +from quantmind.library._internal.llamaindex_retriever import ( + _coerce_provider_vectors, + _decode_stored_vector, + _encode_vector, + _LlamaIndexRetriever, +) from quantmind.library._internal.retrieval_targets import ( _PROJECTION_SCHEMA_VERSION, _project_knowledge, @@ -42,7 +42,7 @@ def __init__( self._embedding_dimensions = embedding_dimensions self._embedding_provider = embedding_provider self._lock = asyncio.Lock() - self._index: _ExactCosineIndex | None = None + self._index: _LlamaIndexRetriever | None = None @classmethod async def open( @@ -150,20 +150,20 @@ async def get(self, item_id: UUID) -> BaseKnowledge: return store.get(item_id) async def search(self, query: SemanticQuery) -> list[SemanticHit]: - """Rank filtered targets with deterministic exact cosine similarity.""" + """Rank filtered targets through the private LlamaIndex retriever.""" async with self._lock: store = self._store if store is None: raise RuntimeError("LocalKnowledgeLibrary is closed") if self._index is None: - self._index = _ExactCosineIndex.build( + self._index = _LlamaIndexRetriever( store.load_index_records( embedding_model=self._embedding_model, embedding_dimensions=self._embedding_dimensions, ) ) candidates = self._index.filter(query) - if candidates is None: + if not candidates: return [] provider_values = await self._embedding_provider.embed( @@ -176,7 +176,9 @@ async def search(self, query: SemanticQuery) -> list[SemanticHit]: expected_count=1, expected_dimensions=self._embedding_dimensions, ) - ranked = candidates.rank(query_vectors[0], top_k=query.top_k) + ranked = self._index.rank( + candidates, query_vectors[0], top_k=query.top_k + ) canonical: dict[UUID, BaseKnowledge] = {} hits: list[SemanticHit] = [] diff --git a/quantmind/preprocess/__init__.py b/quantmind/preprocess/__init__.py index 97ca7ed..2de8f47 100644 --- a/quantmind/preprocess/__init__.py +++ b/quantmind/preprocess/__init__.py @@ -31,9 +31,19 @@ resolve_doi, ) from quantmind.preprocess.format import ( + BoundingBox, + ParsedChunk, + ParsedDocument, + ParsedDocumentHit, + ParsedPage, PdfParseError, + SentenceSplitterConfig, + TextBlock, + chunk_parsed_document, html_to_markdown, + parse_pdf, pdf_to_markdown, + retrieve_parsed_document, ) from quantmind.preprocess.news import ( BodySource, @@ -61,6 +71,7 @@ __all__ = [ "ArxivIdParseError", + "BoundingBox", "BodySource", "CrossrefMetadata", "FeedItem", @@ -75,14 +86,21 @@ "NewsFailure", "NewsFailureStage", "NewsTickerHint", + "ParsedChunk", + "ParsedDocument", + "ParsedDocumentHit", + "ParsedPage", "PdfParseError", "RawFeed", "RawNewsDocument", "RawPaper", + "SentenceSplitterConfig", + "TextBlock", "build_news_identity", "build_sec_news_identity", "business_days_between", "canonicalize_source_url", + "chunk_parsed_document", "collapse_whitespace", "dedupe_lines", "extract_exchange_ticker_hints", @@ -99,11 +117,13 @@ "parse_feed", "parse_filing_date", "parse_news_datetime", + "parse_pdf", "pdf_to_markdown", "preprocess_feed_item", "preprocess_news_document", "preprocess_news_url", "read_local_file", "resolve_doi", + "retrieve_parsed_document", "to_utc", ] diff --git a/quantmind/preprocess/format/__init__.py b/quantmind/preprocess/format/__init__.py index 9edc5ff..a1e52fb 100644 --- a/quantmind/preprocess/format/__init__.py +++ b/quantmind/preprocess/format/__init__.py @@ -1,10 +1,33 @@ """Format layer — turns raw bytes into LLM-friendly markdown/text.""" from quantmind.preprocess.format.html import html_to_markdown -from quantmind.preprocess.format.pdf import PdfParseError, pdf_to_markdown +from quantmind.preprocess.format.pdf import ( + BoundingBox, + ParsedChunk, + ParsedDocument, + ParsedDocumentHit, + ParsedPage, + PdfParseError, + SentenceSplitterConfig, + TextBlock, + chunk_parsed_document, + parse_pdf, + pdf_to_markdown, + retrieve_parsed_document, +) __all__ = [ + "BoundingBox", + "ParsedChunk", + "ParsedDocument", + "ParsedDocumentHit", + "ParsedPage", "PdfParseError", + "SentenceSplitterConfig", + "TextBlock", + "chunk_parsed_document", "html_to_markdown", + "parse_pdf", "pdf_to_markdown", + "retrieve_parsed_document", ] diff --git a/quantmind/preprocess/format/pdf.py b/quantmind/preprocess/format/pdf.py index 2e5a727..ab98021 100644 --- a/quantmind/preprocess/format/pdf.py +++ b/quantmind/preprocess/format/pdf.py @@ -1,67 +1,320 @@ -"""PDF -> markdown via PyMuPDF. - -PR4 ships a single deterministic engine (``pymupdf``). High-quality -markdown engines (``marker-pdf``, ``llama-parse``) arrive as opt-in -``engine`` arguments in follow-up issues. - -The actual fitz call is CPU-bound, so it runs through -:func:`asyncio.to_thread` to keep the event loop responsive when several -papers are being processed concurrently. -""" +"""Page-aware PDF parsing and private LlamaIndex ingestion.""" import asyncio +import hashlib +import json +import tempfile +from dataclasses import dataclass +from importlib.metadata import version +from pathlib import Path +from typing import Any -import pymupdf +from liteparse import LiteParse, ParseError +from llama_index.core import Document +from llama_index.core.node_parser import SentenceSplitter +from llama_index.core.schema import BaseNode, MetadataMode, TextNode +from llama_index.retrievers.bm25 import BM25Retriever class PdfParseError(ValueError): - """Raised when PyMuPDF refuses to open the byte stream.""" + """Raised when a PDF cannot be parsed into a complete page sequence.""" -def _extract_text_sync(pdf_bytes: bytes) -> str: - try: - doc = pymupdf.open(stream=pdf_bytes, filetype="pdf") - except Exception as exc: - raise PdfParseError(f"pymupdf could not open pdf bytes: {exc}") from exc +@dataclass(frozen=True) +class BoundingBox: + """A rectangle in top-left-origin PDF page coordinates.""" + + x0: float + y0: float + x1: float + y1: float + + +@dataclass(frozen=True) +class TextBlock: + """One parser-provided text block on a physical PDF page.""" + + text: str + page_number: int + bbox: BoundingBox + font_name: str | None = None + font_size: float | None = None + confidence: float | None = None + + +@dataclass(frozen=True) +class ParsedPage: + """One physical PDF page, including empty pages.""" + + page_number: int + width: float + height: float + text: str + blocks: tuple[TextBlock, ...] + screenshot_path: str | None = None + image_paths: tuple[str, ...] = () + + +@dataclass(frozen=True) +class ParsedDocument: + """Deterministic page-aware result for one exact PDF byte stream.""" + + source_hash: str + parser_name: str + parser_version: str + cleanup_version: str + pages: tuple[ParsedPage, ...] + + +@dataclass(frozen=True) +class SentenceSplitterConfig: + """Supported LlamaIndex sentence-splitting parameters.""" + + chunk_size: int = 512 + chunk_overlap: int = 64 + + +@dataclass(frozen=True) +class ParsedChunk: + """QuantMind view of a private LlamaIndex text node.""" + + chunk_id: str + text: str + source_hash: str + page_number: int + block_boxes: tuple[BoundingBox, ...] + screenshot_path: str | None + image_paths: tuple[str, ...] + +@dataclass(frozen=True) +class ParsedDocumentHit: + """Ranked page-aware evidence returned from document retrieval.""" + + chunk: ParsedChunk + score: float + + +def _write_artifacts( + parser: LiteParse, + pdf_bytes: bytes, + artifact_dir: Path, + images: list[Any], +) -> tuple[dict[int, str], dict[int, tuple[str, ...]]]: + artifact_dir.mkdir(parents=True, exist_ok=True) + screenshots_dir = artifact_dir / "screenshots" + screenshots_dir.mkdir(exist_ok=True) + image_dir = artifact_dir / "images" + image_dir.mkdir(exist_ok=True) + with tempfile.NamedTemporaryFile(suffix=".pdf") as source: + source.write(pdf_bytes) + source.flush() + screenshots = parser.screenshot(source.name) + screenshot_paths: dict[int, str] = {} + for screenshot in screenshots: + path = screenshots_dir / f"page_{screenshot.page_num}.png" + path.write_bytes(screenshot.image_bytes) + screenshot_paths[screenshot.page_num] = str(path.resolve()) + image_paths: dict[int, list[str]] = {} + for image in images: + path = image_dir / f"page_{image.page}_{image.id}.{image.format}" + path.write_bytes(image.bytes) + image_paths.setdefault(image.page, []).append(str(path.resolve())) + return screenshot_paths, { + page: tuple(paths) for page, paths in image_paths.items() + } + + +def _parse_pdf_sync( + pdf_bytes: bytes, + artifact_dir: Path | None, +) -> ParsedDocument: + parser = LiteParse(ocr_enabled=False, image_mode="embed", quiet=True) try: - page_texts: list[str] = [] - for page in doc: - # pymupdf's stubs vary across versions: older releases miss - # Page.get_text entirely; newer ones type the optional ``option`` - # arg as a Literal union that fans out the return into - # ``str | list | dict``. Both cases need narrowing here. - extracted = page.get_text() # pyright: ignore[reportAttributeAccessIssue] - text = extracted if isinstance(extracted, str) else "" - if text.strip(): - page_texts.append(text) - finally: - doc.close() - - return "\n\n".join(page_texts) + result = parser.parse(pdf_bytes) + screenshots: dict[int, str] = {} + images: dict[int, tuple[str, ...]] = {} + if artifact_dir is not None: + screenshots, images = _write_artifacts( + parser, pdf_bytes, artifact_dir, result.images + ) + except (ParseError, OSError, ValueError) as exc: + raise PdfParseError( + f"LiteParse could not parse PDF bytes: {exc}" + ) from exc + pages: list[ParsedPage] = [] + expected_page = 1 + for page in result.pages: + if page.page_num != expected_page: + raise PdfParseError( + "LiteParse returned a non-contiguous physical page sequence" + ) + blocks = tuple( + TextBlock( + text=item.text, + page_number=page.page_num, + bbox=BoundingBox( + x0=item.x, + y0=item.y, + x1=item.x + item.width, + y1=item.y + item.height, + ), + font_name=item.font_name, + font_size=item.font_size, + confidence=item.confidence, + ) + for item in page.text_items + ) + pages.append( + ParsedPage( + page_number=page.page_num, + width=page.width, + height=page.height, + text=page.text, + blocks=blocks, + screenshot_path=screenshots.get(page.page_num), + image_paths=images.get(page.page_num, ()), + ) + ) + expected_page += 1 + if not pages: + raise PdfParseError("LiteParse returned no physical pages") + return ParsedDocument( + source_hash=hashlib.sha256(pdf_bytes).hexdigest(), + parser_name="liteparse", + parser_version=version("liteparse"), + cleanup_version="1", + pages=tuple(pages), + ) -async def pdf_to_markdown(pdf_bytes: bytes) -> str: - """Convert PDF bytes to a plain-text/markdown string. - PyMuPDF returns plain text rather than rich markdown — there is no - structural tree (headings, tables, math) reconstruction. Downstream - consumers that need higher-fidelity markdown should wait for the - marker-pdf engine option (follow-up issue) or pass the raw text to an - LLM. +async def parse_pdf( + pdf_bytes: bytes, + *, + artifact_dir: str | Path | None = None, +) -> ParsedDocument: + """Parse exact PDF bytes while preserving physical pages and artifacts. Args: - pdf_bytes: Raw PDF bytes (e.g. from - :func:`quantmind.preprocess.fetch.fetch_url` or - :func:`fetch_arxiv`). + pdf_bytes: Exact bytes of one PDF source version. + artifact_dir: Optional directory for page screenshots and extracted images. Returns: - Concatenated per-page text, separated by blank lines. Empty pages - are dropped. + A page-aware deterministic document. Raises: - PdfParseError: If PyMuPDF cannot open the byte stream. + PdfParseError: If input is empty, invalid, or has missing pages. """ if not pdf_bytes: raise PdfParseError("pdf_bytes is empty") - return await asyncio.to_thread(_extract_text_sync, pdf_bytes) + path = Path(artifact_dir).expanduser() if artifact_dir is not None else None + return await asyncio.to_thread(_parse_pdf_sync, pdf_bytes, path) + + +def _page_metadata( + document: ParsedDocument, page: ParsedPage +) -> dict[str, Any]: + return { + "source_hash": document.source_hash, + "page_number": page.page_number, + "block_boxes": json.dumps( + [ + [block.bbox.x0, block.bbox.y0, block.bbox.x1, block.bbox.y1] + for block in page.blocks + ], + separators=(",", ":"), + ), + "screenshot_path": page.screenshot_path or "", + "image_paths": json.dumps(page.image_paths, separators=(",", ":")), + } + + +def _to_llama_documents(document: ParsedDocument) -> list[Document]: + return [ + Document( + text=page.text, + id_=f"{document.source_hash}:page:{page.page_number}", + metadata=_page_metadata(document, page), + excluded_embed_metadata_keys=[ + "block_boxes", + "screenshot_path", + "image_paths", + ], + excluded_llm_metadata_keys=["block_boxes"], + ) + for page in document.pages + if page.text.strip() + ] + + +def _node_to_chunk(node: BaseNode) -> ParsedChunk: + metadata = node.metadata + boxes = tuple( + BoundingBox(*values) for values in json.loads(metadata["block_boxes"]) + ) + return ParsedChunk( + chunk_id=node.node_id, + text=node.get_content(metadata_mode=MetadataMode.NONE), + source_hash=str(metadata["source_hash"]), + page_number=int(metadata["page_number"]), + block_boxes=boxes, + screenshot_path=str(metadata["screenshot_path"]) or None, + image_paths=tuple(json.loads(metadata["image_paths"])), + ) + + +def chunk_parsed_document( + document: ParsedDocument, + *, + config: SentenceSplitterConfig | None = None, +) -> tuple[ParsedChunk, ...]: + """Split preserved PDF pages with LlamaIndex `SentenceSplitter`.""" + config = config or SentenceSplitterConfig() + splitter = SentenceSplitter( + chunk_size=config.chunk_size, + chunk_overlap=config.chunk_overlap, + ) + nodes = splitter.get_nodes_from_documents(_to_llama_documents(document)) + return tuple(_node_to_chunk(node) for node in nodes) + + +def retrieve_parsed_document( + chunks: tuple[ParsedChunk, ...], + query: str, + *, + top_k: int = 5, +) -> tuple[ParsedDocumentHit, ...]: + """Rank parsed chunks with the private LlamaIndex BM25 retriever.""" + if not query.strip(): + raise ValueError("query must not be blank") + if top_k < 1: + raise ValueError("top_k must be positive") + if not chunks: + return () + nodes: list[BaseNode] = [ + TextNode( + id_=chunk.chunk_id, + text=chunk.text, + metadata={"chunk_index": index}, + ) + for index, chunk in enumerate(chunks) + ] + retriever = BM25Retriever.from_defaults( + nodes=nodes, + similarity_top_k=min(top_k, len(nodes)), + ) + results = retriever.retrieve(query) + return tuple( + ParsedDocumentHit( + chunk=chunks[int(result.node.metadata["chunk_index"])], + score=float(result.score or 0.0), + ) + for result in results + ) + + +async def pdf_to_markdown(pdf_bytes: bytes) -> str: + """Return a compatibility text view derived from preserved PDF pages.""" + document = await parse_pdf(pdf_bytes) + return "\n\n".join(page.text for page in document.pages) diff --git a/scripts/verify_pdf_rag_e2e.py b/scripts/verify_pdf_rag_e2e.py new file mode 100644 index 0000000..e121e61 --- /dev/null +++ b/scripts/verify_pdf_rag_e2e.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Run the bounded live Transformer PDF parsing and retrieval smoke test.""" + +import asyncio + +from quantmind.preprocess import ( + SentenceSplitterConfig, + chunk_parsed_document, + fetch_arxiv, + parse_pdf, + retrieve_parsed_document, +) + +_ARXIV_ID = "1706.03762v7" + + +async def main() -> int: + """Fetch the pinned paper and verify page-aware retrieval.""" + try: + paper = await asyncio.wait_for(fetch_arxiv(_ARXIV_ID), timeout=120) + document = await asyncio.wait_for(parse_pdf(paper.bytes), timeout=120) + chunks = chunk_parsed_document( + document, + config=SentenceSplitterConfig(chunk_size=512, chunk_overlap=64), + ) + hits = retrieve_parsed_document( + chunks, + "How does multi-head attention work?", + top_k=5, + ) + except Exception as exc: + print(f"[FAIL] pdf-rag: {type(exc).__name__}: {exc}") + return 1 + + relevant = [ + hit for hit in hits if "multi-head attention" in hit.chunk.text.lower() + ] + passed = ( + paper.arxiv_id == _ARXIV_ID + and len(document.pages) == 15 + and bool(chunks) + and bool(relevant) + and all(hit.chunk.page_number >= 1 for hit in hits) + ) + state = "PASS" if passed else "FAIL" + print( + f"[{state}] pdf-rag: arxiv={paper.arxiv_id} " + f"pages={len(document.pages)} chunks={len(chunks)} " + f"top_pages={[hit.chunk.page_number for hit in hits]}" + ) + return 0 if passed else 1 + + +if __name__ == "__main__": + raise SystemExit(asyncio.run(main())) diff --git a/tests/preprocess/format/test_pdf.py b/tests/preprocess/format/test_pdf.py index 94e4090..1caac9c 100644 --- a/tests/preprocess/format/test_pdf.py +++ b/tests/preprocess/format/test_pdf.py @@ -1,11 +1,29 @@ -"""Tests for preprocess.format.pdf — pdf_to_markdown via PyMuPDF.""" +"""Tests for page-aware PDF parsing and LlamaIndex ingestion.""" +import hashlib import unittest from pathlib import Path +from tempfile import TemporaryDirectory -from quantmind.preprocess.format.pdf import PdfParseError, pdf_to_markdown +import pymupdf + +from quantmind.preprocess.format.pdf import ( + PdfParseError, + SentenceSplitterConfig, + chunk_parsed_document, + parse_pdf, + pdf_to_markdown, + retrieve_parsed_document, +) _FIXTURE = Path(__file__).resolve().parent.parent / "fixtures" / "tiny.pdf" +_GOLDEN = ( + Path(__file__).resolve().parents[2] + / "fixtures" + / "paper" + / "golden" + / "paper.pdf" +) class PdfToMarkdownTests(unittest.IsolatedAsyncioTestCase): @@ -27,3 +45,93 @@ async def test_returns_str(self): pdf_bytes = _FIXTURE.read_bytes() result = await pdf_to_markdown(pdf_bytes) self.assertIsInstance(result, str) + + async def test_golden_preserves_pages_blocks_coordinates_and_artifacts( + self, + ): + pdf_bytes = _GOLDEN.read_bytes() + with TemporaryDirectory() as artifact_dir: + document = await parse_pdf(pdf_bytes, artifact_dir=artifact_dir) + + self.assertEqual( + document.source_hash, hashlib.sha256(pdf_bytes).hexdigest() + ) + self.assertEqual(document.parser_name, "liteparse") + self.assertEqual( + [page.page_number for page in document.pages], [1, 2, 3, 4] + ) + self.assertIn( + "A Synthetic Cross-Sectional Momentum Study", + document.pages[0].text, + ) + self.assertTrue(all(page.blocks for page in document.pages)) + self.assertTrue( + all( + block.page_number == page.page_number + for page in document.pages + for block in page.blocks + ) + ) + self.assertTrue( + all( + block.bbox.x1 >= block.bbox.x0 + and block.bbox.y1 >= block.bbox.y0 + for page in document.pages + for block in page.blocks + ) + ) + self.assertTrue( + all( + page.screenshot_path is not None + and Path(page.screenshot_path).is_file() + for page in document.pages + ) + ) + + async def test_llamaindex_chunks_and_bm25_hits_keep_page_evidence(self): + document = await parse_pdf(_GOLDEN.read_bytes()) + chunks = chunk_parsed_document( + document, + config=SentenceSplitterConfig(chunk_size=256, chunk_overlap=32), + ) + + self.assertTrue(chunks) + self.assertEqual({chunk.page_number for chunk in chunks}, {1, 2, 3, 4}) + self.assertTrue( + all(chunk.source_hash == document.source_hash for chunk in chunks) + ) + self.assertTrue(all(chunk.block_boxes for chunk in chunks)) + + hits = retrieve_parsed_document( + chunks, + "equal-weighted quintiles long-short portfolio", + top_k=2, + ) + self.assertEqual(len(hits), 2) + self.assertIn(hits[0].chunk.page_number, {3, 4}) + self.assertEqual(hits[0].chunk.source_hash, document.source_hash) + + async def test_empty_physical_page_is_not_dropped_or_renumbered(self): + source = pymupdf.open() + try: + source.new_page().insert_text((72, 72), "first page") + source.new_page() + source.new_page().insert_text((72, 72), "third page") + document = await parse_pdf(source.tobytes()) + finally: + source.close() + + self.assertEqual( + [page.page_number for page in document.pages], [1, 2, 3] + ) + self.assertEqual(document.pages[1].text, "") + self.assertEqual(document.pages[1].blocks, ()) + self.assertIn("third page", document.pages[2].text) + + async def test_retrieval_rejects_invalid_query_arguments(self): + document = await parse_pdf(_FIXTURE.read_bytes()) + chunks = chunk_parsed_document(document) + with self.assertRaisesRegex(ValueError, "query"): + retrieve_parsed_document(chunks, " ") + with self.assertRaisesRegex(ValueError, "top_k"): + retrieve_parsed_document(chunks, "fixture", top_k=0) diff --git a/tests/test_verify_pdf_rag_e2e.py b/tests/test_verify_pdf_rag_e2e.py new file mode 100644 index 0000000..04d89b2 --- /dev/null +++ b/tests/test_verify_pdf_rag_e2e.py @@ -0,0 +1,137 @@ +import io +import unittest +from contextlib import redirect_stdout +from types import SimpleNamespace +from unittest.mock import AsyncMock, patch + +from quantmind.preprocess import ( + ParsedChunk, + ParsedDocument, + ParsedDocumentHit, + ParsedPage, +) +from scripts import verify_pdf_rag_e2e + + +def _document(page_count: int = 15) -> ParsedDocument: + return ParsedDocument( + source_hash="hash", + parser_name="liteparse", + parser_version="2.6.0", + cleanup_version="1", + pages=tuple( + ParsedPage( + page_number=page, + width=612, + height=792, + text=f"page {page}", + blocks=(), + ) + for page in range(1, page_count + 1) + ), + ) + + +def _chunk(text: str, page: int = 5) -> ParsedChunk: + return ParsedChunk( + chunk_id=f"chunk-{page}", + text=text, + source_hash="hash", + page_number=page, + block_boxes=(), + screenshot_path=None, + image_paths=(), + ) + + +class VerifyPdfRagE2ETests(unittest.IsolatedAsyncioTestCase): + async def test_main_passes_pinned_page_and_relevance_checks(self): + paper = SimpleNamespace( + arxiv_id="1706.03762v7", + bytes=b"pdf", + ) + document = _document() + chunks = (_chunk("Multi-head attention projects queries."),) + hits = (ParsedDocumentHit(chunk=chunks[0], score=1.0),) + with ( + patch.object( + verify_pdf_rag_e2e, + "fetch_arxiv", + new=AsyncMock(return_value=paper), + ), + patch.object( + verify_pdf_rag_e2e, + "parse_pdf", + new=AsyncMock(return_value=document), + ), + patch.object( + verify_pdf_rag_e2e, + "chunk_parsed_document", + return_value=chunks, + ), + patch.object( + verify_pdf_rag_e2e, + "retrieve_parsed_document", + return_value=hits, + ), + redirect_stdout(io.StringIO()) as output, + ): + exit_code = await verify_pdf_rag_e2e.main() + + self.assertEqual(exit_code, 0) + self.assertIn("[PASS] pdf-rag", output.getvalue()) + self.assertIn("top_pages=[5]", output.getvalue()) + + async def test_main_reports_upstream_failure(self): + with ( + patch.object( + verify_pdf_rag_e2e, + "fetch_arxiv", + new=AsyncMock(side_effect=TimeoutError("bounded timeout")), + ), + redirect_stdout(io.StringIO()) as output, + ): + exit_code = await verify_pdf_rag_e2e.main() + + self.assertEqual(exit_code, 1) + self.assertIn("[FAIL] pdf-rag: TimeoutError", output.getvalue()) + + async def test_main_rejects_wrong_page_count_or_irrelevant_hits(self): + paper = SimpleNamespace( + arxiv_id="1706.03762v7", + bytes=b"pdf", + ) + document = _document(page_count=14) + chunks = (_chunk("Unrelated passage"),) + hits = (ParsedDocumentHit(chunk=chunks[0], score=1.0),) + with ( + patch.object( + verify_pdf_rag_e2e, + "fetch_arxiv", + new=AsyncMock(return_value=paper), + ), + patch.object( + verify_pdf_rag_e2e, + "parse_pdf", + new=AsyncMock(return_value=document), + ), + patch.object( + verify_pdf_rag_e2e, + "chunk_parsed_document", + return_value=chunks, + ), + patch.object( + verify_pdf_rag_e2e, + "retrieve_parsed_document", + return_value=hits, + ), + redirect_stdout(io.StringIO()) as output, + ): + exit_code = await verify_pdf_rag_e2e.main() + + self.assertEqual(exit_code, 1) + self.assertIn("[FAIL] pdf-rag", output.getvalue()) + + +if __name__ == "__main__": + unittest.main() diff --git a/uv.lock b/uv.lock index 396b4bd..5f241cf 100644 --- a/uv.lock +++ b/uv.lock @@ -2,9 +2,14 @@ version = 1 revision = 1 requires-python = ">=3.10" resolution-markers = [ - "python_full_version >= '3.13' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version == '3.13.*' and sys_platform == 'darwin'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "(python_full_version == '3.13.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.13.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", "python_full_version == '3.12.*' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -16,15 +21,6 @@ resolution-markers = [ "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')", ] -[[package]] -name = "aiofiles" -version = "24.1.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, -] - [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -128,6 +124,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, ] +[[package]] +name = "aiosqlite" +version = "0.22.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/8a/64761f4005f17809769d23e518d915db74e6310474e733e3593cfc854ef1/aiosqlite-0.22.1.tar.gz", hash = "sha256:043e0bd78d32888c0a9ca90fc788b38796843360c855a7262a532813133a0650", size = 14821 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/b7/e3bf5133d697a08128598c8d0abc5e16377b51465a33756de24fa7dee953/aiosqlite-0.22.1-py3-none-any.whl", hash = "sha256:21c002eb13823fad740196c5a2e9d8e62f6243bd9e7e4a1f87fb5e44ecb4fceb", size = 17405 }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -219,20 +224,51 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845 }, +] + +[[package]] +name = "backports-asyncio-runner" +version = "1.2.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313 }, +] + [[package]] name = "banks" -version = "2.1.1" +version = "2.4.5" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "deprecated" }, + { name = "filetype" }, { name = "griffe" }, { name = "jinja2" }, { name = "platformdirs" }, { name = "pydantic" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/87/d83bc8bff3e2e3717c713d5660d6f9cdb6e13cb6f098afc7312da7a94c9a/banks-2.1.1.tar.gz", hash = "sha256:95ec9c8f3c173c9f1c21eb2451ba0e21dda87f1ceb738854fabadb54bc387b86", size = 172905 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/b5/4784ee9518b97f9f69c714a4303f9a6186a7e4ff2349f89e24767e9754d9/banks-2.4.5.tar.gz", hash = "sha256:ff575732fc67d5493a73c21e0d7268bc49e86fff02b0b8735e8efb9fcb9af3a4", size = 190822 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/c0/94d7dbcea4c436eaaffd8faae6b74146a997d1bbe9042da596bf32650928/banks-2.1.1-py3-none-any.whl", hash = "sha256:06e4ee46a0ff2fcdf5f64a5f028a7b7ceb719d5c7b9339f5aa90b24936fbb7f5", size = 28045 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/b0/4d34cb2fe538aeb6d4b0723b3339cb932120db084a5c9a3c6966a26bbe1b/banks-2.4.5-py3-none-any.whl", hash = "sha256:ac2e0091b4c79379d4773c9d04a138a0d937ee27c5803bf0142acc6d6769eea1", size = 36145 }, +] + +[[package]] +name = "basedpyright" +version = "1.39.9" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "nodejs-wheel-binaries" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/4b/c1f4e211e50389304d6af32b9280e026a7133e3ad59bbdf8f7a3250f8bee/basedpyright-1.39.9.tar.gz", hash = "sha256:32cbea5fc8273e89df3db20daea56cb7286e419ccdfdc479c64759d2dc071901", size = 24412216 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/d4/e1fa108710d0498a18c77b1e13897f31eab47c69aa8cfe2d2a4df746541e/basedpyright-1.39.9-py3-none-any.whl", hash = "sha256:6b0837b9eba972c71895167ab9b127e6afdbc17abc92312e3f8d15ca82a5611c", size = 13374276 }, ] [[package]] @@ -249,37 +285,15 @@ wheels = [ ] [[package]] -name = "black" -version = "25.1.0" +name = "bm25s" +version = "0.3.9" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "numpy" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/49/26a7b0f3f35da4b5a65f081943b7bcd22d7002f5f0fb8098ec1ff21cb6ef/black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666", size = 649449 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/ab/39d08d4589dad6f5735a6b03ee083088dc37fba57fa45d4a0749393b9295/bm25s-0.3.9.tar.gz", hash = "sha256:895c679d952b7de8355edb5f3e1a620a1e2f294d1d42b919bf0821cce2e2f597", size = 80528 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/3b/4ba3f93ac8d90410423fdd31d7541ada9bcee1df32fb90d26de41ed40e1d/black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32", size = 1629419 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/02/0bde0485146a8a5e694daed47561785e8b77a0466ccc1f3e485d5ef2925e/black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da", size = 1461080 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/0e/abdf75183c830eaca7589144ff96d49bce73d7ec6ad12ef62185cc0f79a2/black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7", size = 1766886 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/a6/97d8bb65b1d8a41f8a6736222ba0a334db7b7b77b8023ab4568288f23973/black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9", size = 1419404 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/4f/87f596aca05c3ce5b94b8663dbfe242a12843caaa82dd3f85f1ffdc3f177/black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0", size = 1614372 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/d0/2c34c36190b741c59c901e56ab7f6e54dad8df05a6272a9747ecef7c6036/black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299", size = 1442865 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/d4/7518c72262468430ead45cf22bd86c883a6448b9eb43672765d69a8f1248/black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096", size = 1749699 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/db/4f5beb989b547f79096e035c4981ceb36ac2b552d0ac5f2620e941501c99/black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2", size = 1428028 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/71/3fe4741df7adf015ad8dfa082dd36c94ca86bb21f25608eb247b4afb15b2/black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b", size = 1650988 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/f3/89aac8a83d73937ccd39bbe8fc6ac8860c11cfa0af5b1c96d081facac844/black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc", size = 1453985 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/22/b99efca33f1f3a1d2552c714b1e1b5ae92efac6c43e790ad539a163d1754/black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f", size = 1783816 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba", size = 1440860 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/87/0edf98916640efa5d0696e1abb0a8357b52e69e82322628f25bf14d263d1/black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f", size = 1650673 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/e5/f7bf17207cf87fa6e9b676576749c6b6ed0d70f179a3d812c997870291c3/black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3", size = 1453190 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/ee/adda3d46d4a9120772fae6de454c8495603c37c4c3b9c60f25b1ab6401fe/black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171", size = 1782926 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18", size = 1442613 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/71/54e999902aed72baf26bca0d50781b01838251a462612966e9fc4891eadd/black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717", size = 207646 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/83/06582913e2af0cf498cc478350070490b019c6f6b523cb8b6cfafd32f009/bm25s-0.3.9-py3-none-any.whl", hash = "sha256:db997475e82c9e81262b83fefe6a71304f2fdd0dafd037c8929828865fa6d465", size = 74475 }, ] [[package]] @@ -291,26 +305,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, ] -[[package]] -name = "camel-ai" -version = "0.2.42" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "colorama" }, - { name = "docstring-parser" }, - { name = "httpx" }, - { name = "jsonschema" }, - { name = "mcp" }, - { name = "openai" }, - { name = "psutil" }, - { name = "pydantic" }, - { name = "tiktoken" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/6c/d83c3a02aed83d5da49ce259843c585477134a7c8d41d4d800f38dbb1824/camel_ai-0.2.42.tar.gz", hash = "sha256:d6c6125082b9ecaa1fddb61258ad8ea068ad49a0f1a2cdc3cfdfe7495f2ee3b1", size = 493913 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/ce/1fc1fd17168dac8b9c51c2719920b356636ae0f7a40efcaa93a7718dfaab/camel_ai-0.2.42-py3-none-any.whl", hash = "sha256:2248f431516f43f22c6ac644ad09684e1844b3de7ff5a1fcfaf0129f59a7cfeb", size = 830869 }, -] - [[package]] name = "certifi" version = "2025.1.31" @@ -381,9 +375,9 @@ wheels = [ name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, ] [[package]] @@ -459,21 +453,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] -[[package]] -name = "cmd2" -version = "2.6.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "gnureadline", marker = "sys_platform == 'darwin'" }, - { name = "pyperclip" }, - { name = "pyreadline3", marker = "sys_platform == 'win32'" }, - { name = "wcwidth" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/6a/bbd2cb85f5da7c6a53fea13ac1b15c4b1b31bfc5cbada31a0ee6be92e2e8/cmd2-2.6.1.tar.gz", hash = "sha256:650a5892bf29b233d3d6775b5e3cc813648cff0d79134f707981f66baaed9f42", size = 888293 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/13/bd846e43732546ef1806abe113c983555d2cad876839f91659c8df963ceb/cmd2-2.6.1-py3-none-any.whl", hash = "sha256:c4c8e3a515a7e69061b7ebbaadeb9d7fae283b7fee1a44ff169e33e2ccb2eec3", size = 153727 }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -495,6 +474,20 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, ] +[[package]] +name = "courlan" +version = "1.4.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "babel" }, + { name = "tld" }, + { name = "urllib3" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/16/2a771612ee0b3acaa95ac21cc7e8a3319e815d6360f8ffc5987d1ce28499/courlan-1.4.0.tar.gz", hash = "sha256:fbbac7b7fcde2195ea08e707609503c81cf39c891e8d26cdb1fed4585782d63d", size = 208997 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/38/ce65091ff20a16e06d17418c4353af5f56d3190821b1a06983c79ae79274/courlan-1.4.0-py3-none-any.whl", hash = "sha256:ad1dbdefd912ca7238d4607dc855df5df097f56bac175dd662c84eed3802f49e", size = 34193 }, +] + [[package]] name = "coverage" version = "7.9.1" @@ -564,6 +557,53 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cryptography" +version = "45.0.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/35/c495bffc2056f2dadb32434f1feedd79abde2a7f8363e1974afa9c33c7e2/cryptography-45.0.7.tar.gz", hash = "sha256:4b1654dfc64ea479c242508eb8c724044f1e964a47d1d1cacc5132292d851971", size = 744980 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/91/925c0ac74362172ae4516000fe877912e33b5983df735ff290c653de4913/cryptography-45.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3be4f21c6245930688bd9e162829480de027f8bf962ede33d4f8ba7d67a00cee", size = 7041105 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/63/43641c5acce3a6105cf8bd5baeceeb1846bb63067d26dae3e5db59f1513a/cryptography-45.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67285f8a611b0ebc0857ced2081e30302909f571a46bfa7a3cc0ad303fe015c6", size = 4205799 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/29/c238dd9107f10bfde09a4d1c52fd38828b1aa353ced11f358b5dd2507d24/cryptography-45.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:577470e39e60a6cd7780793202e63536026d9b8641de011ed9d8174da9ca5339", size = 4430504 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/62/24203e7cbcc9bd7c94739428cd30680b18ae6b18377ae66075c8e4771b1b/cryptography-45.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4bd3e5c4b9682bc112d634f2c6ccc6736ed3635fc3319ac2bb11d768cc5a00d8", size = 4209542 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/e3/e7de4771a08620eef2389b86cd87a2c50326827dea5528feb70595439ce4/cryptography-45.0.7-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:465ccac9d70115cd4de7186e60cfe989de73f7bb23e8a7aa45af18f7412e75bf", size = 3889244 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/b8/bca71059e79a0bb2f8e4ec61d9c205fbe97876318566cde3b5092529faa9/cryptography-45.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513", size = 4461975 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/67/3f5b26937fe1218c40e95ef4ff8d23c8dc05aa950d54200cc7ea5fb58d28/cryptography-45.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8978132287a9d3ad6b54fcd1e08548033cc09dc6aacacb6c004c73c3eb5d3ac3", size = 4209082 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/e4/b3e68a4ac363406a56cf7b741eeb80d05284d8c60ee1a55cdc7587e2a553/cryptography-45.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b6a0e535baec27b528cb07a119f321ac024592388c5681a5ced167ae98e9fff3", size = 4460397 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/49/2c93f3cd4e3efc8cb22b02678c1fad691cff9dd71bb889e030d100acbfe0/cryptography-45.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a24ee598d10befaec178efdff6054bc4d7e883f615bfbcd08126a0f4931c83a6", size = 4337244 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/19/030f400de0bccccc09aa262706d90f2ec23d56bc4eb4f4e8268d0ddf3fb8/cryptography-45.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd", size = 4568862 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/56/3034a3a353efa65116fa20eb3c990a8c9f0d3db4085429040a7eef9ada5f/cryptography-45.0.7-cp311-abi3-win32.whl", hash = "sha256:bef32a5e327bd8e5af915d3416ffefdbe65ed975b646b3805be81b23580b57b8", size = 2936578 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/61/0ab90f421c6194705a99d0fa9f6ee2045d916e4455fdbb095a9c2c9a520f/cryptography-45.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:3808e6b2e5f0b46d981c24d79648e5c25c35e59902ea4391a0dcb3e667bf7443", size = 3405400 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/e8/c436233ddf19c5f15b25ace33979a9dd2e7aa1a59209a0ee8554179f1cc0/cryptography-45.0.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bfb4c801f65dd61cedfc61a83732327fafbac55a47282e6f26f073ca7a41c3b2", size = 7021824 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/4c/8f57f2500d0ccd2675c5d0cc462095adf3faa8c52294ba085c036befb901/cryptography-45.0.7-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:81823935e2f8d476707e85a78a405953a03ef7b7b4f55f93f7c2d9680e5e0691", size = 4202233 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/ac/59b7790b4ccaed739fc44775ce4645c9b8ce54cbec53edf16c74fd80cb2b/cryptography-45.0.7-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3994c809c17fc570c2af12c9b840d7cea85a9fd3e5c0e0491f4fa3c029216d59", size = 4423075 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/56/d4f07ea21434bf891faa088a6ac15d6d98093a66e75e30ad08e88aa2b9ba/cryptography-45.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dad43797959a74103cb59c5dac71409f9c27d34c8a05921341fb64ea8ccb1dd4", size = 4204517 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/ac/924a723299848b4c741c1059752c7cfe09473b6fd77d2920398fc26bfb53/cryptography-45.0.7-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ce7a453385e4c4693985b4a4a3533e041558851eae061a58a5405363b098fcd3", size = 3882893 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/dc/4dab2ff0a871cc2d81d3ae6d780991c0192b259c35e4d83fe1de18b20c70/cryptography-45.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b04f85ac3a90c227b6e5890acb0edbaf3140938dbecf07bff618bf3638578cf1", size = 4450132 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/dd/b2882b65db8fc944585d7fb00d67cf84a9cef4e77d9ba8f69082e911d0de/cryptography-45.0.7-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:48c41a44ef8b8c2e80ca4527ee81daa4c527df3ecbc9423c41a420a9559d0e27", size = 4204086 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/fa/1d5745d878048699b8eb87c984d4ccc5da4f5008dfd3ad7a94040caca23a/cryptography-45.0.7-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17", size = 4449383 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/8b/fc61f87931bc030598e1876c45b936867bb72777eac693e905ab89832670/cryptography-45.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b", size = 4332186 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/11/09700ddad7443ccb11d674efdbe9a832b4455dc1f16566d9bd3834922ce5/cryptography-45.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1993a1bb7e4eccfb922b6cd414f072e08ff5816702a0bdb8941c247a6b1b287c", size = 4561639 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/ed/8f4c1337e9d3b94d8e50ae0b08ad0304a5709d483bfcadfcc77a23dbcb52/cryptography-45.0.7-cp37-abi3-win32.whl", hash = "sha256:18fcf70f243fe07252dcb1b268a687f2358025ce32f9f88028ca5c364b123ef5", size = 2926552 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/ff/026513ecad58dacd45d1d24ebe52b852165a26e287177de1d545325c0c25/cryptography-45.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:7285a89df4900ed3bfaad5679b1e668cb4b38a8de1ccbfc84b05f34512da0a90", size = 3392742 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/3e/e42f1528ca1ea82256b835191eab1be014e0f9f934b60d98b0be8a38ed70/cryptography-45.0.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:de58755d723e86175756f463f2f0bddd45cc36fbd62601228a3f8761c9f58252", size = 3572442 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/aa/e947693ab08674a2663ed2534cd8d345cf17bf6a1facf99273e8ec8986dc/cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a20e442e917889d1a6b3c570c9e3fa2fdc398c20868abcea268ea33c024c4083", size = 4142233 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/06/09b6f6a2fc43474a32b8fe259038eef1500ee3d3c141599b57ac6c57612c/cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:258e0dff86d1d891169b5af222d362468a9570e2532923088658aa866eb11130", size = 4376202 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/f2/c166af87e95ce6ae6d38471a7e039d3a0549c2d55d74e059680162052824/cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d97cf502abe2ab9eff8bd5e4aca274da8d06dd3ef08b759a8d6143f4ad65d4b4", size = 4141900 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/b9/e96e0b6cb86eae27ea51fa8a3151535a18e66fe7c451fa90f7f89c85f541/cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:c987dad82e8c65ebc985f5dae5e74a3beda9d0a2a4daf8a1115f3772b59e5141", size = 4375562 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/d0/36e8ee39274e9d77baf7d0dafda680cba6e52f3936b846f0d56d64fec915/cryptography-45.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c13b1e3afd29a5b3b2656257f14669ca8fa8d7956d509926f0b130b600b50ab7", size = 3322781 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/4e/49199a4c82946938a3e05d2e8ad9482484ba48bbc1e809e3d506c686d051/cryptography-45.0.7-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a862753b36620af6fc54209264f92c716367f2f0ff4624952276a6bbd18cbde", size = 3584634 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/ce/5f6ff59ea9c7779dba51b84871c19962529bdcc12e1a6ea172664916c550/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:06ce84dc14df0bf6ea84666f958e6080cdb6fe1231be2a51f3fc1267d9f3fb34", size = 4149533 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/13/b3cfbd257ac96da4b88b46372e662009b7a16833bfc5da33bb97dd5631ae/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d0c5c6bac22b177bf8da7435d9d27a6834ee130309749d162b26c3105c0795a9", size = 4385557 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/c5/8c59d6b7c7b439ba4fc8d0cab868027fd095f215031bc123c3a070962912/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:2f641b64acc00811da98df63df7d59fd4706c0df449da71cb7ac39a0732b40ae", size = 4149023 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/32/05385c86d6ca9ab0b4d5bb442d2e3d85e727939a11f3e163fc776ce5eb40/cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:f5414a788ecc6ee6bc58560e85ca624258a55ca434884445440a810796ea0e0b", size = 4385722 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/87/7ce86f3fa14bc11a5a48c30d8103c26e09b6465f8d8e9d74cf7a0714f043/cryptography-45.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f3d56f73595376f4244646dd5c5870c14c196949807be39e79e7bd9bac3da63", size = 3332908 }, +] + [[package]] name = "dataclasses-json" version = "0.6.7" @@ -577,6 +617,21 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl", hash = "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", size = 28686 }, ] +[[package]] +name = "dateparser" +version = "1.4.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "regex" }, + { name = "tzlocal" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/f4/561c49bca97af561d34eed27e3e831135eb5cb88e754c1150be41820f5c6/dateparser-1.4.1.tar.gz", hash = "sha256:f265df13c0380e2e07543ba74b67c0681aaa1096981ffcd35227e1aa0cb81c7c", size = 314734 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/7c/2e5dcf53909deddd0bf38cbe277ad9806be038276b1c6c436561b4d9b2e2/dateparser-1.4.1-py3-none-any.whl", hash = "sha256:f25d4e051a84be27a35bd297e3e1dc59ff78373701b89be352ba80372d22d0d0", size = 300503 }, +] + [[package]] name = "debugpy" version = "1.8.14" @@ -611,6 +666,15 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" }, +] + [[package]] name = "deprecated" version = "1.2.18" @@ -650,24 +714,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, ] -[[package]] -name = "docstring-parser" -version = "0.15" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/2d/ea1dfc15b909cc660f657a3a9d698a2916b7f3b05535a2d72e8d7ea3ad5b/docstring_parser-0.15.tar.gz", hash = "sha256:48ddc093e8b1865899956fcc03b03e66bb7240c310fac5af81814580c55bf682", size = 26768 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/e3/32e272db7adcf90e93f73e9a98fd763049ed7c641fb57ab26cb8f3e7e79c/docstring_parser-0.15-py3-none-any.whl", hash = "sha256:d1679b86250d269d06a99670924d6bce45adc00b08069dae8c47d98e89b667a9", size = 36093 }, -] - -[[package]] -name = "einops" -version = "0.8.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/81/df4fbe24dff8ba3934af99044188e20a98ed441ad17a274539b74e82e126/einops-0.8.1.tar.gz", hash = "sha256:de5d960a7a761225532e0f1959e5315ebeafc0cd43394732f103ca44b9837e84", size = 54805 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359 }, -] - [[package]] name = "exceptiongroup" version = "1.2.2" @@ -806,22 +852,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083", size = 44821 }, ] -[[package]] -name = "gnureadline" -version = "8.2.13" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/92/20723aa239b9a8024e6f8358c789df8859ab1085a1ae106e5071727ad20f/gnureadline-8.2.13.tar.gz", hash = "sha256:c9b9e1e7ba99a80bb50c12027d6ce692574f77a65bf57bc97041cf81c0f49bd1", size = 3224991 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/4f/81ff367156444f67d16cc8d9023b4a0a3f4bd29acaf8f8e510c7872b6927/gnureadline-8.2.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ca03501ce0939d7ecf9d075860d6f6ceb2f49f30331b4e96e4678ce03687bab", size = 160572 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/06/0297bdde1e4a842ec786b9b7c9fca53116bac8fe2aed9769000f652fd1e3/gnureadline-8.2.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c28e33bfc56d4204693f213abeab927f65c505ce91f668a039720bc7c46b0353", size = 162590 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/ad/a6c59fcdbc8173bc538dad042696b732d39bc8de95adb07664b124c07942/gnureadline-8.2.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:561a60b12f74ea7234036cc4fe558f3b46023be0dac5ed73541ece58cba2f88a", size = 160575 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/9b/464929f1e81ba4ea4fafb033c38eefedc533b503d777e91ffa12751ad34e/gnureadline-8.2.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:daa405028b9fe92bfbb93624e13e0674a242a1c5434b70ef61a04294502fdb65", size = 162528 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/bd/df8fd060e43efd3dbdd3b210bf558ce3ef854843cd093f910f4115ebe2e9/gnureadline-8.2.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c152a82613fa012ab4331bb9a0ffddb415e37561d376b910bf9e7d535607faf", size = 160504 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/ee/322e5340c8cdfa40e71bd0485a82404ad4cf9aed2260cca090f3c1a3a032/gnureadline-8.2.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:85e362d2d0e85e45f0affae7bbfaf998b00167c55a78d31ee0f214de9ff429d2", size = 162380 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/b0/4a3c55a05b4c1c240fd6dc204ff597432008c4649ce500688a2441d27cf4/gnureadline-8.2.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d3e33d2e0dd694d623a2ca1fae6990b52f1d25955504b7293a9350fb9912940", size = 160646 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/41/8821db40f2b0dd9cc935d6838bc63776fb5bfb1df092f8d4698ec29ada6a/gnureadline-8.2.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6c550d08c4d2882a83293a724b14a262ee5078fd4fa7acdc78aa59cab26ae343", size = 162630 }, -] - [[package]] name = "google-auth" version = "2.40.3" @@ -918,6 +948,117 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl", hash = "sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423", size = 129187 }, ] +[[package]] +name = "griffelib" +version = "2.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/e4/8d187ea29c2e30b3a09505c567513077d6117861bde1fbd997a167f262ec/griffelib-2.1.0.tar.gz", hash = "sha256:762a186d2c6fd6794d4ea20d428d597ffb857cb56b66421651cbba15bdd5e813", size = 216234 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/d3/5268aeabf2ad82658c4e2ff3a060648d0f02f3926cb53247c0e4d0dab49e/griffelib-2.1.0-py3-none-any.whl", hash = "sha256:cc7b3d2d2865ad0b909fcc38086e3f554b5ea7acbaa7bbb7ecaa3f5dfb7d9f00", size = 142560 }, +] + +[[package]] +name = "grimp" +version = "3.15" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/73/ce58881177b003def779c87b5e10f396deef068933c97d6d206bd46d4cb7/grimp-3.15.tar.gz", hash = "sha256:91b57d4d801dc107ebfb5a7040d4777a152c579b5dc202426e1185e50931fe1e", size = 831734 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/25/98a2c934f1cd57183379c742538c82c5b12be5019d347b7312c1858d24fe/grimp-3.15-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:daa46ccb1c6bb158bf1060f314a535136ae6f735a40014f9a42d9bd1a5d9dccb", size = 2141874 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/40/a63edd7506e55d131274e70ac17ee39f367ceb30311ca5a11853bd23faaf/grimp-3.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f0ef0b5f44bdd1e859c3019e325dc5fb5360e922b69fd2d29fc0b1ff98867fd", size = 2098011 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/92/33adfc894474384c3ce8c2e4d2829f3c854a8fb5ffd70b9e899c17cd4694/grimp-3.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57bc558882a643811442b7cb88976af497a2b24096d251f2000d1d5caffd4eec", size = 2262954 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/1a/20191dece2ca62f0b57d623b43af745041df9bb52a7f541e4b68627c34c1/grimp-3.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4f4db552d3b4e62da6c223fb9b66eac7776db1369dd9b6795713dcb629ed26d", size = 2196652 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/fd/559f205a057aa9a997576d6431d6ac33a4ccc8c09c097e9b9ddb1cf4ba84/grimp-3.15-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ad1a9d1244aa4b6d60015d9f655dc91c113c5bedf3b454ee4aad51de3eae416", size = 2350845 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/eb/c0824cea19d9d7890f62c28ce1589e5b7f1728e9e279771d61aefe80f280/grimp-3.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c0fa41d0bcb3f762f323d3d0ce2569c69f83053cd56be1270f3691feb8b3ba9", size = 2610304 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/ae/96d4ccfa7964af6662a6f90e3dd7d1fe5ee003699a292cbee03dabb4f64e/grimp-3.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2ca52d0505d6d7b59655e76f1dd4cc32b516ad7a388a1a2dcb0c583d0d8b6ff", size = 2331251 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/8a/4a948cf4e8781851f9a3d4de6e3bd00f82a5eb928a2144c89b3d9d449868/grimp-3.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bba4bac2fdf6cd30967fdf7c71f200736c0340d8b3636f0aec1e2c4ae813805", size = 2278246 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/6e/f9674ca5dc379a564ab880796f11259b821e5322a82e5c66082838e631b1/grimp-3.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1661b1b4ad695c3126964635443699ed4cd994f240ea0758a5f3fc67a21b8111", size = 2440493 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/77/4394d93f7b8068e26976bcc065d4c8271e507bee0b27406b7ba4d43850aa/grimp-3.15-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e66609ee48af343a909084838168f535f31fbe8cd23cc10518da4600139dfd3f", size = 2471830 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/0d/f207c2aa33a1401113db4b8e5824cbaf318046354ca5890643484ef7c50f/grimp-3.15-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:659962cc29f90ec23d42313c5aac15928242e7ed3113ac130ee4b7fc0624cbb2", size = 2511431 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/d6/d6697cb2a49cb3e2a6be58b4fe5e0bc645cafc7c4818d66ce0e77d75495f/grimp-3.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a462896e003e5b4f71ef171901c0f6285137a8bbea7f5e01b887a8976acaf0d", size = 2520347 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/85/5dc1948b6f1f1750c0299282c3292580e92e56c6676360fc00e2bff5bfc5/grimp-3.15-cp310-cp310-win32.whl", hash = "sha256:a209cc5618cb7657fa9659eb45c23b6f47e9c8b4da682369069892c534e9e0b6", size = 1856818 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/7a/be9cae20a270c25d1dc23a08e178bc66ab0a0a70a830bdda068170e26894/grimp-3.15-cp310-cp310-win_amd64.whl", hash = "sha256:9e3af741f8136452a7c29373c717ca8877e492b8efdf3da232391e9dbbb5dbe3", size = 1988060 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/06/dd37dd3e282e90856215ea406415ba0c18cb77cf3150ffa47bd1137c8daf/grimp-3.15-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cc467bdf890b26545989994c5f91d99fb2b911bbc09d48cebf906082fb2c01d1", size = 2140928 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/b0/9329b8df4916cd60a1b358e527fcb9239604a1eca88483deb68ab95d9d5a/grimp-3.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:571d62c2f2e264ed83a9b283b0c1e322902ea3af8a9ad20d9f7cc5be3049be25", size = 2097876 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/ff/4352eb0a6549faefeaae1514f2994f6d9148b12db10e49d94935109cd4cd/grimp-3.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c36369902389e080f708560621f29e2b64957a6bfa5afb06c13b74105039d6", size = 2262242 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/3a/a7ddecd677891070277f92e71bc41c10c423a3317eb412f9636b4cbb32e3/grimp-3.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44a3a576bb0c5d0754108f0b6cedbeaee66a123112c71a8f4796656c9e52c5cd", size = 2196892 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/e2/8a7502011e324902853df7daecc3d6d651464920aad93a1a7ad9bd833105/grimp-3.15-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b833af82a197371c0b0b69ec600413d9b50109fec2f8e1e1317b1c226a3e07", size = 2348919 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/55/0570ff9ea16c8280de2e84b52006dd588b208716e73794cb332c43d1eb72/grimp-3.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6167c3d6e30ac8ff0a32260edf51fad5c22ec77b04e85a8a0042c1ba78bf6846", size = 2609501 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/14/34482976316834848df5eb68ec2283c13f84bfab12b21b8c11e4f3442e77/grimp-3.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6c18582eb87e148da11ad6549ec006186460ed29959afb15e093c34696d0134", size = 2329567 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/1b/2803b1234cf5e663c00b9fb2318a93b8db3831942ff053276234fa6731ab/grimp-3.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c941ed53672f9d136f898bf41557062dc4ed4c4fd10c88e47499e7db1c436ec", size = 2277972 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/96/fd25b4a61851db6ca82d4007e1981d9832dff7c34c7b02a975e0bf3da89f/grimp-3.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4d46417bd6fffa56814b1cf8ffe756fe761d8e5eb691f1d7aaa8a0aba37af05a", size = 2440215 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/44/d065613d4cbdc108c33db5978351303cfcedfa2f6d55dcff432c722b3568/grimp-3.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1f39ca69733dc9cc2f4e7c6647ebbb9a85e1b615b6b808187b0fc6dc6f3a9354", size = 2471902 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/01/1eb96d3b2f61d04a5bfe0502216e248cfa0dfe34697cf56ab74e762983d7/grimp-3.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dcbea03a4502291b6014530267a6447365557a7870524202034a9ceac4f26fdd", size = 2509411 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/b6/89a69f121848b2324403ace3e3487c0074bf1257507b743fbebd281d270f/grimp-3.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c88386fac08a96933387d4058ef246b191872f7bd75a01c8655b70c8d1a0433a", size = 2519817 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/18/9916c71ad9039e74148d9d3b8da4b6cf87900290edc0e7be1a891c840b66/grimp-3.15-cp311-cp311-win32.whl", hash = "sha256:788e1f019052fd6b4dc24ed9892de4f0f24e8e845bd01d146ee549515f70a9bc", size = 1856929 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/9f/6b349a4aee939b52a244c87e49f584ecad7ca4db67aea70d2d49c7709c26/grimp-3.15-cp311-cp311-win_amd64.whl", hash = "sha256:bfe2d28a94eb97db739382c4d377c8c014020eb6cc1599bcf950c9a2a60fce9d", size = 1988289 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/66/621abde26d8ece0d34ba611ca94bc62bf8c9c4389760d8909b0d96964878/grimp-3.15-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:915ea140cf55107fd6825c3e9eae2c4fda18aa19b87e8eee05d510b4d44ab928", size = 2143914 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/76/a27fff8de84dbf46db9d6da937fe772f04a0e21e057a4863fd30e6fcaa55/grimp-3.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ae2d4d958d871792a9686ad51845e9e1e0886e9db13ecc47a9475899f4b27db", size = 2089296 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/3d/fe38a0881ce7e00ef8590745853bccff5d337a943dc0d1d0735b0eb605f9/grimp-3.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19a1039d50ed6a9b221f44b32c7b07cb43dda70971e892fe8149995c0e9c1840", size = 2254829 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/a2/ef18989048e8f0c92171eabb15dffe9cd72de6404b86e3a37553f7d16dd6/grimp-3.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5b7b649f2a34278897237670b6650073c9ab0fc1abf56821301bda28cb5c4256", size = 2193553 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/22/82303539d21068021cc28c526be5e1b1cc0b7a61704c1663909497dd9b8a/grimp-3.15-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020a8875c0cb67f407eb019b7be65b574d49071653f155c243f801aa87a1fd4d", size = 2345941 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/20/3c66e7c814ba2b6b0cd230ca2445825c605f28242f4f3a658e5bb9adda73/grimp-3.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f0a0705cf9a10648c4aea71edde8fe3dfbf1cf05bd434ef38c813ad7c544886", size = 2604369 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/7d/2f642969950e096a67a43909ba66f33cb4750974e30c2c771e293aeb787c/grimp-3.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c36373cd0a2d4c9b53fabefbaa9edcc4c511ad2d335fb1296484f6ca550e4f82", size = 2326619 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/99/98d39545e54e239a52a54d8e96752780778b11b5ebc78096dfa090f9d2ac/grimp-3.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:477ac0abcd12c697a0bd01b40875605f7f0db97332df6148e4d4057ee3ad199d", size = 2272955 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/02/fabd5ae2b12276530f4bae038ffcf3a556ac2c9b9fa271f83fbeb4036a08/grimp-3.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:017e493fee9962d50db6f7a8b5d49ad2ae508484a06078d700adbef30f1ff1f0", size = 2431271 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/c8/fa3ec84df9c3ccc2b08177be41a48b76178e9e5773f4471f1caff4fc5c46/grimp-3.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e77982dd5b0977945034fa328f65cfb62ff589cb0da97a0f6042de78525c5c73", size = 2466937 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/7e/52d3acd2bbd6cebdf2ee6546c334f50f6358c25ae58624ae63d2ec3ad30b/grimp-3.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d129a8c57b7a19a44e8da94caf38a02753f1c9953aaba8c1a4633747f097164f", size = 2504734 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/53/ad27750eb8b4a0c3ecb5ca7d78c7230f0f5e814515ed6f8986be527117ff/grimp-3.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ba25002e92b1792f13391295a1f805d2e09781b846d92ec1a791ff9ed89298b6", size = 2514448 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/c0/8cc474a24198c1c2936269c5854be92af41787bd76d3190af584a9cebca7/grimp-3.15-cp312-cp312-win32.whl", hash = "sha256:232bf7a4c7536f62a99478eeb01de63c455261add35ee00c6ec9f04f280f853e", size = 1855806 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/11/e46139fd43dd5714fae93f09f1c858fb2dc83a575d5f8cb1daf8a15a261b/grimp-3.15-cp312-cp312-win_amd64.whl", hash = "sha256:13be2285e358a7687c0f3b798ac9d4819f275976ad8d651297966e5a75bfafb9", size = 1985556 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/6a/3e0a0760cc509cd09764d128de78a1f329740306c74e42dba82c58a99118/grimp-3.15-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f19b957053d1c736aaa0015eed2d4855bb2511637c5360d32b3c5ea045904e7a", size = 2143197 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/2e/127cbce04a5603d382c6a2bbc1a19b6889be49d60b88864bcdb174c8926d/grimp-3.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6480472c2d1f7f6a903906c92e9897d4e3dee5d69ce3881f04368d4ec6d2dde", size = 2088342 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/36/af9df683bf6c8711e0e9136876ca130f9971102d945ff3a36d0c45dae2ec/grimp-3.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c14b64dbf2e4397df2e35fa8aa7028533621ecf1f8ea7ec24bc296a9c695ea4", size = 2254509 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/f5/e712633b68ea14d04e7de84ede4f8ddbba763d5f2d29ae8d6af721f84870/grimp-3.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26364c2c9f7db88243365299b4d1c4d948b74304ff03c8a6e4f028147fed3b22", size = 2193831 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/74/151bdd73d6a60bd77d4b956f36d03dd558dd46a9b5ec8f5ad15921b503d7/grimp-3.15-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69331e1be693415596c6084342059b9ba3ecf1cfe2e3b1c761598dd2fe14d522", size = 2345289 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/b8/3fc950fa73b757cbc35f77542bd662f431b9a8f360e63196ded640771a33/grimp-3.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe397991c269868c2fb08114099b2aa4f1bc803d03fadaaf97e006019f9e5da2", size = 2604407 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/d8/98916b9dc0b89a3e89e0d714ce0872be859fff40ceee3e2cb6886b106eb4/grimp-3.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d556bd62664ee044c47cff64d737be132408064d4ba68ca9f756cb29b41cc2d", size = 2326769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/51/39595c5857f609e976e0bba1f19c1f45182ee4d8d2ea5cdfab72841eafbc/grimp-3.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9061c5b6f01130ff8639c49c80176d29d921acc36741b2ae0b763a7668106082", size = 2272498 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/d8/a44cc9db500ae80c45425238ee44d9556796aa88b8c0649cfa613fb88d14/grimp-3.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9d04c195f0c6da4476361560d3d206a6a784b9eb0da7156fc6974511337e2e3", size = 2431075 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/41/544f197ddb44990789683c25740ffa72474a57f0b16bc6b4a544edf9a2a9/grimp-3.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:01fd68c74cfd08b110bfd338d77efaa470670530f7179e6977764f44cd74d5cc", size = 2467361 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/b1/8261018b9f1ab47fffbb7739d7af3f04c8b529555b7fb2ae8b742d42d3db/grimp-3.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bd1ddd428a124d6730bed49ea60fb2ca6c8e0640c8f5abe1d0f6fc27a92fd8bc", size = 2503500 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/d6/99a2421c4c0de9f203a7e246030b13b676766e62e48504883863942646fb/grimp-3.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:07e645e9d45ed43bb8ea8da5982c19eacf13ee685d8440e3dc280064c005599c", size = 2513834 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/a5/263729e23d64541cd99d36dbb592e29c1ecea803deb3bb5c0c463b43c2ec/grimp-3.15-cp313-cp313-win32.whl", hash = "sha256:473646e0a74a554b4ab071d7fcbf5f442eb8cf87561770dae269818636b8edf2", size = 1855743 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/8c/a072bbea2e2e94da38f90bd8794037c90fb4eba389b49d01cdd2bb85e13c/grimp-3.15-cp313-cp313-win_amd64.whl", hash = "sha256:dbc2c15a1fbca2ff358f86cc90067176096dd73bec27d002515521b3125ba507", size = 1984546 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/4f/311bd40c02d61eee0182cb8c9b6ded37d42bed9a334e5ba4dacbe1c4c997/grimp-3.15-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6db0b30683612be4571b6b6208e1b39b77faa54566c5ca4f086d64cc783e4864", size = 2144799 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/ce/86e941cc26bd3419b5e2abb8b48fa35b850e5508f14e033f3ce28bfce608/grimp-3.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e731a1f8a192a802e04d4018d6cce9f4a12ce48b6b73f43014bd4e0a5d04a8e9", size = 2090802 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/09/bcb4e380596e533ef9ebb3f164ad3cc113fde62318ca5af71a27886b1612/grimp-3.15-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb607ee3e16440fc59ec2b49eef1b6dbbe701af9e99990b6491e6f120bd60b5", size = 2255870 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/84/361cebbd7b14ce15d93bfb65e2b0ff30287252ffa6ab0b7fe08e029eae6c/grimp-3.15-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0492b9f1120176146d81e51aa0691aa6c004cdf5192ab309a221f9b223dedfc", size = 2193359 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/d6/c4dd785e149c3c66494822c8b46f0a36cbdf5a5400eeb2172e0a8b029d0f/grimp-3.15-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bb3dbb0471179e732400fdf31c8c8d0299c88d13dd3a3bbe77ce54fb3f1b545", size = 2346350 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/4b/470922cb9d0a4b0436bb298801f770c98c6953374ff84e545dd7a196aa66/grimp-3.15-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b578512dbaee7eba2900d8078eaf1f7f78aa7616c609b0849b8403012ffddda", size = 2604959 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/e1/061dd80f5f0abb3ac53b29ade25ffac3e464e6853e8ce31dc6c6a33a06a9/grimp-3.15-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a550a14cd2f8123fb06814b705f3af093fa1728b244f21ebcccc8d0da0f851", size = 2327185 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/a3/32281e7b5fcd5622f4666b36003b9931ca0e112f2955f09458f198a30f65/grimp-3.15-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db5ebb94ec356eaa5242145c993bc84c4b52d0d2c6980dfcd12b22d51c5b2c46", size = 2273241 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/4b/b4f6ae15484541decbe4f12cf39a4a769352cb06332e428cc8e64aed4a32/grimp-3.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e03331418d7fee746e2447ecf5296986e6f094ef15fd25125efad2328844edf7", size = 2433114 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/a2/7bdc628435a1e908aa53b351ce031a6134efd18245c4a5a4c28e1e6d19aa/grimp-3.15-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4cc91cb69e73e7899feb6ce73747f4dc092c2bfe2653f6cba69a398cd1dfc6ea", size = 2467235 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/18/77853f5693d607d5f49c7e3cd58e482ef8362ea9cf86d0fcb108e4168195/grimp-3.15-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a848d5b4b656c1e3a28cce0d399f2790ecbeb2eeb78bb49896018614c87219f3", size = 2506552 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/bd/a094d7dd7115e8764e8069d5d3a44045c333b41d98a5746e99ec712b4b18/grimp-3.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:208ef56397cabfab52864b3d8a461fb5015a056fede1be4587e4453b13aa8c2f", size = 2514255 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/68/013c640df50968b5d25802a5f01b157514d4e0ccd48c37c63947610a0e05/grimp-3.15-cp314-cp314-win32.whl", hash = "sha256:74d32fae3d222888f6b61579998043579dd810ed948785896e552906cbfdfcb7", size = 1856182 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/0b/648a1d77dfc5c2fd24fbdca0a45ee1c24669d981d12652424f5c34e3352c/grimp-3.15-cp314-cp314-win_amd64.whl", hash = "sha256:6b36e179d485c797e7fa234803620af752039fa27a8c7e3182333d7c96041f70", size = 1985451 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/c6/fd88ea799d181c22ab47c6cb328e7be3e196c8395444af89fd8da401cf6b/grimp-3.15-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9107d1037ee6e250ab7a15e1b758e0af76c841c19838b3cc688885a0b3817b5", size = 2253182 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/d9/25377ba259772edfa97e35e265d89eb89b966a82652967c8479902741067/grimp-3.15-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b88975b2882edc55e8946640f7b36dfb83cce1303cff5f8528c3f4819d7fbb07", size = 2191822 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/64/cae8ca43e05aa5217ca2e17ffbda77e86cb215c1a9a03592c110c0162f27/grimp-3.15-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fe01a5393e415e3d99b22c7dc6c6a9cc1b633714707d1c6b56ecbaccc2132f5", size = 2344413 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/32/feea8fec71e62394013865314854ccb3d7bb54f226564fd267e6662f509a/grimp-3.15-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd4d70a0de010a9b452b59326a00574f7488dd1333d003df624114e5e00e877e", size = 2602856 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/ab/46ccdeb698398264d774273a9b8d9b013c8d23127d05371489b22dcf3ea5/grimp-3.15-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:204beed673ff43ab4ebe52ff4efd29b80025ec777136a62109afb69792d7fae0", size = 2326095 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/ae/f98c2c964a850ab80341d02576ef8681e75178f893ba2c73dc03e6563925/grimp-3.15-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1602be339f8a4d368d71758814e5505200cf665818eb0f9a2cc74d71ecc8cf1c", size = 2274375 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bb/38/9355cdb28fab458fb8defca6406de303d78af617aa0d8c9ae5253b4e5a8b/grimp-3.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:077c27a1e6ff3baf23a8caaa1d74cbbac27024b069956dd6ca5fc3acd43ddb4b", size = 2430307 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/06/edfa7f8064c1a3502fe4aba56c07bd122e94e329188939d52c02bd7e85b6/grimp-3.15-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:5516fc38899f4396eff68e6b1997310b4de2d0155e3fad9f545e666c993985b3", size = 2464014 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/c2/153b5cc3106814504b4195c7d4c178d85732d35b8895185a02112b8f9a03/grimp-3.15-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:dbe8e14cc61af4eea8e7ed6f2108828101f57fe86273d5b61cff044b69e6c6b5", size = 2502010 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/3f/ae4ba51cf484030e3d15b3304eb7ab9039fe91fb35ff5e90d60fde135bff/grimp-3.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:1763b7b48ed6c9e6de838d0d64f19510a392235266cf2240c9be9cc25ca7c54b", size = 2514787 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/5f/0fb2d2bc9fe6bce899947802c94531c24e581c715db19216b941c1b2422f/grimp-3.15-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:116c3a6dba61bd302919b82cb5d603f5977e321d80d7de3c7a1265357ab9dd66", size = 2345635 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/ac/05d859a62ed9282f43a0f0962da230c46a2eb3d3ecb5b39117b3b4888405/grimp-3.15-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fcc2e5065d35047729e41a55c9c3eb99810cf322fe3b3e89fa126f306ce6b3b5", size = 2273647 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/dd/f726316f54e29da4f24d545d6299e1ea0accfbbf52729077fd4a619de055/grimp-3.15-cp315-cp315t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b38327673df49203cff0ebcbbf078999a80f0b11bb654760059f6f00f56f64d6", size = 2344080 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/56/523a8f969f0a0b0a8ce43fbe8bc7a04e90f52724efc85f3305f1e07ae626/grimp-3.15-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965b37dad2f73164a103381c9fd1255bb3b2f6021ca2f38ffe70dd00fdc0fc55", size = 2275041 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/46/562e56ba1abecc40169aa40fbf62ba5dcda0f56d953b53eeeb5e43535fb2/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:391bca4c4f1c4dc58f10fadd8e4bba1ca1dbf848a5adb4e66907258135aa0b26", size = 2263708 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/6a/2fe608f847630675b06a4e635024771b897f4ea9d1c0d3063f83ed1b7fc8/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08f7e663a465b524c5c0e121e6dd759f282ce35f406bc95bd68deda63a604361", size = 2198790 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/49/8365239abbe735d8e103dc19f485e57383f8a435a0ae3b2ba7576e2d8bb7/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5625a037e9fc04c6371effb213efb827d225f5a64e04bff5f448adf180193da9", size = 2352309 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/76/c1679a9eb0ac4ac2fc943fdcf47c1d59a200fd8daac3db6bd72c63e45cf9/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4651d29d4ee69bd5a1d9aa963ac73e420da1386f0a2263b8acbc0ae495fda12c", size = 2611854 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/cf/56e47ded5188088ad0b9455cd74182c536a2f6fed29f1d4c0d7b20617b5d/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f73dcb7fb94b3a450dea3a95d63e179a715f315e2e0ff5b78aedf8b3dad8707c", size = 2331437 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/c8/47cb1dcf0819506915bb5a20dff70bddd518199808c67e1aba730a2fedbc/grimp-3.15-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:228e044bc458ee840ab20e1839efbecdecdd151d22ae3902a0f03aa94de772df", size = 2279755 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/90/6202e5fa8ffd3648b2fbcd1d6028c6224a278f557073cc3f8094f0a01cd5/grimp-3.15-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bbaa9053652d29733ff88277b554e716e5acc40b37d12841c972779196d2c0ef", size = 2441806 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/b6/2d82c6b6161169b0cb87ccb746e3a590c5a9fb54cb7c59d6c657ed731394/grimp-3.15-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:12fd9e675e6fcf633a5d14f6cbeee4b667a3d3307c91653ccc1a5aef03f53ec6", size = 2472941 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/36/fb2906ed60288b236867829f9b3ced558a2725225ec0ed2354a7124a0474/grimp-3.15-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:0012653561d80b4e4972ac246deb569051a1fbf3880d620a9475e7159722bbab", size = 2513392 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/d2/ec5f501d9623fe8eb2d517ab7528708b672dba51322a931515b58b659f6f/grimp-3.15-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e438ae00dfd554c6262e92c945ec233c5e311cc99fdb0d602c6063b4f5fc3d9c", size = 2522530 }, +] + [[package]] name = "h11" version = "0.14.0" @@ -942,6 +1083,22 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/2d/cf148d532f741fbf93f380ff038a33c1309d1e24ea629dc39d11dca08c92/hf_xet-1.1.4-cp37-abi3-win_amd64.whl", hash = "sha256:52e8f8bc2029d8b911493f43cea131ac3fa1f0dc6a13c50b593c4516f02c6fc3", size = 2695589 }, ] +[[package]] +name = "htmldate" +version = "1.10.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "charset-normalizer" }, + { name = "dateparser" }, + { name = "lxml" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/1f/e7cf83e23d7b68105de8b874a8b36ba23b450d6f71388583e4ca3ce475ca/htmldate-1.10.0.tar.gz", hash = "sha256:a38df10772ab5d7dbb11896e3f6a852a8491fb1b0965465bc174e23fc2baae58", size = 44455 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/17/d3356233c826c641f940983d9479eab27faec59d49f4070bc58e80fcc021/htmldate-1.10.0-py3-none-any.whl", hash = "sha256:9211dae35ab94147c8ed9e5fc2c9287a5cf31d2394cb7857e7f5dd814eb2aad6", size = 31561 }, +] + [[package]] name = "httpcore" version = "1.0.7" @@ -1021,6 +1178,22 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] +[[package]] +name = "import-linter" +version = "2.13" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "click" }, + { name = "grimp" }, + { name = "rich" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c6/42962eb043df4d6984c1540220735b20442572fe37dab5e65ac807c939b9/import_linter-2.13.tar.gz", hash = "sha256:13af4a1d6b06044c58ea784e8732fd7fe48eec821a75feb4d6a1a2de36dd5c27", size = 1279761 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/13/e7725e6eb32607fd4af51ccf3edfe835826e5cdf783b4d7fdc8f459196ae/import_linter-2.13-py3-none-any.whl", hash = "sha256:c0372e7ee5e15657bc06a8e841445e13237afd738a672d26863dc927af9f0bf5", size = 638185 }, +] + [[package]] name = "importlib-metadata" version = "8.7.0" @@ -1099,9 +1272,14 @@ name = "ipython" version = "9.0.2" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } resolution-markers = [ - "python_full_version >= '3.13' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and platform_machine == 'aarch64' and sys_platform == 'linux'", - "(python_full_version >= '3.13' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.13' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version == '3.13.*' and sys_platform == 'darwin'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "(python_full_version == '3.13.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.13.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", "python_full_version == '3.12.*' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux')", @@ -1139,15 +1317,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] -[[package]] -name = "isort" -version = "6.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 }, -] - [[package]] name = "jedi" version = "0.19.2" @@ -1174,61 +1343,93 @@ wheels = [ [[package]] name = "jiter" -version = "0.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/82/39f7c9e67b3b0121f02a0b90d433626caa95a565c3d2449fea6bcfa3f5f5/jiter-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:816ec9b60fdfd1fec87da1d7ed46c66c44ffec37ab2ef7de5b147b2fce3fd5ad", size = 314540 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/07/7bf6022c5a152fca767cf5c086bb41f7c28f70cf33ad259d023b53c0b858/jiter-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1d3086f8a3ee0194ecf2008cf81286a5c3e540d977fa038ff23576c023c0ea", size = 321065 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/b2/de3f3446ecba7c48f317568e111cc112613da36c7b29a6de45a1df365556/jiter-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1339f839b91ae30b37c409bf16ccd3dc453e8b8c3ed4bd1d6a567193651a4a51", size = 341664 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/cf/6485a4012af5d407689c91296105fcdb080a3538e0658d2abf679619c72f/jiter-0.9.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ffba79584b3b670fefae66ceb3a28822365d25b7bf811e030609a3d5b876f538", size = 364635 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/f7/4a491c568f005553240b486f8e05c82547340572d5018ef79414b4449327/jiter-0.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfc7d0a8e899089d11f065e289cb5b2daf3d82fbe028f49b20d7b809193958d", size = 406288 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/ca/f4263ecbce7f5e6bded8f52a9f1a66540b270c300b5c9f5353d163f9ac61/jiter-0.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e00a1a2bbfaaf237e13c3d1592356eab3e9015d7efd59359ac8b51eb56390a12", size = 397499 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/a2/522039e522a10bac2f2194f50e183a49a360d5f63ebf46f6d890ef8aa3f9/jiter-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1d9870561eb26b11448854dce0ff27a9a27cb616b632468cafc938de25e9e51", size = 352926 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/67/306a5c5abc82f2e32bd47333a1c9799499c1c3a415f8dde19dbf876f00cb/jiter-0.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9872aeff3f21e437651df378cb75aeb7043e5297261222b6441a620218b58708", size = 384506 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/89/c12fe7b65a4fb74f6c0d7b5119576f1f16c79fc2953641f31b288fad8a04/jiter-0.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1fd19112d1049bdd47f17bfbb44a2c0001061312dcf0e72765bfa8abd4aa30e5", size = 520621 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/2b/d57900c5c06e6273fbaa76a19efa74dbc6e70c7427ab421bf0095dfe5d4a/jiter-0.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef5da104664e526836070e4a23b5f68dec1cc673b60bf1edb1bfbe8a55d0678", size = 512613 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/05/d8b90bfb21e58097d5a4e0224f2940568366f68488a079ae77d4b2653500/jiter-0.9.0-cp310-cp310-win32.whl", hash = "sha256:cb12e6d65ebbefe5518de819f3eda53b73187b7089040b2d17f5b39001ff31c4", size = 206613 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/1d/5767f23f88e4f885090d74bbd2755518050a63040c0f59aa059947035711/jiter-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:c43ca669493626d8672be3b645dbb406ef25af3f4b6384cfd306da7eb2e70322", size = 208371 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867 }, +version = "0.16.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/1f/10936e16d8860c70698a1aa939a46aa0224813b782bce4e000e637da0b2d/jiter-0.16.0.tar.gz", hash = "sha256:7b24c3492c5f4f84a37946ad9cf504910cf6a782d6a4e0689b6673c5894b4a1c", size = 176431 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/d8/b959609e44012a42b1f3e5ba98ea3b33c7e41e6d4b77cd8f00fd19b1d3ad/jiter-0.16.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c5fc4f8def331036a7b8e981b4347ebe409981edbc8308a5ea842b8c3614fa6c", size = 310082 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/3d/4d7f5667ea0e0548534ba880b84bb3d12924fd133aa83ad6c6c80fca3d76/jiter-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a71d0d2014c3275043e1170bf3d4e771493cb0dcf07be54c567155f4d8ee64b", size = 315643 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/83/bed2dcb5c9f3e1ccfcbc67dda48265fe7d5ad0c9cadda5fe95f6e3b87f94/jiter-0.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:741eed508c233a76313a1c7b001f8f21b82f14327e9196ae8bd29a2cc164ae84", size = 341363 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/2f/6bb3c3dda668ebc0445689c81a2b0f26a82b10843d67ed9c9b2c3edc177f/jiter-0.16.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3fb7bc819187b56dc48aa5c833aaf92257da8e07efdb9306156667bd2eeb491c", size = 365483 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/35/8a045ccb39164e70dcdae696413b661771f148b68b12b175c3a04d901937/jiter-0.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c9610fd25ebccb43fca584136f5c2fbb26802447eccd430dfdbab95a0fd5126", size = 461219 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/99/22292dbbf0ed0c610cfe5ddc7f3bd67237a412f121318f865196e62a07bd/jiter-0.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a1d68ff7ca1d3b5dee20a97a3decda7d5f15003823bf6d140c81f8561d3bc5c", size = 374905 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/ac/2f55ccb1f0eeafa6d89d24caf52f6f0944a59290ee199e9ade62177dca42/jiter-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb08c276dd02dac3a284acdd02cacc630d2e3cd6572a4b85519f35cbd133c3de", size = 348320 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/e3/7d88b9174c40064fabc07c84a9b62e6b10f5644562ec0e0a29392edbe978/jiter-0.16.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:8fc4d94713c4697347e38faf7d6ef91547c142219bdcfc7220c4870879974244", size = 356519 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/57/c4a33aeef513a9d5e26e31534e0bcc752d6ea0e54c94ddb7b68bade669c2/jiter-0.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0f05e229edb29e68cdd0ccb83cea13b64263416120cf943767a6fd72e6787f", size = 394204 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/70/c6c23e76ebb3766b111bc399437bbc9f870a76e2a92e10b2a5f561d57372/jiter-0.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2c842cbf374a8daf50b2c04212995bee34ca2ac2cdc29a901b4cdb072c9c4131", size = 521477 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/d3/0001c8c0c5976af2625bb1cfb1895e8ec693b6589fe4574b8e6fc2c85501/jiter-0.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5ed466aee31294d7cdcd4d37dfe5c42c97bc29d9a5f00eacf24504358309cb9b", size = 552187 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/76/311b718e07e85740e48619c0632b36f7e0b8d113984499e436452ed13a9a/jiter-0.16.0-cp310-cp310-win32.whl", hash = "sha256:b42e9ff5376819c053da25809a8d4b6fa6e473b4856ebe42e298ac958be3d7f9", size = 206513 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/7f/ac680eeb0777dc0eb7dc824800ba27880d7f6bc712e362d34ad8ee559f36/jiter-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:10438939205546132189c8e74a2d536a707841f3a25cd7c74ee91fe503407a26", size = 199505 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/3f/fae6cc967d120ec89e31c5418a51176d8278b3087fbb384a9176754f353c/jiter-0.16.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:67fddeda1688f0cce2d2ae83ccf8a80f79936f2d2997d6cc2261f82fdb54a4d3", size = 309289 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/e3/97c6c3562c077f6247d6e6ce5c82562500b6316c0d928e97e106b7a1321a/jiter-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c90c0f63df322be920eda6ce622e3083d8906ba267f8220fe7873213b8b4430e", size = 315181 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/89/d8d073f8aa2667e46c6c0873f86fe4a512bba4293cc730f626a076211a62/jiter-0.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64c0203212098470032aabcde9356fc168f377aade3e43def61dfe17e92f2037", size = 340939 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/c9/db4fda3ed73fb864139305e935e5b8b38a5a24692a5a9dd356c22f1b9c8d/jiter-0.16.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12288303c9844e61e1651d02a9a6f6633e47d39f897d6991d1427161ce6b746e", size = 364932 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/74/52b5e86241057f52ddd7c9a580f90effb51f9d06239f6fc612279b91a838/jiter-0.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cf109d010b4b05a105afb3d43be36a21322d345ad3111e13d15f680afef0e5b", size = 461132 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/87/544a700f7447c1f31c5d7833821a4daa5683165c2d5a094fbf5b5800c3dc/jiter-0.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62c1b7fe1f77925acf5af68b6140b8810fa87dfd4dc0a9c8568ec2fa2a10429c", size = 374857 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/cd/0fcc3f7d39183674d5bfa9ec640faaeb506c60be7c8f94625dfba366e37c/jiter-0.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8597d23c87f59294f83bcb6229b9ed1fccee13dbba967b46930d2f1759466fee", size = 347053 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/ae/c7e64e7932ad597fa395b61440b249ada6366716e25c6e08dd2afbd021e6/jiter-0.16.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:3126a5dbad56401989ac769aca0cb56005bfb3e2366eea0ca99d1a91c3c1ee03", size = 356153 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/1c/1c719044f14da814e1a060191ab19b96f3e99207bc5b4bfc6d6be34b3f80/jiter-0.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c4b4717bdb35ae456f831a6b08d01880fff399887a6bbc526a583a406e484eea", size = 393956 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/dc/7b2f303a2847207e265503853a2d964a55354cffd62a5f2936c155486798/jiter-0.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:adff21bc78edfe086c15eb495b900306076de378dc2337c132401fc39bd79c91", size = 521081 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/5f/501cf6e1e09caeb420195179ffc6f62aca603f1220ec53fd80d0d70b3e56/jiter-0.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dab907db06fc593645e73109acf4581ba5b548897d28b9348dc41ddc8343b2d3", size = 552085 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/54/aa5be86520113b79455c3877f3d1f07a348098df4083ba3688e9537e52dd/jiter-0.16.0-cp311-cp311-win32.whl", hash = "sha256:560b2cf3fb03240cd34f27409a238547488708f05b7c3924f571a60422251ec7", size = 206755 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/ec/2feb893eb330bd69b413866f4d5daada33c3962f1c6f270c91ca2d87fdf9/jiter-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:e431cfc9caf44c1d5459ff77d4e64cbf85fddb6a35dad836a15c6a9ec23087c1", size = 199155 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/9c/ca040d94415048a3666fc237774df8151c96f8d2b661cbe3b184acc95876/jiter-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:2a8e9e39cf083016137aa5cadafe3188adc2ba6ba1fbf1e5d18889ad3e9ad056", size = 194403 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/2b/52ace16ed031354f0539749a49e4bf33797d82bea5137910835fa4b09793/jiter-0.16.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:67c3bc1760f8c99d805dcab4e644027142a53b1d5d861f18780ebdbd5d40b72a", size = 306943 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/2e/34957c2c1b661c252ba9bcc60ae0bddc27e0f7202c6073326a13c5390eec/jiter-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5af7780e4a26bd7d0d989592bf9ef12ebf806b74ab709223ecca37c749872ea9", size = 307779 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/6c/59bd309cab4460c54cf1079f3eb7fe7af6a4c895c5c957a53378693bad2b/jiter-0.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5bf78d0e05e45cfdd66558893938d59afe3d1b1a824a202039b20e607d25a72", size = 335826 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/8c/f5ef7b65f0df47afa16596969defb281ebb86e96df346d62be6fd853d620/jiter-0.16.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4444a83f946605990c98f625cdd3d2725bfb818158760c5748c653170a20e0e", size = 362573 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/0b/ace4354da061ee38844a0c27dc2c21eecd27aea119e8da324bea987522d0/jiter-0.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a23f0e4f957e1be65752d2dfac9a5a06b1917af8dc85deb639c3b9d02e31290", size = 457979 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/40/c0253d3772eb9dcd8e6606ee9b2d53ec8e5b814589c47f140aa585f21eaa/jiter-0.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c22a488f7b9218e245a0025a9ba6b100e2e54700831cf4cf16833a27fba3ad01", size = 372302 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/d2/4839422241aa12860ce597b20068727094ba0bc480723c74924ca5bad483/jiter-0.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46add52f4ad47a08bfb1219f3e673da972191489a33016edefdb5ea55bfa8c48", size = 343805 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/59/e196888a05befdda7dbe299b722d56f2f6eec65402bc34c0a3306d595feb/jiter-0.16.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:9c8a956fd72c2cf1e730d01ea080341f13aa0a97a4a33b51abebe725b7ae9ca9", size = 351107 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/74/4cd9e0fca65232136400354b630fbfcd2de634e22ccbb96567725981b548/jiter-0.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:561926e0573ffe4a32498420a76d64b16c513e1ab413b9d28158a8764ac701e5", size = 388441 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/8c/554691e48bc711299c0a293dd8a6179e24b2d66a54dc295421fcf64569c0/jiter-0.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:44d019fa8cdaf89bf29c71b39e3712143fdd0ac76725c6ef954f9957a5ea8730", size = 516354 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/cb/01e9d69dc2cc6759d4f91e230b34489c4fdb2518992650633f9e20bece89/jiter-0.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0df91907609837f33341b8e6fe73b95991fdaa57caf1a0fbd343dffe826f386f", size = 547880 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/70/2953195f1c6ad00f49fa67e13df7e60acb3dd4f387101bc15abccddd905e/jiter-0.16.0-cp312-cp312-win32.whl", hash = "sha256:51d7b836acb0108d7c77df1742332cac2a1fa04a74d6dacec46e7091f0e91274", size = 203473 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/05/2909a8b10699a4d560f8c502b6b2c5f3991b682b1922c1eedda242b225bd/jiter-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:1878349266f8ee36ecb1375cc5ba2f115f35fd9f0a1a4119e725e379126647f7", size = 196905 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/a9/6b82bb1c8d7790d602489b967b982a909e5d092875a6c2ade96444c8dfc5/jiter-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2ed5738ae4af18271a51a528b8811b0cbfa4a1858de9d83359e4169855d6a331", size = 190618 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/c0/555fc60473d30d66894ba825e63615e3be7524fac23858356afa7a38906c/jiter-0.16.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:41977aa5654023948c2dae2a81cbf9c43343954bef1cd59a154dd15a4d84c195", size = 306203 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/2b/c3eaf16f5d7c9bad66ea32f40a95bd169b29a91217fcc7f081375157e99c/jiter-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d28bb3c26762358dadf3e5bf0bccd29ae987d65e6988d2e6f49829c76b003c09", size = 306489 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/3f/02fdfc6705cad96127d883af5c34e4867f554f29ec7705ec1a46156400a9/jiter-0.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0542a7189c26920778658fc8fcf2af8bae05bae9924577f71804acef37996536", size = 335453 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a6/e4bda5920d4b0d7c5dfb7174ce4a6b2e4d3e11c9162c452ef0eab4cdbdbd/jiter-0.16.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8fb8de1e23a0cb2a7f53c335049c7b72b6db41aa6227cdcc0972a1de5cb39450", size = 361625 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/97/4e6b59b2c6e55cbb3e183595f81ad65dcfb21c915fee5e19e335df21bc55/jiter-0.16.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b72d0b2990ca754a9102779ac98d8597b7cb31678958562214a007f909eab78e", size = 456958 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/e0/97e9557686d2f94f4b93786eccb7eed28e9228ad132ea8237f44727314a7/jiter-0.16.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5f91b1c27fc22a57993d5a5cb8a627cb8ed4b10502716fac1ffbfe1d19d84e8", size = 372017 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/94/db768b6938e0df35c86beeba3dfbbb025c9ee5c19e1aa271f2396e50864d/jiter-0.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c682bea068a90b764577bdb78a60a4c1d1606daf9cd4c893832a37c7cc9d9026", size = 343320 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/d6/5a59d938244a30735fe62d9433fd325f9021ea29d89780ea4596ea93bc89/jiter-0.16.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:8d031aabecc4f1b6276adfb42e3aabb77c89d468bf616600e8d3a11328929053", size = 350520 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/f8/c4a857f49c9af125f6bbcac7e3eee7f7978ed89682833062e2dbf62576b1/jiter-0.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eab2cd170150e70153de16896a1774e3a1dca80154c56b54d7a812c479a7165e", size = 387550 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/d6/5fbc2f7d6b67b754caa61a993a2e626e815dec47ffc2f9e35f01adfebec7/jiter-0.16.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6edb63a46e65a82c26800a868e49b2cac30dd5a4218b88d74bc2c848c8ad60bb", size = 515424 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/54/284f0164b64a5fed915fea6ba7e9ba9b3d8d37c67d59cf2e3bb99d45cdfe/jiter-0.16.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:659039cc50b5addcc35fcc87ae2c1833b7c0a8e5326ef631a75e4478447bcf84", size = 546981 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/c5/2a467585a576594384e1d2c43e1224deaafc085f24e243529cf98beef8e1/jiter-0.16.0-cp313-cp313-win32.whl", hash = "sha256:c9c53be232c2e206ef9cdbad81a48bfa74c3d3f08bcf8124630a8a748aad993e", size = 202853 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/6a/de61d04b9eec69c71719968d2f716532a3bc121170c44a39e14979c6be81/jiter-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:baad945ed47f163ad833314f8e3288c396118934f94e7bbb9e243ce4b341a4fd", size = 196160 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/4b/b390ed59bafb3f31d008d1218578f10327714484b334439947f7e5b11e7f/jiter-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:3c1fd2dbe1b0af19e987f03fe66c5f5bd105a2229c1aff4ab14890b24f41d21a", size = 189862 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/89/bc4f1b57d5da938fd344a466396541e586d161320d70bffd929aaafcd8f4/jiter-0.16.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b2c61484666ad42726029af0c00ef4541f0f3b5cdc550221f56c2343208018ee", size = 308239 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/7a/c415453e5213001bf3b411ff65dec3d303b0e76a4a2cfea9768cd4960994/jiter-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:63efadc657488f45db1c676d81e704cac2abf3fdb892def1faea61db053127e2", size = 308928 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/fc/1f4fb7ebf9a724c7741994f4aae18fba1e2f3133df14521a79194952c34a/jiter-0.16.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf0d73f50e7b6935677854f6e8e31d499ca7064dd24734f703e060f5b237d883", size = 336998 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/8d/72cadaac05ccfa7cc3a0a2232862e6c72443ca40cf300ba8b57f9f18b69b/jiter-0.16.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3ea07d9bc8e7d03a9fbc051295462e6dbc295b894fd72457c3136e3e43d898", size = 362112 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/4a/c4b0d5f651fda90a24ffce9f8d56cde462a2e09d31ae3de3c68cef34c04e/jiter-0.16.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26798522707abb47d767db536e4148ceac1b14446bf028ee85e579a2e043cfe5", size = 459807 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/58/ef77879ea9aa56b50824edc5a445e226422c7a8d211f3fd2a56bcb9493cf/jiter-0.16.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc837c1b9631be10abfe0191537fe8009838204cec7e44827401ace390ddb567", size = 373181 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/2e/ffbc3f254e4d8a66da3062c624a7df4b7c2b2cf9e1fe43cf394b3e104041/jiter-0.16.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49060fd70737fad59d33ba9dcc0d83247dc9e77187de26053a19c16c9f32bd69", size = 344927 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/f6/0be5dc6d64a89f80aa8fec984f94dedb2973e251edcae55841d60786d578/jiter-0.16.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:adbb8edeadd431bc4477879d5d371ece7cb1334486584e0f252656dd7ffada29", size = 352754 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/6e/7d31243b3b91cd261dd19e9d3557fc3251a80883d3d8049c86174e7ab7af/jiter-0.16.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:31aaee5b80f672c1dc21272bcfb9cbdcfc1ea04ff50f00ed5af500b80c44fa93", size = 390553 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/33/51ae371fde3c88897520f62b4d5f8b27ad7103e2bb10812ff52195609853/jiter-0.16.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:6722bcef4ffc86c835574b1b2fac6b33b9fb4a889c781e67950e891591f3c55a", size = 516900 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/45/6449b3d123ea439ba79507c657288f461d55049e7bcbdc2cf8eb8210f491/jiter-0.16.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5ab4f50ff971b611d656554ea10b75f80097392c827bc32923c6eeb6386c8b00", size = 548754 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/e7/fd2fb11ae3e2649333da3aa170d04d7b3000bbdc3b270f6513382fdf4e04/jiter-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:710cc51d4ebdcd3c1f70b232c1db1ea1344a075770422bbd4bede5708335acbe", size = 122381 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/80/f0b147a62c315a164ed2168908286ca302310824c218d3aae52b06c0c9a9/jiter-0.16.0-cp314-cp314-win32.whl", hash = "sha256:57b37fc887a32d44798e4d8ebfa7c9683ff3da1d5bf38f08d1bb3573ccb39106", size = 204578 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/e6/4758a14304b4523a6f5adb2419340086aa3593bd4327c2b25b5948a90548/jiter-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:cbd18dd5e2df96b580487b5745adf57ef64ad89ba2d9662fc3c19386acce7db8", size = 198154 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/be/41fa54a2e7ea41d6c99f1dc5b1f0fd4cb474680304b5d268dd518e81da3a/jiter-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:a32d2027a9fa67f109ff245a3252ece3ccc32cc56703e1deab6cc846a59e0585", size = 191458 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/6b/59127338b86d9fe4d99418f5a15118bea778103ee0fe9d9dd7e0af174e95/jiter-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2577196f4474ef3fc4779a088a23b0897bbf86f9ea3679c372d45b8383b43207", size = 316739 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/95/49461034d5388196d3dabf98748935f017b7785d8f3f5349f834bcc4ed0d/jiter-0.16.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:616e89e008a93c01104161c75b4988e58716b01d62307ebfe161e52a56d2a818", size = 340911 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/97/a4369f2fb82cb3dda13b98622f31249b2e014b223fe64ee534413ad72294/jiter-0.16.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0e2e9efbe042210df657bade597f66d6d75723e3d8f45a12ea6d8167ff8bbce3", size = 361747 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/51/49b6ed456261646e1906016a6760367a28aacd3c24805e4e5fe64116c1db/jiter-0.16.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f4d9e473a5ce7d27fef8b848df4dc16e283893d3f53b4a585e72c9595f3c284", size = 460225 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/b5/5689aff4f66c5b60be63106e591dbfcba2190df97d2c9c7cf052361ddb98/jiter-0.16.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d30a4a1c87713060c8d1cc59a7b6c8fb6b8ef0a6900368014c76c87922a2929", size = 373169 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/96/3ae1b85ee0d6d6cab254fb7f8da018272b932bbf2d69b07e98aa2a96c746/jiter-0.16.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae96332410f866e5900d809298b1ed82735932986c672495f9701daacd80620", size = 350332 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/32/c99d7bafd78986556c95bf60ce84c6cc98786eac56066c12d7f828bb6747/jiter-0.16.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:da3d7ec75dc83bb18bca888b5edfae0656a26849056c59e05a7728badd17e7af", size = 353377 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/4b/f99a8e571287c3dec766bcc18528bbe8e8fb5365522ab5e6d64c93e87066/jiter-0.16.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ee6162b77d49a9939229df666dfa8af3e656b6701b54c4c84966d740e189264e", size = 387746 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/69/c78a5b3f71040e34eb5917df26fb7ae9a2174cad1ccbf277512507c53a6e/jiter-0.16.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:63ffdbdae7d4499f4cda14eadc12ddcabef0fc0c081191bdc2247489cb698077", size = 517292 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/f7/095b38eda4c70d03651c403f29a5590f16d12ddc5d544aac9f9cddf72277/jiter-0.16.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a111256a7193bea0759267b10385e5870949c239ed7b6ddbaaf57573edb38734", size = 549259 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/c5/6a0207d90e5f656d95af98ebd0934f382d37674416f215aeda2ff8063e51/jiter-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:de5ba8763e56b793561f43bed197c9ea55776daa5e9a6b91eed68a909bc9cdbf", size = 206523 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/31/c757d5f30a8980fd945ce7b98be10be9e4ff59c7c42f5fd86804c2e87db8/jiter-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b8a3f9a6008048fe9def7bf465180564a6e458047d2ce499149cfbe73c3ae9db", size = 200366 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/a2/d88de6d313d734a544a7901353ad5db67cb38dcfcd91713b7979dafc345d/jiter-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0fa25b09b13075c46f5bc174f2690525a925a4fc2f7c82969a2bbabff22386ce", size = 190516 }, ] [[package]] @@ -1240,15 +1441,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, ] -[[package]] -name = "jsonpickle" -version = "4.0.2" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/6f/e73cb91f774ad1077929a29b3a4af6e5603beb446cb99a55debe240664c3/jsonpickle-4.0.2.tar.gz", hash = "sha256:3e650b9853adcdab9d9d62a88412b6d36e9a59ba423b01cacf0cd4ee80733aca", size = 315121 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/c8/e9dc0af97ce006616abbd7f522d0b45ac322a77f72bb29d901b5114a49ba/jsonpickle-4.0.2-py3-none-any.whl", hash = "sha256:cd3c90d32a68dcaa7f0e4b918bda7d4bb61f3c03b182d82dae2caf9ded0ab6b3", size = 46325 }, -] - [[package]] name = "jsonschema" version = "4.23.0" @@ -1298,7 +1490,8 @@ version = "5.7.2" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "platformdirs" }, - { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "pywin32", version = "310", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version < '3.14' and platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "pywin32", version = "312", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version >= '3.14' and platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } @@ -1306,6 +1499,18 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, ] +[[package]] +name = "justext" +version = "3.0.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "lxml", extra = ["html-clean"] }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/f3/45890c1b314f0d04e19c1c83d534e611513150939a7cf039664d9ab1e649/justext-3.0.2.tar.gz", hash = "sha256:13496a450c44c4cd5b5a75a5efcd9996066d2a189794ea99a49949685a0beb05", size = 828521 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/ac/52f4e86d1924a7fc05af3aeb34488570eccc39b4af90530dd6acecdf16b5/justext-3.0.2-py2.py3-none-any.whl", hash = "sha256:62b1c562b15c3c6265e121cc070874243a443bfd53060e869393f09d6b6cc9a7", size = 837940 }, +] + [[package]] name = "litellm" version = "1.74.0.post1" @@ -1326,42 +1531,55 @@ dependencies = [ sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/68/a58b31f25c42fe052d7e7a0fc27d96d20c88b171070acc7b5d3cd553db0e/litellm-1.74.0.post1.tar.gz", hash = "sha256:417b08d0584ffc2788386261f1b3dea6e0b1b09b0231f48c46426c0c7a9b7278", size = 9032360 } [[package]] -name = "llama-cloud" -version = "0.1.18" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "certifi" }, - { name = "httpx" }, - { name = "pydantic" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/fd/3c68299b531ba5b2ff9698045d0b43ba32b4cb46c3b778e5d7dd2c028e47/llama_cloud-0.1.18.tar.gz", hash = "sha256:65cb88b1cb1a3a0e63e4438e8c8a2e6013dfdafbb4201d274c0459e5d04fb328", size = 93191 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/75/a640840f28e1e99837242cfbefde3b19d27c269acb206394a735b5e109ce/llama_cloud-0.1.18-py3-none-any.whl", hash = "sha256:5842722a0c3033afa930b4a50d43e6f1e77ff1dab12383a769dc51a15fb87c9b", size = 253117 }, -] - -[[package]] -name = "llama-cloud-services" -version = "0.6.12" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "click" }, - { name = "llama-cloud" }, - { name = "llama-index-core" }, - { name = "platformdirs" }, - { name = "pydantic" }, - { name = "python-dotenv" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/c0/e10cfc1cd8002d7bb376b4d372d2357c5bce1a535ba6ba6996e6816e5815/llama_cloud_services-0.6.12.tar.gz", hash = "sha256:3cc0c8e9182c8c89cc32cabc8f5fed11e030504ef4c7998df641d5468db04b23", size = 31186 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/8b/7bd898ff15873426ed6c74b477b72f735bbc3cedff1ac6d309bec11b970e/llama_cloud_services-0.6.12-py3-none-any.whl", hash = "sha256:151b79102c3a82fee22801131ddacffe84654b98def1a132bdaa54cc8d7113a9", size = 36129 }, +name = "liteparse" +version = "2.6.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/f5/5188e5c29d412cedadbbd53f2e15f7bde8d629e1f76bf2d6313db8bb6324/liteparse-2.6.0.tar.gz", hash = "sha256:12a11f9df9ced1a4bae2fc106e0c88dae18ac2d28d9280fdf31b2eb5f14f935e", size = 335006 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/6c/8ea704f9c3c7391db9238cf7993bad98acc4a4dc22c407c431c2082952c2/liteparse-2.6.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:a61e92b761222337f505a79971324594d92575b138f1477f92429c449bc34408", size = 9335901 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/b4/3eb869aac912c15f00e9c2e5546cf6c2b720274058c3f0cbe0815f4ed208/liteparse-2.6.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d2c67dd6d136967171b3b3957b6852195c47832ef69179bedc33a2a21e09a1d0", size = 9603933 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/b3/99ff027e3a8c8926cc6e54229b7004de4f10bc9af59251460d126e851b90/liteparse-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:8802eadf151205ecc098dd94b6ff44b97e70f756ce42616a2ae4f4fb04e39b72", size = 8172654 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/a8/445b6c71c583eaf22a767de09c56e4d469b9edcb5a10672ff047883d10f6/liteparse-2.6.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:86ed03da1f8e09134a773e06e874895d34a6674413921502bc8329dfcae2597c", size = 8536287 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/f0/81fd2f75b43396cd91071c1b8134192608e11c17445ad965bd707bb98c45/liteparse-2.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4821c4d1c0d1fe640f5add77688bd9fb51aad50141296a1572165bfceb4a8c07", size = 8109705 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/2d/7fec9cd9ced3c9056b5870d6b9f52b610c50f03c348979c0112865fd121d/liteparse-2.6.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:28c16b943fa2b3aa56ebc6c894bc74200e03e95bf02d250b37d52313fd2d78ea", size = 9334901 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/1e/1546d80eb61678d70027a4a8fd61506c1f3bfe9ce14d2f62b32afadc8267/liteparse-2.6.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e950055298dcd3084be27e05161b8979a6d5a5dc056cf31d4d8ef2590d85ba93", size = 9603015 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/77/04f26f843435ad4cf201c8b79c5c8376ffd002b4fa42f9fc9d3b56d42e8b/liteparse-2.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:32276d5bbdd59af33c1c7ebe33cb899588202af80a4493d6fc0acaf5ac5f4ac9", size = 8172714 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/ea/e2df43bca15786111942221a2c975465774c886028844b2cd32cc4562314/liteparse-2.6.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:db3ecfefd6cdeb19919f5cce4474f73c8a97110b20a5e28a185ef3bb6b0c7993", size = 8536870 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/59/6a9cadf32130a30bb2e18dd6c8450dee77f6668671092c604cb086d38d99/liteparse-2.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b5d522fae5fbfcb72b5c15f82696b92c7b17f13ed46ceb4e515ba9e2356f68a8", size = 8108080 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/93/2bbacb6272e2a223487803cf3b21072a0133f3e45b01a42924a970f3c2bb/liteparse-2.6.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d4f8a86bbefea8f7f76f76eaa48fe993614229fc2cc73f51723fd9c7256170c1", size = 9332238 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/0a/c3b4b49daf6fe4711c4c40e59fe8478831d9df115f1b9d7513e868e8a0c9/liteparse-2.6.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:850cdfd67162e442434f78d15f45869338a1f585b14361f748d8826540de160a", size = 9602268 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/52/093b6ad71d054b119b522d46a103ee03d75585316579a4e5e5b3d19eaf65/liteparse-2.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b5e8b475523ff8054afc6f31f89aee2eb126981236d7f20f9cc3f38fe1d325ec", size = 12685490 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/5a/715c9dfa56079af21898e19707d7e7b9bafde49c235e932f298308358a53/liteparse-2.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:4e7906781ff50f319ac7173a9023837fce9269e2238babc3f01769622b7d313a", size = 8171114 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/8c/61363c3eced6149959305555ec571a23c89e1e3fcaf8b31dbfd160a45fe3/liteparse-2.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:c2700014a8edd18a31408a73210abb6a28425fdc9d0417c9ed54d1675869d3db", size = 7790810 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/2d/078d5e02d3f21878817433fc6305be71b1e7574bd4fd71d32c6b09ddcd36/liteparse-2.6.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a2fe30166f70588b2e2f8449d9d12682855387fcadb43763dd6b3931b4d7be31", size = 8536736 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/f5/83b78aee4512ef1fdbedfcd5d8bf50c8c35732dc4a7320b8a0e74c64298a/liteparse-2.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5565f4cc79aa8c51baeac1d50a73f5b4220f98727ad426d9a1c25c5819387839", size = 8107941 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/48/5ec9200627032080187aa666605282e3eebc12a0cc1939fba5ad9a7c0311/liteparse-2.6.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:272263e3b1ac4e99a99c5e0c94054014cb3cd9a8d3eaa895a9f35960efe06c35", size = 9331938 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/d9/74af95a6181f4e516bb18fd0354cc3ae867707e459b595452c6f8af180c2/liteparse-2.6.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:976f405a4c40cece7d17fe341a63a605bf6c4e73179dcc60632dbbf1ccb7f40f", size = 9602081 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/15/4a564ca5179cd0212026a5bfdf0a0236a1ff280abb13b74d8dbd96ab26b7/liteparse-2.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:1a10859efe23a0ab78b888af66568c464a2be7bcddb95e2f7ef2a46d8db18639", size = 8171087 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/2b/093f7c00420676a41985ba1f68170356616dda9e025ec165702fc18f2f8a/liteparse-2.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:7479629269684cf6229e4986e33eefe00ff91df5be1a31048e87ff9684279181", size = 7790625 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/17/b6d904c351e17bf7003ddfc9715c499d8a58765a9cce41933b6b1568e2c8/liteparse-2.6.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:a38e377560e0ae9ac9b331204f8d684231fd8407e4917200d41a91330e0294b2", size = 8538074 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/3e/2aea3e00a56051bb13724830d0573fcc95891f41f56f8b90819dd0f1ac3c/liteparse-2.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f5c316a579fb9d3e4375e34cf480fcc8cba18dfdc76f9636a15bafd1d177d159", size = 8107937 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/dd/b9f51c59760473c2133df4d1741059937c3aef6da57ed6ffe129a410ccf7/liteparse-2.6.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0e6a1a0cc95833daa6d09af02d6c1c34320d25de4cb64cd0217805d06da28a7b", size = 9333121 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/15/4ce6ab35dc71eef005878e18936d9868c2d8e0273f9b544fa58b344a9028/liteparse-2.6.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:dcc93a7ed3d38547ecc0afb99da1b5d899b4d528e5c5fd55ed367087b570d6f2", size = 9601687 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/34/43/a2e9194603fcb00b351ae87054048ad86310a34b34a07922816933f7c0b6/liteparse-2.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:a406e1fc5351efef26c2952f37abef7eea3e30e9eb89d46f442836344ea1e703", size = 8170145 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/c1/2d41cdd36d6bca037155bb9e605dfc847ce642fb0fa86f313fc0c727ed16/liteparse-2.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:7e7b33a8030cb2d9602bce50ad4af76fc6f9fff4f50d18e96fc9df239fdbf89f", size = 7791692 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/fa/e00b1f22d5c9b6f9b4cf946dd98ba4324b75bb894adb248ac0e47133ebea/liteparse-2.6.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b60c714d2c2875a285b9a7519ae0b10080c9ea26c858c8536f239a67236091ce", size = 9331407 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/4d/5d0d8a5fc2c8d31160afba64488bcec6058c86bee60f1fa6ed9628501a1c/liteparse-2.6.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8195dbf35633e62c402af52ce96ae8ff25bc068e471cbee3282317b6dcfb93bd", size = 9603323 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/a4/e5c3923111b6d793e006f0c13423b346a3832a90e9c4bac976153b41a9cb/liteparse-2.6.0-cp315-cp315-manylinux_2_28_aarch64.whl", hash = "sha256:2d8a88bee68bd73e7c775271f0f044b8e91aa8e77fc69b04d5988ffe0ad2e788", size = 9333769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/02/1e71963ecbb2948db51e234f951d8962bdcdc2e9e155ee1265bb62ce20af/liteparse-2.6.0-cp315-cp315-manylinux_2_28_x86_64.whl", hash = "sha256:d0c93d67d89353fc0bc1817cd29d153ced7426e96010f8b99526979c7013d271", size = 9604831 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/fe/bd44dfe322987948314c635aff04968e76bf43a54d9010d6a2e0a68b7939/liteparse-2.6.0-cp315-cp315t-manylinux_2_28_aarch64.whl", hash = "sha256:6d3167cce90f8d975e4228468f2bba0341b945f4d4defa5edc597a0bd171c395", size = 9333125 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/45/baeb0056c83bcbc6c3a70ecf16491e6527ab7e71214f37c1ae2848f5a0a5/liteparse-2.6.0-cp315-cp315t-manylinux_2_28_x86_64.whl", hash = "sha256:c944fb23df6c2003da0a94af2a17e6a6568bc471a900f15af3bc020fe719461e", size = 9603248 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/05/028d67da6c1d04a5cceedb7cd50b8c50794cbeeaf61061b449b2f2ceff31/liteparse-2.6.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a8f8288ece49fa70b4aa57d20123db2f06ed3721193f80f968ae79f666e6c53e", size = 9340171 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/95/e953e03603fd312192c6e66b89115573ffb6f2378a45d4751cc710961d87/liteparse-2.6.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d695976225c4226d789904bcabcb4addb97ad587e626c7a8849f8029b61fbca8", size = 9608534 }, ] [[package]] name = "llama-index-core" -version = "0.12.30" +version = "0.14.23" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "aiohttp" }, + { name = "aiosqlite" }, { name = "banks" }, { name = "dataclasses-json" }, { name = "deprecated" }, @@ -1369,25 +1587,205 @@ dependencies = [ { name = "filetype" }, { name = "fsspec" }, { name = "httpx" }, + { name = "llama-index-workflows" }, { name = "nest-asyncio" }, { name = "networkx" }, { name = "nltk" }, { name = "numpy" }, { name = "pillow" }, + { name = "platformdirs" }, { name = "pydantic" }, { name = "pyyaml" }, { name = "requests" }, + { name = "setuptools" }, { name = "sqlalchemy", extra = ["asyncio"] }, { name = "tenacity" }, { name = "tiktoken" }, + { name = "tinytag" }, { name = "tqdm" }, { name = "typing-extensions" }, { name = "typing-inspect" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/6a/e775e99c75a6d23b93cd1bfd8ed8d365052c538a9053022aaeeee8d1117a/llama_index_core-0.12.30.tar.gz", hash = "sha256:dfbed9cdba18358750ad3895cd97fa1ea0dd0b856bbd623a4904ac61641e2765", size = 1359297 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/ac/f885ae14317af43a026c909ea4d2083fcee2f0d014f90426b5b9aa1f9912/llama_index_core-0.14.23.tar.gz", hash = "sha256:c4baf2f2ab4f84e95090fe7941e0c87d6c514304f7bd2a749b8fa22164c1822b", size = 11588373 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/d5/05d61f34c01c6578fb758d0a3ddef58d36c6ffa9a9f84a5c9a16262ad94d/llama_index_core-0.14.23-py3-none-any.whl", hash = "sha256:6a54d267826732a8507f81df40785b107f7592af20f451a39a59005147caf84c", size = 11924908 }, +] + +[[package]] +name = "llama-index-instrumentation" +version = "0.5.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "pydantic" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/d0/671b23ccff255c9bce132a84ffd5a6f4541ceefdeab9c1786b08c9722f2e/llama_index_instrumentation-0.5.0.tar.gz", hash = "sha256:eeb724648b25d149de882a5ac9e21c5acb1ce780da214bda2b075341af29ad8e", size = 43831 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/45/6dcaccef44e541ffa138e4b45e33e0d40ab2a7d845338483954fcf77bc75/llama_index_instrumentation-0.5.0-py3-none-any.whl", hash = "sha256:aaab83cddd9dd434278891012d8995f47a3bc7ed1736a371db90965348c56a21", size = 16444 }, +] + +[[package]] +name = "llama-index-retrievers-bm25" +version = "0.6.5" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "bm25s" }, + { name = "llama-index-core" }, + { name = "pystemmer" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/68/1eaed3469fbea63b5c197aaecfb1f5aa15c81a7444a47ab4a447c83880ef/llama_index_retrievers_bm25-0.6.5.tar.gz", hash = "sha256:13138639fcf94fc8dd1874250a198b0c16fe1236c828f8a7ff9e46a67166fdb1", size = 5475 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/2c/27dce475ca82ceeb90d6b4e14f4875fa189d87181ba5b688ae26ce45b8da/llama_index_retrievers_bm25-0.6.5-py3-none-any.whl", hash = "sha256:928a2859688ea2f6ce337686866d0ab4f8e8e040f23dbd1061fff57288f5f552", size = 4996 }, +] + +[[package]] +name = "llama-index-workflows" +version = "2.22.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "llama-index-instrumentation" }, + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/22/4d0cd67428b4a54e014606f88bc6420aae7775ad1f13bd30d4d94f4899a3/llama_index_workflows-2.22.2.tar.gz", hash = "sha256:97b64bcf72e77e1a0380068cda09e5d0774b75abdb891096c433686c2f299e3e", size = 136430 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/14/7439bbd78a0c81102c36294511e841ca95969964997eb4c26328e66cbec6/llama_index_workflows-2.22.2-py3-none-any.whl", hash = "sha256:92367b8d6ce92256ff63010feed458804c0575d58c19c3a32445555d3ab052f4", size = 164486 }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/da/dbe4dfc01ac226fb0504fad035f4d69f3202f3502e20e68537631daddd96/lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60", size = 8541124 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/20/f7095ed9fc2c025f9cfe71cc6ec9f1feb05624edc1812423b5f1aecf3d4b/lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d", size = 4602783 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/a4/65c63ca98bd129f6cff7b8c2fa48953ab058cc6005b541354e7dd54d8000/lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea", size = 5002687 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/1d/ab7a5c4b5a394d98a94e2d0fc67bab8297597426770dd4978370fbdaf531/lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074", size = 5155099 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/b1/07603bfeeb891a2596d5c2a68f7d2f70f7d11c841ebe391412c69c2857b0/lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30", size = 5057225 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/16/cb391ee4b90186fa16d9ebcbe3ea96c71b8da3b0686386c8dcbcc3c67d44/lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315", size = 5287643 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/d6/b619717f918fd76747448fdbaee0e769edbc70e659b5b5d0112b7020b7a3/lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1", size = 5412445 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/80/12bc5390ac0a3edeb579d9535e5049a5dda663438728e179d52fb319c33a/lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206", size = 4770864 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/59/6500c09da3137f54f020e908d81cfc5ee3e8888e908fd380207afad7c2e6/lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067", size = 5359594 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/9b/f64b4cc6b7ebcf75d95af3cde934d254b5f2f10d4163928d838d86b6eb48/lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a", size = 5107713 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/19/c7388ad5d3a72315d2832dc1458cbf4f2af7f2b990b606ff4876efd04511/lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa", size = 4803973 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/22/76197f0bbf165f0b9e75be59be4997e5259cde973f12f098c1b54c7f5d60/lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383", size = 5349925 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/52/d2a0cfeccb9bcdc47c7ee05cdae5d69b48c9acf20997790a6338bb0d0b3b/lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1", size = 5309825 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/4a/b30944266776c2f49749ef2445aa7e78898194134b80ad776386f61b56ae/lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a", size = 3598402 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/97/33691c66a4d7ec1a5a98e7c909a5b83ee45c7f7ba4cf92b1c4cf26e98079/lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5", size = 4021295 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/5f/26a4dd0e12b9456ff7b12a21af5b491eb6629680d1edd73f4140fd386bcf/lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485", size = 3667717 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/b0/83f481780d1548750b8ce2ec824073deef2f452d9cd1a6faff8507e3d16d/lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2", size = 8526461 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d5/30fa0f808002c7329397bfbb24e306789c0b29f04aa5842c07b174b4216f/lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d", size = 4595375 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/d2/edb71cf0e561581a7c5eb2626244320eb04e9f8ce6d563184fd668b45073/lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510", size = 4923654 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/77/1bc7eeb0de4577d783fb625aa092cc9357883bba35845a3666bf1259f3dc/lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a", size = 5067921 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/3c/c0690d74bd2bc17bc03b5b0d093569ead597dd0bfa088bf99eef8c24e19c/lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d", size = 5002456 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/8d/d1b3271af0c0f1e27e8472a849e4d2c65bc7766884b9ad2da9e76e145c88/lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8", size = 5202776 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/45/689824ffb237fd10125ad273f32b28ff04dc6203c2822c85ff65a93df65e/lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009", size = 5329945 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/c0/ef73af53767e958fd87d437c170f272e2f6e6c0f854939f133a895f1e711/lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6", size = 4659237 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/5e/e1158e40397585e91cb0472374a1f63d0926a1ddeaa92f13d1a1ffe306d5/lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8", size = 5265904 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/16/8687e5d1400ed1c0bc41dace232ebb7553952b618ea1f2e5fb6e2cfbbe23/lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83", size = 5045225 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/18/d877bd1ae2e5ffdfd4836565aba350db31feb2f2656d6ce70316ed66a05e/lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6", size = 4712721 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/4d/1f44fd1d770b10dacbf6b5c6e520f4d6e0708744930f719dc04e67cab981/lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c", size = 5252549 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/5d/1d66b84f850089254c230ef6ea6b267a5a54e2e179a5d960036a05d501d7/lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08", size = 5226877 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/00/84c4b5302d42a2d0184f38d538c8a197f33b52a50bd4f7bcfe990bce3036/lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621", size = 3594072 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/9d/2e2f7d876349f45e0f3e29f72da311668853d59b58d473a2dea4f0160135/lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28", size = 4025469 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/d5/570e6390e4110331e6208b2ba83d1482cc9146808ee118b22824a34c1070/lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b", size = 3667640 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/32/86a3f0f724a3a402d4627937a7fc27b160e45e7012b4adf47f6e1e844511/lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e", size = 3930127 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/44/d832e82af08723761556d004b1d04d281c09f9a8cecd7d3148548c9941a3/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004", size = 4210769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/39/0dc5949f759ed7d951e0bb8c2f2d9d7aca1908d22352fa84a8afd2ea54af/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e", size = 4318163 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/fb/8ab3845fe046ba4cbf74536bcf6801a774b7caf4350de1c5d37f1f0a9e90/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2", size = 4250945 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/1b/7553ab136894374ffae8851ec06f98f511cd8e66246e41b6be059d0a7289/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf", size = 4401664 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/a4/441aee36c6f6b249823d20fd91f9be9ab89d7c5a8ae542a4a4ca6d342d56/lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84", size = 3508989 }, +] + +[package.optional-dependencies] +html-clean = [ + { name = "lxml-html-clean" }, +] + +[[package]] +name = "lxml-html-clean" +version = "0.4.5" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "lxml" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/63/195dfdde380a84df309e3bccf4384b034b745dba43426886f7ae623b4fba/lxml_html_clean-0.4.5.tar.gz", hash = "sha256:e2a4c7d5beedd17cd7b484d848a0571e54baa239a4f9df5546e3acba7f990560", size = 24142 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/5e/f6cdde46045436b56b05c40028ec24960cd4d9730f2bc0534bf92223db9d/llama_index_core-0.12.30-py3-none-any.whl", hash = "sha256:6e0b33158de52108debe66528adb84adb626aed5c6c7762874fb7a799d8c48a9", size = 1622505 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/bd/6e2b76a6c5dee10397db9c929f0c5066766ec1036046f0335b7ca7ca08b8/lxml_html_clean-0.4.5-py3-none-any.whl", hash = "sha256:c76fcadd1e5bfb9b8bafc2200d51e4e78eb0dad67f56881c21dfb6484c7e7746", size = 14573 }, ] [[package]] @@ -1424,26 +1822,9 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/e9/6e2757a670b8c48bc48eff1c20cb9d71f1476e844038bdbdb76f17e6a12b/markdownify-0.13.1-py3-none-any.whl", hash = "sha256:1d181d43d20902bcc69d7be85b5316ed174d0dda72ff56e14ae4c95a4a407d22", size = 10800 }, ] -[[package]] -name = "marker" -version = "2.1.3" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "aiofiles" }, - { name = "aiohttp" }, - { name = "cmd2" }, - { name = "jinja2" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "rich" }, -] -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/65/8e2f3498ea5db65cd95c08fce5fceb21565edbe4a776bbebf8452c2daf01/marker-2.1.3-py3-none-any.whl", hash = "sha256:863584b7dd7e87c28fd6c9ac037be306501a4816203db99d2e59f7bd7ae917ce", size = 26983 }, -] - [[package]] name = "marker-pdf" -version = "1.7.5" +version = "1.6.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "anthropic" }, @@ -1453,10 +1834,8 @@ dependencies = [ { name = "google-genai" }, { name = "markdown2" }, { name = "markdownify" }, - { name = "openai" }, { name = "pdftext" }, { name = "pillow" }, - { name = "pre-commit" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "python-dotenv" }, @@ -1468,9 +1847,9 @@ dependencies = [ { name = "tqdm" }, { name = "transformers" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/4b/4a991c71477c8f99916d27b7630bb323b3e9e12e3f61cab0e5a99d278f85/marker_pdf-1.7.5.tar.gz", hash = "sha256:54845fe5f8080ebdf41f59d006c0ca792a4cdef814c18a0f82426a4f62a038cd", size = 128341 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/09/ba/70b29861d47fb83e83d0d85a34847642c460f8fde70518882f7ba8322b67/marker_pdf-1.6.1.tar.gz", hash = "sha256:7a6ddd770a31a34d0b48cafc4e77509fecf20650707e828e900f60e92be98d45", size = 118066 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/98/b9bef2c706fa6888ad2e73ef8e6b6dc1ae31f70b593964370aafd5014f67/marker_pdf-1.7.5-py3-none-any.whl", hash = "sha256:92dcaa5cd561730ea3ab80e315dbed0c84980947e5685187b202d4e476ddcf3e", size = 177422 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/c3/590a16da5633ac2efbaa5a27297aa8935dbac4d31a0d5c9da460db184bec/marker_pdf-1.6.1-py3-none-any.whl", hash = "sha256:b3558a70211650be077a7c500d9066d192a97c52fb274eea04cb6c888ee57665", size = 162677 }, ] [[package]] @@ -1557,21 +1936,29 @@ wheels = [ [[package]] name = "mcp" -version = "1.6.0" +version = "1.28.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "anyio" }, { name = "httpx" }, { name = "httpx-sse" }, + { name = "jsonschema" }, { name = "pydantic" }, { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", version = "310", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'win32'" }, + { name = "pywin32", version = "312", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'win32'" }, { name = "sse-starlette" }, - { name = "starlette" }, - { name = "uvicorn" }, + { name = "starlette", version = "0.46.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version < '3.14'" }, + { name = "starlette", version = "1.3.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version >= '3.14'" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/5e/d118fce19f87a2e7d8101c35c8ae0ec289098a4df0ff244cec23e415aca0/mcp-1.28.1-py3-none-any.whl", hash = "sha256:2726bca5e7193f61c5dde8b12500a6de2d9acf6d1a1c0be9e8c2e706437991df", size = 222620 }, ] [[package]] @@ -1689,45 +2076,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400 }, ] -[[package]] -name = "mypy" -version = "1.16.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "pathspec" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/12/2bf23a80fcef5edb75de9a1e295d778e0f46ea89eb8b115818b663eff42b/mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a", size = 10958644 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/50/bfe47b3b278eacf348291742fd5e6613bbc4b3434b72ce9361896417cfe5/mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72", size = 10087033 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/de/40307c12fe25675a0776aaa2cdd2879cf30d99eec91b898de00228dc3ab5/mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea", size = 11875645 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/d8/85bdb59e4a98b7a31495bd8f1a4445d8ffc86cde4ab1f8c11d247c11aedc/mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574", size = 12616986 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/d0/bb25731158fa8f8ee9e068d3e94fcceb4971fedf1424248496292512afe9/mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d", size = 12878632 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/11/822a9beb7a2b825c0cb06132ca0a5183f8327a5e23ef89717c9474ba0bc6/mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6", size = 9484391 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/61/ec1245aa1c325cb7a6c0f8570a2eee3bfc40fa90d19b1267f8e50b5c8645/mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc", size = 10890557 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/bb/6eccc0ba0aa0c7a87df24e73f0ad34170514abd8162eb0c75fd7128171fb/mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782", size = 10012921 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/80/b337a12e2006715f99f529e732c5f6a8c143bb58c92bb142d5ab380963a5/mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507", size = 11802887 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/59/f7af072d09793d581a745a25737c7c0a945760036b16aeb620f658a017af/mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca", size = 12531658 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/c4/607672f2d6c0254b94a646cfc45ad589dd71b04aa1f3d642b840f7cce06c/mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4", size = 12732486 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/5e/136555ec1d80df877a707cebf9081bd3a9f397dedc1ab9750518d87489ec/mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6", size = 9479482 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923 }, -] - [[package]] name = "mypy-extensions" version = "1.0.0" @@ -1737,15 +2085,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] -[[package]] -name = "narwhals" -version = "1.32.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/e5/aa97891440bf6bc4239e9b918d89fea58eb87dff1d8d14a69b45ef677e66/narwhals-1.32.0.tar.gz", hash = "sha256:bd0aa41434737adb4b26f8593f3559abc7d938730ece010fe727b58bc363580d", size = 258915 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/96/79a6168dc7a5098066e097c01a45d01608c8df6552dfb92a2676ce623186/narwhals-1.32.0-py3-none-any.whl", hash = "sha256:8bdbf3f76155887412eea04b0b06303856ac1aa3d9e8bda5b5e54612855fa560", size = 320073 }, -] - [[package]] name = "nest-asyncio" version = "1.6.0" @@ -1766,17 +2105,18 @@ wheels = [ [[package]] name = "nltk" -version = "3.9.1" +version = "3.10.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "click" }, + { name = "defusedxml" }, { name = "joblib" }, { name = "regex" }, { name = "tqdm" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/02/df4f105b28a7c16b0e41423bc09cf0f1b8a305df4ef0b10ca74a2e4c648c/nltk-3.10.0.tar.gz", hash = "sha256:4fbac1d98203cbcd1b5d94a2877fb822300072d80604a5e7fae49d2c5f84e8c1", size = 3089244 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/89/a0b0f35e2820d6a99d75ea1c11977ee6d5c9e6658eceb45b0c7620881faa/nltk-3.10.0-py3-none-any.whl", hash = "sha256:54ff84d4916d3ef127e8953bee0023f6a6b320b75d634a19e06ef056d3d244bf", size = 1716144 }, ] [[package]] @@ -1788,6 +2128,22 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, ] +[[package]] +name = "nodejs-wheel-binaries" +version = "24.16.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/22/2a5beb4e21417c73233d9f65cf6f3e96e891b80d2f550a8f630ebc6b88c6/nodejs_wheel_binaries-24.16.0.tar.gz", hash = "sha256:c973cb69dc5fd16e6f6dc6e579e2c3d5534e2a1f57619dddf5ba070efa7dde37", size = 8056 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/d1/68b43b53cd0fa83ae6fd406705023ca988d9e0ca41c724d82e66fbeb2ef6/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_arm64.whl", hash = "sha256:d9f8f677dcf30e37ac244f07869726abe043f01eb0f45722b1df31cc2af7093c", size = 55666374 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/b2/40a989159599080da485de966c4c2d207e852ac7aa7864702626d96c8bf5/nodejs_wheel_binaries-24.16.0-py2.py3-none-macosx_13_0_x86_64.whl", hash = "sha256:3d0370fe7120ce9697a4f60d40480d2bd8808d9f30131458d5afc0040d4e5a51", size = 55838487 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/a7/cd42174fb5ff6faff7fa8d326a18914d8f232098ab5de055b57c16fa13ca/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:85dc92bbb79c851569c5925dcc2a4c915a034efab375f99e4e7e6bbe9cca8342", size = 60179540 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/95/c8a1f9ae140aa28df8744d984d01d4b3af7cdd6555af12127f40ceb45a7d/nodejs_wheel_binaries-24.16.0-py2.py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:2f3036292811514ba847b3708492644764f88a833ac425c5f55007014308ddfd", size = 60716262 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/c9/7c35b3737f59e36d0249c265397b7bff570519b95301d6e16ea361e904ad/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:db8a8a76ebd2b28ecbfc9ad464baa3707241b9e050a30e2efdf6f60c0f886502", size = 62230592 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/96/d931255cf9d11a84d6b54d882dba7434646467d568ccf070ea3418638df3/nodejs_wheel_binaries-24.16.0-py2.py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f1a3d8f7b4491cbbd023ba3fc4e901fcca2d9fb80d57f24ba3890de8b1dbac03", size = 62841759 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/7b/8b7a3f41bc255411be30b6d7d288aab8ffd9ea2055db8555ced3548007b9/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_amd64.whl", hash = "sha256:bb136be9944f0662dcf1120f45193a6b75b13fac378971a95cc42c9f879a81aa", size = 42027734 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/66/1ed71f1f529b8ca727d42c7ceb9db0bef145ce4a13dfc86fb50aa44f3be6/nodejs_wheel_binaries-24.16.0-py2.py3-none-win_arm64.whl", hash = "sha256:8308940b5edd0a50dc5267ea36ba21c9f668e83fe0d9f293937174d3a7e31c36", size = 39714528 }, +] + [[package]] name = "numpy" version = "2.2.4" @@ -1889,7 +2245,7 @@ name = "nvidia-cudnn-cu12" version = "9.5.1.17" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2", size = 570988386 }, @@ -1900,7 +2256,7 @@ name = "nvidia-cufft-cu12" version = "11.3.0.4" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5", size = 200221632 }, @@ -1929,9 +2285,9 @@ name = "nvidia-cusolver-cu12" version = "11.7.1.2" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "nvidia-cublas-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-cusparse-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-cublas-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, + { name = "nvidia-cusparse-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c", size = 158229790 }, @@ -1943,7 +2299,7 @@ name = "nvidia-cusparse-cu12" version = "12.5.4.2" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "nvidia-nvjitlink-cu12", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73", size = 216561367 }, @@ -1985,7 +2341,7 @@ wheels = [ [[package]] name = "openai" -version = "1.68.2" +version = "2.46.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "anyio" }, @@ -1997,9 +2353,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19", size = 413429 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/ac/f725c4efbda8657d02be684607e5a2e5ce362e4790fdbcbdfb7c15018647/openai-2.46.0.tar.gz", hash = "sha256:0421e0735ac41451cad894af4cddf0435bfbf8cbc538ac0e15b3c062f2ddc06a", size = 1114628 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/7b/206238ebcb50b235942b1c66dba4974776f2057402a8d91c399be587d66a/openai-2.46.0-py3-none-any.whl", hash = "sha256:672381db55efb3a1e2610f29304c130cccdd0b319bace4d492b2443cb64c1e7c", size = 1637556 }, +] + +[[package]] +name = "openai-agents" +version = "0.18.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "griffelib" }, + { name = "mcp" }, + { name = "openai" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "typing-extensions" }, + { name = "websockets" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/3f/b1162cad8720fafc9cf658d6896027385967f5006adfb92ae0dab2b54a70/openai_agents-0.18.3.tar.gz", hash = "sha256:e637f5f5a50692ccbedb0e4f7f2e4f8e2facfcddd41142f35faf90c89b700fc3", size = 5577652 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36", size = 606073 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/7c/08b9929a15131081898e38c5612d44ee293851d5c80f31ca1153efe82143/openai_agents-0.18.3-py3-none-any.whl", hash = "sha256:c6ed971fdeb34d39a9931787bd3960c1e84dc5d7345705794cc5cab8a1158d07", size = 880799 }, ] [[package]] @@ -2037,15 +2411,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, -] - [[package]] name = "pdftext" version = "0.6.3" @@ -2066,11 +2431,11 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "python_full_version < '3.13' or sys_platform != 'win32'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] [[package]] @@ -2141,19 +2506,6 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, ] -[[package]] -name = "plotly" -version = "6.0.1" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "narwhals" }, - { name = "packaging" }, -] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/cc/e41b5f697ae403f0b50e47b7af2e36642a193085f553bf7cc1169362873a/plotly-6.0.1.tar.gz", hash = "sha256:dd8400229872b6e3c964b099be699f8d00c489a974f2cfccfad5e8240873366b", size = 8094643 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/65/ad2bc85f7377f5cfba5d4466d5474423a3fb7f6a97fd807c06f92dd3e721/plotly-6.0.1-py3-none-any.whl", hash = "sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768", size = 14805757 }, -] - [[package]] name = "pluggy" version = "1.5.0" @@ -2344,83 +2696,125 @@ wheels = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.13.4" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/e4/ba44652d562cbf0bf320e0f3810206149c8a4e99cdbf66da82e97ab53a15/pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12", size = 434928 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262 }, ] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.46.4" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/8b/d3ae387f66277bd8104096d6ec0a145f4baa2966ebb2cad746c0920c9526/pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b", size = 1867835 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/76/f68272e4c3a7df8777798282c5e47d508274917f29992d84e1898f8908c7/pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166", size = 1776689 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/69/5f945b4416f42ea3f3bc9d2aaec66c76084a6ff4ff27555bf9415ab43189/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb", size = 1800748 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/ab/891a7b0054bcc297fb02d44d05c50e68154e31788f2d9d41d0b72c89fdf7/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916", size = 1806469 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/7c/6e3fa122075d78f277a8431c4c608f061881b76c2b7faca01d317ee39b5d/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07", size = 2002246 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/6f/22d5692b7ab63fc4acbc74de6ff61d185804a83160adba5e6cc6068e1128/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232", size = 2659404 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/ac/1e647dc1121c028b691028fa61a4e7477e6aeb5132628fde41dd34c1671f/pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2", size = 2053940 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/75/984740c17f12c3ce18b5a2fcc4bdceb785cce7df1511a4ce89bca17c7e2d/pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f", size = 1921437 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/74/13c5f606b64d93f0721e7768cd3e8b2102164866c207b8cd6f90bb15d24f/pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3", size = 1966129 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/03/9c4aa5919457c7b57a016c1ab513b1a926ed9b2bb7915bf8e506bf65c34b/pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071", size = 2110908 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/2c/053d33f029c5dc65e5cf44ff03ceeefb7cce908f8f3cca9265e7f9b540c8/pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119", size = 1735278 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/81/7dfe464eca78d76d31dd661b04b5f2036ec72ea8848dd87ab7375e185c23/pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f", size = 1917453 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/30/890a583cd3f2be27ecf32b479d5d615710bb926d92da03e3f7838ff3e58b/pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8", size = 1865160 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/9a/b634442e1253bc6889c87afe8bb59447f106ee042140bd57680b3b113ec7/pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d", size = 1776777 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/9a/7816295124a6b08c24c96f9ce73085032d8bcbaf7e5a781cd41aa910c891/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e", size = 1799244 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/8f/89c1405176903e567c5f99ec53387449e62f1121894aa9fc2c4fdc51a59b/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607", size = 1805307 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/a5/1a194447d0da1ef492e3470680c66048fef56fc1f1a25cafbea4bc1d1c48/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd", size = 2000663 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/a5/1df8541651de4455e7d587cf556201b4f7997191e110bca3b589218745a5/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea", size = 2655941 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/31/a3899b5ce02c4316865e390107f145089876dff7e1dfc770a231d836aed8/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e", size = 2052105 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/aa/98e190f8745d5ec831f6d5449344c48c0627ac5fed4e5340a44b74878f8e/pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b", size = 1919967 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/35/b6e00b6abb2acfee3e8f85558c02a0822e9a8b2f2d812ea8b9079b118ba0/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0", size = 1964291 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/46/7bee6d32b69191cd649bbbd2361af79c472d72cb29bb2024f0b6e350ba06/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64", size = 2109666 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/ef/7b34f1b122a81b68ed0a7d0e564da9ccdc9a2924c8d6c6b5b11fa3a56970/pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f", size = 1732940 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/76/37b7e76c645843ff46c1d73e046207311ef298d3f7b2f7d8f6ac60113071/pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3", size = 1916804 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/7b/8e315f80666194b354966ec84b7d567da77ad927ed6323db4006cf915f3f/pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231", size = 1856459 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/de/866bdce10ed808323d437612aca1ec9971b981e1c52e5e42ad9b8e17a6f6/pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee", size = 1770007 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/69/8edd5c3cd48bb833a3f7ef9b81d7666ccddd3c9a635225214e044b6e8281/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87", size = 1790245 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/33/9c24334e3af796ce80d2274940aae38dd4e5676298b4398eff103a79e02d/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8", size = 1801260 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/6f/e9567fd90104b79b101ca9d120219644d3314962caa7948dd8b965e9f83e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327", size = 1996872 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/ad/b5f0fe9e6cfee915dd144edbd10b6e9c9c9c9d7a56b69256d124b8ac682e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2", size = 2661617 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/c8/7d4b708f8d05a5cbfda3243aad468052c6e99de7d0937c9146c24d9f12e9/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36", size = 2071831 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/4d/3079d00c47f22c9a9a8220db088b309ad6e600a73d7a69473e3a8e5e3ea3/pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126", size = 1917453 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/88/9df5b7ce880a4703fcc2d76c8c2d8eb9f861f79d0c56f4b8f5f2607ccec8/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e", size = 1968793 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/b9/41f7efe80f6ce2ed3ee3c2dcfe10ab7adc1172f778cc9659509a79518c43/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24", size = 2116872 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/08/b59b7a92e03dd25554b0436554bf23e7c29abae7cce4b1c459cd92746811/pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84", size = 1738535 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/8d/479293e4d39ab409747926eec4329de5b7129beaedc3786eca070605d07f/pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9", size = 1917992 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/ef/16ee2df472bf0e419b6bc68c05bf0145c49247a1095e85cee1463c6a44a1/pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc", size = 1856143 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/fa/bc3dbb83605669a34a93308e297ab22be82dfb9dcf88c6cf4b4f264e0a42/pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd", size = 1770063 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/48/e813f3bbd257a712303ebdf55c8dc46f9589ec74b384c9f652597df3288d/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05", size = 1790013 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/e0/56eda3a37929a1d297fcab1966db8c339023bcca0b64c5a84896db3fcc5c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d", size = 1801077 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/be/5e49376769bfbf82486da6c5c1683b891809365c20d7c7e52792ce4c71f3/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510", size = 1996782 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/24/e3ee6c04f1d58cc15f37bcc62f32c7478ff55142b7b3e6d42ea374ea427c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6", size = 2661375 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/f8/11a9006de4e89d016b8de74ebb1db727dc100608bb1e6bbe9d56a3cbbcce/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b", size = 2071635 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/45/bdce5779b59f468bdf262a5bc9eecbae87f271c51aef628d8c073b4b4b4c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327", size = 1916994 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/fa/c648308fe711ee1f88192cad6026ab4f925396d1293e8356de7e55be89b5/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6", size = 1968877 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/16/b805c74b35607d24d37103007f899abc4880923b04929547ae68d478b7f4/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f", size = 2116814 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/58/5305e723d9fcdf1c5a655e6a4cc2a07128bf644ff4b1d98daf7a9dbf57da/pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769", size = 1738360 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/a9/5d582eb3204464284611f636b55c0a7410d748ff338756323cb1ce721b96/pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5", size = 1857135 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/57/faf36290933fe16717f97829eabfb1868182ac495f99cf0eda9f59687c9d/pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec", size = 1740583 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/7c/d99e3513dc191c4fec363aef1bf4c8af9125d8fa53af7cb97e8babef4e40/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480", size = 1793637 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/18/812222b6d18c2d13eebbb0f7cdc170a408d9ced65794fdb86147c77e1982/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068", size = 1941963 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/36/c1f3642ac3f05e6bb4aec3ffc399fa3f84895d259cf5f0ce3054b7735c29/pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801", size = 1915332 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/ca/9c0854829311fb446020ebb540ee22509731abad886d2859c855dd29b904/pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728", size = 1957926 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/1c/7836b67c42d0cd4441fcd9fafbf6a027ad4b79b6559f80cf11f89fd83648/pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433", size = 2100342 }, - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/f9/b6bcaf874f410564a78908739c80861a171788ef4d4f76f5009656672dfe/pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753", size = 1920344 }, +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", size = 2106306 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", size = 1951906 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", size = 1973693 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", size = 2071819 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", size = 2027411 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", size = 2102079 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", size = 1952179 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", size = 1966354 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", size = 2072238 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", size = 2018251 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", size = 2099593 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", size = 1935226 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", size = 1955575 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", size = 2051624 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", size = 2017325 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071 }, ] [[package]] @@ -2445,6 +2839,23 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] +[[package]] +name = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", size = 107515 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", size = 31274 }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + [[package]] name = "pymupdf" version = "1.26.1" @@ -2481,18 +2892,48 @@ wheels = [ ] [[package]] -name = "pyperclip" -version = "1.9.0" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/23/2f0a3efc4d6a32f3b63cdff36cd398d9701d26cda58e3ab97ac79fb5e60d/pyperclip-1.9.0.tar.gz", hash = "sha256:b7de0142ddc81bfc5c7507eea19da920b92252b548b96186caf94a5e2527d310", size = 20961 } - -[[package]] -name = "pyreadline3" -version = "3.5.4" -source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839 } -wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178 }, +name = "pystemmer" +version = "2.2.0.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/12/0378ba4391a4674067ae9db0e025ec998f6ca74caddd22fbdc59dc19aafb/pystemmer-2.2.0.3.tar.gz", hash = "sha256:9ac74c8d0f3358dbb050f64cddbb8d55021d831d92305d7c20780ea8d6c0020e", size = 303860 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/c6/6929a114ca2b41464cd7643b5c7b12be2ef0bf43f65c3bba02bff3ddf163/PyStemmer-2.2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2935aa78a89b04899de4a8b8b6339806e0d5cd93811de52e98829b5762cf913c", size = 214158 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/27/b3950b55542ec9c59bae8484d0a3dcb88cba9f2268222f60f5538c8a853f/PyStemmer-2.2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:31c9d3c808647d4c569737b32b40ed23c67133d2b89033ebc8b5756cadf6f1c1", size = 220116 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/f5/d3fd6aab0d6a3c400f9a1bff1ec091ec29a34d76ef3b69b8472801b6d979/PyStemmer-2.2.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:584ead989545a60919e4015371dd2f69ff0ca985e76618d41930f77b9e248286", size = 612115 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/53/2fd493c6d61d8cd42a3b3f8268ddae6658f3c8bad0adf205f218606f236d/PyStemmer-2.2.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be904f4d0d522de98ff9f0a348d8748c2f95926523b7b04ee75b50967289782d", size = 646708 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/76/b09792a8141fb03f27f61c75333c84793298287f0d978a755deeb96029c3/PyStemmer-2.2.0.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7024cdbcf4bbc2a5e1c277e11a10cb2b7481b7f99946cdcfa7271d5e9799399a", size = 626855 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/f2/3275207f690d1eeea8e0e4900f5311e9e48497b39946e5519b8b4aa068d3/PyStemmer-2.2.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:aa0f70f84c69b7a6a38ddbea51a29f855c42120e8069ea4c450021a2c7dc42d8", size = 656727 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/cd/224127bdf035803cfeddf83029d4398ee122289f11f5c2252832885de1c0/PyStemmer-2.2.0.3-cp310-cp310-win32.whl", hash = "sha256:85e583ec705b1b1c0503bc9cdbca027d3446cbc7cf7de3d29f1e0ab58999e5fe", size = 141159 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/94/51643ed8adb4a558c784fbbb9df2877a103cd34a55d2c2863030badab54d/PyStemmer-2.2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:4556b2718bb22052f39a50f3166c4ee0e140c58ee06bbab31d57d765159d2f00", size = 184865 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/bf/664bf08622e54aea83006f168ee3655a50dcebc7df66e023557bb1333d00/PyStemmer-2.2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0c76ac603ff774fe3137340083315f34d6afbcd4ebebab99c1564c00c1c318ee", size = 214216 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/b2/591ff043474cc1d2e2a86d4460b310b6bcc6d4fa91cc59ef4ffb887e64e4/PyStemmer-2.2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ee100ba27a07d2fc3bd29cdd619cdff51735ed059002574c550697d1d160b7c9", size = 220087 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/8d/c5101e915ea17f0ae8faefe7370c997315947d488bc1c8087dc5dee0bf43/PyStemmer-2.2.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3932f794e84bf29bdf4952d018b00c290fd06b055648f8e8fb9132e6684c4472", size = 630851 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/9b/91b46ea4d920014181b2d7256086a68ae1374f40bfeebee13497674511c4/PyStemmer-2.2.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74f6e0bb2034880bf4688ab5b95f97bb90952086682a93f080b260b454f933e", size = 669279 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/02/cbd096d8ba891384ba9f3e684ff3cfd52b7f7131581b7f5e4b35d66b7289/PyStemmer-2.2.0.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:af925366939839e4bf11f426388201195c305a3edcdd9097e8775fbd083ff309", size = 639701 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/ad/10571e4e79bd9b9101bf33d274b7ad2b09c4d5ddc241cdac451ea889cdc0/PyStemmer-2.2.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b199cbab2ce93ee1dd76da4d0523af5af4446d775b7bcb75dfdfcd2a8226404e", size = 673230 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/01/e4ae834f93cffda555907b7d8e4678113d94d2874ba39e7cbbfe14ad9373/PyStemmer-2.2.0.3-cp311-cp311-win32.whl", hash = "sha256:e9bbaa5aa38a2f82bb1eaa6b97396e58c3a7f87e46607f52c7fda53927616eda", size = 140866 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/d4/6ee439fe4ece1ebe40d13b7ef6f6bcd42a9775d725032db40b226be66bf8/PyStemmer-2.2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:258af638eb68273f130c9878de2bb4a427fe99e86900b9b9b09c1cd7a185c189", size = 184766 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/7c/e09c0ac1aa4571ded5f46c14aed5d4828b61392611ed1c59a8faf1cae98a/PyStemmer-2.2.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c30c44241065beb9432273874f199fc109473338d9f2c921a3387fd534fd94a7", size = 214916 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/dc/b30dd228af740b1ffe18e4cfb48c22aa8481ce1e79405cac31086fb849bd/PyStemmer-2.2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a6adf0b86b6be85f0cf80b2b255b2b0179782b4a3f39c0a6c5b3dd07af5f95eb", size = 220418 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/68/eb9f06b2f04f408ed748d6e71fb2f5ae92deba0eea07b6e374268d53cb49/PyStemmer-2.2.0.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d42b41082553fa23a4ce191860fd7caffdeaf8507e84db630a97ed154bd2320", size = 644074 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/9f/e95eeccf29ad1e1dbf4a14b76e2fa5b6698ba06f10634b097b32258839b0/PyStemmer-2.2.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec763ee2994402c534bf898ff318edd158c32071c3ffbdcd7ae7b7c884250471", size = 683255 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/4b/8b077958eb760ac647d2362f8bd1ae99097fa351edc6333fde0dee51f912/PyStemmer-2.2.0.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:264f09d5f70b09c845a6f0d0d4973de674056fd50452cb9383ffae8fc0967f1d", size = 649228 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/13/3d57038439293d93e40af89b48bc06c714f8cd8c5d22a9e6d0870f49ea1c/PyStemmer-2.2.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5634f38a781b9a893550c23380af080ca5291d19c2bcb1753a34022d1d0de7cb", size = 682987 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/95/f04305ab6fc6312b4727b725ab983342237c7bb95d21d98bd768146dd9e8/PyStemmer-2.2.0.3-cp312-cp312-win32.whl", hash = "sha256:186c2e90ea2c3d0fab21f10f17b48fb7d716cba5f49b68f7f0fe539db4ff0499", size = 141412 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/73/861a71009f20331cd22aff1c37b9c39ef3af4d57d6816df79d51b3fca533/PyStemmer-2.2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:320c1da333f5f8571e2b313c9fa6c0a7a79d8a00a2ad0bf29932d931d236d7e8", size = 185395 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/eb/b39bef7c8ec2ad9e198b956104741c1e7a94f0003875ef0a5a32ae20443f/PyStemmer-2.2.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:806530b6a1542efd6453fc5f5b5aa348d52c337d0eb1dfc54a5ff6a8733d7ccc", size = 214375 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/db/93f0fd99c99cfdfb68a6d671324ceb3e9c0cf2040f47d917a42e615faf03/PyStemmer-2.2.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d3fe53911811ec554b13a2c3b0ceb1a23c6fbed3d510ea0d8544a4e0b861e4d6", size = 219992 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/52/cb3ad58e8ce701c97a38f7828d899cfd12f0b7b06c49a4d67a17298641eb/PyStemmer-2.2.0.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf26cc1071685597b54b78dd2f62080c58f9be1cb9b4f9c92f94d5c0b5e5e65d", size = 638201 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/e7/d22c50ac8e76c2878cc1056010d0db26b7e5a7936262320c62a6dcdfdbc9/PyStemmer-2.2.0.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d229a8451e5e909c3f41e19c2f1c9a531d3281954a8cbc06163a458adcc465", size = 678416 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/bd/cd603a89316769c4ae3a4d2271c9c9707b26939517bbe2f780c4f171ade3/PyStemmer-2.2.0.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f44e27fbdeffd46b513ed80d5dab0c7e0e09fb1cd85e8dbf8041b6e4a2d55bee", size = 643274 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/0e/7fad0a408def5738ce1deffc6242bd8086f76fae1f7a5a4c36e31ab528d0/PyStemmer-2.2.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4acd71d4359399e41543198caf150e7f398a8d52e371a0c89ba63a90ec3e0909", size = 677487 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/79/3f429bd0c97fe95d62aee32216dfbe3db9a59c3a8a3ff185bb1927e45658/PyStemmer-2.2.0.3-cp313-cp313-win32.whl", hash = "sha256:91ab47d071383b5c558542bf54facf116f3fd1516c177ef10843f41e528d8873", size = 141345 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/65/87b637539c73bf5b1074eba87389616949e073d91f6c670a4d91e16504de/PyStemmer-2.2.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:4e192613a1e02b0cebcbb9f8a708001bdf7ec842972b42008f3b0b006a8c53b6", size = 185251 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/69/cbc7f00bda703f5b60a665a68e2d9df6c077c59da2bea52f35b1a496c549/PyStemmer-2.2.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ff3feeac41968fd8b50e9d6b8a03a5f15b27e765a0826f06dc32155f8f22909c", size = 170258 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/31/eb832a4296814acd8c403eb555ada436700d93ab526c824e2f1d69dced15/PyStemmer-2.2.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:41a31d8ad810063e2cc675d93d0951dbfbb6ede278e111f15d74b7d781612364", size = 173914 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/37/a4a4b8d9db835fbf55dd532c357286b58c7418188a38233f067ef0197ad0/PyStemmer-2.2.0.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4abcb516040d7a561eb95c60125f9f5636080c154f46d365b14cd33197ac74fd", size = 218327 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/11/e9a0e32573391d335560e9caf05011d15c8b7d368f318d3a4516275c8938/PyStemmer-2.2.0.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8c307f1d5084e6074bc1826df9453887e589e92bab63851991b444f68a08b7e", size = 225148 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/ac/3822a77de25f035b77130bfd30dcf57871c8818795918c3806b9b4e152ca/PyStemmer-2.2.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7f0d5f36922ea94599f79f86383972e91cdeab28918f8e1535cd589d2b5fb345", size = 180277 }, ] [[package]] @@ -2512,6 +2953,20 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] +[[package]] +name = "pytest-asyncio" +version = "1.3.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075 }, +] + [[package]] name = "pytest-cov" version = "6.2.1" @@ -2548,22 +3003,33 @@ wheels = [ ] [[package]] -name = "pyvis" -version = "0.3.1" +name = "python-multipart" +version = "0.0.32" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -dependencies = [ - { name = "ipython", version = "8.34.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.0.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "jinja2" }, - { name = "jsonpickle" }, - { name = "networkx" }, +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", size = 46881 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", size = 30042 }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141 }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/b0/b6479739f9fc716784a71008322974f3a008c4203d6fff0653050fa93e45/pyvis-0.3.1.tar.gz", hash = "sha256:aa817caac54afc9a4df38ada6f46636b842a8bd57197bb6aca5084699da04307", size = 748933 } [[package]] name = "pywin32" version = "310" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux')", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux')", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')", +] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240 }, { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854 }, @@ -2579,6 +3045,34 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, ] +[[package]] +name = "pywin32" +version = "312" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", +] +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/1b/9cfdeac80ee45bebbbcb31f1b7b99a0d81a1c72de48d837be984e0e88b1d/pywin32-312-cp310-cp310-win32.whl", hash = "sha256:772235332b5d1024c696f11cea1ae4be7930f0a8b894bb43db14e3f435f1ff7e", size = 6361387 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/b1/7afc96d041d982c27bc2df6f853d43f01fd273e3d39d04be3647ddeb533d/pywin32-312-cp310-cp310-win_amd64.whl", hash = "sha256:5dbc35d2b5320dc07f25fa31269cfb767471002b17de5eb067d03da68c7cb2db", size = 6926780 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/3a/4140da9ad54108e517f4a16b2d83da3033e08662144623e1239587cb7db6/pywin32-312-cp310-cp310-win_arm64.whl", hash = "sha256:3020656e34f1cf7faeb7bccd2b84653a607c6ff0c55ada85e6487d61716deabd", size = 4307203 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/f5/10a6e845a00fc5e7afd0a988b744f403d4d57162a28d160a093c4d9322f0/pywin32-312-cp311-cp311-win32.whl", hash = "sha256:17948aeadbdb091f0ced6ef0841620794e68327b94ee415571c1203594b7215c", size = 6362659 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/c4/dcd2d62b5944b6d5db53413a5899016ccd57ffcb7278f3f81655d25d2027/pywin32-312-cp311-cp311-win_amd64.whl", hash = "sha256:d11417d84412f859b722fad0841b3614459ed0047f7542d8362e77884f6b6e8a", size = 6928825 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/56/3cbb433fe4501cdba2eb9040f56a4e1a8243faa4186b25295564d1a7a79d/pywin32-312-cp311-cp311-win_arm64.whl", hash = "sha256:b2200a054ca6d6625c4842fc56a4976a4b47f96b73dbe5538c3f813a80359f47", size = 6721875 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/ff/32aa7d2ed0ab12b323aaa64f9b75e6ad4f8fd09f9ccfc28c79414d46838d/pywin32-312-cp312-cp312-win32.whl", hash = "sha256:dab4f65ac9c4e48400a2a0530c46c3c579cd5905ecd11b80692373915269208b", size = 6371877 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", hash = "sha256:b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc", size = 6914841 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/cc/7b1ec671775756020a0ee7f4feeaf3c568f0ab86bd3900088cf986937a92/pywin32-312-cp312-cp312-win_arm64.whl", hash = "sha256:6017c58e12f6809fbb0555b75df144c2922a9ffd18e4b9b5afa863b6c1a9d950", size = 6727901 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", size = 6370184 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", size = 6914298 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", size = 6727640 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/2b/1f3cded5822fd49c02f40544cbb5f58c7cfd6b1694869fd476cb6170ee97/pywin32-312-cp314-cp314-win32.whl", hash = "sha256:a77a90fbb6881238d2ca9c6fd797b25817f3768fe78d214a90137ff055a75f5b", size = 6468928 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/82/3bf86d2e2808902013132e1ce905a7da0da53790f3836c64bf44d55e24f3/pywin32-312-cp314-cp314-win_amd64.whl", hash = "sha256:a4dd3a848290ef724347b19f301045831d8e802fa4464f491b98b1e0a081432e", size = 7024157 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/0e/73f6d6800b4f27655abd9e9f6aaeaefcddb2b946e4674efa2bab184a7f7b/pywin32-312-cp314-cp314-win_arm64.whl", hash = "sha256:9fce94568364e0155e6dfb781ac5d95903be8baf28670632beab1b523f300daa", size = 6839598 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/61/caa39686032d2ebdd04ff0ab5cbe163126c0066d98e00c9018646e42393b/pywin32-312-cp315-cp315-win32.whl", hash = "sha256:5c1fbe4a937a73ae9297384a3da38518cbc694c68ad8a809b2e19acd350f03ed", size = 6471159 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/cd/7e1de64a4a6f69c04214169657ccab0d93a670ea50e35eb8f489d7378249/pywin32-312-cp315-cp315-win_amd64.whl", hash = "sha256:c2f03a0f73f804a13c2735b99392b0cd426bb4f2c4d0178e5ac966a0f21618d5", size = 7025293 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/23/ed/4532e9388e65fa16b46776ef47ad631a64eda1631884488af707666350ed/pywin32-312-cp315-cp315-win_arm64.whl", hash = "sha256:a8597d28f267b39074aef51fa593530082b39cbe5a074226096857b1fed2dfb9", size = 6840337 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -2702,35 +3196,33 @@ version = "0.2.0" source = { editable = "." } dependencies = [ { name = "arxiv" }, - { name = "camel-ai" }, { name = "httpx", extra = ["socks"] }, { name = "ipykernel" }, + { name = "jinja2" }, { name = "litellm" }, - { name = "llama-cloud-services" }, - { name = "marker" }, - { name = "networkx" }, - { name = "numpy" }, + { name = "liteparse" }, + { name = "llama-index-core" }, + { name = "llama-index-retrievers-bm25" }, { name = "openai" }, + { name = "openai-agents" }, { name = "pillow" }, - { name = "plotly" }, { name = "pydantic" }, { name = "pymupdf" }, - { name = "pytest" }, { name = "python-dotenv" }, - { name = "pyvis" }, { name = "pyyaml" }, - { name = "requests" }, - { name = "ruff" }, - { name = "scikit-learn" }, + { name = "trafilatura" }, ] [package.optional-dependencies] dev = [ - { name = "black" }, - { name = "isort" }, - { name = "mypy" }, + { name = "basedpyright" }, + { name = "import-linter" }, + { name = "pre-commit" }, { name = "pytest" }, + { name = "pytest-asyncio" }, { name = "pytest-cov" }, + { name = "respx" }, + { name = "ruff" }, ] full = [ { name = "beautifulsoup4" }, @@ -2741,34 +3233,32 @@ full = [ [package.metadata] requires-dist = [ { name = "arxiv" }, + { name = "basedpyright", marker = "extra == 'dev'", specifier = ">=1.39" }, { name = "beautifulsoup4", marker = "extra == 'full'", specifier = ">=4.12.0" }, - { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, - { name = "camel-ai", specifier = ">=0.2.42" }, { name = "httpx", extras = ["socks"], specifier = ">=0.28.1" }, + { name = "import-linter", marker = "extra == 'dev'", specifier = ">=2.11" }, { name = "ipykernel", specifier = ">=6.29.5" }, - { name = "isort", marker = "extra == 'dev'", specifier = ">=5.12.0" }, + { name = "jinja2", specifier = ">=3.0.0" }, { name = "litellm", specifier = ">=1.74.0.post1" }, - { name = "llama-cloud-services", specifier = ">=0.6.12" }, - { name = "marker", specifier = ">=2.1.3" }, + { name = "liteparse", specifier = ">=2.6,<3" }, + { name = "llama-index-core", specifier = ">=0.14,<0.15" }, + { name = "llama-index-retrievers-bm25", specifier = ">=0.6,<0.7" }, { name = "marker-pdf", marker = "extra == 'full'", specifier = ">=0.2.0" }, - { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, - { name = "networkx", specifier = ">=3.4.2" }, - { name = "numpy", specifier = ">=2.2.4" }, { name = "openai", specifier = ">=1.68.2" }, + { name = "openai-agents", specifier = ">=0.14" }, { name = "pillow", specifier = ">=10.1.0,<11.0.0" }, - { name = "plotly", specifier = ">=6.0.1" }, + { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.0" }, { name = "pydantic", specifier = ">=2.0.0" }, { name = "pymupdf", specifier = ">=1.23.0" }, - { name = "pytest" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0" }, - { name = "pyvis", specifier = "==0.3.1" }, { name = "pyyaml" }, - { name = "requests" }, - { name = "ruff" }, - { name = "scikit-learn", specifier = ">=1.6.1" }, + { name = "respx", marker = "extra == 'dev'", specifier = ">=0.21" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.11,<0.12" }, { name = "sentence-transformers", marker = "extra == 'full'", specifier = ">=2.2.0" }, + { name = "trafilatura", specifier = ">=1.10" }, ] provides-extras = ["dev", "full"] @@ -2950,18 +3440,29 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] +[[package]] +name = "respx" +version = "0.23.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/98/4e55c9c486404ec12373708d015ebce157966965a5ebe7f28ff2c784d41b/respx-0.23.1.tar.gz", hash = "sha256:242dcc6ce6b5b9bf621f5870c82a63997e8e82bc7c947f9ffe272b8f3dd5a780", size = 29243 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/4a/221da6ca167db45693d8d26c7dc79ccfc978a440251bf6721c9aaf251ac0/respx-0.23.1-py2.py3-none-any.whl", hash = "sha256:b18004b029935384bccfa6d7d9d74b4ec9af73a081cc28600fffc0447f4b8c1a", size = 25557 }, +] + [[package]] name = "rich" -version = "14.0.0" +version = "15.0.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654 }, ] [[package]] @@ -3339,7 +3840,8 @@ version = "2.2.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "anyio" }, - { name = "starlette" }, + { name = "starlette", version = "0.46.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version < '3.14'" }, + { name = "starlette", version = "1.3.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }, marker = "python_full_version >= '3.14'" }, ] sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376 } wheels = [ @@ -3364,26 +3866,57 @@ wheels = [ name = "starlette" version = "0.46.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +resolution-markers = [ + "python_full_version == '3.13.*' and sys_platform == 'darwin'", + "python_full_version == '3.13.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "(python_full_version == '3.13.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.13.*' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", + "python_full_version == '3.12.*' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version == '3.12.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.12.*' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform != 'darwin' and sys_platform != 'linux')", + "python_full_version < '3.11' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')", +] dependencies = [ - { name = "anyio" }, + { name = "anyio", marker = "python_full_version < '3.14'" }, ] sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, ] +[[package]] +name = "starlette" +version = "1.3.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'darwin'", + "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "python_full_version >= '3.14' and sys_platform == 'win32'", + "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')", +] +dependencies = [ + { name = "anyio", marker = "python_full_version >= '3.14'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", size = 2703240 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", size = 73632 }, +] + [[package]] name = "surya-ocr" -version = "0.14.6" +version = "0.13.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ { name = "click" }, - { name = "einops" }, { name = "filetype" }, { name = "opencv-python-headless" }, { name = "pillow" }, { name = "platformdirs" }, - { name = "pre-commit" }, { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pypdfium2" }, @@ -3391,9 +3924,9 @@ dependencies = [ { name = "torch" }, { name = "transformers" }, ] -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/28/f8b3d8d399034b927c062dc56c0414af8b0c2336c3345e2ff3a734d6fdab/surya_ocr-0.14.6.tar.gz", hash = "sha256:c85a0bd9dd00c86ab44ed265c0ed15601106dbaf2d0d0a067fa7bb533137d5f0", size = 150108 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/b7/5fbd8fe3bff47171ae36ac41bf1d813875d9037dc14ad102cd7d7027a073/surya_ocr-0.13.1.tar.gz", hash = "sha256:af4004448eb8798aeddd4aa709c2f4d3795a3ec7bf12252595b481a65f799a52", size = 128034 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/d4/ce97c874da1aa2f66422aed206edda398a4478c44d15614df1f84bda45ef/surya_ocr-0.14.6-py3-none-any.whl", hash = "sha256:4c89c3a4606838db1d0f6b565eb4e49db8823982212beb581bb819d5bbbb9519", size = 177311 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/4f/413012acf25e38956b5d788b771544ad628a3715fc559568730987749d89/surya_ocr-0.13.1-py3-none-any.whl", hash = "sha256:2704a97f5de625bc747eddf87874635cb8be164c4c9373207a022648325f009d", size = 154105 }, ] [[package]] @@ -3459,6 +3992,24 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/4b/48ca098cb580c099b5058bf62c4cb5e90ca6130fa43ef4df27088536245b/tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f", size = 799281 }, ] +[[package]] +name = "tinytag" +version = "2.2.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/59/8a8cb2331e2602b53e4dc06960f57d1387a2b18e7efd24e5f9cb60ea4925/tinytag-2.2.1.tar.gz", hash = "sha256:e6d06610ebe7cd66fd07be2d3b9495914ab32654a5e47657bb8cd44c2484523c", size = 38214 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/34/d50e338631baaf65ec5396e70085e5de0b52b24b28db1ffbc1c6e82190dc/tinytag-2.2.1-py3-none-any.whl", hash = "sha256:ed8b1e6d25367937e3321e054f4974f9abfde1a3e0a538824c87da377130c2b6", size = 32927 }, +] + +[[package]] +name = "tld" +version = "0.13.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/5d/76b4383ac4e5b5e254e50c09807b3e13820bed6d6c11cd540264988d6802/tld-0.13.2.tar.gz", hash = "sha256:d983fa92b9d717400742fca844e29d5e18271079c7bcfabf66d01b39b4a14345", size = 467175 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/90/39a85a4b63c84213e78b3c17d22e1bf45328acf8ebb33ef93be30d0a3911/tld-0.13.2-py2.py3-none-any.whl", hash = "sha256:9b8fdbdb880e7ba65b216a4937f2c94c49a7226723783d5838fc958ac76f4e0c", size = 296743 }, +] + [[package]] name = "tokenizers" version = "0.21.1" @@ -3604,6 +4155,24 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] +[[package]] +name = "trafilatura" +version = "2.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "courlan" }, + { name = "htmldate" }, + { name = "justext" }, + { name = "lxml" }, + { name = "urllib3" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/19/24833e905df2d80e3bb67424f95febcc17709a1f61a522120bc438afca70/trafilatura-2.1.0.tar.gz", hash = "sha256:f689e2116fc89c7bc0b9a296d01dcfe2eb0b5455f8c371a77dc0db1f06a05643", size = 263876 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/78/4ad99d79aee2784f49f20fd0a29058ce4c032fe4439047924c43521cd211/trafilatura-2.1.0-py3-none-any.whl", hash = "sha256:0eded5207a806445ddebbe36eae30b9035fe6a2f233c36f6fe82663fca8b9d30", size = 134600 }, +] + [[package]] name = "traitlets" version = "5.14.3" @@ -3639,7 +4208,7 @@ name = "triton" version = "3.3.1" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } dependencies = [ - { name = "setuptools", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "setuptools", marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')" }, ] wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/a9/549e51e9b1b2c9b854fd761a1d23df0ba2fbc60bd0c13b489ffa518cfcb7/triton-3.3.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b74db445b1c562844d3cfad6e9679c72e93fdfb1a90a24052b03bb5c49d1242e", size = 155600257 }, @@ -3651,11 +4220,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.13.0" +version = "4.16.0" source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } -sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555 } wheels = [ - { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571 }, ] [[package]] @@ -3671,6 +4240,39 @@ wheels = [ { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f" }, ] +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168 }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115 }, +] + [[package]] name = "urllib3" version = "2.3.0" From c5eaf8fb3f750c02458e26a431ff94dd84b0a70a Mon Sep 17 00:00:00 2001 From: pkuwkl Date: Sat, 18 Jul 2026 02:34:10 +0800 Subject: [PATCH 2/3] refactor(rag): clarify imports and documentation boundaries --- docs/README.md | 6 +-- docs/library.md | 71 ++------------------------------ examples/preprocess/paper_rag.py | 2 +- scripts/verify_pdf_rag_e2e.py | 4 +- tests/test_verify_pdf_rag_e2e.py | 2 +- 5 files changed, 8 insertions(+), 77 deletions(-) diff --git a/docs/README.md b/docs/README.md index b503689..95d435f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ harness. | News collection | `quantmind.flows.collect_news` | `NewsWindow`, `NewsCollectionCfg` | `NewsBatch` from `quantmind.preprocess` | [Collect news](../examples/flows/collect_news.py) | [News collection design](../contexts/design/flow/news.md) | | Bounded fan-out | `quantmind.flows.batch_run` | Operation inputs and shared config | `BatchResult` | [README usage](../README.md#-usage-examples) | API docstrings | | Local semantic search | `quantmind.library.LocalKnowledgeLibrary` | `BaseKnowledge`, `SemanticQuery` | `list[SemanticHit]` | [Library example](../examples/library/README.md) | [Library guide](library.md) | -| Page-aware PDF RAG | `quantmind.preprocess.parse_pdf` | Exact PDF bytes and optional artifact directory | `ParsedDocument` | [Paper RAG](../examples/preprocess/paper_rag.py) | [PDF preprocessing design](../contexts/design/preprocess/pdf.md) | +| Page-aware PDF RAG | `quantmind.preprocess.format.parse_pdf` | Exact PDF bytes and optional artifact directory | `ParsedDocument` | [Paper RAG](../examples/preprocess/paper_rag.py) | [PDF preprocessing design](../contexts/design/preprocess/pdf.md) | Import public inputs and configs from `quantmind.configs` and current public operations from `quantmind.flows`. Import result contracts from the canonical @@ -38,10 +38,6 @@ manual dispatch, and only on pull requests that change its dependency paths. It is not a required merge check, so external PR Newswire availability cannot block unrelated changes. -The PDF RAG smoke fetches the pinned 15-page Transformer paper, parses ordered -pages, creates LlamaIndex chunks, and verifies that BM25 retrieval returns a -multi-head-attention passage with page metadata. It does not call an LLM. - ## Verification Run the deterministic required verification for every change: diff --git a/docs/library.md b/docs/library.md index f8a1883..3323d34 100644 --- a/docs/library.md +++ b/docs/library.md @@ -1,73 +1,8 @@ # Local Semantic Knowledge Library -`quantmind.library` persists canonical `BaseKnowledge` in SQLite and ranks -rebuildable semantic records through a private LlamaIndex vector index. It is a financial -knowledge API, not a generic RAG framework: provider and storage details remain -private, and search returns typed QuantMind evidence without generating an -answer. - -## Retrieval grain - -- Each `FlattenKnowledge` item produces one target from its exact - `embedding_text()` projection. -- Each `TreeKnowledge` produces one item target for the root with - `node_id=None`, plus one target for every non-root `TreeNode`. -- Canonical typed records are the source of truth. Embeddings and filter - columns are derived data and can be replaced by re-putting the item. - -## Local storage model - -The default local database is SQLite, with separate canonical and derived -concerns: - -- `knowledge_items` stores one aggregate root per `BaseKnowledge`. The type - discriminator and schema version select the concrete Pydantic model. -- `knowledge_nodes` stores every canonical `TreeNode` separately with its item, - parent, position, payload, and content hash. A large tree is not hidden in the - aggregate-root JSON row. -- `semantic_records` stores rebuildable item/root/node projections and vectors. - -Concrete types do not get tables such as `news`, `earnings`, or `papers`. -Creating one table per Pydantic subtype would duplicate common metadata and -require a database migration whenever the knowledge standard adds a type. The -aggregate-root plus normalized-node model preserves typed validation while -giving future tree navigation a stable node-level storage boundary. - -SQLite is the default because canonical knowledge needs transactions, foreign -keys, typed reconstruction, and explicit corrupt/stale/not-found behavior. A -vector database such as Chroma optimizes the derived similarity-search layer; -it does not replace those canonical-storage responsibilities. The current local -implementation rebuilds a private in-memory LlamaIndex vector index from -`semantic_records`, without adding another service. If corpus size later -requires an approximate or remote vector index, that derived layer can change -privately without changing `LocalKnowledgeLibrary`, the canonical tables, or -user code. A future PageIndex operation may navigate a selected document tree -separately; the library is not defined as vector-only. - -The durable vector metadata records the embedding model and dimension, exact -projection hash, source content hash, knowledge schema version, and projection -schema version. Re-putting an unchanged item ID reuses its vectors. A changed -node projection replaces only that node vector; model, dimension, source hash, -or schema changes replace the affected item's vectors. - -## Financial-time filters - -`as_of` is the information cutoff represented by the knowledge. `available_at` -is when its source became observable. They intentionally remain separate: - -- `as_of_before` includes records whose information cutoff is at or before the - query cutoff. -- `available_at_before` includes only records with a known availability time at - or before the query cutoff. Unknown availability is excluded. - -Consequently, `as_of_before` alone does not prevent look-ahead. Ingestion flows -should populate `available_at` from publication time. When publication time is -unknown, the caller can copy `SourceRef.fetched_at` to `available_at` as a -conservative upper bound. - -`item_types` and `source_kinds` use any-of matching. Every requested tag must be -present. `confidence`, `tree_id`, and both time cutoffs combine with those -filters before ranking. +This page only explains how to run the bundled example. The canonical storage, +retrieval, financial-time, and PageIndex boundaries live in the +[local library design](../contexts/design/library/local.md). ## Usage diff --git a/examples/preprocess/paper_rag.py b/examples/preprocess/paper_rag.py index 96a0cc7..d309ce6 100644 --- a/examples/preprocess/paper_rag.py +++ b/examples/preprocess/paper_rag.py @@ -3,7 +3,7 @@ import asyncio from pathlib import Path -from quantmind.preprocess import ( +from quantmind.preprocess.format import ( chunk_parsed_document, parse_pdf, retrieve_parsed_document, diff --git a/scripts/verify_pdf_rag_e2e.py b/scripts/verify_pdf_rag_e2e.py index e121e61..cdad23d 100644 --- a/scripts/verify_pdf_rag_e2e.py +++ b/scripts/verify_pdf_rag_e2e.py @@ -3,10 +3,10 @@ import asyncio -from quantmind.preprocess import ( +from quantmind.preprocess.fetch import fetch_arxiv +from quantmind.preprocess.format import ( SentenceSplitterConfig, chunk_parsed_document, - fetch_arxiv, parse_pdf, retrieve_parsed_document, ) diff --git a/tests/test_verify_pdf_rag_e2e.py b/tests/test_verify_pdf_rag_e2e.py index 04d89b2..1c46feb 100644 --- a/tests/test_verify_pdf_rag_e2e.py +++ b/tests/test_verify_pdf_rag_e2e.py @@ -4,7 +4,7 @@ from types import SimpleNamespace from unittest.mock import AsyncMock, patch -from quantmind.preprocess import ( +from quantmind.preprocess.format import ( ParsedChunk, ParsedDocument, ParsedDocumentHit, From 38deee7795508cbb843cf50f0d69860cfe4d4c9a Mon Sep 17 00:00:00 2001 From: pkuwkl Date: Sat, 18 Jul 2026 11:07:24 +0800 Subject: [PATCH 3/3] refactor(rag): separate document retrieval from preprocessing --- .agents/skills/quantmind-dev/SKILL.md | 2 +- .../references/develop-components.md | 11 ++ .claude/skills/quantmind-dev/SKILL.md | 2 +- .../references/develop-components.md | 11 ++ .github/workflows/e2e.yml | 2 + AGENTS.md | 16 +- CLAUDE.md | 16 +- contexts/design/README.md | 1 + contexts/design/flow/paper.md | 11 +- contexts/design/library/local.md | 4 +- contexts/design/preprocess/pdf.md | 21 ++- contexts/design/rag/document.md | 37 +++++ contexts/dev/labels.md | 1 + docs/README.md | 4 +- .../{preprocess/paper_rag.py => rag/paper.py} | 9 +- pyproject.toml | 27 +++- quantmind/preprocess/__init__.py | 10 -- quantmind/preprocess/format/__init__.py | 10 -- quantmind/preprocess/format/pdf.py | 138 +--------------- quantmind/rag/__init__.py | 17 ++ quantmind/rag/document.py | 147 ++++++++++++++++++ scripts/verify_pdf_rag_e2e.py | 4 +- tests/preprocess/format/test_pdf.py | 36 +---- tests/rag/__init__.py | 0 tests/rag/test_document.py | 50 ++++++ tests/test_contexts.py | 1 + tests/test_verify_pdf_rag_e2e.py | 5 +- 27 files changed, 356 insertions(+), 237 deletions(-) create mode 100644 contexts/design/rag/document.md rename examples/{preprocess/paper_rag.py => rag/paper.py} (77%) create mode 100644 quantmind/rag/__init__.py create mode 100644 quantmind/rag/document.py create mode 100644 tests/rag/__init__.py create mode 100644 tests/rag/test_document.py diff --git a/.agents/skills/quantmind-dev/SKILL.md b/.agents/skills/quantmind-dev/SKILL.md index e4beb79..f969d7c 100644 --- a/.agents/skills/quantmind-dev/SKILL.md +++ b/.agents/skills/quantmind-dev/SKILL.md @@ -1,6 +1,6 @@ --- name: quantmind-dev -description: Contributor workflow for the QuantMind codebase. Covers commit format, pull request format, and component development across quantmind/ modules (knowledge, configs, preprocess, flows, mind, utils) with tests, examples, and verification. Use when committing, opening a PR, or implementing/refactoring QuantMind code. +description: Contributor workflow for the QuantMind codebase. Covers commit format, pull request format, and component development across quantmind/ modules (knowledge, configs, preprocess, rag, flows, mind, utils) with tests, examples, and verification. Use when committing, opening a PR, or implementing/refactoring QuantMind code. --- # QuantMind Dev diff --git a/.agents/skills/quantmind-dev/references/develop-components.md b/.agents/skills/quantmind-dev/references/develop-components.md index 5f06ff2..7170e47 100644 --- a/.agents/skills/quantmind-dev/references/develop-components.md +++ b/.agents/skills/quantmind-dev/references/develop-components.md @@ -35,6 +35,7 @@ apply throughout. | `quantmind/knowledge/` | nothing (leaf) | | `quantmind/configs/` | `knowledge` only | | `quantmind/preprocess/` | `utils` only | +| `quantmind/rag/` | `preprocess` only | | `quantmind/flows/`, `quantmind/magic.py` | apex — may import all of the above | ### `quantmind/knowledge/` — data standard @@ -60,6 +61,16 @@ apply throughout. - Surface the common path at the package root (`from quantmind.preprocess import fetch_arxiv`), keep explicit submodule paths working. +### `quantmind/rag/` — opinionated document RAG + +- Use LlamaIndex for chunking, indexing, retrieval, and ranking; add only the + source/page/provenance conversion that QuantMind owns. +- Import deterministic inputs from `quantmind.preprocess`; preprocessing must + never import RAG. +- Keep LlamaIndex types private. Return frozen QuantMind evidence values. +- Do not add a public retriever, vector-store, provider, backend registry, or + generic query-engine hierarchy. + ### `quantmind/flows/` and `quantmind/magic.py` — apex layer - Public operations are `async def` functions, not classes; state passes diff --git a/.claude/skills/quantmind-dev/SKILL.md b/.claude/skills/quantmind-dev/SKILL.md index e4beb79..f969d7c 100644 --- a/.claude/skills/quantmind-dev/SKILL.md +++ b/.claude/skills/quantmind-dev/SKILL.md @@ -1,6 +1,6 @@ --- name: quantmind-dev -description: Contributor workflow for the QuantMind codebase. Covers commit format, pull request format, and component development across quantmind/ modules (knowledge, configs, preprocess, flows, mind, utils) with tests, examples, and verification. Use when committing, opening a PR, or implementing/refactoring QuantMind code. +description: Contributor workflow for the QuantMind codebase. Covers commit format, pull request format, and component development across quantmind/ modules (knowledge, configs, preprocess, rag, flows, mind, utils) with tests, examples, and verification. Use when committing, opening a PR, or implementing/refactoring QuantMind code. --- # QuantMind Dev diff --git a/.claude/skills/quantmind-dev/references/develop-components.md b/.claude/skills/quantmind-dev/references/develop-components.md index 5f06ff2..7170e47 100644 --- a/.claude/skills/quantmind-dev/references/develop-components.md +++ b/.claude/skills/quantmind-dev/references/develop-components.md @@ -35,6 +35,7 @@ apply throughout. | `quantmind/knowledge/` | nothing (leaf) | | `quantmind/configs/` | `knowledge` only | | `quantmind/preprocess/` | `utils` only | +| `quantmind/rag/` | `preprocess` only | | `quantmind/flows/`, `quantmind/magic.py` | apex — may import all of the above | ### `quantmind/knowledge/` — data standard @@ -60,6 +61,16 @@ apply throughout. - Surface the common path at the package root (`from quantmind.preprocess import fetch_arxiv`), keep explicit submodule paths working. +### `quantmind/rag/` — opinionated document RAG + +- Use LlamaIndex for chunking, indexing, retrieval, and ranking; add only the + source/page/provenance conversion that QuantMind owns. +- Import deterministic inputs from `quantmind.preprocess`; preprocessing must + never import RAG. +- Keep LlamaIndex types private. Return frozen QuantMind evidence values. +- Do not add a public retriever, vector-store, provider, backend registry, or + generic query-engine hierarchy. + ### `quantmind/flows/` and `quantmind/magic.py` — apex layer - Public operations are `async def` functions, not classes; state passes diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 37de9c5..0b01d7b 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -18,6 +18,7 @@ on: - 'quantmind/preprocess/fetch/rss.py' - 'quantmind/preprocess/fetch/arxiv.py' - 'quantmind/preprocess/format/pdf.py' + - 'quantmind/rag/**' - 'scripts/verify_pdf_rag_e2e.py' - 'pyproject.toml' schedule: @@ -64,6 +65,7 @@ jobs: - 'scripts/verify_pdf_rag_e2e.py' - 'quantmind/preprocess/fetch/arxiv.py' - 'quantmind/preprocess/format/pdf.py' + - 'quantmind/rag/**' - 'pyproject.toml' news: diff --git a/AGENTS.md b/AGENTS.md index b2bb4d3..9a9604b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,7 @@ handoff all come from `openai-agents`. | `quantmind/library/` | Local persistence and semantic retrieval for canonical knowledge — depends only on `knowledge` | | `quantmind/configs/` | Operation cfg + typed input models or unions (`BaseFlowCfg`, `NewsWindow`, `PaperInput`) — depends only on `knowledge` | | `quantmind/preprocess/` | Deterministic fetch / format / clean / time utilities — depends only on `utils` | +| `quantmind/rag/` | Opinionated LlamaIndex document chunking and retrieval — depends only on `preprocess` | | `quantmind/flows/` | Apex layer: public library operations (`paper_flow`, `collect_news`, `batch_run`) | | `quantmind/magic.py` | `resolve_magic_input`: natural language → `(input, cfg)` | | `quantmind/mind/` | Cognitive layer (memory protocol); landing via the Agents SDK migration (#71) | @@ -75,19 +76,22 @@ the user explicitly authorizes it — fix the underlying issue instead. 1. **Library, not framework** — functions over classes, `Protocol` over ABC, no plugin registries, no hook discovery, no CLI. -2. **Do not rebuild the agent runtime** — use `openai-agents` directly; no +2. **RAG data plane, not framework** — use LlamaIndex directly inside + `quantmind.rag`; keep upstream types private and do not add retriever, + vector-store, provider, or backend registries. +3. **Do not rebuild the agent runtime** — use `openai-agents` directly; no QuantMind-side facades over `from agents import ...`. -3. **Schema models vs runtime evidence** — user/LLM inputs and configs use +4. **Schema models vs runtime evidence** — user/LLM inputs and configs use extra-forbid Pydantic models; knowledge adds `frozen=True`; deterministic fetch, preprocessing, and collection values use frozen dataclasses when they do not need validation or JSON Schema (`Fetched`, `NewsBatch`). -4. **Import boundaries are contracts** — `import-linter` (configured in +5. **Import boundaries are contracts** — `import-linter` (configured in `pyproject.toml`) pins the dependency graph; never work around a failing contract. -5. **Absolute imports** across module boundaries. -6. **No meaningless wrappers** — a method must add logic, abstraction, or a +6. **Absolute imports** across module boundaries. +7. **No meaningless wrappers** — a method must add logic, abstraction, or a side effect beyond the call it wraps; otherwise inline it. -7. **Name public operations by intent** — follow +8. **Name public operations by intent** — follow `contexts/design/operations/naming.md`; use stage verbs, and reserve `pipeline` for deliberate multi-stage composition. diff --git a/CLAUDE.md b/CLAUDE.md index 1533a21..40a9a82 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,6 +37,7 @@ handoff all come from `openai-agents`. | `quantmind/library/` | Local persistence and semantic retrieval for canonical knowledge — depends only on `knowledge` | | `quantmind/configs/` | Operation cfg + typed input models or unions (`BaseFlowCfg`, `NewsWindow`, `PaperInput`) — depends only on `knowledge` | | `quantmind/preprocess/` | Deterministic fetch / format / clean / time utilities — depends only on `utils` | +| `quantmind/rag/` | Opinionated LlamaIndex document chunking and retrieval — depends only on `preprocess` | | `quantmind/flows/` | Apex layer: public library operations (`paper_flow`, `collect_news`, `batch_run`) | | `quantmind/magic.py` | `resolve_magic_input`: natural language → `(input, cfg)` | | `quantmind/mind/` | Cognitive layer (memory protocol); landing via the Agents SDK migration (#71) | @@ -76,19 +77,22 @@ the user explicitly authorizes it — fix the underlying issue instead. 1. **Library, not framework** — functions over classes, `Protocol` over ABC, no plugin registries, no hook discovery, no CLI. -2. **Do not rebuild the agent runtime** — use `openai-agents` directly; no +2. **RAG data plane, not framework** — use LlamaIndex directly inside + `quantmind.rag`; keep upstream types private and do not add retriever, + vector-store, provider, or backend registries. +3. **Do not rebuild the agent runtime** — use `openai-agents` directly; no QuantMind-side facades over `from agents import ...`. -3. **Schema models vs runtime evidence** — user/LLM inputs and configs use +4. **Schema models vs runtime evidence** — user/LLM inputs and configs use extra-forbid Pydantic models; knowledge adds `frozen=True`; deterministic fetch, preprocessing, and collection values use frozen dataclasses when they do not need validation or JSON Schema (`Fetched`, `NewsBatch`). -4. **Import boundaries are contracts** — `import-linter` (configured in +5. **Import boundaries are contracts** — `import-linter` (configured in `pyproject.toml`) pins the dependency graph; never work around a failing contract. -5. **Absolute imports** across module boundaries. -6. **No meaningless wrappers** — a method must add logic, abstraction, or a +6. **Absolute imports** across module boundaries. +7. **No meaningless wrappers** — a method must add logic, abstraction, or a side effect beyond the call it wraps; otherwise inline it. -7. **Name public operations by intent** — follow +8. **Name public operations by intent** — follow `contexts/design/operations/naming.md`; use stage verbs, and reserve `pipeline` for deliberate multi-stage composition. diff --git a/contexts/design/README.md b/contexts/design/README.md index 5f6b2bd..ef3e394 100644 --- a/contexts/design/README.md +++ b/contexts/design/README.md @@ -27,6 +27,7 @@ implementation must preserve. | Flow | [Paper extraction from input to validated result](flow/paper.md) | | Flow | [News collection](flow/news.md) | | Preprocess | [Page-aware multimodal PDF parsing](preprocess/pdf.md) | +| RAG | [Page-aware document chunking and retrieval](rag/document.md) | | Library | [Local knowledge storage and meaning-based search](library/local.md) | | Operations | [Public operation naming](operations/naming.md) | diff --git a/contexts/design/flow/paper.md b/contexts/design/flow/paper.md index 9fabcb7..de1b509 100644 --- a/contexts/design/flow/paper.md +++ b/contexts/design/flow/paper.md @@ -4,7 +4,7 @@ - **Purpose**: Define how a paper input becomes a validated `Paper`. - **Read when**: Changing paper inputs, parsing, section trees, source tracking, page ranges, or future PageIndex support. -- **Status**: Mixed. Page-aware PDF parsing and LlamaIndex ingestion are implemented; [Current Gaps](#current-gaps) lists the remaining paper assembly work. +- **Status**: Mixed. Page-aware PDF parsing and document RAG are implemented; [Current Gaps](#current-gaps) lists the remaining paper assembly work. - **Core rule**: A model or PageIndex may suggest a section tree. Code creates the final IDs, links, order, page ranges, citations, and source-backed text. - **Page numbering**: PDF page ranges start at 1 and include both the first and last page. @@ -57,6 +57,7 @@ across them, or write answers. | Work | Owner | |---|---| | Resolve identifiers, fetch bytes, parse pages, and hash source content | `quantmind.preprocess` | +| Chunk or retrieve page-aware document evidence when requested | `quantmind.rag` | | Configure the operation and select the input variant | `quantmind.configs` | | Suggest a section tree and build the final `Paper` | `quantmind.flows` | | Define the `Paper`, `TreeKnowledge`, `TreeNode`, source, citation, and extraction models | `quantmind.knowledge` | @@ -309,6 +310,10 @@ Future integration must preserve these decisions: 6. Sibling page ranges may overlap, and a child range does not need to fit completely inside its parent range. +A PageIndex adapter belongs with other opinionated document retrieval in +[`quantmind.rag`](../rag/document.md). It still returns the limited draft above; +it does not become the canonical tree or a generic retrieval backend. + ## Fixed Paper Test Data The fixed test files live at: @@ -336,8 +341,8 @@ The repository does not yet guarantee the target pipeline above: - `pdf_to_markdown()` remains a compatibility view, while the primary `parse_pdf()` path now preserves pages, blocks, coordinates, and artifacts. -- `paper_flow()` has not yet adopted `ParsedDocument`; it still consumes the - compatibility Markdown view. +- `paper_flow()` has not yet adopted `ParsedDocument` or the document RAG + boundary; it still consumes the compatibility Markdown view. - `paper_flow()` sends the flattened document to one extraction agent and asks it to return the final `Paper` directly. - The model currently controls IDs, edges, citations, source fields, and diff --git a/contexts/design/library/local.md b/contexts/design/library/local.md index 691ce0c..cdec382 100644 --- a/contexts/design/library/local.md +++ b/contexts/design/library/local.md @@ -42,6 +42,7 @@ implementation proves which behavior is truly shared. |---|---| | `quantmind.knowledge` | Define immutable knowledge models and the text used for embeddings; perform no I/O | | `quantmind.library` | Store validated knowledge, maintain rebuildable search records, and return `SemanticHit` results | +| [`quantmind.rag`](../rag/document.md) | Chunk and retrieve evidence within one parsed document without storing canonical knowledge | | `quantmind.flows` | Produce validated knowledge and optionally pass it to a library | | `quantmind.mind` or an agent application | Search the library and use matches to write answers | | Caller or source-specific pipeline | Retain raw PDF, HTML, media, and operational files | @@ -127,7 +128,8 @@ retrieval capabilities; it is not defined as a vector database. A future PageIndex path can select a paper through collection-wide semantic retrieval, then navigate that selected document's tree through a separate operation and separately rebuildable state. PageIndex does not have to be served through -`search()` or LlamaIndex ranking. +`search()` or LlamaIndex ranking. Opinionated document retrieval, including a +future PageIndex adapter, belongs under [`quantmind.rag`](../rag/document.md). ## Out of Scope diff --git a/contexts/design/preprocess/pdf.md b/contexts/design/preprocess/pdf.md index 6c9c799..3931da7 100644 --- a/contexts/design/preprocess/pdf.md +++ b/contexts/design/preprocess/pdf.md @@ -2,17 +2,16 @@ ## Quick Summary -- **Purpose**: Define the deterministic PDF value shared by paper extraction, collection-wide RAG, and a future PageIndex adapter. -- **Read when**: Changing PDF parsing, page artifacts, LlamaIndex ingestion, or multimodal evidence. -- **Status**: Implemented by `quantmind.preprocess.parse_pdf` and the private LlamaIndex conversion helpers. +- **Purpose**: Define the deterministic PDF value shared by paper extraction, document RAG, and a future PageIndex adapter. +- **Read when**: Changing PDF parsing, page artifacts, or multimodal source evidence. +- **Status**: Implemented by `quantmind.preprocess.format.parse_pdf`. - **Core rule**: Parsing preserves every physical page and its source coordinates before any chunker or tree builder runs. ## Contents - [Parsed document boundary](#parsed-document-boundary) - [Artifacts and ownership](#artifacts-and-ownership) -- [LlamaIndex conversion](#llamaindex-conversion) -- [PageIndex compatibility](#pageindex-compatibility) +- [Downstream consumers](#downstream-consumers) ## Parsed document boundary @@ -24,14 +23,12 @@ Each `TextBlock` keeps its page ownership, text, bounding box, and parser-provid The caller chooses an artifact directory. When supplied, parsing renders one PNG screenshot per page and stores a stable path reference on the page. The library does not copy screenshots or PDF bytes into canonical SQLite knowledge. Without an artifact directory, pages remain valid and `screenshot_path` is absent. -## LlamaIndex conversion +## Downstream consumers -LlamaIndex is the required RAG data plane. QuantMind converts pages to private LlamaIndex documents, retaining source hash, page number, block coordinates, and screenshot references as metadata. `chunk_parsed_document()` applies LlamaIndex `SentenceSplitter`; supported splitter arguments pass through `SentenceSplitterConfig`. +Preprocessing ends after producing `ParsedDocument`. It does not chunk, index, rank, or answer a query. -`retrieve_parsed_document()` performs a bounded BM25 retrieval over those chunks and converts results back to `ParsedDocumentHit`. Public QuantMind values never expose LlamaIndex `Document`, node, index, or retriever types. +- [`quantmind.rag`](../rag/document.md) converts the parsed value into LlamaIndex-backed chunks and page-aware retrieval evidence. +- [`paper_flow`](../flow/paper.md) uses the preserved source pages when assembling a canonical `Paper`. +- A future PageIndex adapter may consume the same ordered pages to propose and navigate a document tree. Flattened Markdown remains a compatibility view produced from the preserved pages. It is not the primary parsing result. - -## PageIndex compatibility - -PageIndex may later consume the same ordered `ParsedDocument` to propose a document tree and navigate within a selected long document. It remains independent of collection-wide LlamaIndex ranking and is not forced through `LocalKnowledgeLibrary.search()`. diff --git a/contexts/design/rag/document.md b/contexts/design/rag/document.md new file mode 100644 index 0000000..6d2a929 --- /dev/null +++ b/contexts/design/rag/document.md @@ -0,0 +1,37 @@ +# Retrieve page-aware document evidence with LlamaIndex + +## Quick Summary + +- **Purpose**: Define how an ordered `ParsedDocument` becomes chunks and ranked evidence without leaking LlamaIndex types. +- **Read when**: Changing document chunking, document-local retrieval, RAG evidence, or a future PageIndex adapter. +- **Status**: Implemented by `quantmind.rag.document`. +- **Core rule**: `quantmind.rag` is an opinionated LlamaIndex data-plane package, not a generic retriever or backend framework. + +## Contents + +- [Package boundary](#package-boundary) +- [Chunk and retrieval contract](#chunk-and-retrieval-contract) +- [What this package does not abstract](#what-this-package-does-not-abstract) +- [Collection search and PageIndex](#collection-search-and-pageindex) + +## Package boundary + +`quantmind.preprocess` owns deterministic source parsing and returns a page-aware [`ParsedDocument`](../preprocess/pdf.md). `quantmind.rag` may import that value and apply LlamaIndex transformations and retrieval. Preprocessing never imports RAG, so parsing remains usable without a query or index. + +LlamaIndex is a required dependency and owns the chunker, nodes, indexes, retrievers, ranking mechanics, and their supported parameters. QuantMind adds only the work that LlamaIndex cannot own: stable source hashes, page ownership, block coordinates, screenshot/image references, and conversion back to typed QuantMind evidence. + +## Chunk and retrieval contract + +`chunk_parsed_document()` applies LlamaIndex `SentenceSplitter` to each non-empty page without erasing physical page boundaries. `SentenceSplitterConfig` exposes the selected upstream parameters by their upstream meaning rather than reimplementing the algorithm. + +Each `ParsedChunk` retains the exact source hash, 1-based page number, available block bounding boxes, and screenshot/image references. `retrieve_parsed_document()` uses LlamaIndex BM25 and returns ranked `ParsedDocumentHit` values. LlamaIndex `Document`, node, retriever, index, and score wrapper types remain private implementation details. + +## What this package does not abstract + +The package does not define a public `Retriever`, `VectorStore`, backend registry, provider protocol, query engine, or answer-synthesis framework. Add another direct, opinionated operation only when a real pipeline needs it. Do not build an abstraction solely to hide an upstream LlamaIndex call. + +## Collection search and PageIndex + +Document-local RAG and collection search have different responsibilities. [`LocalKnowledgeLibrary`](../library/local.md) stores canonical knowledge in SQLite and privately uses LlamaIndex for collection-wide semantic ranking. It does not own transient PDF parsing or document-local BM25 chunks. + +A future PageIndex implementation may live under `quantmind.rag` as another opinionated document operation. It can consume `ParsedDocument` and return a limited tree draft or navigation evidence, while canonical IDs, links, citations, and source-backed text remain owned by QuantMind code. PageIndex does not have to run through `LocalKnowledgeLibrary.search()` or LlamaIndex vector ranking. diff --git a/contexts/dev/labels.md b/contexts/dev/labels.md index 0d5764d..ba22730 100644 --- a/contexts/dev/labels.md +++ b/contexts/dev/labels.md @@ -62,6 +62,7 @@ unclear, clarify the work before labeling it. | `area: knowledge` | Knowledge models, stored formats, serialization, and representation under `quantmind/knowledge/`. | | `area: configs` | Typed inputs and configuration models under `quantmind/configs/`. | | `area: preprocess` | Fetching, parsing, cleaning, formatting, and source handling under `quantmind/preprocess/`. | +| `area: rag` | Opinionated document chunking, indexing, and retrieval under `quantmind/rag/`. | | `area: flows` | Public operation implementations under `quantmind/flows/`. It is not a generic synonym for pipeline or orchestration. | | `area: mind` | Memory, tools, MCP integration, and agent reasoning under `quantmind/mind/`. | | `area: utils` | The narrowly owned utilities surface under `quantmind/utils/`. | diff --git a/docs/README.md b/docs/README.md index 95d435f..eff681e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ harness. | News collection | `quantmind.flows.collect_news` | `NewsWindow`, `NewsCollectionCfg` | `NewsBatch` from `quantmind.preprocess` | [Collect news](../examples/flows/collect_news.py) | [News collection design](../contexts/design/flow/news.md) | | Bounded fan-out | `quantmind.flows.batch_run` | Operation inputs and shared config | `BatchResult` | [README usage](../README.md#-usage-examples) | API docstrings | | Local semantic search | `quantmind.library.LocalKnowledgeLibrary` | `BaseKnowledge`, `SemanticQuery` | `list[SemanticHit]` | [Library example](../examples/library/README.md) | [Library guide](library.md) | -| Page-aware PDF RAG | `quantmind.preprocess.format.parse_pdf` | Exact PDF bytes and optional artifact directory | `ParsedDocument` | [Paper RAG](../examples/preprocess/paper_rag.py) | [PDF preprocessing design](../contexts/design/preprocess/pdf.md) | +| Page-aware document RAG | `quantmind.rag.chunk_parsed_document`, `quantmind.rag.retrieve_parsed_document` | `ParsedDocument`, splitter config, and query | `tuple[ParsedDocumentHit, ...]` | [Paper RAG](../examples/rag/paper.py) | [Document RAG design](../contexts/design/rag/document.md) | Import public inputs and configs from `quantmind.configs` and current public operations from `quantmind.flows`. Import result contracts from the canonical @@ -29,7 +29,7 @@ layer shown in the catalog. | Source | Source selection | Operation | Live-network component smoke test | |---|---|---|---| | PR Newswire | `NewsWindow(source="pr-newswire", ...)` | `collect_news` | `python scripts/verify_news_e2e.py` | -| arXiv Transformer PDF | `fetch_arxiv("1706.03762v7")` | `parse_pdf` and LlamaIndex retrieval | `python scripts/verify_pdf_rag_e2e.py` | +| arXiv Transformer PDF | `fetch_arxiv("1706.03762v7")` | `parse_pdf` and `quantmind.rag` retrieval | `python scripts/verify_pdf_rag_e2e.py` | The PR Newswire smoke test checks the public RSS feed, a complete preceding 24-hour listing window, and ticker-hint recall on a bounded sample of up to 25 diff --git a/examples/preprocess/paper_rag.py b/examples/rag/paper.py similarity index 77% rename from examples/preprocess/paper_rag.py rename to examples/rag/paper.py index d309ce6..cdaff30 100644 --- a/examples/preprocess/paper_rag.py +++ b/examples/rag/paper.py @@ -1,13 +1,10 @@ -"""Parse and retrieve evidence from a local PDF with page provenance.""" +"""Parse a local PDF and retrieve page-aware evidence.""" import asyncio from pathlib import Path -from quantmind.preprocess.format import ( - chunk_parsed_document, - parse_pdf, - retrieve_parsed_document, -) +from quantmind.preprocess.format import parse_pdf +from quantmind.rag import chunk_parsed_document, retrieve_parsed_document async def main() -> None: diff --git a/pyproject.toml b/pyproject.toml index 762ebe6..9812240 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -121,8 +121,8 @@ reportIncompatibleVariableOverride = "none" # import-linter: architectural boundary contracts # ---------------------------------------------------------------------------- # Encodes the target architecture: utils, knowledge, and preprocess are -# leaves; configs depends only on knowledge; library depends only on -# knowledge; flows + magic is the apex layer. The transitional packages +# leaves; configs and library depend only on knowledge; rag depends only on +# preprocess; flows + magic is the apex layer. The transitional packages # (config/, flow/, llm/, models/) remain forbidden as a tripwire. [tool.importlinter] @@ -139,6 +139,7 @@ forbidden_modules = [ "quantmind.library", "quantmind.magic", "quantmind.preprocess", + "quantmind.rag", ] [[tool.importlinter.contracts]] @@ -151,6 +152,7 @@ forbidden_modules = [ "quantmind.library", "quantmind.magic", "quantmind.preprocess", + "quantmind.rag", "quantmind.utils", ] @@ -163,6 +165,7 @@ forbidden_modules = [ "quantmind.library", "quantmind.magic", "quantmind.preprocess", + "quantmind.rag", ] [[tool.importlinter.contracts]] @@ -175,6 +178,7 @@ forbidden_modules = [ "quantmind.knowledge", "quantmind.library", "quantmind.magic", + "quantmind.rag", ] [[tool.importlinter.contracts]] @@ -191,6 +195,25 @@ forbidden_modules = [ "quantmind.mind", "quantmind.models", "quantmind.preprocess", + "quantmind.rag", + "quantmind.utils", +] + +[[tool.importlinter.contracts]] +name = "rag only depends on preprocess" +type = "forbidden" +source_modules = ["quantmind.rag"] +forbidden_modules = [ + "quantmind.config", + "quantmind.configs", + "quantmind.flow", + "quantmind.flows", + "quantmind.knowledge", + "quantmind.library", + "quantmind.llm", + "quantmind.magic", + "quantmind.mind", + "quantmind.models", "quantmind.utils", ] diff --git a/quantmind/preprocess/__init__.py b/quantmind/preprocess/__init__.py index 2de8f47..b64d1f0 100644 --- a/quantmind/preprocess/__init__.py +++ b/quantmind/preprocess/__init__.py @@ -32,18 +32,13 @@ ) from quantmind.preprocess.format import ( BoundingBox, - ParsedChunk, ParsedDocument, - ParsedDocumentHit, ParsedPage, PdfParseError, - SentenceSplitterConfig, TextBlock, - chunk_parsed_document, html_to_markdown, parse_pdf, pdf_to_markdown, - retrieve_parsed_document, ) from quantmind.preprocess.news import ( BodySource, @@ -86,21 +81,17 @@ "NewsFailure", "NewsFailureStage", "NewsTickerHint", - "ParsedChunk", "ParsedDocument", - "ParsedDocumentHit", "ParsedPage", "PdfParseError", "RawFeed", "RawNewsDocument", "RawPaper", - "SentenceSplitterConfig", "TextBlock", "build_news_identity", "build_sec_news_identity", "business_days_between", "canonicalize_source_url", - "chunk_parsed_document", "collapse_whitespace", "dedupe_lines", "extract_exchange_ticker_hints", @@ -124,6 +115,5 @@ "preprocess_news_url", "read_local_file", "resolve_doi", - "retrieve_parsed_document", "to_utc", ] diff --git a/quantmind/preprocess/format/__init__.py b/quantmind/preprocess/format/__init__.py index a1e52fb..43b640b 100644 --- a/quantmind/preprocess/format/__init__.py +++ b/quantmind/preprocess/format/__init__.py @@ -3,31 +3,21 @@ from quantmind.preprocess.format.html import html_to_markdown from quantmind.preprocess.format.pdf import ( BoundingBox, - ParsedChunk, ParsedDocument, - ParsedDocumentHit, ParsedPage, PdfParseError, - SentenceSplitterConfig, TextBlock, - chunk_parsed_document, parse_pdf, pdf_to_markdown, - retrieve_parsed_document, ) __all__ = [ "BoundingBox", - "ParsedChunk", "ParsedDocument", - "ParsedDocumentHit", "ParsedPage", "PdfParseError", - "SentenceSplitterConfig", "TextBlock", - "chunk_parsed_document", "html_to_markdown", "parse_pdf", "pdf_to_markdown", - "retrieve_parsed_document", ] diff --git a/quantmind/preprocess/format/pdf.py b/quantmind/preprocess/format/pdf.py index ab98021..f78ab47 100644 --- a/quantmind/preprocess/format/pdf.py +++ b/quantmind/preprocess/format/pdf.py @@ -1,8 +1,7 @@ -"""Page-aware PDF parsing and private LlamaIndex ingestion.""" +"""Page-aware PDF parsing.""" import asyncio import hashlib -import json import tempfile from dataclasses import dataclass from importlib.metadata import version @@ -10,10 +9,6 @@ from typing import Any from liteparse import LiteParse, ParseError -from llama_index.core import Document -from llama_index.core.node_parser import SentenceSplitter -from llama_index.core.schema import BaseNode, MetadataMode, TextNode -from llama_index.retrievers.bm25 import BM25Retriever class PdfParseError(ValueError): @@ -66,35 +61,6 @@ class ParsedDocument: pages: tuple[ParsedPage, ...] -@dataclass(frozen=True) -class SentenceSplitterConfig: - """Supported LlamaIndex sentence-splitting parameters.""" - - chunk_size: int = 512 - chunk_overlap: int = 64 - - -@dataclass(frozen=True) -class ParsedChunk: - """QuantMind view of a private LlamaIndex text node.""" - - chunk_id: str - text: str - source_hash: str - page_number: int - block_boxes: tuple[BoundingBox, ...] - screenshot_path: str | None - image_paths: tuple[str, ...] - - -@dataclass(frozen=True) -class ParsedDocumentHit: - """Ranked page-aware evidence returned from document retrieval.""" - - chunk: ParsedChunk - score: float - - def _write_artifacts( parser: LiteParse, pdf_bytes: bytes, @@ -212,108 +178,6 @@ async def parse_pdf( return await asyncio.to_thread(_parse_pdf_sync, pdf_bytes, path) -def _page_metadata( - document: ParsedDocument, page: ParsedPage -) -> dict[str, Any]: - return { - "source_hash": document.source_hash, - "page_number": page.page_number, - "block_boxes": json.dumps( - [ - [block.bbox.x0, block.bbox.y0, block.bbox.x1, block.bbox.y1] - for block in page.blocks - ], - separators=(",", ":"), - ), - "screenshot_path": page.screenshot_path or "", - "image_paths": json.dumps(page.image_paths, separators=(",", ":")), - } - - -def _to_llama_documents(document: ParsedDocument) -> list[Document]: - return [ - Document( - text=page.text, - id_=f"{document.source_hash}:page:{page.page_number}", - metadata=_page_metadata(document, page), - excluded_embed_metadata_keys=[ - "block_boxes", - "screenshot_path", - "image_paths", - ], - excluded_llm_metadata_keys=["block_boxes"], - ) - for page in document.pages - if page.text.strip() - ] - - -def _node_to_chunk(node: BaseNode) -> ParsedChunk: - metadata = node.metadata - boxes = tuple( - BoundingBox(*values) for values in json.loads(metadata["block_boxes"]) - ) - return ParsedChunk( - chunk_id=node.node_id, - text=node.get_content(metadata_mode=MetadataMode.NONE), - source_hash=str(metadata["source_hash"]), - page_number=int(metadata["page_number"]), - block_boxes=boxes, - screenshot_path=str(metadata["screenshot_path"]) or None, - image_paths=tuple(json.loads(metadata["image_paths"])), - ) - - -def chunk_parsed_document( - document: ParsedDocument, - *, - config: SentenceSplitterConfig | None = None, -) -> tuple[ParsedChunk, ...]: - """Split preserved PDF pages with LlamaIndex `SentenceSplitter`.""" - config = config or SentenceSplitterConfig() - splitter = SentenceSplitter( - chunk_size=config.chunk_size, - chunk_overlap=config.chunk_overlap, - ) - nodes = splitter.get_nodes_from_documents(_to_llama_documents(document)) - return tuple(_node_to_chunk(node) for node in nodes) - - -def retrieve_parsed_document( - chunks: tuple[ParsedChunk, ...], - query: str, - *, - top_k: int = 5, -) -> tuple[ParsedDocumentHit, ...]: - """Rank parsed chunks with the private LlamaIndex BM25 retriever.""" - if not query.strip(): - raise ValueError("query must not be blank") - if top_k < 1: - raise ValueError("top_k must be positive") - if not chunks: - return () - nodes: list[BaseNode] = [ - TextNode( - id_=chunk.chunk_id, - text=chunk.text, - metadata={"chunk_index": index}, - ) - for index, chunk in enumerate(chunks) - ] - retriever = BM25Retriever.from_defaults( - nodes=nodes, - similarity_top_k=min(top_k, len(nodes)), - ) - results = retriever.retrieve(query) - return tuple( - ParsedDocumentHit( - chunk=chunks[int(result.node.metadata["chunk_index"])], - score=float(result.score or 0.0), - ) - for result in results - ) - - async def pdf_to_markdown(pdf_bytes: bytes) -> str: """Return a compatibility text view derived from preserved PDF pages.""" document = await parse_pdf(pdf_bytes) diff --git a/quantmind/rag/__init__.py b/quantmind/rag/__init__.py new file mode 100644 index 0000000..cddb01f --- /dev/null +++ b/quantmind/rag/__init__.py @@ -0,0 +1,17 @@ +"""Opinionated LlamaIndex document RAG operations.""" + +from quantmind.rag.document import ( + ParsedChunk, + ParsedDocumentHit, + SentenceSplitterConfig, + chunk_parsed_document, + retrieve_parsed_document, +) + +__all__ = [ + "ParsedChunk", + "ParsedDocumentHit", + "SentenceSplitterConfig", + "chunk_parsed_document", + "retrieve_parsed_document", +] diff --git a/quantmind/rag/document.py b/quantmind/rag/document.py new file mode 100644 index 0000000..5810dbb --- /dev/null +++ b/quantmind/rag/document.py @@ -0,0 +1,147 @@ +"""Page-aware document chunking and retrieval through LlamaIndex.""" + +import json +from dataclasses import dataclass +from typing import Any + +from llama_index.core import Document +from llama_index.core.node_parser import SentenceSplitter +from llama_index.core.schema import BaseNode, MetadataMode, TextNode +from llama_index.retrievers.bm25 import BM25Retriever + +from quantmind.preprocess.format import ( + BoundingBox, + ParsedDocument, + ParsedPage, +) + + +@dataclass(frozen=True) +class SentenceSplitterConfig: + """Supported LlamaIndex sentence-splitting parameters.""" + + chunk_size: int = 512 + chunk_overlap: int = 64 + + +@dataclass(frozen=True) +class ParsedChunk: + """QuantMind view of a private LlamaIndex text node.""" + + chunk_id: str + text: str + source_hash: str + page_number: int + block_boxes: tuple[BoundingBox, ...] + screenshot_path: str | None + image_paths: tuple[str, ...] + + +@dataclass(frozen=True) +class ParsedDocumentHit: + """Ranked page-aware evidence returned from document retrieval.""" + + chunk: ParsedChunk + score: float + + +def _page_metadata( + document: ParsedDocument, page: ParsedPage +) -> dict[str, Any]: + return { + "source_hash": document.source_hash, + "page_number": page.page_number, + "block_boxes": json.dumps( + [ + [block.bbox.x0, block.bbox.y0, block.bbox.x1, block.bbox.y1] + for block in page.blocks + ], + separators=(",", ":"), + ), + "screenshot_path": page.screenshot_path or "", + "image_paths": json.dumps(page.image_paths, separators=(",", ":")), + } + + +def _to_llama_documents(document: ParsedDocument) -> list[Document]: + return [ + Document( + text=page.text, + id_=f"{document.source_hash}:page:{page.page_number}", + metadata=_page_metadata(document, page), + excluded_embed_metadata_keys=[ + "block_boxes", + "screenshot_path", + "image_paths", + ], + excluded_llm_metadata_keys=["block_boxes"], + ) + for page in document.pages + if page.text.strip() + ] + + +def _node_to_chunk(node: BaseNode) -> ParsedChunk: + metadata = node.metadata + boxes = tuple( + BoundingBox(*values) for values in json.loads(metadata["block_boxes"]) + ) + return ParsedChunk( + chunk_id=node.node_id, + text=node.get_content(metadata_mode=MetadataMode.NONE), + source_hash=str(metadata["source_hash"]), + page_number=int(metadata["page_number"]), + block_boxes=boxes, + screenshot_path=str(metadata["screenshot_path"]) or None, + image_paths=tuple(json.loads(metadata["image_paths"])), + ) + + +def chunk_parsed_document( + document: ParsedDocument, + *, + config: SentenceSplitterConfig | None = None, +) -> tuple[ParsedChunk, ...]: + """Split preserved document pages with LlamaIndex `SentenceSplitter`.""" + config = config or SentenceSplitterConfig() + splitter = SentenceSplitter( + chunk_size=config.chunk_size, + chunk_overlap=config.chunk_overlap, + ) + nodes = splitter.get_nodes_from_documents(_to_llama_documents(document)) + return tuple(_node_to_chunk(node) for node in nodes) + + +def retrieve_parsed_document( + chunks: tuple[ParsedChunk, ...], + query: str, + *, + top_k: int = 5, +) -> tuple[ParsedDocumentHit, ...]: + """Rank parsed chunks with the opinionated LlamaIndex BM25 retriever.""" + if not query.strip(): + raise ValueError("query must not be blank") + if top_k < 1: + raise ValueError("top_k must be positive") + if not chunks: + return () + nodes: list[BaseNode] = [ + TextNode( + id_=chunk.chunk_id, + text=chunk.text, + metadata={"chunk_index": index}, + ) + for index, chunk in enumerate(chunks) + ] + retriever = BM25Retriever.from_defaults( + nodes=nodes, + similarity_top_k=min(top_k, len(nodes)), + ) + results = retriever.retrieve(query) + return tuple( + ParsedDocumentHit( + chunk=chunks[int(result.node.metadata["chunk_index"])], + score=float(result.score or 0.0), + ) + for result in results + ) diff --git a/scripts/verify_pdf_rag_e2e.py b/scripts/verify_pdf_rag_e2e.py index cdad23d..673c22c 100644 --- a/scripts/verify_pdf_rag_e2e.py +++ b/scripts/verify_pdf_rag_e2e.py @@ -4,10 +4,10 @@ import asyncio from quantmind.preprocess.fetch import fetch_arxiv -from quantmind.preprocess.format import ( +from quantmind.preprocess.format import parse_pdf +from quantmind.rag import ( SentenceSplitterConfig, chunk_parsed_document, - parse_pdf, retrieve_parsed_document, ) diff --git a/tests/preprocess/format/test_pdf.py b/tests/preprocess/format/test_pdf.py index 1caac9c..f95e3c4 100644 --- a/tests/preprocess/format/test_pdf.py +++ b/tests/preprocess/format/test_pdf.py @@ -1,4 +1,4 @@ -"""Tests for page-aware PDF parsing and LlamaIndex ingestion.""" +"""Tests for page-aware PDF parsing.""" import hashlib import unittest @@ -9,11 +9,8 @@ from quantmind.preprocess.format.pdf import ( PdfParseError, - SentenceSplitterConfig, - chunk_parsed_document, parse_pdf, pdf_to_markdown, - retrieve_parsed_document, ) _FIXTURE = Path(__file__).resolve().parent.parent / "fixtures" / "tiny.pdf" @@ -88,29 +85,6 @@ async def test_golden_preserves_pages_blocks_coordinates_and_artifacts( ) ) - async def test_llamaindex_chunks_and_bm25_hits_keep_page_evidence(self): - document = await parse_pdf(_GOLDEN.read_bytes()) - chunks = chunk_parsed_document( - document, - config=SentenceSplitterConfig(chunk_size=256, chunk_overlap=32), - ) - - self.assertTrue(chunks) - self.assertEqual({chunk.page_number for chunk in chunks}, {1, 2, 3, 4}) - self.assertTrue( - all(chunk.source_hash == document.source_hash for chunk in chunks) - ) - self.assertTrue(all(chunk.block_boxes for chunk in chunks)) - - hits = retrieve_parsed_document( - chunks, - "equal-weighted quintiles long-short portfolio", - top_k=2, - ) - self.assertEqual(len(hits), 2) - self.assertIn(hits[0].chunk.page_number, {3, 4}) - self.assertEqual(hits[0].chunk.source_hash, document.source_hash) - async def test_empty_physical_page_is_not_dropped_or_renumbered(self): source = pymupdf.open() try: @@ -127,11 +101,3 @@ async def test_empty_physical_page_is_not_dropped_or_renumbered(self): self.assertEqual(document.pages[1].text, "") self.assertEqual(document.pages[1].blocks, ()) self.assertIn("third page", document.pages[2].text) - - async def test_retrieval_rejects_invalid_query_arguments(self): - document = await parse_pdf(_FIXTURE.read_bytes()) - chunks = chunk_parsed_document(document) - with self.assertRaisesRegex(ValueError, "query"): - retrieve_parsed_document(chunks, " ") - with self.assertRaisesRegex(ValueError, "top_k"): - retrieve_parsed_document(chunks, "fixture", top_k=0) diff --git a/tests/rag/__init__.py b/tests/rag/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/rag/test_document.py b/tests/rag/test_document.py new file mode 100644 index 0000000..3ca0167 --- /dev/null +++ b/tests/rag/test_document.py @@ -0,0 +1,50 @@ +"""Tests for page-aware LlamaIndex document RAG.""" + +import unittest +from pathlib import Path + +from quantmind.preprocess.format import parse_pdf +from quantmind.rag import ( + SentenceSplitterConfig, + chunk_parsed_document, + retrieve_parsed_document, +) + +_FIXTURES = Path(__file__).resolve().parents[1] / "fixtures" +_TINY = ( + Path(__file__).resolve().parents[1] / "preprocess" / "fixtures" / "tiny.pdf" +) +_GOLDEN = _FIXTURES / "paper" / "golden" / "paper.pdf" + + +class DocumentRagTests(unittest.IsolatedAsyncioTestCase): + async def test_chunks_and_bm25_hits_keep_page_evidence(self): + document = await parse_pdf(_GOLDEN.read_bytes()) + chunks = chunk_parsed_document( + document, + config=SentenceSplitterConfig(chunk_size=256, chunk_overlap=32), + ) + + self.assertTrue(chunks) + self.assertEqual({chunk.page_number for chunk in chunks}, {1, 2, 3, 4}) + self.assertTrue( + all(chunk.source_hash == document.source_hash for chunk in chunks) + ) + self.assertTrue(all(chunk.block_boxes for chunk in chunks)) + + hits = retrieve_parsed_document( + chunks, + "equal-weighted quintiles long-short portfolio", + top_k=2, + ) + self.assertEqual(len(hits), 2) + self.assertIn(hits[0].chunk.page_number, {3, 4}) + self.assertEqual(hits[0].chunk.source_hash, document.source_hash) + + async def test_retrieval_rejects_invalid_query_arguments(self): + document = await parse_pdf(_TINY.read_bytes()) + chunks = chunk_parsed_document(document) + with self.assertRaisesRegex(ValueError, "query"): + retrieve_parsed_document(chunks, " ") + with self.assertRaisesRegex(ValueError, "top_k"): + retrieve_parsed_document(chunks, "fixture", top_k=0) diff --git a/tests/test_contexts.py b/tests/test_contexts.py index 31bf945..0a2dbf0 100644 --- a/tests/test_contexts.py +++ b/tests/test_contexts.py @@ -150,6 +150,7 @@ def test_label_guide_has_complete_taxonomy(self) -> None: "area: knowledge", "area: configs", "area: preprocess", + "area: rag", "area: flows", "area: mind", "area: utils", diff --git a/tests/test_verify_pdf_rag_e2e.py b/tests/test_verify_pdf_rag_e2e.py index 1c46feb..fa41431 100644 --- a/tests/test_verify_pdf_rag_e2e.py +++ b/tests/test_verify_pdf_rag_e2e.py @@ -4,11 +4,10 @@ from types import SimpleNamespace from unittest.mock import AsyncMock, patch -from quantmind.preprocess.format import ( +from quantmind.preprocess.format import ParsedDocument, ParsedPage +from quantmind.rag import ( ParsedChunk, - ParsedDocument, ParsedDocumentHit, - ParsedPage, ) from scripts import verify_pdf_rag_e2e