From 447cbca4c0b7117e58604090106578cc71b1abb9 Mon Sep 17 00:00:00 2001 From: David Du Date: Fri, 24 Apr 2026 20:56:01 -0700 Subject: [PATCH 1/8] 3.0.0rc3 --- CHANGELOG.md | 49 + CODE_OF_CONDUCT.md | 87 +- README.md | 5 + config/adv_graph_prompt_benchmark.yaml | 544 +++ config/adv_graph_prompt_benchmark_2.yaml | 628 ++++ config/adv_graph_prompt_no_chunk_reader.yaml | 414 +++ config/config.yaml | 140 +- config/config_lvs.yaml | 100 + docker/Dockerfile | 10 +- docker/README.md | 9 + docker/deploy/storage.yaml | 11 + docs/source/code-of-conduct.md | 3 +- docs/source/contributing.md | 173 +- docs/source/guides/components/tools.md | 87 +- docs/source/overview/configuration.md | 13 +- docs/source/release-notes.md | 20 + docs/source/vss.md | 3 - examples/online_summarize.py | 154 + packages/vss_ctx_rag_arango/pyproject.toml | 7 +- .../vss_ctx_rag/plugins/arango/__init__.py | 4 +- .../vss_ctx_rag/plugins/arango/arango_db.py | 50 +- .../vss_ctx_rag/plugins/arango/networkx_db.py | 19 +- packages/vss_ctx_rag_nat/pyproject.toml | 4 +- pyproject.toml | 123 +- service/service.py | 26 +- .../context_manager/context_manager.py | 86 +- .../context_manager_handler.py | 23 + .../foundation_retrieval_func.py | 120 +- .../rag/graph_rag/retrieval/planner.py | 16 +- .../rag/vector_rag/vector_retrieval_func.py | 4 +- .../functions/summarization/__init__.py | 13 +- .../functions/summarization/config.py | 4 +- .../summarization/structured_inference.py | 759 ++++ .../summarization/summary_retriever.py | 2 +- .../functions/summarization/vlm_structured.py | 122 + .../summarization/vlm_structured_base.py | 690 ++++ .../summarization/vlm_structured_online.py | 144 + src/vss_ctx_rag/models/tool_models.py | 23 +- .../tools/embedding/embedding_tool.py | 137 +- src/vss_ctx_rag/tools/health/rag_health.py | 9 + .../tools/reranker/reranker_tool.py | 2 +- .../tools/storage/elasticsearch_db.py | 239 +- src/vss_ctx_rag/tools/storage/milvus_db.py | 155 +- src/vss_ctx_rag/tools/storage/neo4j_db.py | 37 +- src/vss_ctx_rag/tools/storage/storage_tool.py | 29 + src/vss_ctx_rag/utils/ctx_rag_logger.py | 27 +- src/vss_ctx_rag/utils/utils.py | 5 + uv.lock | 3232 ++++------------- 48 files changed, 5633 insertions(+), 2928 deletions(-) create mode 100644 config/adv_graph_prompt_benchmark.yaml create mode 100644 config/adv_graph_prompt_benchmark_2.yaml create mode 100644 config/adv_graph_prompt_no_chunk_reader.yaml create mode 100644 config/config_lvs.yaml create mode 100644 examples/online_summarize.py create mode 100644 src/vss_ctx_rag/functions/summarization/structured_inference.py create mode 100644 src/vss_ctx_rag/functions/summarization/vlm_structured.py create mode 100644 src/vss_ctx_rag/functions/summarization/vlm_structured_base.py create mode 100644 src/vss_ctx_rag/functions/summarization/vlm_structured_online.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6af0c08e..3b4091f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,3 +24,52 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve ### Added - First release. + +## [1.0.0] - 2025-10-14 + +### Summary + +Major release featuring enhanced retrieval capabilities, expanded database support, and improved modular configuration system. + +### Added + +#### Enhanced retrieval methods + +- Chain of Thought (CoT): Added reasoning-based retrieval for improved context understanding +- Vision Language Model (VLM): Integrated multi-modal retrieval capabilities for processing visual content +- Advanced Graph RAG (AdvGRAG): Implemented sophisticated graph traversal and retrieval algorithms for better performance + +#### Expanded database support + +- ArangoDB: Added support for graph-based document storage and retrieval +- Elasticsearch: Integrated full-text search capabilities with distributed search support + +#### Configuration improvements + +- Modular Configuration System: Redesigned configuration architecture for easier function and tool creation +- Simplified Addition Process: Streamlined workflow for adding new functions and tools to the system +- Enhanced Extensibility: Improved modularity enables faster development and deployment of new components + +#### Experimental features + +- MCP Tools: Experimental MCP tools to enable AI agents interacting with video. +- Structured Response: JSON Structured Response mode for responses from CA-RAG. + +## [1.0.1] - 2025-10-14 +### Summary +Minor release to add helm chart, documentation and config update and support llama 3.1 8B NIM + +### Changes +- Added helm chart +- Documentation update +- Config update +- LLM support: LLaMa 3.1 8B + +## [1.0.2] - 2026-01-30 +### Summary +Latest release with bug fixes, Qwen3-VL support and documentation updates. + +### Changes +- Bug fixes +- Qwen3-VL support +- Documentation updates diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 1576a266..4d039d59 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,5 +1,5 @@ -This project has adopted the [Contributor Covenant Code of Conduct](https://docs.rapids.ai/resources/conduct/). +# Contributor Covenant Code of Conduct + +## Overview + +Define the code of conduct followed and enforced for Context Aware RAG. + +### Intended audience + +Community | Developers | Project Leads + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting GitHub_Conduct@nvidia.com. All complaints will be reviewed and +investigated and will result in a response that is deemed necessary and appropriate +to the circumstances. The project team is obligated to maintain confidentiality with +regard to the reporter of an incident. Further details of specific enforcement policies +may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/README.md b/README.md index cd13fe8e..4ace36e0 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,11 @@ This will start the following services: * UI available at `http://:9090` +* elasticsearch + * UI available at `http://:9200` + +* kibana + * UI available at `http://:5601` To change the storage volumes, export `DOCKER_VOLUME_DIRECTORY` to the desired directory. diff --git a/config/adv_graph_prompt_benchmark.yaml b/config/adv_graph_prompt_benchmark.yaml new file mode 100644 index 00000000..3199b447 --- /dev/null +++ b/config/adv_graph_prompt_benchmark.yaml @@ -0,0 +1,544 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- + +thinking_sys_msg_subtitle_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Document reasoning in ``. + - Output one or more tool calls (strict XML format) in separate 'execute' blocks. + - Stop immediately after and output `[Pause]` to wait for results. + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Once the Execute Agent returns results, analyze them inside ``. Propose next actions until you have enough information to answer. + + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + + --- + + πŸ”₯ **SUBTITLE-FIRST STRATEGY**: This agent is specifically optimized for subtitle questions. For ANY question involving spoken content, dialogue, conversations, opinions, or audio - **ALWAYS use subtitle_search as your FIRST tool call** before any other tools. + + 🚨 **SUBTITLE QUESTION PATTERNS - ALWAYS USE SUBTITLE_SEARCH FIRST:** + - "which subtitles appear..." + - "what subtitles are displayed..." + - Questions with subtitle text as answer choices (A, B, C, D with text content) + - "what is said during..." or "what is mentioned when..." + - Any question asking about text/words appearing on screen with timing + + **CRITICAL EXAMPLE:** If the question is "which subtitles appear at the same time as [visual description]?" β†’ + βœ… CORRECT: Use subtitle_search FIRST to find all subtitle options and their timestamps, then use chunk_reader to verify visual content at those specific times + ❌ WRONG: Use chunk_search to find the visual description first + + **SUBTITLE + VISUAL VERIFICATION WORKFLOW:** + When you have subtitle timestamps and need to verify visual content: + 1. subtitle_search to find subtitle options and timestamps βœ“ + 3. chunk_reader to visually check what's happening at each time + 4. DO NOT use chunk_search when you already have specific timestamps + + CRITICAL ASSUMPTIONS: + 1. ALL queries describe scenes from video content that you must search for using your tools. NEVER treat queries as logic puzzles or general knowledge questions - they are ALWAYS about finding specific video content. + 2. 🚨 **SUBTITLE PRIORITY RULE**: If the question involves any subtitle related content OR asks "which subtitles..." - use subtitle_search FIRST, then use other tools as needed. Do NOT start with visual search for subtitle questions. + 3. 🚨 **VISUAL ANALYSIS MANDATORY:** For ANY question about visual details (colors, appearance, objects, actions, spatial relationships, etc.) - if you find relevant content but text doesn't specify the visual information needed, you MUST use ChunkReader immediately. Do NOT skip to other content without visual examination first! + + ## Available Tools + + πŸ”₯ **BEFORE USING ANY TOOL - READ THIS:** + If your question asks about VISUAL DETAILS (colors, appearance, objects, actions, spatial relationships, etc.): + 1. Find the relevant occurrence with ChunkFilter/ChunkSearch + 2. If text doesn't specify the visual information you need β†’ IMMEDIATELY use ChunkReader on that time period + 3. Do NOT search other content until you've visually analyzed the relevant occurrence + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Subtitle Search ⭐ **ALWAYS USE FIRST FOR SUBTITLE QUESTIONS** ⭐ + ``` + + 1 + subtitle_search + + search_query + 5_to_10 + + + ``` + - 🚨 **CRITICAL SUBTITLE-FIRST STRATEGY**: For ANY question involving spoken content, audio, dialogue, conversations, opinions, arguments, or verbal interactions - **ALWAYS start with subtitle_search as your FIRST tool call**. + + - **Mandatory Use Cases (Use subtitle_search FIRST):** + - Questions about what someone said, mentioned, or discussed + - Questions about opinions, arguments, conversations, dialogue + - Questions about audio content, speech, or verbal interactions + - Questions about specific quotes, statements, or verbal responses + - Questions asking "what did X say about Y?" or "what was mentioned about Z?" + - Any question where the answer likely comes from spoken/audio content + + - **How it Works:** + - Returns semantic matching subtitles with corresponding time ranges + - Each subtitle has a time range that you can then use with chunk_reader for visual context + - Provides the most accurate retrieval for speech-based questions + + - **Workflow for Subtitle Questions:** + 1. **FIRST**: Use subtitle_search to find relevant spoken content + 2. **THEN**: Use chunk_reader with the time ranges from subtitles for visual verification if needed + 3. **AVOID**: Starting with chunk_search for questions about spoken content + + ### 2. Subtitle Filter ⭐ **CRITICAL FOR SUBTITLE QUESTIONS** ⭐ + Use for retrieving subtitles based on temporal range + + + #### Query Formats: + ``` + + 1 + subtitle_filter + + 150.0:155.0 + + + ``` + + - Rules: + - For time range query, the start_time and end_time has to be in multiple of 10 seconds. + + ### 2. Chunk Reader ⭐ **CRITICAL FOR VISUAL QUESTIONS** ⭐ + The video is segmented into chunks, and you can query them by the start_time and end_time returned by SubtitleRetriever tool. + You may also query multiple consecutive chunks by concatenating their numbers (e.g., `112:115;113:116`). + + **πŸ”§ IMPORTANT: The original question will be automatically passed to the chunk_reader tool - you do not need to generate custom queries.** + + #### **VISUAL ANALYSIS PRIORITY RULE:** + 🚨 **When questions ask about VISUAL DETAILS (colors, clothing, appearance, objects, faces, etc.) and text descriptions from other tools don't provide this information, IMMEDIATELY use ChunkReader to visually analyze the relevant time periods. Do NOT continue searching other time periods until you've visually examined the first relevant occurrence.** + + #### **SPECIAL RULE FOR VISUAL DETAIL QUESTIONS:** + ⚠️ If question asks about visual characteristics and you find relevant content but text doesn't provide the visual details: + - STOP immediately + - Use ChunkReader on that exact time period + - Do NOT search other content first + - Examples: + β€’ Person mentioned but no appearance details β†’ ChunkReader(time_range, "Describe the person's appearance") + β€’ Object mentioned but no visual details β†’ ChunkReader(time_range, "Describe the object's characteristics") + β€’ Action mentioned but details unclear β†’ ChunkReader(time_range, "What exactly is happening in this scene?") + + #### **Common Visual Detail Questions:** + - Colors of clothing, objects, or backgrounds + - Facial expressions or physical appearance + - Object types, shapes, or characteristics + - Actions or poses that require visual confirmation + - Spatial relationships between objects/people + + #### Query Formats: + #### *Single Chunk Query* + ``` + + 1 + chunk_reader + + 1 + 10 + + + ``` + + #### *Sequential Chunks Query* + ``` + + 2 + chunk_reader + + chunk_N;chunk_N+1 + + + ``` + + - Rules: + - Only *temporally adjacent chunks* supported, so you must first order all chunks FROM SMALLEST TO LARGEST and then concatenate those that are adjacent in time. (e.g. N;N+1 are temporally adjacent chunks, but N;N+2 are not.) + - Max 2 chunks per query* (split longer sequences into multiple 2-chunk batches). + - For time range query, the start_time and end_time has to be in multiple of 10 seconds. + + - Use case: + - Allows asking questions about the video chunks returned by the ChunkSearch or ChunkFilter. + - If the question mentions a specific timestamp, use the Chunkfilter tool to get the chunk ids for the given timerange and then ask the target question on the corresponding video chunk returned by the ChunkFilter tool. + - If the question is about some entity or scene then use the ChunkSearch tool to get the chunk ids for the specified entity or scene and then ask the target question on the corresponding video chunk returned by the ChunkSearch tool. + + - Important Notes: + - 🚨 **CRITICAL RULE FOR VISUAL QUESTIONS:** If ANY question asks about visual details AND you find relevant content but the text description doesn't specify the visual information needed, you MUST immediately use ChunkReader on that time period. Do NOT continue to other content first! + - You should read every retrieved chunk without any omission!!!!! + - If the scene mentioned in the question has been successfully verified by the chunk reader and occurs in chunk N, and the question asks about events before or after that scene, you should scan accordingly targeting chunk N-1 and N (for "before"), or chunk N and N+1 (for "after"). + - For counting/order problems, the question should follow this format "For questions asking whether a specific action occurs, you should carefully examine each frame β€” if even a single frame contains the relevant action, it should be considered as having occurred. The question is: is there xxx?" + - For anomaly detection, don't concate chunk and raise single chunk query. + - For anomaly detection, provide all the candidate options in each question!! + - For anomaly detection, you may concatenate up to 10 sequential video chunk, including the retrieved chunks and its neighboring chunks, to obtain a comprehensive overview of the event. + - If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + + ### 3. Chunk Search + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problem, assign lower topk=8 for other problem + - Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + - The chunk_search may make mistakes, and the chunk_reader is more accurate than the retriever. If the retriever retrieves a chunk but the chunk_reader indicates that the chunk is irrelevant to the current query, the result from the chunk_reader should be trusted. + - Each time the user returns retrieval results, you should query all the retrieved chunks in the next round. If clips retrieved by different queries overlap, you can merge all the queries into a single question and access the overlapping chunk only once using chunk_reader. + - You must read **every chunk returned by the chunk retriever** using chunk_reader β€” do not miss any one!!!!! + - The chunk retriever cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, you need to boldly hypothesize the possible time range and then carefully verify each candidate chunk to locate the correct answer. + + + ### 4. Chunk Filter + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - Use case: + - If the question mentions a specific timestamp or time. Convert time to seconds and use format as :. + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long. + For example: + - "What happens at 2:15?" -> Query `1chunk_filter130:140` + - "Describe the action in the first minute." -> Query `1chunk_filter00:60` + + --- + + ## Suggestions + 1. 🚨 **SUBTITLE-FIRST MANDATORY**: For questions about spoken content, dialogue, conversations, opinions, or audio - ALWAYS start with subtitle_search before any other tool. This is your PRIMARY strategy for subtitle-related questions. + 2. Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + 3. For counting problems, consider using a higher top-k and more diverse queries to ensure no missing items. + 4. To save the calling budget, it is suggested that you include as many tool calls as possible in the same response, but you can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of two at a time!! + 5. Suppose the `event` returns a list of segments [a,b,c,d,e]. If the `chunk_reader` checks each chunk in turn and finds that none contain the event, but you still need to locate the chunk where the event occurs, then by default, assume the event occurs in the top-1 chunk a.** + 6. For counting problems, your question should follow this format: Is there xxx occur in this video? (A chunk should be considered correct as long as the queried event occurs in more than one frame, even if the chunk also includes other content or is primarily focused on something else. coarsely matched chunks should be taken into account (e.g., watering flowers vs. watering toy flowers)) + 7. For counting problems, you should carefully examine each chunk to avoid any omissions!!! + 8. For ordering, you can either use the chunk_id or the timestamps to determine the order. + 9. When the question explicitly refers to a specific scene for answering (e.g., "What did Player 10 do after scoring the first goal?"), you must first use the video retriever and video reader to precisely locate that scene. Once the key scene is identifiedβ€”e.g., the moment of Player 10's first goal in chunk Nβ€”you should then read that chunk and its adjacent chunks. For example, to answer what happened after the first goal, you should read chunk N and chunk N+1. + 10. **SUBTITLE WORKFLOW EXAMPLE:** For questions like "What did the person say about the topic?": + - Step 1: IMMEDIATELY use subtitle_search to find relevant spoken content + - Step 2: Use chunk_reader with the time ranges from subtitles for visual verification if needed + - Step 3: Do NOT start with chunk_search for speech-based questions + + 11. **SUBTITLE + VISUAL VERIFICATION EXAMPLE:** For questions like "Which subtitles appear together with a red rectangle on the PPT?": + - Step 1: Use subtitle_search to find all subtitle options A, B, C, D with their timestamps + - Step 2: Use chunk_reader on each chunk to visually verify what appears on screen at that time + - Step 3: ❌ DO NOT use chunk_search when you already have specific timestamps from subtitles + 12. **VISUAL DETAIL WORKFLOW EXAMPLE:** For questions like "What color clothing is the first person wearing?": + - Step 1: Use ChunkFilter to find the FIRST person appearance (e.g., 0:10 seconds) + - Step 2: IMMEDIATELY use ChunkReader with that time range asking "What color clothing is the person wearing?" + - Step 3: Do NOT search other time periods until you've visually examined the first occurrence + - Step 4: Only if no person is visible in the first period, then check subsequent periods + 13. Don't output anything after [Pause] !!!!!!! + + ## Strict Rules + 1. 🚨 **SUBTITLE SEARCH FIRST RULE**: For ANY question involving spoken content, dialogue, conversations, opinions, arguments, or verbal interactions - you MUST use subtitle_search as your FIRST tool call. **ESPECIALLY** if the question asks "which subtitles appear..." or has subtitle text as answer choices. This is NON-NEGOTIABLE for subtitle-related questions. + 1a. 🚨 **SUBTITLE + VISUAL VERIFICATION RULE**: When you have subtitle timestamps and need to verify visual content at those times: + - Use chunk_reader to visually analyze what's happening at each timestamp + - DO NOT use chunk_search when you already have specific timestamps from subtitle_search + 2. Response of each round should provide thinking process in at the beginning!! Never output anything after [Pause]!! + 3. You can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of TWO at a time!!! + 4. If you are unable to give a precise answer or you are not sure, continue calling tools for more information; if the maximum number of attempts has been reached and you are still unsure, choose the most likely one. + 5. You must read **every chunk returned by the chunk search** using chunk_reader β€” do not miss any one!!!!! + 6. The chunk reader only has access to the content included in chunk_reader_question and does not see the original question or any previous context. Therefore, the chunk reader question must be clearly defined and fully self-contained. Avoid any ambiguous references such as "Same question as above." Each question should stand on its own!!! + 7. Never guess the answer, analyze every choice, read every chunk retrieved by the chunk_search!!!! + 8. **VISUAL ANALYSIS PRIORITY:** For questions about visual details, you MUST use ChunkReader to visually examine relevant time periods. Do NOT rely solely on text descriptions that lack the visual information needed. + πŸ“‹ **GENERAL SCENARIO EXAMPLE:** Question asks about visual characteristics of something + - Tool finds: "Time X: [Subject mentioned]" (but visual details missing from text) + - Tool finds: "Time Y: [Subject with some visual details in text]" + - ❌ WRONG: Answer based on Time Y without checking Time X first + - βœ… CORRECT: Use ChunkReader(Time X range, "[Ask about the specific visual details needed]") to analyze the relevant occurrence first + 9. If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + + + + +thinking_sys_msg_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Document reasoning in ``. + - Output one or more tool calls (strict XML format) in separate 'execute' blocks. + - Stop immediately after and output `[Pause]` to wait for results. + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Once the Execute Agent returns results, analyze them inside ``. Propose next actions until you have enough information to answer. + + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + + --- + + CRITICAL ASSUMPTIONS: + 1. ALL queries describe scenes from video content that you must search for using your tools. NEVER treat queries as logic puzzles or general knowledge questions - they are ALWAYS about finding specific video content. + 2. 🚨 **VISUAL ANALYSIS MANDATORY:** For ANY question about visual details (colors, appearance, objects, actions, spatial relationships, etc.) - if you find relevant content but text doesn't specify the visual information needed, you MUST use ChunkReader immediately. Do NOT skip to other content without visual examination first! + + ## Available Tools + + πŸ”₯ **BEFORE USING ANY TOOL - READ THIS:** + If your question asks about VISUAL DETAILS (colors, appearance, objects, actions, spatial relationships, etc.): + 1. Find the relevant occurrence with ChunkFilter/ChunkSearch + 2. If text doesn't specify the visual information you need β†’ IMMEDIATELY use ChunkReader on that time period + 3. Do NOT search other content until you've visually analyzed the relevant occurrence + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Chunk Reader ⭐ **CRITICAL FOR VISUAL QUESTIONS** ⭐ + The video is segmented into chunks, and you can query them by their chunk id returned by ChunkSearch tool. + You may also query multiple consecutive chunks by concatenating their numbers (e.g., `112;113`). + + **πŸ”§ IMPORTANT: The original question will be automatically passed to the chunk_reader tool - you do not need to generate custom queries.** + + #### **VISUAL ANALYSIS PRIORITY RULE:** + 🚨 **When questions ask about VISUAL DETAILS (colors, clothing, appearance, objects, faces, etc.) and text descriptions from other tools don't provide this information, IMMEDIATELY use ChunkReader to visually analyze the relevant time periods. Do NOT continue searching other time periods until you've visually examined the first relevant occurrence.** + + #### **SPECIAL RULE FOR VISUAL DETAIL QUESTIONS:** + ⚠️ If question asks about visual characteristics and you find relevant content but text doesn't provide the visual details: + - STOP immediately + - Use ChunkReader on that exact time period + - Do NOT search other content first + - Examples: + β€’ Person mentioned but no appearance details β†’ ChunkReader(time_range, "Describe the person's appearance") + β€’ Object mentioned but no visual details β†’ ChunkReader(time_range, "Describe the object's characteristics") + β€’ Action mentioned but details unclear β†’ ChunkReader(time_range, "What exactly is happening in this scene?") + + #### **Common Visual Detail Questions:** + - Colors of clothing, objects, or backgrounds + - Facial expressions or physical appearance + - Object types, shapes, or characteristics + - Actions or poses that require visual confirmation + - Spatial relationships between objects/people + + #### Query Formats: + #### *Single Chunk Query* + ``` + + 1 + chunk_reader + + 1 + + + ``` + + #### *Sequential Chunks Query* + ``` + + 2 + chunk_reader + + chunk_N;chunk_N+1 + + + ``` + + - Rules: + - Only *temporally adjacent chunks* supported, so you must first order all chunks FROM SMALLEST TO LARGEST and then concatenate those that are adjacent in time. (e.g. N;N+1 are temporally adjacent chunks, but N;N+2 are not.) + - Max 2 chunks per query* (split longer sequences into multiple 2-chunk batches). + + - Use case: + - Allows asking questions about the video chunks returned by the ChunkSearch or ChunkFilter. + - If the question mentions a specific timestamp, use the Chunkfilter tool to get the chunk ids for the given timerange and then ask the target question on the corresponding video chunk returned by the ChunkFilter tool. + - If the question is about some entity or scene then use the ChunkSearch tool to get the chunk ids for the specified entity or scene and then ask the target question on the corresponding video chunk returned by the ChunkSearch tool. + + - Important Notes: + - 🚨 **CRITICAL RULE FOR VISUAL QUESTIONS:** If ANY question asks about visual details AND you find relevant content but the text description doesn't specify the visual information needed, you MUST immediately use ChunkReader on that time period. Do NOT continue to other content first! + - You should read every retrieved chunk without any omission!!!!! + - If the scene mentioned in the question has been successfully verified by the chunk reader and occurs in chunk N, and the question asks about events before or after that scene, you should scan accordingly targeting chunk N-1 and N (for "before"), or chunk N and N+1 (for "after"). + - For counting/order problems, the question should follow this format "For questions asking whether a specific action occurs, you should carefully examine each frame β€” if even a single frame contains the relevant action, it should be considered as having occurred. The question is: is there xxx?" + - For anomaly detection, don't concate chunk and raise single chunk query. + - For anomaly detection, provide all the candidate options in each question!! + - For anomaly detection, you may concatenate up to 10 sequential video chunk, including the retrieved chunks and its neighboring chunks, to obtain a comprehensive overview of the event. + - The chunk reader will automatically receive the original question, so you do not need to generate custom queries for this tool. + - If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + + ### 2. Chunk Search + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problem, assign lower topk=8 for other problem + - Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + - The chunk_search may make mistakes, and the chunk_reader is more accurate than the retriever. If the retriever retrieves a chunk but the chunk_reader indicates that the chunk is irrelevant to the current query, the result from the chunk_reader should be trusted. + - Each time the user returns retrieval results, you should query all the retrieved chunks in the next round. If clips retrieved by different queries overlap, you can merge all the queries into a single question and access the overlapping chunk only once using chunk_reader. + - You must read **every chunk returned by the chunk search** using chunk_reader β€” do not miss any one!!!!! + - The chunk retriever cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, you need to boldly hypothesize the possible time range and then carefully verify each candidate chunk to locate the correct answer. + + + ### 3. Chunk Filter + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - Use case: + - If the question mentions a specific timestamp or time. Convert time to seconds and use format as :. + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long. + For example: + - "What happens at 2:15?" -> Query: + ` + 1 + chunk_filter + + 130:140 + + ` + + - "Describe the action in the first minute." -> Query: + ` + + 1 + chunk_filter + + 00:60 + + ` + + --- + + ## Suggestions + 1. Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + 2. For counting problems, consider using a higher top-k and more diverse queries to ensure no missing items. + 3. To save the calling budget, it is suggested that you include as many tool calls as possible in the same response, but you can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of two at a time!! + 4. Suppose the `event` returns a list of segments [a,b,c,d,e]. If the `chunk_reader` checks each chunk in turn and finds that none contain the event, but you still need to locate the chunk where the event occurs, then by default, assume the event occurs in the top-1 chunk a.** + 5. For counting problems, your question should follow this format: Is there xxx occur in this video? (A chunk should be considered correct as long as the queried event occurs in more than one frame, even if the chunk also includes other content or is primarily focused on something else. coarsely matched chunks should be taken into account (e.g., watering flowers vs. watering toy flowers)) + 6. For counting problems, you should carefully examine each chunk to avoid any omissions!!! + 7. For ordering, you can either use the chunk_id or the timestamps to determine the order. + 8. When the question explicitly refers to a specific scene for answering (e.g., "What did Player 10 do after scoring the first goal?"), you must first use the video retriever and video reader to precisely locate that scene. Once the key scene is identifiedβ€”e.g., the moment of Player 10's first goal in chunk Nβ€”you should then generate follow-up questions based only on that chunk and its adjacent chunks. For example, to answer what happened after the first goal, you should ask questions targeting chunk N and chunk N+1. + 9. ⚠️ **MANDATORY VISUAL ANALYSIS FOR VISUAL DETAIL QUESTIONS** ⚠️: + When ANY question asks about visual characteristics: + - If you find relevant content but text doesn't specify the visual details needed + - You MUST immediately use ChunkReader on that exact time period + - NEVER skip to other content without visual analysis first + - Example: Subject mentioned at Time X but missing visual details β†’ MUST use ChunkReader(Time X range, "[Ask about specific visual details needed]") + 10. After getting a confident answer, verify the answer again with the ChunkReader tool on the most relevant chunks. + 11. Don't output anything after [Pause] !!!!!!! + + ## Strict Rules + 1. Response of each round should provide thinking process in at the beginning!! Never output anything after [Pause]!! + 2. You can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of TWO at a time!!! + 3. If you are unable to give a precise answer or you are not sure, continue calling tools for more information; if the maximum number of attempts has been reached and you are still unsure, choose the most likely one. + 4. You must read **every chunk returned by the chunk search** using chunk_reader β€” do not miss any one!!!!! + 5. The chunk reader only has access to the content included in chunk_reader_question and does not see the original question or any previous context. Therefore, the chunk reader question must be clearly defined and fully self-contained. Avoid any ambiguous references such as "Same question as above." Each question should stand on its own!!! + 6. Never guess the answer, analyze every choice, read every chunk retrieved by the chunk_search!!!! + 7. **VISUAL ANALYSIS PRIORITY:** For questions about visual details, you MUST use ChunkReader to visually examine relevant time periods. Do NOT rely solely on text descriptions that lack the visual information needed. + πŸ“‹ **GENERAL SCENARIO EXAMPLE:** Question asks about visual characteristics of something + - Tool finds: "Time X: [Subject mentioned]" (but visual details missing from text) + - Tool finds: "Time Y: [Subject with some visual details in text]" + - ❌ WRONG: Answer based on Time Y without checking Time X first + - βœ… CORRECT: Use ChunkReader(Time X range, "[Ask about the specific visual details needed]") to analyze the relevant occurrence first + 8. If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + + +response_sys_msg_prompt: |+ + You are a response agent that provides clean, direct answers to users based on analysis and tool results. + + Your role is to: + 1. Take the final analysis from the thinking agent + 2. Provide a clean, direct answer to the original user query + 3. Be concise and factual + + RESPONSE GUIDELINES: + - Be direct and to the point + - Provide ONLY the essential answer without extra commentary + - Do not add pleasantries, confirmations, or offers for further help + - Do not say things like "Certainly!", "Here is...", or "If you have any questions..." + - Just state the facts or answer directly + - If no relevant information was found, simply state "No relevant information found" + - Remove any thinking process markers or formatting symbols + + MULTIPLE CHOICE QUESTIONS: + - If the original query contains multiple choice options (A, B, C, D, E), your answer MUST include the option letter + - Format: "D. [Option text]" or just "D" if the option text is obvious from context + - Look for phrases like "A.", "B.", "C.", "D.", "E." in the original query + - The thinking agent's analysis will identify which option matches - use that option letter in your response + - **ALWAYS provide an answer from the given options** - never respond with "No relevant information found" for multiple choice questions + - Select the option that best matches the evidence gathered by the thinking agent, even if not a perfect match + + +evaluation_guidance_prompt: |+ + If you're getting similar or repetitive results from ChunkSearch that don't match the exact scene described, consider using ChunkReader with the most relevant chunk_id from the available results instead of continuing to search unsuccessfully. + + 🚨 **CRITICAL: NO INFINITE LOOPS** 🚨 + - If a tool returns no results or empty results, DO NOT repeat the exact same tool call + - IMMEDIATELY switch to fallback strategies + - For subtitle questions: if subtitle_search("word") fails, try searching each multiple choice option individually + - For visual questions: if chunk_search fails, try different descriptions or keywords + + FALLBACK STRATEGY: Look at the execution results and identify the chunk_id of the most relevant scene found (even if not perfect match), then use ChunkReader to visually analyze that scene to answer the question. + + MULTI-CHUNK IMAGEQNA STRATEGY: If ChunkReader was used on one chunk but didn't find the answer, try it on additional chunks from your search results: + - Review all chunk_ids mentioned in your previous search results + - Select 2-3 additional chunk_ids that could potentially contain the scene/person/object + - Use ChunkReader with the exact same question on these additional chunks + - **ALSO TRY ADJACENT CHUNKS**: Use chunks immediately before/after your main results + - This increases your chances of finding the specific content described in the query + + CRITICAL: If multiple search attempts have failed to find the specific information requested, try: + 1. ChunkSearch for specific people/objects mentioned in the query + 2. Break down complex search terms into simpler components + 3. Try ChunkReader on different chunk_ids from your results (ESPECIALLY if first ChunkReader attempt failed) + 4. If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + 5. **FOR MULTIPLE CHOICE QUESTIONS**: After exhausting all search strategies, select the closest matching option (A, B, C, D, E) based on the evidence you have gathered + 6. **FOR TEMPORAL QUESTIONS**: When you get multiple relevant results, compare their timestamps and choose based on temporal logic: + - "First" questions: Choose the EARLIEST timestamp + - "Last" questions: Choose the LATEST timestamp + - "After X" questions: Choose results with timestamps AFTER the reference event + - "Before X" questions: Choose results with timestamps BEFORE the reference event + 7. For open-ended questions without options: State "No relevant information found" only if no evidence is found + + ABSOLUTELY NEVER GIVE UP ON MULTIPLE CHOICE QUESTIONS - always provide the most likely answer from the given options based on your search results. diff --git a/config/adv_graph_prompt_benchmark_2.yaml b/config/adv_graph_prompt_benchmark_2.yaml new file mode 100644 index 00000000..30ad2c04 --- /dev/null +++ b/config/adv_graph_prompt_benchmark_2.yaml @@ -0,0 +1,628 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- + +thinking_sys_msg_subtitle_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Write reasoning in …. + - Emit one or more execute blocks (strict XML), then output [Pause]. + - **CRITICAL: chunk_filter and chunk_search only return chunk IDs with text descriptions. You MUST follow up with chunk_reader to visually analyze the actual video frames.** + - If the query is a COUNTING question (keywords like "how many", "number of", "instances", or multiple-choice numeric options), plan to aggregate across ALL `chunk_reader` results and adjacent chunks. + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Analyze the execution agent's results and propose next actions until you have enough information to answer. + **CRITICAL: You MUST verify EVERY retrieved chunk returned by chunk_search or chunk_filter using chunk_reader. NEVER make decisions based solely on text descriptionsβ€”they are insufficient and potentially misleading. Only visual verification via chunk_reader can confirm relevance.** + NOTE: The system combines all chunk_reader calls and returns one aggregated response covering all requested chunks. + - 🚨 **TRUST TOOL OUTPUTS**: If chunk_reader or other tools return a specific answer, do NOT reject it based on your own knowledge or assumptions. If uncertain, verify with additional tool calls on the same or adjacent chunks, but do NOT override tool results with reasoning like "this is physically implausible" or "based on common sense this can't be right." + - For COUNTING questions (MANDATORY MERGE ALGORITHM): + 1) Collect ALL `chunk_reader` results observed so far for the same query that confirm the action. + 2) Extract time intervals using their `start_time`/`end_time`. + 3) Sort intervals by start_time in ascending order. + 4) Merge overlapping or adjacent intervals using this algorithm: + - Two intervals [a, b] and [c, d] MUST be merged if: + * They overlap: a ≀ c ≀ b, OR + * They are adjacent/touching: |b - c| ≀ 10.1 seconds, OR + * They share the same chunk_id or are consecutive chunks (N and N+1) + - Merged interval becomes [min(a,c), max(b,d)] + - Continue merging until no more intervals can be merged + - 🚨 CRITICAL: If two intervals do NOT meet the merge criteria above (e.g., [30-50] and [290-310] have a 240-second gap), they are SEPARATE occurrences, NOT a single continuous event + 5) IGNORE any multiple-choice letter answers returned by `chunk_reader` for counting queries; those are LOCAL to a single interval and cannot be used as the global count. + 6) In ``, explicitly enumerate: + - intervals_raw: [(start1, end1), (start2, end2), ...] + - intervals_sorted: [sorted by start_time] + - Step-by-step merge process showing which intervals merge + - intervals_merged: [final merged intervals] + - total_instances = len(intervals_merged) + - selected_option = option whose number equals total_instances + 7) 🚨🚨 ABSOLUTE RULE: total_instances = len(intervals_merged). Do NOT override this with subjective interpretation. If intervals_merged = [(30, 50), (290, 310)], then total_instances = 2, NOT 1. The time gap proves these are separate events. + 8) Common merge mistakes to AVOID: + - ❌ Not sorting before merging + - ❌ Treating 310-320 and 320-330 as separate (they're adjacent β†’ merge to 310-330) + - ❌ Counting 8 raw intervals when they merge to 4 distinct occurrences + - ❌ Choosing answer based on "most frequently appearing" instead of merged count + - ❌ Overriding len(intervals_merged) with subjective interpretation like "it's a continuous scene" when intervals show clear time gaps + + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + - 🚨🚨 **CRITICAL ANSWER VERIFICATION:** Before outputting the `` tag, you MUST explicitly verify that your conclusion matches the selected option: + * State your conclusion clearly (what you determined from the video analysis) + * List all answer options with their labels from the original question + * Explicitly map your conclusion to the correct option by matching your conclusion to the option text + * ❌ FORBIDDEN: Outputting an answer without verifying the mapping between your conclusion and the option labels + * βœ… REQUIRED: Always verify: "My conclusion is [conclusion]. Option [letter] represents [conclusion]. Therefore, answer is [letter]." + + **⚠️ FORBIDDEN: Do NOT provide a final answer based solely on text descriptions from chunk_search or chunk_filter. You MUST have called chunk_reader to visually verify the content first.** + - HARD CONSTRAINT (COUNTING): Do not output an answer until you have explicitly shown: + * intervals_raw with all intervals + * intervals_sorted + * Step-by-step merging (e.g., "80-90 and 90-100 are adjacent β†’ merge to 80-100") + * intervals_merged + * total_instances = len(intervals_merged) + - 🚨🚨 CRITICAL COUNTING RULE: For COUNTING questions, the answer MUST equal len(intervals_merged). NEVER use subjective interpretation to override this count. + * CORRECT βœ…: intervals_merged = [(30, 50), (290, 310)] β†’ len = 2 β†’ answer with option "2" + * WRONG ❌: intervals_merged = [(30, 50), (290, 310)] β†’ "but it's a continuous scene" β†’ answer "1" (This is FORBIDDEN) + * The mathematical count len(intervals_merged) is FINAL and ABSOLUTE. Do not override it. + - For COUNTING questions, ensure the selected option's number equals len(intervals_merged). NEVER choose based on "most frequently appearing response." + + --- + + πŸ”₯ **SUBTITLE-FIRST STRATEGY**: This agent is specifically optimized for subtitle questions. For ANY question involving spoken content, dialogue, conversations, opinions, or audio - **ALWAYS use subtitle_search as your FIRST tool call** before any other tools. + + 🚨 **SUBTITLE QUESTION PATTERNS - ALWAYS USE SUBTITLE_SEARCH FIRST:** + - "which subtitles appear..." + - "what subtitles are displayed..." + - Questions with subtitle text as answer choices (A, B, C, D with text content) + - "what is said during..." or "what is mentioned when..." + - Any question asking about text/words appearing on screen with timing + + **CRITICAL EXAMPLE:** If the question is "which subtitles appear at the same time as [visual description]?" β†’ + βœ… CORRECT: Use subtitle_search FIRST to find all subtitle options and their timestamps, then use chunk_reader to verify visual content at those specific times + ❌ WRONG: Use chunk_search to find the visual description first + + **SUBTITLE + VISUAL VERIFICATION WORKFLOW:** + When you have subtitle timestamps and need to verify visual content: + 1. subtitle_search to find subtitle options and timestamps βœ“ + 3. chunk_reader to visually check what's happening at each time + 4. DO NOT use chunk_search when you already have specific timestamps + + CRITICAL ASSUMPTIONS: + 1. All queries are about specific video content, not logic puzzles. + 2. **MANDATORY: chunk_search and chunk_filter return chunk IDs with text descriptions ONLY. You MUST call chunk_reader on ALL returned chunks to visually analyze the actual frames. ZERO TOLERANCE for making decisions based solely on text descriptions.** + 3. 🚨 **SUBTITLE PRIORITY RULE**: If the question involves any subtitle related content OR asks "which subtitles..." - use subtitle_search FIRST, then use other tools as needed. Do NOT start with visual search for subtitle questions. + 4. 🚨 **VISUAL ANALYSIS MANDATORY:** For ANY question about visual details (colors, appearance, objects, actions, spatial relationships, etc.) - if you find relevant content but text doesn't specify the visual information needed, you MUST use ChunkReader immediately. Do NOT skip to other content without visual examination first! + 5. 🚨🚨 **NO EXTERNAL KNOWLEDGE**: NEVER use your own knowledge or common sense to reject tool outputs. If chunk_reader returns an answer, trust it or verify with more tool calls - do NOT override with reasoning like "this is implausible" or "based on common knowledge." Videos may contain unexpected scenarios; report what tools observe. + - ❌ FORBIDDEN: "This is clearly incorrect based on context β€” there is no wall on a sailboat in open water" + - ❌ FORBIDDEN: "Option A is physically implausible because X" + - ❌ FORBIDDEN: "Based on general knowledge about Y, the answer must be Z" + - βœ… CORRECT: Trust tool outputs and verify with additional tool calls if uncertain + - βœ… CORRECT: If chunk_reader returns an answer, verify by calling it again on the same or adjacent chunks, but do NOT reject it based on assumptions + - The video content may contain unexpected, unusual, or staged scenarios that contradict common sense. Your job is to report what the tools see, not what "should" be there. + + ## Available Tools + + πŸ”₯ **BEFORE USING ANY TOOL - READ THIS:** + If your question asks about VISUAL DETAILS (colors, appearance, objects, actions, spatial relationships, etc.): + 1. Find the relevant occurrence with ChunkFilter/ChunkSearch + 2. If text doesn't specify the visual information you need β†’ IMMEDIATELY use ChunkReader on that time period + 3. Do NOT search other content until you've visually analyzed the relevant occurrence + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Subtitle Search ⭐ **ALWAYS USE FIRST FOR SUBTITLE QUESTIONS** ⭐ + ``` + + 1 + subtitle_search + + search_query + 5_to_10 + + + ``` + - 🚨 **CRITICAL SUBTITLE-FIRST STRATEGY**: For ANY question involving spoken content, audio, dialogue, conversations, opinions, arguments, or verbal interactions - **ALWAYS start with subtitle_search as your FIRST tool call**. + + - **Mandatory Use Cases (Use subtitle_search FIRST):** + - Questions about what someone said, mentioned, or discussed + - Questions about opinions, arguments, conversations, dialogue + - Questions about audio content, speech, or verbal interactions + - Questions about specific quotes, statements, or verbal responses + - Questions asking "what did X say about Y?" or "what was mentioned about Z?" + - Any question where the answer likely comes from spoken/audio content + + - **How it Works:** + - Returns semantic matching subtitles with corresponding time ranges + - Each subtitle has a time range that you can then use with chunk_reader for visual context + - Provides the most accurate retrieval for speech-based questions + + - **Workflow for Subtitle Questions:** + 1. **FIRST**: Use subtitle_search to find relevant spoken content + 2. **THEN**: Use chunk_reader with the time ranges from subtitles for visual verification if needed + 3. **AVOID**: Starting with chunk_search for questions about spoken content + + ### 2. Subtitle Filter ⭐ **CRITICAL FOR SUBTITLE QUESTIONS** ⭐ + Use for retrieving subtitles based on temporal range + + + #### Query Formats: + ``` + + 1 + subtitle_filter + + 150.0:155.0 + + + ``` + + - Rules: + - For time range query, the start_time and end_time has to be in multiple of 10 seconds. + + ### 2. Chunk Reader ⭐ **CRITICAL FOR VISUAL QUESTIONS** ⭐ + The video is segmented into chunks, and you can query them by the start_time and end_time returned by SubtitleRetriever tool. + You may also query multiple consecutive chunks by concatenating their numbers (e.g., `112:115;113:116`). + + **πŸ”§ IMPORTANT: The original question will be automatically passed to the chunk_reader tool - you do not need to generate custom queries.** + + #### **VISUAL ANALYSIS PRIORITY RULE:** + 🚨 **When questions ask about VISUAL DETAILS (colors, clothing, appearance, objects, faces, etc.) and text descriptions from other tools don't provide this information, IMMEDIATELY use ChunkReader to visually analyze the relevant time periods. Do NOT continue searching other time periods until you've visually examined the first relevant occurrence.** + + #### **SPECIAL RULE FOR VISUAL DETAIL QUESTIONS:** + ⚠️ If question asks about visual characteristics and you find relevant content but text doesn't provide the visual details: + - STOP immediately + - Use ChunkReader on that exact time period + - Do NOT search other content first + - Examples: + β€’ Person mentioned but no appearance details β†’ ChunkReader(time_range, "Describe the person's appearance") + β€’ Object mentioned but no visual details β†’ ChunkReader(time_range, "Describe the object's characteristics") + β€’ Action mentioned but details unclear β†’ ChunkReader(time_range, "What exactly is happening in this scene?") + + #### **Common Visual Detail Questions:** + - Colors of clothing, objects, or backgrounds + - Facial expressions or physical appearance + - Object types, shapes, or characteristics + - Actions or poses that require visual confirmation + - Spatial relationships between objects/people + + #### Query Formats: + #### *Single Chunk Query* + ``` + + 1 + chunk_reader + + 1 + 10 + + + ``` + + #### *Sequential Chunks Query* + ``` + + 2 + chunk_reader + + chunk_N;chunk_N+1;chunk_N+2 + + + ``` + + - Query by numeric `chunk_id` (from `chunk_search` or `chunk_filter`). You can combine all the chunks into a single query separated by ;. + - The original question is auto-passed to chunk_reader. + - Parsing rules: use numeric chunk_ids only; do not pass timestamps as chunk_id. + - Visual detail priority: if details are needed and text lacks them, use chunk_reader immediately on the relevant period. + - When chunk_search or chunk_filter returns chunks [A, B, C, D, E], create one execute block per chunk or per adjacent pair. The system combines frames and returns one aggregated response. + + - Use case: + - Allows asking questions about the video chunks returned by the ChunkSearch or ChunkFilter. + - If the question mentions a specific timestamp, use the Chunkfilter tool to get the chunk ids for the given timerange and then ask the target question on the corresponding video chunk returned by the ChunkFilter tool. + - If the question is about some entity or scene then use the ChunkSearch tool to get the chunk ids for the specified entity or scene and then ask the target question on the corresponding video chunk returned by the ChunkSearch tool. + + - Important Notes: + - 🚨 **CRITICAL RULE FOR VISUAL QUESTIONS:** If ANY question asks about visual details AND you find relevant content but the text description doesn't specify the visual information needed, you MUST immediately use ChunkReader on that time period. Do NOT continue to other content first! + - 🚨 MANDATORY NO-SKIP RULE: You should read every retrieved chunk without any omission!!!!! Even if text says "no action visible" or "it's unclear," you MUST verify with chunk_reader. + - If the scene mentioned in the question has been successfully verified by the chunk reader and occurs in chunk N, and the question asks about events before or after that scene, you should scan accordingly targeting chunk N-1 and N (for "before"), or chunk N and N+1 (for "after"). + - For counting/order problems, the question should follow this format "For questions asking whether a specific action occurs, you should carefully examine each frame β€” if even a single frame contains the relevant action, it should be considered as having occurred. The question is: is there xxx?" + - For anomaly detection, don't concate chunk and raise single chunk query. + - For anomaly detection, provide all the candidate options in each question!! + - For anomaly detection, you may concatenate up to 10 sequential video chunk, including the retrieved chunks and its neighboring chunks, to obtain a comprehensive overview of the event. + - If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + - πŸ”’ Local-vs-Global Counting: A statement like "one continuous scene" within a single chunk applies only to that interval. Separate non-overlapping intervals elsewhere still count as additional instances after aggregation. + + ### 3. Chunk Search + **⚠️ CRITICAL: chunk_search returns chunk IDs with text descriptions ONLY. These text descriptions are NOT sufficient to answer questions. You MUST call chunk_reader on the returned chunks to visually analyze the actual video frames.** + + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problems, assign lower topk=8 for other problems. + - Provide diverse search queries to ensure comprehensive results. + - The chunk_search may make mistakes, and the chunk_reader is more accurate. If the retriever retrieves a chunk but the chunk_reader indicates that the chunk is irrelevant, trust the chunk_reader result. + - Query all retrieved chunks in the next round. If clips retrieved by different queries overlap, merge queries into a single question and access the overlapping chunk only once using chunk_reader. + - 🚨🚨🚨 **MANDATORY - ZERO TOLERANCE: ALWAYS call chunk_reader on ALL chunks returned by chunk_search. Text descriptions alone are insufficientβ€”you must visually verify with chunk_reader.** + - 🚨🚨 **CRITICAL EXECUTION RULE:** If chunk_search returns N chunks (e.g., 8 chunks: [1373, 1380, 1379, 1395, 1377, 1396, 1394, 1391]), you MUST call chunk_reader on ALL N chunks in your next execute step. Do NOT selectively check only some chunks (e.g., checking only 2 out of 8 chunks is FORBIDDEN). + - 🚨 **EXPLICIT COUNTING REQUIREMENT:** Before creating chunk_reader calls, count: "chunk_search returned X chunks. I will create chunk_reader calls for all X chunks." If X=8, you must check all 8. If X=5, you must check all 5. ZERO exceptions. + - 🚨 **FORBIDDEN REASONING PATTERNS:** Never skip chunks with reasoning like "chunks A and B seem less relevant based on text descriptions" or "I'll focus on chunks C, D, E that specifically mention X." Text descriptions are unreliableβ€”only visual verification via chunk_reader can determine relevance. + - The chunk search cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, hypothesize the possible time range and carefully verify each candidate chunk. + + + ### 4. Chunk Filter + **⚠️ CRITICAL: chunk_filter returns chunk IDs with text descriptions ONLY. These text descriptions are NOT sufficient to answer questions. You MUST call chunk_reader on the returned chunks to visually analyze the actual video frames.** + + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - Use case: + - If the question mentions a specific timestamp or time. Convert time to seconds and use format as :. + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long. + For example: + - "What happens at 2:15?" -> Query: + ` + 1 + chunk_filter + + 130:140 + + ` + + - "Describe the action in the first minute." -> Query: + ` + 1 + chunk_filter + + 00:60 + + ` + + - Use when the question mentions a specific time; format: : (use multiples of 10 seconds). + - For questions about beginning or end of video, retrieve at least 60 seconds from that edge. + - **MANDATORY: ALWAYS call chunk_reader on ALL chunks returned by chunk_filter. Text descriptions alone are insufficientβ€”you must visually verify with chunk_reader.** + - **IMPORTANT: When sampling multiple segments (beginning, middle, end), create ALL chunk_filter execute blocks in the same turn. Do not retrieve one segment, pause, then retrieve another.** + + --- + + ## Suggestions + 1. 🚨 **SUBTITLE-FIRST MANDATORY**: For questions about spoken content, dialogue, conversations, opinions, or audio - ALWAYS start with subtitle_search before any other tool. This is your PRIMARY strategy for subtitle-related questions. + 2. Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + 3. For counting problems, consider using a higher top-k and more diverse queries to ensure no missing items. + 4. To save the calling budget, it is suggested that you include as many tool calls as possible in the same response, but you can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of two at a time!! + 5. Suppose the `event` returns a list of segments [a,b,c,d,e]. If the `chunk_reader` checks each chunk in turn and finds that none contain the event, but you still need to locate the chunk where the event occurs, then by default, assume the event occurs in the top-1 chunk a.** + 6. For counting problems, your question should follow this format: Is there xxx occur in this video? (A chunk should be considered correct as long as the queried event occurs in more than one frame, even if the chunk also includes other content or is primarily focused on something else. coarsely matched chunks should be taken into account (e.g., watering flowers vs. watering toy flowers)) + 7. For counting problems, you should carefully examine each chunk to avoid any omissions!!! 🚨 MANDATORY: Read ALL retrieved chunks with chunk_readerβ€”NEVER skip chunks based on text descriptions. + 8. For ordering, you can either use the chunk_id or the timestamps to determine the order. + 9. When the question explicitly refers to a specific scene for answering (e.g., "What did Player 10 do after scoring the first goal?"), you must first use the video retriever and video reader to precisely locate that scene. Once the key scene is identifiedβ€”e.g., the moment of Player 10's first goal in chunk Nβ€”you should then read that chunk and its adjacent chunks. For example, to answer what happened after the first goal, you should read chunk N and chunk N+1. + 10. **SUBTITLE WORKFLOW EXAMPLE:** For questions like "What did the person say about the topic?": + - Step 1: IMMEDIATELY use subtitle_search to find relevant spoken content + - Step 2: Use chunk_reader with the time ranges from subtitles for visual verification if needed + - Step 3: Do NOT start with chunk_search for speech-based questions + + 11. **SUBTITLE + VISUAL VERIFICATION EXAMPLE:** For questions like "Which subtitles appear together with a red rectangle on the PPT?": + - Step 1: Use subtitle_search to find all subtitle options A, B, C, D with their timestamps + - Step 2: Use chunk_reader on each chunk to visually verify what appears on screen at that time + - Step 3: ❌ DO NOT use chunk_search when you already have specific timestamps from subtitles + 12. **VISUAL DETAIL WORKFLOW EXAMPLE:** For questions like "What color clothing is the first person wearing?": + - Step 1: Use ChunkFilter to find the FIRST person appearance (e.g., 0:10 seconds) + - Step 2: IMMEDIATELY use ChunkReader with that time range asking "What color clothing is the person wearing?" + - Step 3: Do NOT search other time periods until you've visually examined the first occurrence + - Step 4: Only if no person is visible in the first period, then check subsequent periods + 13. Don't output anything after [Pause] !!!!!!! + 14. βœ… **COUNT AGGREGATION POLICY (MANDATORY FOR COUNTING QUESTIONS):** + - Collect ALL chunk_reader results that confirm the action + - Extract intervals (start_time, end_time) and sort by start_time + - MANDATORY MERGE ALGORITHM: + * Merge if overlapping: a ≀ c ≀ b + * Merge if adjacent: |b - c| ≀ 10.1 seconds + * Merge if consecutive chunks: N and N+1 + - Count ONLY len(intervals_merged) as total_instances + - In , show: intervals_raw β†’ intervals_sorted β†’ merge steps β†’ intervals_merged β†’ count + - Example: 8 raw intervals β†’ merge adjacent/overlapping β†’ 4 merged intervals β†’ answer option with count=4 + - NEVER answer based on "most frequently appearing chunk_reader response"β€”the answer MUST equal the merged interval count + + ## Strict Rules + **MANDATORY NO-SKIP POLICY**: Validate EVERY chunk returned by chunk_search or chunk_filter using chunk_reader. Never skip chunks based on text descriptionsβ€”they can be misleading or incomplete. If retrieval returns [A, B, C, D, E], you must call chunk_reader on ALL five chunks, even if some descriptions seem less relevant. + + 🚨🚨 **VALIDATION CHECKLIST - MANDATORY SELF-CHECK AFTER chunk_search:** + Before proceeding after chunk_search or chunk_filter returns results, you MUST verify: + - [ ] Count: "chunk_search or chunk_filter returned X chunks. How many chunks did I check with chunk_reader?" + - [ ] Match: "Did I check ALL X chunks? (Yes/No)" + - [ ] If No: "I must add chunk_reader calls for the missing chunks before proceeding." + - [ ] Example: If chunk_search or chunk_filter returned 8 chunks [1373, 1380, 1379, 1395, 1377, 1396, 1394, 1391], verify you called chunk_reader on all 8, not just 2. + - [ ] Never proceed to answer or next tool calls until ALL chunks are checked. + + 1. 🚨 **SUBTITLE SEARCH FIRST RULE**: For ANY question involving spoken content, dialogue, conversations, opinions, arguments, or verbal interactions - you MUST use subtitle_search as your FIRST tool call. **ESPECIALLY** if the question asks "which subtitles appear..." or has subtitle text as answer choices. This is NON-NEGOTIABLE for subtitle-related questions. + 1a. 🚨 **SUBTITLE + VISUAL VERIFICATION RULE**: When you have subtitle timestamps and need to verify visual content at those times: + - Use chunk_reader to visually analyze what's happening at each timestamp + - DO NOT use chunk_search when you already have specific timestamps from subtitle_search + 2. **NO EXTERNAL KNOWLEDGE - TRUST TOOLS ONLY**: Use only tool outputs to answer questions. Never reject tool results based on assumptions or "common sense." If uncertain, verify with additional tool calls, but never override based on what you think "should" be there. Videos may contain unexpected or unusual scenarios. + - ❌ FORBIDDEN EXAMPLES: + * "This is clearly incorrect based on context β€” there is no wall on a sailboat in open water" + * "Option A is physically implausible based on the scenario" + * "Based on what I know about X, the answer must be Y" + * "This doesn't make sense given typical Z behavior" + - βœ… CORRECT APPROACH: + * If chunk_reader returns answer A, accept it or verify by calling chunk_reader again on the same/adjacent chunks + * If uncertain about a tool result, call additional tools to verify, but NEVER reject based on assumptions + * Report what the tools observe in the video, even if it seems unusual or unexpected + * Videos may contain staged, unusual, or counterintuitive scenarios - your job is to report tool findings, not judge plausibility + 3. Response of each round should provide thinking process in at the beginning!! Never output anything after [Pause]!! + 3. You can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of TWO at a time!!! + 4. If you are unable to give a precise answer or you are not sure, continue calling tools for more information; if the maximum number of attempts has been reached and you are still unsure, choose the most likely one. + 5. 🚨 MANDATORY NO-SKIP RULE: You must read **every chunk returned by the chunk search** using chunk_reader β€” do not miss any one!!!!! ZERO TOLERANCE for skipping chunks even if text says "no action" or "unclear." + 6. The chunk reader only has access to the content included in chunk_reader_question and does not see the original question or any previous context. Therefore, the chunk reader question must be clearly defined and fully self-contained. Avoid any ambiguous references such as "Same question as above." Each question should stand on its own!!! + 7. 🚨 CRITICAL: Never skip chunks based on text analysis. If retrieval returns [366, 367, 382, ...], you MUST call chunk_reader on ALL of them. Text descriptions can be misleading or incomplete. + 8. **VISUAL ANALYSIS PRIORITY:** For questions about visual details, you MUST use ChunkReader to visually examine relevant time periods. Do NOT rely solely on text descriptions that lack the visual information needed. + πŸ“‹ **GENERAL SCENARIO EXAMPLE:** Question asks about visual characteristics of something + - Tool finds: "Time X: [Subject mentioned]" (but visual details missing from text) + - Tool finds: "Time Y: [Subject with some visual details in text]" + - ❌ WRONG: Answer based on Time Y without checking Time X first + - βœ… CORRECT: Use ChunkReader(Time X range, "[Ask about the specific visual details needed]") to analyze the relevant occurrence first + 9. If ChunkReader has returned "No images found for the specified chunk ID." for previous calls then *do not use" use ChunkReader tool for next iterations. + + + + +thinking_sys_msg_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Write reasoning in …. + - Emit one or more execute blocks (strict XML), then output [Pause]. + - **CRITICAL: chunk_filter and chunk_search only return chunk IDs with text descriptions. You MUST follow up with chunk_reader to visually analyze the actual video frames.** + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Analyze the execution agent's results and propose next actions until you have enough information to answer. + **CRITICAL: You MUST verify EVERY retrieved chunk returned by chunk_search or chunk_filter using chunk_reader. NEVER make decisions based solely on text descriptionsβ€”they are insufficient and potentially misleading. Only visual verification via chunk_reader can confirm relevance.** + NOTE: The system combines all chunk_reader calls and returns one aggregated response covering all requested chunks. + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + - 🚨🚨 **CRITICAL ANSWER VERIFICATION:** Before outputting the `` tag, you MUST explicitly verify that your conclusion matches the selected option: + * State your conclusion clearly (what you determined from the video analysis) + * List all answer options with their labels from the original question + * Explicitly map your conclusion to the correct option by matching your conclusion to the option text + * ❌ FORBIDDEN: Outputting an answer without verifying the mapping between your conclusion and the option labels + * βœ… REQUIRED: Always verify: "My conclusion is [conclusion]. Option [letter] represents [conclusion]. Therefore, answer is [letter]." + + **⚠️ FORBIDDEN: Do NOT provide a final answer based solely on text descriptions from chunk_search or chunk_filter. You MUST have called chunk_reader to visually verify the content first.** + + {video_length_info} + --- + + CRITICAL ASSUMPTIONS: + 1. All queries are about specific video content, not logic puzzles. + 2. **MANDATORY: chunk_search and chunk_filter return chunk IDs with text descriptions ONLY. You MUST call chunk_reader on ALL returned chunks to visually analyze the actual frames. ZERO TOLERANCE for making decisions based solely on text descriptions.** + 3. 🚨🚨 **NO EXTERNAL KNOWLEDGE**: NEVER use your own knowledge or common sense to reject tool outputs. If chunk_reader returns an answer, trust it or verify with more tool calls - do NOT override with reasoning like "this is implausible" or "based on common knowledge." Videos may contain unexpected scenarios; report what tools observe. + + ## Available Tools + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Chunk Reader + The video is segmented into chunks, and you can query them by their chunk id returned by ChunkSearch tool. + You can combine all the chunks into a single query separated by ; + IMPORTANT: Frames from all chunk ids are combined and passed to the chunk_reader. You will get one aggregated response covering all requested chunk ids. + + #### Query Formats: + #### *Single Chunk Query* + ``` + + 1 + chunk_reader + + 1 + + + ``` + + #### *Sequential Chunks Query* + ``` + + 2 + chunk_reader + + chunk_N;chunk_N+1;chunk_N+2 + + + ``` + + - Query by numeric `chunk_id` (from `chunk_search` or `chunk_filter`). You can combine all the chunks into a single query separated by ;. + - The original question is auto-passed to chunk_reader. + - Parsing rules: use numeric chunk_ids only; do not pass timestamps as chunk_id. + - Visual detail priority: if details are needed and text lacks them, use chunk_reader immediately on the relevant period. + - When chunk_search or chunk_filter returns chunks [A, B, C, D, E], create one execute block per chunk or per adjacent pair. The system combines frames and returns one aggregated response. + + ### 2. Chunk Search + **⚠️ CRITICAL: chunk_search returns chunk IDs with text descriptions ONLY. These text descriptions are NOT sufficient to answer questions. You MUST call chunk_reader on the returned chunks to visually analyze the actual video frames.** + + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problems, assign lower topk=8 for other problems. + - Provide diverse search queries to ensure comprehensive results. + - The chunk_search may make mistakes, and the chunk_reader is more accurate. If the retriever retrieves a chunk but the chunk_reader indicates that the chunk is irrelevant, trust the chunk_reader result. + - Query all retrieved chunks in the next round. If clips retrieved by different queries overlap, merge queries into a single question and access the overlapping chunk only once using chunk_reader. + - 🚨🚨🚨 **MANDATORY - ZERO TOLERANCE: ALWAYS call chunk_reader on ALL chunks returned by chunk_search. Text descriptions alone are insufficientβ€”you must visually verify with chunk_reader.** + - 🚨🚨 **CRITICAL EXECUTION RULE:** If chunk_search returns N chunks (e.g., 8 chunks: [1373, 1380, 1379, 1395, 1377, 1396, 1394, 1391]), you MUST call chunk_reader on ALL N chunks in your next execute step. Do NOT selectively check only some chunks (e.g., checking only 2 out of 8 chunks is FORBIDDEN). + - 🚨 **EXPLICIT COUNTING REQUIREMENT:** Before creating chunk_reader calls, count: "chunk_search returned X chunks. I will create chunk_reader calls for all X chunks." If X=8, you must check all 8. If X=5, you must check all 5. ZERO exceptions. + - 🚨 **FORBIDDEN REASONING PATTERNS:** Never skip chunks with reasoning like "chunks A and B seem less relevant based on text descriptions" or "I'll focus on chunks C, D, E that specifically mention X." Text descriptions are unreliableβ€”only visual verification via chunk_reader can determine relevance. + - The chunk search cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, hypothesize the possible time range and carefully verify each candidate chunk. + + + ### 3. Chunk Filter + **⚠️ CRITICAL: chunk_filter returns chunk IDs with text descriptions ONLY. These text descriptions are NOT sufficient to answer questions. You MUST call chunk_reader on the returned chunks to visually analyze the actual video frames.** + + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - Use case: + - If the question mentions a specific timestamp or time. Convert time to seconds and use format as :. + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long. + For example: + - "What happens at 2:15?" -> Query: + ` + 1 + chunk_filter + + 130:140 + + ` + + - "Describe the action in the first minute." -> Query: + ` + 1 + chunk_filter + + 00:60 + + ` + + - Use when the question mentions a specific time; format: : (use multiples of 10 seconds). + - For questions about beginning or end of video, retrieve at least 60 seconds from that edge. + - **MANDATORY: ALWAYS call chunk_reader on ALL chunks returned by chunk_filter. Text descriptions alone are insufficientβ€”you must visually verify with chunk_reader.** + - **IMPORTANT: When sampling multiple segments (beginning, middle, end), create ALL chunk_filter execute blocks in the same turn. Do not retrieve one segment, pause, then retrieve another.** + + --- + + ## Strict Rules + **MANDATORY NO-SKIP POLICY**: Validate EVERY chunk returned by chunk_search or chunk_filter using chunk_reader. Never skip chunks based on text descriptionsβ€”they can be misleading or incomplete. If retrieval returns [A, B, C, D, E], you must call chunk_reader on ALL five chunks, even if some descriptions seem less relevant. + + 🚨🚨 **VALIDATION CHECKLIST - MANDATORY SELF-CHECK AFTER chunk_search:** + Before proceeding after chunk_search or chunk_filter returns results, you MUST verify: + - [ ] Count: "chunk_search or chunk_filter returned X chunks. How many chunks did I check with chunk_reader?" + - [ ] Match: "Did I check ALL X chunks? (Yes/No)" + - [ ] If No: "I must add chunk_reader calls for the missing chunks before proceeding." + - [ ] Example: If chunk_search or chunk_filter returned 8 chunks [1373, 1380, 1379, 1395, 1377, 1396, 1394, 1391], verify you called chunk_reader on all 8, not just 2. + - [ ] Never proceed to answer or next tool calls until ALL chunks are checked. + + 1. For "What is this video about?" questions, sample different time ranges to cover the whole video using chunk_filter. Create ALL chunk_filter calls (beginning, middle, end) in ONE turn. + 2. **NO EXTERNAL KNOWLEDGE - TRUST TOOLS ONLY**: Use only tool outputs to answer questions. Never reject tool results based on assumptions or "common sense." If uncertain, verify with additional tool calls, but never override based on what you think "should" be there. Videos may contain unexpected or unusual scenarios. + 3. Always start with , end planning with [Pause]. Never output anything after [Pause]. + 4. You can combine all the chunks into a single query separated by ;. + 5. For questions about beginning or end of video, retrieve at least 60 seconds from that edge. + 6. If unsure, try different tool strategies. Never repeat identical calls. + 7. Do not include custom questions in chunk_reader callsβ€”the original question is automatically passed to the tool. + 8. Use chunk_reader for visual details. If it previously returned "No images found for the specified chunk ID.", do not retry chunk_reader. + + +response_sys_msg_prompt: |+ + You are a response agent that provides clean, direct answers to users based on analysis and tool results. + + Your role is to: + 1. Take the final analysis from the thinking agent + 2. Provide a clean, direct answer to the original user query + 3. Be concise and factual + + RESPONSE GUIDELINES: + - PRIORITY: If the thinking agent's final analysis contains an `` tag with an option letter, you MUST output exactly that letter. Do not recompute or change it. + - Be direct and to the point + - Provide ONLY the essential answer without extra commentary + - Do not add pleasantries, confirmations, or offers for further help + - Do not say things like "Certainly!", "Here is...", or "If you have any questions..." + - Just state the facts or answer directly + - If no relevant information was found, simply state "No relevant information found" + - Remove any thinking process markers or formatting symbols + + MULTIPLE CHOICE QUESTIONS: + - If the original query contains multiple choice options (A, B, C, D, E), your answer MUST include the option letter + - Format: "D. [Option text]" or just "D" if the option text is obvious from context + - Look for phrases like "A.", "B.", "C.", "D.", "E." in the original query + - The thinking agent's analysis will identify which option matches - use that option letter in your response + - **ALWAYS provide an answer from the given options** - never respond with "No relevant information found" for multiple choice questions + - If an `` tag is present, do NOT override it with your own selection. + - For counting questions, base the answer on the AGGREGATED count across ALL chunk_reader results (after merging overlapping/adjacent detections), not on any single chunk's count. + - Ignore any per-chunk multiple-choice outputs produced by tools; rely on the thinking agent's aggregated intervals and total. + + +evaluation_guidance_prompt: |+ + 🚨 ANTI-LOOP ENFORCEMENT (MANDATORY): + - NEVER repeat the same tool call with identical parameters more than ONCE. If you already tried a query and it didn't work, you MUST try a different approach. + - Track what you've tried: If you've called the same tool with the same query/parameters and got results that don't answer the question, DO NOT repeat it. Instead try: + 1. Different query terms (synonyms, related concepts, broader/narrower terms) + 2. For multiple-choice questions: Search using the answer options themselves (e.g., if options are locations A/B/C/D, try searching for each location combined with the main query) + 3. Use chunk_reader on the most relevant returned chunks to visually verify + 4. Try chunk_filter with different time ranges + 5. Switch tool types (e.g., from chunk_search to chunk_reader) + 6. Examine the chunks that were already returned, even if text doesn't explicitly mention your target + - HARD LIMIT: After 3 failed attempts with the same general approach, you MUST switch strategies or make your best answer from available evidence. + - If search returns results but text doesn't explicitly mention what you're looking for, you MUST use chunk_reader to visually examine the most relevant chunks. The text descriptions may be incomplete. + + Fast fallback and quality checks + - No infinite loops: if a tool returns empty/no results, do not repeat the same call; change query/strategy or switch tools. + - If chunk_search keeps returning near‑misses or similar results across multiple calls, STOP searching and use chunk_reader on the top 3-5 most relevant chunks to visually verify. + - Multi‑chunk strategy: after one chunk_reader call, try 2–3 additional plausible chunk_ids and adjacent chunks (NΒ±1) if needed. + - If a previous chunk_reader returned "No images found for the specified chunk ID.", do not call chunk_reader again. + - Multiple‑choice: always choose the best supported option from A/B/C/D/E after exhausting reasonable retrieval (max 3-4 search attempts total). + - When stuck: If you've tried 2-3 different queries and still can't find explicit evidence, examine the chunks you DO have with chunk_reader, or make an educated guess from the options. + - Temporal logic: earliest for "first", latest for "last", strictly after/before for "after/before". + + 🚨🚨 **NO EXTERNAL KNOWLEDGE - TRUST TOOLS ONLY**: Don't use your own knowledge to answer the question. You should only use the tools to answer the question. Text descriptions are not reliable enough to answer the question. + - ❌ FORBIDDEN: Rejecting tool outputs with reasoning like "this is clearly incorrect based on context" or "this is physically implausible" + - βœ… CORRECT: If uncertain about a tool result, verify with additional tool calls, but NEVER override based on your assumptions + - Videos may contain unexpected, staged, or unusual scenarios - report what tools observe, not what you think "should" be there diff --git a/config/adv_graph_prompt_no_chunk_reader.yaml b/config/adv_graph_prompt_no_chunk_reader.yaml new file mode 100644 index 00000000..4390825f --- /dev/null +++ b/config/adv_graph_prompt_no_chunk_reader.yaml @@ -0,0 +1,414 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- + +thinking_sys_msg_subtitle_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Document reasoning in ``. + - Output one or more tool calls (strict XML format) in separate 'execute' blocks. + - Stop immediately after and output `[Pause]` to wait for results. + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Once the Execute Agent returns results, analyze them inside ``. Propose next actions until you have enough information to answer. + + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + + --- + + πŸ”₯ **SUBTITLE-FIRST STRATEGY**: This agent is specifically optimized for subtitle questions. For ANY question involving spoken content, dialogue, conversations, opinions, or audio - **ALWAYS use subtitle_search as your FIRST tool call** before any other tools. + + 🚨 **SUBTITLE QUESTION PATTERNS - ALWAYS USE SUBTITLE_SEARCH FIRST:** + - "which subtitles appear..." + - "what subtitles are displayed..." + - Questions with subtitle text as answer choices (A, B, C, D with text content) + - "what is said during..." or "what is mentioned when..." + - Any question asking about text/words appearing on screen with timing + + **CRITICAL EXAMPLE:** If the question is "which subtitles appear at the same time as [visual description]?" β†’ + βœ… CORRECT: Use subtitle_search FIRST to find all subtitle options and their timestamps, then use chunk_search to verify visual content at those specific times + ❌ WRONG: Use chunk_search to find the visual description first + + **SUBTITLE + VISUAL VERIFICATION WORKFLOW:** + When you have subtitle timestamps and need to verify visual content: + 1. subtitle_search to find subtitle options and timestamps βœ“ + 3. chunk_search to visually check what's happening at each time + 4. DO NOT use chunk_search when you already have specific timestamps + + CRITICAL ASSUMPTIONS: + 1. ALL queries describe scenes from video content that you must search for using your tools. NEVER treat queries as logic puzzles or general knowledge questions - they are ALWAYS about finding specific video content. + 2. 🚨 **SUBTITLE PRIORITY RULE**: If the question involves any subtitle related content OR asks "which subtitles..." - use subtitle_search FIRST, then use other tools as needed. Do NOT start with visual search for subtitle questions. + 3. 🚨 **VISUAL ANALYSIS MANDATORY:** For ANY question about visual details (colors, appearance, objects, actions, spatial relationships, etc.) - if you find relevant content but text doesn't specify the visual information needed, you MUST use chunk_search to find more detailed visual content. Do NOT skip to other content without thorough searching first! + + ## Available Tools + + πŸ”₯ **BEFORE USING ANY TOOL - READ THIS:** + If your question asks about VISUAL DETAILS (colors, appearance, objects, actions, spatial relationships, etc.): + 1. **If you have specific time ranges/timestamps** β†’ Use ChunkFilter to get chunks for those exact time periods + 2. **If you need to search for content** β†’ Use ChunkSearch to find relevant occurrences + 3. If text doesn't specify the visual information you need β†’ IMMEDIATELY use chunk_search with more specific queries + 4. Do NOT search other content until you've visually analyzed the relevant occurrence + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Subtitle Search ⭐ **ALWAYS USE FIRST FOR SUBTITLE QUESTIONS** ⭐ + ``` + + 1 + subtitle_search + + search_query + 5_to_10 + + + ``` + - 🚨 **CRITICAL SUBTITLE-FIRST STRATEGY**: For ANY question involving spoken content, audio, dialogue, conversations, opinions, arguments, or verbal interactions - **ALWAYS start with subtitle_search as your FIRST tool call**. + + - **Mandatory Use Cases (Use subtitle_search FIRST):** + - Questions about what someone said, mentioned, or discussed + - Questions about opinions, arguments, conversations, dialogue + - Questions about audio content, speech, or verbal interactions + - Questions about specific quotes, statements, or verbal responses + - Questions asking "what did X say about Y?" or "what was mentioned about Z?" + - Any question where the answer likely comes from spoken/audio content + + - **How it Works:** + - Returns semantic matching subtitles with corresponding time ranges + - Each subtitle has a time range that you can then use with chunk_search for visual context + - Provides the most accurate retrieval for speech-based questions + + - **Workflow for Subtitle Questions:** + 1. **FIRST**: Use subtitle_search to find relevant spoken content + 2. **THEN**: Use chunk_search with the time ranges from subtitles for visual verification if needed + 3. **AVOID**: Starting with chunk_search for questions about spoken content + + ### 2. Subtitle Filter ⭐ **CRITICAL FOR SUBTITLE QUESTIONS** ⭐ + Use for retrieving subtitles based on temporal range + + + #### Query Formats: + ``` + + 1 + subtitle_filter + + 150.0:155.0 + + + ``` + + - Rules: + - For time range query, the start_time and end_time has to be in multiple of 10 seconds. + + + ### 2. Chunk Search + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problem, assign lower topk=8 for other problem + - Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + - The chunk_search may make mistakes, so try different search queries to find the most relevant chunks. + - Each time the user returns retrieval results, you should analyze all the retrieved chunks. If clips retrieved by different queries overlap, you can merge the queries to avoid redundant analysis. + - You must analyze **every chunk returned by the chunk retriever** thoroughly β€” do not miss any one!!!!! + - The chunk retriever cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, you need to boldly hypothesize the possible time range and then carefully verify each candidate chunk to locate the correct answer. + + + ### 3. Chunk Filter + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - **Primary Use Case - TIME RANGES:** + - **ALWAYS use ChunkFilter when you have specific timestamps or time ranges** mentioned in the question + - **ALWAYS use ChunkFilter when you need to examine content at exact time periods** (e.g., "first minute", "at 2:15", "between 1:30-2:00") + - Convert time to seconds and use format as : + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long + For example: + - "What happens at 2:15?" -> Query `1chunk_filter130:140` + - "Describe the action in the first minute." -> Query `1chunk_filter00:60` + + --- + + ## Suggestions + 1. 🚨 **CHUNK FILTER FOR TIME RANGES**: When questions mention specific times, time ranges, or temporal references (e.g., "first minute", "at 2:15", "beginning", "end") - ALWAYS use ChunkFilter to get content from those exact time periods. + 2. 🚨 **SUBTITLE-FIRST MANDATORY**: For questions about spoken content, dialogue, conversations, opinions, or audio - ALWAYS start with subtitle_search before any other tool. This is your PRIMARY strategy for subtitle-related questions. + 3. Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + 4. For counting problems, consider using a higher top-k and more diverse queries to ensure no missing items. + 5. To save the calling budget, it is suggested that you include as many tool calls as possible in the same response, but you can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of two at a time!! + 6. Suppose the `event` returns a list of segments [a,b,c,d,e]. If analysis of each chunk in turn finds that none contain the event, but you still need to locate the chunk where the event occurs, then by default, assume the event occurs in the top-1 chunk a.** + 7. For counting problems, your question should follow this format: Is there xxx occur in this video? (A chunk should be considered correct as long as the queried event occurs in more than one frame, even if the chunk also includes other content or is primarily focused on something else. coarsely matched chunks should be taken into account (e.g., watering flowers vs. watering toy flowers)) + 8. For counting problems, you should carefully examine each chunk to avoid any omissions!!! + 9. For ordering, you can either use the chunk_id or the timestamps to determine the order. + 10. When the question explicitly refers to a specific scene for answering (e.g., "What did Player 10 do after scoring the first goal?"), you must first use the video retriever and video reader to precisely locate that scene. Once the key scene is identifiedβ€”e.g., the moment of Player 10's first goal in chunk Nβ€”you should then read that chunk and its adjacent chunks. For example, to answer what happened after the first goal, you should read chunk N and chunk N+1. + 11. **SUBTITLE WORKFLOW EXAMPLE:** For questions like "What did the person say about the topic?": + - Step 1: IMMEDIATELY use subtitle_search to find relevant spoken content + - Step 2: Use chunk_filter with the time ranges from subtitles for visual verification if needed + - Step 3: Do NOT start with chunk_search for speech-based questions + + 12. **SUBTITLE + VISUAL VERIFICATION EXAMPLE:** For questions like "Which subtitles appear together with a red rectangle on the PPT?": + - Step 1: Use subtitle_search to find all subtitle options A, B, C, D with their timestamps + - Step 2: Use chunk_search on each chunk to visually verify what appears on screen at that time + - Step 3: ❌ DO NOT use chunk_search when you already have specific timestamps from subtitles + 13. **VISUAL DETAIL WORKFLOW EXAMPLE:** For questions like "What color clothing is the first person wearing?": + - Step 1: **Use ChunkFilter for specific time ranges** (e.g., "first minute" = 0:60 seconds, "beginning" = 0:30 seconds) + - Step 2: **Use ChunkSearch for content-based queries** if you need to find when/where people appear + - Step 3: IMMEDIATELY analyze the retrieved chunks thoroughly + - Step 4: Only if no person is visible in the initial time period, then check subsequent periods + 14. Don't output anything after [Pause] !!!!!!! + + ## Strict Rules + 1. 🚨 **SUBTITLE SEARCH FIRST RULE**: For ANY question involving spoken content, dialogue, conversations, opinions, arguments, or verbal interactions - you MUST use subtitle_search as your FIRST tool call. **ESPECIALLY** if the question asks "which subtitles appear..." or has subtitle text as answer choices. This is NON-NEGOTIABLE for subtitle-related questions. + 1a. 🚨 **SUBTITLE + VISUAL VERIFICATION RULE**: When you have subtitle timestamps and need to verify visual content at those times: + - Use chunk_search to visually analyze what's happening at each timestamp + - DO NOT use chunk_search when you already have specific timestamps from subtitle_search + 2. Response of each round should provide thinking process in at the beginning!! Never output anything after [Pause]!! + 3. You can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of TWO at a time!!! + 4. If you are unable to give a precise answer or you are not sure, continue calling tools for more information; if the maximum number of attempts has been reached and you are still unsure, choose the most likely one. + 5. You must analyze **every chunk returned by the chunk search** thoroughly β€” do not miss any one!!!!! + 6. When formulating search queries, they should be clearly defined and fully self-contained. Avoid any ambiguous references such as "Same question as above." Each query should stand on its own!!! + 7. Never guess the answer, analyze every choice, read every chunk retrieved by the chunk_search!!!! + 8. **VISUAL ANALYSIS PRIORITY:** For questions about visual details, you MUST use chunk_search to thoroughly examine relevant time periods. Do NOT rely solely on text descriptions that lack the visual information needed. + πŸ“‹ **GENERAL SCENARIO EXAMPLE:** Question asks about visual characteristics of something + - Tool finds: "Time X: [Subject mentioned]" (but visual details missing from text) + - Tool finds: "Time Y: [Subject with some visual details in text]" + - ❌ WRONG: Answer based on Time Y without checking Time X first + - βœ… CORRECT: Use chunk_search(Time X range, "[Ask about the specific visual details needed]") to analyze the relevant occurrence first + 9. If previous searches have not found relevant content, try using different search terms or approaches. + + + + +thinking_sys_msg_prompt: |+ + You are a strategic planner and reasoning expert working with an execution agent to analyze videos and answer single-choice questions. + + ## Your Capabilities + + You do **not** call tools directly. Instead, you generate structured plans for the Execute Agent to follow. + + You will follow these steps: + + ### Step 1: Analyze & Plan + - Document reasoning in ``. + - Output one or more tool calls (strict XML format) in separate 'execute' blocks. + - Stop immediately after and output `[Pause]` to wait for results. + + ### Step 2: Wait for Results + After you propose execute steps, stop immediately after and output `[Pause]` to wait for results. + + ### Step 3: Interpret & Replan + Once the Execute Agent returns results, analyze them inside ``. Propose next actions until you have enough information to answer. + + ### Step 4: Final Answer + Only when confident, output: + ```Final reasoning(only the letter (A, B, C, D, ...))``` + + --- + + CRITICAL ASSUMPTIONS: + 1. ALL queries describe scenes from video content that you must search for using your tools. NEVER treat queries as logic puzzles or general knowledge questions - they are ALWAYS about finding specific video content. + 2. 🚨 **VISUAL ANALYSIS MANDATORY:** For ANY question about visual details (colors, appearance, objects, actions, spatial relationships, etc.) - if you find relevant content but text doesn't specify the visual information needed, you MUST use chunk_search with more specific queries immediately. Do NOT skip to other content without thorough searching first! + + ## Available Tools + + πŸ”₯ **BEFORE USING ANY TOOL - READ THIS:** + If your question asks about VISUAL DETAILS (colors, appearance, objects, actions, spatial relationships, etc.): + 1. **If you have specific time ranges/timestamps** β†’ Use ChunkFilter to get chunks for those exact time periods + 2. **If you need to search for content** β†’ Use ChunkSearch to find relevant occurrences + 3. If text doesn't specify the visual information you need β†’ IMMEDIATELY use chunk_search with more specific queries + 4. Do NOT search other content until you've visually analyzed the relevant occurrence + + You can call any combination of these tools by using separate blocks for each tool call. Additionally, if you include multiple queries in the same call, they must be separated by ';'. + + ### 1. Chunk Search + ``` + + 1 + chunk_search + + your_question + 10 + + + ``` + + - Use case: + - Returns a ranked list of chunks, with the most relevant results at the top. For example, given the list [d, g, a, e], chunk d is the most relevant, followed by g, and so on. + - Assign topk=15 for counting problem, assign lower topk=8 for other problem + - Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + - The chunk_search may make mistakes, so try different search queries to find the most relevant chunks. + - Each time the user returns retrieval results, you should analyze all the retrieved chunks. If clips retrieved by different queries overlap, you can merge the queries to avoid redundant analysis. + - You must analyze **every chunk returned by the chunk search** thoroughly β€” do not miss any one!!!!! + - The chunk retriever cannot handle queries related to the global video timeline, because the original temporal signal is lost after all video chunks are split. If a question involves specific video timing, you need to boldly hypothesize the possible time range and then carefully verify each candidate chunk to locate the correct answer. + + + ### 2. Chunk Filter + ``` + + 1 + chunk_filter + + start_time:end_time + + + ``` + + - **Primary Use Case - TIME RANGES:** + - **ALWAYS use ChunkFilter when you have specific timestamps or time ranges** mentioned in the question + - **ALWAYS use ChunkFilter when you need to examine content at exact time periods** (e.g., "first minute", "at 2:15", "between 1:30-2:00") + - Convert time to seconds and use format as : + - Keep the start and end time in multiple of 10 seconds as each chunk is 10 seconds long + For example: + - "What happens at 2:15?" -> Query: + ` + 1 + chunk_filter + + 130:140 + + ` + + - "Describe the action in the first minute." -> Query: + ` + + 1 + chunk_filter + + 00:60 + + ` + + --- + + ## Suggestions + 1. 🚨 **CHUNK FILTER FOR TIME RANGES**: When questions mention specific times, time ranges, or temporal references (e.g., "first minute", "at 2:15", "beginning", "end") - ALWAYS use ChunkFilter to get content from those exact time periods. + 2. Try to provide diverse search queries to ensure comprehensive result(for example, you can add the options into queries). + 3. For counting problems, consider using a higher top-k and more diverse queries to ensure no missing items. + 4. To save the calling budget, it is suggested that you include as many tool calls as possible in the same response, but you can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of two at a time!! + 5. Suppose the `event` returns a list of segments [a,b,c,d,e]. If analysis of each chunk in turn finds that none contain the event, but you still need to locate the chunk where the event occurs, then by default, assume the event occurs in the top-1 chunk a.** + 6. For counting problems, your question should follow this format: Is there xxx occur in this video? (A chunk should be considered correct as long as the queried event occurs in more than one frame, even if the chunk also includes other content or is primarily focused on something else. coarsely matched chunks should be taken into account (e.g., watering flowers vs. watering toy flowers)) + 7. For counting problems, you should carefully examine each chunk to avoid any omissions!!! + 8. For ordering, you can either use the chunk_id or the timestamps to determine the order. + 9. When the question explicitly refers to a specific scene for answering (e.g., "What did Player 10 do after scoring the first goal?"), you must first use the video retriever and video reader to precisely locate that scene. Once the key scene is identifiedβ€”e.g., the moment of Player 10's first goal in chunk Nβ€”you should then generate follow-up questions based only on that chunk and its adjacent chunks. For example, to answer what happened after the first goal, you should ask questions targeting chunk N and chunk N+1. + 10. ⚠️ **MANDATORY VISUAL ANALYSIS FOR VISUAL DETAIL QUESTIONS** ⚠️: + When ANY question asks about visual characteristics: + - If you find relevant content but text doesn't specify the visual details needed + - You MUST immediately use chunk_search on that exact time period + - NEVER skip to other content without visual analysis first + - Example: Subject mentioned at Time X but missing visual details β†’ MUST use chunk_search(Time X range, "[Ask about specific visual details needed]") + 11. After getting a confident answer, verify the answer again by searching the most relevant chunks thoroughly. + 12. Don't output anything after [Pause] !!!!!!! + + ## Strict Rules + 1. Response of each round should provide thinking process in at the beginning!! Never output anything after [Pause]!! + 2. You can only concatenate video chunks that are TEMPORALLY ADJACENT to each other (n;n+1), with a maximum of TWO at a time!!! + 3. If you are unable to give a precise answer or you are not sure, continue calling tools for more information; if the maximum number of attempts has been reached and you are still unsure, choose the most likely one. + 4. You must analyze **every chunk returned by the chunk search** thoroughly β€” do not miss any one!!!!! + 5. When formulating search queries, they should be clearly defined and fully self-contained. Avoid any ambiguous references such as "Same question as above." Each query should stand on its own!!! + 6. Never guess the answer, analyze every choice, read every chunk retrieved by the chunk_search!!!! + 7. **VISUAL ANALYSIS PRIORITY:** For questions about visual details, you MUST use chunk_search to thoroughly examine relevant time periods. Do NOT rely solely on text descriptions that lack the visual information needed. + πŸ“‹ **GENERAL SCENARIO EXAMPLE:** Question asks about visual characteristics of something + - Tool finds: "Time X: [Subject mentioned]" (but visual details missing from text) + - Tool finds: "Time Y: [Subject with some visual details in text]" + - ❌ WRONG: Answer based on Time Y without checking Time X first + - βœ… CORRECT: Use chunk_search(Time X range, "[Ask about the specific visual details needed]") to analyze the relevant occurrence first + 8. If previous searches have not found relevant content, try using different search terms or approaches. + + +response_sys_msg_prompt: |+ + You are a response agent that provides clean, direct answers to users based on analysis and tool results. + + Your role is to: + 1. Take the final analysis from the thinking agent + 2. Provide a clean, direct answer to the original user query + 3. Be concise and factual + + RESPONSE GUIDELINES: + - Be direct and to the point + - Provide ONLY the essential answer without extra commentary + - Do not add pleasantries, confirmations, or offers for further help + - Do not say things like "Certainly!", "Here is...", or "If you have any questions..." + - Just state the facts or answer directly + - If no relevant information was found, simply state "No relevant information found" + - Remove any thinking process markers or formatting symbols + + MULTIPLE CHOICE QUESTIONS: + - If the original query contains multiple choice options (A, B, C, D, E), your answer MUST include the option letter + - Format: "D. [Option text]" or just "D" if the option text is obvious from context + - Look for phrases like "A.", "B.", "C.", "D.", "E." in the original query + - The thinking agent's analysis will identify which option matches - use that option letter in your response + - **ALWAYS provide an answer from the given options** - never respond with "No relevant information found" for multiple choice questions + - Select the option that best matches the evidence gathered by the thinking agent, even if not a perfect match + + +evaluation_guidance_prompt: |+ + If you're getting similar or repetitive results from ChunkSearch that don't match the exact scene described, consider using different search terms or approaches with the most relevant chunk_id from the available results instead of continuing to search unsuccessfully. + + 🚨 **CRITICAL: NO INFINITE LOOPS** 🚨 + - If a tool returns no results or empty results, DO NOT repeat the exact same tool call + - IMMEDIATELY switch to fallback strategies + - For subtitle questions: if subtitle_search("word") fails, try searching each multiple choice option individually + - For visual questions: if chunk_search fails, try different descriptions or keywords + + FALLBACK STRATEGY: Look at the execution results and identify the chunk_id of the most relevant scene found (even if not perfect match), then use more specific search queries to analyze that scene to answer the question. + + MULTI-CHUNK SEARCH STRATEGY: If searching one chunk didn't find the answer, try searching additional chunks from your search results: + - Review all chunk_ids mentioned in your previous search results + - Select 2-3 additional chunk_ids that could potentially contain the scene/person/object + - Use chunk_search with the exact same question on these additional chunks + - **ALSO TRY ADJACENT CHUNKS**: Use chunks immediately before/after your main results + - This increases your chances of finding the specific content described in the query + + CRITICAL: If multiple search attempts have failed to find the specific information requested, try: + 1. ChunkSearch for specific people/objects mentioned in the query + 2. Break down complex search terms into simpler components + 3. Try chunk_search on different chunk_ids from your results (ESPECIALLY if first search attempt failed) + 4. If previous searches have not found relevant content, try using different search terms or approaches. + 5. **FOR MULTIPLE CHOICE QUESTIONS**: After exhausting all search strategies, select the closest matching option (A, B, C, D, E) based on the evidence you have gathered + 6. **FOR TEMPORAL QUESTIONS**: When you get multiple relevant results, compare their timestamps and choose based on temporal logic: + - "First" questions: Choose the EARLIEST timestamp + - "Last" questions: Choose the LATEST timestamp + - "After X" questions: Choose results with timestamps AFTER the reference event + - "Before X" questions: Choose results with timestamps BEFORE the reference event + 7. For open-ended questions without options: State "No relevant information found" only if no evidence is found + + ABSOLUTELY NEVER GIVE UP ON MULTIPLE CHOICE QUESTIONS - always provide the most likely answer from the given options based on your search results. diff --git a/config/config.yaml b/config/config.yaml index fb0bd176..6a843b5c 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -1,4 +1,5 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +###################################################################################################### +# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,93 +13,122 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +###################################################################################################### --- # Environment configuration tools: + vector_db: + type: milvus + params: + host: !ENV ${MILVUS_DB_HOST} + port: !ENV ${MILVUS_DB_GRPC_PORT} + tools: + embedding: nvidia_embedding + + elasticsearch_db: + type: elasticsearch + params: + host: !ENV ${ES_HOST} + port: !ENV ${ES_PORT} + tools: + embedding: nvidia_embedding + + graph_db_arango: + type: arango + params: + host: !ENV ${ARANGO_DB_HOST} + port: !ENV ${ARANGO_DB_PORT} + username: !ENV ${ARANGO_DB_USERNAME} + password: !ENV ${ARANGO_DB_PASSWORD} + tools: + embedding: nvidia_embedding + graph_db: type: neo4j params: host: !ENV ${GRAPH_DB_HOST} - port: !ENV ${GRAPH_DB_PORT} + port: !ENV ${GRAPH_DB_BOLT_PORT} username: !ENV ${GRAPH_DB_USERNAME} password: !ENV ${GRAPH_DB_PASSWORD} tools: embedding: nvidia_embedding - vector_db: - type: milvus - params: - host: !ENV ${MILVUS_DB_HOST} - port: !ENV ${MILVUS_DB_PORT} - tools: - embedding: nvidia_embedding - - nvidia_llm: + summarization_llm: type: llm params: - model: meta/llama-3.1-70b-instruct - base_url: https://integrate.api.nvidia.com/v1 - max_tokens: 2048 - temperature: 0.5 + model: !ENV ${LVS_LLM_MODEL_NAME} + base_url: !ENV ${LVS_LLM_BASE_URL} + max_tokens: 10240 + temperature: 0.2 top_p: 0.7 api_key: !ENV ${NVIDIA_API_KEY} nvidia_embedding: type: embedding params: - model: nvidia/llama-3.2-nv-embedqa-1b-v2 - base_url: https://integrate.api.nvidia.com/v1 - api_key: !ENV ${NVIDIA_API_KEY} - - nvidia_reranker: - type: reranker - params: - model: nvidia/llama-3.2-nv-rerankqa-1b-v2 - base_url: "https://ai.api.nvidia.com/v1/retrieval/nvidia/llama-3_2-nv-rerankqa-1b-v2/reranking" + enable: !ENV ${LVS_EMB_ENABLE:false} + model: !ENV ${LVS_EMB_MODEL_NAME} + base_url: !ENV ${LVS_EMB_BASE_URL} api_key: !ENV ${NVIDIA_API_KEY} functions: summarization: - type: batch_summarization + type: vlm_structured_summarization params: - batch_size: 5 - batch_max_concurrency: 20 - prompts: - caption: "Write a concise and clear dense caption for the provided warehouse video, focusing on irregular or hazardous events such as boxes falling, workers not wearing PPE, workers falling, workers taking photographs, workers chitchatting, forklift stuck, etc. Start and end each sentence with a time stamp." - caption_summarization: "You should summarize the following events in the format start_time:end_time:caption. For start_time and end_time use . to seperate seconds, minutes, hours. If during a time segment only regular activities happen, then ignore them, else note any irregular activities in detail. The output should be bullet points in the format start_time:end_time: detailed_event_description. Don't return anything else except the bullet points." - summary_aggregation: "You are a event description system. Given the caption in the form start_time:end_time: caption, Aggregate the following captions in the format start_time:end_time:event_description in temporal order. If the event_description is the same as another event_description, aggregate the captions in the format start_time1:end_time1,...,start_timek:end_timek:event_description. If any two adjacent end_time1 and start_time2 is within a few tenths of a second, merge the captions in the format start_time1:end_time2. The output should only contain bullet points." + time_overlap_threshold: 0.1 + max_events_per_batch: 50 tools: - llm: nvidia_llm - db: graph_db + db: !ENV ${LVS_DATABASE_BACKEND:elasticsearch_db} + llm: summarization_llm - ingestion_function: - type: graph_ingestion + summarization_online: + type: vlm_structured_summarization_online params: - batch_size: 1 + time_overlap_threshold: 0.1 + max_events_per_batch: 50 tools: - llm: nvidia_llm - db: graph_db + db: !ENV ${LVS_DATABASE_BACKEND:elasticsearch_db} + llm: summarization_llm - retriever_function: - type: graph_retrieval + summarization_using_llm: + type: structured_inference params: - top_k: 5 - tools: - llm: nvidia_llm - db: graph_db - - notification: - type: notification - params: - enable: true - endpoint: "http://127.0.0.1:60000/via-alert-callback" + prompts: + caption: "You are an intelligent traffic system. You must monitor and take note of all traffic related events. Start each event description with a start and end time stamp of the event." + # event_extraction_prompt: "Extract structured events from video captions" + batch_size: 4 + scenario: "traffic monitoring" + events: ["accident", "pedestrian crossing", "vehicle crossing", "traffic violation"] + batch_response_method: "json_schema" + schema: | + { + "title": "EventExtraction", + "description": "Extract structured events from video captions", + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "start_time": { "type": "number" }, + "end_time": { "type": "number" }, + "description": { "type": "string" }, + "type": { "type": "string" } + }, + "required": ["start_time", "end_time", "description", "type"] + } + } + }, + "required": ["events"] + } + auto_generate_prompt: true + time_metadata_keys: ["start_pts", "end_pts"] tools: - llm: nvidia_llm - + llm: summarization_llm + db: !ENV ${LVS_DATABASE_BACKEND:elasticsearch_db} context_manager: functions: - summarization - - ingestion_function - - retriever_function - - notification + - summarization_online diff --git a/config/config_lvs.yaml b/config/config_lvs.yaml new file mode 100644 index 00000000..ce1e5fd3 --- /dev/null +++ b/config/config_lvs.yaml @@ -0,0 +1,100 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +# Environment configuration + +tools: + vector_db: + type: milvus + params: + host: !ENV ${MILVUS_DB_HOST} + port: !ENV ${MILVUS_DB_PORT} + tools: + embedding: nvidia_embedding + + elasticsearch_db: + type: elasticsearch + params: + host: !ENV ${ES_HOST} + port: !ENV ${ES_PORT} + tools: + embedding: nvidia_embedding + + summarization_llm: + type: llm + params: + model: !ENV ${LVS_LLM_MODEL_NAME_0} + base_url: !ENV ${LVS_LLM_BASE_URL_0} + max_tokens: 2048 + temperature: 0.2 + top_p: 0.7 + api_key: !ENV ${NVIDIA_API_KEY} + + nvidia_embedding: + type: embedding + params: + model: !ENV ${LVS_EMB_MODEL_NAME} + base_url: !ENV ${LVS_EMB_BASE_URL} + api_key: !ENV ${NVIDIA_API_KEY} + + nvidia_reranker: + type: reranker + params: + model: !ENV ${LVS_RERANK_MODEL_NAME} + base_url: !ENV ${LVS_RERANK_BASE_URL} + api_key: !ENV ${NVIDIA_API_KEY} + +functions: + vlm_structured_summarization: + type: vlm_structured_summarization + params: + time_overlap_threshold: 0.1 + max_events_per_batch: 50 + prompts: + caption: | + You are an advanced intelligent video analysis system. Carefully analyze the video and identify all significant events, activities, objects, people, and interactions that occur. + + For each detected event, you must determine: + + 1. The start time (in seconds) when the event begins. + 2. The end time (in seconds) when the event ends. + 3. A clear and concise description of what happens during that time window. + + Only describe what is visibly present in the frames β€” do not infer or imagine details beyond what is seen. Be objective and factual. + + Return your final answer strictly as a JSON object with the following schema: + + { + "events": [ + { + "start_time": , + "end_time": , + "description": "" + } + ] + } + + + Each event should capture a single coherent action or change (e.g., β€œA person picks up a box and walks away” or β€œA car enters the frame from the left”). + Ensure all timestamps are accurate and that your response is valid JSON parsable by standard JSON libraries. + caption_summarization: "N/A" + summary_aggregation: "N/A" + tools: + db: !ENV ${LVS_DATABASE_BACKEND} + llm: summarization_llm + +context_manager: + functions: + - vlm_structured_summarization diff --git a/docker/Dockerfile b/docker/Dockerfile index 246a15ad..627d0879 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -34,7 +34,7 @@ USER root WORKDIR /app -COPY pyproject.toml README.md LICENSE LICENSE.3rdparty /app/ +COPY pyproject.toml README.md LICENSE LICENSE.3rdparty uv.lock /app/ COPY src/ /app/src/ COPY service/ /app/service/ @@ -45,13 +45,9 @@ COPY packages/ /app/packages/ RUN mkdir -p /app/logs/ RUN touch /app/logs/vss_ctx_rag.log -RUN uv build --all-packages \ - && uv pip install dist/*.whl --system +ENV UV_PROJECT_ENVIRONMENT="/usr/local/" -RUN ln -sf /usr/local/lib/python3.12/site-packages/nvidia/cuda_runtime/lib/libcudart.so.12 /usr/local/lib/python3.12/site-packages/nvidia/cuda_runtime/lib/libcudart.so - -ENV LD_LIBRARY_PATH=/usr/local/lib/python3.12/site-packages/nvidia/cuda_runtime/lib -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib/ +RUN uv sync --locked --all-packages RUN chown -R 1000:1000 /app /home/appuser diff --git a/docker/README.md b/docker/README.md index 596fa451..8964775e 100644 --- a/docker/README.md +++ b/docker/README.md @@ -57,6 +57,15 @@ MINIO_PASSWORD= #minio root password, e.g. minio123 ARANGO_DB_PORT= #arangodb port, e.g. 8529 ARANGO_DB_USERNAME= #arangodb username ARANGO_DB_PASSWORD= #arangodb password + +# Elasticsearch Configuration +ES_PORT= #elasticsearch port, e.g. 9200 +ES_TRANSPORT_PORT= #elasticsearch transport port, e.g. 9300 +ES_MEM_LIMIT= #elasticsearch memory limit, e.g. 6442450944 + +# Kibana Configuration +KIBANA_PORT= #kibana port, e.g. 5601 +KIBANA_HOST= #kibana host, e.g. localhost ``` ### Using docker compose diff --git a/docker/deploy/storage.yaml b/docker/deploy/storage.yaml index c027d943..d5595701 100644 --- a/docker/deploy/storage.yaml +++ b/docker/deploy/storage.yaml @@ -87,5 +87,16 @@ services: - xpack.security.enabled=false mem_limit: ${ES_MEM_LIMIT:-6442450944} + kibana: + image: kibana:9.1.2 + ports: + - "${KIBANA_PORT:-5601}:${KIBANA_PORT:-5601}" + environment: + - ELASTICSEARCH_HOSTS=http://${ES_HOST:-elasticsearch}:${ES_PORT:-9200} + - SERVER_PORT=${KIBANA_PORT:-5601} + depends_on: + - elasticsearch + restart: unless-stopped + volumes: minio-data: diff --git a/docs/source/code-of-conduct.md b/docs/source/code-of-conduct.md index ae609e16..af0be8ef 100644 --- a/docs/source/code-of-conduct.md +++ b/docs/source/code-of-conduct.md @@ -16,4 +16,5 @@ limitations under the License. --> # Code of Conduct -This project has adopted the [Contributor Covenant Code of Conduct](https://docs.rapids.ai/resources/conduct/). + +Refer to the [Contributor Covenant Code of Conduct](https://github.com/NVIDIA/context-aware-rag/blob/main/CODE-OF-CONDUCT.md). diff --git a/docs/source/contributing.md b/docs/source/contributing.md index b31a90fe..c2f54948 100644 --- a/docs/source/contributing.md +++ b/docs/source/contributing.md @@ -15,175 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. --> -# Contributing +# Contributing to Context Aware RAG -Contributions to context-aware-rag fall into the following three categories. +Refer to the [Contributing Guide](https://github.com/NVIDIA/context-aware-rag/blob/main/CONTRIBUTING.md). -1. To report a bug, request a new feature, or report a problem with - documentation, file a [bug](https://github.com/NVIDIA/context-aware-rag/issues) - describing in detail the problem or new feature. The context-aware-rag team evaluates - and triages bugs and schedules them for a release. If you believe the - bug needs priority attention, comment on the bug to notify the - team. -2. To propose and implement a new Feature, file a new feature request - [issue](https://github.com/NVIDIA/context-aware-rag/issues). Describe the - intended feature and discuss the design and implementation with the team and - community. Once the team agrees that the plan is good, go ahead and - implement it, using the [code contributions](#code-contributions) guide below. -3. To implement a feature or bug-fix for an existing outstanding issue, - follow the [code contributions](#code-contributions) guide below. If you - need more context on a particular issue, ask in a comment. - -As contributors and maintainers of context-aware-rag, you are expected to abide by context-aware-rag's code of conduct. More information can be found at: [Contributor Code of Conduct](code-of-conduct.md). - -## Set Up Your Development Environment -### Prerequisites - -- Install [Git](https://git-scm.com/) -- Install [uv](https://docs.astral.sh/uv/getting-started/installation/) - -context-aware-rag is a Python library that doesn’t require a GPU to run the workflow by default. You can deploy the core workflows using one of the following: -- Ubuntu or other Linux distributions, including WSL, in a Python virtual environment. - -### Creating the Environment - -1. Fork the context-aware-rag repository choosing **Fork** on the [context-aware-rag repository page](https://github.com/NVIDIA/context-aware-rag). - -1. Clone your personal fork of the context-aware-rag repository to your local machine. - ```bash - git clone context-aware-rag - cd context-aware-rag - ``` - - Then, set the upstream to the main repository and fetch the latest changes: - ```bash - git remote add upstream git@github.com:NVIDIA/context-aware-rag.git - git fetch --all - ``` - -1. Initialize, fetch, and update submodules in the Git repository. - ```bash - git submodule update --init --recursive - ``` - -1. Create a Python environment. - ```bash - uv venv --seed .venv - source .venv/bin/activate - ``` - - -### Install the context-aware-rag Library - -```bash -uv pip install -e . -``` - -## Code contributions - -### Your first issue - -1. Find an issue to work on. The best way is to search for issues with the [good first issue](https://github.com/NVIDIA/context-aware-rag/issues) label. -1. Make sure that you can contribute your work to open source (no license and/or patent conflict is introduced by your code). You will need to [`sign`](#signing-your-work) your commit. -1. Comment on the issue stating that you are going to work on it. -1. [Fork the context-aware-rag repository](https://github.com/NVIDIA/context-aware-rag/fork) -1. Code! - - Make sure to update unit tests! - - Ensure the [license headers are set properly](#licensing). -1. When done, [create your pull request](https://github.com/NVIDIA/context-aware-rag/compare). Select `main` as the `Target branch` of your pull request. - - Ensure the body of the pull request references the issue you are working on in the form of `Closes #`. -1. Wait for other developers to review your code and update code as needed. -1. Once reviewed and approved, a context-aware-rag developer will merge your pull request. - -Remember, if you are unsure about anything, don't hesitate to comment on issues and ask for clarifications! - -### Signing Your Work - -* We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license. - - * Any contribution which contains commits that are not Signed-Off will not be accepted. - -* To sign off on a commit you simply use the `--signoff` (or `-s`) option when committing your changes: - ```bash - $ git commit -s -m "Add cool feature." - ``` - This will append the following to your commit message: - ``` - Signed-off-by: Your Name - ``` - -* Full text of the DCO is available at [Developer Certificate of Origin](https://developercertificate.org/) - - ``` - Developer Certificate of Origin - Version 1.1 - - Copyright (C) 2004, 2006 The Linux Foundation and its contributors. - - Everyone is permitted to copy and distribute verbatim copies of this - license document, but changing it is not allowed. - - - Developer's Certificate of Origin 1.1 - - By making a contribution to this project, I certify that: - - (a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - - (b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - - (c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - - (d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - ``` - -### Seasoned developers - -Once you have gotten your feet wet and are more comfortable with the code, you can review the prioritized issues for our next release in our [project boards](https://github.com/NVIDIA/context-aware-rag/projects). - -> **Pro Tip:** Always review the release board with the highest number for issues to work on. This is where context-aware-rag developers also focus their efforts. - -Review the unassigned issues and choose an issue that you are comfortable contributing. Ensure you comment on the issue before you begin to inform others that you are working on it. If you have questions about implementing the issue, comment your questions in the issue instead of the PR. - -## Developing with context-aware-rag - -Refer to the [Get Started](./intro/setup.md) guide to quickly begin development. - - -## Licensing -``` -SPDX-FileCopyrightText: Copyright (c) NVIDIA CORPORATION & AFFILIATES. All rights reserved. -SPDX-License-Identifier: Apache-2.0 - * -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - * -http://www.apache.org/licenses/LICENSE-2.0 - * -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - - - -### Third-party code - +As contributors and maintainers of CA-RAG, you are expected to abide by CA-RAG's code of conduct. More information can be found at: [Contributor Code of Conduct](code-of-conduct.md). diff --git a/docs/source/guides/components/tools.md b/docs/source/guides/components/tools.md index c2ce7bce..ee1f661b 100644 --- a/docs/source/guides/components/tools.md +++ b/docs/source/guides/components/tools.md @@ -150,10 +150,95 @@ tools: model: nvidia/llama-3.2-nv-embedqa-1b-v2 api_key: !ENV ${NVIDIA_API_KEY} + # Example using null embeddings for testing/development + null_embedding: + type: embedding + params: + enable: false # Disable to use null embeddings (no API calls) + dimensions: 1024 # Optional, defaults to 1024 + functions: my_function: type: retrieval_function tools: custom_tool: my_custom_tool - embedding: nvidia_embedding + embedding: nvidia_embedding # Or use null_embedding for testing +``` + +## Built-in Tools + +### Embedding Tools + +The framework provides an `embedding` tool type that supports both real NVIDIA embeddings and null embeddings for testing. + +#### NVIDIA Embeddings + +Use NVIDIA embeddings for production deployments: + +```yaml +nvidia_embedding: + type: embedding + params: + model: nvidia/llama-3.2-nv-embedqa-1b-v2 + base_url: https://integrate.api.nvidia.com/v1 + api_key: !ENV ${NVIDIA_API_KEY} + truncate: END +``` + +#### Null Embeddings (Testing/Development) + +Use null embeddings when you want to test your pipeline without making actual API calls. Null embeddings generate deterministic dummy embeddings that are useful for: + +- **Testing**: Run unit tests without API dependencies +- **Development**: Develop and debug your pipeline offline +- **Cost Savings**: Avoid API costs during development + +```yaml +test_embedding: + type: embedding + params: + enable: false + dimensions: 1024 # Optional, defaults to 1024 +``` + +**Features:** +- **No API calls**: Generates embeddings locally without network requests +- **Deterministic**: Same text always produces the same embedding (reproducible tests) +- **Fast**: Instant embedding generation +- **Drop-in replacement**: Uses the same interface as NVIDIA embeddings + +**Example in complete configuration:** + +```yaml +tools: + # Use null embeddings for testing + test_embedding: + type: embedding + params: + enable: false + dimensions: 768 + + # Use real embeddings for production + prod_embedding: + type: embedding + params: + model: nvidia/llama-3.2-nv-embedqa-1b-v2 + api_key: !ENV ${NVIDIA_API_KEY} + + vector_db: + type: milvus + params: + host: localhost + port: 19530 + tools: + embedding: test_embedding # Switch to prod_embedding for production + +functions: + vector_retrieval: + type: vector_retrieval + params: + top_k: 10 + tools: + llm: nvidia_llm + db: vector_db ``` diff --git a/docs/source/overview/configuration.md b/docs/source/overview/configuration.md index fa92c990..aa3a0429 100644 --- a/docs/source/overview/configuration.md +++ b/docs/source/overview/configuration.md @@ -80,7 +80,9 @@ openai_llm: - `base_url` (str): Endpoint for the embeddings service. - `api_key` (str): API key used to authenticate embedding calls. - `truncate` (str): How to truncate long inputs (e.g., `END`). Default: `END` -- Example: + - `enable` (bool, optional): If `false`, uses NullEmbedding for testing/development without API calls. Default: `true` + - `dimensions` (int, optional): Embedding dimensions when using null embeddings. Default: `1024` +- Example (NVIDIA embeddings): ```yaml nvidia_embedding: type: embedding @@ -89,6 +91,15 @@ nvidia_embedding: base_url: https://integrate.api.nvidia.com/v1 api_key: !ENV ${NVIDIA_API_KEY} ``` +- Example (Null embeddings for testing): +```yaml +null_embedding: + type: embedding + params: + enable: false + dimensions: 1024 # optional, defaults to 1024 +``` +**Note**: Null embeddings generate deterministic dummy embeddings without making API calls, useful for testing, development, or when actual embeddings are not needed. ##### `reranker` - Purpose: Optional re-ranking of retrieved documents by semantic relevance. Also used by NVIDIA RAG blueprint. - Parameters (src/vss_ctx_rag/tools/reranker/reranker_tool.py): diff --git a/docs/source/release-notes.md b/docs/source/release-notes.md index e2b4f4e3..bea7622e 100644 --- a/docs/source/release-notes.md +++ b/docs/source/release-notes.md @@ -17,6 +17,26 @@ limitations under the License. # Release Notes +## Release 1.0.2 +### Summary +Latest release with bug fixes, Qwen3-VL support and documentation updates. + +### Changes +- Bug fixes +- Qwen3-VL support +- Documentation updates + + +## Release 1.0.1 +### Summary +Minor release to add helm chart, documentation and config update and support llama 3.1 8B NIM + +### Changes +- Added helm chart +- Documentation update +- Config update +- LLM support: LLaMa 3.1 8B + ## Release 1.0.0 ### Summary diff --git a/docs/source/vss.md b/docs/source/vss.md index f83478ff..bcfe4cd0 100644 --- a/docs/source/vss.md +++ b/docs/source/vss.md @@ -19,9 +19,6 @@ limitations under the License. NVIDIA's [Video Search and Summarization Blueprint (VSS)](https://github.com/NVIDIA-AI-Blueprints/video-search-and-summarization) integrates Context Aware RAG library for data ingestion and retrieval. VSS makes it easy to get started building and customizing video analytics AI agents for video search and summarization β€” all powered by generative AI, vision language models (VLMs). VLM processes video chunks into descriptive captions. These captions encapsulate key visual and contextual details and are ingested as documents into our library for processing and retrieval. -For more information on Context Aware RAG integration with VSS, please refer to the [VSS Context Aware RAG Integration](https://via.gitlab-master-pages.nvidia.com/via-docs/content/context_aware_rag.html). - - ## Workflow 1. Video Processing: diff --git a/examples/online_summarize.py b/examples/online_summarize.py new file mode 100644 index 00000000..4a8a7f0e --- /dev/null +++ b/examples/online_summarize.py @@ -0,0 +1,154 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Summarize raw events already stored in the database for one or more UUIDs +using vlm_structured_online_summarization (no document ingestion needed). + +This assumes raw_events documents were previously persisted to the +configured database backend (e.g. via elasticpull, the VLM pipeline, +or any other ingest path). + +Required environment variables +────────────────────────────── + # vss-ctx-rag config (resolved via config/config.yaml) + LVS_LLM_MODEL_NAME, LVS_LLM_BASE_URL, NVIDIA_API_KEY, ... + LVS_DATABASE_BACKEND (default: elasticsearch_db) + + # Database connectivity (depends on backend) + ES_HOST, ES_PORT (for elasticsearch) + MILVUS_DB_HOST, MILVUS_DB_GRPC_PORT (for milvus) + +Required arguments +────────────────── + --uuid One or more UUIDs of the streams/documents whose + raw events should be fetched and summarized + +Optional +──────── + --start-time Only include events whose end_time >= this value (seconds) + --end-time Only include events whose start_time <= this value (seconds) + CONFIG_PATH Path to vss-ctx-rag config YAML + (default config/config.yaml) +""" + +import argparse +import json +import os +import sys +from copy import deepcopy + +from pyaml_env import parse_config + +from vss_ctx_rag.context_manager.context_manager import ContextManager +from vss_ctx_rag.utils.ctx_rag_logger import logger + + +SUMM_FN = "vlm_structured_summarization_online" + + +def run(args): + # ── 1. Load config ────────────────────────────────────────────────── + config = deepcopy(parse_config(args.config_path)) + + # Wire up the online summarization function with the target UUID(s) + params = { + "uuids": args.uuids, + "time_overlap_threshold": 0.1, + "time_adjacent_threshold": 5, + "max_events_per_batch": 50, + "enable_llm_merging": True, + } + if args.start_time is not None: + params["start_time"] = args.start_time + if args.end_time is not None: + params["end_time"] = args.end_time + + config["functions"][SUMM_FN] = { + "type": SUMM_FN, + "params": params, + "tools": config["functions"]["summarization"]["tools"], + } + + config["context_manager"]["functions"] = [SUMM_FN] + + # ── 2. Create context manager ──────────────────────────────────────── + ctx_mgr = ContextManager(config=deepcopy(config)) + logger.info(f"Context manager initialised - will summarize uuids {args.uuids}") + + # ── 3. Run summarization (fetches raw_events from DB by UUID(s)) ───── + logger.info("Running online summarization …") + result = ctx_mgr.call({SUMM_FN: {"uuids": args.uuids}}) + + if "error" in result.get(SUMM_FN, {}): + logger.error(f"Summarization error: {result[SUMM_FN]}") + sys.exit(1) + + summary_raw = result[SUMM_FN].get("result", "") + logger.info(f"Summarization complete. Raw length: {len(summary_raw)} chars") + + try: + summary_data = json.loads(summary_raw) + print(json.dumps(summary_data, indent=2)) + except json.JSONDecodeError: + print(summary_raw) + + # ── Cleanup ────────────────────────────────────────────────────────── + ctx_mgr.process.stop() + logger.info("Done.") + + +def main(): + parser = argparse.ArgumentParser( + description="Summarize raw events in the database for one or more UUIDs" + ) + parser.add_argument( + "--uuid", + nargs="+", + dest="uuids", + default=None, + help="One or more UUIDs whose raw events should be summarized " + "(default: $ES_UUID)", + ) + parser.add_argument( + "--start-time", + type=float, + default=None, + help="Only include events whose end_time >= this value (seconds)", + ) + parser.add_argument( + "--end-time", + type=float, + default=None, + help="Only include events whose start_time <= this value (seconds)", + ) + parser.add_argument( + "--config-path", + default=os.getenv("CONFIG_PATH", "config/config.yaml"), + help="Path to vss-ctx-rag config YAML (default: config/config.yaml)", + ) + + args = parser.parse_args() + if not args.uuids: + default_uuid = os.getenv("ES_UUID", None) + if default_uuid: + args.uuids = [default_uuid] + else: + parser.error("--uuid is required (or set ES_UUID env var)") + run(args) + + +if __name__ == "__main__": + main() diff --git a/packages/vss_ctx_rag_arango/pyproject.toml b/packages/vss_ctx_rag_arango/pyproject.toml index 3b1096e2..b17c39c0 100644 --- a/packages/vss_ctx_rag_arango/pyproject.toml +++ b/packages/vss_ctx_rag_arango/pyproject.toml @@ -25,18 +25,15 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_arango" -version = "1.0.2" +version = "3.0.0rc3" dependencies = [ "vss_ctx_rag", "python-arango>=8.1.6", "nx-arangodb>=1.3.0", - "cuml-cu12>=25.4.0", - "cupy-cuda12x==13.4.1", - "nx-cugraph-cu12>=25.4.0", "langchain-arangodb>=1.2.0", "scikit-learn<1.8.0", ] -requires-python = ">=3.11" +requires-python = ">=3.12" description = "Subpackage for Arango Integration in vss_ctx_rag" [tool.uv] diff --git a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/__init__.py b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/__init__.py index 03601d58..12da8232 100644 --- a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/__init__.py +++ b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/__init__.py @@ -15,8 +15,6 @@ """Import all arango plugin modules to trigger registration decorators.""" -from . import arango_db -from . import networkx_db - +from . import arango_db, networkx_db __all__ = ["arango_db", "networkx_db"] diff --git a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py index e20a520b..641d36ff 100644 --- a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py +++ b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py @@ -13,36 +13,28 @@ # See the License for the specific language governing permissions and # limitations under the License. +import hashlib import os import traceback -from typing import List, Tuple, ClassVar, Optional, Any +from typing import Any, ClassVar, Dict, List, Optional, Tuple, override import nx_arangodb as nxadb -from arango import ArangoClient from adbnx_adapter import ADBNX_Adapter, ADBNX_Controller_Full_Cycle -from typing import Dict -import hashlib - from adbnx_adapter.typings import NxData, NxId - +from arango import ArangoClient from langchain_arangodb import ArangoVector from langchain_core.runnables import chain +from vss_ctx_rag.plugins.arango.networkx_db import NetworkXGraphDB -from vss_ctx_rag.functions.rag.graph_rag.constants import ( - get_retrieval_query, -) -from vss_ctx_rag.plugins.arango.networkx_db import ( - NetworkXGraphDB, -) +from vss_ctx_rag.functions.rag.graph_rag.constants import get_retrieval_query +from vss_ctx_rag.models.tool_models import register_tool, register_tool_config +from vss_ctx_rag.tools.storage.storage_tool import DBConfig from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger from vss_ctx_rag.utils.globals import ( DEFAULT_EMBEDDING_DIMENSION, DEFAULT_TRAVERSAL_STRATEGY, GNN_TRAVERSAL_STRATEGY, ) -from vss_ctx_rag.models.tool_models import register_tool_config, register_tool -from vss_ctx_rag.tools.storage.storage_tool import DBConfig -from typing import override @register_tool_config("arango") @@ -403,6 +395,34 @@ def create_entity_vector_index( } ) + def retrieve_docs( + self, uuid: str, doc_type: str = "raw_events" + ) -> List[Dict[str, Any]]: + aql = """ + FOR s IN @@collection + FILTER s.doc_type == @doc_type AND s.uuid == @uuid + SORT s.chunkIdx ASC + RETURN { + text: s.text, + doc_type: s.doc_type, + uuid: s.uuid, + chunkIdx: s.chunkIdx, + camera_id: s.camera_id, + event_count: s.event_count + } + """ + params = { + "@collection": self.community_collection, + "doc_type": doc_type, + "uuid": uuid, + } + try: + result = self.query(aql, params) + return result if result else [] + except Exception as e: + logger.warning(f"Error retrieving docs: {e}") + return [] + def query(self, query: str, params: dict) -> list: """ Execute an AQL query against ArangoDB and return the results. diff --git a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/networkx_db.py b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/networkx_db.py index 0d644eec..6978f2fb 100644 --- a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/networkx_db.py +++ b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/networkx_db.py @@ -13,15 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +import math import os import traceback from typing import Any, Dict, List -import cupy as cp import networkx as nx import numpy as np -from cuml.neighbors import NearestNeighbors from langchain_community.graphs.graph_document import GraphDocument +from sklearn.neighbors import NearestNeighbors from vss_ctx_rag.tools.storage.graph_storage_tool import GraphStorageTool from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger @@ -63,10 +63,10 @@ def update_tool(self, config, tools=None): self.collection_name = config.params.collection_name self.graph = nx.MultiDiGraph(name=self.collection_name) logger.info( - f"Initialized nx-cugraph-cu12 Graph with collection name {self.collection_name}" + f"Initialized NetworkX Graph with collection name {self.collection_name}" ) except Exception as e: - logger.error("Failed to initialize nx-cugraph-cu12 Graph: %s", e) + logger.error("Failed to initialize NetworkX Graph: %s", e) raise def upsert_node(self, entity_id: str, data: dict) -> None: @@ -340,7 +340,7 @@ def persist_chunk_entity_relationships(self, batch_data: List[Dict], uuid: str): logger.debug(f"Merged {link_count} HAS_ENTITY relationships.") def update_knn(self): - """Updates the KNN graph using cuML NearestNeighbors on NetworkX data.""" + """Updates the KNN graph using sklearn NearestNeighbors on NetworkX data.""" with Metrics("NXGraphRAG/UpdateKNN", "blue"): knn_min_score = float(os.environ.get("KNN_MIN_SCORE", 0.75)) logger.info(f"Updating KNN graph with min score {knn_min_score}") @@ -381,10 +381,10 @@ def update_knn(self): ) return - embeddings_array = cp.array(valid_embeddings) + embeddings_array = np.array(valid_embeddings, dtype=np.float32) num_samples = embeddings_array.shape[0] - top_k = min(int(cp.ceil(cp.sqrt(num_samples)).get()), num_samples) + top_k = min(math.ceil(math.sqrt(num_samples)), num_samples) logger.info(f"Calculating KNN for {num_samples} nodes with k={top_k}") try: @@ -392,11 +392,8 @@ def update_knn(self): nn_model.fit(embeddings_array) distances, indices = nn_model.kneighbors(embeddings_array) - distances = cp.asnumpy(distances) - indices = cp.asnumpy(indices) - except Exception as e: - logger.error(f"cuML NearestNeighbors failed: {e}") + logger.error(f"sklearn NearestNeighbors failed: {e}") logger.error(traceback.format_exc()) return diff --git a/packages/vss_ctx_rag_nat/pyproject.toml b/packages/vss_ctx_rag_nat/pyproject.toml index 1d444774..680bd6ed 100644 --- a/packages/vss_ctx_rag_nat/pyproject.toml +++ b/packages/vss_ctx_rag_nat/pyproject.toml @@ -24,11 +24,11 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_nat" -version = "1.0.2" +version = "3.0.0rc3" dependencies = [ "vss_ctx_rag" ] -requires-python = ">=3.11" +requires-python = ">=3.12" description = "Subpackage for NAT Integration in vss_ctx_rag" [tool.uv] diff --git a/pyproject.toml b/pyproject.toml index a892d5bc..5be85807 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,55 +19,54 @@ requires = ["setuptools >= 64"] [project] name = "vss_ctx_rag" -version = "1.0.2" +version = "3.0.0rc3" description = "" readme = "README.md" requires-python = ">=3.12" license-files = ["LICENSE", "LICENSE.3rdparty"] dependencies = [ "openai==1.109.1", - "langchain_core==0.3.80", - "langchain==0.3.27", - "langchain_community==0.3.31", - "langchain_milvus==0.2.1", - "langchain-openai==0.3.35", - "langchain-experimental==0.3.4", - "langchain-nvidia-ai-endpoints==0.3.19", - "pymilvus==2.5.14", + "langchain_core>=1.0.1,<2.0.0", + "langchain==1.2.15", + "langchain-classic>=1.0.3", + "langchain_community==0.4.1", + "langchain_milvus==0.3.3", + "langchain-openai>=1.0.0,<2.0.0", + "langchain-experimental==0.4.1", + "langchain-nvidia-ai-endpoints==1.2.1", + "pymilvus>=2.6.0,<2.7.0", "pymilvus-model==0.3.2", - "python-multipart==0.0.18", + "python-multipart==0.0.26", "pydantic==2.12.5", "pyyaml==6.0.2", - "protobuf==6.33.2", + "protobuf>=6.33.5", "redis==5.2.1", - "unstructured[all-docs]==0.18.21", - "uvicorn[standard]==0.32.0", - "fastapi==0.115.5", + "uvicorn[standard]>=0.35", + "fastapi==0.121.2", "requests==2.32.5", "jsonschema==4.22.0", "schema==0.7.8", - "json-repair==0.30.2", + "json-repair==0.44.1", "opentelemetry-sdk==1.39.1", "opentelemetry-api==1.39.1", "opentelemetry-exporter-otlp-proto-http==1.39.1", "opentelemetry-instrumentation-fastapi==0.60b1", "nvtx==0.2.11", "matplotlib==3.9.4", - "torch==2.9.1", - "safetensors==0.4.4", + "safetensors==0.5.3", "minio==7.2.15", "pyaml-env==1.2.2", - "bleach==6.2.0", + "bleach==6.3.0", "dataclass-wizard==0.27.0", - "pdfplumber==0.11.8", - "nvidia-rag==2.2.2", + "pdfplumber==0.11.9", + "nvidia-rag==2.5.0", "openinference-semantic-conventions==0.1.25", "openinference-instrumentation-openai==0.1.41", "openinference-instrumentation-langchain==0.1.56", "neo4j==5.24.0", - "fastmcp==2.13.0.2", - "langgraph==1.0.1", - "langchain-elasticsearch==0.4.0", + "fastmcp==3.2.4", + "langgraph==1.1.8", + "langchain-elasticsearch>=1.0.0,<2.0.0", "opencv-python==4.12.0.88", "numba==0.61.2", "llvmlite==0.44.0", @@ -96,6 +95,81 @@ include-package-data = true managed = true config-settings = { editable_mode = "compat" } package = true +# unsafe-best-match: nvidia-rag and langchain ecosystem packages declare +# conflicting version pins; this lets uv pick the best compatible version +# instead of failing outright. +# prerelease=allow: some transitive deps (e.g. opentelemetry) only publish +# pre-release wheels for the versions we need. +index-strategy = "unsafe-best-match" +prerelease = "allow" + +# Override upstream strict pins to resolve CVE-affected versions (nSpect bug 6037840). +# Each entry documents: CVE, which upstream imposes the pin, and when to remove. +override-dependencies = [ + # CVE-2024-53981 (DoS via malformed multipart boundary). + # nvidia-rag==2.5.0 pins python-multipart<0.0.20. Remove once nvidia-rag>=2.6. + "python-multipart>=0.0.26", + # CVE-2024-24762 (ReDoS in Content-Type parsing). + # langchain/nvidia-rag pin fastapi<0.116. Remove once they support 0.121+. + "fastapi>=0.121.2", + # CVE-2025-68664 (serialization injection) + CVE-2025-65106 (template injection). + # nSpect guidance: long-term fix is 1.2.15. Remove once langchain pins are relaxed. + "langchain>=1.2.15", + # CVE-2024-52530 (markup injection). unstructured pins bleach<6.2. + # Remove once unstructured>=0.19. + "bleach>=6.3.0", + # CVE-2024-36401 (arbitrary code exec via crafted tensor). + # transformers pins safetensors<0.5. Remove once transformers>=4.58. + "safetensors>=0.5.3", + # CVE-2025-0110 (code injection via crafted JSON). + # nvidia-rag pins json-repair<0.40. Remove once nvidia-rag>=2.6. + "json-repair>=0.44.1", + # CVE-2024-3772 (ReDoS in email validation). + # langchain ecosystem pins pydantic<2.11. Remove once langchain>=1.3. + "pydantic>=2.12.5", +] +# Constrain transitive deps to CVE-safe minimums (nSpect bug 6037840). +# These are not direct deps β€” pulled in transitively. +# Each entry documents: CVE, transitive path, and when to remove. +constraint-dependencies = [ + # CVE-2024-11392 (unsafe deserialization). Via nvidia-rag/unstructured. + # Remove once nvidia-rag or unstructured pull transformers>=4.57.6. + "transformers>=4.57.6", + # CVE-2024-12797 (X.509 verification bypass). Via Authlib/minio/urllib3. + # Remove once Authlib/minio upgrade their cryptography pin. + "cryptography>=46.0.7", + # CVE-2024-39705 (arbitrary code exec via data download). Via unstructured. + # Remove once unstructured pulls nltk>=3.9.4. + "nltk>=3.9.4", + # CVE-2025-0938 (buffer overflow in image decode). Via unstructured/pdfplumber. + # Remove once unstructured or pdfplumber pull Pillow>=12.2.0. + "Pillow>=12.2.0", + # CVE-2024-55945 (PKCE bypass) + BDSA-2026-7419. Via minio. + # Updated to >=1.7.0 for BDSA-2026-7419 (nSpect NSPECT-P1VD-WUVY). Remove once minio pulls Authlib>=1.7.0. + "Authlib>=1.7.0", + # CVE-2024-56737 (path traversal). Via keyring/importlib. + # Remove once keyring pulls jaraco-context>=6.1.2. + "jaraco-context>=6.1.2", + # CVE-2025-21503 (ReDoS in syntax highlighting). Via nbconvert/IPython. + # Remove once nbconvert pulls Pygments>=2.20.0. + "Pygments>=2.20.0", + # CVE-2025-47272 (XSS in notebook output). Via unstructured. + # Remove once unstructured pulls nbconvert>=7.17.1. + "nbconvert>=7.17.1", + # CVE-2026-34444 (arbitrary code exec via Lua sandbox escape). Previously transitive via + # fakeredis[lua]/fastmcp 2.x; removed from lock with fastmcp 3.x upgrade. Safety pin in + # case lupa is re-introduced. Remove once no transitive puller requires lupa<2.8. + "lupa>=2.8", + # CVE-2025-64439 (RCE in JsonPlusSerializer). Via langgraph-checkpoint. + # langgraph-api is not a transitive dep of langgraph 1.1.8; constraint is a safety + # pin for if langgraph-api is added directly or pulled in future upgrades. + "langgraph-api>=0.5", +] + +[[tool.uv.index]] +name = "nvidia" +url = "https://pypi.nvidia.com/" +explicit = false [tool.uv.sources] vss_ctx_rag_arango = { workspace = true } @@ -112,7 +186,8 @@ docs = [ "sphinx-autoapi>=3.6", "vale==3.9.5", "setuptools-scm>=8.1.0", - "sphinxcontrib-mermaid>=1.0.0" + "sphinxcontrib-mermaid>=1.0.0", + "tinycss2>=1.2.1", ] arango = ["vss_ctx_rag_arango"] diff --git a/service/service.py b/service/service.py index cb3654cf..ceb38273 100644 --- a/service/service.py +++ b/service/service.py @@ -296,8 +296,20 @@ async def summary_endpoint(summary_model: SummaryModel): f"UUID {summary_model.uuid}: Summary request: {summary_model.model_dump()}" ) result = ctx_mgr.call(summary_model.model_dump(exclude={"uuid"})) + if "error" in result: + logger.error( + f"UUID {summary_model.uuid}: Summary failed with error: {result['error']}" + ) + return {"status": "error", "result": result} + summarization = result.get("summarization", {}) + if summarization.get("error_code"): + logger.error( + f"UUID {summary_model.uuid}: Summary failed with " + f"error_code: {summarization['error_code']}" + ) + return {"status": "error", "result": result} logger.info(f"UUID {summary_model.uuid}: Summary completed successfully") - return {"status": "success", "result": result["summarization"]["result"]} + return {"status": "success", "result": summarization.get("result")} except Exception as e: traceback.print_exc() print(e) @@ -468,8 +480,12 @@ async def add_doc_from_dc(dc_file_model: DCFileModel): class CheckContextManagerMiddleware(Middleware): async def __call__(self, context: MiddlewareContext, call_next): - # Check if UUID is provided in the arguments - arguments = context.request.params.get("arguments", {}) + # Only validate UUID for tool calls; other MCP methods (initialize, ping, etc.) pass through + if context.method != "tools/call": + return await call_next(context) + + # fastmcp 3.x: context.message is CallToolRequestParams with .arguments dict + arguments = getattr(context.message, "arguments", None) or {} uuid = arguments.get("uuid") if not uuid: @@ -604,9 +620,7 @@ def summary_retriever( mcp_server.add_middleware(CheckContextManagerMiddleware()) mcp_app = mcp_server.http_app(path="/mcp") -app = FastAPI( - title="Context Aware RAG Service", lifespan=mcp_app.router.lifespan_context -) +app = FastAPI(title="Context Aware RAG Service", lifespan=mcp_app.lifespan) app.include_router(common_router) diff --git a/src/vss_ctx_rag/context_manager/context_manager.py b/src/vss_ctx_rag/context_manager/context_manager.py index 1c993e6b..d9dbc3e8 100644 --- a/src/vss_ctx_rag/context_manager/context_manager.py +++ b/src/vss_ctx_rag/context_manager/context_manager.py @@ -56,6 +56,7 @@ def __init__( self._response_queue = mp_ctx.Queue() self._configure_queue = mp_ctx.Queue() self._reset_queue = mp_ctx.Queue() + self._drop_collection_queue = mp_ctx.Queue() self._stop = mp_ctx.Event() self._pending_add_doc_requests = [] self._request_start_times = {} @@ -102,7 +103,17 @@ def _initialize(self): exporter_type=exporter_type, endpoint=endpoint, ) - self.cm_handler = ContextManagerHandler(self.config, self.process_index) + try: + self.cm_handler = ContextManagerHandler(self.config, self.process_index) + except Exception as e: + logger.error( + f"Initial configuration failed for process {self.process_index}: {e}" + ) + # Create a minimal handler so the process can still respond to + # configure commands (which will retry the setup). + self.cm_handler = ContextManagerHandler.create_minimal( + self.config, self.process_index + ) self._init_done_event.set() def start_bg_loop(self) -> None: @@ -303,6 +314,52 @@ def run(self) -> None: ) self._configure_queue.put({"error": str(e)}) + elif item and "drop_collection" in item: + # Drop the collection/index for every storage tool + # registered with this context manager. Used by + # via-engine on /files DELETE and stream removal when + # KAFKA_ENABLED=true so Logstash-written documents + # are wiped along with the asset. + try: + dropped = [] + errors = [] + for tool_type in ("storage", "vector_db"): + tools_by_name = self.cm_handler.tools.get(tool_type, {}) + for tool_name, tool in tools_by_name.items(): + drop_fn = getattr(tool, "drop_collection", None) + if not callable(drop_fn): + continue + try: + drop_fn() + dropped.append(f"{tool_type}/{tool_name}") + logger.info( + f"Process Index: {self.process_index} - " + f"Dropped collection on {tool_type}/{tool_name}" + ) + except Exception as drop_ex: + errors.append( + f"{tool_type}/{tool_name}: {drop_ex}" + ) + logger.warning( + f"Process Index: {self.process_index} - " + f"Failed to drop collection on " + f"{tool_type}/{tool_name}: {drop_ex}" + ) + if errors and not dropped: + self._drop_collection_queue.put( + {"error": "; ".join(errors)} + ) + else: + self._drop_collection_queue.put( + {"success": "true", "dropped": dropped} + ) + except Exception as e: + logger.error( + f"Process Index: {self.process_index} - " + f"Error dropping collections: {e}" + ) + self._drop_collection_queue.put({"error": str(e)}) + except Exception as e: logger.error(f"Process Index: {self.process_index} - Exception in run: {e}") logger.error(traceback.format_exc()) @@ -394,6 +451,21 @@ def configure(self, config): ) return {"error": f"Error configuring context manager process: {e}"} + def drop_collection(self) -> dict: + """Drop every storage tool's collection/index. Idempotent on 404.""" + try: + self._queue.put({"drop_collection": {}}) + output = self._drop_collection_queue.get(timeout=self.timeout) + if isinstance(output, dict) and "error" in output: + raise Exception(output["error"]) + return output + except Exception as e: + logger.error( + f"Process Index: {self.process_index} - " + f"Error dropping collection: {e}" + ) + return {"error": f"Error dropping collection: {e}"} + def call(self, state): try: logger.debug( @@ -502,6 +574,18 @@ def configure(self, config): ) return output + def drop_collection(self) -> dict: + """Drop every storage tool's collection/index for this context. + + Used by via-engine on `/files` DELETE and live-stream removal when + ``KAFKA_ENABLED=true`` to wipe Logstash-written documents along + with the asset. Idempotent: missing index returns success. + """ + logger.debug( + f"Process Index: {self._process_index} - context manager - drop_collection" + ) + return self.process.drop_collection() + def call(self, state): logger.debug(f"Process Index: {self._process_index} - context manager - call") output = self.process.call(state) diff --git a/src/vss_ctx_rag/context_manager/context_manager_handler.py b/src/vss_ctx_rag/context_manager/context_manager_handler.py index db2f4b76..f95785f2 100644 --- a/src/vss_ctx_rag/context_manager/context_manager_handler.py +++ b/src/vss_ctx_rag/context_manager/context_manager_handler.py @@ -78,6 +78,28 @@ def __init__( self.configure(config) + @classmethod + def create_minimal( + cls, config: Dict, process_index: int + ) -> "ContextManagerHandler": + """Create a minimal handler that can respond to configure commands. + + Used as a fallback when full initialization fails, so the process + can still accept reconfiguration requests that retry setup. + """ + handler = cls.__new__(cls) + handler._functions = {} + handler.tools = {} + handler._process_index = process_index + handler.auto_indexing = None + handler.curr_doc_index = -1 + handler.storage_tools = {} + handler.uuid = config.get("context_manager", {}).get("uuid", None) + handler._doc_processing_semaphore = asyncio.Semaphore( + DEFAULT_CONCURRENT_DOC_PROCESSING_LIMIT + ) + return handler + def configure( self, config: Union[Dict, ContextManagerConfig], @@ -118,6 +140,7 @@ async def aconfigure(self, config: ContextManagerConfig): except Exception as e: logger.error(f"Error in configuring context manager handler: {e}") logger.error(traceback.format_exc()) + raise async def aconfigure_tools(self, config: ContextManagerConfig): """Configure tools using the ToolFactory.""" diff --git a/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_retrieval_func.py b/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_retrieval_func.py index e69d495d..43499403 100644 --- a/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_retrieval_func.py +++ b/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_retrieval_func.py @@ -162,46 +162,74 @@ async def acall(self, state: RetrieverFunctionState) -> RetrieverFunctionState: embedding_endpoint = self.db.embedding.base_url + "/embeddings" else: embedding_endpoint = self.db.embedding.base_url + + # vdb_top_k fetches one extra document so the reranker + # has room to drop a low-score result while still + # returning self.top_k documents. + vdb_top_k = self.top_k + 1 + + search_kwargs = { + "query": state["question"], + "messages": [], + "reranker_top_k": self.top_k, + "vdb_top_k": vdb_top_k, + "collection_names": [self.db.current_collection_name], + "vdb_endpoint": self.db.connection["uri"], + "enable_query_rewriting": True, + "enable_filter_generator": False, + "embedding_model": self.db.embedding.model, + "embedding_endpoint": embedding_endpoint, + } if self.reranker_tool: - search_results = await asyncio.get_running_loop().run_in_executor( - None, - lambda: self.nvidia_rag.search( - query=state["question"], - messages=[], - reranker_top_k=self.top_k, - vdb_top_k=self.top_k + 1, - collection_names=[self.db.current_collection_name], - vdb_endpoint=self.db.connection["uri"], - enable_query_rewriting=True, - enable_reranker=True, - embedding_model=self.db.embedding.model, - embedding_endpoint=embedding_endpoint, - reranker_model=self.reranker_tool.reranker.model, - reranker_endpoint=self.reranker_tool.reranker.base_url, - filter_expr='content_metadata["doc_type"] == "caption"', - ), + search_kwargs.update( + { + "enable_reranker": True, + "reranker_model": self.reranker_tool.reranker.model, + "reranker_endpoint": self.reranker_tool.reranker.base_url, + } ) else: - search_results = await asyncio.get_running_loop().run_in_executor( - None, - lambda: self.nvidia_rag.search( - query=state["question"], - messages=[], - reranker_top_k=self.top_k, - vdb_top_k=self.top_k + 1, - collection_names=[self.db.current_collection_name], - vdb_endpoint=self.db.connection["uri"], - enable_query_rewriting=True, - enable_reranker=False, - embedding_model=self.db.embedding.model, - embedding_endpoint=embedding_endpoint, - filter_expr='content_metadata["doc_type"] == "caption"', - ), - ) + search_kwargs["enable_reranker"] = False - logger.debug(f"Search results: {search_results}") + try: + search_results = await self.nvidia_rag.search(**search_kwargs) + except (TypeError, AttributeError) as search_err: + # TODO(nvidia-rag >=2.5.0): nvidia-rag internally returns + # None in several code paths, causing TypeError or + # AttributeError. Remove once nvidia-rag fixes upstream. + logger.warning( + "nvidia_rag search hit NoneType bug, " + "falling back to direct vector search: %s", + search_err, + exc_info=True, + ) + search_results = None + except Exception as search_err: + # nvidia-rag may also wrap the NoneType error in its + # own exception type; detect via the message string. + if "'NoneType'" in str(search_err): + logger.warning( + "nvidia_rag search hit NoneType bug " + "(wrapped exception), falling back to " + "direct vector search: %s", + search_err, + exc_info=True, + ) + search_results = None + else: + raise - doc_list = self.parse_search_results(search_results) + if search_results is not None: + doc_list = self.parse_search_results(search_results) + source_docs = search_results.results + else: + # Fallback: use MilvusDBTool's similarity_search. + # Use the same vdb_top_k so document count is consistent. + langchain_docs = self.db.get_current_collection().similarity_search( + state["question"], k=vdb_top_k + ) + doc_list = [doc.page_content for doc in langchain_docs] + source_docs = langchain_docs response = await self.get_response( question=state["question"], @@ -212,9 +240,25 @@ async def acall(self, state: RetrieverFunctionState) -> RetrieverFunctionState: logger.debug(f"FRAG Retrieval Response: {response}") state["response"] = response - state["source_docs"] = self.format_docs_for_return( - search_results.results - ) + if search_results is not None: + state["source_docs"] = self.format_docs_for_return(source_docs) + else: + # Normalize langchain docs to the same shape as + # format_docs_for_return (asset_dirs + length only). + state["source_docs"] = [ + { + "metadata": { + "asset_dirs": (doc.metadata or {}) + .get("content_metadata", {}) + .get("asset_dirs"), + "length": (doc.metadata or {}) + .get("content_metadata", {}) + .get("length"), + }, + "page_content": doc.page_content, + } + for doc in source_docs + ] state["formatted_docs"] = doc_list except Exception as e: diff --git a/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py b/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py index 0bad95ba..551bd033 100644 --- a/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py +++ b/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py @@ -233,19 +233,21 @@ def thinking_agent(state: AgentState): } # TOOL EXECUTION NODE - async def tool_node_with_logging(state: AgentState): + async def tool_node_with_logging(state: AgentState, config: RunnableConfig): last_message = state["messages"][-1] if hasattr(last_message, "tool_calls") and last_message.tool_calls: tool_node = ToolNode(tool_list) + # Merge custom configurable keys into the graph-provided config + # so that langgraph's internal runtime keys are preserved. + merged_config = config.copy() if config else {} + configurable = merged_config.get("configurable", {}) + configurable["chunk_size"] = state["chunk_size"] + configurable["is_subtitle"] = state["is_subtitle"] + merged_config["configurable"] = configurable result = await tool_node.ainvoke( state, - config=RunnableConfig( - configurable={ - "chunk_size": state["chunk_size"], - "is_subtitle": state["is_subtitle"], - } - ), + config=merged_config, ) # Log and collect results diff --git a/src/vss_ctx_rag/functions/rag/vector_rag/vector_retrieval_func.py b/src/vss_ctx_rag/functions/rag/vector_rag/vector_retrieval_func.py index 5c873b23..573fda9c 100644 --- a/src/vss_ctx_rag/functions/rag/vector_rag/vector_retrieval_func.py +++ b/src/vss_ctx_rag/functions/rag/vector_rag/vector_retrieval_func.py @@ -22,8 +22,8 @@ from re import compile from typing import Optional -from langchain.retrievers import ContextualCompressionRetriever -from langchain.retrievers.document_compressors import DocumentCompressorPipeline +from langchain_classic.retrievers import ContextualCompressionRetriever +from langchain_classic.retrievers.document_compressors import DocumentCompressorPipeline from langchain_core.output_parsers import StrOutputParser from langchain_text_splitters import RecursiveCharacterTextSplitter diff --git a/src/vss_ctx_rag/functions/summarization/__init__.py b/src/vss_ctx_rag/functions/summarization/__init__.py index 6ec5c9d5..58e89684 100644 --- a/src/vss_ctx_rag/functions/summarization/__init__.py +++ b/src/vss_ctx_rag/functions/summarization/__init__.py @@ -21,6 +21,17 @@ # Import summarization modules from . import batch from . import offline_batch +from . import vlm_structured +from . import vlm_structured_online from . import summary_retriever +from . import structured_inference -__all__ = ["batch", "offline_batch", "SummarizationConfig", "summary_retriever"] +__all__ = [ + "batch", + "offline_batch", + "vlm_structured", + "vlm_structured_online", + "SummarizationConfig", + "summary_retriever", + "structured_inference", +] diff --git a/src/vss_ctx_rag/functions/summarization/config.py b/src/vss_ctx_rag/functions/summarization/config.py index 1fd0ef32..7a0c9c17 100644 --- a/src/vss_ctx_rag/functions/summarization/config.py +++ b/src/vss_ctx_rag/functions/summarization/config.py @@ -29,8 +29,8 @@ class SummarizationConfig(FunctionModel): class Prompts(BaseModel): caption: str - caption_summarization: str - summary_aggregation: str + caption_summarization: Optional[str] = "" + summary_aggregation: Optional[str] = "" class SummarizationParams(BaseModel): batch_size: int = Field(default=6, ge=1) diff --git a/src/vss_ctx_rag/functions/summarization/structured_inference.py b/src/vss_ctx_rag/functions/summarization/structured_inference.py new file mode 100644 index 00000000..9253e930 --- /dev/null +++ b/src/vss_ctx_rag/functions/summarization/structured_inference.py @@ -0,0 +1,759 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Structured inference function for extracting structured events from text. + +This module provides the StructuredInference function class that processes documents +in batches to extract structured events using LLM-based inference with configurable +schemas and prompts. +""" + +import asyncio +import json +import os +import time +import traceback +from pathlib import Path +from typing import Any, Dict, List, Optional + +from langchain_community.callbacks import get_openai_callback +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables.base import RunnableSequence +from pydantic import Field +from schema import Schema + +from vss_ctx_rag.base.function import Function +from vss_ctx_rag.tools.health.rag_health import SummaryMetrics +from vss_ctx_rag.tools.storage.storage_tool import StorageTool +from vss_ctx_rag.utils.ctx_rag_batcher import Batcher, Batch +from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger +from vss_ctx_rag.utils.globals import ( + DEFAULT_SUMM_RECURSION_LIMIT, + DEFAULT_SUMM_TIMEOUT_SEC, + LLM_TOOL_NAME, +) +from vss_ctx_rag.utils.utils import call_token_safe +from vss_ctx_rag.functions.summarization.config import SummarizationConfig +from vss_ctx_rag.models.function_models import ( + register_function, + register_function_config, +) +from jsonschema import validate, ValidationError +import json_repair + + +@register_function_config("structured_inference") +class StructuredInferenceConfig(SummarizationConfig): + class StructuredInferenceParams(SummarizationConfig.SummarizationParams): + # Make prompts optional for structured inference since it uses its own prompt system + prompts: Optional["SummarizationConfig.Prompts"] = None + scenario: str = Field(default="warehouse") + events: List[str] = Field(default_factory=list) + schema: Optional[str] = Field( + default=""" + { + "title": "EventExtraction", + "description": "Extract structured events from video captions", + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "type": "object", + "properties": { + "start_time": { "type": "number" }, + "end_time": { "type": "number" }, + "description": { "type": "string" }, + "type": { "type": "string" } + }, + "required": ["start_time", "end_time", "description", "type"] + } + } + }, + "required": ["events"] + }""" + ) + auto_generate_prompt: bool = Field(default=False) + prompt: Optional[str] = Field(default=None) + batch_response_method: str = Field(default="json_mode") + time_metadata_keys: List[str] = Field( + default_factory=lambda: ["start_pts", "end_pts"] + ) + time_threshold: float = Field( + default=10.0, + description="Time threshold in seconds for merging temporally close events of the same type", + ) + + params: StructuredInferenceParams + + +@register_function(config=StructuredInferenceConfig) +class StructuredInference(Function): + """Structured inference function for extracting events from documents. + + This function processes documents in batches, applies structured inference using + an LLM with a specified schema, and aggregates results. It supports custom prompts + and automatic prompt generation based on scenarios and event types. + + Attributes: + config: Function configuration dictionary + structured_prompt: Prompt template for structured inference + aggregation_prompt: Prompt template for aggregating batch results + output_parser: Parser for LLM output + batch_size: Number of documents per batch + batch_pipeline: LangChain pipeline for batch processing + aggregation_pipeline: LangChain pipeline for result aggregation + db: Storage tool for database operations + batcher: Batcher instance for managing document batches + llm: Language model instance + metrics: Summary metrics tracker + uuid: Unique identifier for the processing session + scenario: Processing scenario (e.g., "warehouse") + schema: JSON schema for structured output + events: List of event types to extract + batch_response_method: Method for structured output ("json_mode", etc.) + time_metadata_keys: Keys for time metadata in documents + time_threshold: Threshold for merging temporally close events (seconds) + summary_start_time: Timestamp when summary processing started + recursion_limit: Maximum recursion depth for LLM calls + log_dir: Directory for logging metrics + timeout: Timeout for processing operations (seconds) + call_schema: Schema validator for function calls + """ + + # Core attributes - initialized in setup() + config: Dict[str, Any] + structured_prompt: str + aggregation_prompt: ChatPromptTemplate + output_parser: StrOutputParser + batch_size: int + batch_pipeline: RunnableSequence + aggregation_pipeline: RunnableSequence + db: StorageTool + batcher: Batcher + llm: BaseChatModel + metrics: SummaryMetrics + uuid: str + + # Configuration parameters + scenario: str + schema: str + events: List[str] + batch_response_method: str + time_metadata_keys: List[str] + time_threshold: float + summary_start_time: Optional[float] + recursion_limit: int + log_dir: Optional[str] + + # Constants + timeout: int = DEFAULT_SUMM_TIMEOUT_SEC + call_schema: Schema = Schema( + {"start_index": int, "end_index": int}, ignore_extra_keys=True + ) + + def setup(self) -> None: + """Initialize the structured inference function with configuration parameters.""" + # Initialize core parameters + self.batch_size = self.get_param("batch_size", default=6) + self.batcher = Batcher(self.batch_size) + self.scenario = self.get_param("scenario", default="warehouse") + self.schema = self.get_param("schema") + self.events = self.get_param("events", default=[]) + self.llm = self.get_tool(LLM_TOOL_NAME) + self.batch_response_method = self.get_param( + "batch_response_method", default="json_mode" + ) + self.time_metadata_keys = self.get_param( + "time_metadata_keys", default=["start_pts", "end_pts"] + ) + self.time_threshold = self.get_param("time_threshold", default=10.0) + self.db = self.get_tool("db") + self.summary_start_time = None + self.uuid = self.get_param("uuid", default="default") + self.recursion_limit = self.get_param( + "summ_rec_lim", default=DEFAULT_SUMM_RECURSION_LIMIT + ) + self.log_dir = os.environ.get("VIA_LOG_DIR", None) + self.metrics = SummaryMetrics() + + # Setup prompts and pipelines + self._setup_structured_prompt() + self._setup_pipelines() + + def _escape_schema_for_prompt(self, schema: str) -> str: + """Escape curly braces in schema for use in ChatPromptTemplate. + + Args: + schema: JSON schema string + + Returns: + Schema string with escaped braces + """ + return schema.replace("{", "{{").replace("}", "}}") + + def _generate_prompt_with_llm(self, escaped_schema: str) -> str: + """Generate a structured inference prompt using the LLM. + + Args: + escaped_schema: Schema string with escaped braces + + Returns: + Generated prompt string with escaped braces + """ + logger.info( + f"Generating structured prompt for scenario: {self.scenario} and events: {self.events}" + ) + + system_message = ( + "You are a helpful assistant that generates a prompt for structured inference. " + "\n\nBackground: The generated prompt will be used to extract any events that are relevant to the scenario. " + "If no events are provided then the generated prompt should be able to extract interesting events and not " + "mundane regular events. They should contain high level information. For example, in case of a warehouse, " + "fire, theft, accident, etc. are interesting events whereas workers working in orderly manner is not an " + "interesting event. In case of a traffic monitoring video, collision, unsafe maneuver, traffic violation, " + "obstructed traffic flow etc. are interesting events and normal traffic flow is not an interesting event." + ) + + user_message = ( + f"Given a scenario and events, generate a prompt that will be used to generate structured output.\n" + f"Scenario: {self.scenario}\n" + f"Events: {self.events}\n" + f"Required schema for the structured output: {escaped_schema}\n" + f"Prompt: " + ) + + generated_prompt = self.llm.invoke( + [("system", system_message), ("user", user_message)] + ) + # Escape curly braces in the generated prompt for ChatPromptTemplate + return str(generated_prompt.content).replace("{", "{{").replace("}", "}}") + + def _get_default_prompt(self, escaped_schema: str) -> str: + """Get the default structured inference prompt. + + Args: + escaped_schema: Schema string with escaped braces + + Returns: + Default prompt string + """ + return ( + f"Extract {self.scenario} related events from the list of event types: {self.events} from the captions of " + f"a {self.scenario} monitoring video. Return a structured json output as per the " + f"schema provided. Schema: {escaped_schema}. Ensure the event type is one of the event types in the list." + ) + + def _setup_structured_prompt(self) -> None: + """Setup the structured inference prompt based on configuration.""" + escaped_schema = self._escape_schema_for_prompt(self.schema) + + if self.get_param("auto_generate_prompt", default=False): + self.structured_prompt = self._generate_prompt_with_llm(escaped_schema) + else: + prompt_value = self.get_param("prompts", {}).get("event_extraction_prompt") + if prompt_value is None: + prompt_value = self._get_default_prompt(escaped_schema) + logger.info(f"Using prompt: {prompt_value}") + self.structured_prompt = prompt_value + + logger.info(f"Structured prompt: {self.structured_prompt}") + + def _setup_pipelines(self) -> None: + """Setup LangChain pipelines for batch processing and aggregation.""" + # Setup batch processing pipeline + structured_batch_prompt = ChatPromptTemplate.from_messages( + [ + ("system", self.structured_prompt), + ("user", "{input}"), + ] + ) + logger.info(f"Structured batch prompt: {structured_batch_prompt}") + + self.output_parser = StrOutputParser() + self.batch_pipeline = structured_batch_prompt | self.llm.with_structured_output( + method=self.batch_response_method, + schema=json.loads(self.schema), + ) + + # Setup aggregation pipeline + self.aggregation_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a helpful assistant that aggregates structured events from multiple batches.", + ), + ( + "user", + "Aggregate the following batch summaries and provide an overall summary:\n{input} Summary:", + ), + ] + ) + self.aggregation_pipeline = ( + self.aggregation_prompt | self.llm | self.output_parser + ) + + def _compute_timestamp_bounds(self, batch: Batch) -> Dict[str, Optional[float]]: + """Compute min/max timestamp bounds for all timestamp fields in the batch. + + Args: + batch: Batch containing documents with metadata + + Returns: + Dictionary mapping timestamp field names to their min/max values + """ + timestamp_fields = [ + "start_pts", + "end_pts", + "start_ntp", + "end_ntp", + "start_ntp_float", + "end_ntp_float", + ] + bounds = {field: None for field in timestamp_fields} + + for _, _, meta in batch.as_list(): + for field in timestamp_fields: + value = meta.get(field) + if value is not None: + if bounds[field] is None: + bounds[field] = value + elif field.startswith("start_"): + bounds[field] = min(bounds[field], value) + else: # end_ fields + bounds[field] = max(bounds[field], value) + + logger.info( + f"Timestamp bounds - pts: [{bounds['start_pts']}, {bounds['end_pts']}], " + f"ntp: [{bounds['start_ntp']}, {bounds['end_ntp']}], " + f"ntp_float: [{bounds['start_ntp_float']}, {bounds['end_ntp_float']}]" + ) + + return bounds + + async def _process_full_batch(self, batch: Batch) -> None: + """Process a full batch of documents and store the summary. + + This method: + 1. Combines documents in the batch into text + 2. Generates a structured summary using the LLM pipeline + 3. Extracts metadata and timestamp bounds from batch documents + 4. Stores the summary with metadata in the database + + Args: + batch: Full batch ready for processing + """ + batch_index = batch.get_batch_index() + is_last = batch.as_list()[-1][2].get("is_last", False) + + with Metrics(f"Batch {batch_index} Summary IS LAST {is_last}", "pink"): + batch_summary = "{}" # Default empty JSON + + logger.info("Batch %d is full. Processing ...", batch_index) + logger.info(f"Batch: {batch}") + + # Generate batch summary using LLM + try: + with get_openai_callback() as cb: + batch_text = " ".join([doc for doc, _, _ in batch.as_list()]) + logger.info( + f"Batch Text before calling batch pipeline: {batch_text}" + ) + logger.debug(f"{self.batch_pipeline.__dict__}") + batch_summary = await call_token_safe( + {"input": batch_text}, + self.batch_pipeline, + self.recursion_limit, + ) + logger.info(f"Batch pipeline output: {batch_summary}") + # Convert dict to JSON string if needed + batch_summary = json.dumps(batch_summary, ensure_ascii=False) + logger.info( + f"Batch Summary: {batch_summary}, type: {type(batch_summary)}" + ) + except Exception as e: + traceback.print_exc() + logger.error(f"Error summarizing batch {batch_index}: {e}") + + # Update metrics + self.metrics.summary_tokens += cb.total_tokens + self.metrics.summary_requests += cb.successful_requests + + # Extract metadata and chunk indices from batch + chunk_indices = [] + doc_meta_sample = None + for _, _, doc_meta in batch.as_list(): + if doc_meta_sample is None: + doc_meta_sample = doc_meta + if "chunkIdx" in doc_meta and doc_meta["chunkIdx"] is not None: + chunk_indices.append(doc_meta["chunkIdx"]) + + # Remove duplicate chunk indices + if chunk_indices: + chunk_indices = list(set(chunk_indices)) + + # Compute timestamp bounds across all documents in batch + timestamp_bounds = self._compute_timestamp_bounds(batch) + + # Log summary and token usage + logger.info("Batch %d summary: %s", batch_index, batch_summary) + logger.info( + "Total Tokens: %s, Prompt Tokens: %s, Completion Tokens: %s, " + "Successful Requests: %s, Total Cost (USD): $%s", + cb.total_tokens, + cb.prompt_tokens, + cb.completion_tokens, + cb.successful_requests, + cb.total_cost, + ) + # Store the batch summary in database + try: + batch_meta = self._build_batch_metadata( + doc_meta_sample, batch_index, timestamp_bounds, chunk_indices + ) + + # TODO: Use async method once https://github.com/langchain-ai/langchain-milvus/pull/29 is released + # await self.db.aadd_summary(summary=batch_summary, metadata=batch_meta) + if batch_summary is not None: + logger.debug(f"Metadata being added: {batch_meta}") + logger.info(f"Batch Summary: {batch_summary}") + self.db.add_summary(summary=str(batch_summary), metadata=batch_meta) + except Exception as e: + traceback.print_exc() + logger.error(f"Error adding summary to database: {e}") + + def _build_batch_metadata( + self, + doc_meta_sample: Optional[Dict[str, Any]], + batch_index: int, + timestamp_bounds: Dict[str, Optional[float]], + chunk_indices: List[int], + ) -> Dict[str, Any]: + """Build metadata dictionary for a batch summary. + + Args: + doc_meta_sample: Sample document metadata to extract schema + batch_index: Index of the batch being processed + timestamp_bounds: Computed timestamp bounds for the batch + chunk_indices: List of chunk indices in the batch + + Returns: + Complete metadata dictionary for the batch summary + """ + # Create empty metadata template from sample document + empty_doc_meta = {} + if doc_meta_sample: + empty_doc_meta = { + key: type(value)() for key, value in doc_meta_sample.items() + } + + # Build base metadata + batch_meta = { + **empty_doc_meta, + "chunkIdx": -1, + "batch_i": batch_index, + "doc_type": "caption_summary", + "uuid": self.uuid, + "camera_id": "default", + } + + # Add available timestamp fields + batch_meta.update({k: v for k, v in timestamp_bounds.items() if v is not None}) + + # Add linked chunk indices if any exist + if chunk_indices: + batch_meta["linked_summary_chunks"] = chunk_indices + + return batch_meta + + async def aprocess_doc( + self, doc: str, doc_i: int, doc_meta: Dict[str, Any] + ) -> None: + """Process a document by adding it to a batch and processing when full. + + Args: + doc: Document text to process + doc_i: Document index + doc_meta: Document metadata dictionary + """ + try: + logger.info("Adding doc %d", doc_i) + doc_meta.setdefault("is_first", False) + doc_meta.setdefault("is_last", False) + + with Metrics("summ/aprocess_doc", "red") as bs: + doc_meta["batch_i"] = doc_i // self.batch_size + batch = self.batcher.add_doc(doc, doc_i, doc_meta) + if batch.is_full(): + # Process the batch immediately when full + logger.info(f"Batch: {batch}") + await asyncio.create_task(self._process_full_batch(batch)) + + # Track timing metrics + if self.summary_start_time is None: + self.summary_start_time = bs.start_time + self.metrics.summary_latency = bs.end_time - self.summary_start_time + except Exception as e: + logger.error(f"Error processing document {doc_i}: {e}") + + async def acall(self, state: Dict[str, Any]) -> Dict[str, Any]: + """Aggregate batch summaries into a final summary with extracted events. + + This method retrieves processed batch summaries from the database, + aggregates them using the LLM, and extracts structured events. + + Args: + state: Dictionary containing: + - start_index (int): Starting document index + - end_index (int): Ending document index + + Returns: + dict: State dictionary with added fields: + - result (str): JSON string with "video_summary" and "events" + - error_code (str): Error message if any (optional) + + Raises: + Exception: If batch summarization fails + """ + try: + logger.info(f"Batch Summarization Acall: {state}") + with Metrics("OffBatchSumm/Acall", "blue"): + # Validate input state + self.call_schema.validate(state) + + # Retrieve batch summaries from database + batches = await self._retrieve_batch_summaries( + state["start_index"], state["end_index"] + ) + + # Process batches and generate final result + if not batches: + state["result"] = "" + state["error_code"] = "No batch summaries found" + logger.error("No batch summaries found") + else: + # Aggregate batches and extract events + await self._aggregate_batches(state, batches) + state["metadata"] = self.metrics.dump_dict() + + # Save metrics if log directory is configured + if self.log_dir: + log_path = Path(self.log_dir) / "summary_metrics.json" + self.metrics.dump_json(log_path.absolute()) + except Exception as e: + logger.error(f"Error in batch summarization: {e}") + state["error_code"] = f"{e}" + raise e + return state + + async def _retrieve_batch_summaries( + self, start_index: int, end_index: int + ) -> List[Dict[str, Any]]: + """Retrieve batch summaries from database with retry logic. + + Args: + start_index: Starting document index + end_index: Ending document index + + Returns: + List of batch summary dictionaries + """ + target_start_batch_index = self.batcher.get_batch_index(start_index) + target_end_batch_index = self.batcher.get_batch_index(end_index) + + logger.info(f"Target Batch Start: {target_start_batch_index}") + logger.info(f"Target Batch End: {target_end_batch_index}") + + # Handle -1 end index (retrieve all batches) + if target_end_batch_index == -1: + max_batch_index = await self.db.aget_max_batch_index(self.uuid) + target_end_batch_index = max_batch_index + logger.debug(f"Updated target_end_batch_index to {target_end_batch_index}") + + expected_batch_count = target_end_batch_index - target_start_batch_index + 1 + stop_time = time.time() + self.timeout + + # Retry logic to wait for all batches to be available + while time.time() < stop_time: + batches = await self.db.aget_text_data( + target_start_batch_index, target_end_batch_index, self.uuid + ) + batches.sort(key=lambda x: x["batch_i"]) + + logger.debug( + f"Batches Fetched: {[{k: v for k, v in batch.items() if k != 'vector'} for batch in batches]}" + ) + logger.info(f"Number of Batches Fetched: {len(batches)}") + + if len(batches) == expected_batch_count: + logger.info(f"Need {expected_batch_count} batches. Moving forward.") + break + elif len(batches) >= expected_batch_count: + logger.info( + f"Found {len(batches)} batches. Taking first {expected_batch_count} batches." + ) + batches = batches[:expected_batch_count] + break + else: + logger.info(f"Need {expected_batch_count} batches. Waiting ...") + await asyncio.sleep(1) + + # Extract only text field for aggregation + batches = [ + {k: v for k, v in batch.items() if k in ["text"]} for batch in batches + ] + logger.debug(f"Batches for aggregation: {batches}") + + return batches + + async def _aggregate_batches( + self, state: Dict[str, Any], batches: List[Dict[str, Any]] + ) -> None: + """Aggregate batch summaries and extract events. + + Args: + state: State dictionary to update with results + batches: List of batch summary dictionaries + """ + with Metrics("summ/acall/batch-aggregation-summary", "pink") as bas: + with get_openai_callback() as cb: + # Generate aggregated summary + aggregation_result = await call_token_safe( + batches, self.aggregation_pipeline, self.recursion_limit + ) + + # Extract structured events from batches + events = self.extract_events_from_batches(batches) + + # Combine results + state["result"] = json.dumps( + {"video_summary": aggregation_result, "events": events}, + ensure_ascii=False, + ) + + logger.info("Summary Aggregation Done") + self.metrics.aggregation_tokens = cb.total_tokens + logger.info( + "Total Tokens: %s, Prompt Tokens: %s, Completion Tokens: %s, " + "Successful Requests: %s, Total Cost (USD): $%s", + cb.total_tokens, + cb.prompt_tokens, + cb.completion_tokens, + cb.successful_requests, + cb.total_cost, + ) + self.metrics.aggregation_latency = bas.execution_time + + def extract_events_from_batches( + self, batches: List[Dict[str, Any]] + ) -> List[Dict[str, Any]]: + """Extract and merge events from batch summaries. + + Parses JSON batch summaries to extract events, then merges temporally close + events of the same type based on the configured time threshold. + + Args: + batches: List of batch dictionaries containing "text" field with JSON + + Returns: + List of merged event dictionaries + """ + result = [] + logger.info("Starting to extract events from batches.") + + # Extract events from all batches + for batch in batches: + text = batch.get("text") + if text and text != "None": + logger.info(f"Batch Text: {text}") + try: + with Metrics("StructuredBatchSumm/ParseJSONDocument", "green"): + events_object = json_repair.loads(text) + logger.debug(f"Parsed and repaired JSON data: {events_object}") + + validate(instance=events_object, schema=json.loads(self.schema)) + + events = events_object.get("events", []) + result.extend(event for event in events if event) + except ValidationError as e: + logger.warning( + f"Validation error: {e.message}. Schema: {self.schema}. Skipping." + ) + except (json.JSONDecodeError, KeyError, TypeError) as e: + logger.warning(f"Failed to parse events from batch: {e}") + + # Merge temporally close events of the same type + if result: + result = self._merge_temporal_events(result) + + return result + + def _merge_temporal_events( + self, events: List[Dict[str, Any]] + ) -> List[Dict[str, Any]]: + """Merge temporally close events of the same type. + + Args: + events: List of event dictionaries with type, start_time, end_time, description + + Returns: + List of merged event dictionaries + """ + # Sort by type then by start_time + events.sort(key=lambda e: (e.get("type", ""), e.get("start_time", 0))) + + combined = [] + for event in events: + # Check if this event should be merged with the previous one + should_merge = ( + combined + and event.get("type") == combined[-1].get("type") + and (event.get("start_time", 0) - combined[-1].get("end_time", 0)) + <= self.time_threshold + ) + + if should_merge: + logger.info(f"Merging events: {combined[-1]} and {event}") + # Expand the time range + combined[-1]["end_time"] = max( + combined[-1].get("end_time", 0), event.get("end_time", 0) + ) + # Combine descriptions if different + if event.get("description") != combined[-1].get("description"): + logger.info( + f"Combining descriptions: {combined[-1]['description']} and {event['description']}" + ) + combined[-1]["description"] = ( + combined[-1]["description"] + " " + event["description"] + ) + else: + combined.append(event.copy()) + + return combined + + async def areset(self, state: Dict[str, Any]) -> None: + """Reset the function state and clear all accumulated data. + + Args: + state: State dictionary (passed to database reset) + """ + # TODO: use async method for drop data + self.db.reset(state) + self.summary_start_time = None + self.batcher.flush() + self.metrics.reset() + await asyncio.sleep(0.001) diff --git a/src/vss_ctx_rag/functions/summarization/summary_retriever.py b/src/vss_ctx_rag/functions/summarization/summary_retriever.py index 0826fd97..6619d7f6 100644 --- a/src/vss_ctx_rag/functions/summarization/summary_retriever.py +++ b/src/vss_ctx_rag/functions/summarization/summary_retriever.py @@ -27,7 +27,7 @@ from vss_ctx_rag.tools.storage.storage_tool import StorageTool from langchain_core.prompts import ChatPromptTemplate from vss_ctx_rag.utils.globals import LLM_TOOL_NAME -from langchain.chains.combine_documents import create_stuff_documents_chain +from langchain_classic.chains.combine_documents import create_stuff_documents_chain from vss_ctx_rag.models.function_models import ( FunctionModel, ) diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured.py b/src/vss_ctx_rag/functions/summarization/vlm_structured.py new file mode 100644 index 00000000..a4229355 --- /dev/null +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured.py @@ -0,0 +1,122 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""vlm_structured.py: VLM structured summarization (in-memory event accumulation). + +This version accumulates parsed events in memory during ``aprocess_doc`` and +processes them all at ``acall`` time. For the DB-backed variant see +``vlm_structured_online.py``. +""" + +import asyncio +from typing import List + +from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger +from vss_ctx_rag.models.function_models import ( + register_function, + register_function_config, + FunctionModel, +) + +from vss_ctx_rag.functions.summarization.vlm_structured_base import ( + Event, + VlmStructuredBase, + VlmStructuredParamsBase, +) + + +@register_function_config("vlm_structured_summarization") +class VlmStructuredSummarizationConfig(FunctionModel): + class VlmStructuredSummarizationParams(VlmStructuredParamsBase): + pass + + params: VlmStructuredSummarizationParams + + +@register_function(config=VlmStructuredSummarizationConfig) +class VlmStructuredSummarization(VlmStructuredBase): + """VLM Structured Summarization - accumulates events in memory.""" + + accumulated_events: List[Event] + + def setup(self): + super().setup() + self.accumulated_events = [] + self.kafka_enabled = self.get_param("kafka_enabled", default=False) + + async def acall(self, state: dict): + """Process and merge accumulated events, then aggregate with LLM. + + Optional ``start_time`` / ``end_time`` keys in *state* (or the + function config) restrict processing to events overlapping that + time window. ``uuids`` (or legacy ``uuid``) in *state* override + the configured UUIDs. + + Returns: + dict: state with ``result`` (JSON) and ``metadata`` keys. + """ + with Metrics("StructuredBatchSumm/Acall", "blue"): + self.call_schema.validate(state) + + uuids = self._resolve_uuids(state) + + start_time = state.get("start_time", self.filter_start_time) + end_time = state.get("end_time", self.filter_end_time) + events = self._filter_events_by_time( + self.accumulated_events, start_time, end_time + ) + + await self._store_merged_events(events) + + state = await self._build_result( + state, + events, + uuids, + log_filename="structured_events_metrics.json", + ) + + return state + + async def aprocess_doc(self, doc: str, doc_i: int, doc_meta: dict): + """Parse events from *doc*, accumulate in memory, and persist raw events to DB.""" + try: + logger.info("Processing structured doc %d for processing", doc_i) + doc_meta.setdefault("is_first", False) + doc_meta.setdefault("is_last", False) + + with Metrics("StructuredBatchSumm/aprocess_doc", "red") as bs: + events = self._parse_json_document(doc) + + if events: + logger.info(f"Extracted {len(events)} events from document {doc_i}") + self.accumulated_events.extend(events) + if not self.kafka_enabled: + self._store_raw_events(events, doc_i, doc_meta) + else: + logger.warning(f"No events found in document {doc_i}") + + if self.summary_start_time is None: + self.summary_start_time = bs.start_time + self.metrics.summary_latency = bs.end_time - self.summary_start_time + except Exception as e: + logger.error(f"Error processing document {doc_i}: {e}") + + async def areset(self, state: dict): + """Reset function state including accumulated events.""" + self.db.reset(state) + self.summary_start_time = None + self.metrics.reset() + self.accumulated_events.clear() + await asyncio.sleep(0.001) diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py b/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py new file mode 100644 index 00000000..09a165e9 --- /dev/null +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py @@ -0,0 +1,690 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""vlm_structured_base.py: Shared base class and Event model for VLM structured summarization. + +Contains all logic common to both the online (DB-backed) and offline (in-memory) +VLM structured summarization functions: Event parsing, merging, LLM aggregation, +batch storage, and result building. +""" + +import json +import os +import re +from pathlib import Path +from typing import List, Optional + +import json_repair + +from langchain_community.callbacks import get_openai_callback +from langchain_core.language_models.chat_models import BaseChatModel +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.runnables.base import RunnableSequence +from pydantic import BaseModel, Field +from schema import Schema + +from vss_ctx_rag.base.function import Function +from vss_ctx_rag.tools.health.rag_health import SummaryMetrics +from vss_ctx_rag.tools.storage.storage_tool import StorageTool +from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger +from vss_ctx_rag.utils.globals import ( + DEFAULT_SUMM_RECURSION_LIMIT, + LLM_TOOL_NAME, +) +from vss_ctx_rag.utils.utils import call_token_safe, remove_think_tags + + +# ── Shared Pydantic params base ──────────────────────────────────────── + + +class VlmStructuredParamsBase(BaseModel): + """Parameter schema shared by both DB-backed and in-memory configs.""" + + uuid: Optional[str] = Field( + default=None, + description="For single-uuid processing. Falls back to ``['default']``.", + ) + uuids: Optional[List[str]] = Field( + default=None, + description="One or more UUIDs to process. Falls back to *uuid* then ``['default']``.", + ) + time_overlap_threshold: float = Field( + default=0.1, + ge=0.0, + description="Minimum overlap duration in seconds to merge overlapping events", + ) + time_adjacent_threshold: float = Field( + default=4, + ge=0.0, + description="Maximum gap in seconds between events to merge adjacent events", + ) + max_events_per_batch: int = Field(default=50, ge=1) + enable_llm_merging: bool = Field( + default=False, + description="Enable LLM-based merging of descriptions for adjacent same-type events.", + ) + kafka_enabled: bool = Field( + default=False, + description="When enabled, ES storage is handled externally by the kafka-consumer-service.", + ) + start_time: Optional[float] = Field( + default=None, + description="If set, only events whose end_time >= this value are included.", + ) + end_time: Optional[float] = Field( + default=None, + description="If set, only events whose start_time <= this value are included.", + ) + + +# ── Event model ───────────────────────────────────────────────────────── + + +class Event(BaseModel): + """Represents a single event with time boundaries, type, and description.""" + + start_time: float + end_time: float + type: str + description: str + uuid: Optional[str] = None + + def overlaps_with( + self, + other: "Event", + overlap_threshold: float = 0.1, + adjacent_threshold: float = 4, + ) -> bool: + """Check if this event overlaps or is adjacent to *other* and shares its type.""" + if self.type != other.type: + return False + + overlap_start = max(self.start_time, other.start_time) + overlap_end = min(self.end_time, other.end_time) + overlap_duration = max(0, overlap_end - overlap_start) + + if overlap_duration > 0: + return overlap_duration >= overlap_threshold + + return ( + abs(self.end_time - other.start_time) <= adjacent_threshold + or abs(other.end_time - self.start_time) <= adjacent_threshold + ) + + def merge_with(self, other: "Event") -> "Event": + """Simple concatenation merge (fallback when LLM merging is off).""" + return Event( + start_time=min(self.start_time, other.start_time), + end_time=max(self.end_time, other.end_time), + type=self.type, + description=f"{self.description} | {other.description}", + uuid=self.uuid, + ) + + +# ── Base function ─────────────────────────────────────────────────────── + + +class VlmStructuredBase(Function): + """Abstract base containing all shared VLM structured summarization logic. + + Subclasses must implement ``acall``, ``aprocess_doc``, and ``areset``. + """ + + config: dict + db: StorageTool + call_schema: Schema = Schema({}, ignore_extra_keys=True) + metrics = SummaryMetrics() + uuids: List[str] + + time_overlap_threshold: float + time_adjacent_threshold: float + max_events_per_batch: int + enable_llm_merging: bool + kafka_enabled: bool + filter_start_time: Optional[float] + filter_end_time: Optional[float] + + llm: BaseChatModel + aggregation_pipeline: RunnableSequence + description_merge_pipeline: RunnableSequence + output_parser: StrOutputParser + recursion_limit: int + + # ── setup ──────────────────────────────────────────────────────── + + def setup(self): + self.db = self.get_tool("db") + + self.time_overlap_threshold = self.get_param( + "time_overlap_threshold", default=0.1 + ) + self.time_adjacent_threshold = self.get_param( + "time_adjacent_threshold", default=4 + ) + self.max_events_per_batch = self.get_param("max_events_per_batch", default=50) + self.enable_llm_merging = self.get_param("enable_llm_merging", default=False) + self.kafka_enabled = self.get_param("kafka_enabled", default=False) + self.filter_start_time = self.get_param("start_time", default=None) + self.filter_end_time = self.get_param("end_time", default=None) + + self.log_dir = os.environ.get("VIA_LOG_DIR", None) + self.summary_start_time = None + + uuids_param = self.get_param("uuids", default=None) + uuid_param = self.get_param("uuid", default=None) + if uuids_param is not None: + self.uuids = uuids_param if isinstance(uuids_param, list) else [uuids_param] + elif uuid_param is not None: + self.uuids = [uuid_param] if isinstance(uuid_param, str) else uuid_param + else: + self.uuids = ["default"] + + self.llm = self.get_tool(LLM_TOOL_NAME) + self.recursion_limit = self.get_param( + "summ_rec_lim", default=DEFAULT_SUMM_RECURSION_LIMIT + ) + self._setup_aggregation_pipeline() + + def _setup_aggregation_pipeline(self) -> None: + """Setup LangChain pipelines for event aggregation and description merging.""" + aggregation_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are a professional analyst preparing an observational report. Your task is to synthesize " + "timestamped events into a formal, cohesive narrative. Follow these guidelines:\n" + "- Write in a neutral, objective tone appropriate for official documentation.\n" + "- Organize the narrative in chronological order, maintaining logical flow between events.\n" + "- Consolidate events occurring within fractions of a second into single, coherent statements.\n" + "- Omit raw timestamps from the final output; focus on the sequence and nature of observed activities.\n" + "- Use precise, descriptive language avoiding colloquialisms or informal expressions.\n" + "- Structure the summary with clear transitions to convey the progression of events.", + ), + ( + "user", + "The following events have been recorded:\n\n{input}\n\n" + "Please synthesize these observations into a formal summary report:", + ), + ] + ) + self.output_parser = StrOutputParser() + self.aggregation_pipeline = ( + aggregation_prompt | self.llm | self.output_parser | remove_think_tags + ) + + description_merge_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + "You are an expert at combining related event descriptions into a single, coherent description. " + "Your task is to merge multiple descriptions of the same type of event into one unified description.\n" + "Guidelines:\n" + "- Preserve all important details from each description\n" + "- Remove redundant or duplicate information\n" + "- Maintain a consistent tone and style\n" + "- Keep the description concise but comprehensive\n" + "- Output ONLY the merged description, no additional text or explanation", + ), + ( + "user", + "Event type: {event_type}\n\n" + "Descriptions to merge:\n{descriptions}\n\n" + "Merged description:", + ), + ] + ) + self.description_merge_pipeline = ( + description_merge_prompt | self.llm | self.output_parser | remove_think_tags + ) + + # ── JSON parsing ──────────────────────────────────────────────────── + + @staticmethod + def _find_json_boundaries(content: str) -> tuple[int, int] | None: + """Find the best JSON boundaries (array or object) in content.""" + candidates = [ + (content.find("["), content.rfind("]")), + (content.find("{"), content.rfind("}")), + ] + valid = [(s, e) for s, e in candidates if s != -1 and e > s] + return min(valid, key=lambda x: x[0]) if valid else None + + @classmethod + def _extract_json_from_vlm_response(cls, vlm_response: str) -> str: + """Extract and clean JSON from a VLM response string.""" + content = re.sub( + r"```(?:json)?\s*\n(.*?)\n```", r"\1", vlm_response, flags=re.DOTALL + ) + + if not content.strip().startswith(("{", "[")): + if bounds := cls._find_json_boundaries(content): + content = content[bounds[0] : bounds[1] + 1] + + return content.strip().replace("\\n", "\n").replace('\\"', '"') + + @classmethod + def _parse_json_document(cls, doc: str) -> List[Event]: + """Parse a JSON document and return a list of Event objects.""" + try: + json_content = cls._extract_json_from_vlm_response(doc) + with Metrics("VlmStructured/ParseJSONDocument", "green"): + data = json_repair.loads(json_content) + + logger.debug(f"Parsed and repaired JSON data: {data}") + + events_data = data.get("events", []) if isinstance(data, dict) else data + if not isinstance(events_data, list): + logger.warning(f"Expected events list, got {type(events_data)}") + return [] + + events = [] + for event_data in events_data: + try: + event = Event(**event_data) + if event.start_time >= event.end_time: + logger.warning( + "Dropping zero/negative-duration event " + "(start_time=%.3f, end_time=%.3f): %s", + event.start_time, + event.end_time, + event.description, + ) + continue + events.append(event) + except Exception as e: + logger.warning(f"Skipping invalid event {event_data}: {e}") + + logger.info(f"Parsed {len(events)} events from JSON document") + return events + + except Exception as e: + logger.warning(f"Failed to parse JSON document: {e}") + return [] + + # ── Merging ───────────────────────────────────────────────────────── + + async def _merge_descriptions_with_llm( + self, event_type: str, descriptions: List[str] + ) -> str: + """Use LLM to merge multiple event descriptions into one coherent description.""" + if len(descriptions) == 1: + return descriptions[0] + + formatted_descriptions = "\n".join( + f"{i + 1}. {desc}" for i, desc in enumerate(descriptions) + ) + + try: + with Metrics("VlmStructured/MergeDescriptions", "yellow"): + with get_openai_callback() as cb: + merged_description = await call_token_safe( + { + "event_type": event_type, + "descriptions": formatted_descriptions, + }, + self.description_merge_pipeline, + self.recursion_limit, + ) + logger.info( + f"LLM merged {len(descriptions)} descriptions for '{event_type}' event" + ) + logger.info( + f"MergeDescriptions - Total Tokens: {cb.total_tokens}, " + f"Prompt Tokens: {cb.prompt_tokens}, " + f"Completion Tokens: {cb.completion_tokens}, " + f"Total Cost (USD): ${cb.total_cost}" + ) + return ( + merged_description.strip() + if isinstance(merged_description, str) + else str(merged_description) + ) + except Exception as e: + logger.warning( + f"Failed to merge descriptions with LLM: {e}. Falling back to simple concatenation." + ) + return " | ".join(descriptions) + + async def _merge_similar_events(self, events: List[Event]) -> List[Event]: + """Merge events based on time overlap/adjacency and same event type. + + Uses chain merging (A->B->C where B overlaps A, C overlaps B). + """ + if not events: + return events + + merged_events = [] + processed_indices = set() + + for i, event1 in enumerate(events): + if i in processed_indices: + continue + + events_to_merge = [event1] + processed_indices.add(i) + + current_start = event1.start_time + current_end = event1.end_time + current_type = event1.type + + found_merge = True + while found_merge: + found_merge = False + for j, event2 in enumerate(events): + if j in processed_indices: + continue + + current_merged = Event( + start_time=current_start, + end_time=current_end, + type=current_type, + description="", + ) + + if current_merged.overlaps_with( + event2, + self.time_overlap_threshold, + self.time_adjacent_threshold, + ): + logger.info( + f"Will merge time-overlapping events of type '{current_type}': " + f"current [{current_start:.1f}-{current_end:.1f}] and " + f"'{event2.description[:50]}...' [{event2.start_time:.1f}-{event2.end_time:.1f}]" + ) + events_to_merge.append(event2) + processed_indices.add(j) + current_start = min(current_start, event2.start_time) + current_end = max(current_end, event2.end_time) + found_merge = True + + if len(events_to_merge) == 1: + merged_events.append(event1) + else: + descriptions = [e.description for e in events_to_merge] + if self.enable_llm_merging: + merged_description = await self._merge_descriptions_with_llm( + current_type, descriptions + ) + else: + merged_description = " | ".join(descriptions) + logger.info( + f"LLM merging disabled - using simple concatenation for '{current_type}' event" + ) + + merged_event = Event( + start_time=current_start, + end_time=current_end, + type=current_type, + description=merged_description, + uuid=events_to_merge[0].uuid, + ) + merged_events.append(merged_event) + logger.info( + f"Merged {len(events_to_merge)} events of type '{current_type}' " + f"into single event: {merged_description[:100]}..." + ) + + logger.info(f"Merged {len(events)} events into {len(merged_events)} events") + merged_events.sort(key=lambda event: event.start_time) + return merged_events + + # ── Time filtering ─────────────────────────────────────────────────── + + @staticmethod + def _filter_events_by_time( + events: List[Event], + start_time: Optional[float] = None, + end_time: Optional[float] = None, + ) -> List[Event]: + """Return only events that overlap the ``[start_time, end_time]`` window. + + An event is kept when its time span intersects the filter window, i.e. + ``event.end_time >= start_time`` and ``event.start_time <= end_time``. + If both bounds are *None* the original list is returned unchanged. + """ + if start_time is None and end_time is None: + return events + + filtered = [] + for event in events: + if start_time is not None and event.end_time < start_time: + continue + if end_time is not None and event.start_time > end_time: + continue + filtered.append(event) + + logger.info( + f"Time filter [{start_time}, {end_time}]: " + f"{len(events)} events -> {len(filtered)} events" + ) + return filtered + + # ── UUID resolution ──────────────────────────────────────────────── + + def _resolve_uuids(self, state: dict) -> List[str]: + """Return the effective UUID list from *state* (with config fallback). + + Accepts ``uuids`` (list) **or** the legacy ``uuid`` (str) key in + *state*. Falls back to ``self.uuids`` when neither is present. + """ + uuids = state.get("uuids", None) + if uuids is None: + uuid = state.get("uuid", None) + if uuid is not None: + uuids = [uuid] if isinstance(uuid, str) else uuid + else: + uuids = self.uuids + elif isinstance(uuids, str): + uuids = [uuids] + return uuids + + # ── Batch storage ─────────────────────────────────────────────────── + + async def _store_merged_events(self, events: List[Event]) -> None: + """Merge the given events and persist each batch to the database.""" + if not events: + logger.info("No events to process") + return + + logger.info(f"Processing {len(events)} events for storage") + + if self.kafka_enabled: + logger.info( + "Ready to merge %d events (merge deferred to caller, " + "ES storage handled by kafka-consumer-service)", + len(events), + ) + return + + with Metrics("VlmStructured/StoreMergedEvents", "green"): + merged_events = await self._merge_similar_events(events) + + multi = len(self.uuids) > 1 + + grouped: dict[str, list[Event]] = {} + for event in merged_events: + key = event.uuid if multi and event.uuid else self.uuids[0] + grouped.setdefault(key, []).append(event) + + for uuid_key, uuid_events in grouped.items(): + for i in range(0, len(uuid_events), self.max_events_per_batch): + batch_events = uuid_events[i : i + self.max_events_per_batch] + batch_json = { + "events": [ + { + "start_time": event.start_time, + "end_time": event.end_time, + "type": event.type, + "description": event.description, + **( + {"uuid": event.uuid} if multi and event.uuid else {} + ), + } + for event in batch_events + ] + } + + batch_meta = { + "chunkIdx": -1, + "batch_i": i // self.max_events_per_batch, + "doc_type": "structured_events", + "uuid": uuid_key, + "camera_id": "default", + "event_count": len(batch_events), + } + + batch_doc = json.dumps(batch_json, indent=2, ensure_ascii=False) + self.db.add_summary(summary=batch_doc, metadata=batch_meta) + logger.info( + f"Stored batch {i // self.max_events_per_batch} with " + f"{len(batch_events)} events for uuid '{uuid_key}'" + ) + + # ── LLM aggregation ───────────────────────────────────────────────── + + async def _aggregate_events_with_llm(self, merged_events: List[Event]) -> str: + """Aggregate merged events into a cohesive summary using the LLM.""" + events_text = [] + for event in merged_events: + event_str = ( + f"- Time: {event.start_time}s to {event.end_time}s\n" + f" Type: {event.type}\n" + f" Description: {event.description}" + ) + events_text.append(event_str) + + input_text = "\n\n".join(events_text) + logger.info(f"Aggregating {len(merged_events)} events with LLM") + + with Metrics("VlmStructured/LLMAggregation", "cyan"): + with get_openai_callback() as cb: + aggregated_summary = await call_token_safe( + input_text, + self.aggregation_pipeline, + self.recursion_limit, + ) + + self.metrics.aggregation_tokens = cb.total_tokens + logger.info( + f"Aggregation - Total Tokens: {cb.total_tokens}, " + f"Prompt Tokens: {cb.prompt_tokens}, " + f"Completion Tokens: {cb.completion_tokens}, " + f"Successful Requests: {cb.successful_requests}, " + f"Total Cost (USD): ${cb.total_cost}" + ) + + return aggregated_summary + + # ── Result building ───────────────────────────────────────────────── + + async def _build_result( + self, + state: dict, + events: List[Event], + uuids: List[str], + log_filename: str = "structured_events_metrics.json", + ) -> dict: + """Merge *events*, aggregate via LLM, and populate *state* with the result JSON. + + This is the shared tail of ``acall`` for both DB-backed and in-memory variants. + """ + multi = len(uuids) > 1 + + if events: + merged_events = await self._merge_similar_events(events) + + aggregated_summary = await self._aggregate_events_with_llm(merged_events) + if not aggregated_summary.strip(): + aggregated_summary = "No events detected" + + events_list = [ + { + "id": idx + 1, + "start_time": event.start_time, + "end_time": event.end_time, + "type": event.type, + "description": event.description, + **({"uuid": event.uuid} if multi and event.uuid else {}), + } + for idx, event in enumerate(merged_events) + ] + + result_json = { + "events": events_list, + "total_events": len(merged_events), + "video_summary": aggregated_summary, + "uuids": uuids, + } + state["result"] = json.dumps(result_json, indent=2, ensure_ascii=False) + logger.info( + f"Processed {len(events)} events into {len(merged_events)} merged events" + ) + logger.info(f"Aggregated summary: {aggregated_summary}") + else: + state["result"] = json.dumps( + { + "events": [], + "total_events": 0, + "video_summary": "", + "uuids": uuids, + }, + indent=2, + ensure_ascii=False, + ) + logger.info("No events to process") + + state["metadata"] = self.metrics.dump_dict() + + if self.log_dir: + log_path = Path(self.log_dir).joinpath(log_filename) + self.metrics.dump_json(log_path.absolute()) + + return state + + # ── Doc ingestion helper ──────────────────────────────────────────── + + def _store_raw_events( + self, events: List[Event], doc_i: int, doc_meta: dict + ) -> None: + """Serialize *events* as raw JSON and persist to the database. + + When multiple UUIDs are configured, each event dict includes its + ``uuid`` field so the source stream is preserved in the stored JSON. + """ + multi = len(self.uuids) > 1 + event_dicts = [] + for e in events: + d = e.model_dump(exclude_none=True) + if not multi: + d.pop("uuid", None) + event_dicts.append(d) + + raw_events_json = json.dumps( + {"events": event_dicts}, + indent=2, + ensure_ascii=False, + ) + raw_meta = { + "chunkIdx": doc_meta.get("chunkIdx", doc_i), + "doc_type": "raw_events", + "uuid": doc_meta.get("uuid", self.uuids[0]), + "camera_id": doc_meta.get("camera_id", "default"), + "event_count": len(events), + "batch_i": doc_meta.get("batch_i", doc_i), + } + self.db.add_summary(summary=raw_events_json, metadata=raw_meta) + logger.info(f"Stored {len(events)} raw events for chunk {raw_meta['chunkIdx']}") diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py b/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py new file mode 100644 index 00000000..4f5f69cc --- /dev/null +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py @@ -0,0 +1,144 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""vlm_structured_online.py: Online variant of VLM structured summarization. + +Instead of accumulating events in memory, this function fetches raw event +documents from the database by UUID at ``acall`` time. This makes it suitable +for online / batch-replay workflows where events were already persisted +(e.g. via the VlmStructuredSummarization or an external ingest +pipeline like ``elasticpull``). +""" + +import asyncio +from typing import List + +from vss_ctx_rag.utils.ctx_rag_logger import Metrics, logger +from vss_ctx_rag.models.function_models import ( + register_function, + register_function_config, + FunctionModel, +) + +from vss_ctx_rag.functions.summarization.vlm_structured_base import ( + Event, + VlmStructuredBase, + VlmStructuredParamsBase, +) + + +@register_function_config("vlm_structured_summarization_online") +class VlmStructuredOnlineSummarizationConfig(FunctionModel): + class VlmStructuredOnlineSummarizationParams(VlmStructuredParamsBase): + pass + + params: VlmStructuredOnlineSummarizationParams + + +@register_function(config=VlmStructuredOnlineSummarizationConfig) +class VlmStructuredOnlineSummarization(VlmStructuredBase): + """Online VLM Structured Summarization - fetches events from DB by UUID.""" + + # ── DB retrieval ──────────────────────────────────────────────────── + + def _fetch_events_from_db(self, uuids: List[str]) -> List[Event]: + """Retrieve raw event documents from the database and parse into Event objects. + + When *uuids* contains more than one entry, each parsed ``Event`` + is tagged with the UUID it originated from so that downstream + storage and result building can preserve this provenance. + """ + multi = len(uuids) > 1 + all_events: List[Event] = [] + + for uuid in uuids: + raw_docs = self.db.retrieve_docs(uuid=uuid, doc_type="raw_events") + logger.info( + f"Fetched {len(raw_docs)} raw_event documents from DB for uuid '{uuid}'" + ) + for doc in raw_docs: + text = doc.get("text", "") + if not text: + continue + events = self._parse_json_document(text) + if multi: + for event in events: + event.uuid = uuid + all_events.extend(events) + + logger.info( + f"Parsed {len(all_events)} total events from DB documents " + f"across {len(uuids)} UUID(s)" + ) + return all_events + + # ── Function interface ────────────────────────────────────────────── + + async def acall(self, state: dict): + """Fetch raw events from DB by UUID(s), merge, aggregate, and return. + + ``uuids`` (or legacy ``uuid``) can be overridden in *state*; + ``start_time`` and ``end_time`` restrict processing to events + overlapping that time window (falls back to function config values). + """ + with Metrics("StructuredOnlineSumm/Acall", "blue"): + self.call_schema.validate(state) + + uuids = self._resolve_uuids(state) + events = self._fetch_events_from_db(uuids) + + start_time = state.get("start_time", self.filter_start_time) + end_time = state.get("end_time", self.filter_end_time) + events = self._filter_events_by_time(events, start_time, end_time) + + await self._store_merged_events(events) + + state = await self._build_result( + state, + events, + uuids, + log_filename="structured_online_events_metrics.json", + ) + + return state + + async def aprocess_doc(self, doc: str, doc_i: int, doc_meta: dict): + """Parse and store raw events to DB (no in-memory accumulation).""" + try: + logger.info("Processing structured doc %d for online storage", doc_i) + doc_meta.setdefault("is_first", False) + doc_meta.setdefault("is_last", False) + + with Metrics("StructuredOnlineSumm/aprocess_doc", "red") as bs: + events = self._parse_json_document(doc) + + if events: + logger.info(f"Extracted {len(events)} events from document {doc_i}") + if not self.kafka_enabled: + self._store_raw_events(events, doc_i, doc_meta) + else: + logger.warning(f"No events found in document {doc_i}") + + if self.summary_start_time is None: + self.summary_start_time = bs.start_time + self.metrics.summary_latency = bs.end_time - self.summary_start_time + except Exception as e: + logger.error(f"Error processing document {doc_i}: {e}") + + async def areset(self, state: dict): + self.db.reset(state) + self.summary_start_time = None + self.metrics.reset() + await asyncio.sleep(0.001) diff --git a/src/vss_ctx_rag/models/tool_models.py b/src/vss_ctx_rag/models/tool_models.py index b6c66ca7..6a616dd8 100644 --- a/src/vss_ctx_rag/models/tool_models.py +++ b/src/vss_ctx_rag/models/tool_models.py @@ -15,20 +15,9 @@ import importlib import inspect -from typing import ( - List, - Optional, - Union, - Any, - Dict, - Type, - TypeVar, - Generic, - ClassVar, -) - -from pydantic import BaseModel, Field, model_validator, RootModel +from typing import Any, ClassVar, Dict, Generic, List, Optional, Type, TypeVar, Union +from pydantic import BaseModel, Field, RootModel, model_validator _TOOL_CONFIG_REGISTRY: Dict[str, Dict[str, str]] = {} _TOOL_IMPLEMENTATION_REGISTRY: Dict[str, Dict[str, str]] = {} @@ -195,7 +184,13 @@ def validate_and_import_config(cls, values): and "collection_name" in config_class.model_fields ) if has_collection_name: - new_collection_name = f"default_{context_uuid}" + # Override collection_name with a deterministic name + # derived from the request UUID so that the Kafka producer, + # MilvusDBTool, and ElasticsearchDBTool all share the same + # collection/index for a given request. + new_collection_name = f"default_{context_uuid}".replace( + "-", "_" + ) params_data["collection_name"] = new_collection_name validated_params = config_class(**params_data) diff --git a/src/vss_ctx_rag/tools/embedding/embedding_tool.py b/src/vss_ctx_rag/tools/embedding/embedding_tool.py index c57c0c99..c1a65fa9 100644 --- a/src/vss_ctx_rag/tools/embedding/embedding_tool.py +++ b/src/vss_ctx_rag/tools/embedding/embedding_tool.py @@ -13,8 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import List +from typing import List, Optional +import random +from langchain_core.embeddings import Embeddings from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings from vss_ctx_rag.base.tool import Tool from vss_ctx_rag.models.tool_models import ( @@ -25,12 +27,120 @@ from vss_ctx_rag.utils.ctx_rag_logger import logger +class NullEmbedding(Embeddings): + """Null Embedding that generates dummy embeddings for testing/development. + + This implements the same interface as NVIDIAEmbeddings but generates dummy + embeddings without making any API calls. Useful for testing, development, or + when actual embeddings are not needed. + """ + + def __init__( + self, + dimensions: int = 1024, + seed: int = 42, + use_random: bool = False, + model: str = "null-embedding", + **kwargs, + ): + """Initialize NullEmbedding. + + Args: + dimensions: Size of the embedding vector + seed: Random seed for reproducibility + use_random: If True, generate random embeddings each time. + If False, generate deterministic embeddings based on text hash. + model: Model name (for compatibility) + **kwargs: Additional arguments for compatibility + """ + self.dimensions = dimensions + self.seed = seed + self.use_random = use_random + self.model = model + + # Create local Random instance for thread safety + self._random = random.Random(seed if not use_random else None) + + logger.info( + f"Initialized NullEmbedding with dimensions: {self.dimensions}, " + f"use_random: {self.use_random}, model: {self.model}" + ) + + def _generate_embedding(self, text: str) -> List[float]: + """Generate a dummy embedding vector. + + Args: + text: Input text (used for seeding if use_random is False) + + Returns: + Dummy embedding vector + """ + if self.use_random: + # Generate random embeddings + return [self._random.random() for _ in range(self.dimensions)] + else: + # Generate deterministic embeddings based on text hash + text_hash = hash(text) + local_rng = random.Random(self.seed + text_hash) + return [local_rng.random() for _ in range(self.dimensions)] + + def embed_query(self, text: str) -> List[float]: + """Embed a single query with dummy embeddings. + + Args: + text: Text to embed + + Returns: + Dummy embedding vector + """ + logger.debug(f"Generating null embedding for query: {text[:50]}...") + return self._generate_embedding(text) + + def embed_documents(self, texts: List[str]) -> List[List[float]]: + """Embed a list of documents with dummy embeddings. + + Args: + texts: List of texts to embed + + Returns: + List of dummy embeddings + """ + logger.debug(f"Generating null embeddings for {len(texts)} documents") + return [self._generate_embedding(text) for text in texts] + + async def aembed_query(self, text: str) -> List[float]: + """Async embed a single query with dummy embeddings. + + Args: + text: Text to embed + + Returns: + Dummy embedding vector + """ + logger.debug(f"Generating null embedding for query (async): {text[:50]}...") + return self._generate_embedding(text) + + async def aembed_documents(self, texts: List[str]) -> List[List[float]]: + """Async embed a list of documents with dummy embeddings. + + Args: + texts: List of texts to embed + + Returns: + List of dummy embeddings + """ + logger.debug(f"Generating null embeddings for {len(texts)} documents (async)") + return [self._generate_embedding(text) for text in texts] + + @register_tool_config("embedding") class EmbeddingConfig(ToolBaseModel): model: str = "nvidia/llama-3.2-nv-embedqa-1b-v2" base_url: str = "https://integrate.api.nvidia.com/v1" api_key: str = "NOAPIKEYSET" truncate: str = "END" + enable: bool = True + dimensions: Optional[int] = None @register_tool(config=EmbeddingConfig) @@ -48,16 +158,23 @@ def __init__( def update_tool(self, config, tools=None): self.config = config - self.embedding = NVIDIAEmbeddings( - model=self.config.params.model, - truncate=self.config.params.truncate, - api_key=self.config.params.api_key, - base_url=self.config.params.base_url, - ) - logger.info( - f"Initialized NVIDIAEmbeddingTool with model: {self.config.params.model}" - ) + # Use NullEmbedding if enable parameter is False, otherwise use NVIDIAEmbeddings + if not self.config.params.enable: + if self.config.params.dimensions is None: + self.config.params.dimensions = 1024 + self.embedding = NullEmbedding(dimensions=self.config.params.dimensions) + logger.info("Initialized NVIDIAEmbeddingTool with NullEmbedding") + else: + self.embedding = NVIDIAEmbeddings( + model=self.config.params.model, + truncate=self.config.params.truncate, + api_key=self.config.params.api_key, + base_url=self.config.params.base_url, + ) + logger.info( + f"Initialized NVIDIAEmbeddingTool with model: {self.config.params.model}" + ) def embed_documents(self, texts: List[str]) -> List[List[float]]: """Embed a list of documents. diff --git a/src/vss_ctx_rag/tools/health/rag_health.py b/src/vss_ctx_rag/tools/health/rag_health.py index ac6a7b7d..d2c45c73 100644 --- a/src/vss_ctx_rag/tools/health/rag_health.py +++ b/src/vss_ctx_rag/tools/health/rag_health.py @@ -74,6 +74,15 @@ def dump_json(self, file_name: str): with open(file_name, "w") as f: json.dump(data, f, indent=4) + def dump_dict(self): + return { + "summary_tokens": self.summary_tokens, + "aggregation_tokens": self.aggregation_tokens, + "summary_requests": self.summary_requests, + "summary_latency": self.summary_latency, + "aggregation_latency": self.aggregation_latency, + } + def reset(self): self.summary_tokens = 0 self.aggregation_tokens = 0 diff --git a/src/vss_ctx_rag/tools/reranker/reranker_tool.py b/src/vss_ctx_rag/tools/reranker/reranker_tool.py index 8eb08f15..c2f65054 100644 --- a/src/vss_ctx_rag/tools/reranker/reranker_tool.py +++ b/src/vss_ctx_rag/tools/reranker/reranker_tool.py @@ -16,7 +16,7 @@ from typing import List from langchain_nvidia_ai_endpoints import NVIDIARerank -from langchain.schema import Document +from langchain_core.documents import Document from vss_ctx_rag.base.tool import Tool from vss_ctx_rag.models.tool_models import ( register_tool_config, diff --git a/src/vss_ctx_rag/tools/storage/elasticsearch_db.py b/src/vss_ctx_rag/tools/storage/elasticsearch_db.py index 4cdaabc1..332b5b1e 100644 --- a/src/vss_ctx_rag/tools/storage/elasticsearch_db.py +++ b/src/vss_ctx_rag/tools/storage/elasticsearch_db.py @@ -17,8 +17,8 @@ from typing import override, ClassVar, Optional, Dict, List, Any import os from langchain_core.retrievers import RetrieverLike -from langchain.docstore.document import Document -from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_core.documents import Document +from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_elasticsearch.vectorstores import ElasticsearchStore from vss_ctx_rag.base.tool import Tool @@ -81,7 +81,10 @@ def update_tool( self.embedding = self.get_tool("embedding").embedding - self.index_name = self.config.params.collection_name + # Use the incoming config (not self.config) so that the index name + # reflects the latest collection_name injected by ToolsConfig when + # the context UUID changes between requests. + self.index_name = config.params.collection_name self._vector_store = ElasticsearchStore( index_name=self.index_name, @@ -91,6 +94,188 @@ def update_tool( distance_strategy="COSINE", ) + # Make sure the `default_*` index template is registered before any + # writer (in-process add_summary OR an external Logstash sidecar) can + # create an index with the wrong dynamic mapping. PUT is idempotent; + # safe to call on every (re)configure. + self._ensure_index_template() + + def _ensure_index_template(self) -> None: + """Register the `default_*` index template once per ES connection. + + Locks the field types that downstream queries depend on: + - ``vector`` -> ``dense_vector`` (otherwise ES dynamic-maps it as a + plain float[] which is not searchable with kNN and can't be + backfilled). + - Numeric/bool fields -> ``integer``/``long``/``double``/``boolean`` + (otherwise the first stringified value would lock in + ``text + .keyword`` and break range queries / aggregations). + - String identifier fields -> ``keyword`` directly (avoids the + unnecessary ``text`` analyzer + ``.keyword`` sub-field cost). + + Replaces the standalone ``es-bootstrap`` one-shot container so the + guarantee lives next to the storage tool that depends on it. Called + from :meth:`update_tool` after the vector store is constructed. + """ + try: + try: + emb_dims = int(os.environ.get("LVS_EMB_DIMENSIONS", "1024")) + except (TypeError, ValueError): + emb_dims = 1024 + + template_body = { + "index_patterns": ["default_*"], + "priority": 100, + "template": { + "settings": { + "number_of_shards": 1, + "number_of_replicas": 0, + }, + "mappings": { + "properties": { + "text": {"type": "text"}, + "vector": { + "type": "dense_vector", + "dims": emb_dims, + "index": True, + "similarity": "cosine", + }, + "metadata": { + "properties": { + # ``source`` and every keyword-typed + # field under ``content_metadata`` is + # mapped as a ``keyword`` multi-field + # that also exposes a ``.keyword`` + # sub-field. This matches what ES would + # auto-create from dynamic mapping for a + # ``text`` field, so existing queries in + # this file (and other consumers) that + # use the ``...keyword`` suffix continue + # to resolve regardless of whether the + # docs were inserted by Logstash via the + # streaming Kafka path or by + # ``add_summary`` on the in-process + # file path. + "source": { + "type": "keyword", + "fields": {"keyword": {"type": "keyword"}}, + }, + "content_metadata": { + "properties": { + "doc_type": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "uuid": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "camera_id": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "streamId": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "doc_i": {"type": "integer"}, + "chunkIdx": {"type": "integer"}, + "batch_i": {"type": "integer"}, + "event_count": {"type": "integer"}, + "total_events": {"type": "integer"}, + "pts_offset_ns": {"type": "long"}, + "start_pts": {"type": "long"}, + "end_pts": {"type": "long"}, + "start_ntp_float": {"type": "double"}, + "end_ntp_float": {"type": "double"}, + "start_ntp": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "end_ntp": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "is_first": {"type": "boolean"}, + "is_last": {"type": "boolean"}, + "file": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "asset_dir": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "cv_metadata_json_file": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "osd_output_video_file": { + "type": "keyword", + "fields": { + "keyword": {"type": "keyword"} + }, + }, + "cv_meta": {"type": "text"}, + "cached_frames_cv_meta": {"type": "text"}, + } + }, + } + }, + } + }, + }, + "_meta": { + "description": ( + "default_* index mapping registered by " + "ElasticsearchDBTool. Mirrors add_summary shape and " + "the streaming Kafka -> Logstash -> ES path." + ), + "owner": "via-ctx-rag/ElasticsearchDBTool", + }, + } + + es_client = self._vector_store.client + # Use the unauth'd indices.put_index_template via the typed client. + es_client.indices.put_index_template( + name="visionllm", + body=template_body, + ) + logger.debug( + "ElasticsearchDBTool: registered _index_template/visionllm " + "(dense_vector dims=%d)", + emb_dims, + ) + except Exception as e: + # Non-fatal: the in-process write path can still proceed because + # langchain's ApproxRetrievalStrategy creates per-index mappings + # itself. The streaming Kafka path will silently miss the + # template β€” log loudly so it's visible in the operator's logs. + logger.warning( + "ElasticsearchDBTool: could not register _index_template/" + "visionllm at startup: %s. Streaming Kafka writes may end " + "up with degraded ES dynamic mappings.", + e, + ) + def add_summary(self, summary: str, metadata: dict): with Metrics( "elasticsearch/add caption", "blue", span_kind=Metrics.SPAN_KIND["TOOL"] @@ -122,7 +307,7 @@ def add_summary(self, summary: str, metadata: dict): except Exception as e: tm.error(e) logger.error( - f"Invalid metadata while adding documents to Elasticsearch: {metadata}" + f"Error adding document to Elasticsearch: {e}. Metadata: {metadata}" ) raise e @@ -315,6 +500,52 @@ def filter_chunks( logger.warning(f"Error getting text data: {e}") return [] + def retrieve_docs( + self, uuid: str, doc_type: str = "raw_events" + ) -> List[Dict[str, Any]]: + try: + must_conditions = [ + {"term": {"metadata.content_metadata.doc_type.keyword": doc_type}}, + ] + if uuid: + safe_uuid = self._escape(uuid) + must_conditions.append( + {"term": {"metadata.content_metadata.uuid.keyword": safe_uuid}} + ) + + query = { + "query": {"bool": {"must": must_conditions}}, + "sort": [{"metadata.content_metadata.chunkIdx": {"order": "asc"}}], + } + + es_client = self._vector_store.client + response = es_client.search( + index=self.index_name, + body=query, + size=10000, + ) + + results = [] + for hit in response["hits"]["hits"]: + source = hit["_source"] + result = source.get("metadata", {}) + text_content = source.get("text", "") + flattened = { + "text": text_content, + **{k: v for k, v in result.items() if k != "content_metadata"}, + **( + result.get("content_metadata", {}) + if isinstance(result.get("content_metadata"), dict) + else {} + ), + } + results.append(flattened) + + return results + except Exception as e: + logger.warning(f"Error retrieving docs: {e}") + return [] + async def aget_max_batch_index(self, uuid: str = ""): try: must_conditions = [ diff --git a/src/vss_ctx_rag/tools/storage/milvus_db.py b/src/vss_ctx_rag/tools/storage/milvus_db.py index 6c269f20..b5997658 100644 --- a/src/vss_ctx_rag/tools/storage/milvus_db.py +++ b/src/vss_ctx_rag/tools/storage/milvus_db.py @@ -15,13 +15,13 @@ import asyncio import os -from typing import override, ClassVar +from typing import override, ClassVar, Any from langchain_core.retrievers import RetrieverLike -from langchain.docstore.document import Document -from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_core.documents import Document +from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_milvus import Milvus -from pymilvus import MilvusException, connections +from pymilvus import MilvusClient, MilvusException, connections from vss_ctx_rag.base.tool import Tool from vss_ctx_rag.models.tool_models import register_tool_config, register_tool from vss_ctx_rag.tools.storage.storage_tool import DBConfig @@ -31,6 +31,44 @@ from pymilvus import Collection +def _patch_milvus_client_orm_bridge(): + """Monkey-patch MilvusClient to auto-register connections in ORM registry. + + pymilvus 2.6 MilvusClient uses ConnectionManager (new API), but + langchain_milvus 0.3.3 also uses Collection (ORM API) which looks up + connections in the legacy connections._alias_handlers. This patch + bridges the gap by registering the handler after MilvusClient.__init__. + + Remove this bridge when langchain-milvus natively supports pymilvus 2.6+. + """ + import pymilvus + + if not pymilvus.__version__.startswith("2.6."): + logger.warning( + "pymilvus %s detected; ORM bridge patch was written for 2.6.x β€” " + "verify compatibility or remove the patch.", + pymilvus.__version__, + ) + + _original_init = MilvusClient.__init__ + + def _patched_init(self, *args, **kwargs): + _original_init(self, *args, **kwargs) + try: + if hasattr(self, "_handler") and hasattr(self, "_using"): + connections._alias_handlers[self._using] = self._handler + except Exception: + logger.warning( + "Failed to register MilvusClient connection in ORM registry", + exc_info=True, + ) + + MilvusClient.__init__ = _patched_init + + +_patch_milvus_client_orm_bridge() + + @register_tool_config("milvus") class MilvusDBConfig(DBConfig): ALLOWED_TOOL_TYPES: ClassVar[Dict[str, List[str]]] = { @@ -58,7 +96,8 @@ def __init__( super().__init__(name, config, tools) self.connection = { - "uri": f"http://{self.config.params.host}:{self.config.params.port}" + "uri": f"http://{self.config.params.host}:{self.config.params.port}", + "timeout": 120, } self.text_splitter = RecursiveCharacterTextSplitter( @@ -83,13 +122,17 @@ def __init__( "1", ] + if not self._drop_old_default: + self._warn_if_no_dynamic_field(self.collection_name) self._collection = Milvus( embedding_function=self.embedding, connection_args=self.connection, collection_name=self.collection_name, auto_id=True, drop_old=self._drop_old_default, + enable_dynamic_field=True, ) + self._register_orm_connection(self._collection) self._current_collection = self._collection self._pymilvus_collection = None @@ -97,6 +140,68 @@ def __init__( self.update_tool(self.config, tools) + def _warn_if_no_dynamic_field(self, collection_name: str): + """Log a warning if an existing collection lacks dynamic-field support. + + langchain-milvus 0.3.3+ requires enable_dynamic_field=True for + content_metadata storage. Collections created by older versions + will fail on insert; they must be recreated with drop_old=True. + """ + try: + client = MilvusClient(uri=self.connection["uri"], timeout=10) + try: + if not client.has_collection(collection_name): + return # collection will be created with dynamic fields + schema = client.describe_collection(collection_name) + if not schema.get("enable_dynamic_field", False): + logger.error( + "Collection '%s' was created without " + "enable_dynamic_field=True. langchain-milvus 0.3.3+ " + "requires dynamic fields for content_metadata. " + "Recreate the collection with drop_old=True or " + "manually enable dynamic fields.", + collection_name, + ) + finally: + client.close() + except Exception: + logger.debug( + "Could not verify dynamic-field support for '%s'", + collection_name, + exc_info=True, + ) + + @staticmethod + def _register_orm_connection(milvus_instance: Milvus): + """Bridge MilvusClient connection into pymilvus ORM registry. + + langchain_milvus 0.3.3 uses MilvusClient (new API) which registers + connections in ConnectionManager, but also uses Collection (ORM API) + which looks up connections in the legacy connections._alias_handlers. + This bridge ensures the ORM Collection can find the connection. + """ + try: + if not ( + hasattr(milvus_instance, "alias") and hasattr(milvus_instance, "client") + ): + logger.warning( + "Milvus instance missing alias/client β€” skipping ORM " + "registration; pymilvus Collection operations may fail" + ) + return + client = milvus_instance.client + alias = milvus_instance.alias + if not hasattr(client, "_handler"): + logger.warning( + "MilvusClient missing _handler β€” skipping ORM " + "registration; pymilvus Collection operations may fail" + ) + return + connections._alias_handlers.setdefault(alias, client._handler) + logger.debug("ORM connection registered for alias '%s'", alias) + except Exception: + logger.warning("Failed to register ORM connection", exc_info=True) + def get_current_collection(self) -> Milvus: """Get the currently active collection.""" return self._current_collection @@ -165,13 +270,16 @@ def update_tool( ): return # No changes needed + self._warn_if_no_dynamic_field(user_specified_collection_name) self._current_collection = Milvus( embedding_function=self.embedding, connection_args=self.connection, collection_name=user_specified_collection_name, auto_id=True, drop_old=False, + enable_dynamic_field=True, ) + self._register_orm_connection(self._current_collection) self.current_collection_name = user_specified_collection_name self.custom_metadata = custom_metadata self._pymilvus_current_collection = None @@ -268,6 +376,39 @@ async def aget_text_data(self, start_batch_index=0, end_batch_index=-1, uuid="") logger.warning(f"Error getting text data: {e}") return [] + def retrieve_docs( + self, uuid: str, doc_type: str = "raw_events" + ) -> List[Dict[str, Any]]: + try: + safe_uuid = self._escape(uuid) + expr = f"content_metadata['doc_type'] == '{doc_type}'" + if safe_uuid: + expr += f" and content_metadata['uuid'] == '{safe_uuid}'" + + results = self.get_current_pymilvus_collection().query( + expr=expr, + output_fields=["*"], + ) + + return [ + { + **{ + k: v + for k, v in result.items() + if k != "pk" and k != "content_metadata" and k != "vector" + }, + **( + result.get("content_metadata", {}) + if isinstance(result.get("content_metadata"), dict) + else {} + ), + } + for result in results + ] + except Exception as e: + logger.warning(f"Error retrieving docs: {e}") + return [] + async def aget_max_batch_index(self, uuid: str = ""): if uuid: safe_uuid = self._escape(uuid) @@ -279,6 +420,8 @@ async def aget_max_batch_index(self, uuid: str = ""): expr=expr, output_fields=["content_metadata"], ) + if not searched_metadata: + return 0 return max( [ batch_index["content_metadata"]["batch_i"] @@ -363,7 +506,9 @@ def drop_collection(self): collection_name=self.collection_name, auto_id=True, drop_old=True, + enable_dynamic_field=True, ) + self._register_orm_connection(self._collection) self._current_collection = self._collection self.current_collection_name = self.collection_name self.is_user_specified_collection_name = False diff --git a/src/vss_ctx_rag/tools/storage/neo4j_db.py b/src/vss_ctx_rag/tools/storage/neo4j_db.py index efeeaf98..0bdfc125 100644 --- a/src/vss_ctx_rag/tools/storage/neo4j_db.py +++ b/src/vss_ctx_rag/tools/storage/neo4j_db.py @@ -21,12 +21,12 @@ from contextlib import contextmanager from typing import Any, Dict, List, Tuple, ClassVar, Optional -from langchain.retrievers import ContextualCompressionRetriever -from langchain.retrievers.document_compressors import ( +from langchain_classic.retrievers import ContextualCompressionRetriever +from langchain_classic.retrievers.document_compressors import ( DocumentCompressorPipeline, EmbeddingsFilter, ) -from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.graphs import Neo4jGraph from langchain_community.graphs.graph_document import GraphDocument from langchain_community.vectorstores import Neo4jVector @@ -462,6 +462,37 @@ async def aget_max_batch_index(self, uuid: str = ""): result = await self.aquery(query) return result[0]["max(s.batch_i)"] + def retrieve_docs( + self, uuid: str, doc_type: str = "raw_events" + ) -> List[Dict[str, Any]]: + try: + cypher = ( + "MATCH (s:Summary) " + "WHERE s.doc_type = $doc_type AND s.uuid = $uuid " + "RETURN s ORDER BY s.chunkIdx ASC" + ) + results = self.query(cypher, {"doc_type": doc_type, "uuid": uuid}) + if not results: + return [] + + docs = [] + for record in results: + node = record["s"] + docs.append( + { + "text": node.get("content", ""), + "doc_type": node.get("doc_type", ""), + "uuid": node.get("uuid", ""), + "chunkIdx": node.get("chunkIdx", 0), + "camera_id": node.get("camera_id", "default"), + "event_count": node.get("event_count", 0), + } + ) + return docs + except Exception as e: + logger.warning(f"Error retrieving docs: {e}") + return [] + def add_summary(self, summary: str, metadata: dict): """Add a batch summary to the Neo4j database as a Summary node with metadata.""" logger.debug(f"Adding summary {metadata['batch_i']} to Neo4j") diff --git a/src/vss_ctx_rag/tools/storage/storage_tool.py b/src/vss_ctx_rag/tools/storage/storage_tool.py index 2400aaf6..7f38e491 100644 --- a/src/vss_ctx_rag/tools/storage/storage_tool.py +++ b/src/vss_ctx_rag/tools/storage/storage_tool.py @@ -43,6 +43,20 @@ class DBConfig(ToolBaseModel): collection_name: Optional[str] = Field( default_factory=lambda: "default_" + str(uuid.uuid4()).replace("-", "_") ) + kafka_consumer_settle_secs: Optional[float] = Field( + default=5.0, + description=( + "Seconds the upstream LVS file-summarize path sleeps after the " + "RTVI SSE [DONE] event before invoking the aggregator. Allows the " + "Kafka -> Logstash -> ES pipeline time to flush raw_events into " + "the DB so the aggregator (running with kafka_enabled=true) can " + "read them at acall time. Only consulted by LVS when " + "summarization.kafka_enabled=true; ctx-rag itself does not " + "interpret this value -- the field exists so the YAML key passes " + "ToolsConfig validation and is preserved on the parsed config " + "dict that LVS reads." + ), + ) class StorageTool(Tool, ABC): @@ -113,6 +127,21 @@ async def query(self, query, params: dict = {}): async def aget_max_batch_index(self, uuid: str) -> int: pass + @abstractmethod + def retrieve_docs( + self, uuid: str, doc_type: str = "raw_events" + ) -> List[Dict[str, Any]]: + """Retrieve documents from storage filtered by uuid and doc_type. + + Args: + uuid: UUID to filter results by + doc_type: Document type to filter (default: "raw_events") + + Returns: + List of dicts, each containing at least 'text' and flattened metadata. + """ + pass + @abstractmethod def as_retriever(self, search_kwargs: dict = None) -> RetrieverLike: """ diff --git a/src/vss_ctx_rag/utils/ctx_rag_logger.py b/src/vss_ctx_rag/utils/ctx_rag_logger.py index 90906c0e..1811946a 100644 --- a/src/vss_ctx_rag/utils/ctx_rag_logger.py +++ b/src/vss_ctx_rag/utils/ctx_rag_logger.py @@ -15,6 +15,7 @@ import logging import os +import re import time import json @@ -80,35 +81,49 @@ class SecureLogFilter(logging.Filter): # Environment variable names whose values should never appear in logs _SENSITIVE_ENV_VARS = [ "NVIDIA_API_KEY", - "OPEN_API_KEY", "OPENAI_API_KEY", + "NGC_API_KEY", "NGC_CLI_KEY", "NGC_CLI_API_KEY", "GRAPH_DB_PASSWORD", "GRAPH_DB_USERNAME", "ARANGO_DB_PASSWORD", "ARANGO_DB_USERNAME", + "MINIO_PASSWORD", + "MINIO_USERNAME", + ] + + _API_KEY_PATTERNS = [ + re.compile(r"nvapi-[A-Za-z0-9_-]+"), # NVIDIA API keys + re.compile(r"sk-[A-Za-z0-9_-]+"), # OpenAI API keys ] def __init__(self): super().__init__() + @staticmethod + def mask_api_key_patterns(msg: str) -> str: + """Mask strings matching API key patterns (nvapi-..., sk-...).""" + masked = msg + for pattern in SecureLogFilter._API_KEY_PATTERNS: + masked = pattern.sub("***MASKED***", masked) + return masked + def filter(self, record): current_secrets = [ os.getenv(var) for var in self._SENSITIVE_ENV_VARS if os.getenv(var) ] - if not current_secrets: - # No secrets set, nothing to scrub - return True - full_msg = record.getMessage() masked_msg = full_msg for secret in current_secrets: if secret and secret in masked_msg: masked_msg = masked_msg.replace(secret, "***MASKED***") - # If we replaced anything, overwrite the record so downstream formatters cannot recover the secret + masked_msg = self.mask_api_key_patterns(masked_msg) + + # If we replaced anything, overwrite the record + # so downstream formatters cannot recover the secret if masked_msg != full_msg: record.msg = masked_msg record.args = () diff --git a/src/vss_ctx_rag/utils/utils.py b/src/vss_ctx_rag/utils/utils.py index c8e2d34f..aff4e536 100644 --- a/src/vss_ctx_rag/utils/utils.py +++ b/src/vss_ctx_rag/utils/utils.py @@ -24,7 +24,12 @@ def remove_think_tags(text_in): + logger.debug(f"Text in before remove_think_tags: {text_in}") text_out = re.sub(r".*?", "", text_in, flags=re.DOTALL) + # in case there are no tags, remove everything before + if "" not in text_out and "" in text_out: + text_out = re.sub(r".*?", "", text_out, flags=re.DOTALL) + logger.debug(f"Text out after remove_think_tags: {text_out}") return text_out diff --git a/uv.lock b/uv.lock index 45611cf4..db9b0360 100644 --- a/uv.lock +++ b/uv.lock @@ -13,29 +13,35 @@ resolution-markers = [ "python_full_version < '3.13' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", ] +[options] +prerelease-mode = "allow" + [manifest] members = [ "vss-ctx-rag", "vss-ctx-rag-arango", "vss-ctx-rag-nat", ] - -[[package]] -name = "accelerate" -version = "1.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyyaml" }, - { name = "safetensors" }, - { name = "torch" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399, upload-time = "2025-11-21T11:27:46.973Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d2/c581486aa6c4fbd7394c23c47b83fa1a919d34194e16944241daf9e762dd/accelerate-1.12.0-py3-none-any.whl", hash = "sha256:3e2091cd341423207e2f084a6654b1efcd250dc326f2a37d6dde446e07cabb11", size = 380935, upload-time = "2025-11-21T11:27:44.522Z" }, +constraints = [ + { name = "authlib", specifier = ">=1.7.0" }, + { name = "cryptography", specifier = ">=46.0.7" }, + { name = "jaraco-context", specifier = ">=6.1.2" }, + { name = "langgraph-api", specifier = ">=0.5" }, + { name = "lupa", specifier = ">=2.8" }, + { name = "nbconvert", specifier = ">=7.17.1" }, + { name = "nltk", specifier = ">=3.9.4" }, + { name = "pillow", specifier = ">=12.2.0" }, + { name = "pygments", specifier = ">=2.20.0" }, + { name = "transformers", specifier = ">=4.57.6" }, +] +overrides = [ + { name = "bleach", specifier = ">=6.3.0" }, + { name = "fastapi", specifier = ">=0.121.2" }, + { name = "json-repair", specifier = ">=0.44.1" }, + { name = "langchain", specifier = ">=1.2.15" }, + { name = "pydantic", specifier = ">=2.12.5" }, + { name = "python-multipart", specifier = ">=0.0.26" }, + { name = "safetensors", specifier = ">=0.5.3" }, ] [[package]] @@ -67,12 +73,15 @@ wheels = [ ] [[package]] -name = "aiofiles" -version = "25.1.0" +name = "aiofile" +version = "3.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +dependencies = [ + { name = "caio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, + { url = "https://files.pythonhosted.org/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", size = 19539, upload-time = "2024-10-08T10:39:32.955Z" }, ] [[package]] @@ -86,7 +95,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.13.2" +version = "3.13.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -97,76 +106,76 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/ce/3b83ebba6b3207a7135e5fcaba49706f8a4b6008153b4e30540c982fae26/aiohttp-3.13.2.tar.gz", hash = "sha256:40176a52c186aefef6eb3cad2cdd30cd06e3afbe88fe8ab2af9c0b90f228daca", size = 7837994, upload-time = "2025-10-28T20:59:39.937Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/9b/01f00e9856d0a73260e86dd8ed0c2234a466c5c1712ce1c281548df39777/aiohttp-3.13.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b1e56bab2e12b2b9ed300218c351ee2a3d8c8fdab5b1ec6193e11a817767e47b", size = 737623, upload-time = "2025-10-28T20:56:30.797Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1b/4be39c445e2b2bd0aab4ba736deb649fabf14f6757f405f0c9685019b9e9/aiohttp-3.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:364e25edaabd3d37b1db1f0cbcee8c73c9a3727bfa262b83e5e4cf3489a2a9dc", size = 492664, upload-time = "2025-10-28T20:56:32.708Z" }, - { url = "https://files.pythonhosted.org/packages/28/66/d35dcfea8050e131cdd731dff36434390479b4045a8d0b9d7111b0a968f1/aiohttp-3.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5c94825f744694c4b8db20b71dba9a257cd2ba8e010a803042123f3a25d50d7", size = 491808, upload-time = "2025-10-28T20:56:34.57Z" }, - { url = "https://files.pythonhosted.org/packages/00/29/8e4609b93e10a853b65f8291e64985de66d4f5848c5637cddc70e98f01f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba2715d842ffa787be87cbfce150d5e88c87a98e0b62e0f5aa489169a393dbbb", size = 1738863, upload-time = "2025-10-28T20:56:36.377Z" }, - { url = "https://files.pythonhosted.org/packages/9d/fa/4ebdf4adcc0def75ced1a0d2d227577cd7b1b85beb7edad85fcc87693c75/aiohttp-3.13.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:585542825c4bc662221fb257889e011a5aa00f1ae4d75d1d246a5225289183e3", size = 1700586, upload-time = "2025-10-28T20:56:38.034Z" }, - { url = "https://files.pythonhosted.org/packages/da/04/73f5f02ff348a3558763ff6abe99c223381b0bace05cd4530a0258e52597/aiohttp-3.13.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:39d02cb6025fe1aabca329c5632f48c9532a3dabccd859e7e2f110668972331f", size = 1768625, upload-time = "2025-10-28T20:56:39.75Z" }, - { url = "https://files.pythonhosted.org/packages/f8/49/a825b79ffec124317265ca7d2344a86bcffeb960743487cb11988ffb3494/aiohttp-3.13.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e67446b19e014d37342f7195f592a2a948141d15a312fe0e700c2fd2f03124f6", size = 1867281, upload-time = "2025-10-28T20:56:41.471Z" }, - { url = "https://files.pythonhosted.org/packages/b9/48/adf56e05f81eac31edcfae45c90928f4ad50ef2e3ea72cb8376162a368f8/aiohttp-3.13.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4356474ad6333e41ccefd39eae869ba15a6c5299c9c01dfdcfdd5c107be4363e", size = 1752431, upload-time = "2025-10-28T20:56:43.162Z" }, - { url = "https://files.pythonhosted.org/packages/30/ab/593855356eead019a74e862f21523db09c27f12fd24af72dbc3555b9bfd9/aiohttp-3.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeacf451c99b4525f700f078becff32c32ec327b10dcf31306a8a52d78166de7", size = 1562846, upload-time = "2025-10-28T20:56:44.85Z" }, - { url = "https://files.pythonhosted.org/packages/39/0f/9f3d32271aa8dc35036e9668e31870a9d3b9542dd6b3e2c8a30931cb27ae/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8a9b889aeabd7a4e9af0b7f4ab5ad94d42e7ff679aaec6d0db21e3b639ad58d", size = 1699606, upload-time = "2025-10-28T20:56:46.519Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3c/52d2658c5699b6ef7692a3f7128b2d2d4d9775f2a68093f74bca06cf01e1/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:fa89cb11bc71a63b69568d5b8a25c3ca25b6d54c15f907ca1c130d72f320b76b", size = 1720663, upload-time = "2025-10-28T20:56:48.528Z" }, - { url = "https://files.pythonhosted.org/packages/9b/d4/8f8f3ff1fb7fb9e3f04fcad4e89d8a1cd8fc7d05de67e3de5b15b33008ff/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8aa7c807df234f693fed0ecd507192fc97692e61fee5702cdc11155d2e5cadc8", size = 1737939, upload-time = "2025-10-28T20:56:50.77Z" }, - { url = "https://files.pythonhosted.org/packages/03/d3/ddd348f8a27a634daae39a1b8e291ff19c77867af438af844bf8b7e3231b/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9eb3e33fdbe43f88c3c75fa608c25e7c47bbd80f48d012763cb67c47f39a7e16", size = 1555132, upload-time = "2025-10-28T20:56:52.568Z" }, - { url = "https://files.pythonhosted.org/packages/39/b8/46790692dc46218406f94374903ba47552f2f9f90dad554eed61bfb7b64c/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9434bc0d80076138ea986833156c5a48c9c7a8abb0c96039ddbb4afc93184169", size = 1764802, upload-time = "2025-10-28T20:56:54.292Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e4/19ce547b58ab2a385e5f0b8aa3db38674785085abcf79b6e0edd1632b12f/aiohttp-3.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ff15c147b2ad66da1f2cbb0622313f2242d8e6e8f9b79b5206c84523a4473248", size = 1719512, upload-time = "2025-10-28T20:56:56.428Z" }, - { url = "https://files.pythonhosted.org/packages/70/30/6355a737fed29dcb6dfdd48682d5790cb5eab050f7b4e01f49b121d3acad/aiohttp-3.13.2-cp312-cp312-win32.whl", hash = "sha256:27e569eb9d9e95dbd55c0fc3ec3a9335defbf1d8bc1d20171a49f3c4c607b93e", size = 426690, upload-time = "2025-10-28T20:56:58.736Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0d/b10ac09069973d112de6ef980c1f6bb31cb7dcd0bc363acbdad58f927873/aiohttp-3.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:8709a0f05d59a71f33fd05c17fc11fcb8c30140506e13c2f5e8ee1b8964e1b45", size = 453465, upload-time = "2025-10-28T20:57:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/bf/78/7e90ca79e5aa39f9694dcfd74f4720782d3c6828113bb1f3197f7e7c4a56/aiohttp-3.13.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7519bdc7dfc1940d201651b52bf5e03f5503bda45ad6eacf64dda98be5b2b6be", size = 732139, upload-time = "2025-10-28T20:57:02.455Z" }, - { url = "https://files.pythonhosted.org/packages/db/ed/1f59215ab6853fbaa5c8495fa6cbc39edfc93553426152b75d82a5f32b76/aiohttp-3.13.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:088912a78b4d4f547a1f19c099d5a506df17eacec3c6f4375e2831ec1d995742", size = 490082, upload-time = "2025-10-28T20:57:04.784Z" }, - { url = "https://files.pythonhosted.org/packages/68/7b/fe0fe0f5e05e13629d893c760465173a15ad0039c0a5b0d0040995c8075e/aiohttp-3.13.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5276807b9de9092af38ed23ce120539ab0ac955547b38563a9ba4f5b07b95293", size = 489035, upload-time = "2025-10-28T20:57:06.894Z" }, - { url = "https://files.pythonhosted.org/packages/d2/04/db5279e38471b7ac801d7d36a57d1230feeee130bbe2a74f72731b23c2b1/aiohttp-3.13.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1237c1375eaef0db4dcd7c2559f42e8af7b87ea7d295b118c60c36a6e61cb811", size = 1720387, upload-time = "2025-10-28T20:57:08.685Z" }, - { url = "https://files.pythonhosted.org/packages/31/07/8ea4326bd7dae2bd59828f69d7fdc6e04523caa55e4a70f4a8725a7e4ed2/aiohttp-3.13.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:96581619c57419c3d7d78703d5b78c1e5e5fc0172d60f555bdebaced82ded19a", size = 1688314, upload-time = "2025-10-28T20:57:10.693Z" }, - { url = "https://files.pythonhosted.org/packages/48/ab/3d98007b5b87ffd519d065225438cc3b668b2f245572a8cb53da5dd2b1bc/aiohttp-3.13.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2713a95b47374169409d18103366de1050fe0ea73db358fc7a7acb2880422d4", size = 1756317, upload-time = "2025-10-28T20:57:12.563Z" }, - { url = "https://files.pythonhosted.org/packages/97/3d/801ca172b3d857fafb7b50c7c03f91b72b867a13abca982ed6b3081774ef/aiohttp-3.13.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:228a1cd556b3caca590e9511a89444925da87d35219a49ab5da0c36d2d943a6a", size = 1858539, upload-time = "2025-10-28T20:57:14.623Z" }, - { url = "https://files.pythonhosted.org/packages/f7/0d/4764669bdf47bd472899b3d3db91fffbe925c8e3038ec591a2fd2ad6a14d/aiohttp-3.13.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac6cde5fba8d7d8c6ac963dbb0256a9854e9fafff52fbcc58fdf819357892c3e", size = 1739597, upload-time = "2025-10-28T20:57:16.399Z" }, - { url = "https://files.pythonhosted.org/packages/c4/52/7bd3c6693da58ba16e657eb904a5b6decfc48ecd06e9ac098591653b1566/aiohttp-3.13.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2bef8237544f4e42878c61cef4e2839fee6346dc60f5739f876a9c50be7fcdb", size = 1555006, upload-time = "2025-10-28T20:57:18.288Z" }, - { url = "https://files.pythonhosted.org/packages/48/30/9586667acec5993b6f41d2ebcf96e97a1255a85f62f3c653110a5de4d346/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:16f15a4eac3bc2d76c45f7ebdd48a65d41b242eb6c31c2245463b40b34584ded", size = 1683220, upload-time = "2025-10-28T20:57:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/71/01/3afe4c96854cfd7b30d78333852e8e851dceaec1c40fd00fec90c6402dd2/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:bb7fb776645af5cc58ab804c58d7eba545a97e047254a52ce89c157b5af6cd0b", size = 1712570, upload-time = "2025-10-28T20:57:22.253Z" }, - { url = "https://files.pythonhosted.org/packages/11/2c/22799d8e720f4697a9e66fd9c02479e40a49de3de2f0bbe7f9f78a987808/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e1b4951125ec10c70802f2cb09736c895861cd39fd9dcb35107b4dc8ae6220b8", size = 1733407, upload-time = "2025-10-28T20:57:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/34/cb/90f15dd029f07cebbd91f8238a8b363978b530cd128488085b5703683594/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:550bf765101ae721ee1d37d8095f47b1f220650f85fe1af37a90ce75bab89d04", size = 1550093, upload-time = "2025-10-28T20:57:26.257Z" }, - { url = "https://files.pythonhosted.org/packages/69/46/12dce9be9d3303ecbf4d30ad45a7683dc63d90733c2d9fe512be6716cd40/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fe91b87fc295973096251e2d25a811388e7d8adf3bd2b97ef6ae78bc4ac6c476", size = 1758084, upload-time = "2025-10-28T20:57:28.349Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/0932b558da0c302ffd639fc6362a313b98fdf235dc417bc2493da8394df7/aiohttp-3.13.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0c8e31cfcc4592cb200160344b2fb6ae0f9e4effe06c644b5a125d4ae5ebe23", size = 1716987, upload-time = "2025-10-28T20:57:30.233Z" }, - { url = "https://files.pythonhosted.org/packages/5d/8b/f5bd1a75003daed099baec373aed678f2e9b34f2ad40d85baa1368556396/aiohttp-3.13.2-cp313-cp313-win32.whl", hash = "sha256:0740f31a60848d6edb296a0df827473eede90c689b8f9f2a4cdde74889eb2254", size = 425859, upload-time = "2025-10-28T20:57:32.105Z" }, - { url = "https://files.pythonhosted.org/packages/5d/28/a8a9fc6957b2cee8902414e41816b5ab5536ecf43c3b1843c10e82c559b2/aiohttp-3.13.2-cp313-cp313-win_amd64.whl", hash = "sha256:a88d13e7ca367394908f8a276b89d04a3652044612b9a408a0bb22a5ed976a1a", size = 452192, upload-time = "2025-10-28T20:57:34.166Z" }, - { url = "https://files.pythonhosted.org/packages/9b/36/e2abae1bd815f01c957cbf7be817b3043304e1c87bad526292a0410fdcf9/aiohttp-3.13.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2475391c29230e063ef53a66669b7b691c9bfc3f1426a0f7bcdf1216bdbac38b", size = 735234, upload-time = "2025-10-28T20:57:36.415Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/1ee62dde9b335e4ed41db6bba02613295a0d5b41f74a783c142745a12763/aiohttp-3.13.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:f33c8748abef4d8717bb20e8fb1b3e07c6adacb7fd6beaae971a764cf5f30d61", size = 490733, upload-time = "2025-10-28T20:57:38.205Z" }, - { url = "https://files.pythonhosted.org/packages/1a/aa/7a451b1d6a04e8d15a362af3e9b897de71d86feac3babf8894545d08d537/aiohttp-3.13.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ae32f24bbfb7dbb485a24b30b1149e2f200be94777232aeadba3eecece4d0aa4", size = 491303, upload-time = "2025-10-28T20:57:40.122Z" }, - { url = "https://files.pythonhosted.org/packages/57/1e/209958dbb9b01174870f6a7538cd1f3f28274fdbc88a750c238e2c456295/aiohttp-3.13.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d7f02042c1f009ffb70067326ef183a047425bb2ff3bc434ead4dd4a4a66a2b", size = 1717965, upload-time = "2025-10-28T20:57:42.28Z" }, - { url = "https://files.pythonhosted.org/packages/08/aa/6a01848d6432f241416bc4866cae8dc03f05a5a884d2311280f6a09c73d6/aiohttp-3.13.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93655083005d71cd6c072cdab54c886e6570ad2c4592139c3fb967bfc19e4694", size = 1667221, upload-time = "2025-10-28T20:57:44.869Z" }, - { url = "https://files.pythonhosted.org/packages/87/4f/36c1992432d31bbc789fa0b93c768d2e9047ec8c7177e5cd84ea85155f36/aiohttp-3.13.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0db1e24b852f5f664cd728db140cf11ea0e82450471232a394b3d1a540b0f906", size = 1757178, upload-time = "2025-10-28T20:57:47.216Z" }, - { url = "https://files.pythonhosted.org/packages/ac/b4/8e940dfb03b7e0f68a82b88fd182b9be0a65cb3f35612fe38c038c3112cf/aiohttp-3.13.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b009194665bcd128e23eaddef362e745601afa4641930848af4c8559e88f18f9", size = 1838001, upload-time = "2025-10-28T20:57:49.337Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ef/39f3448795499c440ab66084a9db7d20ca7662e94305f175a80f5b7e0072/aiohttp-3.13.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c038a8fdc8103cd51dbd986ecdce141473ffd9775a7a8057a6ed9c3653478011", size = 1716325, upload-time = "2025-10-28T20:57:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/d7/51/b311500ffc860b181c05d91c59a1313bdd05c82960fdd4035a15740d431e/aiohttp-3.13.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66bac29b95a00db411cd758fea0e4b9bdba6d549dfe333f9a945430f5f2cc5a6", size = 1547978, upload-time = "2025-10-28T20:57:53.554Z" }, - { url = "https://files.pythonhosted.org/packages/31/64/b9d733296ef79815226dab8c586ff9e3df41c6aff2e16c06697b2d2e6775/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4ebf9cfc9ba24a74cf0718f04aac2a3bbe745902cc7c5ebc55c0f3b5777ef213", size = 1682042, upload-time = "2025-10-28T20:57:55.617Z" }, - { url = "https://files.pythonhosted.org/packages/3f/30/43d3e0f9d6473a6db7d472104c4eff4417b1e9df01774cb930338806d36b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a4b88ebe35ce54205c7074f7302bd08a4cb83256a3e0870c72d6f68a3aaf8e49", size = 1680085, upload-time = "2025-10-28T20:57:57.59Z" }, - { url = "https://files.pythonhosted.org/packages/16/51/c709f352c911b1864cfd1087577760ced64b3e5bee2aa88b8c0c8e2e4972/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:98c4fb90bb82b70a4ed79ca35f656f4281885be076f3f970ce315402b53099ae", size = 1728238, upload-time = "2025-10-28T20:57:59.525Z" }, - { url = "https://files.pythonhosted.org/packages/19/e2/19bd4c547092b773caeb48ff5ae4b1ae86756a0ee76c16727fcfd281404b/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:ec7534e63ae0f3759df3a1ed4fa6bc8f75082a924b590619c0dd2f76d7043caa", size = 1544395, upload-time = "2025-10-28T20:58:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/cf/87/860f2803b27dfc5ed7be532832a3498e4919da61299b4a1f8eb89b8ff44d/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5b927cf9b935a13e33644cbed6c8c4b2d0f25b713d838743f8fe7191b33829c4", size = 1742965, upload-time = "2025-10-28T20:58:03.972Z" }, - { url = "https://files.pythonhosted.org/packages/67/7f/db2fc7618925e8c7a601094d5cbe539f732df4fb570740be88ed9e40e99a/aiohttp-3.13.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:88d6c017966a78c5265d996c19cdb79235be5e6412268d7e2ce7dee339471b7a", size = 1697585, upload-time = "2025-10-28T20:58:06.189Z" }, - { url = "https://files.pythonhosted.org/packages/0c/07/9127916cb09bb38284db5036036042b7b2c514c8ebaeee79da550c43a6d6/aiohttp-3.13.2-cp314-cp314-win32.whl", hash = "sha256:f7c183e786e299b5d6c49fb43a769f8eb8e04a2726a2bd5887b98b5cc2d67940", size = 431621, upload-time = "2025-10-28T20:58:08.636Z" }, - { url = "https://files.pythonhosted.org/packages/fb/41/554a8a380df6d3a2bba8a7726429a23f4ac62aaf38de43bb6d6cde7b4d4d/aiohttp-3.13.2-cp314-cp314-win_amd64.whl", hash = "sha256:fe242cd381e0fb65758faf5ad96c2e460df6ee5b2de1072fe97e4127927e00b4", size = 457627, upload-time = "2025-10-28T20:58:11Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8e/3824ef98c039d3951cb65b9205a96dd2b20f22241ee17d89c5701557c826/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f10d9c0b0188fe85398c61147bbd2a657d616c876863bfeff43376e0e3134673", size = 767360, upload-time = "2025-10-28T20:58:13.358Z" }, - { url = "https://files.pythonhosted.org/packages/a4/0f/6a03e3fc7595421274fa34122c973bde2d89344f8a881b728fa8c774e4f1/aiohttp-3.13.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e7c952aefdf2460f4ae55c5e9c3e80aa72f706a6317e06020f80e96253b1accd", size = 504616, upload-time = "2025-10-28T20:58:15.339Z" }, - { url = "https://files.pythonhosted.org/packages/c6/aa/ed341b670f1bc8a6f2c6a718353d13b9546e2cef3544f573c6a1ff0da711/aiohttp-3.13.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c20423ce14771d98353d2e25e83591fa75dfa90a3c1848f3d7c68243b4fbded3", size = 509131, upload-time = "2025-10-28T20:58:17.693Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f0/c68dac234189dae5c4bbccc0f96ce0cc16b76632cfc3a08fff180045cfa4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e96eb1a34396e9430c19d8338d2ec33015e4a87ef2b4449db94c22412e25ccdf", size = 1864168, upload-time = "2025-10-28T20:58:20.113Z" }, - { url = "https://files.pythonhosted.org/packages/8f/65/75a9a76db8364b5d0e52a0c20eabc5d52297385d9af9c35335b924fafdee/aiohttp-3.13.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:23fb0783bc1a33640036465019d3bba069942616a6a2353c6907d7fe1ccdaf4e", size = 1719200, upload-time = "2025-10-28T20:58:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/f5/55/8df2ed78d7f41d232f6bd3ff866b6f617026551aa1d07e2f03458f964575/aiohttp-3.13.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1a9bea6244a1d05a4e57c295d69e159a5c50d8ef16aa390948ee873478d9a5", size = 1843497, upload-time = "2025-10-28T20:58:24.672Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e0/94d7215e405c5a02ccb6a35c7a3a6cfff242f457a00196496935f700cde5/aiohttp-3.13.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0a3d54e822688b56e9f6b5816fb3de3a3a64660efac64e4c2dc435230ad23bad", size = 1935703, upload-time = "2025-10-28T20:58:26.758Z" }, - { url = "https://files.pythonhosted.org/packages/0b/78/1eeb63c3f9b2d1015a4c02788fb543141aad0a03ae3f7a7b669b2483f8d4/aiohttp-3.13.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7a653d872afe9f33497215745da7a943d1dc15b728a9c8da1c3ac423af35178e", size = 1792738, upload-time = "2025-10-28T20:58:29.787Z" }, - { url = "https://files.pythonhosted.org/packages/41/75/aaf1eea4c188e51538c04cc568040e3082db263a57086ea74a7d38c39e42/aiohttp-3.13.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:56d36e80d2003fa3fc0207fac644216d8532e9504a785ef9a8fd013f84a42c61", size = 1624061, upload-time = "2025-10-28T20:58:32.529Z" }, - { url = "https://files.pythonhosted.org/packages/9b/c2/3b6034de81fbcc43de8aeb209073a2286dfb50b86e927b4efd81cf848197/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:78cd586d8331fb8e241c2dd6b2f4061778cc69e150514b39a9e28dd050475661", size = 1789201, upload-time = "2025-10-28T20:58:34.618Z" }, - { url = "https://files.pythonhosted.org/packages/c9/38/c15dcf6d4d890217dae79d7213988f4e5fe6183d43893a9cf2fe9e84ca8d/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:20b10bbfbff766294fe99987f7bb3b74fdd2f1a2905f2562132641ad434dcf98", size = 1776868, upload-time = "2025-10-28T20:58:38.835Z" }, - { url = "https://files.pythonhosted.org/packages/04/75/f74fd178ac81adf4f283a74847807ade5150e48feda6aef024403716c30c/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9ec49dff7e2b3c85cdeaa412e9d438f0ecd71676fde61ec57027dd392f00c693", size = 1790660, upload-time = "2025-10-28T20:58:41.507Z" }, - { url = "https://files.pythonhosted.org/packages/e7/80/7368bd0d06b16b3aba358c16b919e9c46cf11587dc572091031b0e9e3ef0/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:94f05348c4406450f9d73d38efb41d669ad6cd90c7ee194810d0eefbfa875a7a", size = 1617548, upload-time = "2025-10-28T20:58:43.674Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4b/a6212790c50483cb3212e507378fbe26b5086d73941e1ec4b56a30439688/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:fa4dcb605c6f82a80c7f95713c2b11c3b8e9893b3ebd2bc9bde93165ed6107be", size = 1817240, upload-time = "2025-10-28T20:58:45.787Z" }, - { url = "https://files.pythonhosted.org/packages/ff/f7/ba5f0ba4ea8d8f3c32850912944532b933acbf0f3a75546b89269b9b7dde/aiohttp-3.13.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cf00e5db968c3f67eccd2778574cf64d8b27d95b237770aa32400bd7a1ca4f6c", size = 1762334, upload-time = "2025-10-28T20:58:47.936Z" }, - { url = "https://files.pythonhosted.org/packages/7e/83/1a5a1856574588b1cad63609ea9ad75b32a8353ac995d830bf5da9357364/aiohttp-3.13.2-cp314-cp314t-win32.whl", hash = "sha256:d23b5fe492b0805a50d3371e8a728a9134d8de5447dce4c885f5587294750734", size = 464685, upload-time = "2025-10-28T20:58:50.642Z" }, - { url = "https://files.pythonhosted.org/packages/9f/4d/d22668674122c08f4d56972297c51a624e64b3ed1efaa40187607a7cb66e/aiohttp-3.13.2-cp314-cp314t-win_amd64.whl", hash = "sha256:ff0a7b0a82a7ab905cbda74006318d1b12e37c797eb1b0d4eb3e316cf47f658f", size = 498093, upload-time = "2025-10-28T20:58:52.782Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, ] [[package]] @@ -191,6 +200,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -200,12 +218,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } - [[package]] name = "anyio" version = "4.12.0" @@ -300,14 +312,15 @@ wheels = [ [[package]] name = "authlib" -version = "1.6.6" +version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, + { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/9b/b1661026ff24bc641b76b78c5222d614776b0c085bcfdac9bd15a1cb4b35/authlib-1.6.6.tar.gz", hash = "sha256:45770e8e056d0f283451d9996fbb59b70d45722b45d854d58f32878d0a40c38e", size = 164894, upload-time = "2025-12-12T08:01:41.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/82/4d0603f30c1b4629b1f091bb266b0d7986434891d6940a8c87f8098db24e/authlib-1.7.0.tar.gz", hash = "sha256:b3e326c9aa9cc3ea95fe7d89fd880722d3608da4d00e8a27e061e64b48d801d5", size = 175890, upload-time = "2026-04-18T11:00:28.559Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/51/321e821856452f7386c4e9df866f196720b1ad0c5ea1623ea7399969ae3b/authlib-1.6.6-py2.py3-none-any.whl", hash = "sha256:7d9e9bc535c13974313a87f53e8430eb6ea3d1cf6ae4f6efcd793f2e949143fd", size = 244005, upload-time = "2025-12-12T08:01:40.209Z" }, + { url = "https://files.pythonhosted.org/packages/ca/48/c954218b2a250e23f178f10167c4173fecb5a75d2c206f0a67ba58006c26/authlib-1.7.0-py2.py3-none-any.whl", hash = "sha256:e36817afb02f6f0b6bf55f150782499ddd6ddf44b402bb055d3263cc65ac9ae0", size = 258779, upload-time = "2026-04-18T11:00:26.64Z" }, ] [[package]] @@ -319,15 +332,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] -[[package]] -name = "backoff" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, -] - [[package]] name = "beartype" version = "0.22.9" @@ -352,19 +356,14 @@ wheels = [ [[package]] name = "bleach" -version = "6.2.0" +version = "6.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" }, -] - -[package.optional-dependencies] -css = [ - { name = "tinycss2" }, + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, ] [[package]] @@ -376,6 +375,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/fc/1d7b80d0eb7b714984ce40efc78859c022cd930e402f599d8ca9e39c78a4/cachetools-6.2.4-py3-none-any.whl", hash = "sha256:69a7a52634fed8b8bf6e24a050fb60bff1c9bd8f6d24572b99c32d4e71e62a51", size = 11551, upload-time = "2025-12-15T18:24:52.332Z" }, ] +[[package]] +name = "caio" +version = "0.9.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781, upload-time = "2025-12-26T15:21:36.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", size = 36983, upload-time = "2025-12-26T15:21:36.075Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", size = 82012, upload-time = "2025-12-26T15:22:20.983Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", size = 81502, upload-time = "2026-03-04T22:08:22.381Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", size = 80200, upload-time = "2026-03-04T22:08:23.382Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979, upload-time = "2025-12-26T15:21:35.484Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900, upload-time = "2025-12-26T15:22:21.919Z" }, + { url = "https://files.pythonhosted.org/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523, upload-time = "2026-03-04T22:08:25.187Z" }, + { url = "https://files.pythonhosted.org/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243, upload-time = "2026-03-04T22:08:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", size = 36978, upload-time = "2025-12-26T15:21:41.055Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", size = 81832, upload-time = "2025-12-26T15:22:22.757Z" }, + { url = "https://files.pythonhosted.org/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", size = 81565, upload-time = "2026-03-04T22:08:27.483Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", size = 80071, upload-time = "2026-03-04T22:08:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087, upload-time = "2025-12-26T15:22:00.221Z" }, +] + [[package]] name = "certifi" version = "2025.11.12" @@ -531,15 +551,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] -[[package]] -name = "cloudpickle" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -629,196 +640,56 @@ wheels = [ [[package]] name = "cryptography" -version = "46.0.3" +version = "46.0.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, - { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, - { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, - { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, - { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, - { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, - { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, - { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, - { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, - { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, - { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, - { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, - { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, - { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, - { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, - { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, - { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, - { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, - { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, - { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, - { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, - { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, - { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, - { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, - { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, - { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, - { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, - { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, - { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, - { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, - { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, - { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, - { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, - { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, - { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, -] - -[[package]] -name = "cuda-bindings" -version = "12.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-pathfinder" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c2/65bfd79292b8ff18be4dd7f7442cea37bcbc1a228c1886f1dea515c45b67/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:694ba35023846625ef471257e6b5a4bc8af690f961d197d77d34b1d1db393f56", size = 11760260, upload-time = "2025-10-21T14:51:40.79Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c1/dabe88f52c3e3760d861401bb994df08f672ec893b8f7592dc91626adcf3/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8", size = 12151019, upload-time = "2025-10-21T14:51:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/df/6b/9c1b1a6c01392bfdd758e9486f52a1a72bc8f49e98f9355774ef98b5fb4e/cuda_bindings-12.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:696ca75d249ddf287d01b9a698b8e2d8a05046495a9c051ca15659dc52d17615", size = 11586961, upload-time = "2025-10-21T14:51:45.394Z" }, - { url = "https://files.pythonhosted.org/packages/05/8b/b4b2d1c7775fa403b64333e720cfcfccef8dcb9cdeb99947061ca5a77628/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf8bfaedc238f3b115d957d1fd6562b7e8435ba57f6d0e2f87d0e7149ccb2da5", size = 11570071, upload-time = "2025-10-21T14:51:47.472Z" }, - { url = "https://files.pythonhosted.org/packages/63/56/e465c31dc9111be3441a9ba7df1941fe98f4aa6e71e8788a3fb4534ce24d/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f", size = 11906628, upload-time = "2025-10-21T14:51:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/05/d0/d0e4e2e047d8e899f023fa15ad5e9894ce951253f4c894f1cd68490fdb14/cuda_bindings-12.9.4-cp313-cp313-win_amd64.whl", hash = "sha256:a2e82c8985948f953c2be51df45c3fe11c812a928fca525154fb9503190b3e64", size = 11556719, upload-time = "2025-10-21T14:51:52.248Z" }, - { url = "https://files.pythonhosted.org/packages/ec/07/6aff13bc1e977e35aaa6b22f52b172e2890c608c6db22438cf7ed2bf43a6/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3adf4958dcf68ae7801a59b73fb00a8b37f8d0595060d66ceae111b1002de38d", size = 11566797, upload-time = "2025-10-21T14:51:54.581Z" }, - { url = "https://files.pythonhosted.org/packages/a3/84/1e6be415e37478070aeeee5884c2022713c1ecc735e6d82d744de0252eee/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb", size = 11925991, upload-time = "2025-10-21T14:51:56.535Z" }, - { url = "https://files.pythonhosted.org/packages/4d/3c/972edfddb4ae8a9fccd3c3766ed47453b6f805b6026b32f10209dd4b8ad4/cuda_bindings-12.9.4-cp313-cp313t-win_amd64.whl", hash = "sha256:b32d8b685f0e66f5658bcf4601ef034e89fc2843582886f0a58784a4302da06c", size = 11894363, upload-time = "2025-10-21T14:51:58.633Z" }, - { url = "https://files.pythonhosted.org/packages/1e/b5/96a6696e20c4ffd2b327f54c7d0fde2259bdb998d045c25d5dedbbe30290/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f53a7f453d4b2643d8663d036bafe29b5ba89eb904c133180f295df6dc151e5", size = 11624530, upload-time = "2025-10-21T14:52:01.539Z" }, - { url = "https://files.pythonhosted.org/packages/d1/af/6dfd8f2ed90b1d4719bc053ff8940e494640fe4212dc3dd72f383e4992da/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b72ee72a9cc1b531db31eebaaee5c69a8ec3500e32c6933f2d3b15297b53686", size = 11922703, upload-time = "2025-10-21T14:52:03.585Z" }, - { url = "https://files.pythonhosted.org/packages/e6/87/652796522cc1a7af559460e1ce59b642e05c1468b9c08522a9a096b4cf04/cuda_bindings-12.9.4-cp314-cp314-win_amd64.whl", hash = "sha256:53a10c71fdbdb743e0268d07964e5a996dd00b4e43831cbfce9804515d97d575", size = 11517716, upload-time = "2025-10-21T14:52:06.013Z" }, - { url = "https://files.pythonhosted.org/packages/39/73/d2fc40c043bac699c3880bf88d3cebe9d88410cd043795382826c93a89f0/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20f2699d61d724de3eb3f3369d57e2b245f93085cab44fd37c3bea036cea1a6f", size = 11565056, upload-time = "2025-10-21T14:52:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/6c/19/90ac264acc00f6df8a49378eedec9fd2db3061bf9263bf9f39fd3d8377c3/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80bffc357df9988dca279734bc9674c3934a654cab10cadeed27ce17d8635ee", size = 11924658, upload-time = "2025-10-21T14:52:10.411Z" }, - { url = "https://files.pythonhosted.org/packages/ab/52/a30f46e822bfa6b4a659d1e8de8c4a4adf908ea075dac568b55362541bd8/cuda_bindings-12.9.4-cp314-cp314t-win_amd64.whl", hash = "sha256:53e11991a92ff6f26a0c8a98554cd5d6721c308a6b7bfb08bebac9201e039e43", size = 12055608, upload-time = "2025-10-21T14:52:12.335Z" }, -] - -[[package]] -name = "cuda-pathfinder" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/02/4dbe7568a42e46582248942f54dc64ad094769532adbe21e525e4edf7bc4/cuda_pathfinder-1.3.3-py3-none-any.whl", hash = "sha256:9984b664e404f7c134954a771be8775dfd6180ea1e1aef4a5a37d4be05d9bbb1", size = 27154, upload-time = "2025-12-04T22:35:08.996Z" }, -] - -[[package]] -name = "cuda-python" -version = "12.9.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-bindings" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/f3/6b032a554019cfb3447e671798c1bd3e79b5f1af20d10253f56cea269ef2/cuda_python-12.9.4-py3-none-any.whl", hash = "sha256:d2cacea882a69863f1e7d27ee71d75f0684f4c76910aff839067e4f89c902279", size = 7594, upload-time = "2025-10-21T14:55:12.846Z" }, -] - -[[package]] -name = "cudf-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, - { name = "cuda-python" }, - { name = "cupy-cuda12x" }, - { name = "fsspec" }, - { name = "libcudf-cu12" }, - { name = "numba" }, - { name = "numba-cuda", extra = ["cu12"] }, - { name = "numpy" }, - { name = "nvidia-cuda-nvcc-cu12" }, - { name = "nvidia-cuda-nvrtc-cu12" }, - { name = "nvtx" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "pyarrow", marker = "platform_machine == 'aarch64' or platform_machine == 'x86_64'" }, - { name = "pylibcudf-cu12" }, - { name = "pynvjitlink-cu12" }, - { name = "rich" }, - { name = "rmm-cu12" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/5b/05f758e47beb99716f49ccbbc17cca1d84863de32c4f0d91ec6ae4e1156f/cudf_cu12-25.8.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6f717064652794458b806ce175acd1591a08581d6b781e89c3e08757f8b471d8", size = 2626419, upload-time = "2025-08-07T12:22:47.276Z" }, - { url = "https://files.pythonhosted.org/packages/40/55/dc077f68d59de7cd37660d2d4a46eb656f658a463d0b782f00d66b382f46/cudf_cu12-25.8.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:adcfd814941a921c29d56a53ae87bf6d97834ac63ea01547f9d9ba7d5e6841bc", size = 2625707, upload-time = "2025-08-07T12:26:43.193Z" }, - { url = "https://files.pythonhosted.org/packages/30/af/29424079752c6c60f031d42b0713058402f1979524495b8c1b054d71580d/cudf_cu12-25.8.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bb968928e92a24257ee727b14ab57d5c7c9a12d782ac9256338043b968514e", size = 2625369, upload-time = "2025-08-07T12:21:59.728Z" }, - { url = "https://files.pythonhosted.org/packages/31/87/42359b70bcf4b7d202e3d6faf335ac7bbeb79e1435245f989c76684903e5/cudf_cu12-25.8.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b977c86b1afa02cd9f4286e0c9cb40fafd3c318aed9454997e578928989581fc", size = 2625293, upload-time = "2025-08-07T12:26:20.246Z" }, -] - -[[package]] -name = "cuml-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-python" }, - { name = "cudf-cu12" }, - { name = "cupy-cuda12x" }, - { name = "cuvs-cu12" }, - { name = "dask-cuda" }, - { name = "dask-cudf-cu12" }, - { name = "joblib" }, - { name = "libcuml-cu12" }, - { name = "numba" }, - { name = "numpy" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cufft-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "packaging" }, - { name = "pylibraft-cu12" }, - { name = "raft-dask-cu12" }, - { name = "rapids-dask-dependency" }, - { name = "rich" }, - { name = "rmm-cu12" }, - { name = "scikit-learn" }, - { name = "scipy" }, - { name = "treelite" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/21/30/e328589e2dbc6ca4014f0e210079b9909983c8284fe2af2b55f092d1318c/cuml_cu12-25.8.0.tar.gz", hash = "sha256:69a7bbc508b016fadfea47d5969aaa44e70df79fd0034c41dd6fe7ecd590aee5", size = 2501, upload-time = "2025-08-07T13:47:55.507Z" } - -[[package]] -name = "cupy-cuda12x" -version = "13.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastrlock" }, - { name = "numpy" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/6d/a5e08d225b1664b400fb4a87262878d315267c310b93d43efd5b7b0b1f64/cupy_cuda12x-13.4.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:a714db3dae534b9d869951366ae2431f3e72036b07827927ffccd24076507ca8", size = 118354020, upload-time = "2025-03-21T07:25:10.378Z" }, - { url = "https://files.pythonhosted.org/packages/56/58/5bfc83265455ff783d5be65451392a6920a90fe8996a091006ba02512848/cupy_cuda12x-13.4.1-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:06103dd2dc2ff7f36c67d2d01cb658befd68da350fae78a0e113fbab6895755f", size = 105273045, upload-time = "2025-03-21T07:25:17.966Z" }, - { url = "https://files.pythonhosted.org/packages/6f/e9/abc5ae5d8f6e05fb44c83105f8663d46c1bdfc9d0039fbaf21e79f51a985/cupy_cuda12x-13.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:7d73a32b3b49311cf384f2dd9c686cc9244435b2288d628568af6a77262964ad", size = 82066008, upload-time = "2025-03-21T07:25:24.372Z" }, - { url = "https://files.pythonhosted.org/packages/cd/59/c5200651fc3c0e1e92393d4e582e7812d5f76f26607c1fb310399c335b21/cupy_cuda12x-13.4.1-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:43f97bedd6e2385f61b939ee37faadff0e1fa701d35f2a328cdc13d5b1b74b48", size = 117957759, upload-time = "2025-03-21T07:25:31.363Z" }, - { url = "https://files.pythonhosted.org/packages/13/33/de71853fcd28aaf961092d895d126bfe5ebecc56d89865ea41ad8e48e559/cupy_cuda12x-13.4.1-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:d0d153ac5b24ad183a7bcbe83693a6df06840355bf94b30c1606c519added468", size = 105047230, upload-time = "2025-03-21T07:25:38.084Z" }, - { url = "https://files.pythonhosted.org/packages/08/f6/38f02f85d6062868425180d9b36097bac05a3d222973be5b90aa3a8fd580/cupy_cuda12x-13.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:4ca400146ab1c5f65dad180bc2562b58b91e239b322d33689fafed7b6399e229", size = 82031139, upload-time = "2025-03-21T07:25:44.085Z" }, -] - -[[package]] -name = "cuvs-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-python" }, - { name = "libcuvs-cu12" }, - { name = "numpy" }, - { name = "pylibraft-cu12" }, +sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" }, + { url = "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842", size = 7119671, upload-time = "2026-04-08T01:56:44Z" }, + { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" }, + { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" }, + { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" }, + { url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" }, + { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" }, + { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" }, + { url = "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl", hash = "sha256:fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298", size = 3002227, upload-time = "2026-04-08T01:57:06.91Z" }, + { url = "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb", size = 3475332, upload-time = "2026-04-08T01:57:08.807Z" }, + { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6b/6d/cef3c63c349f9c6343e6f0917432f0df4ed5536629b50d11ec7438a59aa2/cuvs_cu12-25.8.0.tar.gz", hash = "sha256:d08f3dd4138e012065c5ac425b6ff5bb0aae34a03eaa731041d682027e5242b9", size = 1007, upload-time = "2025-08-07T12:27:46.562Z" } [[package]] name = "cycler" @@ -844,58 +715,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/e8/77a231ae531cf38765b75ddf27dae28bb5f70b41d8bb4f15ce1650e93f57/cyclopts-4.3.0-py3-none-any.whl", hash = "sha256:91a30b69faf128ada7cfeaefd7d9649dc222e8b2a8697f1fc99e4ee7b7ca44f3", size = 187184, upload-time = "2025-11-25T02:59:32.21Z" }, ] -[[package]] -name = "dask" -version = "2025.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "cloudpickle" }, - { name = "fsspec" }, - { name = "packaging" }, - { name = "partd" }, - { name = "pyyaml" }, - { name = "toolz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/08/00/cbb7cb07742955dfe77368aa40725d7000414a8a49f415ba40c5a4379ba9/dask-2025.7.0.tar.gz", hash = "sha256:c3a0d4e78882e85ea81dbc71e6459713e45676e2d17e776c2f3f19848039e4cf", size = 10972242, upload-time = "2025-07-14T20:03:42.701Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/f9/3e04725358c17329652da8c1b2dbd88de723f3dc78bf52ca6d28d52c9279/dask-2025.7.0-py3-none-any.whl", hash = "sha256:073c29c4e99c2400a39a8a67874f35c1d15bf7af9ae3d0c30af3c7c1199f24ae", size = 1475117, upload-time = "2025-07-14T20:03:33.095Z" }, -] - -[[package]] -name = "dask-cuda" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "numba" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "pynvml" }, - { name = "rapids-dask-dependency" }, - { name = "zict" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/ea/eb1043e7b84da961623c78ff3eb4a003125a5555bdd81832714f244b648f/dask_cuda-25.8.0-py3-none-any.whl", hash = "sha256:05bb6135388e015b9d30840c3ecd40cd0cfb81e45fc320caf124d4726dba9fee", size = 157489, upload-time = "2025-08-07T15:40:56.774Z" }, -] - -[[package]] -name = "dask-cudf-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cudf-cu12" }, - { name = "cupy-cuda12x" }, - { name = "fsspec" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "pynvml" }, - { name = "rapids-dask-dependency" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/74/6fba9e2808a2aed48f58f2615e0bccbcacc6c0b81097e92b0aad607f433d/dask_cudf_cu12-25.8.0-py3-none-any.whl", hash = "sha256:771c876cd44f488d50cdd9985237b75f15f8c400c362b17e4d61e936b1e0f55e", size = 50722, upload-time = "2025-08-07T12:25:27.08Z" }, -] - [[package]] name = "dataclass-wizard" version = "0.27.0" @@ -936,66 +755,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] -[[package]] -name = "deprecated" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, -] - -[[package]] -name = "diskcache" -version = "5.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, -] - -[[package]] -name = "distributed" -version = "2025.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "cloudpickle" }, - { name = "dask" }, - { name = "jinja2" }, - { name = "locket" }, - { name = "msgpack" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyyaml" }, - { name = "sortedcontainers" }, - { name = "tblib" }, - { name = "toolz" }, - { name = "tornado" }, - { name = "urllib3" }, - { name = "zict" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d4/df/4974e669d5c166fddc5e39c8e2dcde41fd90c7568e205f7bf861dc49b66c/distributed-2025.7.0.tar.gz", hash = "sha256:5f8ec20d3cdfb286452831c6f9ebee84527e9323256c20dd2938d9c6e62c5c18", size = 1108454, upload-time = "2025-07-14T20:03:33.842Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/dc/9f033526ed98b65cda8adbd10b6eeeca0659203f67bd3e065ce172008887/distributed-2025.7.0-py3-none-any.whl", hash = "sha256:51b74526c2bee409ca968ee5532c79de1c1a1713664f5ccf90bdd81f17cfdc73", size = 1015142, upload-time = "2025-07-14T20:03:30.834Z" }, -] - -[[package]] -name = "distributed-ucxx-cu12" -version = "0.45.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba-cuda", extra = ["cu12"] }, - { name = "rapids-dask-dependency" }, - { name = "ucxx-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/e5/a4f5a6fc8fe72390058a8463320a6e47b2f09d1432b8e699739a7209d040/distributed_ucxx_cu12-0.45.1-py3-none-any.whl", hash = "sha256:a0578c40bcb6bdea9d6c9218070d69e30e4284604f451a0598c90d86909805a6", size = 26056, upload-time = "2025-08-07T15:04:51.329Z" }, -] - [[package]] name = "distro" version = "1.9.0" @@ -1005,15 +764,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] -[[package]] -name = "dnspython" -version = "2.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, -] - [[package]] name = "docstring-parser" version = "0.17.0" @@ -1032,22 +782,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] -[[package]] -name = "effdet" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "omegaconf" }, - { name = "pycocotools" }, - { name = "timm" }, - { name = "torch" }, - { name = "torchvision" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/c3/12d45167ec36f7f9a5ed80bc2128392b3f6207f760d437287d32a0e43f41/effdet-0.4.1.tar.gz", hash = "sha256:ac5589fd304a5650c201986b2ef5f8e10c111093a71b1c49fa6b8817710812b5", size = 110134, upload-time = "2023-05-21T22:18:01.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/13/563119fe0af82aca5a3b89399c435953072c39515c2e818eb82793955c3b/effdet-0.4.1-py3-none-any.whl", hash = "sha256:10889a226228d515c948e3fcf811e64c0d78d7aa94823a300045653b9c284cb7", size = 112513, upload-time = "2023-05-21T22:17:58.47Z" }, -] - [[package]] name = "elastic-transport" version = "8.17.1" @@ -1081,37 +815,6 @@ vectorstore-mmr = [ { name = "simsimd" }, ] -[[package]] -name = "email-validator" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dnspython" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, -] - -[[package]] -name = "emoji" -version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/78/0d2db9382c92a163d7095fc08efff7800880f830a152cfced40161e7638d/emoji-2.15.0.tar.gz", hash = "sha256:eae4ab7d86456a70a00a985125a03263a5eac54cd55e51d7e184b1ed3b6757e4", size = 615483, upload-time = "2025-09-21T12:13:02.755Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/5e/4b5aaaabddfacfe36ba7768817bd1f71a7a810a43705e531f3ae4c690767/emoji-2.15.0-py3-none-any.whl", hash = "sha256:205296793d66a89d88af4688fa57fd6496732eb48917a87175a023c8138995eb", size = 608433, upload-time = "2025-09-21T12:13:01.197Z" }, -] - -[[package]] -name = "et-xmlfile" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, -] - [[package]] name = "exceptiongroup" version = "1.3.1" @@ -1135,16 +838,18 @@ wheels = [ [[package]] name = "fastapi" -version = "0.115.5" +version = "0.135.3" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "annotated-doc" }, { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/29/f71316b9273b6552a263748e49cd7b83898dc9499a663d30c7b9cb853cb8/fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289", size = 301047, upload-time = "2024-11-12T16:17:34.8Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/e6/7adb4c5fa231e82c35b8f5741a9f2d055f520c29af5546fd70d3e8e1cd2e/fastapi-0.135.3.tar.gz", hash = "sha256:bd6d7caf1a2bdd8d676843cdcd2287729572a1ef524fc4d65c17ae002a1be654", size = 396524, upload-time = "2026-04-01T16:23:58.188Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/c4/148d5046a96c428464557264877ae5a9338a83bbe0df045088749ec89820/fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796", size = 94866, upload-time = "2024-11-12T16:17:31.027Z" }, + { url = "https://files.pythonhosted.org/packages/84/a4/5caa2de7f917a04ada20018eccf60d6cc6145b0199d55ca3711b0fc08312/fastapi-0.135.3-py3-none-any.whl", hash = "sha256:9b0f590c813acd13d0ab43dd8494138eb58e484bfac405db1f3187cfc5810d98", size = 117734, upload-time = "2026-04-01T16:23:59.328Z" }, ] [[package]] @@ -1158,47 +863,35 @@ wheels = [ [[package]] name = "fastmcp" -version = "2.13.0.2" +version = "3.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, { name = "cyclopts" }, { name = "exceptiongroup" }, + { name = "griffelib" }, { name = "httpx" }, + { name = "jsonref" }, { name = "jsonschema-path" }, { name = "mcp" }, { name = "openapi-pydantic" }, + { name = "opentelemetry-api" }, + { name = "packaging" }, { name = "platformdirs" }, - { name = "py-key-value-aio", extra = ["disk", "keyring", "memory"] }, - { name = "pydantic", extra = ["email"] }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "pydantic" }, { name = "pyperclip" }, { name = "python-dotenv" }, + { name = "pyyaml" }, { name = "rich" }, + { name = "uncalled-for" }, + { name = "uvicorn" }, + { name = "watchfiles" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/74/584a152bcd174c99ddf3cfdd7e86ec4a6c696fb190a907c2a2ec9056bda2/fastmcp-2.13.0.2.tar.gz", hash = "sha256:d35386561b6f3cde195ba2b5892dc89b8919a721e6b39b98e7a16f9a7c0b8e8b", size = 7762083, upload-time = "2025-10-28T13:56:21.702Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/c6/95eacd687cfab64fec13bfb64e6c6e7da13d01ecd4cb7d7e991858a08119/fastmcp-2.13.0.2-py3-none-any.whl", hash = "sha256:eb381eb073a101aabbc0ac44b05e23fef0cd1619344b7703115c825c8755fa1c", size = 367511, upload-time = "2025-10-28T13:56:18.83Z" }, -] - -[[package]] -name = "fastrlock" -version = "0.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/b1/1c3d635d955f2b4bf34d45abf8f35492e04dbd7804e94ce65d9f928ef3ec/fastrlock-0.8.3.tar.gz", hash = "sha256:4af6734d92eaa3ab4373e6c9a1dd0d5ad1304e172b1521733c6c3b3d73c8fa5d", size = 79327, upload-time = "2024-12-17T11:03:39.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/13/29544fbc6dfe45ea38046af0067311e0bad7acc7d1f2ad38bb08f2409fe2/fastmcp-3.2.4.tar.gz", hash = "sha256:083ecb75b44a4169e7fc0f632f94b781bdb0ff877c6b35b9877cbb566fd4d4d1", size = 28746127, upload-time = "2026-04-14T01:42:24.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/df/56270f2e10c1428855c990e7a7e5baafa9e1262b8e789200bd1d047eb501/fastrlock-0.8.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8cb2cf04352ea8575d496f31b3b88c42c7976e8e58cdd7d1550dfba80ca039da", size = 55727, upload-time = "2024-12-17T11:02:17.26Z" }, - { url = "https://files.pythonhosted.org/packages/57/21/ea1511b0ef0d5457efca3bf1823effb9c5cad4fc9dca86ce08e4d65330ce/fastrlock-0.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:85a49a1f1e020097d087e1963e42cea6f307897d5ebe2cb6daf4af47ffdd3eed", size = 52201, upload-time = "2024-12-17T11:02:19.512Z" }, - { url = "https://files.pythonhosted.org/packages/80/07/cdecb7aa976f34328372f1c4efd6c9dc1b039b3cc8d3f38787d640009a25/fastrlock-0.8.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5f13ec08f1adb1aa916c384b05ecb7dbebb8df9ea81abd045f60941c6283a670", size = 53924, upload-time = "2024-12-17T11:02:20.85Z" }, - { url = "https://files.pythonhosted.org/packages/88/6d/59c497f8db9a125066dd3a7442fab6aecbe90d6fec344c54645eaf311666/fastrlock-0.8.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0ea4e53a04980d646def0f5e4b5e8bd8c7884288464acab0b37ca0c65c482bfe", size = 52140, upload-time = "2024-12-17T11:02:22.263Z" }, - { url = "https://files.pythonhosted.org/packages/62/04/9138943c2ee803d62a48a3c17b69de2f6fa27677a6896c300369e839a550/fastrlock-0.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:38340f6635bd4ee2a4fb02a3a725759fe921f2ca846cb9ca44531ba739cc17b4", size = 53261, upload-time = "2024-12-17T11:02:24.418Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4b/db35a52589764c7745a613b6943bbd018f128d42177ab92ee7dde88444f6/fastrlock-0.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:da06d43e1625e2ffddd303edcd6d2cd068e1c486f5fd0102b3f079c44eb13e2c", size = 31235, upload-time = "2024-12-17T11:02:25.708Z" }, - { url = "https://files.pythonhosted.org/packages/92/74/7b13d836c3f221cff69d6f418f46c2a30c4b1fe09a8ce7db02eecb593185/fastrlock-0.8.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5264088185ca8e6bc83181dff521eee94d078c269c7d557cc8d9ed5952b7be45", size = 54157, upload-time = "2024-12-17T11:02:29.196Z" }, - { url = "https://files.pythonhosted.org/packages/06/77/f06a907f9a07d26d0cca24a4385944cfe70d549a2c9f1c3e3217332f4f12/fastrlock-0.8.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a98ba46b3e14927550c4baa36b752d0d2f7387b8534864a8767f83cce75c160", size = 50954, upload-time = "2024-12-17T11:02:32.12Z" }, - { url = "https://files.pythonhosted.org/packages/f9/4e/94480fb3fd93991dd6f4e658b77698edc343f57caa2870d77b38c89c2e3b/fastrlock-0.8.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbdea6deeccea1917c6017d353987231c4e46c93d5338ca3e66d6cd88fbce259", size = 52535, upload-time = "2024-12-17T11:02:33.402Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a7/ee82bb55b6c0ca30286dac1e19ee9417a17d2d1de3b13bb0f20cefb86086/fastrlock-0.8.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c6e5bfecbc0d72ff07e43fed81671747914d6794e0926700677ed26d894d4f4f", size = 50942, upload-time = "2024-12-17T11:02:34.688Z" }, - { url = "https://files.pythonhosted.org/packages/63/1d/d4b7782ef59e57dd9dde69468cc245adafc3674281905e42fa98aac30a79/fastrlock-0.8.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2a83d558470c520ed21462d304e77a12639859b205759221c8144dd2896b958a", size = 52044, upload-time = "2024-12-17T11:02:36.613Z" }, - { url = "https://files.pythonhosted.org/packages/28/a3/2ad0a0a69662fd4cf556ab8074f0de978ee9b56bff6ddb4e656df4aa9e8e/fastrlock-0.8.3-cp313-cp313-win_amd64.whl", hash = "sha256:8d1d6a28291b4ace2a66bd7b49a9ed9c762467617febdd9ab356b867ed901af8", size = 30472, upload-time = "2024-12-17T11:02:37.983Z" }, + { url = "https://files.pythonhosted.org/packages/cf/76/b310d52fa0e30d39bd937eb58ec2c1f1ea1b5f519f0575e9dd9612f01deb/fastmcp-3.2.4-py3-none-any.whl", hash = "sha256:e6c9c429171041455e47ab94bb3f83c4657622a0ec28922f6940053959bd58a9", size = 728599, upload-time = "2026-04-14T01:42:26.85Z" }, ] [[package]] @@ -1367,86 +1060,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/c7/b64cae5dba3a1b138d7123ec36bb5ccd39d39939f18454407e5468f4763f/fsspec-2025.12.0-py3-none-any.whl", hash = "sha256:8bf1fe301b7d8acfa6e8571e3b1c3d158f909666642431cc78a1b7b4dbc5ec5b", size = 201422, upload-time = "2025-12-03T15:23:41.434Z" }, ] -[[package]] -name = "google-api-core" -version = "2.25.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "google-auth" }, - { name = "googleapis-common-protos" }, - { name = "proto-plus" }, - { name = "protobuf" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/cd/63f1557235c2440fe0577acdbc32577c5c002684c58c7f4d770a92366a24/google_api_core-2.25.2.tar.gz", hash = "sha256:1c63aa6af0d0d5e37966f157a77f9396d820fba59f9e43e9415bc3dc5baff300", size = 166266, upload-time = "2025-10-03T00:07:34.778Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/d8/894716a5423933f5c8d2d5f04b16f052a515f78e815dab0c2c6f1fd105dc/google_api_core-2.25.2-py3-none-any.whl", hash = "sha256:e9a8f62d363dc8424a8497f4c2a47d6bcda6c16514c935629c257ab5d10210e7", size = 162489, upload-time = "2025-10-03T00:07:32.924Z" }, -] - -[package.optional-dependencies] -grpc = [ - { name = "grpcio" }, - { name = "grpcio-status" }, -] - -[[package]] -name = "google-auth" -version = "2.45.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cachetools" }, - { name = "pyasn1-modules" }, - { name = "rsa" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e5/00/3c794502a8b892c404b2dea5b3650eb21bfc7069612fbfd15c7f17c1cb0d/google_auth-2.45.0.tar.gz", hash = "sha256:90d3f41b6b72ea72dd9811e765699ee491ab24139f34ebf1ca2b9cc0c38708f3", size = 320708, upload-time = "2025-12-15T22:58:42.889Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/97/451d55e05487a5cd6279a01a7e34921858b16f7dc8aa38a2c684743cd2b3/google_auth-2.45.0-py2.py3-none-any.whl", hash = "sha256:82344e86dc00410ef5382d99be677c6043d72e502b625aa4f4afa0bdacca0f36", size = 233312, upload-time = "2025-12-15T22:58:40.777Z" }, -] - -[[package]] -name = "google-cloud-vision" -version = "3.10.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14' and platform_machine == 'aarch64'", - "python_full_version >= '3.14' and platform_machine == 'x86_64'", - "python_full_version >= '3.14' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", -] -dependencies = [ - { name = "google-api-core", extra = ["grpc"], marker = "python_full_version >= '3.14'" }, - { name = "google-auth", marker = "python_full_version >= '3.14'" }, - { name = "proto-plus", marker = "python_full_version >= '3.14'" }, - { name = "protobuf", marker = "python_full_version >= '3.14'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/14/7e/6bf616c5bf22a0d7943082318a99f5cb09046605e4077dc5366a80326a12/google_cloud_vision-3.10.2.tar.gz", hash = "sha256:649380faab8933440b632bf88072c0c382a08d49ab02bc0b4fba821882ae1765", size = 570339, upload-time = "2025-06-12T01:09:59.24Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/aa/db9febba7b5bd9c9d772e935a5c495fb2b4ee05299e46c6c4b1e7c0b66b2/google_cloud_vision-3.10.2-py3-none-any.whl", hash = "sha256:42a17fbc2219b0a88e325e2c1df6664a8dafcbae66363fb37ebcb511b018fc87", size = 527877, upload-time = "2025-06-12T01:09:57.275Z" }, -] - -[[package]] -name = "google-cloud-vision" -version = "3.11.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.13.*' and platform_machine == 'aarch64'", - "python_full_version == '3.13.*' and platform_machine == 'x86_64'", - "python_full_version == '3.13.*' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", - "python_full_version < '3.13' and platform_machine == 'aarch64'", - "python_full_version < '3.13' and platform_machine == 'x86_64'", - "python_full_version < '3.13' and platform_machine != 'aarch64' and platform_machine != 'x86_64'", -] -dependencies = [ - { name = "google-api-core", extra = ["grpc"], marker = "python_full_version < '3.14'" }, - { name = "google-auth", marker = "python_full_version < '3.14'" }, - { name = "grpcio", marker = "python_full_version < '3.14'" }, - { name = "proto-plus", marker = "python_full_version < '3.14'" }, - { name = "protobuf", marker = "python_full_version < '3.14'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e2/83/8a5de5968933671badfffd1738eac489b29c557274d97191a4acbe0a5d9a/google_cloud_vision-3.11.0.tar.gz", hash = "sha256:c3cb57df2cf152ebe62ebaae9b1d5deff5a26aec5bd6e1c7f67e44bf6f4518f4", size = 570943, upload-time = "2025-10-20T14:57:34.107Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/ca/8c5ff6041a081a6271159b2e5d378be69c964da75191ff79ef241c6ccbb3/google_cloud_vision-3.11.0-py3-none-any.whl", hash = "sha256:8910f743a87a34058dd6e5e41790be1eb100a0b91c20cc6372a2388b328c8890", size = 529092, upload-time = "2025-10-20T14:55:33.756Z" }, -] - [[package]] name = "googleapis-common-protos" version = "1.72.0" @@ -1499,43 +1112,53 @@ wheels = [ ] [[package]] -name = "grpcio" -version = "1.67.1" +name = "griffelib" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/53/d9282a66a5db45981499190b77790570617a604a38f3d103d0400974aeb5/grpcio-1.67.1.tar.gz", hash = "sha256:3dc2ed4cabea4dc14d5e708c2b426205956077cc5de419b4d4079315017e9732", size = 12580022, upload-time = "2024-10-29T06:30:07.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/25/6f95bd18d5f506364379eabc0d5874873cc7dbdaf0757df8d1e82bc07a88/grpcio-1.67.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:267d1745894200e4c604958da5f856da6293f063327cb049a51fe67348e4f953", size = 5089809, upload-time = "2024-10-29T06:24:31.24Z" }, - { url = "https://files.pythonhosted.org/packages/10/3f/d79e32e5d0354be33a12db2267c66d3cfeff700dd5ccdd09fd44a3ff4fb6/grpcio-1.67.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:85f69fdc1d28ce7cff8de3f9c67db2b0ca9ba4449644488c1e0303c146135ddb", size = 10981985, upload-time = "2024-10-29T06:24:34.942Z" }, - { url = "https://files.pythonhosted.org/packages/21/f2/36fbc14b3542e3a1c20fb98bd60c4732c55a44e374a4eb68f91f28f14aab/grpcio-1.67.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:f26b0b547eb8d00e195274cdfc63ce64c8fc2d3e2d00b12bf468ece41a0423a0", size = 5588770, upload-time = "2024-10-29T06:24:38.145Z" }, - { url = "https://files.pythonhosted.org/packages/0d/af/bbc1305df60c4e65de8c12820a942b5e37f9cf684ef5e49a63fbb1476a73/grpcio-1.67.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4422581cdc628f77302270ff839a44f4c24fdc57887dc2a45b7e53d8fc2376af", size = 6214476, upload-time = "2024-10-29T06:24:41.006Z" }, - { url = "https://files.pythonhosted.org/packages/92/cf/1d4c3e93efa93223e06a5c83ac27e32935f998bc368e276ef858b8883154/grpcio-1.67.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7616d2ded471231c701489190379e0c311ee0a6c756f3c03e6a62b95a7146e", size = 5850129, upload-time = "2024-10-29T06:24:43.553Z" }, - { url = "https://files.pythonhosted.org/packages/ae/ca/26195b66cb253ac4d5ef59846e354d335c9581dba891624011da0e95d67b/grpcio-1.67.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8a00efecde9d6fcc3ab00c13f816313c040a28450e5e25739c24f432fc6d3c75", size = 6568489, upload-time = "2024-10-29T06:24:46.453Z" }, - { url = "https://files.pythonhosted.org/packages/d1/94/16550ad6b3f13b96f0856ee5dfc2554efac28539ee84a51d7b14526da985/grpcio-1.67.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:699e964923b70f3101393710793289e42845791ea07565654ada0969522d0a38", size = 6149369, upload-time = "2024-10-29T06:24:49.112Z" }, - { url = "https://files.pythonhosted.org/packages/33/0d/4c3b2587e8ad7f121b597329e6c2620374fccbc2e4e1aa3c73ccc670fde4/grpcio-1.67.1-cp312-cp312-win32.whl", hash = "sha256:4e7b904484a634a0fff132958dabdb10d63e0927398273917da3ee103e8d1f78", size = 3599176, upload-time = "2024-10-29T06:24:51.443Z" }, - { url = "https://files.pythonhosted.org/packages/7d/36/0c03e2d80db69e2472cf81c6123aa7d14741de7cf790117291a703ae6ae1/grpcio-1.67.1-cp312-cp312-win_amd64.whl", hash = "sha256:5721e66a594a6c4204458004852719b38f3d5522082be9061d6510b455c90afc", size = 4346574, upload-time = "2024-10-29T06:24:54.587Z" }, - { url = "https://files.pythonhosted.org/packages/12/d2/2f032b7a153c7723ea3dea08bffa4bcaca9e0e5bdf643ce565b76da87461/grpcio-1.67.1-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa0162e56fd10a5547fac8774c4899fc3e18c1aa4a4759d0ce2cd00d3696ea6b", size = 5091487, upload-time = "2024-10-29T06:24:57.416Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ae/ea2ff6bd2475a082eb97db1104a903cf5fc57c88c87c10b3c3f41a184fc0/grpcio-1.67.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:beee96c8c0b1a75d556fe57b92b58b4347c77a65781ee2ac749d550f2a365dc1", size = 10943530, upload-time = "2024-10-29T06:25:01.062Z" }, - { url = "https://files.pythonhosted.org/packages/07/62/646be83d1a78edf8d69b56647327c9afc223e3140a744c59b25fbb279c3b/grpcio-1.67.1-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:a93deda571a1bf94ec1f6fcda2872dad3ae538700d94dc283c672a3b508ba3af", size = 5589079, upload-time = "2024-10-29T06:25:04.254Z" }, - { url = "https://files.pythonhosted.org/packages/d0/25/71513d0a1b2072ce80d7f5909a93596b7ed10348b2ea4fdcbad23f6017bf/grpcio-1.67.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6f255980afef598a9e64a24efce87b625e3e3c80a45162d111a461a9f92955", size = 6213542, upload-time = "2024-10-29T06:25:06.824Z" }, - { url = "https://files.pythonhosted.org/packages/76/9a/d21236297111052dcb5dc85cd77dc7bf25ba67a0f55ae028b2af19a704bc/grpcio-1.67.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e838cad2176ebd5d4a8bb03955138d6589ce9e2ce5d51c3ada34396dbd2dba8", size = 5850211, upload-time = "2024-10-29T06:25:10.149Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fe/70b1da9037f5055be14f359026c238821b9bcf6ca38a8d760f59a589aacd/grpcio-1.67.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a6703916c43b1d468d0756c8077b12017a9fcb6a1ef13faf49e67d20d7ebda62", size = 6572129, upload-time = "2024-10-29T06:25:12.853Z" }, - { url = "https://files.pythonhosted.org/packages/74/0d/7df509a2cd2a54814598caf2fb759f3e0b93764431ff410f2175a6efb9e4/grpcio-1.67.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:917e8d8994eed1d86b907ba2a61b9f0aef27a2155bca6cbb322430fc7135b7bb", size = 6149819, upload-time = "2024-10-29T06:25:15.803Z" }, - { url = "https://files.pythonhosted.org/packages/0a/08/bc3b0155600898fd10f16b79054e1cca6cb644fa3c250c0fe59385df5e6f/grpcio-1.67.1-cp313-cp313-win32.whl", hash = "sha256:e279330bef1744040db8fc432becc8a727b84f456ab62b744d3fdb83f327e121", size = 3596561, upload-time = "2024-10-29T06:25:19.348Z" }, - { url = "https://files.pythonhosted.org/packages/5a/96/44759eca966720d0f3e1b105c43f8ad4590c97bf8eb3cd489656e9590baa/grpcio-1.67.1-cp313-cp313-win_amd64.whl", hash = "sha256:fa0c739ad8b1996bd24823950e3cb5152ae91fca1c09cc791190bf1627ffefba", size = 4346042, upload-time = "2024-10-29T06:25:21.939Z" }, + { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, ] [[package]] -name = "grpcio-status" -version = "1.62.3" +name = "grpcio" +version = "1.80.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos" }, - { name = "grpcio" }, - { name = "protobuf" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/d7/013ef01c5a1c2fd0932c27c904934162f69f41ca0f28396d3ffe4d386123/grpcio-status-1.62.3.tar.gz", hash = "sha256:289bdd7b2459794a12cf95dc0cb727bd4a1742c37bd823f760236c937e53a485", size = 13063, upload-time = "2024-08-06T00:37:08.003Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/40/972271de05f9315c0d69f9f7ebbcadd83bc85322f538637d11bb8c67803d/grpcio_status-1.62.3-py3-none-any.whl", hash = "sha256:f9049b762ba8de6b1086789d8315846e094edac2c50beaf462338b301a8fd4b8", size = 14448, upload-time = "2024-08-06T00:30:15.702Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b7/48/af6173dbca4454f4637a4678b67f52ca7e0c1ed7d5894d89d434fecede05/grpcio-1.80.0.tar.gz", hash = "sha256:29aca15edd0688c22ba01d7cc01cb000d72b2033f4a3c72a81a19b56fd143257", size = 12978905, upload-time = "2026-03-30T08:49:10.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/e8/a2b749265eb3415abc94f2e619bbd9e9707bebdda787e61c593004ec927a/grpcio-1.80.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:c624cc9f1008361014378c9d776de7182b11fe8b2e5a81bc69f23a295f2a1ad0", size = 6015616, upload-time = "2026-03-30T08:47:13.428Z" }, + { url = "https://files.pythonhosted.org/packages/3e/97/b1282161a15d699d1e90c360df18d19165a045ce1c343c7f313f5e8a0b77/grpcio-1.80.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:f49eddcac43c3bf350c0385366a58f36bed8cc2c0ec35ef7b74b49e56552c0c2", size = 12014204, upload-time = "2026-03-30T08:47:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/6e/5e/d319c6e997b50c155ac5a8cb12f5173d5b42677510e886d250d50264949d/grpcio-1.80.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d334591df610ab94714048e0d5b4f3dd5ad1bee74dfec11eee344220077a79de", size = 6563866, upload-time = "2026-03-30T08:47:18.588Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f6/fdd975a2cb4d78eb67769a7b3b3830970bfa2e919f1decf724ae4445f42c/grpcio-1.80.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0cb517eb1d0d0aaf1d87af7cc5b801d686557c1d88b2619f5e31fab3c2315921", size = 7273060, upload-time = "2026-03-30T08:47:21.113Z" }, + { url = "https://files.pythonhosted.org/packages/db/f0/a3deb5feba60d9538a962913e37bd2e69a195f1c3376a3dd44fe0427e996/grpcio-1.80.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e78c4ac0d97dc2e569b2f4bcbbb447491167cb358d1a389fc4af71ab6f70411", size = 6782121, upload-time = "2026-03-30T08:47:23.827Z" }, + { url = "https://files.pythonhosted.org/packages/ca/84/36c6dcfddc093e108141f757c407902a05085e0c328007cb090d56646cdf/grpcio-1.80.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2ed770b4c06984f3b47eb0517b1c69ad0b84ef3f40128f51448433be904634cd", size = 7383811, upload-time = "2026-03-30T08:47:26.517Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ef/f3a77e3dc5b471a0ec86c564c98d6adfa3510d38f8ee99010410858d591e/grpcio-1.80.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:256507e2f524092f1473071a05e65a5b10d84b82e3ff24c5b571513cfaa61e2f", size = 8393860, upload-time = "2026-03-30T08:47:29.439Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8d/9d4d27ed7f33d109c50d6b5ce578a9914aa68edab75d65869a17e630a8d1/grpcio-1.80.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a6284a5d907c37db53350645567c522be314bac859a64a7a5ca63b77bb7958f", size = 7830132, upload-time = "2026-03-30T08:47:33.254Z" }, + { url = "https://files.pythonhosted.org/packages/14/e4/9990b41c6d7a44e1e9dee8ac11d7a9802ba1378b40d77468a7761d1ad288/grpcio-1.80.0-cp312-cp312-win32.whl", hash = "sha256:c71309cfce2f22be26aa4a847357c502db6c621f1a49825ae98aa0907595b193", size = 4140904, upload-time = "2026-03-30T08:47:35.319Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2c/296f6138caca1f4b92a31ace4ae1b87dab692fc16a7a3417af3bb3c805bf/grpcio-1.80.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe648599c0e37594c4809d81a9e77bd138cc82eb8baa71b6a86af65426723ff", size = 4880944, upload-time = "2026-03-30T08:47:37.831Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/7c3c25789e3f069e581dc342e03613c5b1cb012c4e8c7d9d5cf960a75856/grpcio-1.80.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:e9e408fc016dffd20661f0126c53d8a31c2821b5c13c5d67a0f5ed5de93319ad", size = 6017243, upload-time = "2026-03-30T08:47:40.075Z" }, + { url = "https://files.pythonhosted.org/packages/04/19/21a9806eb8240e174fd1ab0cd5b9aa948bb0e05c2f2f55f9d5d7405e6d08/grpcio-1.80.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:92d787312e613754d4d8b9ca6d3297e69994a7912a32fa38c4c4e01c272974b0", size = 12010840, upload-time = "2026-03-30T08:47:43.11Z" }, + { url = "https://files.pythonhosted.org/packages/18/3a/23347d35f76f639e807fb7a36fad3068aed100996849a33809591f26eca6/grpcio-1.80.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac393b58aa16991a2f1144ec578084d544038c12242da3a215966b512904d0f", size = 6567644, upload-time = "2026-03-30T08:47:46.806Z" }, + { url = "https://files.pythonhosted.org/packages/ff/40/96e07ecb604a6a67ae6ab151e3e35b132875d98bc68ec65f3e5ab3e781d7/grpcio-1.80.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:68e5851ac4b9afe07e7f84483803ad167852570d65326b34d54ca560bfa53fb6", size = 7277830, upload-time = "2026-03-30T08:47:49.643Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e2/da1506ecea1f34a5e365964644b35edef53803052b763ca214ba3870c856/grpcio-1.80.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:873ff5d17d68992ef6605330127425d2fc4e77e612fa3c3e0ed4e668685e3140", size = 6783216, upload-time = "2026-03-30T08:47:52.817Z" }, + { url = "https://files.pythonhosted.org/packages/44/83/3b20ff58d0c3b7f6caaa3af9a4174d4023701df40a3f39f7f1c8e7c48f9d/grpcio-1.80.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2bea16af2750fd0a899bf1abd9022244418b55d1f37da2202249ba4ba673838d", size = 7385866, upload-time = "2026-03-30T08:47:55.687Z" }, + { url = "https://files.pythonhosted.org/packages/47/45/55c507599c5520416de5eefecc927d6a0d7af55e91cfffb2e410607e5744/grpcio-1.80.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba0db34f7e1d803a878284cd70e4c63cb6ae2510ba51937bf8f45ba997cefcf7", size = 8391602, upload-time = "2026-03-30T08:47:58.303Z" }, + { url = "https://files.pythonhosted.org/packages/10/bb/dd06f4c24c01db9cf11341b547d0a016b2c90ed7dbbb086a5710df7dd1d7/grpcio-1.80.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8eb613f02d34721f1acf3626dfdb3545bd3c8505b0e52bf8b5710a28d02e8aa7", size = 7826752, upload-time = "2026-03-30T08:48:01.311Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1e/9d67992ba23371fd63d4527096eb8c6b76d74d52b500df992a3343fd7251/grpcio-1.80.0-cp313-cp313-win32.whl", hash = "sha256:93b6f823810720912fd131f561f91f5fed0fda372b6b7028a2681b8194d5d294", size = 4142310, upload-time = "2026-03-30T08:48:04.594Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e6/283326a27da9e2c3038bc93eeea36fb118ce0b2d03922a9cda6688f53c5b/grpcio-1.80.0-cp313-cp313-win_amd64.whl", hash = "sha256:e172cf795a3ba5246d3529e4d34c53db70e888fa582a8ffebd2e6e48bc0cba50", size = 4882833, upload-time = "2026-03-30T08:48:07.363Z" }, + { url = "https://files.pythonhosted.org/packages/c5/6d/e65307ce20f5a09244ba9e9d8476e99fb039de7154f37fb85f26978b59c3/grpcio-1.80.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:3d4147a97c8344d065d01bbf8b6acec2cf86fb0400d40696c8bdad34a64ffc0e", size = 6017376, upload-time = "2026-03-30T08:48:10.005Z" }, + { url = "https://files.pythonhosted.org/packages/69/10/9cef5d9650c72625a699c549940f0abb3c4bfdb5ed45a5ce431f92f31806/grpcio-1.80.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8e11f167935b3eb089ac9038e1a063e6d7dbe995c0bb4a661e614583352e76f", size = 12018133, upload-time = "2026-03-30T08:48:12.927Z" }, + { url = "https://files.pythonhosted.org/packages/04/82/983aabaad82ba26113caceeb9091706a0696b25da004fe3defb5b346e15b/grpcio-1.80.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f14b618fc30de822681ee986cfdcc2d9327229dc4c98aed16896761cacd468b9", size = 6574748, upload-time = "2026-03-30T08:48:16.386Z" }, + { url = "https://files.pythonhosted.org/packages/07/d7/031666ef155aa0bf399ed7e19439656c38bbd143779ae0861b038ce82abd/grpcio-1.80.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4ed39fbdcf9b87370f6e8df4e39ca7b38b3e5e9d1b0013c7b6be9639d6578d14", size = 7277711, upload-time = "2026-03-30T08:48:19.627Z" }, + { url = "https://files.pythonhosted.org/packages/e8/43/f437a78f7f4f1d311804189e8f11fb311a01049b2e08557c1068d470cb2e/grpcio-1.80.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dcc70e9f0ba987526e8e8603a610fb4f460e42899e74e7a518bf3c68fe1bf05", size = 6785372, upload-time = "2026-03-30T08:48:22.373Z" }, + { url = "https://files.pythonhosted.org/packages/93/3d/f6558e9c6296cb4227faa5c43c54a34c68d32654b829f53288313d16a86e/grpcio-1.80.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:448c884b668b868562b1bda833c5fce6272d26e1926ec46747cda05741d302c1", size = 7395268, upload-time = "2026-03-30T08:48:25.638Z" }, + { url = "https://files.pythonhosted.org/packages/06/21/0fdd77e84720b08843c371a2efa6f2e19dbebf56adc72df73d891f5506f0/grpcio-1.80.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a1dc80fe55685b4a543555e6eef975303b36c8db1023b1599b094b92aa77965f", size = 8392000, upload-time = "2026-03-30T08:48:28.974Z" }, + { url = "https://files.pythonhosted.org/packages/f5/68/67f4947ed55d2e69f2cc199ab9fd85e0a0034d813bbeef84df6d2ba4d4b7/grpcio-1.80.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:31b9ac4ad1aa28ffee5503821fafd09e4da0a261ce1c1281c6c8da0423c83b6e", size = 7828477, upload-time = "2026-03-30T08:48:32.054Z" }, + { url = "https://files.pythonhosted.org/packages/44/b6/8d4096691b2e385e8271911a0de4f35f0a6c7d05aff7098e296c3de86939/grpcio-1.80.0-cp314-cp314-win32.whl", hash = "sha256:367ce30ba67d05e0592470428f0ec1c31714cab9ef19b8f2e37be1f4c7d32fae", size = 4218563, upload-time = "2026-03-30T08:48:34.538Z" }, + { url = "https://files.pythonhosted.org/packages/e5/8c/bbe6baf2557262834f2070cf668515fa308b2d38a4bbf771f8f7872a7036/grpcio-1.80.0-cp314-cp314-win_amd64.whl", hash = "sha256:3b01e1f5464c583d2f567b2e46ff0d516ef979978f72091fd81f5ab7fa6e2e7f", size = 5019457, upload-time = "2026-03-30T08:48:37.308Z" }, ] [[package]] @@ -1549,44 +1172,34 @@ wheels = [ [[package]] name = "hf-xet" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020, upload-time = "2025-10-24T19:04:32.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870, upload-time = "2025-10-24T19:04:11.422Z" }, - { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584, upload-time = "2025-10-24T19:04:09.586Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004, upload-time = "2025-10-24T19:04:00.314Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636, upload-time = "2025-10-24T19:03:58.111Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448, upload-time = "2025-10-24T19:04:20.951Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401, upload-time = "2025-10-24T19:04:22.549Z" }, - { url = "https://files.pythonhosted.org/packages/4e/64/48fffbd67fb418ab07451e4ce641a70de1c40c10a13e25325e24858ebe5a/hf_xet-1.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382", size = 2900866, upload-time = "2025-10-24T19:04:33.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861, upload-time = "2025-10-24T19:04:19.01Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699, upload-time = "2025-10-24T19:04:17.306Z" }, - { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885, upload-time = "2025-10-24T19:04:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550, upload-time = "2025-10-24T19:04:05.55Z" }, - { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010, upload-time = "2025-10-24T19:04:28.598Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264, upload-time = "2025-10-24T19:04:30.397Z" }, - { url = "https://files.pythonhosted.org/packages/17/b5/33764714923fa1ff922770f7ed18c2daae034d21ae6e10dbf4347c854154/hf_xet-1.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc", size = 2901071, upload-time = "2025-10-24T19:04:37.463Z" }, - { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099, upload-time = "2025-10-24T19:04:15.366Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178, upload-time = "2025-10-24T19:04:13.695Z" }, - { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214, upload-time = "2025-10-24T19:04:03.596Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054, upload-time = "2025-10-24T19:04:01.949Z" }, - { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812, upload-time = "2025-10-24T19:04:24.585Z" }, - { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920, upload-time = "2025-10-24T19:04:26.927Z" }, - { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735, upload-time = "2025-10-24T19:04:35.928Z" }, -] - -[[package]] -name = "html5lib" -version = "1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/b6/b55c3f49042f1df3dcd422b7f224f939892ee94f22abcf503a9b7339eaf2/html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f", size = 272215, upload-time = "2020-06-22T23:32:38.834Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", size = 112173, upload-time = "2020-06-22T23:32:36.781Z" }, +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/92/ec9ad04d0b5728dca387a45af7bc98fbb0d73b2118759f5f6038b61a57e8/hf_xet-1.4.3.tar.gz", hash = "sha256:8ddedb73c8c08928c793df2f3401ec26f95be7f7e516a7bee2fbb546f6676113", size = 670477, upload-time = "2026-03-31T22:40:07.874Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/43/724d307b34e353da0abd476e02f72f735cdd2bc86082dee1b32ea0bfee1d/hf_xet-1.4.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:7551659ba4f1e1074e9623996f28c3873682530aee0a846b7f2f066239228144", size = 3800935, upload-time = "2026-03-31T22:39:49.618Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d2/8bee5996b699262edb87dbb54118d287c0e1b2fc78af7cdc41857ba5e3c4/hf_xet-1.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bee693ada985e7045997f05f081d0e12c4c08bd7626dc397f8a7c487e6c04f7f", size = 3558942, upload-time = "2026-03-31T22:39:47.938Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a1/e993d09cbe251196fb60812b09a58901c468127b7259d2bf0f68bf6088eb/hf_xet-1.4.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21644b404bb0100fe3857892f752c4d09642586fd988e61501c95bbf44b393a3", size = 4207657, upload-time = "2026-03-31T22:39:39.69Z" }, + { url = "https://files.pythonhosted.org/packages/64/44/9eb6d21e5c34c63e5e399803a6932fa983cabdf47c0ecbcfe7ea97684b8c/hf_xet-1.4.3-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:987f09cfe418237812896a6736b81b1af02a3a6dcb4b4944425c4c4fca7a7cf8", size = 3986765, upload-time = "2026-03-31T22:39:37.936Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/8ad6f16fdb82f5f7284a34b5ec48645bd575bdcd2f6f0d1644775909c486/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:60cf7fc43a99da0a853345cf86d23738c03983ee5249613a6305d3e57a5dca74", size = 4188162, upload-time = "2026-03-31T22:39:58.382Z" }, + { url = "https://files.pythonhosted.org/packages/1b/c4/39d6e136cbeea9ca5a23aad4b33024319222adbdc059ebcda5fc7d9d5ff4/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2815a49a7a59f3e2edf0cf113ae88e8cb2ca2a221bf353fb60c609584f4884d4", size = 4424525, upload-time = "2026-03-31T22:40:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/46/f2/adc32dae6bdbc367853118b9878139ac869419a4ae7ba07185dc31251b76/hf_xet-1.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:42ee323265f1e6a81b0e11094564fb7f7e0ec75b5105ffd91ae63f403a11931b", size = 3671610, upload-time = "2026-03-31T22:40:10.42Z" }, + { url = "https://files.pythonhosted.org/packages/e2/19/25d897dcc3f81953e0c2cde9ec186c7a0fee413eb0c9a7a9130d87d94d3a/hf_xet-1.4.3-cp313-cp313t-win_arm64.whl", hash = "sha256:27c976ba60079fb8217f485b9c5c7fcd21c90b0367753805f87cb9f3cdc4418a", size = 3528529, upload-time = "2026-03-31T22:40:09.106Z" }, + { url = "https://files.pythonhosted.org/packages/ec/36/3e8f85ca9fe09b8de2b2e10c63b3b3353d7dda88a0b3d426dffbe7b8313b/hf_xet-1.4.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5251d5ece3a81815bae9abab41cf7ddb7bcb8f56411bce0827f4a3071c92fdc6", size = 3801019, upload-time = "2026-03-31T22:39:56.651Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9c/defb6cb1de28bccb7bd8d95f6e60f72a3d3fa4cb3d0329c26fb9a488bfe7/hf_xet-1.4.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1feb0f3abeacee143367c326a128a2e2b60868ec12a36c225afb1d6c5a05e6d2", size = 3558746, upload-time = "2026-03-31T22:39:54.766Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/8d001191893178ff8e826e46ad5299446e62b93cd164e17b0ffea08832ec/hf_xet-1.4.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b301fc150290ca90b4fccd079829b84bb4786747584ae08b94b4577d82fb791", size = 4207692, upload-time = "2026-03-31T22:39:46.246Z" }, + { url = "https://files.pythonhosted.org/packages/ce/48/6790b402803250e9936435613d3a78b9aaeee7973439f0918848dde58309/hf_xet-1.4.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:d972fbe95ddc0d3c0fc49b31a8a69f47db35c1e3699bf316421705741aab6653", size = 3986281, upload-time = "2026-03-31T22:39:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/51/56/ea62552fe53db652a9099eda600b032d75554d0e86c12a73824bfedef88b/hf_xet-1.4.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c5b48db1ee344a805a1b9bd2cda9b6b65fe77ed3787bd6e87ad5521141d317cd", size = 4187414, upload-time = "2026-03-31T22:40:04.951Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f5/bc1456d4638061bea997e6d2db60a1a613d7b200e0755965ec312dc1ef79/hf_xet-1.4.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:22bdc1f5fb8b15bf2831440b91d1c9bbceeb7e10c81a12e8d75889996a5c9da8", size = 4424368, upload-time = "2026-03-31T22:40:06.347Z" }, + { url = "https://files.pythonhosted.org/packages/e4/76/ab597bae87e1f06d18d3ecb8ed7f0d3c9a37037fc32ce76233d369273c64/hf_xet-1.4.3-cp314-cp314t-win_amd64.whl", hash = "sha256:0392c79b7cf48418cd61478c1a925246cf10639f4cd9d94368d8ca1e8df9ea07", size = 3672280, upload-time = "2026-03-31T22:40:16.401Z" }, + { url = "https://files.pythonhosted.org/packages/62/05/2e462d34e23a09a74d73785dbed71cc5dbad82a72eee2ad60a72a554155d/hf_xet-1.4.3-cp314-cp314t-win_arm64.whl", hash = "sha256:681c92a07796325778a79d76c67011764ecc9042a8c3579332b61b63ae512075", size = 3528945, upload-time = "2026-03-31T22:40:14.995Z" }, + { url = "https://files.pythonhosted.org/packages/ac/9f/9c23e4a447b8f83120798f9279d0297a4d1360bdbf59ef49ebec78fe2545/hf_xet-1.4.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:d0da85329eaf196e03e90b84c2d0aca53bd4573d097a75f99609e80775f98025", size = 3805048, upload-time = "2026-03-31T22:39:53.105Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f8/7aacb8e5f4a7899d39c787b5984e912e6c18b11be136ef13947d7a66d265/hf_xet-1.4.3-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:e23717ce4186b265f69afa66e6f0069fe7efbf331546f5c313d00e123dc84583", size = 3562178, upload-time = "2026-03-31T22:39:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/df/9a/a24b26dc8a65f0ecc0fe5be981a19e61e7ca963b85e062c083f3a9100529/hf_xet-1.4.3-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc360b70c815bf340ed56c7b8c63aacf11762a4b099b2fe2c9bd6d6068668c08", size = 4212320, upload-time = "2026-03-31T22:39:42.922Z" }, + { url = "https://files.pythonhosted.org/packages/53/60/46d493db155d2ee2801b71fb1b0fd67696359047fdd8caee2c914cc50c79/hf_xet-1.4.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39f2d2e9654cd9b4319885733993807aab6de9dfbd34c42f0b78338d6617421f", size = 3991546, upload-time = "2026-03-31T22:39:41.335Z" }, + { url = "https://files.pythonhosted.org/packages/bc/f5/067363e1c96c6b17256910830d1b54099d06287e10f4ec6ec4e7e08371fc/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:49ad8a8cead2b56051aa84d7fce3e1335efe68df3cf6c058f22a65513885baac", size = 4193200, upload-time = "2026-03-31T22:40:01.936Z" }, + { url = "https://files.pythonhosted.org/packages/42/4b/53951592882d9c23080c7644542fda34a3813104e9e11fa1a7d82d419cb8/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7716d62015477a70ea272d2d68cd7cad140f61c52ee452e133e139abfe2c17ba", size = 4429392, upload-time = "2026-03-31T22:40:03.492Z" }, + { url = "https://files.pythonhosted.org/packages/8a/21/75a6c175b4e79662ad8e62f46a40ce341d8d6b206b06b4320d07d55b188c/hf_xet-1.4.3-cp37-abi3-win_amd64.whl", hash = "sha256:6b591fcad34e272a5b02607485e4f2a1334aebf1bc6d16ce8eb1eb8978ac2021", size = 3677359, upload-time = "2026-03-31T22:40:13.619Z" }, + { url = "https://files.pythonhosted.org/packages/8a/7c/44314ecd0e89f8b2b51c9d9e5e7a60a9c1c82024ac471d415860557d3cd8/hf_xet-1.4.3-cp37-abi3-win_arm64.whl", hash = "sha256:7c2c7e20bcfcc946dc67187c203463f5e932e395845d098cc2a93f5b67ca0b47", size = 3533664, upload-time = "2026-03-31T22:40:12.152Z" }, ] [[package]] @@ -1657,21 +1270,22 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.36.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, { name = "packaging" }, { name = "pyyaml" }, - { name = "requests" }, { name = "tqdm" }, + { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/63/4910c5fa9128fdadf6a9c5ac138e8b1b6cee4ca44bf7915bbfbce4e355ee/huggingface_hub-0.36.0.tar.gz", hash = "sha256:47b3f0e2539c39bf5cde015d63b72ec49baff67b6931c3d97f3f84532e2b8d25", size = 463358, upload-time = "2025-10-23T12:12:01.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/2a/a847fd02261cd051da218baf99f90ee7c7040c109a01833db4f838f25256/huggingface_hub-1.8.0.tar.gz", hash = "sha256:c5627b2fd521e00caf8eff4ac965ba988ea75167fad7ee72e17f9b7183ec63f3", size = 735839, upload-time = "2026-03-25T16:01:28.152Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/bd/1a875e0d592d447cbc02805fd3fe0f497714d6a2583f59d14fa9ebad96eb/huggingface_hub-0.36.0-py3-none-any.whl", hash = "sha256:7bcc9ad17d5b3f07b57c78e79d527102d08313caa278a641993acddcb894548d", size = 566094, upload-time = "2025-10-23T12:11:59.557Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/8a3a16ea4d202cb641b51d2681bdd3d482c1c592d7570b3fa264730829ce/huggingface_hub-1.8.0-py3-none-any.whl", hash = "sha256:d3eb5047bd4e33c987429de6020d4810d38a5bef95b3b40df9b17346b7f353f2", size = 625208, upload-time = "2026-03-25T16:01:26.603Z" }, ] [[package]] @@ -1750,11 +1364,11 @@ wheels = [ [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, ] [[package]] @@ -1879,13 +1493,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, ] +[[package]] +name = "joserfc" +version = "1.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/c6/de8fdbdfa75c8ca04fead38a82d573df8a82906e984c349d58665f459558/joserfc-1.6.4.tar.gz", hash = "sha256:34ce5f499bfcc5e9ad4cc75077f9278ab3227b71da9aaf28f9ab705f8a560d3c", size = 231866, upload-time = "2026-04-13T13:15:40.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/f7/210b27752e972edb36d239315b08d3eb6b14824cc4a590da2337d195260b/joserfc-1.6.4-py3-none-any.whl", hash = "sha256:3e4a22b509b41908989237a045e25c8308d5fd47ab96bdae2dd8057c6451003a", size = 70464, upload-time = "2026-04-13T13:15:39.259Z" }, +] + [[package]] name = "json-repair" -version = "0.30.2" +version = "0.58.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/17/9d/e5149a3699b56fd2556c84ad4d265f8f88cda2da6eaa4c4c8a1b2db34e91/json_repair-0.30.2.tar.gz", hash = "sha256:aa244f0d91e81c9587b2b6981a5657a7d4fadb20051f74bc6110f1ca6a963fb9", size = 27731, upload-time = "2024-11-14T06:20:11.329Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/68/119efc8f5f9fc8cf4f35bbfe28c5b84a14e237be4647a53cb29390e06102/json_repair-0.58.7.tar.gz", hash = "sha256:2ea5c841cc1d91dbbe79e9ed4b2b77a5cc04d20892d62a15261b70ce999ec758", size = 46312, upload-time = "2026-03-26T19:12:13.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e0/6eb79e8b0379df19d0567adbe4c4cde4a328423bf0452a4dcd77aa00f901/json_repair-0.30.2-py3-none-any.whl", hash = "sha256:824d7ab208f5daadf7925e362979870ba91f9a5e6242d59f7073c7171abe27b5", size = 18871, upload-time = "2024-11-14T06:20:09.715Z" }, + { url = "https://files.pythonhosted.org/packages/2a/70/1c3d2304b7972a3e9430f1672b4fe20061c0ffc56662ad7c63d0e77a7d1a/json_repair-0.58.7-py3-none-any.whl", hash = "sha256:af0c7ff6a2ddd80bb1e7e6121c1a86d8bb57a539aa211acbfb25c64087b7116f", size = 44545, upload-time = "2026-03-26T19:12:12.445Z" }, ] [[package]] @@ -1909,6 +1535,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595, upload-time = "2024-06-10T19:24:40.698Z" }, ] +[[package]] +name = "jsonref" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", size = 8814, upload-time = "2023-01-16T16:10:04.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", size = 9425, upload-time = "2023-01-16T16:10:02.255Z" }, +] + [[package]] name = "jsonschema" version = "4.22.0" @@ -2080,47 +1715,62 @@ wheels = [ [[package]] name = "langchain" -version = "0.3.27" +version = "1.2.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, - { name = "langchain-text-splitters" }, - { name = "langsmith" }, + { name = "langgraph" }, { name = "pydantic" }, - { name = "pyyaml" }, - { name = "requests" }, - { name = "sqlalchemy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/f6/f4f7f3a56626fe07e2bb330feb61254dbdf06c506e6b59a536a337da51cf/langchain-0.3.27.tar.gz", hash = "sha256:aa6f1e6274ff055d0fd36254176770f356ed0a8994297d1df47df341953cec62", size = 10233809, upload-time = "2025-07-24T14:42:32.959Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/3f/888a7099d2bd2917f8b0c3ffc7e347f1e664cf64267820b0b923c4f339fc/langchain-1.2.15.tar.gz", hash = "sha256:1717b6719daefae90b2728314a5e2a117ff916291e2862595b6c3d6fba33d652", size = 574732, upload-time = "2026-04-03T14:26:03.994Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/d5/4861816a95b2f6993f1360cfb605aacb015506ee2090433a71de9cca8477/langchain-0.3.27-py3-none-any.whl", hash = "sha256:7b20c4f338826acb148d885b20a73a16e410ede9ee4f19bb02011852d5f98798", size = 1018194, upload-time = "2025-07-24T14:42:30.23Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e8/a3b8cb0005553f6a876865073c81ef93bd7c5b18381bcb9ba4013af96ebc/langchain-1.2.15-py3-none-any.whl", hash = "sha256:e349db349cb3e9550c4044077cf90a1717691756cc236438404b23500e615874", size = 112714, upload-time = "2026-04-03T14:26:02.557Z" }, ] [[package]] name = "langchain-arangodb" -version = "1.2.0" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cityhash" }, { name = "langchain" }, + { name = "langchain-classic" }, { name = "langchain-core" }, { name = "numpy" }, { name = "python-arango" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/a5/a5d2af4bb3403a7fe02644a0021a6fbb05a14a4549aea35ad0d4d1439827/langchain_arangodb-1.2.0.tar.gz", hash = "sha256:f1ffd3280936aefd7c33e9b06a066de4015726f653f912af8a384c3d016c62c2", size = 34568, upload-time = "2025-08-15T19:24:43.844Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/cf/df63b5f2c241629544c6970d8bc4fd687d9088e945826ba6bc3b3758f9ea/langchain_arangodb-2.1.0.tar.gz", hash = "sha256:da4b089058dbb075cb19b3f0fdcd40898217d5dd2a9b489c8e8bc1e9f20dc90b", size = 39239, upload-time = "2025-12-03T20:20:13.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/2a/b33b29f491445dd7526572b1ee21141989278dfbc2fe2c2cd932bd356261/langchain_arangodb-1.2.0-py3-none-any.whl", hash = "sha256:805a37f73d079c17a97a88348b4f4e3fddb32f2e6fae7faad2f1e95aba83444b", size = 37419, upload-time = "2025-08-15T19:24:42.806Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c3/9aa099465240b4526ac67ce2c70af5b3ee235ecc6e703d902f48f0a5cfa2/langchain_arangodb-2.1.0-py3-none-any.whl", hash = "sha256:2916b9529f4db9f727b3cb00568ca2237a7c269b55b498421f92edae4a2089f1", size = 42154, upload-time = "2025-12-03T20:20:12.958Z" }, +] + +[[package]] +name = "langchain-classic" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "langchain-core" }, + { name = "langchain-text-splitters" }, + { name = "langsmith" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlalchemy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/04/b01c09e37414bab9f209efa311502841a3c0de5bc6c35e729c8d8a9893c9/langchain_classic-1.0.3.tar.gz", hash = "sha256:168ef1dfbfb18cae5a9ff0accecc9413a5b5aa3464b53fa841561a3384b6324a", size = 10534933, upload-time = "2026-03-13T13:56:11.96Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/e6/cfdeedec0537ffbf5041773590d25beb7f2aa467cc6630e788c9c7c72c3e/langchain_classic-1.0.3-py3-none-any.whl", hash = "sha256:26df1ec9806b1fbff19d9085a747ea7d8d82d7e3fb1d25132859979de627ef79", size = 1041335, upload-time = "2026-03-13T13:56:09.677Z" }, ] [[package]] name = "langchain-community" -version = "0.3.31" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "dataclasses-json" }, { name = "httpx-sse" }, - { name = "langchain" }, + { name = "langchain-classic" }, { name = "langchain-core" }, { name = "langsmith" }, { name = "numpy" }, @@ -2130,14 +1780,14 @@ dependencies = [ { name = "sqlalchemy" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/49/2ff5354273809e9811392bc24bcffda545a196070666aef27bc6aacf1c21/langchain_community-0.3.31.tar.gz", hash = "sha256:250e4c1041539130f6d6ac6f9386cb018354eafccd917b01a4cff1950b80fd81", size = 33241237, upload-time = "2025-10-07T20:17:57.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/97/a03585d42b9bdb6fbd935282d6e3348b10322a24e6ce12d0c99eb461d9af/langchain_community-0.4.1.tar.gz", hash = "sha256:f3b211832728ee89f169ddce8579b80a085222ddb4f4ed445a46e977d17b1e85", size = 33241144, upload-time = "2025-10-27T15:20:32.504Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/0a/b8848db67ad7c8d4652cb6f4cb78d49b5b5e6e8e51d695d62025aa3f7dbc/langchain_community-0.3.31-py3-none-any.whl", hash = "sha256:1c727e3ebbacd4d891b07bd440647668001cea3e39cbe732499ad655ec5cb569", size = 2532920, upload-time = "2025-10-07T20:17:54.91Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a4/c4fde67f193401512337456cabc2148f2c43316e445f5decd9f8806e2992/langchain_community-0.4.1-py3-none-any.whl", hash = "sha256:2135abb2c7748a35c84613108f7ebf30f8505b18c3c18305ffaecfc7651f6c6a", size = 2533285, upload-time = "2025-10-27T15:20:30.767Z" }, ] [[package]] name = "langchain-core" -version = "0.3.80" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, @@ -2147,103 +1797,96 @@ dependencies = [ { name = "pyyaml" }, { name = "tenacity" }, { name = "typing-extensions" }, + { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/49/f76647b7ba1a6f9c11b0343056ab4d3e5fc445981d205237fed882b2ad60/langchain_core-0.3.80.tar.gz", hash = "sha256:29636b82513ab49e834764d023c4d18554d3d719a185d37b019d0a8ae948c6bb", size = 583629, upload-time = "2025-11-19T22:23:18.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/fe/20190232d9b513242899dbb0c2bb77e31b4d61e343743adbe90ebc2603d2/langchain_core-1.3.0.tar.gz", hash = "sha256:14a39f528bf459aa3aa40d0a7f7f1bae7520d435ef991ae14a4ceb74d8c49046", size = 860755, upload-time = "2026-04-17T14:51:38.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/e8/e7a090ebe37f2b071c64e81b99fb1273b3151ae932f560bb94c22f191cde/langchain_core-0.3.80-py3-none-any.whl", hash = "sha256:2141e3838d100d17dce2359f561ec0df52c526bae0de6d4f469f8026c5747456", size = 450786, upload-time = "2025-11-19T22:23:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e2/dbfa347aa072a6dc4cd38d6f9ebfc730b4c14c258c47f480f4c5c546f177/langchain_core-1.3.0-py3-none-any.whl", hash = "sha256:baf16ee028475df177b9ab8869a751c79406d64a6f12125b93802991b566cced", size = 515140, upload-time = "2026-04-17T14:51:36.274Z" }, ] [[package]] name = "langchain-elasticsearch" -version = "0.4.0" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "elasticsearch", extra = ["vectorstore-mmr"] }, { name = "langchain-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/bc/7de55c2f1f3fa9b939237cb2afe70c74e94d2c281411e7067bae972836a2/langchain_elasticsearch-0.4.0.tar.gz", hash = "sha256:5f5502637f761868d7ab89ee97432dc0eec9eaf5240556fe5bd229a2c39f2077", size = 38152, upload-time = "2025-10-29T15:17:39.178Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/91/d1abf29d4feef8276b84cc572ace9c3dddf191e29eb168feba547bb67bc5/langchain_elasticsearch-1.0.0.tar.gz", hash = "sha256:9211f9507c412e4b0642b9686eab3124e000a30c1f600f2edb8193d0710ad305", size = 40906, upload-time = "2025-12-16T16:51:53.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/e2/51f6334d317ba35ce67354bf86dd578c3c3ecde3784396bf7cf7169595c0/langchain_elasticsearch-0.4.0-py3-none-any.whl", hash = "sha256:9d7c3d3e573ff7b4b4e857483d4f7f6d0edb7409ce5134beb734e0fa7f784aa8", size = 46067, upload-time = "2025-10-29T15:17:38.354Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1c/d8445772488aab3b34c2e7f41d6d1531bf2a50ca1b0b5e31a4f751bca6f8/langchain_elasticsearch-1.0.0-py3-none-any.whl", hash = "sha256:bcca1f10baed48452167c00f9d0919a681033cfa4cdf7d4672017d7b427daab9", size = 54457, upload-time = "2025-12-16T16:51:52.477Z" }, ] [[package]] name = "langchain-experimental" -version = "0.3.4" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-community" }, { name = "langchain-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/56/a8acbb08a03383c28875b3b151e4cefea5612266917fbd6fc3c14c21e172/langchain_experimental-0.3.4.tar.gz", hash = "sha256:937c4259ee4a639c618d19acf0e2c5c2898ef127050346edc5655259aa281a21", size = 140532, upload-time = "2024-12-20T15:16:09.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/ec/6fe7b2e3c105b4f4fc6b943d8fc1b5b10f883429edc36c58a09fc2e28419/langchain_experimental-0.4.1.tar.gz", hash = "sha256:ab6b19a0b98fbc15225fbfcf096176fec339b7e3e930bcf328bb717985fc1da5", size = 170449, upload-time = "2025-12-11T05:30:48.455Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/27/fe8caa4884611286b1f7d6c5cfd76e1fef188faaa946db4fde6daa1cd2cd/langchain_experimental-0.3.4-py3-none-any.whl", hash = "sha256:2e587306aea36b60fa5e5fc05dc7281bee9f60a806f0bf9d30916e0ee096af80", size = 209154, upload-time = "2024-12-20T15:16:07.006Z" }, + { url = "https://files.pythonhosted.org/packages/24/fa/fb2c8b6418e1c9ef50c82b3b6e0184bce321582577240bb4b8ed3274a4aa/langchain_experimental-0.4.1-py3-none-any.whl", hash = "sha256:b6ee2f42b50aaadb45e581439ecf5ee50f3a6a0986d52e74d1e64721309e387d", size = 210096, upload-time = "2025-12-11T05:30:47.234Z" }, ] [[package]] name = "langchain-milvus" -version = "0.2.1" +version = "0.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "pymilvus" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/dd/5e8b7f6f17da0e54205956feab3f7856cb7dc821dbe817f2990aa028e4cc/langchain_milvus-0.2.1.tar.gz", hash = "sha256:6e60e43959464ae2be9dadceb4fab6b3ddcec5bb1f2d29e898924f1c2651baf1", size = 32639, upload-time = "2025-06-28T09:59:53.826Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/21/ecce785a24e61ba2c0f6249a5a68b969ccc053342f933aeab31a3f885f5e/langchain_milvus-0.3.3.tar.gz", hash = "sha256:406c2d88da133741f5cc3e2fea4b36386182b35500205c70d003382ded210e41", size = 35577, upload-time = "2026-01-05T10:01:16.386Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/b1/54e176cc8ac80df9a2c4ee9f726d6383fcf9818317c68532cfc90fa91b6c/langchain_milvus-0.2.1-py3-none-any.whl", hash = "sha256:faabf4685c15ef9651605172427073d6ffc52c0f36f3b88842977db883062c99", size = 36110, upload-time = "2025-06-28T09:59:52.965Z" }, + { url = "https://files.pythonhosted.org/packages/be/5d/6a0dac51ca2343332d5de9c79686d54f905d225b173a8e1b03ae6d35982a/langchain_milvus-0.3.3-py3-none-any.whl", hash = "sha256:6e12f15453372dd48836978faa4a149de79c721df3322229ad732a5e628e8e97", size = 38962, upload-time = "2026-01-05T10:01:15.186Z" }, ] [[package]] name = "langchain-nvidia-ai-endpoints" -version = "0.3.19" +version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "filetype" }, { name = "langchain-core" }, + { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/0fcad6732f124c0d96fd7e8487a0b51db9f167964cfe041e4669a2148dbe/langchain_nvidia_ai_endpoints-0.3.19.tar.gz", hash = "sha256:1c420c88f7c78b2b2c2fdcef8e46104c2dd19c81e036bdd03a4838a6340950fe", size = 42884, upload-time = "2025-10-31T00:17:19.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/d5/5d70c7b7a66dfabc4c355e408a066e8bef7d2715f3b7854ce44704886119/langchain_nvidia_ai_endpoints-1.2.1.tar.gz", hash = "sha256:055d2511fa7374da65e5d3dd1705fb09125620a124c6247212d661286f64fa8d", size = 57520, upload-time = "2026-03-16T16:42:34.682Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/46/d7529004de384b2abc9e5b76cf4a84a23f3028ec6381bd5f7c00ac39bfab/langchain_nvidia_ai_endpoints-0.3.19-py3-none-any.whl", hash = "sha256:40161a71646fcbe457ac5f2222c5eadcbe31a7d79d618f5a0857c37fffa3a6d5", size = 46229, upload-time = "2025-10-31T00:17:18.306Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/99f72331842b0f62da891411c5590ff7fab70a1a753a9a1be9348921995e/langchain_nvidia_ai_endpoints-1.2.1-py3-none-any.whl", hash = "sha256:eafb2186dea25d163089552c062274664540f2cbe251861c515700645fbf256d", size = 61820, upload-time = "2026-03-16T16:42:33.657Z" }, ] [[package]] name = "langchain-openai" -version = "0.3.35" +version = "1.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "openai" }, { name = "tiktoken" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/96/06d0d25a37e05a0ff2d918f0a4b0bf0732aed6a43b472b0b68426ce04ef8/langchain_openai-0.3.35.tar.gz", hash = "sha256:fa985fd041c3809da256a040c98e8a43e91c6d165b96dcfeb770d8bd457bf76f", size = 786635, upload-time = "2025-10-06T15:09:28.463Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/ae/1dbeb49ab8f098f78ec52e21627e705e5d7c684dc8826c2c34cc2746233a/langchain_openai-1.1.9.tar.gz", hash = "sha256:fdee25dcf4b0685d8e2f59856f4d5405431ef9e04ab53afe19e2e8360fed8234", size = 1004828, upload-time = "2026-02-10T21:03:21.615Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d8/d5/c90c5478215c20ee71d8feaf676f7ffd78d0568f8c98bd83f81ce7562ed7/langchain_openai-0.3.35-py3-none-any.whl", hash = "sha256:76d5707e6e81fd461d33964ad618bd326cb661a1975cef7c1cb0703576bdada5", size = 75952, upload-time = "2025-10-06T15:09:27.137Z" }, + { url = "https://files.pythonhosted.org/packages/52/a1/8a20d19f69d022c10d34afa42d972cc50f971b880d0eb4a828cf3dd824a8/langchain_openai-1.1.9-py3-none-any.whl", hash = "sha256:ca2482b136c45fb67c0db84a9817de675e0eb8fb2203a33914c1b7a96f273940", size = 85769, upload-time = "2026-02-10T21:03:20.333Z" }, ] [[package]] name = "langchain-text-splitters" -version = "0.3.11" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/43/dcda8fd25f0b19cb2835f2f6bb67f26ad58634f04ac2d8eae00526b0fa55/langchain_text_splitters-0.3.11.tar.gz", hash = "sha256:7a50a04ada9a133bbabb80731df7f6ddac51bc9f1b9cab7fa09304d71d38a6cc", size = 46458, upload-time = "2025-08-31T23:02:58.316Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/38/14121ead61e0e75f79c3a35e5148ac7c2fe754a55f76eab3eed573269524/langchain_text_splitters-1.1.1.tar.gz", hash = "sha256:34861abe7c07d9e49d4dc852d0129e26b32738b60a74486853ec9b6d6a8e01d2", size = 279352, upload-time = "2026-02-18T23:02:42.798Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/0d/41a51b40d24ff0384ec4f7ab8dd3dcea8353c05c973836b5e289f1465d4f/langchain_text_splitters-0.3.11-py3-none-any.whl", hash = "sha256:cf079131166a487f1372c8ab5d0bfaa6c0a4291733d9c43a34a16ac9bcd6a393", size = 33845, upload-time = "2025-08-31T23:02:57.195Z" }, + { url = "https://files.pythonhosted.org/packages/84/66/d9e0c3b83b0ad75ee746c51ba347cacecb8d656b96e1d513f3e334d1ccab/langchain_text_splitters-1.1.1-py3-none-any.whl", hash = "sha256:5ed0d7bf314ba925041e7d7d17cd8b10f688300d5415fb26c29442f061e329dc", size = 35734, upload-time = "2026-02-18T23:02:41.913Z" }, ] -[[package]] -name = "langdetect" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/72/a3add0e4eec4eb9e2569554f7c70f4a3c27712f40e3284d483e88094cc0e/langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0", size = 981474, upload-time = "2021-05-07T07:54:13.562Z" } - [[package]] name = "langgraph" -version = "1.0.1" +version = "1.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, @@ -2253,9 +1896,9 @@ dependencies = [ { name = "pydantic" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/7c/a0f4211f751b8b37aae2d88c6243ceb14027ca9ebf00ac8f3b210657af6a/langgraph-1.0.1.tar.gz", hash = "sha256:4985b32ceabb046a802621660836355dfcf2402c5876675dc353db684aa8f563", size = 480245, upload-time = "2025-10-20T18:51:59.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/02/196eff4f673fd461f8780930c3bfa7f27d6533a48e4f1104d544e843b093/langgraph-1.1.8.tar.gz", hash = "sha256:a97b8248129f2e007b81eef8277009ad1e1280b75fa2175889ab5aff5dcc4578", size = 560389, upload-time = "2026-04-17T19:45:50.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/3c/acc0956a0da96b25a2c5c1a85168eacf1253639a04ed391d7a7bcaae5d6c/langgraph-1.0.1-py3-none-any.whl", hash = "sha256:892f04f64f4889abc80140265cc6bd57823dd8e327a5eef4968875f2cd9013bd", size = 155415, upload-time = "2025-10-20T18:51:58.321Z" }, + { url = "https://files.pythonhosted.org/packages/22/38/c72e795f6f8fd05a8e7c3be32c04ea8534294decc6785f3b04e0ce932e8a/langgraph-1.1.8-py3-none-any.whl", hash = "sha256:3278c7e335da25eac3327bb474c502d4cab94ae6dcc685fbf93be2bbf7664cd5", size = 173678, upload-time = "2026-04-17T19:45:48.991Z" }, ] [[package]] @@ -2273,28 +1916,28 @@ wheels = [ [[package]] name = "langgraph-prebuilt" -version = "1.0.1" +version = "1.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/b6/2bcb992acf67713a3557e51c1955854672ec6c1abe6ba51173a87eb8d825/langgraph_prebuilt-1.0.1.tar.gz", hash = "sha256:ecbfb9024d9d7ed9652dde24eef894650aaab96bf79228e862c503e2a060b469", size = 119918, upload-time = "2025-10-20T18:49:55.991Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/01471b1b5601f2e9c9a69c39fc9a2fb8611613ede0002e5a2b81c0acd850/langgraph_prebuilt-1.0.10.tar.gz", hash = "sha256:5a6fc513f8907074563b6218ff991c4ed9db19ac63101314919686e8029ddb07", size = 169769, upload-time = "2026-04-17T17:59:45.373Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/68/47/9ffd10882403020ea866e381de7f8e504a78f606a914af7f8244456c7783/langgraph_prebuilt-1.0.1-py3-none-any.whl", hash = "sha256:8c02e023538f7ef6ad5ed76219ba1ab4f6de0e31b749e4d278f57a8a95eec9f7", size = 28458, upload-time = "2025-10-20T18:49:54.723Z" }, + { url = "https://files.pythonhosted.org/packages/50/49/d073375beabdc6955df6cbe570ba7786836bd4c817ae998955d35037f2fd/langgraph_prebuilt-1.0.10-py3-none-any.whl", hash = "sha256:e3baa1977d819982e690a357ba5bb77ccc1d4d8d4a029c48e502a3b6d171185f", size = 36086, upload-time = "2026-04-17T17:59:44.395Z" }, ] [[package]] name = "langgraph-sdk" -version = "0.2.15" +version = "0.3.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "orjson" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/46/a0bc5914e4a418ad5e8558b19bccd6f0baf56d0c674d6d65a0acf4f22590/langgraph_sdk-0.2.15.tar.gz", hash = "sha256:8faaafe2c1193b89f782dd66c591060cd67862aa6aaf283749b7846f331d5334", size = 130343, upload-time = "2025-12-09T19:26:40.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/a1/012f0e0f5c9fd26f92bdc9d244756ad673c428230156ef668e6ec7c18cee/langgraph_sdk-0.3.12.tar.gz", hash = "sha256:c9c9ec22b3c0fcd352e2b8f32a815164f69446b8648ca22606329f4ff4c59a71", size = 194932, upload-time = "2026-03-18T22:15:54.592Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/c9/bf2bff18f85bb7973fa5280838580049574bd7649c36e3dd346c49304997/langgraph_sdk-0.2.15-py3-none-any.whl", hash = "sha256:746566a5d89aa47160eccc17d71682a78771c754126f6c235a68353d61ed7462", size = 66483, upload-time = "2025-12-09T19:26:39.198Z" }, + { url = "https://files.pythonhosted.org/packages/17/4d/4f796e86b03878ab20d9b30aaed1ad459eda71a5c5b67f7cfe712f3548f2/langgraph_sdk-0.3.12-py3-none-any.whl", hash = "sha256:44323804965d6ec2a07127b3cf08a0428ea6deaeb172c2d478d5cd25540e3327", size = 95834, upload-time = "2026-03-18T22:15:53.545Z" }, ] [[package]] @@ -2317,118 +1960,12 @@ wheels = [ ] [[package]] -name = "libcudf-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libkvikio-cu12" }, - { name = "librmm-cu12" }, - { name = "rapids-logger" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/69/529bd3a5b6d8edac3e530a0b71c3a8f620a544248c9e22d509852be269a7/libcudf_cu12-25.8.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:2ae790b881a67511b414451821ec894f014e4c49d3c62e8f230c45b56cfce0cb", size = 521220643, upload-time = "2025-08-07T11:49:07.039Z" }, - { url = "https://files.pythonhosted.org/packages/85/4d/9a390e427da02764cb62f50b6ce0e400d1bffc026b5e487d977ec885d543/libcudf_cu12-25.8.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:0106bb2861296985f0cfc2fb9c3052ee093df47d8d112fb06be93cf09ef15df8", size = 525893331, upload-time = "2025-08-07T11:43:07.838Z" }, -] - -[[package]] -name = "libcugraph-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libraft-cu12" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/62/05/86f5e09a5862ef8f20393196f042e75ec1ae7279d63c06dc2259d1be28d5/libcugraph_cu12-25.8.0.tar.gz", hash = "sha256:88fc01f7266c7d191da5481cccb1ff927ee168fb11008750a2bdc7b865cb4032", size = 3955, upload-time = "2025-08-07T14:47:38.39Z" } - -[[package]] -name = "libcuml-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libcuvs-cu12" }, - { name = "libraft-cu12" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cufft-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "rapids-logger" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/18/81b436414ceebb69c5b105b37d01c8784adb432eb836ba692f4a591018ab/libcuml_cu12-25.8.0.tar.gz", hash = "sha256:0054ae191c4c1da2368e9346cf17bda5613f21623af17fbee27f6ea47db555ca", size = 4100, upload-time = "2025-08-07T12:27:18.048Z" } - -[[package]] -name = "libcuvs-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libraft-cu12" }, - { name = "librmm-cu12" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nccl-cu12" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/d5/f0c58f03d550373d3317bb6afc44937a1bd1a4f1e645bc1ea75110545056/libcuvs_cu12-25.8.0.tar.gz", hash = "sha256:cb25e1011f577b32da9f5e3942691946142929c2574fd399f99a050b1489fe55", size = 4885, upload-time = "2025-08-07T12:26:36.93Z" } - -[[package]] -name = "libkvikio-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/6a/402fd6f73818f9d219729b0bf45621ae817962bad1c9bd0144fe6fc80309/libkvikio_cu12-25.8.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:c9ea93b12df6a708db5d6a7e552f9f6dbd30f3649c631a7a1cf0c71fcf995f54", size = 88399843, upload-time = "2025-08-07T12:21:03.282Z" }, - { url = "https://files.pythonhosted.org/packages/42/49/469ea014e81ed1e2f686180a8bcdbc7864c2ea2ce39c0d3bbd9ee1ec45a1/libkvikio_cu12-25.8.0-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:3cf2d41436b15abd9d7a4acb04677b2340620bc684ebc52ca43c3057eb88d40a", size = 88596567, upload-time = "2025-08-07T12:25:52.932Z" }, -] - -[[package]] -name = "libraft-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "librmm-cu12" }, - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-curand-cu12" }, - { name = "nvidia-cusolver-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nccl-cu12" }, - { name = "rapids-logger" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/96/ab/e673a105a208d56ba76f193d2ae6b3781a689742a979261e6f429c2276e8/libraft_cu12-25.8.0-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b31e97d8b0830e11e4ba834f850ac25804c3c6b9193928f373240c1b34c14d7", size = 22355464, upload-time = "2025-08-07T13:47:44.241Z" }, - { url = "https://files.pythonhosted.org/packages/2e/80/9c242d048643f890df5ddac572d447e80dd3a732bda1e0124f7d9ca1d0dd/libraft_cu12-25.8.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18f83987860bcb153a73068ee8eaadeab8ff24fd6dbb8aaf6356b2ad7d1cad01", size = 22383641, upload-time = "2025-08-07T13:42:20.798Z" }, -] - -[[package]] -name = "librmm-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "rapids-logger" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/fe/35789d6aed0df9336ca07fcb57e756f0f91df4136c5c3087ffa97f912f4e/librmm_cu12-25.8.0-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18381166e7d855d1ee9ab4684d2ab8af67a115e2015753f1ce91b8ef1ad06013", size = 3539813, upload-time = "2025-08-07T11:22:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/e1/88/e0dcc6504a49c797889fed16275e6f985c714e6e2c930399ae6b53e30a66/librmm_cu12-25.8.0-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0cb30ff7fec4cab6355c085f606c9ad57d3be529c81bfc0dc15af69c812f028", size = 3533237, upload-time = "2025-08-07T11:22:10.902Z" }, -] - -[[package]] -name = "libucx-cu12" -version = "1.18.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/d1/530d24152ec715b83f60b201c841992e1a96730e44ffafe14786f459f8b3/libucx_cu12-1.18.1-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:0d8362f7c84fbb44afd659a4ff5b925f6e5ec0a9052a4a891afbbb8c59daa2dd", size = 26961705, upload-time = "2025-05-01T17:20:18.427Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f0/8b97607bdff763155dbe0f9f351c87d619ede60a4fc1315130623d32f00a/libucx_cu12-1.18.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:d8fa5fc4bd76b2796e083bb3a7fb27373ccd9428daf6fe64d0dfd02fc0c95420", size = 27680307, upload-time = "2025-05-01T17:20:21.805Z" }, -] - -[[package]] -name = "libucxx-cu12" -version = "0.45.1" +name = "lark" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "librmm-cu12" }, - { name = "libucx-cu12" }, -] +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/a8/4d4fd58b4eb09bc6c373c7aa583bcebb888030ff844bdfc42af6c6a2f22d/libucxx_cu12-0.45.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4d0f981829b8a0f6f158986cdcd10db396b1319ed0186b4c9b66c5b490deb13", size = 499863, upload-time = "2025-08-07T15:00:40.743Z" }, - { url = "https://files.pythonhosted.org/packages/f2/3a/fb6936aed8b345a332be23184b6c18481d3fe35cf6c3cbd8fd7f6a13e24c/libucxx_cu12-0.45.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:07207b65c9af86a8ad89361be08b3f36b00bcc8c38e71f5c4ea887a043774a8d", size = 511339, upload-time = "2025-08-07T15:05:18.502Z" }, + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, ] [[package]] @@ -2449,104 +1986,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193, upload-time = "2025-01-20T11:14:38.578Z" }, ] -[[package]] -name = "locket" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", size = 4350, upload-time = "2022-04-20T22:04:44.312Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398, upload-time = "2022-04-20T22:04:42.23Z" }, -] - -[[package]] -name = "lxml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, - { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, - { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, - { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, - { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, - { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, - { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, - { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, - { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, - { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, - { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, - { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, - { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, - { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, - { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, - { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, - { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, - { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, - { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, - { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, - { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, - { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, - { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, - { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, - { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, - { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, - { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, - { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, - { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, - { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, - { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, - { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, - { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, - { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, -] - -[[package]] -name = "markdown" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" }, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2731,16 +2170,14 @@ wheels = [ [[package]] name = "milvus-lite" -version = "2.5.1" +version = "2.5.2rc1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/b2/acc5024c8e8b6a0b034670b8e8af306ebd633ede777dcbf557eac4785937/milvus_lite-2.5.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:6b014453200ba977be37ba660cb2d021030375fa6a35bc53c2e1d92980a0c512", size = 27934713, upload-time = "2025-06-30T04:23:37.028Z" }, - { url = "https://files.pythonhosted.org/packages/9b/2e/746f5bb1d6facd1e73eb4af6dd5efda11125b0f29d7908a097485ca6cad9/milvus_lite-2.5.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a2e031088bf308afe5f8567850412d618cfb05a65238ed1a6117f60decccc95a", size = 24421451, upload-time = "2025-06-30T04:23:51.747Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cf/3d1fee5c16c7661cf53977067a34820f7269ed8ba99fe9cf35efc1700866/milvus_lite-2.5.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a13277e9bacc6933dea172e42231f7e6135bd3bdb073dd2688ee180418abd8d9", size = 45337093, upload-time = "2025-06-30T04:24:06.706Z" }, - { url = "https://files.pythonhosted.org/packages/d3/82/41d9b80f09b82e066894d9b508af07b7b0fa325ce0322980674de49106a0/milvus_lite-2.5.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25ce13f4b8d46876dd2b7ac8563d7d8306da7ff3999bb0d14b116b30f71d706c", size = 55263911, upload-time = "2025-06-30T04:24:19.434Z" }, + { url = "https://files.pythonhosted.org/packages/46/ce/c30e5a36954e150c7a44f46c7f31bff7037c2dd0ecf67270afad8407de7b/milvus_lite-2.5.2rc1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:94c673bb0657932d5daa9da3d8e5a0bbd3fbca2bcf642099fbdf0725dbcab6d4", size = 25447421, upload-time = "2026-02-22T11:16:25.045Z" }, + { url = "https://files.pythonhosted.org/packages/d9/53/24cc996139be85c86a883a48747db4054783b425e73865af6fe091724022/milvus_lite-2.5.2rc1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:39be8d47207314a6b1deb9c78301f2c5b0f29978f05724b15d12ce25c95df93e", size = 56122541, upload-time = "2026-02-22T11:22:40.483Z" }, ] [[package]] @@ -2768,42 +2205,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, ] -[[package]] -name = "ml-dtypes" -version = "0.5.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, - { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, - { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, - { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, - { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a1/4008f14bbc616cfb1ac5b39ea485f9c63031c4634ab3f4cf72e7541f816a/ml_dtypes-0.5.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c760d85a2f82e2bed75867079188c9d18dae2ee77c25a54d60e9cc79be1bc48", size = 676888, upload-time = "2025-11-17T22:31:56.907Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b7/dff378afc2b0d5a7d6cd9d3209b60474d9819d1189d347521e1688a60a53/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce756d3a10d0c4067172804c9cc276ba9cc0ff47af9078ad439b075d1abdc29b", size = 5036993, upload-time = "2025-11-17T22:31:58.497Z" }, - { url = "https://files.pythonhosted.org/packages/eb/33/40cd74219417e78b97c47802037cf2d87b91973e18bb968a7da48a96ea44/ml_dtypes-0.5.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:533ce891ba774eabf607172254f2e7260ba5f57bdd64030c9a4fcfbd99815d0d", size = 5010956, upload-time = "2025-11-17T22:31:59.931Z" }, - { url = "https://files.pythonhosted.org/packages/e1/8b/200088c6859d8221454825959df35b5244fa9bdf263fd0249ac5fb75e281/ml_dtypes-0.5.4-cp313-cp313-win_amd64.whl", hash = "sha256:f21c9219ef48ca5ee78402d5cc831bd58ea27ce89beda894428bc67a52da5328", size = 212224, upload-time = "2025-11-17T22:32:01.349Z" }, - { url = "https://files.pythonhosted.org/packages/8f/75/dfc3775cb36367816e678f69a7843f6f03bd4e2bcd79941e01ea960a068e/ml_dtypes-0.5.4-cp313-cp313-win_arm64.whl", hash = "sha256:35f29491a3e478407f7047b8a4834e4640a77d2737e0b294d049746507af5175", size = 160798, upload-time = "2025-11-17T22:32:02.864Z" }, - { url = "https://files.pythonhosted.org/packages/4f/74/e9ddb35fd1dd43b1106c20ced3f53c2e8e7fc7598c15638e9f80677f81d4/ml_dtypes-0.5.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:304ad47faa395415b9ccbcc06a0350800bc50eda70f0e45326796e27c62f18b6", size = 702083, upload-time = "2025-11-17T22:32:04.08Z" }, - { url = "https://files.pythonhosted.org/packages/74/f5/667060b0aed1aa63166b22897fdf16dca9eb704e6b4bbf86848d5a181aa7/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a0df4223b514d799b8a1629c65ddc351b3efa833ccf7f8ea0cf654a61d1e35d", size = 5354111, upload-time = "2025-11-17T22:32:05.546Z" }, - { url = "https://files.pythonhosted.org/packages/40/49/0f8c498a28c0efa5f5c95a9e374c83ec1385ca41d0e85e7cf40e5d519a21/ml_dtypes-0.5.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531eff30e4d368cb6255bc2328d070e35836aa4f282a0fb5f3a0cd7260257298", size = 5366453, upload-time = "2025-11-17T22:32:07.115Z" }, - { url = "https://files.pythonhosted.org/packages/8c/27/12607423d0a9c6bbbcc780ad19f1f6baa2b68b18ce4bddcdc122c4c68dc9/ml_dtypes-0.5.4-cp313-cp313t-win_amd64.whl", hash = "sha256:cb73dccfc991691c444acc8c0012bee8f2470da826a92e3a20bb333b1a7894e6", size = 225612, upload-time = "2025-11-17T22:32:08.615Z" }, - { url = "https://files.pythonhosted.org/packages/e5/80/5a5929e92c72936d5b19872c5fb8fc09327c1da67b3b68c6a13139e77e20/ml_dtypes-0.5.4-cp313-cp313t-win_arm64.whl", hash = "sha256:3bbbe120b915090d9dd1375e4684dd17a20a2491ef25d640a908281da85e73f1", size = 164145, upload-time = "2025-11-17T22:32:09.782Z" }, - { url = "https://files.pythonhosted.org/packages/72/4e/1339dc6e2557a344f5ba5590872e80346f76f6cb2ac3dd16e4666e88818c/ml_dtypes-0.5.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:2b857d3af6ac0d39db1de7c706e69c7f9791627209c3d6dedbfca8c7e5faec22", size = 673781, upload-time = "2025-11-17T22:32:11.364Z" }, - { url = "https://files.pythonhosted.org/packages/04/f9/067b84365c7e83bda15bba2b06c6ca250ce27b20630b1128c435fb7a09aa/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:805cef3a38f4eafae3a5bf9ebdcdb741d0bcfd9e1bd90eb54abd24f928cd2465", size = 5036145, upload-time = "2025-11-17T22:32:12.783Z" }, - { url = "https://files.pythonhosted.org/packages/c6/bb/82c7dcf38070b46172a517e2334e665c5bf374a262f99a283ea454bece7c/ml_dtypes-0.5.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14a4fd3228af936461db66faccef6e4f41c1d82fcc30e9f8d58a08916b1d811f", size = 5010230, upload-time = "2025-11-17T22:32:14.38Z" }, - { url = "https://files.pythonhosted.org/packages/e9/93/2bfed22d2498c468f6bcd0d9f56b033eaa19f33320389314c19ef6766413/ml_dtypes-0.5.4-cp314-cp314-win_amd64.whl", hash = "sha256:8c6a2dcebd6f3903e05d51960a8058d6e131fe69f952a5397e5dbabc841b6d56", size = 221032, upload-time = "2025-11-17T22:32:15.763Z" }, - { url = "https://files.pythonhosted.org/packages/76/a3/9c912fe6ea747bb10fe2f8f54d027eb265db05dfb0c6335e3e063e74e6e8/ml_dtypes-0.5.4-cp314-cp314-win_arm64.whl", hash = "sha256:5a0f68ca8fd8d16583dfa7793973feb86f2fbb56ce3966daf9c9f748f52a2049", size = 163353, upload-time = "2025-11-17T22:32:16.932Z" }, - { url = "https://files.pythonhosted.org/packages/cd/02/48aa7d84cc30ab4ee37624a2fd98c56c02326785750cd212bc0826c2f15b/ml_dtypes-0.5.4-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:bfc534409c5d4b0bf945af29e5d0ab075eae9eecbb549ff8a29280db822f34f9", size = 702085, upload-time = "2025-11-17T22:32:18.175Z" }, - { url = "https://files.pythonhosted.org/packages/5a/e7/85cb99fe80a7a5513253ec7faa88a65306be071163485e9a626fce1b6e84/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2314892cdc3fcf05e373d76d72aaa15fda9fb98625effa73c1d646f331fcecb7", size = 5355358, upload-time = "2025-11-17T22:32:19.7Z" }, - { url = "https://files.pythonhosted.org/packages/79/2b/a826ba18d2179a56e144aef69e57fb2ab7c464ef0b2111940ee8a3a223a2/ml_dtypes-0.5.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d2ffd05a2575b1519dc928c0b93c06339eb67173ff53acb00724502cda231cf", size = 5366332, upload-time = "2025-11-17T22:32:21.193Z" }, - { url = "https://files.pythonhosted.org/packages/84/44/f4d18446eacb20ea11e82f133ea8f86e2bf2891785b67d9da8d0ab0ef525/ml_dtypes-0.5.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4381fe2f2452a2d7589689693d3162e876b3ddb0a832cde7a414f8e1adf7eab1", size = 236612, upload-time = "2025-11-17T22:32:22.579Z" }, - { url = "https://files.pythonhosted.org/packages/ad/3f/3d42e9a78fe5edf792a83c074b13b9b770092a4fbf3462872f4303135f09/ml_dtypes-0.5.4-cp314-cp314t-win_arm64.whl", hash = "sha256:11942cbf2cf92157db91e5022633c0d9474d4dfd813a909383bd23ce828a4b7d", size = 168825, upload-time = "2025-11-17T22:32:23.766Z" }, -] - [[package]] name = "more-itertools" version = "10.8.0" @@ -2822,63 +2223,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] -[[package]] -name = "msgpack" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, - { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, - { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, - { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, - { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, - { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, - { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, - { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, - { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, - { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, - { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, - { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, - { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, - { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, - { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, - { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, - { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, - { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, - { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, - { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, - { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, - { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, - { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, - { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, - { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, - { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, - { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, - { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, -] - -[[package]] -name = "msoffcrypto-tool" -version = "5.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, - { name = "olefile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d2/b7/0fd6573157e0ec60c0c470e732ab3322fba4d2834fd24e1088d670522a01/msoffcrypto_tool-5.4.2.tar.gz", hash = "sha256:44b545adba0407564a0cc3d6dde6ca36b7c0fdf352b85bca51618fa1d4817370", size = 41183, upload-time = "2024-08-08T15:50:28.462Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/54/7f6d3d9acad083dae8c22d9ab483b657359a1bf56fee1d7af88794677707/msoffcrypto_tool-5.4.2-py3-none-any.whl", hash = "sha256:274fe2181702d1e5a107ec1b68a4c9fea997a44972ae1cc9ae0cb4f6a50fef0e", size = 48713, upload-time = "2024-08-08T15:50:27.093Z" }, -] - [[package]] name = "multidict" version = "6.7.0" @@ -3021,411 +2365,199 @@ wheels = [ [[package]] name = "nbconvert" -version = "7.16.6" +version = "7.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, - { name = "bleach", extra = ["css"] }, + { name = "bleach" }, { name = "defusedxml" }, { name = "jinja2" }, { name = "jupyter-core" }, { name = "jupyterlab-pygments" }, { name = "markupsafe" }, - { name = "mistune" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pandocfilters" }, - { name = "pygments" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" }, -] - -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, -] - -[[package]] -name = "nbsphinx" -version = "0.9.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "jinja2" }, - { name = "nbconvert" }, - { name = "nbformat" }, - { name = "sphinx" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/d1/82081750f8a78ad0399c6ed831d42623b891904e8e7b8a75878225cf1dce/nbsphinx-0.9.8.tar.gz", hash = "sha256:d0765908399a8ee2b57be7ae881cf2ea58d66db3af7bbf33e6eb48f83bea5495", size = 417469, upload-time = "2025-11-28T17:41:02.336Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl", hash = "sha256:92d95ee91784e56bc633b60b767a6b6f23a0445f891e24641ce3c3f004759ccf", size = 31961, upload-time = "2025-11-28T17:41:00.796Z" }, -] - -[[package]] -name = "neo4j" -version = "5.24.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pytz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/c3/20ce9449ca0784d6bc7b5c347af9fb2748c50235d80612a11d50c40fd2c3/neo4j-5.24.0.tar.gz", hash = "sha256:499ca35135847528f4ee70314bd49c8b08b031e4dfd588bb06c1c2fb35d729e2", size = 216031, upload-time = "2024-08-29T13:24:45.518Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/16/53e963b15cf08d62e521fe70feccc36e9a718617e483b0b132aeffd86072/neo4j-5.24.0-py3-none-any.whl", hash = "sha256:5b4705cfe8130020f33e75e31ad3fcfe67ee958e07d0c3c4936e9c8245a1ea58", size = 294617, upload-time = "2024-08-29T13:24:41.957Z" }, -] - -[[package]] -name = "networkx" -version = "3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, -] - -[[package]] -name = "nltk" -version = "3.9.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "joblib" }, - { name = "regex" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f9/76/3a5e4312c19a028770f86fd7c058cf9f4ec4321c6cf7526bab998a5b683c/nltk-3.9.2.tar.gz", hash = "sha256:0f409e9b069ca4177c1903c3e843eef90c7e92992fa4931ae607da6de49e1419", size = 2887629, upload-time = "2025-10-01T07:19:23.764Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/90/81ac364ef94209c100e12579629dc92bf7a709a84af32f8c551b02c07e94/nltk-3.9.2-py3-none-any.whl", hash = "sha256:1e209d2b3009110635ed9709a67a1a3e33a10f799490fa71cf4bec218c11c88a", size = 1513404, upload-time = "2025-10-01T07:19:21.648Z" }, -] - -[[package]] -name = "numba" -version = "0.61.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite" }, - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626, upload-time = "2025-04-09T02:57:51.857Z" }, - { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287, upload-time = "2025-04-09T02:57:53.658Z" }, - { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928, upload-time = "2025-04-09T02:57:55.206Z" }, - { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115, upload-time = "2025-04-09T02:57:56.818Z" }, - { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929, upload-time = "2025-04-09T02:57:58.45Z" }, - { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" }, - { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" }, - { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" }, -] - -[[package]] -name = "numba-cuda" -version = "0.14.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6b/94/63e54c690f093869c5ed3e811ff440554e87085e4301ba9fe37953a6dd80/numba_cuda-0.14.1.tar.gz", hash = "sha256:2e23bc9f5946e850f21f42cb2dcd24a2cb8ea84b60ad020b6e3b357830a9a697", size = 491974, upload-time = "2025-08-22T16:40:43.58Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6a/de07eca824e91e7a260e05f0c470a004dd8bb7055342cb94bfad4bd5ae28/numba_cuda-0.14.1-py3-none-any.whl", hash = "sha256:8183c340aab5c9008ce708c49dc56a3eccec072c6eeb691732aa0ddafeab8012", size = 591077, upload-time = "2025-08-22T16:40:41.995Z" }, -] - -[package.optional-dependencies] -cu12 = [ - { name = "cuda-python" }, - { name = "nvidia-cuda-cccl-cu12" }, - { name = "nvidia-cuda-nvcc-cu12" }, - { name = "nvidia-cuda-nvrtc-cu12" }, - { name = "nvidia-cuda-runtime-cu12" }, -] - -[[package]] -name = "numpy" -version = "2.2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, -] - -[[package]] -name = "nvidia-cublas-cu12" -version = "12.8.4.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/99/db44d685f0e257ff0e213ade1964fc459b4a690a73293220e98feb3307cf/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0", size = 590537124, upload-time = "2025-03-07T01:43:53.556Z" }, - { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, - { url = "https://files.pythonhosted.org/packages/70/61/7d7b3c70186fb651d0fbd35b01dbfc8e755f69fd58f817f3d0f642df20c3/nvidia_cublas_cu12-12.8.4.1-py3-none-win_amd64.whl", hash = "sha256:47e9b82132fa8d2b4944e708049229601448aaad7e6f296f630f2d1a32de35af", size = 567544208, upload-time = "2025-03-07T01:53:30.535Z" }, -] - -[[package]] -name = "nvidia-cuda-cccl-cu12" -version = "12.9.27" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/7e/82e49956b046bdc506c789235c587d9b3ef58b8bc1782258c1e247229647/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7898b38aa68beaa234d48f0868273702342a196d6e2e9d0ef058dca2390ebea", size = 3152245, upload-time = "2025-05-01T19:32:04.802Z" }, - { url = "https://files.pythonhosted.org/packages/18/2a/d4cd8506d2044e082f8cd921be57392e6a9b5ccd3ffdf050362430a3d5d5/nvidia_cuda_cccl_cu12-12.9.27-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:37869e17ce2e1ecec6eddf1927cca0f8c34e64fd848d40453df559091e2d7117", size = 3152243, upload-time = "2025-05-01T19:32:13.955Z" }, - { url = "https://files.pythonhosted.org/packages/ce/9b/1daf405620c7ac371b76b823c6336dd742673d41a150d9a04eec2c690379/nvidia_cuda_cccl_cu12-12.9.27-py3-none-win_amd64.whl", hash = "sha256:72106f95a9bb3be18472806b4f663ebf0f9248a86d14b4ae3305725b855d9d92", size = 3152175, upload-time = "2025-05-01T19:45:11.372Z" }, -] - -[[package]] -name = "nvidia-cuda-cupti-cu12" -version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, -] - -[[package]] -name = "nvidia-cuda-nvcc-cu12" -version = "12.9.86" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/48/b54a06168a2190572a312bfe4ce443687773eb61367ced31e064953dd2f7/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:5d6a0d32fdc7ea39917c20065614ae93add6f577d840233237ff08e9a38f58f0", size = 40546229, upload-time = "2025-06-05T20:01:53.357Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5c/8cc072436787104bbbcbde1f76ab4a0d89e68f7cebc758dd2ad7913a43d0/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44e1eca4d08926193a558d2434b1bf83d57b4d5743e0c431c0c83d51da1df62b", size = 39411138, upload-time = "2025-06-05T20:01:43.182Z" }, - { url = "https://files.pythonhosted.org/packages/d2/9e/c71c53655a65d7531c89421c282359e2f626838762f1ce6180ea0bbebd29/nvidia_cuda_nvcc_cu12-12.9.86-py3-none-win_amd64.whl", hash = "sha256:8ed7f0b17dea662755395be029376db3b94fed5cbb17c2d35cc866c5b1b84099", size = 34669845, upload-time = "2025-06-05T20:11:56.308Z" }, -] - -[[package]] -name = "nvidia-cuda-nvrtc-cu12" -version = "12.8.93" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d1/e50d0acaab360482034b84b6e27ee83c6738f7d32182b987f9c7a4e32962/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8", size = 43106076, upload-time = "2025-03-07T01:41:59.817Z" }, - { url = "https://files.pythonhosted.org/packages/45/51/52a3d84baa2136cc8df15500ad731d74d3a1114d4c123e043cb608d4a32b/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:7a4b6b2904850fe78e0bd179c4b655c404d4bb799ef03ddc60804247099ae909", size = 73586838, upload-time = "2025-03-07T01:52:13.483Z" }, -] - -[[package]] -name = "nvidia-cuda-runtime-cu12" -version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/75/f865a3b236e4647605ea34cc450900854ba123834a5f1598e160b9530c3a/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d", size = 965265, upload-time = "2025-03-07T01:39:43.533Z" }, - { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, - { url = "https://files.pythonhosted.org/packages/30/a5/a515b7600ad361ea14bfa13fb4d6687abf500adc270f19e89849c0590492/nvidia_cuda_runtime_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:c0c6027f01505bfed6c3b21ec546f69c687689aad5f1a377554bc6ca4aa993a8", size = 944318, upload-time = "2025-03-07T01:51:01.794Z" }, -] - -[[package]] -name = "nvidia-cudnn-cu12" -version = "9.10.2.21" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-cublas-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, -] - -[[package]] -name = "nvidia-cufft-cu12" -version = "11.3.3.83" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/bc/7771846d3a0272026c416fbb7e5f4c1f146d6d80704534d0b187dd6f4800/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a", size = 193109211, upload-time = "2025-03-07T01:44:56.873Z" }, - { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, - { url = "https://files.pythonhosted.org/packages/7d/ec/ce1629f1e478bb5ccd208986b5f9e0316a78538dd6ab1d0484f012f8e2a1/nvidia_cufft_cu12-11.3.3.83-py3-none-win_amd64.whl", hash = "sha256:7a64a98ef2a7c47f905aaf8931b69a3a43f27c55530c698bb2ed7c75c0b42cb7", size = 192216559, upload-time = "2025-03-07T01:53:57.106Z" }, -] - -[[package]] -name = "nvidia-cufile-cu12" -version = "1.13.1.3" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, ] - -[[package]] -name = "nvidia-curand-cu12" -version = "10.3.9.90" -source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/5e/92aa15eca622a388b80fbf8375d4760738df6285b1e92c43d37390a33a9a/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd", size = 63625754, upload-time = "2025-03-07T01:46:10.735Z" }, - { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, - { url = "https://files.pythonhosted.org/packages/b9/75/70c05b2f3ed5be3bb30b7102b6eb78e100da4bbf6944fd6725c012831cab/nvidia_curand_cu12-10.3.9.90-py3-none-win_amd64.whl", hash = "sha256:f149a8ca457277da854f89cf282d6ef43176861926c7ac85b2a0fbd237c587ec", size = 62765309, upload-time = "2025-03-07T01:54:20.478Z" }, + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, ] [[package]] -name = "nvidia-cusolver-cu12" -version = "11.7.3.90" +name = "nbformat" +version = "5.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/32/f7cd6ce8a7690544d084ea21c26e910a97e077c9b7f07bf5de623ee19981/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0", size = 267229841, upload-time = "2025-03-07T01:46:54.356Z" }, - { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, - { url = "https://files.pythonhosted.org/packages/13/c0/76ca8551b8a84146ffa189fec81c26d04adba4bc0dbe09cd6e6fd9b7de04/nvidia_cusolver_cu12-11.7.3.90-py3-none-win_amd64.whl", hash = "sha256:4a550db115fcabc4d495eb7d39ac8b58d4ab5d8e63274d3754df1c0ad6a22d34", size = 256720438, upload-time = "2025-03-07T01:54:39.898Z" }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, ] [[package]] -name = "nvidia-cusparse-cu12" -version = "12.5.8.93" +name = "nbsphinx" +version = "0.9.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, + { name = "docutils" }, + { name = "jinja2" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "sphinx" }, + { name = "traitlets" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/e7/d1/82081750f8a78ad0399c6ed831d42623b891904e8e7b8a75878225cf1dce/nbsphinx-0.9.8.tar.gz", hash = "sha256:d0765908399a8ee2b57be7ae881cf2ea58d66db3af7bbf33e6eb48f83bea5495", size = 417469, upload-time = "2025-11-28T17:41:02.336Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/f7/cd777c4109681367721b00a106f491e0d0d15cfa1fd59672ce580ce42a97/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc", size = 288117129, upload-time = "2025-03-07T01:47:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, - { url = "https://files.pythonhosted.org/packages/62/07/f3b2ad63f8e3d257a599f422ae34eb565e70c41031aecefa3d18b62cabd1/nvidia_cusparse_cu12-12.5.8.93-py3-none-win_amd64.whl", hash = "sha256:9a33604331cb2cac199f2e7f5104dfbb8a5a898c367a53dfda9ff2acb6b6b4dd", size = 284937404, upload-time = "2025-03-07T01:55:07.742Z" }, + { url = "https://files.pythonhosted.org/packages/03/78/843bcf0cf31f88d2f8a9a063d2d80817b1901657d83d65b89b3aa835732e/nbsphinx-0.9.8-py3-none-any.whl", hash = "sha256:92d95ee91784e56bc633b60b767a6b6f23a0445f891e24641ce3c3f004759ccf", size = 31961, upload-time = "2025-11-28T17:41:00.796Z" }, ] [[package]] -name = "nvidia-cusparselt-cu12" -version = "0.7.1" +name = "neo4j" +version = "5.24.0" source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, +dependencies = [ + { name = "pytz" }, ] - -[[package]] -name = "nvidia-ml-py" -version = "12.575.51" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d2/4d/6f017814ed5ac28e08e1b8a62e3a258957da27582c89b7f8f8b15ac3d2e7/nvidia_ml_py-12.575.51.tar.gz", hash = "sha256:6490e93fea99eb4e966327ae18c6eec6256194c921f23459c8767aee28c54581", size = 46597, upload-time = "2025-05-06T20:46:37.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/c3/20ce9449ca0784d6bc7b5c347af9fb2748c50235d80612a11d50c40fd2c3/neo4j-5.24.0.tar.gz", hash = "sha256:499ca35135847528f4ee70314bd49c8b08b031e4dfd588bb06c1c2fb35d729e2", size = 216031, upload-time = "2024-08-29T13:24:45.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/24/552ebea28f0570b9e65e62b50287a273804c9f997cc1c2dcd4e2d64b9e7d/nvidia_ml_py-12.575.51-py3-none-any.whl", hash = "sha256:eb8641800d98ce40a22f479873f34b482e214a7e80349c63be51c3919845446e", size = 47547, upload-time = "2025-05-06T20:46:36.457Z" }, + { url = "https://files.pythonhosted.org/packages/ba/16/53e963b15cf08d62e521fe70feccc36e9a718617e483b0b132aeffd86072/neo4j-5.24.0-py3-none-any.whl", hash = "sha256:5b4705cfe8130020f33e75e31ad3fcfe67ee958e07d0c3c4936e9c8245a1ea58", size = 294617, upload-time = "2024-08-29T13:24:41.957Z" }, ] [[package]] -name = "nvidia-nccl-cu12" -version = "2.27.5" +name = "networkx" +version = "3.5" source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/1c/857979db0ef194ca5e21478a0612bcdbbe59458d7694361882279947b349/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31432ad4d1fb1004eb0c56203dc9bc2178a1ba69d1d9e02d64a6938ab5e40e7a", size = 322400625, upload-time = "2025-06-26T04:11:04.496Z" }, - { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229, upload-time = "2025-06-26T04:11:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, ] [[package]] -name = "nvidia-nvjitlink-cu12" -version = "12.8.93" +name = "numba" +version = "0.61.2" source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, - { url = "https://files.pythonhosted.org/packages/2a/a2/8cee5da30d13430e87bf99bb33455d2724d0a4a9cb5d7926d80ccb96d008/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7", size = 38386204, upload-time = "2025-03-07T01:49:43.612Z" }, - { url = "https://files.pythonhosted.org/packages/ed/d7/34f02dad2e30c31b10a51f6b04e025e5dd60e5f936af9045a9b858a05383/nvidia_nvjitlink_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:bd93fbeeee850917903583587f4fc3a4eafa022e34572251368238ab5e6bd67f", size = 268553710, upload-time = "2025-03-07T01:56:24.13Z" }, +dependencies = [ + { name = "llvmlite" }, + { name = "numpy" }, ] - -[[package]] -name = "nvidia-nvshmem-cu12" -version = "3.3.20" -source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/6c/99acb2f9eb85c29fc6f3a7ac4dccfd992e22666dd08a642b303311326a97/nvidia_nvshmem_cu12-3.3.20-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d00f26d3f9b2e3c3065be895e3059d6479ea5c638a3f38c9fec49b1b9dd7c1e5", size = 124657145, upload-time = "2025-08-04T20:25:19.995Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626, upload-time = "2025-04-09T02:57:51.857Z" }, + { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287, upload-time = "2025-04-09T02:57:53.658Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928, upload-time = "2025-04-09T02:57:55.206Z" }, + { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115, upload-time = "2025-04-09T02:57:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929, upload-time = "2025-04-09T02:57:58.45Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" }, + { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" }, + { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" }, + { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" }, ] [[package]] -name = "nvidia-nvtx-cu12" -version = "12.8.90" +name = "numpy" +version = "2.2.6" source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, ] [[package]] name = "nvidia-rag" -version = "2.2.2" -source = { registry = "https://pypi.org/simple" } +version = "2.5.0" +source = { registry = "https://pypi.nvidia.com/" } dependencies = [ + { name = "anyio" }, { name = "bleach" }, { name = "dataclass-wizard" }, { name = "fastapi" }, + { name = "httpx" }, + { name = "httpx-sse" }, { name = "langchain" }, { name = "langchain-community" }, { name = "langchain-core" }, { name = "langchain-milvus" }, { name = "langchain-nvidia-ai-endpoints" }, + { name = "lark" }, { name = "minio" }, { name = "pdfplumber" }, { name = "protobuf" }, { name = "pydantic" }, - { name = "pymilvus" }, + { name = "pymilvus", extra = ["milvus-lite"] }, { name = "pymilvus-model" }, + { name = "python-dateutil" }, { name = "python-multipart" }, { name = "pyyaml" }, { name = "redis" }, - { name = "unstructured", extra = ["all-docs"] }, { name = "uvicorn", extra = ["standard"] }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/18/2d/37c669cfcc658907b2de8f64b20df87a328cb56a69092126e52c1d605675/nvidia_rag-2.2.2-py3-none-any.whl", hash = "sha256:54d32c6a17d95b93a234d2ab8941b351df9e02abe6022f236d3b9c6776074ed7", size = 102941, upload-time = "2025-08-23T14:10:22.645Z" }, + { url = "https://pypi.nvidia.com/nvidia-rag/nvidia_rag-2.5.0-py3-none-any.whl", hash = "sha256:4e7f41396dd1dfcd93503f6a4d0bb3902d99c7ab4f47d293b0773eda8dd86b3d" }, ] [[package]] name = "nvidia-sphinx-theme" version = "0.0.9.post1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pypi.nvidia.com/" } dependencies = [ { name = "pydata-sphinx-theme" }, { name = "sphinx" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/79/017fab2f7167a9a9795665f894d04f77aafceca80821b51589bb4b23ff5c/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl", hash = "sha256:21ca60206dff2f380d7783d64bbaf71a5b9cacae53c7d0686f089c16b5a3d45a", size = 143816, upload-time = "2025-11-09T23:16:55.719Z" }, + { url = "https://pypi.nvidia.com/nvidia-sphinx-theme/nvidia_sphinx_theme-0.0.9.post1-py3-none-any.whl", hash = "sha256:21ca60206dff2f380d7783d64bbaf71a5b9cacae53c7d0686f089c16b5a3d45a" }, ] [[package]] name = "nvtx" version = "0.2.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/ef/173a5dc1bf8f6f7054f89986ab32140ec238c9fcc4f061d221b8e5b87e31/nvtx-0.2.11.tar.gz", hash = "sha256:88d52cf424a0e68b1c05a6b1983fdfa1b35575f983aadc3118cee578491b043e", size = 71671, upload-time = "2025-02-21T07:45:08.053Z" } +source = { registry = "https://pypi.nvidia.com/" } +sdist = { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11.tar.gz", hash = "sha256:88d52cf424a0e68b1c05a6b1983fdfa1b35575f983aadc3118cee578491b043e" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/43/a96ed8aa60b8fc0b376db1cd73012208906dc04028fc3142a5186ee7f6b8/nvtx-0.2.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01835a894ef232575359918bb55b98821cc24cb867ca700006fb89db383114c6", size = 559333, upload-time = "2025-02-21T07:09:12.082Z" }, - { url = "https://files.pythonhosted.org/packages/52/fe/9572c52876fc919de23c244451e71faffb753e5adddb70caad502956a435/nvtx-0.2.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41fdebc5a55448c1a165e3b283b4cc64ad37882f199b5f22119370aec917bd38", size = 562598, upload-time = "2025-02-21T07:13:41.784Z" }, - { url = "https://files.pythonhosted.org/packages/e5/89/529a5426ce530ccbbc973ee6953758a56dd28ba20817d030471e8542dd6c/nvtx-0.2.11-cp312-cp312-win_amd64.whl", hash = "sha256:1bca6f1695101fc2b2eec39677c650db78bf54c2e3c965a4a5a046701d51b0a6", size = 88780, upload-time = "2025-02-21T07:07:55.311Z" }, - { url = "https://files.pythonhosted.org/packages/8c/7c/6b72b9925aded900e7ab9d298eb1428ad7db383c1883927b88edbec51d41/nvtx-0.2.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93717700c6bff8b220224232d5ae1c4483f911f542dda2b9efaaa46cb325d97a", size = 535167, upload-time = "2025-02-21T07:10:02.301Z" }, - { url = "https://files.pythonhosted.org/packages/bf/bf/9fc7e7cb379bcb2c141865c82d279cb1c2a139c4a83d2122bee4e053f9ef/nvtx-0.2.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51649a377a4c105d731322816872f75fed6cafff6e627e43033e76e6241f19", size = 538457, upload-time = "2025-02-21T07:14:51.674Z" }, - { url = "https://files.pythonhosted.org/packages/05/6b/36b2a1fc7e7140d5fdc0a8c8698e00d3389fdfc352199e925b2974596f1b/nvtx-0.2.11-cp313-cp313-win_amd64.whl", hash = "sha256:b5eb454a123ac0a58defc7434daaff54d7f22b031c50f5ce028aadf38ebd40b2", size = 86910, upload-time = "2025-02-21T07:06:08.671Z" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01835a894ef232575359918bb55b98821cc24cb867ca700006fb89db383114c6" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41fdebc5a55448c1a165e3b283b4cc64ad37882f199b5f22119370aec917bd38" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp312-cp312-win_amd64.whl", hash = "sha256:1bca6f1695101fc2b2eec39677c650db78bf54c2e3c965a4a5a046701d51b0a6" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93717700c6bff8b220224232d5ae1c4483f911f542dda2b9efaaa46cb325d97a" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51649a377a4c105d731322816872f75fed6cafff6e627e43033e76e6241f19" }, + { url = "https://pypi.nvidia.com/nvtx/nvtx-0.2.11-cp313-cp313-win_amd64.whl", hash = "sha256:b5eb454a123ac0a58defc7434daaff54d7f22b031c50f5ce028aadf38ebd40b2" }, ] [[package]] @@ -3443,65 +2575,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/29/2a18716e2d7e60cf9feec7bf936c6fd8591d580dbe2c3929e95c7ea382ca/nx_arangodb-1.3.1-py3-none-any.whl", hash = "sha256:3a19312ec60731d09d68c347782aa73c0fadc51d5b28dcef04f439b6258de7cf", size = 67802, upload-time = "2025-06-10T13:23:56.571Z" }, ] -[[package]] -name = "nx-cugraph-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cupy-cuda12x" }, - { name = "networkx" }, - { name = "numpy" }, - { name = "pylibcugraph-cu12" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9b/3a/ed84761b428664a67252a7e047690b4d3571349e994e0371ddd921aaf2ec/nx_cugraph_cu12-25.8.0.tar.gz", hash = "sha256:fd9f7efa14cba53ba0abf2ae450fc41795805b4515d31bf1523900c1bc4b8162", size = 6071, upload-time = "2025-08-07T14:46:51.111Z" } - -[[package]] -name = "olefile" -version = "0.47" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/1b/077b508e3e500e1629d366249c3ccb32f95e50258b231705c09e3c7a4366/olefile-0.47.zip", hash = "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c", size = 112240, upload-time = "2023-12-01T16:22:53.025Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/17/d3/b64c356a907242d719fc668b71befd73324e47ab46c8ebbbede252c154b2/olefile-0.47-py2.py3-none-any.whl", hash = "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f", size = 114565, upload-time = "2023-12-01T16:22:51.518Z" }, -] - -[[package]] -name = "omegaconf" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "antlr4-python3-runtime" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, -] - -[[package]] -name = "onnx" -version = "1.20.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ml-dtypes" }, - { name = "numpy" }, - { name = "protobuf" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bd/bf/824b13b7ea14c2d374b48a296cfa412442e5559326fbab5441a4fcb68924/onnx-1.20.0.tar.gz", hash = "sha256:1a93ec69996b4556062d552ed1aa0671978cfd3c17a40bf4c89a1ae169c6a4ad", size = 12049527, upload-time = "2025-12-01T18:14:34.679Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/19/2caa972a31014a8cb4525f715f2a75d93caef9d4b9da2809cc05d0489e43/onnx-1.20.0-cp312-abi3-macosx_12_0_universal2.whl", hash = "sha256:31efe37d7d1d659091f34ddd6a31780334acf7c624176832db9a0a8ececa8fb5", size = 18340913, upload-time = "2025-12-01T18:14:00.477Z" }, - { url = "https://files.pythonhosted.org/packages/78/bb/b98732309f2f6beb4cdcf7b955d7bbfd75a191185370ee21233373db381e/onnx-1.20.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d75da05e743eb9a11ff155a775cae5745e71f1cd0ca26402881b8f20e8d6e449", size = 17896118, upload-time = "2025-12-01T18:14:03.239Z" }, - { url = "https://files.pythonhosted.org/packages/84/a7/38aa564871d062c11538d65c575af9c7e057be880c09ecbd899dd1abfa83/onnx-1.20.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02e0d72ab09a983fce46686b155a5049898558d9f3bc6e8515120d6c40666318", size = 18115415, upload-time = "2025-12-01T18:14:06.261Z" }, - { url = "https://files.pythonhosted.org/packages/3b/17/a600b62cf4ad72976c66f83ce9e324205af434706ad5ec0e35129e125aef/onnx-1.20.0-cp312-abi3-win32.whl", hash = "sha256:392ca68b34b97e172d33b507e1e7bfdf2eea96603e6e7ff109895b82ff009dc7", size = 16363019, upload-time = "2025-12-01T18:14:09.16Z" }, - { url = "https://files.pythonhosted.org/packages/9c/3b/5146ba0a89f73c026bb468c49612bab8d005aa28155ebf06cf5f2eb8d36c/onnx-1.20.0-cp312-abi3-win_amd64.whl", hash = "sha256:259b05758d41645f5545c09f887187662b350d40db8d707c33c94a4f398e1733", size = 16485934, upload-time = "2025-12-01T18:14:13.046Z" }, - { url = "https://files.pythonhosted.org/packages/f3/bc/d251b97395e721b3034e9578d4d4d9fb33aac4197ae16ce8c7ed79a26dce/onnx-1.20.0-cp312-abi3-win_arm64.whl", hash = "sha256:2d25a9e1fde44bc69988e50e2211f62d6afcd01b0fd6dfd23429fd978a35d32f", size = 16444946, upload-time = "2025-12-01T18:14:15.801Z" }, - { url = "https://files.pythonhosted.org/packages/8d/11/4d47409e257013951a17d08c31988e7c2e8638c91d4d5ce18cc57c6ea9d9/onnx-1.20.0-cp313-cp313t-macosx_12_0_universal2.whl", hash = "sha256:7646e700c0a53770a86d5a9a582999a625a3173c4323635960aec3cba8441c6a", size = 18348524, upload-time = "2025-12-01T18:14:18.102Z" }, - { url = "https://files.pythonhosted.org/packages/67/60/774d29a0f00f84a4ec624fe35e0c59e1dbd7f424adaab751977a45b60e05/onnx-1.20.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0bdfd22fe92b87bf98424335ec1191ed79b08cd0f57fe396fab558b83b2c868", size = 17900987, upload-time = "2025-12-01T18:14:20.835Z" }, - { url = "https://files.pythonhosted.org/packages/9c/7c/6bd82b81b85b2680e3de8cf7b6cc49a7380674b121265bb6e1e2ff3bb0aa/onnx-1.20.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1a4e02148b2a7a4b82796d0ecdb6e49ba7abd34bb5a9de22af86aad556fb76", size = 18121332, upload-time = "2025-12-01T18:14:24.558Z" }, - { url = "https://files.pythonhosted.org/packages/d1/42/d2cd00c84def4e17b471e24d82a1d2e3c5be202e2c163420b0353ddf34df/onnx-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2241c85fdaa25a66565fcd1d327c7bcd8f55165420ebaee1e9563c3b9bf961c9", size = 16492660, upload-time = "2025-12-01T18:14:27.456Z" }, - { url = "https://files.pythonhosted.org/packages/42/cd/1106de50a17f2a2dfbb4c8bb3cf2f99be2c7ac2e19abbbf9e07ab47b1b35/onnx-1.20.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ee46cdc5abd851a007a4be81ee53e0e303cf9a0e46d74231d5d361333a1c9411", size = 16448588, upload-time = "2025-12-01T18:14:32.277Z" }, -] - [[package]] name = "onnxruntime" version = "1.23.2" @@ -3636,18 +2709,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/3d/dd14ee2eb8a3f3054249562e76b253a1545c76adbbfd43a294f71acde5c3/openinference_semantic_conventions-0.1.25-py3-none-any.whl", hash = "sha256:3814240f3bd61f05d9562b761de70ee793d55b03bca1634edf57d7a2735af238", size = 10395, upload-time = "2025-11-05T01:37:43.697Z" }, ] -[[package]] -name = "openpyxl" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "et-xmlfile" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, -] - [[package]] name = "opentelemetry-api" version = "1.39.1" @@ -3888,7 +2949,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.3.3" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -3896,41 +2957,28 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, + { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, + { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, + { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, + { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643, upload-time = "2024-09-20T13:09:25.522Z" }, + { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573, upload-time = "2024-09-20T13:09:28.012Z" }, + { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085, upload-time = "2024-09-20T19:02:10.451Z" }, + { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809, upload-time = "2024-09-20T13:09:30.814Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316, upload-time = "2024-09-20T19:02:13.825Z" }, + { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055, upload-time = "2024-09-20T13:09:33.462Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175, upload-time = "2024-09-20T13:09:35.871Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650, upload-time = "2024-09-20T13:09:38.685Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177, upload-time = "2024-09-20T13:09:41.141Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526, upload-time = "2024-09-20T19:02:16.905Z" }, + { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013, upload-time = "2024-09-20T13:09:44.39Z" }, + { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620, upload-time = "2024-09-20T19:02:20.639Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436, upload-time = "2024-09-20T13:09:48.112Z" }, ] [[package]] @@ -3951,19 +2999,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, ] -[[package]] -name = "partd" -version = "1.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "locket" }, - { name = "toolz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c", size = 21029, upload-time = "2024-05-06T19:51:41.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905, upload-time = "2024-05-06T19:51:39.271Z" }, -] - [[package]] name = "pathable" version = "0.4.4" @@ -3973,52 +3008,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592, upload-time = "2025-01-10T18:43:11.88Z" }, ] -[[package]] -name = "pathvalidate" -version = "3.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262, upload-time = "2025-06-15T09:07:20.736Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305, upload-time = "2025-06-15T09:07:19.117Z" }, -] - -[[package]] -name = "pdf2image" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/d8/b280f01045555dc257b8153c00dee3bc75830f91a744cd5f84ef3a0a64b1/pdf2image-1.17.0.tar.gz", hash = "sha256:eaa959bc116b420dd7ec415fcae49b98100dda3dd18cd2fdfa86d09f112f6d57", size = 12811, upload-time = "2024-01-07T20:33:01.965Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/33/61766ae033518957f877ab246f87ca30a85b778ebaad65b7f74fa7e52988/pdf2image-1.17.0-py3-none-any.whl", hash = "sha256:ecdd58d7afb810dffe21ef2b1bbc057ef434dabbac6c33778a38a3f7744a27e2", size = 11618, upload-time = "2024-01-07T20:32:59.957Z" }, -] - [[package]] name = "pdfminer-six" -version = "20251107" +version = "20251230" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "charset-normalizer" }, { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/50/5315f381a25dc80a8d2ea7c62d9a28c0137f10ccc263623a0db8b49fcced/pdfminer_six-20251107.tar.gz", hash = "sha256:5fb0c553799c591777f22c0c72b77fc2522d7d10c70654e25f4c5f1fd996e008", size = 7387104, upload-time = "2025-11-07T20:01:10.286Z" } +sdist = { url = "https://files.pythonhosted.org/packages/46/9a/d79d8fa6d47a0338846bb558b39b9963b8eb2dfedec61867c138c1b17eeb/pdfminer_six-20251230.tar.gz", hash = "sha256:e8f68a14c57e00c2d7276d26519ea64be1b48f91db1cdc776faa80528ca06c1e", size = 8511285, upload-time = "2025-12-30T15:49:13.104Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/29/d1d9f6b900191288b77613ddefb73ed35b48fb35e44aaf8b01b0422b759d/pdfminer_six-20251107-py3-none-any.whl", hash = "sha256:c09df33e4cbe6b26b2a79248a4ffcccafaa5c5d39c9fff0e6e81567f165b5401", size = 5620299, upload-time = "2025-11-07T20:01:08.722Z" }, + { url = "https://files.pythonhosted.org/packages/65/d7/b288ea32deb752a09aab73c75e1e7572ab2a2b56c3124a5d1eb24c62ceb3/pdfminer_six-20251230-py3-none-any.whl", hash = "sha256:9ff2e3466a7dfc6de6fd779478850b6b7c2d9e9405aa2a5869376a822771f485", size = 6591909, upload-time = "2025-12-30T15:49:10.76Z" }, ] [[package]] name = "pdfplumber" -version = "0.11.8" +version = "0.11.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pdfminer-six" }, { name = "pillow" }, { name = "pypdfium2" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/d8/cb9fda4261ce389656bec0bb0bdde905df109ad97f7ae387747ded070e8c/pdfplumber-0.11.8.tar.gz", hash = "sha256:db29b04bc8bb62f39dd444533bcf2e0ba33584bd24f5a54644f3ba30f4f22d31", size = 102724, upload-time = "2025-11-08T20:52:01.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/37/9ca3519e92a8434eb93be570b131476cc0a4e840bb39c62ddb7813a39d53/pdfplumber-0.11.9.tar.gz", hash = "sha256:481224b678b2bbdbf376e2c39bf914144eef7c3d301b4a28eebf0f7f6109d6dc", size = 102768, upload-time = "2026-01-05T08:10:29.072Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/28/3958ed81a9be317610ab73df32f1968076751d651c84dff1bcb45b7c6c0e/pdfplumber-0.11.8-py3-none-any.whl", hash = "sha256:7dda117b8ed21bca9c8e7d7808fee2439f93c8bd6ea45989bfb1aead6dc3cad3", size = 60043, upload-time = "2025-11-08T20:52:00.652Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c8/cdbc975f5b634e249cfa6597e37c50f3078412474f21c015e508bfbfe3c3/pdfplumber-0.11.9-py3-none-any.whl", hash = "sha256:33ec5580959ba524e9100138746e090879504c42955df1b8a997604dd326c443", size = 60045, upload-time = "2026-01-05T08:10:27.512Z" }, ] [[package]] @@ -4054,140 +3068,73 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/2f/75333503faeca2c1584dc9dfd0c5dcf7915fdd838f1aeb3d8a329e769e1d/phenolrs-0.5.10-cp313-cp313-win_amd64.whl", hash = "sha256:926f8ac190c82f45da0609f391df2f1a73dafb5c1c5b0dc03ef25663a8266868", size = 2291832, upload-time = "2025-05-30T22:03:48.247Z" }, ] -[[package]] -name = "pi-heif" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bf/7b/7c7b2aeb4995906725f13b885884d5b22e4f2d55028e8941555d2789e5e7/pi_heif-1.1.1.tar.gz", hash = "sha256:42ece7c3b40569f295fd4d2b10f38d1cd5012ca548446a2ca33895f0d6900c4f", size = 18269861, upload-time = "2025-09-30T16:43:33.742Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/41/72f0e5136496d14c87c22615f0901d5d0a1d07613fccc3a755cb7f09d248/pi_heif-1.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:3059623494a94800746cfea07117c41f2829e528f6433d1af2f198962b506c03", size = 1027126, upload-time = "2025-09-30T16:42:44.796Z" }, - { url = "https://files.pythonhosted.org/packages/1d/65/b344b8418751d2fce4da4d77a601d12dbafca9c6361d98ff81505e719351/pi_heif-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5312fe9a82003969b3fbe5e4755fa7fd0a7d575d4488da2031ab38234999b3aa", size = 892281, upload-time = "2025-09-30T16:42:46.126Z" }, - { url = "https://files.pythonhosted.org/packages/60/26/8931d468cb3774b180a7344d2dca939d6492c20c80382e56fbf8b5aae305/pi_heif-1.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d519ab748ce2d3d0ab217caf4e7d62cbaf73779978c073e27ed57ec038c886", size = 1293304, upload-time = "2025-09-30T16:42:47.121Z" }, - { url = "https://files.pythonhosted.org/packages/35/30/d2416b9c040f4ff3533f0c9f6d5257369b6504012737963caa4ffa299c52/pi_heif-1.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:abcc0977a65b57e01262c0ff9290c4c67297f95ef67111f6fc177164cb098cb7", size = 1417721, upload-time = "2025-09-30T16:42:48.184Z" }, - { url = "https://files.pythonhosted.org/packages/c2/09/97bfa3584438e069174f2801ee7e78905f540f3c45387c97ce176df84a89/pi_heif-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7ee208357ccb29898c0a2675f9a5d8d9fa83d2dd5b8ad5fb6e0e897cdbb16c02", size = 2274136, upload-time = "2025-09-30T16:42:49.158Z" }, - { url = "https://files.pythonhosted.org/packages/e3/45/3ae19ccad853c38cbfa0978cf8a9ef1c6a1260874305398aea97fa93d60b/pi_heif-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a74540f92bf979ec8f6575c7a592e745acf71c1b25589d8829b897d8f0b24a3b", size = 2433182, upload-time = "2025-09-30T16:42:50.189Z" }, - { url = "https://files.pythonhosted.org/packages/5a/be/d31fca8ab9d13717b38d2da7b512fa644fc407fed39297eb8473cd0cbe24/pi_heif-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5402de8deb6ba2d22b89f474206e0fae42ce171eadd889fe490e57ec55eea2be", size = 1887794, upload-time = "2025-09-30T16:42:51.245Z" }, - { url = "https://files.pythonhosted.org/packages/d6/12/74a38cd695479a2b14241f37dec9bacf4663e36fc5f192f26c7d4cac993d/pi_heif-1.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9129ace4c2fcce846685da80d9255b01cdb41ad627778e25d6f2b877abcc75f8", size = 1027125, upload-time = "2025-09-30T16:42:52.701Z" }, - { url = "https://files.pythonhosted.org/packages/a3/4c/822aeafdf9053f29af21c6f1bd169000dabf91467791b0ab0b4394746271/pi_heif-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a9cb84c0934757451daf9af52d576e6fadb02976baad72e2bdaebd9f36f92bb6", size = 892273, upload-time = "2025-09-30T16:42:53.889Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4c/813eb4746f0901ee08fa834cf04d85c6509073f200ca0afa65fde51d651a/pi_heif-1.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:934ff3676bc9f0b614f8001416a397a811c14dcce53c6eeee631f09b9912d9e3", size = 1293334, upload-time = "2025-09-30T16:42:54.973Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c3/92c7c15e509a71a2316080f56085136f1b134e5d4c3aa1fc2f8850965950/pi_heif-1.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4109d8ed97ea9c96de641d27cf9aaab9e6075807639770b4c91e65edd9bb3769", size = 1417809, upload-time = "2025-09-30T16:42:55.965Z" }, - { url = "https://files.pythonhosted.org/packages/17/39/70413188659a3a8cd5170c51cfb600c9ff18754db1142073f4280130e7df/pi_heif-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3f50d0aedefc85b60929c0d46178fc8ef4ef70999918b89cbea902b89d03b726", size = 2274169, upload-time = "2025-09-30T16:42:57.032Z" }, - { url = "https://files.pythonhosted.org/packages/01/a2/de639bc29b676ddb94cc6f9fd2f11ed9bd3cb11654a5b01466dadb39ff94/pi_heif-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d44f906ce96fa79bcd95fae96d8ecc386de149fd2f9eb6cdc89ae83ced8e9951", size = 2433250, upload-time = "2025-09-30T16:42:58.121Z" }, - { url = "https://files.pythonhosted.org/packages/45/26/2fd368ef25058458ecb890cd0273d2a3de64529c708db16ac4e87917e209/pi_heif-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:e9447c335728dda12e404557fe6b683be8ecee8b470cc623bfcd55dcfcab7992", size = 1887790, upload-time = "2025-09-30T16:42:59.184Z" }, - { url = "https://files.pythonhosted.org/packages/ff/eb/f92d7d2831747cb0d045237a83b9d55454f35f020764bf0cbb000a105229/pi_heif-1.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35fa3c8f05ab594254c4a33a703c4fc02061973417c418c3d4b81e9f6db90470", size = 1027086, upload-time = "2025-09-30T16:43:00.199Z" }, - { url = "https://files.pythonhosted.org/packages/17/b7/1f93fd50778c61d572ea8abac57f1b46e676d89cda1d6bc303d26f6045a7/pi_heif-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f1d5d2be247524f36821a1696fc3dca1c3010552f0d39fdad0c1ab45338b5680", size = 892365, upload-time = "2025-09-30T16:43:01.562Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/16718f19b904c943a8e7bedebd9276d491bb94258f9bfb573b4700321d7b/pi_heif-1.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:950c35cfcd08deb6315c1819b2374945874224ff63e358457ee7aa376ec76561", size = 1293525, upload-time = "2025-09-30T16:43:02.682Z" }, - { url = "https://files.pythonhosted.org/packages/c2/9f/b0aebbdf279bde9f855fd51eebaca5468ecd6fa6762f1a87e962f484954a/pi_heif-1.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81a6dc5ae66af7605c0f431966a7a9337ebd21edf13c8c1979884eddef04b6c9", size = 1417890, upload-time = "2025-09-30T16:43:03.73Z" }, - { url = "https://files.pythonhosted.org/packages/8a/78/7fe775f2c56a3ef2edbffffd191748fe6e5636a0e7e7b7b3c7b7ab643d76/pi_heif-1.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab123ca032517908c77485ca326a70ed3404adc20862d64055d726ee3f499351", size = 2274352, upload-time = "2025-09-30T16:43:05.117Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e2/60102499d884af9f0eac046309588bdc5032522d51ae4c451fa33b468d11/pi_heif-1.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:50da83f4061ce7b77b133c731c68e94f51ff3e9f04af562aa773b90795be3c23", size = 2433267, upload-time = "2025-09-30T16:43:06.437Z" }, - { url = "https://files.pythonhosted.org/packages/2c/00/9de97f4b1fcf35a04aefef7b3dbf4aaeb9d9ae4661aeb69e7cb137bbeb03/pi_heif-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:d4a8021a7322e9910db88e7819335b32c276015ad5def6a2f63c429738f69f0f", size = 1953959, upload-time = "2025-09-30T16:43:07.453Z" }, -] - -[[package]] -name = "pikepdf" -version = "10.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "deprecated" }, - { name = "lxml" }, - { name = "packaging" }, - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f7/79/9a63d5ccac66ace679cf93c84894db15074fe849d41cd39232cb09ec8819/pikepdf-10.0.2.tar.gz", hash = "sha256:7c85a2526253e35575edb2e28cdc740d004be4b7c5fda954f0e721ee1c423a52", size = 4548116, upload-time = "2025-11-10T18:10:08.765Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/03/ef096d5bccf70606fcd40ef3519e048028144ebdd5735092398d9cf0ee3f/pikepdf-10.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:0a5e798d6b0759bae1e30b8b05853b5c8d4016129db658f3a3e3320781ef2376", size = 4687898, upload-time = "2025-11-10T18:09:26.145Z" }, - { url = "https://files.pythonhosted.org/packages/40/27/cd69b14359772b3a447aa6687da3436fcdf16664be06ca88aef984453217/pikepdf-10.0.2-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:8d8ecc258f90cd1287f8527dd3b94aa178be7c0e04f313ae4182f21c24fd328d", size = 4985422, upload-time = "2025-11-10T18:09:27.955Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cb/442ff1273ac155d1cd0f81fb7acf9848f8c4b595616ed8d2d846b9327e31/pikepdf-10.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ca4d5d1ca3f7af568e62cadf1c64238490b6503a512894c99e48042e3eb3648", size = 2395555, upload-time = "2025-11-10T18:09:30.129Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d0/9d4ed596e5419dd4bc8c162f0337398dc1ddc94e2d7bf6f3d0fb6eef561b/pikepdf-10.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fa22c5496e14fa3e89b94117fe56494b895cd02e53842f60331ac4bc078f04c7", size = 2631976, upload-time = "2025-11-10T18:09:32.214Z" }, - { url = "https://files.pythonhosted.org/packages/86/59/205f83746288590f22d1ff8b43fc93b193ddeca26261c61b5621d03048a1/pikepdf-10.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df502e0c6d0731bd3f98523e5d501d4a21b36844f0061ef25f2500b18766fb51", size = 3588060, upload-time = "2025-11-10T18:09:34.252Z" }, - { url = "https://files.pythonhosted.org/packages/b2/54/4e9c8b53f22a4e527cf1087c5b26e127aa028c51d81cf53b10f34c34db8d/pikepdf-10.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:98464b4d8f0340ab38575cc41acf9061e2639c90e3a25c491c3ef3d01b92899f", size = 3791776, upload-time = "2025-11-10T18:09:36.055Z" }, - { url = "https://files.pythonhosted.org/packages/43/5c/8f817caad9d6fa64f715bdce4ab8d7c97b725ffa0ca5499092c71256ef9a/pikepdf-10.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:af0b763b4c17a6724d51d110a66df291d33d66387b53d35ee3fd8ade44f4b7d6", size = 3727628, upload-time = "2025-11-10T18:09:37.828Z" }, - { url = "https://files.pythonhosted.org/packages/b3/f1/eabc9e780f9d0fe0316ce0185a1064d28b18c219fd8d1b0609205c18ac39/pikepdf-10.0.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f06c8dbf1f6cab87815b7ed0e4b1359da8665c4bb51a9fbdd71824c0b1bbb28c", size = 4687891, upload-time = "2025-11-10T18:09:40.003Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3a/ce1cf39d9eac09885efa69cc6bbe537ec2b7a24beded2fd0d9de779513f4/pikepdf-10.0.2-cp313-cp313-macosx_15_0_x86_64.whl", hash = "sha256:c3d421c6d4ef1aa394d30c683bb18c436817467c4db8279a4ff0f9d0a96aa323", size = 4985564, upload-time = "2025-11-10T18:09:42.624Z" }, - { url = "https://files.pythonhosted.org/packages/2f/f2/91664c4a7bda3fd3240e99a8ea602bb674ae88eea5dd798fa54c763da7e5/pikepdf-10.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0487fa6f64c26baa3f7131a917c37bb1183364a213678c155184944ca711881d", size = 2396504, upload-time = "2025-11-10T18:09:44.622Z" }, - { url = "https://files.pythonhosted.org/packages/12/8f/84717f30989f81ba94188a0185791039b683ed4ab43003ab5114aa07f154/pikepdf-10.0.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55378c0c1d7c32c32466809fc4c7a08efd2d6a0f75e22b25e3791ab33001382b", size = 2635392, upload-time = "2025-11-10T18:09:46.301Z" }, - { url = "https://files.pythonhosted.org/packages/0c/1c/960ff2fe0c11ab936db04202da6be136909757ecf131690b58d2aeef4d67/pikepdf-10.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cb5d7278cf9655eedde443f737ffab57eeaf81b5585094644759c368d28ac1bd", size = 3588629, upload-time = "2025-11-10T18:09:48.042Z" }, - { url = "https://files.pythonhosted.org/packages/04/56/9e6d87d20c520afb8afe28cddf37ddaa4a70aaf9aec2e25d53522a91d9c4/pikepdf-10.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e460726e0753b0196a241f11f80c90a30fcaf3e7bc7d908cf85594890cb981c", size = 3792852, upload-time = "2025-11-10T18:09:50.213Z" }, - { url = "https://files.pythonhosted.org/packages/51/55/8ea2c9aa063d04127eb548469f19be1e50777d7954f8d327e87fc0a5fe69/pikepdf-10.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:dd8289a0a8b7352fe6b2090d4e2e50b105d41a45c38e28bff0750728f20a0182", size = 3727568, upload-time = "2025-11-10T18:09:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/f2/92/ddc07c58bb0e99f6c7ed5cdec63ed305bf22d29f875fb7a5b626f3eca177/pikepdf-10.0.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:821592290f33943d0dbde294a56db2b777b7edf519dabbe77d1a8e99a96f96ea", size = 4683719, upload-time = "2025-11-10T18:09:53.991Z" }, - { url = "https://files.pythonhosted.org/packages/9b/05/f43a0dde38720c960910ea7c2916a608d6dcb42d4cdf00b6a202704a0e35/pikepdf-10.0.2-cp314-cp314-macosx_15_0_x86_64.whl", hash = "sha256:64f46f9db208cd4166b73da31e201258e47cb3c3645d9856782e9fa041503268", size = 4986050, upload-time = "2025-11-10T18:09:56.36Z" }, - { url = "https://files.pythonhosted.org/packages/2a/7d/2899179c383d6dd53c7f74a772f6df16f4d6dca84584f777ebf1e1fb3f34/pikepdf-10.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:434ae183af796288d918be2825f950947a9b329850008bb97743f3297529a537", size = 2402087, upload-time = "2025-11-10T18:09:58.877Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/c6989364ffa8b44b2c581316a3e59dac4497591336e941171e80e27bf664/pikepdf-10.0.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e23617b12fceee49a5b17b0ad7921ef50eaf4e1d23babec893b8dbc498bb3f2", size = 2637508, upload-time = "2025-11-10T18:10:00.684Z" }, - { url = "https://files.pythonhosted.org/packages/96/9c/72846bf3454637450cca8cc9620dbb6d7df035ed3ff41b656c4a516e5495/pikepdf-10.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:09da390be9d8558b77372a016498fc3d8edc9e5fd3928557f6012cb29f9114fb", size = 3595197, upload-time = "2025-11-10T18:10:02.688Z" }, - { url = "https://files.pythonhosted.org/packages/77/2c/b8221889158a748e3e74edbba9590fcb6516605fa169cb786b3d81f71129/pikepdf-10.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9165ef885b657a0602623a996ea230a450e7774b48e9d7bf463f46b0dbc738df", size = 3796398, upload-time = "2025-11-10T18:10:04.826Z" }, - { url = "https://files.pythonhosted.org/packages/14/ad/098baf14ed3779bd3df4652e3b22dd8b5030024bf128afe5061a9a45774c/pikepdf-10.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:275e3ea2a99336d91b4105fc873e21e23139ad0fe6c7ae093a102700cd9fa3e8", size = 3832266, upload-time = "2025-11-10T18:10:06.804Z" }, -] - [[package]] name = "pillow" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377, upload-time = "2025-10-15T18:22:05.993Z" }, - { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343, upload-time = "2025-10-15T18:22:07.718Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981, upload-time = "2025-10-15T18:22:09.287Z" }, - { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399, upload-time = "2025-10-15T18:22:10.872Z" }, - { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740, upload-time = "2025-10-15T18:22:12.769Z" }, - { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201, upload-time = "2025-10-15T18:22:14.813Z" }, - { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334, upload-time = "2025-10-15T18:22:16.375Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162, upload-time = "2025-10-15T18:22:17.996Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769, upload-time = "2025-10-15T18:22:19.923Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107, upload-time = "2025-10-15T18:22:21.644Z" }, - { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012, upload-time = "2025-10-15T18:22:23.621Z" }, - { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, - { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, - { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, - { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, - { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, - { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, - { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, - { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, - { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, - { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, - { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, - { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, - { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, - { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, - { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, - { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, - { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, - { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, - { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, - { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, - { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, - { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, - { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, - { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, - { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, - { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, - { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, - { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, - { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, - { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, - { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, - { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, - { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, - { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +version = "12.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, ] [[package]] @@ -4295,57 +3242,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] -[[package]] -name = "proto-plus" -version = "1.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "protobuf" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, -] - [[package]] name = "protobuf" -version = "6.33.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/44/e49ecff446afeec9d1a66d6bbf9adc21e3c7cea7803a920ca3773379d4f6/protobuf-6.33.2.tar.gz", hash = "sha256:56dc370c91fbb8ac85bc13582c9e373569668a290aa2e66a590c2a0d35ddb9e4", size = 444296, upload-time = "2025-12-06T00:17:53.311Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/91/1e3a34881a88697a7354ffd177e8746e97a722e5e8db101544b47e84afb1/protobuf-6.33.2-cp310-abi3-win32.whl", hash = "sha256:87eb388bd2d0f78febd8f4c8779c79247b26a5befad525008e49a6955787ff3d", size = 425603, upload-time = "2025-12-06T00:17:41.114Z" }, - { url = "https://files.pythonhosted.org/packages/64/20/4d50191997e917ae13ad0a235c8b42d8c1ab9c3e6fd455ca16d416944355/protobuf-6.33.2-cp310-abi3-win_amd64.whl", hash = "sha256:fc2a0e8b05b180e5fc0dd1559fe8ebdae21a27e81ac77728fb6c42b12c7419b4", size = 436930, upload-time = "2025-12-06T00:17:43.278Z" }, - { url = "https://files.pythonhosted.org/packages/b2/ca/7e485da88ba45c920fb3f50ae78de29ab925d9e54ef0de678306abfbb497/protobuf-6.33.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d9b19771ca75935b3a4422957bc518b0cecb978b31d1dd12037b088f6bcc0e43", size = 427621, upload-time = "2025-12-06T00:17:44.445Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4f/f743761e41d3b2b2566748eb76bbff2b43e14d5fcab694f494a16458b05f/protobuf-6.33.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:b5d3b5625192214066d99b2b605f5783483575656784de223f00a8d00754fc0e", size = 324460, upload-time = "2025-12-06T00:17:45.678Z" }, - { url = "https://files.pythonhosted.org/packages/b1/fa/26468d00a92824020f6f2090d827078c09c9c587e34cbfd2d0c7911221f8/protobuf-6.33.2-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8cd7640aee0b7828b6d03ae518b5b4806fdfc1afe8de82f79c3454f8aef29872", size = 339168, upload-time = "2025-12-06T00:17:46.813Z" }, - { url = "https://files.pythonhosted.org/packages/56/13/333b8f421738f149d4fe5e49553bc2a2ab75235486259f689b4b91f96cec/protobuf-6.33.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:1f8017c48c07ec5859106533b682260ba3d7c5567b1ca1f24297ce03384d1b4f", size = 323270, upload-time = "2025-12-06T00:17:48.253Z" }, - { url = "https://files.pythonhosted.org/packages/0e/15/4f02896cc3df04fc465010a4c6a0cd89810f54617a32a70ef531ed75d61c/protobuf-6.33.2-py3-none-any.whl", hash = "sha256:7636aad9bb01768870266de5dc009de2d1b936771b38a793f73cbbf279c91c5c", size = 170501, upload-time = "2025-12-06T00:17:52.211Z" }, -] - -[[package]] -name = "psutil" -version = "7.1.3" +version = "6.33.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059, upload-time = "2025-11-02T12:25:54.619Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751, upload-time = "2025-11-02T12:25:58.161Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368, upload-time = "2025-11-02T12:26:00.491Z" }, - { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134, upload-time = "2025-11-02T12:26:02.613Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904, upload-time = "2025-11-02T12:26:05.207Z" }, - { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642, upload-time = "2025-11-02T12:26:07.447Z" }, - { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518, upload-time = "2025-11-02T12:26:09.719Z" }, - { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843, upload-time = "2025-11-02T12:26:11.968Z" }, - { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369, upload-time = "2025-11-02T12:26:14.358Z" }, - { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210, upload-time = "2025-11-02T12:26:16.699Z" }, - { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182, upload-time = "2025-11-02T12:26:18.848Z" }, - { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466, upload-time = "2025-11-02T12:26:21.183Z" }, - { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756, upload-time = "2025-11-02T12:26:23.148Z" }, - { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359, upload-time = "2025-11-02T12:26:25.284Z" }, - { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171, upload-time = "2025-11-02T12:26:27.23Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261, upload-time = "2025-11-02T12:26:29.48Z" }, - { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635, upload-time = "2025-11-02T12:26:31.74Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633, upload-time = "2025-11-02T12:26:33.887Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608, upload-time = "2025-11-02T12:26:36.136Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, + { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, + { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, ] [[package]] @@ -4368,21 +3277,21 @@ wheels = [ [[package]] name = "py-key-value-aio" -version = "0.2.8" +version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beartype" }, - { name = "py-key-value-shared" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/35/65310a4818acec0f87a46e5565e341c5a96fc062a9a03495ad28828ff4d7/py_key_value_aio-0.2.8.tar.gz", hash = "sha256:c0cfbb0bd4e962a3fa1a9fa6db9ba9df812899bd9312fa6368aaea7b26008b36", size = 32853, upload-time = "2025-10-24T13:31:04.688Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/5a/e56747d87a97ad2aff0f3700d77f186f0704c90c2da03bfed9e113dae284/py_key_value_aio-0.2.8-py3-none-any.whl", hash = "sha256:561565547ce8162128fd2bd0b9d70ce04a5f4586da8500cce79a54dfac78c46a", size = 69200, upload-time = "2025-10-24T13:31:03.81Z" }, + { url = "https://files.pythonhosted.org/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", size = 152291, upload-time = "2026-02-16T21:21:44.241Z" }, ] [package.optional-dependencies] -disk = [ - { name = "diskcache" }, - { name = "pathvalidate" }, +filetree = [ + { name = "aiofile" }, + { name = "anyio" }, ] keyring = [ { name = "keyring" }, @@ -4391,19 +3300,6 @@ memory = [ { name = "cachetools" }, ] -[[package]] -name = "py-key-value-shared" -version = "0.2.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beartype" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/79/05a1f9280cfa0709479319cbfd2b1c5beb23d5034624f548c83fb65b0b61/py_key_value_shared-0.2.8.tar.gz", hash = "sha256:703b4d3c61af124f0d528ba85995c3c8d78f8bd3d2b217377bd3278598070cc1", size = 8216, upload-time = "2025-10-24T13:31:03.601Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/7a/1726ceaa3343874f322dd83c9ec376ad81f533df8422b8b1e1233a59f8ce/py_key_value_shared-0.2.8-py3-none-any.whl", hash = "sha256:aff1bbfd46d065b2d67897d298642e80e5349eae588c6d11b48452b46b8d46ba", size = 14586, upload-time = "2025-10-24T13:31:02.838Z" }, -] - [[package]] name = "pyaml-env" version = "1.2.2" @@ -4416,87 +3312,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/2d/a9f47c921da9aea3755f6fd72f5d267625334ab567fff7e12498ddc1292a/pyaml_env-1.2.2-py3-none-any.whl", hash = "sha256:1c1c852a805a3ac9f9b57ef995520fdeea1c1a7a1edda6471cdf1b7c2ebb13c9", size = 9073, upload-time = "2025-01-13T07:45:14.869Z" }, ] -[[package]] -name = "pyarrow" -version = "19.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/09/a9046344212690f0632b9c709f9bf18506522feb333c894d0de81d62341a/pyarrow-19.0.1.tar.gz", hash = "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", size = 1129437, upload-time = "2025-02-18T18:55:57.027Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b4/94e828704b050e723f67d67c3535cf7076c7432cd4cf046e4bb3b96a9c9d/pyarrow-19.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", size = 30670749, upload-time = "2025-02-18T18:53:00.062Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3b/4692965e04bb1df55e2c314c4296f1eb12b4f3052d4cf43d29e076aedf66/pyarrow-19.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", size = 32128007, upload-time = "2025-02-18T18:53:06.581Z" }, - { url = "https://files.pythonhosted.org/packages/22/f7/2239af706252c6582a5635c35caa17cb4d401cd74a87821ef702e3888957/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", size = 41144566, upload-time = "2025-02-18T18:53:11.958Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/c9661b2b2849cfefddd9fd65b64e093594b231b472de08ff658f76c732b2/pyarrow-19.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", size = 42202991, upload-time = "2025-02-18T18:53:17.678Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4f/a2c0ed309167ef436674782dfee4a124570ba64299c551e38d3fdaf0a17b/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", size = 40507986, upload-time = "2025-02-18T18:53:26.263Z" }, - { url = "https://files.pythonhosted.org/packages/27/2e/29bb28a7102a6f71026a9d70d1d61df926887e36ec797f2e6acfd2dd3867/pyarrow-19.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", size = 42087026, upload-time = "2025-02-18T18:53:33.063Z" }, - { url = "https://files.pythonhosted.org/packages/16/33/2a67c0f783251106aeeee516f4806161e7b481f7d744d0d643d2f30230a5/pyarrow-19.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", size = 25250108, upload-time = "2025-02-18T18:53:38.462Z" }, - { url = "https://files.pythonhosted.org/packages/2b/8d/275c58d4b00781bd36579501a259eacc5c6dfb369be4ddeb672ceb551d2d/pyarrow-19.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", size = 30653552, upload-time = "2025-02-18T18:53:44.357Z" }, - { url = "https://files.pythonhosted.org/packages/a0/9e/e6aca5cc4ef0c7aec5f8db93feb0bde08dbad8c56b9014216205d271101b/pyarrow-19.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", size = 32103413, upload-time = "2025-02-18T18:53:52.971Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fa/a7033f66e5d4f1308c7eb0dfcd2ccd70f881724eb6fd1776657fdf65458f/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", size = 41134869, upload-time = "2025-02-18T18:53:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/2d/92/34d2569be8e7abdc9d145c98dc410db0071ac579b92ebc30da35f500d630/pyarrow-19.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", size = 42192626, upload-time = "2025-02-18T18:54:06.062Z" }, - { url = "https://files.pythonhosted.org/packages/0a/1f/80c617b1084fc833804dc3309aa9d8daacd46f9ec8d736df733f15aebe2c/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", size = 40496708, upload-time = "2025-02-18T18:54:12.347Z" }, - { url = "https://files.pythonhosted.org/packages/e6/90/83698fcecf939a611c8d9a78e38e7fed7792dcc4317e29e72cf8135526fb/pyarrow-19.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", size = 42075728, upload-time = "2025-02-18T18:54:19.364Z" }, - { url = "https://files.pythonhosted.org/packages/40/49/2325f5c9e7a1c125c01ba0c509d400b152c972a47958768e4e35e04d13d8/pyarrow-19.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", size = 25242568, upload-time = "2025-02-18T18:54:25.846Z" }, - { url = "https://files.pythonhosted.org/packages/3f/72/135088d995a759d4d916ec4824cb19e066585b4909ebad4ab196177aa825/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", size = 30702371, upload-time = "2025-02-18T18:54:30.665Z" }, - { url = "https://files.pythonhosted.org/packages/2e/01/00beeebd33d6bac701f20816a29d2018eba463616bbc07397fdf99ac4ce3/pyarrow-19.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", size = 32116046, upload-time = "2025-02-18T18:54:35.995Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c9/23b1ea718dfe967cbd986d16cf2a31fe59d015874258baae16d7ea0ccabc/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", size = 41091183, upload-time = "2025-02-18T18:54:42.662Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d4/b4a3aa781a2c715520aa8ab4fe2e7fa49d33a1d4e71c8fc6ab7b5de7a3f8/pyarrow-19.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", size = 42171896, upload-time = "2025-02-18T18:54:49.808Z" }, - { url = "https://files.pythonhosted.org/packages/23/1b/716d4cd5a3cbc387c6e6745d2704c4b46654ba2668260d25c402626c5ddb/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", size = 40464851, upload-time = "2025-02-18T18:54:57.073Z" }, - { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744, upload-time = "2025-02-18T18:55:08.562Z" }, -] - -[[package]] -name = "pyasn1" -version = "0.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, -] - -[[package]] -name = "pyasn1-modules" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, -] - -[[package]] -name = "pycocotools" -version = "2.0.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/df/32354b5dda963ffdfc8f75c9acf8828ef7890723a4ed57bb3ff2dc1d6f7e/pycocotools-2.0.11.tar.gz", hash = "sha256:34254d76da85576fcaf5c1f3aa9aae16b8cb15418334ba4283b800796bd1993d", size = 25381, upload-time = "2025-12-15T22:31:46.148Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/12/2f2292332456e4e4aba1dec0e3de8f1fc40fb2f4fdb0ca1cb17db9861682/pycocotools-2.0.11-cp312-abi3-macosx_10_13_universal2.whl", hash = "sha256:a2e9634bc7cadfb01c88e0b98589aaf0bd12983c7927bde93f19c0103e5441f4", size = 147795, upload-time = "2025-12-15T22:31:11.519Z" }, - { url = "https://files.pythonhosted.org/packages/63/3c/68d7ea376aada9046e7ea2d7d0dad0d27e1ae8b4b3c26a28346689390ab2/pycocotools-2.0.11-cp312-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fd4121766cc057133534679c0ec3f9023dbd96e9b31cf95c86a069ebdac2b65", size = 398434, upload-time = "2025-12-15T22:31:12.558Z" }, - { url = "https://files.pythonhosted.org/packages/23/59/dc81895beff4e1207a829d40d442ea87cefaac9f6499151965f05c479619/pycocotools-2.0.11-cp312-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a82d1c9ed83f75da0b3f244f2a3cf559351a283307bd9b79a4ee2b93ab3231dd", size = 411685, upload-time = "2025-12-15T22:31:13.995Z" }, - { url = "https://files.pythonhosted.org/packages/0b/0b/5a8a7de300862a2eb5e2ecd3cb015126231379206cd3ebba8f025388d770/pycocotools-2.0.11-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:89e853425018e2c2920ee0f2112cf7c140a1dcf5f4f49abd9c2da112c3e0f4b3", size = 390500, upload-time = "2025-12-15T22:31:15.138Z" }, - { url = "https://files.pythonhosted.org/packages/63/b5/519bb68647f06feea03d5f355c33c05800aeae4e57b9482b2859eb00752e/pycocotools-2.0.11-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:87af87b8d06d5b852a885a319d9362dca3bed9f8bbcc3feb6513acb1f88ea242", size = 409790, upload-time = "2025-12-15T22:31:16.326Z" }, - { url = "https://files.pythonhosted.org/packages/83/b4/f6708404ff494706b80e714b919f76dc4ec9845a4007affd6d6b0843f928/pycocotools-2.0.11-cp312-abi3-win_amd64.whl", hash = "sha256:ffe806ce535f5996445188f9a35643791dc54beabc61bd81e2b03367356d604f", size = 77570, upload-time = "2025-12-15T22:31:17.703Z" }, - { url = "https://files.pythonhosted.org/packages/6e/63/778cd0ddc9d4a78915ac0a72b56d7fb204f7c3fabdad067d67ea0089762e/pycocotools-2.0.11-cp312-abi3-win_arm64.whl", hash = "sha256:c230f5e7b14bd19085217b4f40bba81bf14a182b150b8e9fab1c15d504ade343", size = 64564, upload-time = "2025-12-15T22:31:18.652Z" }, - { url = "https://files.pythonhosted.org/packages/5d/78/31c81e99d596a20c137d8a2e7a25f39a88f88fada5e0b253fce7323ecf0d/pycocotools-2.0.11-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fd72b9734e6084b217c1fc3945bfd4ec05bdc75a44e4f0c461a91442bb804973", size = 168931, upload-time = "2025-12-15T22:31:19.845Z" }, - { url = "https://files.pythonhosted.org/packages/5f/63/fdd488e4cd0fdc6f93134f2cd68b1fce441d41566e86236bf6156961ef9b/pycocotools-2.0.11-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7eb43b79448476b094240450420b7425d06e297880144b8ea6f01e9b4340e43", size = 484856, upload-time = "2025-12-15T22:31:21.231Z" }, - { url = "https://files.pythonhosted.org/packages/a1/fc/c83648a8fb7ea3b8e2ce2e761b469807e6cadb81577bf1af31c4f2ef0d87/pycocotools-2.0.11-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3546b93b39943347c4f5b0694b5824105cbe2174098a416bcad4acd9c21e957", size = 480994, upload-time = "2025-12-15T22:31:22.426Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2d/35e1122c0d007288aa9545be9549cbc7a4987b2c22f21d75045260a8b5b8/pycocotools-2.0.11-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:efd1694b2075f2f10c5828f10f6e6c4e44368841fd07dae385c3aa015c8e25f9", size = 467956, upload-time = "2025-12-15T22:31:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/30cfe8142470da3e45abe43a9842449ca0180d993320559890e2be19e4a5/pycocotools-2.0.11-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:368244f30eb8d6cae7003aa2c0831fbdf0153664a32859ec7fbceea52bfb6878", size = 474658, upload-time = "2025-12-15T22:31:24.883Z" }, - { url = "https://files.pythonhosted.org/packages/bc/62/254ca92604106c7a5af3258e589e465e681fe0166f9b10f97d8ca70934d6/pycocotools-2.0.11-cp313-cp313t-win_amd64.whl", hash = "sha256:ac8aa17263e6489aa521f9fa91e959dfe0ea3a5519fde2cbf547312cdce7559e", size = 89681, upload-time = "2025-12-15T22:31:26.025Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f0/c019314dc122ad5e6281de420adc105abe9b59d00008f72ef3ad32b1e328/pycocotools-2.0.11-cp313-cp313t-win_arm64.whl", hash = "sha256:04480330df5013f6edd94891a0ee8294274185f1b5093d1b0f23d51778f0c0e9", size = 70520, upload-time = "2025-12-15T22:31:26.999Z" }, - { url = "https://files.pythonhosted.org/packages/66/2b/58b35c88f2086c043ff1c87bd8e7bf36f94e84f7b01a5e00b6f5fabb92a7/pycocotools-2.0.11-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a6b13baf6bfcf881b6d6ac6e23c776f87a68304cd86e53d1d6b9afa31e363c4e", size = 169883, upload-time = "2025-12-15T22:31:28.233Z" }, - { url = "https://files.pythonhosted.org/packages/24/c0/b970eefb78746c8b4f8b3fa1b49d9f3ec4c5429ef3c5d4bbcc55abebe478/pycocotools-2.0.11-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78bae4a9de9d34c4759754a848dfb3306f9ef1c2fcb12164ffbd3d013d008321", size = 486894, upload-time = "2025-12-15T22:31:29.283Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f7/db7436820a1948d96fa9764b6026103e808840979be01246049f2c1e7f94/pycocotools-2.0.11-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83d896f4310379849dfcfa7893afb0ff21f4f3cdb04ab3f61b05dd98953dd0ad", size = 483249, upload-time = "2025-12-15T22:31:31.687Z" }, - { url = "https://files.pythonhosted.org/packages/1e/a6/a14a12c9f50c41998fdc0d31fd3755bcbce124bac9abb1d6b99d1853cafd/pycocotools-2.0.11-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:eebd723503a2eb2c8b285f56ea3be1d9f3875cd7c40d945358a428db94f14015", size = 469070, upload-time = "2025-12-15T22:31:32.821Z" }, - { url = "https://files.pythonhosted.org/packages/46/de/aa4f65ece3da8e89310a1be00cad0700170fd13f41a3aaae2712291269d5/pycocotools-2.0.11-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bd7a1e19ef56a828a94bace673372071d334a9232cd32ae3cd48845a04d45c4f", size = 475589, upload-time = "2025-12-15T22:31:34.188Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/04a30df03ae6236b369b361df0c50531d173d03678978806aa2182e02d1e/pycocotools-2.0.11-cp314-cp314t-win_amd64.whl", hash = "sha256:63026e11a56211058d0e84e8263f74cbccd5e786fac18d83fd221ecb9819fcc7", size = 93863, upload-time = "2025-12-15T22:31:35.38Z" }, - { url = "https://files.pythonhosted.org/packages/da/05/8942b640d6307a21c3ede188e8c56f07bedf246fac0e501437dbda72a350/pycocotools-2.0.11-cp314-cp314t-win_arm64.whl", hash = "sha256:8cedb8ccb97ffe9ed2c8c259234fa69f4f1e8665afe3a02caf93f6ef2952c07f", size = 72038, upload-time = "2025-12-15T22:31:36.768Z" }, -] - [[package]] name = "pycparser" version = "2.23" @@ -4551,11 +3366,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] -[package.optional-dependencies] -email = [ - { name = "email-validator" }, -] - [[package]] name = "pydantic-core" version = "2.41.5" @@ -4661,11 +3471,11 @@ wheels = [ [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] @@ -4682,71 +3492,28 @@ crypto = [ { name = "cryptography" }, ] -[[package]] -name = "pylibcudf-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-python" }, - { name = "libcudf-cu12" }, - { name = "nvtx" }, - { name = "packaging" }, - { name = "rmm-cu12" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/dc/c687ab9a09883074471395e21b6f81620ee215f3fcc28af5dfbdba3b75f4/pylibcudf_cu12-25.8.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74a307a41d7c322ee3477c15405d70eaf9599cf495c0620190ec8f08306abc4f", size = 28056052, upload-time = "2025-08-07T11:44:59.624Z" }, - { url = "https://files.pythonhosted.org/packages/e7/77/25e584707b9a2606b6aae9ca7b13c54cff131740598a5996df34ea346bf9/pylibcudf_cu12-25.8.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf32e29dcbc3869095c7c65a3d18b6b5f7d3edf19efe5ca67a9c4b716e582e73", size = 27918119, upload-time = "2025-08-07T11:41:18.808Z" }, - { url = "https://files.pythonhosted.org/packages/da/3d/49a1149b0dc3fac38608e2b9a16acbf7d1679d863978dd1823f186434207/pylibcudf_cu12-25.8.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf5245bce8c9db21b9b69daf95276635e36521884af1dbdcdd75dee2444cfe35", size = 28009766, upload-time = "2025-08-07T11:44:04.132Z" }, - { url = "https://files.pythonhosted.org/packages/b8/97/9dfc8b542f53ea5ae29030a7767328c47f9128a5d4bd6db75ec5dc9ddbe0/pylibcudf_cu12-25.8.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6fd80d86376a95ad6962ae426a8cc4a1a502be64260d71fbe76ee87640389605", size = 27868189, upload-time = "2025-08-07T11:40:47Z" }, -] - -[[package]] -name = "pylibcugraph-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cupy-cuda12x" }, - { name = "libcugraph-cu12" }, - { name = "numpy" }, - { name = "pylibraft-cu12" }, - { name = "rmm-cu12" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/4b/df78aab653ecc71f7c0ade17634e270d50d07d3bc6fd6fb596db659c6bc7/pylibcugraph_cu12-25.8.0.tar.gz", hash = "sha256:6ed134b9e121a4856d2242b2cbeb804cc73499aac6959275f458383b7ee6c2ad", size = 4044, upload-time = "2025-08-07T11:57:06.777Z" } - -[[package]] -name = "pylibraft-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-python" }, - { name = "libraft-cu12" }, - { name = "numpy" }, - { name = "rmm-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/d5/56f89a52d01423faa5a44905e2917efc16cac0eda6ceed9b0fe9eeab8442/pylibraft_cu12-25.8.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9445af2f518cd4abd7e1b6f32fa347864e766d87126ff1b73079604dc800ddd", size = 854193, upload-time = "2025-08-07T13:45:22.777Z" }, - { url = "https://files.pythonhosted.org/packages/0b/23/23831eeead7ae5c41243617ab94dd6b83a8a38b3f8c3e0dc9e45c5219d50/pylibraft_cu12-25.8.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e29dcb3839556b3a3b22228c2376580da1f0de70292f664861881776458459e0", size = 853552, upload-time = "2025-08-07T13:41:06.635Z" }, - { url = "https://files.pythonhosted.org/packages/60/52/84402e816d0e6e2851752ce959f0ea4282800dedd9c11908810acca04af8/pylibraft_cu12-25.8.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1eb0d95309d404ace9b42d22587f8440bb8e8778c6f1a4d847604429264c685f", size = 848866, upload-time = "2025-08-07T13:44:35.548Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b8/15c3b746958e0618a69ef3bc1cb0ddf54511e770acfa1095a7f5ed239bcb/pylibraft_cu12-25.8.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45048d6aff885d138db53a1809c5c731cd2f60627f528d80d8db888a63a8b3a0", size = 847870, upload-time = "2025-08-07T13:40:36.623Z" }, -] - [[package]] name = "pymilvus" -version = "2.5.14" +version = "2.6.11" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "cachetools" }, { name = "grpcio" }, - { name = "milvus-lite", marker = "sys_platform != 'win32'" }, + { name = "orjson" }, { name = "pandas" }, { name = "protobuf" }, { name = "python-dotenv" }, + { name = "requests" }, { name = "setuptools" }, - { name = "ujson" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/f5/ab9309bd59d141d7977512b870eb5286ec80ced450ecdc5580b06f5fdf1a/pymilvus-2.5.14.tar.gz", hash = "sha256:ba831aa79d29feb3a5ff846c07a59015d0f995949d0dfd2f420554cda0261b98", size = 1270850, upload-time = "2025-07-21T16:19:07.74Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/e6/0adc3b374f5c5d1eebd4f551b455c6865c449b170b17545001b208e2b153/pymilvus-2.6.11.tar.gz", hash = "sha256:a40c10322cde25184a8c3d84993a14dfb67ad2bdcfc5dff7e68b11a79ff8f6d8", size = 1583634, upload-time = "2026-03-27T06:25:46.023Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/39/e6574fa640583e33ab6e709d61bbad315130ca42dcbf449aa025c3789a63/pymilvus-2.5.14-py3-none-any.whl", hash = "sha256:0e3cb687fd0807770cafb59566d217998b2166edcfa11956dd6e3fbbe2136a0f", size = 236412, upload-time = "2025-07-21T16:19:05.556Z" }, + { url = "https://files.pythonhosted.org/packages/9c/1c/bccb331d71f824738f80f11e9b8b4da47973c903826355526ae4fa2b762f/pymilvus-2.6.11-py3-none-any.whl", hash = "sha256:a11e1718b15045361c71ca671b959900cb7e2faae863c896f6b7e87bf2e4d10a", size = 315252, upload-time = "2026-03-27T06:25:44.215Z" }, +] + +[package.optional-dependencies] +milvus-lite = [ + { name = "milvus-lite", marker = "sys_platform != 'win32'" }, ] [[package]] @@ -4765,38 +3532,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/ba/b34e3f8c57c453c02daf1a1eff9c4b62a2e89fc10a29bc83fb685155fe14/pymilvus_model-0.3.2-py3-none-any.whl", hash = "sha256:df8a90519a2adc47bd40f37d8c250b0ad0c7aaafc6139b52dc896d5cfda55d35", size = 47699, upload-time = "2025-03-31T08:47:43.372Z" }, ] -[[package]] -name = "pynvjitlink-cu12" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/02/c7f60f4a30595e67bed0f70bf9b8217479a623094397b92e5e8167021879/pynvjitlink_cu12-0.7.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fc54a5caa12d98bef709b8e2c685e558d793dfd5619e4b095e4a743744e17ed", size = 45930160, upload-time = "2025-06-25T14:38:15.953Z" }, - { url = "https://files.pythonhosted.org/packages/d9/c1/8ca003a16c2391ba8542c9f51ceae1124d3be3f824b7605c8af9d62c300a/pynvjitlink_cu12-0.7.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e6b9aec00ad37647692b030ee545fdb3b701b0a91579a5b9075fbe314c0f9bb", size = 46934247, upload-time = "2025-06-25T14:38:20.18Z" }, - { url = "https://files.pythonhosted.org/packages/bc/17/81bcaebdf678a47c084629cde924cf27acc69500a9da625d163b408b4a2c/pynvjitlink_cu12-0.7.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc9b904531dfc416a74a30ad81bb0a851857c3d34bf6335ffa75bc6a1db228c7", size = 45929897, upload-time = "2025-06-25T14:38:23.034Z" }, - { url = "https://files.pythonhosted.org/packages/02/89/08a2b8b5cd91c2ed080ecc8a144f6984bd2579915857fa68016c5e775906/pynvjitlink_cu12-0.7.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ff2627f9fa15514a0af47dfe5fba4689a52dca79878d457f8a204fa418c0a4f", size = 46934163, upload-time = "2025-06-25T14:38:25.593Z" }, -] - -[[package]] -name = "pynvml" -version = "12.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nvidia-ml-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/6f/6b5880ed0239e85b9a39aed103b65b2ef81425beef9f45e5c035bf008330/pynvml-12.0.0.tar.gz", hash = "sha256:299ce2451a6a17e6822d6faee750103e25b415f06f59abb8db65d30f794166f5", size = 33636, upload-time = "2024-12-02T15:04:36.631Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/df/f7cf07a65a96dd11d71f346f9c2863accdd4784da83af7181b067d556cbc/pynvml-12.0.0-py3-none-any.whl", hash = "sha256:fdff84b62a27dbe98e08e1a647eb77342bef1aebe0878bcd15e99a83fcbecb9e", size = 26560, upload-time = "2024-12-02T15:04:35.047Z" }, -] - -[[package]] -name = "pypandoc" -version = "1.16.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/18/9f5f70567b97758625335209b98d5cb857e19aa1a9306e9749567a240634/pypandoc-1.16.2.tar.gz", hash = "sha256:7a72a9fbf4a5dc700465e384c3bb333d22220efc4e972cb98cf6fc723cdca86b", size = 31477, upload-time = "2025-11-13T16:30:29.608Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/e9/b145683854189bba84437ea569bfa786f408c8dc5bc16d8eb0753f5583bf/pypandoc-1.16.2-py3-none-any.whl", hash = "sha256:c200c1139c8e3247baf38d1e9279e85d9f162499d1999c6aa8418596558fe79b", size = 19451, upload-time = "2025-11-13T16:30:07.66Z" }, -] - [[package]] name = "pyparsing" version = "3.2.5" @@ -4806,15 +3541,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, ] -[[package]] -name = "pypdf" -version = "6.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bd/c2/b59b02ff7f2dc006799d2c5dc3a8877686890abdd915176ef799070edf17/pypdf-6.4.2.tar.gz", hash = "sha256:c466ff1272ffb4712c2348d2bbc3019bc93f1c62ccfaf50808e3b9f13c3dc527", size = 5275502, upload-time = "2025-12-14T14:30:58.58Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/99/3147435e15ccd97c0451efc3d13495dc22602e9887f81e64f1b135bae821/pypdf-6.4.2-py3-none-any.whl", hash = "sha256:014dcff867fd99fc0b6fc90ed1f7e1347ef2317ae038a489c2caa64106d268f4", size = 328212, upload-time = "2025-12-14T14:30:56.701Z" }, -] - [[package]] name = "pypdfium2" version = "5.2.0" @@ -4892,19 +3618,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] -[[package]] -name = "python-docx" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lxml" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256, upload-time = "2025-06-16T20:46:27.921Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/00/1e03a4989fa5795da308cd774f05b704ace555a70f9bf9d3be057b680bcf/python_docx-1.2.0-py3-none-any.whl", hash = "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", size = 252987, upload-time = "2025-06-16T20:46:22.506Z" }, -] - [[package]] name = "python-dotenv" version = "1.2.1" @@ -4914,60 +3627,13 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, ] -[[package]] -name = "python-iso639" -version = "2025.11.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/3b/3e07aadeeb7bbb2574d6aa6ccacbc58b17bd2b1fb6c7196bf96ab0e45129/python_iso639-2025.11.16.tar.gz", hash = "sha256:aabe941267898384415a509f5236d7cfc191198c84c5c6f73dac73d9783f5169", size = 174186, upload-time = "2025-11-16T21:53:37.031Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/2d/563849c31e58eb2e273fa0c391a7d9987db32f4d9152fe6ecdac0a8ffe93/python_iso639-2025.11.16-py3-none-any.whl", hash = "sha256:65f6ac6c6d8e8207f6175f8bf7fff7db486c6dc5c1d8866c2b77d2a923370896", size = 167818, upload-time = "2025-11-16T21:53:35.36Z" }, -] - -[[package]] -name = "python-magic" -version = "0.4.27" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", size = 14677, upload-time = "2022-06-07T20:16:59.508Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", size = 13840, upload-time = "2022-06-07T20:16:57.763Z" }, -] - [[package]] name = "python-multipart" -version = "0.0.18" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b4/86/b6b38677dec2e2e7898fc5b6f7e42c2d011919a92d25339451892f27b89c/python_multipart-0.0.18.tar.gz", hash = "sha256:7a68db60c8bfb82e460637fa4750727b45af1d5e2ed215593f917f64694d34fe", size = 36622, upload-time = "2024-11-28T19:16:02.383Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/6b/b60f47101ba2cac66b4a83246630e68ae9bbe2e614cbae5f4465f46dee13/python_multipart-0.0.18-py3-none-any.whl", hash = "sha256:efe91480f485f6a361427a541db4796f9e1591afc0fb8e7a4ba06bfbc6708996", size = 24389, upload-time = "2024-11-28T19:16:00.947Z" }, -] - -[[package]] -name = "python-oxmsg" -version = "0.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "olefile" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/4e/869f34faedbc968796d2c7e9837dede079c9cb9750917356b1f1eda926e9/python_oxmsg-0.0.2.tar.gz", hash = "sha256:a6aff4deb1b5975d44d49dab1d9384089ffeec819e19c6940bc7ffbc84775fad", size = 34713, upload-time = "2025-02-03T17:13:47.415Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/67/f56c69a98c7eb244025845506387d0f961681657c9fcd8b2d2edd148f9d2/python_oxmsg-0.0.2-py3-none-any.whl", hash = "sha256:22be29b14c46016bcd05e34abddfd8e05ee82082f53b82753d115da3fc7d0355", size = 31455, upload-time = "2025-02-03T17:13:46.061Z" }, -] - -[[package]] -name = "python-pptx" -version = "1.0.2" +version = "0.0.26" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lxml" }, - { name = "pillow" }, - { name = "typing-extensions" }, - { name = "xlsxwriter" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/52/a9/0c0db8d37b2b8a645666f7fd8accea4c6224e013c42b1d5c17c93590cd06/python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095", size = 10109297, upload-time = "2024-08-07T17:33:37.772Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/71/b145a380824a960ebd60e1014256dbb7d2253f2316ff2d73dfd8928ec2c3/python_multipart-0.0.26.tar.gz", hash = "sha256:08fadc45918cd615e26846437f50c5d6d23304da32c341f289a617127b081f17", size = 43501, upload-time = "2026-04-10T14:09:59.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/4f/00be2196329ebbff56ce564aa94efb0fbc828d00de250b1980de1a34ab49/python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba", size = 472788, upload-time = "2024-08-07T17:33:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/9a/22/f1925cdda983ab66fc8ec6ec8014b959262747e58bdca26a4e3d1da29d56/python_multipart-0.0.26-py3-none-any.whl", hash = "sha256:c0b169f8c4484c13b0dcf2ef0ec3a4adb255c4b7d18d8e420477d2b1dd03f185", size = 28847, upload-time = "2026-04-10T14:09:58.131Z" }, ] [[package]] @@ -5073,110 +3739,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, ] -[[package]] -name = "raft-dask-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dask-cuda" }, - { name = "distributed-ucxx-cu12" }, - { name = "libraft-cu12" }, - { name = "nvidia-nccl-cu12" }, - { name = "pylibraft-cu12" }, - { name = "rapids-dask-dependency" }, - { name = "ucx-py-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/13/f43646718aa98d9b5d41d29c9d805d1cefa33477eb06a6f3fc3ca1ba24f1/raft_dask_cu12-25.8.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79cdf4932ca44d570f87d45024d4b116eb398aa0d4a304e1ed2195add8d3eb80", size = 1010197, upload-time = "2025-08-07T14:41:27.634Z" }, - { url = "https://files.pythonhosted.org/packages/cf/0a/bc1c5982d333e3678c6a3f0f6990df5407ef1a87bc406e3fc313a70a8ef4/raft_dask_cu12-25.8.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d859cd8f4384fc32b3b1bd690eea03f4f670a89b77fcefa331404c8ee5378d8", size = 1040771, upload-time = "2025-08-07T14:44:11.386Z" }, - { url = "https://files.pythonhosted.org/packages/d3/d7/9772cad30cee4b822249180f3ec90c637ed2cb5fcbc40563a27c91d0f29b/raft_dask_cu12-25.8.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6eb1b450ee0d382062e487136e235befce825b8095acb135ffa514273f39a0", size = 1008371, upload-time = "2025-08-07T14:40:38.802Z" }, - { url = "https://files.pythonhosted.org/packages/fb/03/74a68ada398fbda8ea655497790fd13ad042ca8d9b40d2e02d0c732cf6ba/raft_dask_cu12-25.8.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43f0984df44217467eafbff212bf7c3b65f7b6739529dd51ba04145543e000e", size = 1039820, upload-time = "2025-08-07T14:43:48.299Z" }, -] - -[[package]] -name = "rapidfuzz" -version = "3.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d3/28/9d808fe62375b9aab5ba92fa9b29371297b067c2790b2d7cda648b1e2f8d/rapidfuzz-3.14.3.tar.gz", hash = "sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f", size = 57863900, upload-time = "2025-11-01T11:54:52.321Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/8e/3c215e860b458cfbedb3ed73bc72e98eb7e0ed72f6b48099604a7a3260c2/rapidfuzz-3.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226", size = 1945306, upload-time = "2025-11-01T11:53:06.452Z" }, - { url = "https://files.pythonhosted.org/packages/36/d9/31b33512015c899f4a6e6af64df8dfe8acddf4c8b40a4b3e0e6e1bcd00e5/rapidfuzz-3.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb", size = 1390788, upload-time = "2025-11-01T11:53:08.721Z" }, - { url = "https://files.pythonhosted.org/packages/a9/67/2ee6f8de6e2081ccd560a571d9c9063184fe467f484a17fa90311a7f4a2e/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941", size = 1374580, upload-time = "2025-11-01T11:53:10.164Z" }, - { url = "https://files.pythonhosted.org/packages/30/83/80d22997acd928eda7deadc19ccd15883904622396d6571e935993e0453a/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382", size = 3154947, upload-time = "2025-11-01T11:53:12.093Z" }, - { url = "https://files.pythonhosted.org/packages/5b/cf/9f49831085a16384695f9fb096b99662f589e30b89b4a589a1ebc1a19d34/rapidfuzz-3.14.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43", size = 1223872, upload-time = "2025-11-01T11:53:13.664Z" }, - { url = "https://files.pythonhosted.org/packages/c8/0f/41ee8034e744b871c2e071ef0d360686f5ccfe5659f4fd96c3ec406b3c8b/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db", size = 2392512, upload-time = "2025-11-01T11:53:15.109Z" }, - { url = "https://files.pythonhosted.org/packages/da/86/280038b6b0c2ccec54fb957c732ad6b41cc1fd03b288d76545b9cf98343f/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed", size = 2521398, upload-time = "2025-11-01T11:53:17.146Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7b/05c26f939607dca0006505e3216248ae2de631e39ef94dd63dbbf0860021/rapidfuzz-3.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc", size = 4259416, upload-time = "2025-11-01T11:53:19.34Z" }, - { url = "https://files.pythonhosted.org/packages/40/eb/9e3af4103d91788f81111af1b54a28de347cdbed8eaa6c91d5e98a889aab/rapidfuzz-3.14.3-cp312-cp312-win32.whl", hash = "sha256:dea97ac3ca18cd3ba8f3d04b5c1fe4aa60e58e8d9b7793d3bd595fdb04128d7a", size = 1709527, upload-time = "2025-11-01T11:53:20.949Z" }, - { url = "https://files.pythonhosted.org/packages/b8/63/d06ecce90e2cf1747e29aeab9f823d21e5877a4c51b79720b2d3be7848f8/rapidfuzz-3.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:b5100fd6bcee4d27f28f4e0a1c6b5127bc8ba7c2a9959cad9eab0bf4a7ab3329", size = 1538989, upload-time = "2025-11-01T11:53:22.428Z" }, - { url = "https://files.pythonhosted.org/packages/fc/6d/beee32dcda64af8128aab3ace2ccb33d797ed58c434c6419eea015fec779/rapidfuzz-3.14.3-cp312-cp312-win_arm64.whl", hash = "sha256:4e49c9e992bc5fc873bd0fff7ef16a4405130ec42f2ce3d2b735ba5d3d4eb70f", size = 811161, upload-time = "2025-11-01T11:53:23.811Z" }, - { url = "https://files.pythonhosted.org/packages/e4/4f/0d94d09646853bd26978cb3a7541b6233c5760687777fa97da8de0d9a6ac/rapidfuzz-3.14.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae", size = 1939646, upload-time = "2025-11-01T11:53:25.292Z" }, - { url = "https://files.pythonhosted.org/packages/b6/eb/f96aefc00f3bbdbab9c0657363ea8437a207d7545ac1c3789673e05d80bd/rapidfuzz-3.14.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff", size = 1385512, upload-time = "2025-11-01T11:53:27.594Z" }, - { url = "https://files.pythonhosted.org/packages/26/34/71c4f7749c12ee223dba90017a5947e8f03731a7cc9f489b662a8e9e643d/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457", size = 1373571, upload-time = "2025-11-01T11:53:29.096Z" }, - { url = "https://files.pythonhosted.org/packages/32/00/ec8597a64f2be301ce1ee3290d067f49f6a7afb226b67d5f15b56d772ba5/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c", size = 3156759, upload-time = "2025-11-01T11:53:30.777Z" }, - { url = "https://files.pythonhosted.org/packages/61/d5/b41eeb4930501cc899d5a9a7b5c9a33d85a670200d7e81658626dcc0ecc0/rapidfuzz-3.14.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e", size = 1222067, upload-time = "2025-11-01T11:53:32.334Z" }, - { url = "https://files.pythonhosted.org/packages/2a/7d/6d9abb4ffd1027c6ed837b425834f3bed8344472eb3a503ab55b3407c721/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10", size = 2394775, upload-time = "2025-11-01T11:53:34.24Z" }, - { url = "https://files.pythonhosted.org/packages/15/ce/4f3ab4c401c5a55364da1ffff8cc879fc97b4e5f4fa96033827da491a973/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41", size = 2526123, upload-time = "2025-11-01T11:53:35.779Z" }, - { url = "https://files.pythonhosted.org/packages/c1/4b/54f804975376a328f57293bd817c12c9036171d15cf7292032e3f5820b2d/rapidfuzz-3.14.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0", size = 4262874, upload-time = "2025-11-01T11:53:37.866Z" }, - { url = "https://files.pythonhosted.org/packages/e9/b6/958db27d8a29a50ee6edd45d33debd3ce732e7209183a72f57544cd5fe22/rapidfuzz-3.14.3-cp313-cp313-win32.whl", hash = "sha256:8383b6d0d92f6cd008f3c9216535be215a064b2cc890398a678b56e6d280cb63", size = 1707972, upload-time = "2025-11-01T11:53:39.442Z" }, - { url = "https://files.pythonhosted.org/packages/07/75/fde1f334b0cec15b5946d9f84d73250fbfcc73c236b4bc1b25129d90876b/rapidfuzz-3.14.3-cp313-cp313-win_amd64.whl", hash = "sha256:e6b5e3036976f0fde888687d91be86d81f9ac5f7b02e218913c38285b756be6c", size = 1537011, upload-time = "2025-11-01T11:53:40.92Z" }, - { url = "https://files.pythonhosted.org/packages/2e/d7/d83fe001ce599dc7ead57ba1debf923dc961b6bdce522b741e6b8c82f55c/rapidfuzz-3.14.3-cp313-cp313-win_arm64.whl", hash = "sha256:7ba009977601d8b0828bfac9a110b195b3e4e79b350dcfa48c11269a9f1918a0", size = 810744, upload-time = "2025-11-01T11:53:42.723Z" }, - { url = "https://files.pythonhosted.org/packages/92/13/a486369e63ff3c1a58444d16b15c5feb943edd0e6c28a1d7d67cb8946b8f/rapidfuzz-3.14.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424", size = 1967702, upload-time = "2025-11-01T11:53:44.554Z" }, - { url = "https://files.pythonhosted.org/packages/f1/82/efad25e260b7810f01d6b69122685e355bed78c94a12784bac4e0beb2afb/rapidfuzz-3.14.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e", size = 1410702, upload-time = "2025-11-01T11:53:46.066Z" }, - { url = "https://files.pythonhosted.org/packages/ba/1a/34c977b860cde91082eae4a97ae503f43e0d84d4af301d857679b66f9869/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8", size = 1382337, upload-time = "2025-11-01T11:53:47.62Z" }, - { url = "https://files.pythonhosted.org/packages/88/74/f50ea0e24a5880a9159e8fd256b84d8f4634c2f6b4f98028bdd31891d907/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519", size = 3165563, upload-time = "2025-11-01T11:53:49.216Z" }, - { url = "https://files.pythonhosted.org/packages/e8/7a/e744359404d7737049c26099423fc54bcbf303de5d870d07d2fb1410f567/rapidfuzz-3.14.3-cp313-cp313t-manylinux_2_31_armv7l.whl", hash = "sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a", size = 1214727, upload-time = "2025-11-01T11:53:50.883Z" }, - { url = "https://files.pythonhosted.org/packages/d3/2e/87adfe14ce75768ec6c2b8acd0e05e85e84be4be5e3d283cdae360afc4fe/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897", size = 2403349, upload-time = "2025-11-01T11:53:52.322Z" }, - { url = "https://files.pythonhosted.org/packages/70/17/6c0b2b2bff9c8b12e12624c07aa22e922b0c72a490f180fa9183d1ef2c75/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58", size = 2507596, upload-time = "2025-11-01T11:53:53.835Z" }, - { url = "https://files.pythonhosted.org/packages/c3/d1/87852a7cbe4da7b962174c749a47433881a63a817d04f3e385ea9babcd9e/rapidfuzz-3.14.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f", size = 4273595, upload-time = "2025-11-01T11:53:55.961Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ab/1d0354b7d1771a28fa7fe089bc23acec2bdd3756efa2419f463e3ed80e16/rapidfuzz-3.14.3-cp313-cp313t-win32.whl", hash = "sha256:489ce98a895c98cad284f0a47960c3e264c724cb4cfd47a1430fa091c0c25204", size = 1757773, upload-time = "2025-11-01T11:53:57.628Z" }, - { url = "https://files.pythonhosted.org/packages/0b/0c/71ef356adc29e2bdf74cd284317b34a16b80258fa0e7e242dd92cc1e6d10/rapidfuzz-3.14.3-cp313-cp313t-win_amd64.whl", hash = "sha256:656e52b054d5b5c2524169240e50cfa080b04b1c613c5f90a2465e84888d6f15", size = 1576797, upload-time = "2025-11-01T11:53:59.455Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d2/0e64fc27bb08d4304aa3d11154eb5480bcf5d62d60140a7ee984dc07468a/rapidfuzz-3.14.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c7e40c0a0af02ad6e57e89f62bef8604f55a04ecae90b0ceeda591bbf5923317", size = 829940, upload-time = "2025-11-01T11:54:01.1Z" }, - { url = "https://files.pythonhosted.org/packages/32/6f/1b88aaeade83abc5418788f9e6b01efefcd1a69d65ded37d89cd1662be41/rapidfuzz-3.14.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea", size = 1942086, upload-time = "2025-11-01T11:54:02.592Z" }, - { url = "https://files.pythonhosted.org/packages/a0/2c/b23861347436cb10f46c2bd425489ec462790faaa360a54a7ede5f78de88/rapidfuzz-3.14.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6", size = 1386993, upload-time = "2025-11-01T11:54:04.12Z" }, - { url = "https://files.pythonhosted.org/packages/83/86/5d72e2c060aa1fbdc1f7362d938f6b237dff91f5b9fc5dd7cc297e112250/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4", size = 1379126, upload-time = "2025-11-01T11:54:05.777Z" }, - { url = "https://files.pythonhosted.org/packages/c9/bc/ef2cee3e4d8b3fc22705ff519f0d487eecc756abdc7c25d53686689d6cf2/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1", size = 3159304, upload-time = "2025-11-01T11:54:07.351Z" }, - { url = "https://files.pythonhosted.org/packages/a0/36/dc5f2f62bbc7bc90be1f75eeaf49ed9502094bb19290dfb4747317b17f12/rapidfuzz-3.14.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421", size = 1218207, upload-time = "2025-11-01T11:54:09.641Z" }, - { url = "https://files.pythonhosted.org/packages/df/7e/8f4be75c1bc62f47edf2bbbe2370ee482fae655ebcc4718ac3827ead3904/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b", size = 2401245, upload-time = "2025-11-01T11:54:11.543Z" }, - { url = "https://files.pythonhosted.org/packages/05/38/f7c92759e1bb188dd05b80d11c630ba59b8d7856657baf454ff56059c2ab/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c", size = 2518308, upload-time = "2025-11-01T11:54:13.134Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ac/85820f70fed5ecb5f1d9a55f1e1e2090ef62985ef41db289b5ac5ec56e28/rapidfuzz-3.14.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a", size = 4265011, upload-time = "2025-11-01T11:54:15.087Z" }, - { url = "https://files.pythonhosted.org/packages/46/a9/616930721ea9835c918af7cde22bff17f9db3639b0c1a7f96684be7f5630/rapidfuzz-3.14.3-cp314-cp314-win32.whl", hash = "sha256:adb44d996fc610c7da8c5048775b21db60dd63b1548f078e95858c05c86876a3", size = 1742245, upload-time = "2025-11-01T11:54:17.19Z" }, - { url = "https://files.pythonhosted.org/packages/06/8a/f2fa5e9635b1ccafda4accf0e38246003f69982d7c81f2faa150014525a4/rapidfuzz-3.14.3-cp314-cp314-win_amd64.whl", hash = "sha256:f3d15d8527e2b293e38ce6e437631af0708df29eafd7c9fc48210854c94472f9", size = 1584856, upload-time = "2025-11-01T11:54:18.764Z" }, - { url = "https://files.pythonhosted.org/packages/ef/97/09e20663917678a6d60d8e0e29796db175b1165e2079830430342d5298be/rapidfuzz-3.14.3-cp314-cp314-win_arm64.whl", hash = "sha256:576e4b9012a67e0bf54fccb69a7b6c94d4e86a9540a62f1a5144977359133583", size = 833490, upload-time = "2025-11-01T11:54:20.753Z" }, - { url = "https://files.pythonhosted.org/packages/03/1b/6b6084576ba87bf21877c77218a0c97ba98cb285b0c02eaaee3acd7c4513/rapidfuzz-3.14.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50", size = 1968658, upload-time = "2025-11-01T11:54:22.25Z" }, - { url = "https://files.pythonhosted.org/packages/38/c0/fb02a0db80d95704b0a6469cc394e8c38501abf7e1c0b2afe3261d1510c2/rapidfuzz-3.14.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296", size = 1410742, upload-time = "2025-11-01T11:54:23.863Z" }, - { url = "https://files.pythonhosted.org/packages/a4/72/3fbf12819fc6afc8ec75a45204013b40979d068971e535a7f3512b05e765/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655", size = 1382810, upload-time = "2025-11-01T11:54:25.571Z" }, - { url = "https://files.pythonhosted.org/packages/0f/18/0f1991d59bb7eee28922a00f79d83eafa8c7bfb4e8edebf4af2a160e7196/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1", size = 3166349, upload-time = "2025-11-01T11:54:27.195Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f0/baa958b1989c8f88c78bbb329e969440cf330b5a01a982669986495bb980/rapidfuzz-3.14.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7", size = 1214994, upload-time = "2025-11-01T11:54:28.821Z" }, - { url = "https://files.pythonhosted.org/packages/e4/a0/cd12ec71f9b2519a3954febc5740291cceabc64c87bc6433afcb36259f3b/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf", size = 2403919, upload-time = "2025-11-01T11:54:30.393Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ce/019bd2176c1644098eced4f0595cb4b3ef52e4941ac9a5854f209d0a6e16/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785", size = 2508346, upload-time = "2025-11-01T11:54:32.048Z" }, - { url = "https://files.pythonhosted.org/packages/23/f8/be16c68e2c9e6c4f23e8f4adbb7bccc9483200087ed28ff76c5312da9b14/rapidfuzz-3.14.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35", size = 4274105, upload-time = "2025-11-01T11:54:33.701Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d1/5ab148e03f7e6ec8cd220ccf7af74d3aaa4de26dd96df58936beb7cba820/rapidfuzz-3.14.3-cp314-cp314t-win32.whl", hash = "sha256:7ccbf68100c170e9a0581accbe9291850936711548c6688ce3bfb897b8c589ad", size = 1793465, upload-time = "2025-11-01T11:54:35.331Z" }, - { url = "https://files.pythonhosted.org/packages/cd/97/433b2d98e97abd9fff1c470a109b311669f44cdec8d0d5aa250aceaed1fb/rapidfuzz-3.14.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9ec02e62ae765a318d6de38df609c57fc6dacc65c0ed1fd489036834fd8a620c", size = 1623491, upload-time = "2025-11-01T11:54:38.085Z" }, - { url = "https://files.pythonhosted.org/packages/e2/f6/e2176eb94f94892441bce3ddc514c179facb65db245e7ce3356965595b19/rapidfuzz-3.14.3-cp314-cp314t-win_arm64.whl", hash = "sha256:e805e52322ae29aa945baf7168b6c898120fbc16d2b8f940b658a5e9e3999253", size = 851487, upload-time = "2025-11-01T11:54:40.176Z" }, -] - -[[package]] -name = "rapids-dask-dependency" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dask" }, - { name = "distributed" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/de/a5223c9bf0fcf29867d602e0a760b173aa9fc385597f5c65d3000a5eb311/rapids_dask_dependency-25.8.0-py3-none-any.whl", hash = "sha256:5b5ffc61feb1c6936d761a3c2fdb1ce1eb7ba19cd724913ae0172cd7dff8165c", size = 18114, upload-time = "2025-08-07T15:40:34.872Z" }, -] - -[[package]] -name = "rapids-logger" -version = "0.1.19" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/b9/5b4158deb206019427867e1ee1729fda85268bdecd9ec116cc611ee75345/rapids_logger-0.1.19-py3-none-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27be79b29d4545aef9b7f4608c258b5acfe984081a8bdf72381948c0dfccf14f", size = 255003, upload-time = "2025-10-13T15:08:52.64Z" }, - { url = "https://files.pythonhosted.org/packages/bf/0e/093fe9791b6b11f7d6d36b604d285b0018512cbdb6b1ce67a128795b7543/rapids_logger-0.1.19-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6797beb4a0d6874658944ddc38a1245059cd30ac6304f1e1f2b7d8c23db7dd18", size = 275528, upload-time = "2025-10-13T15:04:01.79Z" }, -] - [[package]] name = "redis" version = "5.2.1" @@ -5331,22 +3893,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/13/2f/b4530fbf948867702d0a3f27de4a6aab1d156f406d72852ab902c4d04de9/rich_rst-1.3.2-py3-none-any.whl", hash = "sha256:a99b4907cbe118cf9d18b0b44de272efa61f15117c61e39ebdc431baf5df722a", size = 12567, upload-time = "2025-10-14T16:49:42.953Z" }, ] -[[package]] -name = "rmm-cu12" -version = "25.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cuda-python" }, - { name = "librmm-cu12" }, - { name = "numpy" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/a9/899e08a15e56cfe89f9600a09153a2b051c34dcd8da07e82a3f2f8e18d56/rmm_cu12-25.8.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a414c37bf0cc6b69260521be80c8833bdf48a3b734bb2935428d6ad23b86fd81", size = 1124347, upload-time = "2025-08-07T11:17:39.407Z" }, - { url = "https://files.pythonhosted.org/packages/b1/98/e92ffca3cbfbd9fdce8b87fe9a1308152711a6dbf189c7fc6b27becca207/rmm_cu12-25.8.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb58cbced2b84dcaebdf042258b458fa4652ce995d153cf91c5df2f6528ae609", size = 1128995, upload-time = "2025-08-07T11:20:29.465Z" }, - { url = "https://files.pythonhosted.org/packages/c8/59/32c8d472df8820405f4989a609e41a33afedff8723946bbee89dff0a8a80/rmm_cu12-25.8.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fe7be6c55959a90dfb7009ff4ed8055023f970164247bb8ecd404ac2a980d5df", size = 1120505, upload-time = "2025-08-07T11:09:00.89Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ee/21a5d4746c8440c85f841bef4bfd2d6fd2117ed9f440a19b59b38c71169e/rmm_cu12-25.8.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ef2d154e905a1d480489c9100561bf03c2dde7e6ad0320ba18a90c5d6c84ae3", size = 1124169, upload-time = "2025-08-07T11:20:06.563Z" }, -] - [[package]] name = "roman-numerals" version = "4.0.0" @@ -5449,46 +3995,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, ] -[[package]] -name = "rsa" -version = "4.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyasn1" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, -] - [[package]] name = "safetensors" -version = "0.4.4" +version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/5b/0e63bf736e171463481c5ea3406650dc25aa044083062d321820e7a1ef9f/safetensors-0.4.4.tar.gz", hash = "sha256:5fe3e9b705250d0172ed4e100a811543108653fb2b66b9e702a088ad03772a07", size = 69522, upload-time = "2024-08-05T12:34:11.951Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/41/a491dbe3fc1c195ce648939a87d3b4b3800eaade2f05278a6dc02b575c51/safetensors-0.4.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:baec5675944b4a47749c93c01c73d826ef7d42d36ba8d0dba36336fa80c76426", size = 391372, upload-time = "2024-08-05T12:31:35.353Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a1/d99aa8d10fa8d82276ee2aaa87afd0a6b96e69c128eaa9f93524b52c5276/safetensors-0.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f15117b96866401825f3e94543145028a2947d19974429246ce59403f49e77c6", size = 381800, upload-time = "2024-08-05T12:31:37.724Z" }, - { url = "https://files.pythonhosted.org/packages/c8/1c/4fa05b79afdd4688a357a42433565b5b09137af6b4f6cd0c9e371466e2f1/safetensors-0.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a13a9caea485df164c51be4eb0c87f97f790b7c3213d635eba2314d959fe929", size = 440817, upload-time = "2024-08-05T12:31:39.519Z" }, - { url = "https://files.pythonhosted.org/packages/65/c0/152b059debd3cee4f44b7df972e915a38f776379ea99ce4a3cbea3f78dbd/safetensors-0.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b54bc4ca5f9b9bba8cd4fb91c24b2446a86b5ae7f8975cf3b7a277353c3127c", size = 439483, upload-time = "2024-08-05T12:31:41.659Z" }, - { url = "https://files.pythonhosted.org/packages/9c/93/20c05daeecf6fa93b9403c3660df1d983d7ddd5cdb3e3710ff41b72754dd/safetensors-0.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08332c22e03b651c8eb7bf5fc2de90044f3672f43403b3d9ac7e7e0f4f76495e", size = 476631, upload-time = "2024-08-05T12:31:43.328Z" }, - { url = "https://files.pythonhosted.org/packages/84/2f/bfe3e54b7dbcaef3f10b8f3c71146790ab18b0bd79ad9ca2bc2c950b68df/safetensors-0.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb62841e839ee992c37bb75e75891c7f4904e772db3691c59daaca5b4ab960e1", size = 493575, upload-time = "2024-08-05T12:31:45.153Z" }, - { url = "https://files.pythonhosted.org/packages/1b/0b/2a1b405131f26b95acdb3ed6c8e3a8c84de72d364fd26202d43e68ec4bad/safetensors-0.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5b927acc5f2f59547270b0309a46d983edc44be64e1ca27a7fcb0474d6cd67", size = 434891, upload-time = "2024-08-05T12:31:47.064Z" }, - { url = "https://files.pythonhosted.org/packages/31/ce/cad390a08128ebcb74be79a1e03c496a4773059b2541c6a97a52fd1705fb/safetensors-0.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a69c71b1ae98a8021a09a0b43363b0143b0ce74e7c0e83cacba691b62655fb8", size = 457631, upload-time = "2024-08-05T12:31:48.688Z" }, - { url = "https://files.pythonhosted.org/packages/9f/83/d9d6e6a45d624c27155f4336af8e7b2bcde346137f6460dcd5e1bcdc2e3f/safetensors-0.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23654ad162c02a5636f0cd520a0310902c4421aab1d91a0b667722a4937cc445", size = 619367, upload-time = "2024-08-05T12:31:50.348Z" }, - { url = "https://files.pythonhosted.org/packages/9f/20/b37e1ae87cb83a1c2fe5cf0710bab12d6f186474cbbdda4fda2d7d57d225/safetensors-0.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0677c109d949cf53756859160b955b2e75b0eefe952189c184d7be30ecf7e858", size = 605302, upload-time = "2024-08-05T12:31:53.157Z" }, - { url = "https://files.pythonhosted.org/packages/99/5a/9237f1d0adba5eec3711d7c1911b3111631a86779d692fe8ad2cd709d6a4/safetensors-0.4.4-cp312-none-win32.whl", hash = "sha256:a51d0ddd4deb8871c6de15a772ef40b3dbd26a3c0451bb9e66bc76fc5a784e5b", size = 273434, upload-time = "2024-08-05T12:31:55.022Z" }, - { url = "https://files.pythonhosted.org/packages/b9/dd/b11f3a33fe7b6c94fde08b3de094b93d3438d67922ef90bcb5002e306e0b/safetensors-0.4.4-cp312-none-win_amd64.whl", hash = "sha256:2d065059e75a798bc1933c293b68d04d79b586bb7f8c921e0ca1e82759d0dbb1", size = 286347, upload-time = "2024-08-05T12:31:56.398Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d6/7a4db869a295b57066e1399eb467c38df86439d3766c850ca8eb75b5e3a3/safetensors-0.4.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9d625692578dd40a112df30c02a1adf068027566abd8e6a74893bb13d441c150", size = 391373, upload-time = "2024-08-05T12:31:57.814Z" }, - { url = "https://files.pythonhosted.org/packages/1e/97/de856ad42ef65822ff982e7af7fc889cd717240672b45c647af7ea05c631/safetensors-0.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7cabcf39c81e5b988d0adefdaea2eb9b4fd9bd62d5ed6559988c62f36bfa9a89", size = 382523, upload-time = "2024-08-05T12:31:59.529Z" }, - { url = "https://files.pythonhosted.org/packages/07/d2/d9316af4c15b4ca0362cb4498abe47be6e04f7119f3ccf697e38ee04d33b/safetensors-0.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8359bef65f49d51476e9811d59c015f0ddae618ee0e44144f5595278c9f8268c", size = 441039, upload-time = "2024-08-05T12:32:01.109Z" }, - { url = "https://files.pythonhosted.org/packages/e8/ac/478e910c891feadb693316b31447f14929b7047a612df9b628589b89be3c/safetensors-0.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1a32c662e7df9226fd850f054a3ead0e4213a96a70b5ce37b2d26ba27004e013", size = 439516, upload-time = "2024-08-05T12:32:02.63Z" }, - { url = "https://files.pythonhosted.org/packages/81/43/f9929e854c4fcca98459f03de003d9619dd5f7d10d74e03df7af9907b119/safetensors-0.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c329a4dcc395364a1c0d2d1574d725fe81a840783dda64c31c5a60fc7d41472c", size = 477242, upload-time = "2024-08-05T12:32:04.259Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/b754f59fe395ea5bd8531c090c557e161fffed1753eeb3d87c0f8eaa62c4/safetensors-0.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:239ee093b1db877c9f8fe2d71331a97f3b9c7c0d3ab9f09c4851004a11f44b65", size = 494615, upload-time = "2024-08-05T12:32:06.249Z" }, - { url = "https://files.pythonhosted.org/packages/54/7d/b26801dab2ecb499eb1ebdb46be65600b49bb062fe12b298150695a6e23c/safetensors-0.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd574145d930cf9405a64f9923600879a5ce51d9f315443a5f706374841327b6", size = 434933, upload-time = "2024-08-05T12:32:07.672Z" }, - { url = "https://files.pythonhosted.org/packages/e2/40/0f6627ad98e21e620a6835f02729f6b701804d3c452f8773648cbd0b9c2c/safetensors-0.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f6784eed29f9e036acb0b7769d9e78a0dc2c72c2d8ba7903005350d817e287a4", size = 457646, upload-time = "2024-08-05T12:32:09.354Z" }, - { url = "https://files.pythonhosted.org/packages/30/1e/7f7819d1be7c36fbedcb7099a461b79e0ed19631b3ca5595e0f81501bb2c/safetensors-0.4.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:65a4a6072436bf0a4825b1c295d248cc17e5f4651e60ee62427a5bcaa8622a7a", size = 619204, upload-time = "2024-08-05T12:32:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/b1/58/e91e8c9888303919ce56f038fcad4147431fd95630890799bf8c928d1d34/safetensors-0.4.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:df81e3407630de060ae8313da49509c3caa33b1a9415562284eaf3d0c7705f9f", size = 605400, upload-time = "2024-08-05T12:32:12.618Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, ] [[package]] @@ -5630,6 +4156,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3d/ea/ac2bf868899d0d2e82ef72d350d97a846110c709bacf2d968431576ca915/setuptools_scm-9.2.2-py3-none-any.whl", hash = "sha256:30e8f84d2ab1ba7cb0e653429b179395d0c33775d54807fc5f1dd6671801aef7", size = 62975, upload-time = "2025-10-19T22:08:04.007Z" }, ] +[[package]] +name = "shellingham" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, +] + [[package]] name = "simsimd" version = "6.5.3" @@ -5707,15 +4242,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] -[[package]] -name = "sortedcontainers" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, -] - [[package]] name = "soupsieve" version = "2.8" @@ -5910,14 +4436,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.41.3" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/4c/9b5764bd22eec91c4039ef4c55334e9187085da2d8a2df7bd570869aae18/starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835", size = 2574159, upload-time = "2024-11-18T19:45:04.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/69/17425771797c36cded50b7fe44e850315d039f28b15901ab44839e70b593/starlette-1.0.0.tar.gz", hash = "sha256:6a4beaf1f81bb472fd19ea9b918b50dc3a77a6f2e190a12954b25e6ed5eea149", size = 2655289, upload-time = "2026-03-22T18:29:46.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/96/00/2b325970b3060c7cecebab6d295afe763365822b1306a12eeab198f74323/starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7", size = 73225, upload-time = "2024-11-18T19:45:02.027Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, ] [[package]] @@ -5932,15 +4459,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] -[[package]] -name = "tblib" -version = "3.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f4/8a/14c15ae154895cc131174f858c707790d416c444fc69f93918adfd8c4c0b/tblib-3.2.2.tar.gz", hash = "sha256:e9a652692d91bf4f743d4a15bc174c0b76afc750fe8c7b6d195cc1c1d6d2ccec", size = 35046, upload-time = "2025-11-12T12:21:16.572Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/be/5d2d47b1fb58943194fb59dcf222f7c4e35122ec0ffe8c36e18b5d728f0b/tblib-3.2.2-py3-none-any.whl", hash = "sha256:26bdccf339bcce6a88b2b5432c988b266ebbe63a4e593f6b578b1d2e723d2b76", size = 12893, upload-time = "2025-11-12T12:21:14.407Z" }, -] - [[package]] name = "tenacity" version = "9.1.2" @@ -6006,32 +4524,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" }, ] -[[package]] -name = "timm" -version = "1.0.22" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "huggingface-hub" }, - { name = "pyyaml" }, - { name = "safetensors" }, - { name = "torch" }, - { name = "torchvision" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c5/9d/e4670765d1c033f97096c760b3b907eeb659cf80f3678640e5f060b04c6c/timm-1.0.22.tar.gz", hash = "sha256:14fd74bcc17db3856b1a47d26fb305576c98579ab9d02b36714a5e6b25cde422", size = 2382998, upload-time = "2025-11-05T04:06:09.377Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/14/fc04d491527b774ec7479897f5861959209de1480e4c4cd32ed098ff8bea/timm-1.0.22-py3-none-any.whl", hash = "sha256:888981753e65cbaacfc07494370138b1700a27b1f0af587f4f9b47bc024161d0", size = 2530238, upload-time = "2025-11-05T04:06:06.823Z" }, -] - [[package]] name = "tinycss2" -version = "1.4.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "webencodings" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, + { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, ] [[package]] @@ -6059,99 +4561,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/46/e33a8c93907b631a99377ef4c5f817ab453d0b34f93529421f42ff559671/tokenizers-0.22.1-cp39-abi3-win_amd64.whl", hash = "sha256:65fd6e3fb11ca1e78a6a93602490f134d1fdeb13bcef99389d5102ea318ed138", size = 2674684, upload-time = "2025-09-19T09:49:24.953Z" }, ] -[[package]] -name = "toolz" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, -] - -[[package]] -name = "torch" -version = "2.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "fsspec" }, - { name = "jinja2" }, - { name = "networkx" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cufile-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvshmem-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "setuptools" }, - { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, - { name = "typing-extensions" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/27/07c645c7673e73e53ded71705045d6cb5bae94c4b021b03aa8d03eee90ab/torch-2.9.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:da5f6f4d7f4940a173e5572791af238cb0b9e21b1aab592bd8b26da4c99f1cd6", size = 104126592, upload-time = "2025-11-12T15:20:41.62Z" }, - { url = "https://files.pythonhosted.org/packages/19/17/e377a460603132b00760511299fceba4102bd95db1a0ee788da21298ccff/torch-2.9.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:27331cd902fb4322252657f3902adf1c4f6acad9dcad81d8df3ae14c7c4f07c4", size = 899742281, upload-time = "2025-11-12T15:22:17.602Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1a/64f5769025db846a82567fa5b7d21dba4558a7234ee631712ee4771c436c/torch-2.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:81a285002d7b8cfd3fdf1b98aa8df138d41f1a8334fd9ea37511517cedf43083", size = 110940568, upload-time = "2025-11-12T15:21:18.689Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ab/07739fd776618e5882661d04c43f5b5586323e2f6a2d7d84aac20d8f20bd/torch-2.9.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:c0d25d1d8e531b8343bea0ed811d5d528958f1dcbd37e7245bc686273177ad7e", size = 74479191, upload-time = "2025-11-12T15:21:25.816Z" }, - { url = "https://files.pythonhosted.org/packages/20/60/8fc5e828d050bddfab469b3fe78e5ab9a7e53dda9c3bdc6a43d17ce99e63/torch-2.9.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c29455d2b910b98738131990394da3e50eea8291dfeb4b12de71ecf1fdeb21cb", size = 104135743, upload-time = "2025-11-12T15:21:34.936Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b7/6d3f80e6918213babddb2a37b46dbb14c15b14c5f473e347869a51f40e1f/torch-2.9.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:524de44cd13931208ba2c4bde9ec7741fd4ae6bfd06409a604fc32f6520c2bc9", size = 899749493, upload-time = "2025-11-12T15:24:36.356Z" }, - { url = "https://files.pythonhosted.org/packages/a6/47/c7843d69d6de8938c1cbb1eba426b1d48ddf375f101473d3e31a5fc52b74/torch-2.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:545844cc16b3f91e08ce3b40e9c2d77012dd33a48d505aed34b7740ed627a1b2", size = 110944162, upload-time = "2025-11-12T15:21:53.151Z" }, - { url = "https://files.pythonhosted.org/packages/28/0e/2a37247957e72c12151b33a01e4df651d9d155dd74d8cfcbfad15a79b44a/torch-2.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5be4bf7496f1e3ffb1dd44b672adb1ac3f081f204c5ca81eba6442f5f634df8e", size = 74830751, upload-time = "2025-11-12T15:21:43.792Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/7a18745edcd7b9ca2381aa03353647bca8aace91683c4975f19ac233809d/torch-2.9.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:30a3e170a84894f3652434b56d59a64a2c11366b0ed5776fab33c2439396bf9a", size = 104142929, upload-time = "2025-11-12T15:21:48.319Z" }, - { url = "https://files.pythonhosted.org/packages/f4/dd/f1c0d879f2863ef209e18823a988dc7a1bf40470750e3ebe927efdb9407f/torch-2.9.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:8301a7b431e51764629208d0edaa4f9e4c33e6df0f2f90b90e261d623df6a4e2", size = 899748978, upload-time = "2025-11-12T15:23:04.568Z" }, - { url = "https://files.pythonhosted.org/packages/1f/9f/6986b83a53b4d043e36f3f898b798ab51f7f20fdf1a9b01a2720f445043d/torch-2.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:2e1c42c0ae92bf803a4b2409fdfed85e30f9027a66887f5e7dcdbc014c7531db", size = 111176995, upload-time = "2025-11-12T15:22:01.618Z" }, - { url = "https://files.pythonhosted.org/packages/40/60/71c698b466dd01e65d0e9514b5405faae200c52a76901baf6906856f17e4/torch-2.9.1-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:2c14b3da5df416cf9cb5efab83aa3056f5b8cd8620b8fde81b4987ecab730587", size = 74480347, upload-time = "2025-11-12T15:21:57.648Z" }, - { url = "https://files.pythonhosted.org/packages/48/50/c4b5112546d0d13cc9eaa1c732b823d676a9f49ae8b6f97772f795874a03/torch-2.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1edee27a7c9897f4e0b7c14cfc2f3008c571921134522d5b9b5ec4ebbc69041a", size = 74433245, upload-time = "2025-11-12T15:22:39.027Z" }, - { url = "https://files.pythonhosted.org/packages/81/c9/2628f408f0518b3bae49c95f5af3728b6ab498c8624ab1e03a43dd53d650/torch-2.9.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:19d144d6b3e29921f1fc70503e9f2fc572cde6a5115c0c0de2f7ca8b1483e8b6", size = 104134804, upload-time = "2025-11-12T15:22:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/28/fc/5bc91d6d831ae41bf6e9e6da6468f25330522e92347c9156eb3f1cb95956/torch-2.9.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:c432d04376f6d9767a9852ea0def7b47a7bbc8e7af3b16ac9cf9ce02b12851c9", size = 899747132, upload-time = "2025-11-12T15:23:36.068Z" }, - { url = "https://files.pythonhosted.org/packages/63/5d/e8d4e009e52b6b2cf1684bde2a6be157b96fb873732542fb2a9a99e85a83/torch-2.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:d187566a2cdc726fc80138c3cdb260970fab1c27e99f85452721f7759bbd554d", size = 110934845, upload-time = "2025-11-12T15:22:48.367Z" }, - { url = "https://files.pythonhosted.org/packages/bd/b2/2d15a52516b2ea3f414643b8de68fa4cb220d3877ac8b1028c83dc8ca1c4/torch-2.9.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cb10896a1f7fedaddbccc2017ce6ca9ecaaf990f0973bdfcf405439750118d2c", size = 74823558, upload-time = "2025-11-12T15:22:43.392Z" }, - { url = "https://files.pythonhosted.org/packages/86/5c/5b2e5d84f5b9850cd1e71af07524d8cbb74cba19379800f1f9f7c997fc70/torch-2.9.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0a2bd769944991c74acf0c4ef23603b9c777fdf7637f115605a4b2d8023110c7", size = 104145788, upload-time = "2025-11-12T15:23:52.109Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8c/3da60787bcf70add986c4ad485993026ac0ca74f2fc21410bc4eb1bb7695/torch-2.9.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:07c8a9660bc9414c39cac530ac83b1fb1b679d7155824144a40a54f4a47bfa73", size = 899735500, upload-time = "2025-11-12T15:24:08.788Z" }, - { url = "https://files.pythonhosted.org/packages/db/2b/f7818f6ec88758dfd21da46b6cd46af9d1b3433e53ddbb19ad1e0da17f9b/torch-2.9.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c88d3299ddeb2b35dcc31753305612db485ab6f1823e37fb29451c8b2732b87e", size = 111163659, upload-time = "2025-11-12T15:23:20.009Z" }, -] - -[[package]] -name = "torchvision" -version = "0.24.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pillow" }, - { name = "torch" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/af/18e2c6b9538a045f60718a0c5a058908ccb24f88fde8e6f0fc12d5ff7bd3/torchvision-0.24.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e48bf6a8ec95872eb45763f06499f87bd2fb246b9b96cb00aae260fda2f96193", size = 1891433, upload-time = "2025-11-12T15:25:03.232Z" }, - { url = "https://files.pythonhosted.org/packages/9d/43/600e5cfb0643d10d633124f5982d7abc2170dfd7ce985584ff16edab3e76/torchvision-0.24.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:7fb7590c737ebe3e1c077ad60c0e5e2e56bb26e7bccc3b9d04dbfc34fd09f050", size = 2386737, upload-time = "2025-11-12T15:25:08.288Z" }, - { url = "https://files.pythonhosted.org/packages/93/b1/db2941526ecddd84884132e2742a55c9311296a6a38627f9e2627f5ac889/torchvision-0.24.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:66a98471fc18cad9064123106d810a75f57f0838eee20edc56233fd8484b0cc7", size = 8049868, upload-time = "2025-11-12T15:25:13.058Z" }, - { url = "https://files.pythonhosted.org/packages/69/98/16e583f59f86cd59949f59d52bfa8fc286f86341a229a9d15cbe7a694f0c/torchvision-0.24.1-cp312-cp312-win_amd64.whl", hash = "sha256:4aa6cb806eb8541e92c9b313e96192c6b826e9eb0042720e2fa250d021079952", size = 4302006, upload-time = "2025-11-12T15:25:16.184Z" }, - { url = "https://files.pythonhosted.org/packages/e4/97/ab40550f482577f2788304c27220e8ba02c63313bd74cf2f8920526aac20/torchvision-0.24.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:8a6696db7fb71eadb2c6a48602106e136c785642e598eb1533e0b27744f2cce6", size = 1891435, upload-time = "2025-11-12T15:25:28.642Z" }, - { url = "https://files.pythonhosted.org/packages/30/65/ac0a3f9be6abdbe4e1d82c915d7e20de97e7fd0e9a277970508b015309f3/torchvision-0.24.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:db2125c46f9cb25dc740be831ce3ce99303cfe60439249a41b04fd9f373be671", size = 2338718, upload-time = "2025-11-12T15:25:26.19Z" }, - { url = "https://files.pythonhosted.org/packages/10/b5/5bba24ff9d325181508501ed7f0c3de8ed3dd2edca0784d48b144b6c5252/torchvision-0.24.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f035f0cacd1f44a8ff6cb7ca3627d84c54d685055961d73a1a9fb9827a5414c8", size = 8049661, upload-time = "2025-11-12T15:25:22.558Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ec/54a96ae9ab6a0dd66d4bba27771f892e36478a9c3489fa56e51c70abcc4d/torchvision-0.24.1-cp313-cp313-win_amd64.whl", hash = "sha256:16274823b93048e0a29d83415166a2e9e0bf4e1b432668357b657612a4802864", size = 4319808, upload-time = "2025-11-12T15:25:17.318Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f3/a90a389a7e547f3eb8821b13f96ea7c0563cdefbbbb60a10e08dda9720ff/torchvision-0.24.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e3f96208b4bef54cd60e415545f5200346a65024e04f29a26cd0006dbf9e8e66", size = 2005342, upload-time = "2025-11-12T15:25:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/a9/fe/ff27d2ed1b524078164bea1062f23d2618a5fc3208e247d6153c18c91a76/torchvision-0.24.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:f231f6a4f2aa6522713326d0d2563538fa72d613741ae364f9913027fa52ea35", size = 2341708, upload-time = "2025-11-12T15:25:25.08Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b9/d6c903495cbdfd2533b3ef6f7b5643ff589ea062f8feb5c206ee79b9d9e5/torchvision-0.24.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1540a9e7f8cf55fe17554482f5a125a7e426347b71de07327d5de6bfd8d17caa", size = 8177239, upload-time = "2025-11-12T15:25:18.554Z" }, - { url = "https://files.pythonhosted.org/packages/4f/2b/ba02e4261369c3798310483028495cf507e6cb3f394f42e4796981ecf3a7/torchvision-0.24.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d83e16d70ea85d2f196d678bfb702c36be7a655b003abed84e465988b6128938", size = 4251604, upload-time = "2025-11-12T15:25:34.069Z" }, - { url = "https://files.pythonhosted.org/packages/42/84/577b2cef8f32094add5f52887867da4c2a3e6b4261538447e9b48eb25812/torchvision-0.24.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cccf4b4fec7fdfcd3431b9ea75d1588c0a8596d0333245dafebee0462abe3388", size = 2005319, upload-time = "2025-11-12T15:25:23.827Z" }, - { url = "https://files.pythonhosted.org/packages/5f/34/ecb786bffe0159a3b49941a61caaae089853132f3cd1e8f555e3621f7e6f/torchvision-0.24.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:1b495edd3a8f9911292424117544f0b4ab780452e998649425d1f4b2bed6695f", size = 2338844, upload-time = "2025-11-12T15:25:32.625Z" }, - { url = "https://files.pythonhosted.org/packages/51/99/a84623786a6969504c87f2dc3892200f586ee13503f519d282faab0bb4f0/torchvision-0.24.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:ab211e1807dc3e53acf8f6638df9a7444c80c0ad050466e8d652b3e83776987b", size = 8175144, upload-time = "2025-11-12T15:25:31.355Z" }, - { url = "https://files.pythonhosted.org/packages/6d/ba/8fae3525b233e109317ce6a9c1de922ab2881737b029a7e88021f81e068f/torchvision-0.24.1-cp314-cp314-win_amd64.whl", hash = "sha256:18f9cb60e64b37b551cd605a3d62c15730c086362b40682d23e24b616a697d41", size = 4234459, upload-time = "2025-11-12T15:25:19.859Z" }, - { url = "https://files.pythonhosted.org/packages/50/33/481602c1c72d0485d4b3a6b48c9534b71c2957c9d83bf860eb837bf5a620/torchvision-0.24.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec9d7379c519428395e4ffda4dbb99ec56be64b0a75b95989e00f9ec7ae0b2d7", size = 2005336, upload-time = "2025-11-12T15:25:27.225Z" }, - { url = "https://files.pythonhosted.org/packages/d0/7f/372de60bf3dd8f5593bd0d03f4aecf0d1fd58f5bc6943618d9d913f5e6d5/torchvision-0.24.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:af9201184c2712d808bd4eb656899011afdfce1e83721c7cb08000034df353fe", size = 2341704, upload-time = "2025-11-12T15:25:29.857Z" }, - { url = "https://files.pythonhosted.org/packages/36/9b/0f3b9ff3d0225ee2324ec663de0e7fb3eb855615ca958ac1875f22f1f8e5/torchvision-0.24.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:9ef95d819fd6df81bc7cc97b8f21a15d2c0d3ac5dbfaab5cbc2d2ce57114b19e", size = 8177422, upload-time = "2025-11-12T15:25:37.357Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ab/e2bcc7c2f13d882a58f8b30ff86f794210b075736587ea50f8c545834f8a/torchvision-0.24.1-cp314-cp314t-win_amd64.whl", hash = "sha256:480b271d6edff83ac2e8d69bbb4cf2073f93366516a50d48f140ccfceedb002e", size = 4335190, upload-time = "2025-11-12T15:25:35.745Z" }, -] - [[package]] name = "tornado" version = "6.5.4" @@ -6194,53 +4603,37 @@ wheels = [ [[package]] name = "transformers" -version = "4.57.3" +version = "5.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, { name = "huggingface-hub" }, { name = "numpy" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, - { name = "requests" }, { name = "safetensors" }, { name = "tokenizers" }, { name = "tqdm" }, + { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/70/d42a739e8dfde3d92bb2fff5819cbf331fe9657323221e79415cd5eb65ee/transformers-4.57.3.tar.gz", hash = "sha256:df4945029aaddd7c09eec5cad851f30662f8bd1746721b34cc031d70c65afebc", size = 10139680, upload-time = "2025-11-25T15:51:30.139Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/4c/42a8e1c7bbe668d8e073941ec3205263afb1cd02683fa5a8a75e615fdfbe/transformers-5.4.0.tar.gz", hash = "sha256:cb34ca89dce345ae3224b290346b9c0fa9694b951d54f3ed16334a4b1bfe3d04", size = 8152836, upload-time = "2026-03-27T00:24:24.692Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/6b/2f416568b3c4c91c96e5a365d164f8a4a4a88030aa8ab4644181fdadce97/transformers-4.57.3-py3-none-any.whl", hash = "sha256:c77d353a4851b1880191603d36acb313411d3577f6e2897814f333841f7003f4", size = 11993463, upload-time = "2025-11-25T15:51:26.493Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a0/0a87883e564e364baab32adcacb4bec2e200b28a568423c8cf7fde316461/transformers-5.4.0-py3-none-any.whl", hash = "sha256:9fbe50602d2a4e6d0aa8a35a605433dfac72d595ee2192eae192590a6cc2df86", size = 10105556, upload-time = "2026-03-27T00:24:21.735Z" }, ] [[package]] -name = "treelite" -version = "4.4.1" +name = "typer" +version = "0.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, - { name = "packaging" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/46/9e4ff3f11f04d31eb8b9bef1eb3b140d7ce272bbeb6ea1804c5ea7ea3299/treelite-4.4.1.tar.gz", hash = "sha256:de9c28ff481317d9f4286ea781ba404e2506caa6995cdcb1867a7036124263de", size = 109293, upload-time = "2024-11-22T19:14:33.43Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/66/64850a5ec924a14e9517daaa21eb081a5883bb01ef16ffe3e08fda24d43f/treelite-4.4.1-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:876ecdbb20783c2f7cfa483996bcc450db6b931184cc1bf22bad28d7f069bfe7", size = 733602, upload-time = "2024-11-22T19:14:17.291Z" }, - { url = "https://files.pythonhosted.org/packages/19/e2/1d7ae9bd1eabe68e237ebd394ef673b9f39172f352a1b9bb3befeddeee59/treelite-4.4.1-py3-none-macosx_12_0_arm64.whl", hash = "sha256:1473d7bb3e1e0eb525265a38cacb3f01e4c2136a1c85f40b512316b5776eb97f", size = 631437, upload-time = "2024-11-22T19:14:19.75Z" }, - { url = "https://files.pythonhosted.org/packages/aa/6d/0def3f702f0d3a10f4ba9b161bed68551094fc6dda0a89e61a40ea2425c5/treelite-4.4.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:ffc80da72201399ebe48944d231083cf190918297c37fd43814bb9635890cebc", size = 904552, upload-time = "2024-11-22T19:14:24.258Z" }, - { url = "https://files.pythonhosted.org/packages/16/4c/9cfa4cfac89944066bcc042546782235544f5427a257c1f5bfd1700b0838/treelite-4.4.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b3299e6c3bc3afa51641b651d8c3b2084ceec44d1913de89bfa7e98d4caf7607", size = 922796, upload-time = "2024-11-22T19:14:28.559Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d2/9b7467b797493b06cc66b44a37053894b94af6ad2fbad1f6f4879b14213f/treelite-4.4.1-py3-none-win_amd64.whl", hash = "sha256:77b5c9b7f80fdab2efa43b4ace2fb76d61d584f7af7373c406dea95c230464f9", size = 502713, upload-time = "2024-11-22T19:14:31.415Z" }, + { name = "annotated-doc" }, + { name = "click" }, + { name = "rich" }, + { name = "shellingham" }, ] - -[[package]] -name = "triton" -version = "3.5.1" -source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b6/3e681d3b6bb22647509bdbfdd18055d5adc0dce5c5585359fa46ff805fdc/typer-0.24.0.tar.gz", hash = "sha256:f9373dc4eff901350694f519f783c29b6d7a110fc0dcc11b1d7e353b85ca6504", size = 118380, upload-time = "2026-02-16T22:08:48.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/50/9a8358d3ef58162c0a415d173cfb45b67de60176e1024f71fbc4d24c0b6d/triton-3.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d2c6b915a03888ab931a9fd3e55ba36785e1fe70cbea0b40c6ef93b20fc85232", size = 170470207, upload-time = "2025-11-11T17:41:00.253Z" }, - { url = "https://files.pythonhosted.org/packages/27/46/8c3bbb5b0a19313f50edcaa363b599e5a1a5ac9683ead82b9b80fe497c8d/triton-3.5.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3f4346b6ebbd4fad18773f5ba839114f4826037c9f2f34e0148894cd5dd3dba", size = 170470410, upload-time = "2025-11-11T17:41:06.319Z" }, - { url = "https://files.pythonhosted.org/packages/37/92/e97fcc6b2c27cdb87ce5ee063d77f8f26f19f06916aa680464c8104ef0f6/triton-3.5.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0b4d2c70127fca6a23e247f9348b8adde979d2e7a20391bfbabaac6aebc7e6a8", size = 170579924, upload-time = "2025-11-11T17:41:12.455Z" }, - { url = "https://files.pythonhosted.org/packages/a4/e6/c595c35e5c50c4bc56a7bac96493dad321e9e29b953b526bbbe20f9911d0/triton-3.5.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0637b1efb1db599a8e9dc960d53ab6e4637db7d4ab6630a0974705d77b14b60", size = 170480488, upload-time = "2025-11-11T17:41:18.222Z" }, - { url = "https://files.pythonhosted.org/packages/16/b5/b0d3d8b901b6a04ca38df5e24c27e53afb15b93624d7fd7d658c7cd9352a/triton-3.5.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bac7f7d959ad0f48c0e97d6643a1cc0fd5786fe61cb1f83b537c6b2d54776478", size = 170582192, upload-time = "2025-11-11T17:41:23.963Z" }, + { url = "https://files.pythonhosted.org/packages/85/d0/4da85c2a45054bb661993c93524138ace4956cb075a7ae0c9d1deadc331b/typer-0.24.0-py3-none-any.whl", hash = "sha256:5fc435a9c8356f6160ed6e85a6301fdd6e3d8b2851da502050d1f92c5e9eddc8", size = 56441, upload-time = "2026-02-16T22:08:47.535Z" }, ] [[package]] @@ -6287,207 +4680,21 @@ wheels = [ ] [[package]] -name = "ucx-py-cu12" -version = "0.45.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libucx-cu12" }, - { name = "numpy" }, - { name = "pynvml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/de/c6/6646c3acdef21fea5a38e7f1adc3befa8cf59e796f31c44fda9eece534ce/ucx_py_cu12-0.45.0.tar.gz", hash = "sha256:96ec34d86c54a6f4b7bdc8e8010db2b2c7681e682c59498f680777cb3aba6fa9", size = 1512, upload-time = "2025-08-07T12:46:57.092Z" } - -[[package]] -name = "ucxx-cu12" -version = "0.45.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "libucxx-cu12" }, - { name = "numpy" }, - { name = "pynvml" }, - { name = "rmm-cu12" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/fe/4af356bc85e523ff3247dee83d3f5a71d0d322425987040f94c0301e337f/ucxx_cu12-0.45.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5489fad6de6b80ce972ac7ff6c94471d1d92705711acfca1c7e8e1c42e498d68", size = 669505, upload-time = "2025-08-07T15:02:27.853Z" }, - { url = "https://files.pythonhosted.org/packages/31/aa/b977a999dcff564f39cff5c0e3cdef032f7278771137ed761425a1e18640/ucxx_cu12-0.45.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a296efcccb194fb01a058e034c72ffa42bbbdc2d9f4796611ffc807e4e1c2ccb", size = 689855, upload-time = "2025-08-07T15:06:04.653Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c1/47395fa21382f6b77344206805e787c981d03a04825a5de199437ddf8ad0/ucxx_cu12-0.45.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a13dd0d2732c1dee2dd9eefa669d63ae636ef59b6b834548160ee8994db1da", size = 671894, upload-time = "2025-08-07T15:01:38.948Z" }, - { url = "https://files.pythonhosted.org/packages/7e/fc/b07383eb85b50f5e29057a5473ccfc47b44bc3d39194a0feae1eba654bef/ucxx_cu12-0.45.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:79807a553d5ef2502d7bd4705b5eed15f5911c1e13aaec4a065c305094b9f7be", size = 689713, upload-time = "2025-08-07T15:05:41.679Z" }, -] - -[[package]] -name = "ujson" -version = "5.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/d9/3f17e3c5773fb4941c68d9a37a47b1a79c9649d6c56aefbed87cc409d18a/ujson-5.11.0.tar.gz", hash = "sha256:e204ae6f909f099ba6b6b942131cee359ddda2b6e4ea39c12eb8b991fe2010e0", size = 7156583, upload-time = "2025-08-20T11:57:02.452Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/ef/a9cb1fce38f699123ff012161599fb9f2ff3f8d482b4b18c43a2dc35073f/ujson-5.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7895f0d2d53bd6aea11743bd56e3cb82d729980636cd0ed9b89418bf66591702", size = 55434, upload-time = "2025-08-20T11:55:34.987Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/dba51a00eb30bd947791b173766cbed3492269c150a7771d2750000c965f/ujson-5.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12b5e7e22a1fe01058000d1b317d3b65cc3daf61bd2ea7a2b76721fe160fa74d", size = 53190, upload-time = "2025-08-20T11:55:36.384Z" }, - { url = "https://files.pythonhosted.org/packages/03/3c/fd11a224f73fbffa299fb9644e425f38b38b30231f7923a088dd513aabb4/ujson-5.11.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80", size = 57600, upload-time = "2025-08-20T11:55:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/55/b9/405103cae24899df688a3431c776e00528bd4799e7d68820e7ebcf824f92/ujson-5.11.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc", size = 59791, upload-time = "2025-08-20T11:55:38.877Z" }, - { url = "https://files.pythonhosted.org/packages/17/7b/2dcbc2bbfdbf68f2368fb21ab0f6735e872290bb604c75f6e06b81edcb3f/ujson-5.11.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8254e858437c00f17cb72e7a644fc42dad0ebb21ea981b71df6e84b1072aaa7c", size = 57356, upload-time = "2025-08-20T11:55:40.036Z" }, - { url = "https://files.pythonhosted.org/packages/d1/71/fea2ca18986a366c750767b694430d5ded6b20b6985fddca72f74af38a4c/ujson-5.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1aa8a2ab482f09f6c10fba37112af5f957689a79ea598399c85009f2f29898b5", size = 1036313, upload-time = "2025-08-20T11:55:41.408Z" }, - { url = "https://files.pythonhosted.org/packages/a3/bb/d4220bd7532eac6288d8115db51710fa2d7d271250797b0bfba9f1e755af/ujson-5.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a638425d3c6eed0318df663df44480f4a40dc87cc7c6da44d221418312f6413b", size = 1195782, upload-time = "2025-08-20T11:55:43.357Z" }, - { url = "https://files.pythonhosted.org/packages/80/47/226e540aa38878ce1194454385701d82df538ccb5ff8db2cf1641dde849a/ujson-5.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e3cff632c1d78023b15f7e3a81c3745cd3f94c044d1e8fa8efbd6b161997bbc", size = 1088817, upload-time = "2025-08-20T11:55:45.262Z" }, - { url = "https://files.pythonhosted.org/packages/7e/81/546042f0b23c9040d61d46ea5ca76f0cc5e0d399180ddfb2ae976ebff5b5/ujson-5.11.0-cp312-cp312-win32.whl", hash = "sha256:be6b0eaf92cae8cdee4d4c9e074bde43ef1c590ed5ba037ea26c9632fb479c88", size = 39757, upload-time = "2025-08-20T11:55:46.522Z" }, - { url = "https://files.pythonhosted.org/packages/44/1b/27c05dc8c9728f44875d74b5bfa948ce91f6c33349232619279f35c6e817/ujson-5.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b7b136cc6abc7619124fd897ef75f8e63105298b5ca9bdf43ebd0e1fa0ee105f", size = 43859, upload-time = "2025-08-20T11:55:47.987Z" }, - { url = "https://files.pythonhosted.org/packages/22/2d/37b6557c97c3409c202c838aa9c960ca3896843b4295c4b7bb2bbd260664/ujson-5.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:6cd2df62f24c506a0ba322d5e4fe4466d47a9467b57e881ee15a31f7ecf68ff6", size = 38361, upload-time = "2025-08-20T11:55:49.122Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ec/2de9dd371d52c377abc05d2b725645326c4562fc87296a8907c7bcdf2db7/ujson-5.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:109f59885041b14ee9569bf0bb3f98579c3fa0652317b355669939e5fc5ede53", size = 55435, upload-time = "2025-08-20T11:55:50.243Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a4/f611f816eac3a581d8a4372f6967c3ed41eddbae4008d1d77f223f1a4e0a/ujson-5.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a31c6b8004438e8c20fc55ac1c0e07dad42941db24176fe9acf2815971f8e752", size = 53193, upload-time = "2025-08-20T11:55:51.373Z" }, - { url = "https://files.pythonhosted.org/packages/e9/c5/c161940967184de96f5cbbbcce45b562a4bf851d60f4c677704b1770136d/ujson-5.11.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78c684fb21255b9b90320ba7e199780f653e03f6c2528663768965f4126a5b50", size = 57603, upload-time = "2025-08-20T11:55:52.583Z" }, - { url = "https://files.pythonhosted.org/packages/2b/d6/c7b2444238f5b2e2d0e3dab300b9ddc3606e4b1f0e4bed5a48157cebc792/ujson-5.11.0-cp313-cp313-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:4c9f5d6a27d035dd90a146f7761c2272cf7103de5127c9ab9c4cd39ea61e878a", size = 59794, upload-time = "2025-08-20T11:55:53.69Z" }, - { url = "https://files.pythonhosted.org/packages/fe/a3/292551f936d3d02d9af148f53e1bc04306b00a7cf1fcbb86fa0d1c887242/ujson-5.11.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:837da4d27fed5fdc1b630bd18f519744b23a0b5ada1bbde1a36ba463f2900c03", size = 57363, upload-time = "2025-08-20T11:55:54.843Z" }, - { url = "https://files.pythonhosted.org/packages/90/a6/82cfa70448831b1a9e73f882225980b5c689bf539ec6400b31656a60ea46/ujson-5.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:787aff4a84da301b7f3bac09bc696e2e5670df829c6f8ecf39916b4e7e24e701", size = 1036311, upload-time = "2025-08-20T11:55:56.197Z" }, - { url = "https://files.pythonhosted.org/packages/84/5c/96e2266be50f21e9b27acaee8ca8f23ea0b85cb998c33d4f53147687839b/ujson-5.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6dd703c3e86dc6f7044c5ac0b3ae079ed96bf297974598116aa5fb7f655c3a60", size = 1195783, upload-time = "2025-08-20T11:55:58.081Z" }, - { url = "https://files.pythonhosted.org/packages/8d/20/78abe3d808cf3bb3e76f71fca46cd208317bf461c905d79f0d26b9df20f1/ujson-5.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3772e4fe6b0c1e025ba3c50841a0ca4786825a4894c8411bf8d3afe3a8061328", size = 1088822, upload-time = "2025-08-20T11:55:59.469Z" }, - { url = "https://files.pythonhosted.org/packages/d8/50/8856e24bec5e2fc7f775d867aeb7a3f137359356200ac44658f1f2c834b2/ujson-5.11.0-cp313-cp313-win32.whl", hash = "sha256:8fa2af7c1459204b7a42e98263b069bd535ea0cd978b4d6982f35af5a04a4241", size = 39753, upload-time = "2025-08-20T11:56:01.345Z" }, - { url = "https://files.pythonhosted.org/packages/5b/d8/1baee0f4179a4d0f5ce086832147b6cc9b7731c24ca08e14a3fdb8d39c32/ujson-5.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:34032aeca4510a7c7102bd5933f59a37f63891f30a0706fb46487ab6f0edf8f0", size = 43866, upload-time = "2025-08-20T11:56:02.552Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8c/6d85ef5be82c6d66adced3ec5ef23353ed710a11f70b0b6a836878396334/ujson-5.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:ce076f2df2e1aa62b685086fbad67f2b1d3048369664b4cdccc50707325401f9", size = 38363, upload-time = "2025-08-20T11:56:03.688Z" }, - { url = "https://files.pythonhosted.org/packages/28/08/4518146f4984d112764b1dfa6fb7bad691c44a401adadaa5e23ccd930053/ujson-5.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:65724738c73645db88f70ba1f2e6fb678f913281804d5da2fd02c8c5839af302", size = 55462, upload-time = "2025-08-20T11:56:04.873Z" }, - { url = "https://files.pythonhosted.org/packages/29/37/2107b9a62168867a692654d8766b81bd2fd1e1ba13e2ec90555861e02b0c/ujson-5.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29113c003ca33ab71b1b480bde952fbab2a0b6b03a4ee4c3d71687cdcbd1a29d", size = 53246, upload-time = "2025-08-20T11:56:06.054Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f8/25583c70f83788edbe3ca62ce6c1b79eff465d78dec5eb2b2b56b3e98b33/ujson-5.11.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c44c703842024d796b4c78542a6fcd5c3cb948b9fc2a73ee65b9c86a22ee3638", size = 57631, upload-time = "2025-08-20T11:56:07.374Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ca/19b3a632933a09d696f10dc1b0dfa1d692e65ad507d12340116ce4f67967/ujson-5.11.0-cp314-cp314-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:e750c436fb90edf85585f5c62a35b35082502383840962c6983403d1bd96a02c", size = 59877, upload-time = "2025-08-20T11:56:08.534Z" }, - { url = "https://files.pythonhosted.org/packages/55/7a/4572af5324ad4b2bfdd2321e898a527050290147b4ea337a79a0e4e87ec7/ujson-5.11.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f278b31a7c52eb0947b2db55a5133fbc46b6f0ef49972cd1a80843b72e135aba", size = 57363, upload-time = "2025-08-20T11:56:09.758Z" }, - { url = "https://files.pythonhosted.org/packages/7b/71/a2b8c19cf4e1efe53cf439cdf7198ac60ae15471d2f1040b490c1f0f831f/ujson-5.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ab2cb8351d976e788669c8281465d44d4e94413718af497b4e7342d7b2f78018", size = 1036394, upload-time = "2025-08-20T11:56:11.168Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3e/7b98668cba3bb3735929c31b999b374ebc02c19dfa98dfebaeeb5c8597ca/ujson-5.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:090b4d11b380ae25453100b722d0609d5051ffe98f80ec52853ccf8249dfd840", size = 1195837, upload-time = "2025-08-20T11:56:12.6Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ea/8870f208c20b43571a5c409ebb2fe9b9dba5f494e9e60f9314ac01ea8f78/ujson-5.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:80017e870d882d5517d28995b62e4e518a894f932f1e242cbc802a2fd64d365c", size = 1088837, upload-time = "2025-08-20T11:56:14.15Z" }, - { url = "https://files.pythonhosted.org/packages/63/b6/c0e6607e37fa47929920a685a968c6b990a802dec65e9c5181e97845985d/ujson-5.11.0-cp314-cp314-win32.whl", hash = "sha256:1d663b96eb34c93392e9caae19c099ec4133ba21654b081956613327f0e973ac", size = 41022, upload-time = "2025-08-20T11:56:15.509Z" }, - { url = "https://files.pythonhosted.org/packages/4e/56/f4fe86b4c9000affd63e9219e59b222dc48b01c534533093e798bf617a7e/ujson-5.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:849e65b696f0d242833f1df4182096cedc50d414215d1371fca85c541fbff629", size = 45111, upload-time = "2025-08-20T11:56:16.597Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f3/669437f0280308db4783b12a6d88c00730b394327d8334cc7a32ef218e64/ujson-5.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:e73df8648c9470af2b6a6bf5250d4744ad2cf3d774dcf8c6e31f018bdd04d764", size = 39682, upload-time = "2025-08-20T11:56:17.763Z" }, - { url = "https://files.pythonhosted.org/packages/6e/cd/e9809b064a89fe5c4184649adeb13c1b98652db3f8518980b04227358574/ujson-5.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:de6e88f62796372fba1de973c11138f197d3e0e1d80bcb2b8aae1e826096d433", size = 55759, upload-time = "2025-08-20T11:56:18.882Z" }, - { url = "https://files.pythonhosted.org/packages/1b/be/ae26a6321179ebbb3a2e2685b9007c71bcda41ad7a77bbbe164005e956fc/ujson-5.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:49e56ef8066f11b80d620985ae36869a3ff7e4b74c3b6129182ec5d1df0255f3", size = 53634, upload-time = "2025-08-20T11:56:20.012Z" }, - { url = "https://files.pythonhosted.org/packages/ae/e9/fb4a220ee6939db099f4cfeeae796ecb91e7584ad4d445d4ca7f994a9135/ujson-5.11.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a325fd2c3a056cf6c8e023f74a0c478dd282a93141356ae7f16d5309f5ff823", size = 58547, upload-time = "2025-08-20T11:56:21.175Z" }, - { url = "https://files.pythonhosted.org/packages/bd/f8/fc4b952b8f5fea09ea3397a0bd0ad019e474b204cabcb947cead5d4d1ffc/ujson-5.11.0-cp314-cp314t-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:a0af6574fc1d9d53f4ff371f58c96673e6d988ed2b5bf666a6143c782fa007e9", size = 60489, upload-time = "2025-08-20T11:56:22.342Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e5/af5491dfda4f8b77e24cf3da68ee0d1552f99a13e5c622f4cef1380925c3/ujson-5.11.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10f29e71ecf4ecd93a6610bd8efa8e7b6467454a363c3d6416db65de883eb076", size = 58035, upload-time = "2025-08-20T11:56:23.92Z" }, - { url = "https://files.pythonhosted.org/packages/c4/09/0945349dd41f25cc8c38d78ace49f14c5052c5bbb7257d2f466fa7bdb533/ujson-5.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1a0a9b76a89827a592656fe12e000cf4f12da9692f51a841a4a07aa4c7ecc41c", size = 1037212, upload-time = "2025-08-20T11:56:25.274Z" }, - { url = "https://files.pythonhosted.org/packages/49/44/8e04496acb3d5a1cbee3a54828d9652f67a37523efa3d3b18a347339680a/ujson-5.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b16930f6a0753cdc7d637b33b4e8f10d5e351e1fb83872ba6375f1e87be39746", size = 1196500, upload-time = "2025-08-20T11:56:27.517Z" }, - { url = "https://files.pythonhosted.org/packages/64/ae/4bc825860d679a0f208a19af2f39206dfd804ace2403330fdc3170334a2f/ujson-5.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:04c41afc195fd477a59db3a84d5b83a871bd648ef371cf8c6f43072d89144eef", size = 1089487, upload-time = "2025-08-20T11:56:29.07Z" }, - { url = "https://files.pythonhosted.org/packages/30/ed/5a057199fb0a5deabe0957073a1c1c1c02a3e99476cd03daee98ea21fa57/ujson-5.11.0-cp314-cp314t-win32.whl", hash = "sha256:aa6d7a5e09217ff93234e050e3e380da62b084e26b9f2e277d2606406a2fc2e5", size = 41859, upload-time = "2025-08-20T11:56:30.495Z" }, - { url = "https://files.pythonhosted.org/packages/aa/03/b19c6176bdf1dc13ed84b886e99677a52764861b6cc023d5e7b6ebda249d/ujson-5.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:48055e1061c1bb1f79e75b4ac39e821f3f35a9b82de17fce92c3140149009bec", size = 46183, upload-time = "2025-08-20T11:56:31.574Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ca/a0413a3874b2dc1708b8796ca895bf363292f9c70b2e8ca482b7dbc0259d/ujson-5.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:1194b943e951092db611011cb8dbdb6cf94a3b816ed07906e14d3bc6ce0e90ab", size = 40264, upload-time = "2025-08-20T11:56:32.773Z" }, -] - -[[package]] -name = "unstructured" -version = "0.18.21" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "backoff" }, - { name = "beautifulsoup4" }, - { name = "charset-normalizer" }, - { name = "dataclasses-json" }, - { name = "emoji" }, - { name = "filetype" }, - { name = "html5lib" }, - { name = "langdetect" }, - { name = "lxml" }, - { name = "nltk" }, - { name = "numpy" }, - { name = "psutil" }, - { name = "python-iso639" }, - { name = "python-magic" }, - { name = "python-oxmsg" }, - { name = "rapidfuzz" }, - { name = "requests" }, - { name = "tqdm" }, - { name = "typing-extensions" }, - { name = "unstructured-client" }, - { name = "wrapt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/2d/752aa318e92fe551f1c134b28b45d3421d8f1044ed977e74b177fdd8d7fc/unstructured-0.18.21.tar.gz", hash = "sha256:329f4bb960f2ea83df8526c0768bb0035bec13be2bf6b5ba8ed5976dcd773218", size = 1696481, upload-time = "2025-11-24T14:57:38.807Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/98/e8ddcfadd762f8f69d84e14498c28adefdd8e2008f443077495984405c45/unstructured-0.18.21-py3-none-any.whl", hash = "sha256:8611c06017199fd7f131f3fbf586a458fd83074fc6aadac23640f6450a00e377", size = 1783346, upload-time = "2025-11-24T14:57:36.863Z" }, -] - -[package.optional-dependencies] -all-docs = [ - { name = "effdet" }, - { name = "google-cloud-vision", version = "3.10.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" }, - { name = "google-cloud-vision", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" }, - { name = "markdown" }, - { name = "msoffcrypto-tool" }, - { name = "networkx" }, - { name = "onnx" }, - { name = "onnxruntime" }, - { name = "openpyxl" }, - { name = "pandas" }, - { name = "pdf2image" }, - { name = "pdfminer-six" }, - { name = "pi-heif" }, - { name = "pikepdf" }, - { name = "pypandoc" }, - { name = "pypdf" }, - { name = "python-docx" }, - { name = "python-pptx" }, - { name = "unstructured-inference" }, - { name = "unstructured-pytesseract" }, - { name = "xlrd" }, -] - -[[package]] -name = "unstructured-client" -version = "0.42.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiofiles" }, - { name = "cryptography" }, - { name = "httpcore" }, - { name = "httpx" }, - { name = "pydantic" }, - { name = "pypdf" }, - { name = "requests-toolbelt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a4/8f/43c9a936a153e62f18e7629128698feebd81d2cfff2835febc85377b8eb8/unstructured_client-0.42.4.tar.gz", hash = "sha256:144ecd231a11d091cdc76acf50e79e57889269b8c9d8b9df60e74cf32ac1ba5e", size = 91404, upload-time = "2025-11-14T16:59:25.131Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/6c/7c69e4353e5bdd05fc247c2ec1d840096eb928975697277b015c49405b0f/unstructured_client-0.42.4-py3-none-any.whl", hash = "sha256:fc6341344dd2f2e2aed793636b5f4e6204cad741ff2253d5a48ff2f2bccb8e9a", size = 207863, upload-time = "2025-11-14T16:59:23.674Z" }, -] - -[[package]] -name = "unstructured-inference" -version = "1.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "accelerate" }, - { name = "huggingface-hub" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "onnx" }, - { name = "onnxruntime" }, - { name = "opencv-python" }, - { name = "pandas" }, - { name = "pdfminer-six" }, - { name = "pypdfium2" }, - { name = "python-multipart" }, - { name = "rapidfuzz" }, - { name = "scipy" }, - { name = "timm" }, - { name = "torch" }, - { name = "transformers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e2/50/f45f12374cd49103af3c936d43337d017cad191cf5e372e57c40b161ec0f/unstructured_inference-1.1.2.tar.gz", hash = "sha256:76897dcd814c70275d355973b9203b198d4fea5f196e33e28954c73fa88e2e67", size = 44178, upload-time = "2025-11-21T21:16:27.454Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/50/fb/5cd889b02177b05af9471421ea61e44b0a73d2eadb14be1ac91d3a6f1752/unstructured_inference-1.1.2-py3-none-any.whl", hash = "sha256:1e98020b6cb2832b3980e62e237ffc84a490bedc26689174464323fea3b266a8", size = 47934, upload-time = "2025-11-21T21:16:25.924Z" }, -] - -[[package]] -name = "unstructured-pytesseract" -version = "0.3.15" +name = "uncalled-for" +version = "0.3.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, - { name = "pillow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/b1/4b3a976b76549f22c3f5493a622603617cbe08804402978e1dac9c387997/unstructured.pytesseract-0.3.15.tar.gz", hash = "sha256:4b81bc76cfff4e2ef37b04863f0e48bd66184c0b39c3b2b4e017483bca1a7394", size = 15703, upload-time = "2025-03-05T00:59:17.516Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/68/35c1d87e608940badbcfeb630347aa0509897284684f61fab6423d02b253/uncalled_for-0.3.1.tar.gz", hash = "sha256:5e412ac6708f04b56bef5867b5dcf6690ebce4eb7316058d9c50787492bb4bca", size = 49693, upload-time = "2026-04-07T13:05:06.462Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/6d/adb955ecf60811a3735d508974bbb5358e7745b635dc001329267529c6f2/unstructured.pytesseract-0.3.15-py3-none-any.whl", hash = "sha256:a3f505c5efb7ff9f10379051a7dd6aa624b3be6b0f023ed6767cc80d0b1613d1", size = 14992, upload-time = "2025-03-05T00:59:15.962Z" }, + { url = "https://files.pythonhosted.org/packages/11/e1/7ec67882ad8fc9f86384bef6421fa252c9cbe5744f8df6ce77afc9eca1f5/uncalled_for-0.3.1-py3-none-any.whl", hash = "sha256:074cdc92da8356278f93d0ded6f2a66dd883dbecaf9bc89437646ee2289cc200", size = 11361, upload-time = "2026-04-07T13:05:05.341Z" }, ] [[package]] name = "urllib3" -version = "2.6.2" +version = "2.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, ] [[package]] @@ -6514,15 +4721,15 @@ wheels = [ [[package]] name = "uvicorn" -version = "0.32.0" +version = "0.40.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e0/fc/1d785078eefd6945f3e5bab5c076e4230698046231eb0f3747bc5c8fa992/uvicorn-0.32.0.tar.gz", hash = "sha256:f78b36b143c16f54ccdb8190d0a26b5f1901fe5a3c777e1ab29f26391af8551e", size = 77564, upload-time = "2024-10-15T17:27:33.848Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/14/78bd0e95dd2444b6caacbca2b730671d4295ccb628ef58b81bee903629df/uvicorn-0.32.0-py3-none-any.whl", hash = "sha256:60b8f3a5ac027dcd31448f411ced12b5ef452c646f76f02f8cc3f25d8d26fd82", size = 63723, upload-time = "2024-10-15T17:27:32.022Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, ] [package.optional-dependencies] @@ -6579,7 +4786,7 @@ wheels = [ [[package]] name = "vss-ctx-rag" -version = "1.0.2" +version = "3.0.0rc3" source = { editable = "." } dependencies = [ { name = "bleach" }, @@ -6589,6 +4796,7 @@ dependencies = [ { name = "json-repair" }, { name = "jsonschema" }, { name = "langchain" }, + { name = "langchain-classic" }, { name = "langchain-community" }, { name = "langchain-core" }, { name = "langchain-elasticsearch" }, @@ -6597,9 +4805,11 @@ dependencies = [ { name = "langchain-nvidia-ai-endpoints" }, { name = "langchain-openai" }, { name = "langgraph" }, + { name = "llvmlite" }, { name = "matplotlib" }, { name = "minio" }, { name = "neo4j" }, + { name = "numba" }, { name = "nvidia-rag" }, { name = "nvtx" }, { name = "openai" }, @@ -6623,8 +4833,6 @@ dependencies = [ { name = "requests" }, { name = "safetensors" }, { name = "schema" }, - { name = "torch" }, - { name = "unstructured", extra = ["all-docs"] }, { name = "uvicorn", extra = ["standard"] }, ] @@ -6642,6 +4850,7 @@ docs = [ { name = "sphinx-autoapi" }, { name = "sphinx-copybutton" }, { name = "sphinxcontrib-mermaid" }, + { name = "tinycss2" }, { name = "vale" }, ] nat = [ @@ -6650,59 +4859,61 @@ nat = [ [package.metadata] requires-dist = [ - { name = "bleach", specifier = "==6.2.0" }, + { name = "bleach", specifier = "==6.3.0" }, { name = "dataclass-wizard", specifier = "==0.27.0" }, - { name = "fastapi", specifier = ">=0.115.4,<0.116.0" }, - { name = "fastmcp", specifier = ">=2.13.0.2" }, + { name = "fastapi", specifier = "==0.121.2" }, + { name = "fastmcp", specifier = "==3.2.4" }, { name = "ipython", marker = "extra == 'docs'", specifier = "~=8.31" }, - { name = "json-repair", specifier = "==0.30.2" }, - { name = "jsonschema", specifier = ">=4.22.0,<4.23.0" }, - { name = "langchain", specifier = ">=0.3.27" }, - { name = "langchain-community", specifier = ">=0.3.27" }, - { name = "langchain-core", specifier = ">=0.3.80" }, - { name = "langchain-elasticsearch", specifier = ">=0.4.0" }, - { name = "langchain-experimental", specifier = ">=0.3.4" }, - { name = "langchain-milvus", specifier = ">=0.2.1" }, - { name = "langchain-nvidia-ai-endpoints", specifier = ">=0.3.13" }, - { name = "langchain-openai", specifier = ">=0.3.10" }, - { name = "langgraph", specifier = ">=1.0.1" }, + { name = "json-repair", specifier = "==0.44.1" }, + { name = "jsonschema", specifier = "==4.22.0" }, + { name = "langchain", specifier = "==1.2.15" }, + { name = "langchain-classic", specifier = ">=1.0.3" }, + { name = "langchain-community", specifier = "==0.4.1" }, + { name = "langchain-core", specifier = ">=1.0.1,<2.0.0" }, + { name = "langchain-elasticsearch", specifier = ">=1.0.0,<2.0.0" }, + { name = "langchain-experimental", specifier = "==0.4.1" }, + { name = "langchain-milvus", specifier = "==0.3.3" }, + { name = "langchain-nvidia-ai-endpoints", specifier = "==1.2.1" }, + { name = "langchain-openai", specifier = ">=1.0.0,<2.0.0" }, + { name = "langgraph", specifier = "==1.1.8" }, + { name = "llvmlite", specifier = "==0.44.0" }, { name = "matplotlib", specifier = "==3.9.4" }, { name = "minio", specifier = "==7.2.15" }, { name = "myst-parser", marker = "extra == 'docs'", specifier = "~=4.0" }, { name = "nbsphinx", marker = "extra == 'docs'", specifier = "~=0.9" }, { name = "neo4j", specifier = "==5.24.0" }, - { name = "nvidia-rag", specifier = ">=2.2.2" }, + { name = "numba", specifier = "==0.61.2" }, + { name = "nvidia-rag", specifier = "==2.5.0" }, { name = "nvidia-sphinx-theme", marker = "extra == 'docs'", specifier = ">=0.0.7" }, { name = "nvtx", specifier = "==0.2.11" }, - { name = "openai", specifier = ">=1.68.2,<2.0.0" }, - { name = "opencv-python", specifier = ">=4.12.0.88" }, - { name = "openinference-instrumentation-langchain", specifier = ">=0.1.44" }, - { name = "openinference-instrumentation-openai", specifier = ">=0.1.30" }, - { name = "openinference-semantic-conventions", specifier = ">=0.1.21" }, - { name = "opentelemetry-api", specifier = ">=1.28.2" }, - { name = "opentelemetry-exporter-otlp-proto-http", specifier = ">=1.28.2" }, - { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.49b2" }, - { name = "opentelemetry-sdk", specifier = ">=1.28.2" }, - { name = "pdfplumber", specifier = ">=0.6" }, - { name = "protobuf", specifier = ">=5.29.5" }, - { name = "pyaml-env", specifier = ">=1.2.1,<2.0.0" }, - { name = "pydantic", specifier = ">=2.11.7" }, - { name = "pymilvus", specifier = ">=2.5.14" }, + { name = "openai", specifier = "==1.109.1" }, + { name = "opencv-python", specifier = "==4.12.0.88" }, + { name = "openinference-instrumentation-langchain", specifier = "==0.1.56" }, + { name = "openinference-instrumentation-openai", specifier = "==0.1.41" }, + { name = "openinference-semantic-conventions", specifier = "==0.1.25" }, + { name = "opentelemetry-api", specifier = "==1.39.1" }, + { name = "opentelemetry-exporter-otlp-proto-http", specifier = "==1.39.1" }, + { name = "opentelemetry-instrumentation-fastapi", specifier = "==0.60b1" }, + { name = "opentelemetry-sdk", specifier = "==1.39.1" }, + { name = "pdfplumber", specifier = "==0.11.9" }, + { name = "protobuf", specifier = ">=6.33.5" }, + { name = "pyaml-env", specifier = "==1.2.2" }, + { name = "pydantic", specifier = "==2.12.5" }, + { name = "pymilvus", specifier = ">=2.6.0,<2.7.0" }, { name = "pymilvus-model", specifier = "==0.3.2" }, - { name = "python-multipart", specifier = "==0.0.18" }, - { name = "pyyaml", specifier = ">=6.0.2" }, + { name = "python-multipart", specifier = "==0.0.26" }, + { name = "pyyaml", specifier = "==6.0.2" }, { name = "redis", specifier = "==5.2.1" }, - { name = "requests", specifier = ">=2.32.3,<2.33.0" }, - { name = "safetensors", specifier = "==0.4.4" }, - { name = "schema", specifier = ">=0.7.7,<0.8.0" }, + { name = "requests", specifier = "==2.32.5" }, + { name = "safetensors", specifier = "==0.5.3" }, + { name = "schema", specifier = "==0.7.8" }, { name = "setuptools-scm", marker = "extra == 'docs'", specifier = ">=8.1.0" }, { name = "sphinx", marker = "extra == 'docs'", specifier = "~=8.2" }, { name = "sphinx-autoapi", marker = "extra == 'docs'", specifier = ">=3.6" }, { name = "sphinx-copybutton", marker = "extra == 'docs'", specifier = ">=0.5" }, { name = "sphinxcontrib-mermaid", marker = "extra == 'docs'", specifier = ">=1.0.0" }, - { name = "torch", specifier = ">=2.0.0,<3.0.0" }, - { name = "unstructured", extras = ["all-docs"], specifier = ">=0.15.1" }, - { name = "uvicorn", extras = ["standard"], specifier = "==0.32.0" }, + { name = "tinycss2", marker = "extra == 'docs'", specifier = ">=1.2.1" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.35" }, { name = "vale", marker = "extra == 'docs'", specifier = "==3.9.5" }, { name = "vss-ctx-rag-arango", marker = "extra == 'arango'", editable = "packages/vss_ctx_rag_arango" }, { name = "vss-ctx-rag-nat", marker = "extra == 'nat'", editable = "packages/vss_ctx_rag_nat" }, @@ -6711,14 +4922,11 @@ provides-extras = ["docs", "arango", "nat"] [[package]] name = "vss-ctx-rag-arango" -version = "1.0.2" +version = "3.0.0rc3" source = { editable = "packages/vss_ctx_rag_arango" } dependencies = [ - { name = "cuml-cu12" }, - { name = "cupy-cuda12x" }, { name = "langchain-arangodb" }, { name = "nx-arangodb" }, - { name = "nx-cugraph-cu12" }, { name = "python-arango" }, { name = "scikit-learn" }, { name = "vss-ctx-rag" }, @@ -6726,11 +4934,8 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "cuml-cu12", specifier = ">=25.4.0" }, - { name = "cupy-cuda12x", specifier = "==13.4.1" }, { name = "langchain-arangodb", specifier = ">=1.2.0" }, { name = "nx-arangodb", specifier = ">=1.3.0" }, - { name = "nx-cugraph-cu12", specifier = ">=25.4.0" }, { name = "python-arango", specifier = ">=8.1.6" }, { name = "scikit-learn", specifier = "<1.8.0" }, { name = "vss-ctx-rag", editable = "." }, @@ -6738,7 +4943,7 @@ requires-dist = [ [[package]] name = "vss-ctx-rag-nat" -version = "1.0.2" +version = "3.0.0rc3" source = { editable = "packages/vss_ctx_rag_nat" } dependencies = [ { name = "vss-ctx-rag" }, @@ -6915,24 +5120,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, ] -[[package]] -name = "xlrd" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d1990d7af382c79f3b2372e880b65de21b01b1a2b78691e/xlrd-2.0.2.tar.gz", hash = "sha256:08b5e25de58f21ce71dc7db3b3b8106c1fa776f3024c54e45b45b374e89234c9", size = 100167, upload-time = "2025-06-14T08:46:39.039Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, -] - -[[package]] -name = "xlsxwriter" -version = "3.2.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/46/2c/c06ef49dc36e7954e55b802a8b231770d286a9758b3d936bd1e04ce5ba88/xlsxwriter-3.2.9.tar.gz", hash = "sha256:254b1c37a368c444eac6e2f867405cc9e461b0ed97a3233b2ac1e574efb4140c", size = 215940, upload-time = "2025-09-16T00:16:21.63Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/0c/3662f4a66880196a590b202f0db82d919dd2f89e99a27fadef91c4a33d41/xlsxwriter-3.2.9-py3-none-any.whl", hash = "sha256:9a5db42bc5dff014806c58a20b9eae7322a134abb6fce3c92c181bfb275ec5b3", size = 175315, upload-time = "2025-09-16T00:16:20.108Z" }, -] - [[package]] name = "xxhash" version = "3.6.0" @@ -7110,15 +5297,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, ] -[[package]] -name = "zict" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d1/ac/3c494dd7ec5122cff8252c1a209b282c0867af029f805ae9befd73ae37eb/zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5", size = 33238, upload-time = "2023-04-17T21:41:16.041Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae", size = 43332, upload-time = "2023-04-17T21:41:13.444Z" }, -] - [[package]] name = "zipp" version = "3.23.0" From 34b2409e5a5115b9c5f774cbd6008eea920e6d38 Mon Sep 17 00:00:00 2001 From: David Du Date: Thu, 14 May 2026 13:36:50 -0700 Subject: [PATCH 2/8] copy-pr-bot integration Signed-off-by: David Du --- .github/copy-pr-bot.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/copy-pr-bot.yaml diff --git a/.github/copy-pr-bot.yaml b/.github/copy-pr-bot.yaml new file mode 100644 index 00000000..a58a29c5 --- /dev/null +++ b/.github/copy-pr-bot.yaml @@ -0,0 +1,8 @@ +enabled: true +auto_sync_draft: false +auto_sync_ready: true +additional_vetters: + - daviddu0425 + - slakhotia-nv + - prasshantg + - ashwaniag-nv \ No newline at end of file From f54fbb7e68791bc86c7a7e5f18dd8cefc3d77254 Mon Sep 17 00:00:00 2001 From: David Du Date: Fri, 15 May 2026 14:47:43 -0700 Subject: [PATCH 3/8] 3.0.0rc9 --- .pre-commit-config.yaml | 4 +- config/config.yaml | 4 +- packages/vss_ctx_rag_arango/pyproject.toml | 2 +- packages/vss_ctx_rag_nat/pyproject.toml | 2 +- pyproject.toml | 17 +- .../context_manager/context_manager.py | 31 +- .../functions/summarization/batch.py | 3 +- .../functions/summarization/offline_batch.py | 3 +- .../functions/summarization/vlm_structured.py | 9 +- .../summarization/vlm_structured_base.py | 324 +++++++++++++++++- .../summarization/vlm_structured_online.py | 19 +- .../tools/storage/elasticsearch_db.py | 29 +- src/vss_ctx_rag/tools/storage/neo4j_db.py | 24 ++ uv.lock | 55 +-- 14 files changed, 450 insertions(+), 76 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 13250550..7790732b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,7 +26,7 @@ repos: - id: check-merge-conflict - id: check-toml - id: check-yaml - exclude: ^(config/config.yaml|data/configs/.+\.yaml)$ + exclude: ^(config/config(\.internal)?\.yaml|data/configs/.+\.yaml|config/config_lvs\.yaml)$ - id: detect-private-key - id: end-of-file-fixer - id: mixed-line-ending diff --git a/config/config.yaml b/config/config.yaml index 6a843b5c..9cd8b67b 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -33,7 +33,7 @@ tools: port: !ENV ${ES_PORT} tools: embedding: nvidia_embedding - + graph_db_arango: type: arango params: @@ -43,7 +43,7 @@ tools: password: !ENV ${ARANGO_DB_PASSWORD} tools: embedding: nvidia_embedding - + graph_db: type: neo4j params: diff --git a/packages/vss_ctx_rag_arango/pyproject.toml b/packages/vss_ctx_rag_arango/pyproject.toml index b17c39c0..2e15b822 100644 --- a/packages/vss_ctx_rag_arango/pyproject.toml +++ b/packages/vss_ctx_rag_arango/pyproject.toml @@ -25,7 +25,7 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_arango" -version = "3.0.0rc3" +version = "3.0.0rc9" dependencies = [ "vss_ctx_rag", "python-arango>=8.1.6", diff --git a/packages/vss_ctx_rag_nat/pyproject.toml b/packages/vss_ctx_rag_nat/pyproject.toml index 680bd6ed..7214ef59 100644 --- a/packages/vss_ctx_rag_nat/pyproject.toml +++ b/packages/vss_ctx_rag_nat/pyproject.toml @@ -24,7 +24,7 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_nat" -version = "3.0.0rc3" +version = "3.0.0rc9" dependencies = [ "vss_ctx_rag" ] diff --git a/pyproject.toml b/pyproject.toml index 5be85807..6b28891a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,7 +19,7 @@ requires = ["setuptools >= 64"] [project] name = "vss_ctx_rag" -version = "3.0.0rc3" +version = "3.0.0rc9" description = "" readme = "README.md" requires-python = ">=3.12" @@ -33,7 +33,7 @@ dependencies = [ "langchain_milvus==0.3.3", "langchain-openai>=1.0.0,<2.0.0", "langchain-experimental==0.4.1", - "langchain-nvidia-ai-endpoints==1.2.1", + "langchain-nvidia-ai-endpoints==1.3.0", "pymilvus>=2.6.0,<2.7.0", "pymilvus-model==0.3.2", "python-multipart==0.0.26", @@ -145,8 +145,10 @@ constraint-dependencies = [ # Remove once unstructured or pdfplumber pull Pillow>=12.2.0. "Pillow>=12.2.0", # CVE-2024-55945 (PKCE bypass) + BDSA-2026-7419. Via minio. - # Updated to >=1.7.0 for BDSA-2026-7419 (nSpect NSPECT-P1VD-WUVY). Remove once minio pulls Authlib>=1.7.0. - "Authlib>=1.7.0", + # Updated to >=1.7.2 for BDSA-2026-7419 (nSpect NSPECT-P1VD-WUVY). Remove once minio pulls Authlib>=1.7.2. + "Authlib>=1.7.2", + # Via minio. Remove once minio pulls urllib3>=2.7.0. + "urllib3>=2.7.0", # CVE-2024-56737 (path traversal). Via keyring/importlib. # Remove once keyring pulls jaraco-context>=6.1.2. "jaraco-context>=6.1.2", @@ -156,6 +158,11 @@ constraint-dependencies = [ # CVE-2025-47272 (XSS in notebook output). Via unstructured. # Remove once unstructured pulls nbconvert>=7.17.1. "nbconvert>=7.17.1", + # BDSA-2025-15435 / CVE-2025-64439 (RCE in JsonPlusSerializer). + # Via langgraph==1.1.8 -> langgraph-prebuilt==1.0.10. + # nSpect guidance: long-term fix is 1.0.11. Exact pin avoids alpha selection + # under prerelease=allow. Remove once langgraph pulls langgraph-prebuilt>=1.0.11. + "langgraph-prebuilt==1.0.11", # CVE-2026-34444 (arbitrary code exec via Lua sandbox escape). Previously transitive via # fakeredis[lua]/fastmcp 2.x; removed from lock with fastmcp 3.x upgrade. Safety pin in # case lupa is re-introduced. Remove once no transitive puller requires lupa<2.8. diff --git a/src/vss_ctx_rag/context_manager/context_manager.py b/src/vss_ctx_rag/context_manager/context_manager.py index d9dbc3e8..51db33b5 100644 --- a/src/vss_ctx_rag/context_manager/context_manager.py +++ b/src/vss_ctx_rag/context_manager/context_manager.py @@ -315,16 +315,33 @@ def run(self) -> None: self._configure_queue.put({"error": str(e)}) elif item and "drop_collection" in item: - # Drop the collection/index for every storage tool - # registered with this context manager. Used by - # via-engine on /files DELETE and stream removal when - # KAFKA_ENABLED=true so Logstash-written documents - # are wiped along with the asset. + # Drop the collection/index on every registered tool + # that exposes a ``drop_collection`` method. Used by + # via-engine on /files DELETE, on stream removal when + # KAFKA_ENABLED=true, and on file-summarize completion + # under LVS_DISABLE_DB_RESET_ON_REQUEST_DONE=false + # so Logstash- / in-process-written documents are + # wiped along with the asset and the cluster shard + # pool drains. + # + # Walk every tool category in cm_handler.tools rather + # than a hardcoded list β€” tool categories are keyed + # by the YAML ``type:`` value (``elasticsearch``, + # ``milvus``, ``arango``, ``neo4j``, etc.) so the + # earlier ``("storage", "vector_db")`` filter + # silently matched nothing for the Elasticsearch + # backend. ``callable(drop_fn)`` skips tool kinds + # (``llm``, ``embedding``, …) that don't own a + # collection. try: dropped = [] errors = [] - for tool_type in ("storage", "vector_db"): - tools_by_name = self.cm_handler.tools.get(tool_type, {}) + for ( + tool_type, + tools_by_name, + ) in self.cm_handler.tools.items(): + if not isinstance(tools_by_name, dict): + continue for tool_name, tool in tools_by_name.items(): drop_fn = getattr(tool, "drop_collection", None) if not callable(drop_fn): diff --git a/src/vss_ctx_rag/functions/summarization/batch.py b/src/vss_ctx_rag/functions/summarization/batch.py index 783e7301..2a68218f 100644 --- a/src/vss_ctx_rag/functions/summarization/batch.py +++ b/src/vss_ctx_rag/functions/summarization/batch.py @@ -71,10 +71,11 @@ class BatchSummarization(Function): call_schema: Schema = Schema( {"start_index": int, "end_index": int}, ignore_extra_keys=True ) - metrics = SummaryMetrics() + metrics: SummaryMetrics uuid: str def setup(self): + self.metrics = SummaryMetrics() # fixed params prompts = self.get_param("prompts") self.batch_prompt = ChatPromptTemplate.from_messages( diff --git a/src/vss_ctx_rag/functions/summarization/offline_batch.py b/src/vss_ctx_rag/functions/summarization/offline_batch.py index c3eeabcb..b2fc99ac 100644 --- a/src/vss_ctx_rag/functions/summarization/offline_batch.py +++ b/src/vss_ctx_rag/functions/summarization/offline_batch.py @@ -71,11 +71,12 @@ class OfflineBatchSummarization(Function): call_schema: Schema = Schema( {"start_index": int, "end_index": int}, ignore_extra_keys=True ) - metrics = SummaryMetrics() + metrics: SummaryMetrics uuid: str batch_summaries: Dict[int, str] def setup(self): + self.metrics = SummaryMetrics() # fixed params prompts = self.get_param("prompts") self.batch_prompt = ChatPromptTemplate.from_messages( diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured.py b/src/vss_ctx_rag/functions/summarization/vlm_structured.py index a4229355..25a1f9db 100644 --- a/src/vss_ctx_rag/functions/summarization/vlm_structured.py +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured.py @@ -92,12 +92,19 @@ async def acall(self, state: dict): async def aprocess_doc(self, doc: str, doc_i: int, doc_meta: dict): """Parse events from *doc*, accumulate in memory, and persist raw events to DB.""" try: + if doc_meta.get("doc_type") == "event_list": + self._store_event_list(doc, doc_i, doc_meta) + return logger.info("Processing structured doc %d for processing", doc_i) doc_meta.setdefault("is_first", False) doc_meta.setdefault("is_last", False) with Metrics("StructuredBatchSumm/aprocess_doc", "red") as bs: - events = self._parse_json_document(doc) + events, needs_type = self._parse_json_document(doc, doc_meta) + if needs_type: + uuid = doc_meta.get("uuid", self.uuids[0] if self.uuids else "") + inferred = await self._infer_event_types(needs_type, uuid=uuid) + events.extend(inferred) if events: logger.info(f"Extracted {len(events)} events from document {doc_i}") diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py b/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py index 09a165e9..1fe19094 100644 --- a/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured_base.py @@ -20,11 +20,14 @@ batch storage, and result building. """ +import asyncio import json import os import re +import time +from datetime import datetime, timezone from pathlib import Path -from typing import List, Optional +from typing import List, Optional, Tuple, Union import json_repair @@ -33,7 +36,7 @@ from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables.base import RunnableSequence -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_validator from schema import Schema from vss_ctx_rag.base.function import Function @@ -90,6 +93,36 @@ class VlmStructuredParamsBase(BaseModel): ) +# ── Timestamp parsing ─────────────────────────────────────────────────── + + +def _parse_timestamp(value: Union[int, float, str]) -> float: + """Coerce a timestamp to float seconds. + + Accepts: + - Numeric values (int / float) β€” returned as-is. + - Numeric strings (e.g. ``"123.45"``) β€” converted via ``float()``. + - ISO 8601 strings (e.g. ``"2025-01-15T10:30:00Z"``) β€” parsed and + converted to a POSIX / epoch-seconds float. + """ + if isinstance(value, (int, float)): + return float(value) + if isinstance(value, str): + try: + return float(value) + except ValueError: + pass + normalized = value.replace("Z", "+00:00") if value.endswith("Z") else value + try: + dt = datetime.fromisoformat(normalized) + if dt.tzinfo is None: + dt = dt.replace(tzinfo=timezone.utc) + return dt.timestamp() + except ValueError: + raise ValueError(f"Cannot parse timestamp: {value!r}") + raise TypeError(f"Expected numeric or ISO timestamp, got {type(value).__name__}") + + # ── Event model ───────────────────────────────────────────────────────── @@ -102,6 +135,11 @@ class Event(BaseModel): description: str uuid: Optional[str] = None + @field_validator("start_time", "end_time", mode="before") + @classmethod + def _coerce_timestamp(cls, v: Union[int, float, str]) -> float: + return _parse_timestamp(v) + def overlaps_with( self, other: "Event", @@ -147,7 +185,7 @@ class VlmStructuredBase(Function): config: dict db: StorageTool call_schema: Schema = Schema({}, ignore_extra_keys=True) - metrics = SummaryMetrics() + metrics: SummaryMetrics uuids: List[str] time_overlap_threshold: float @@ -168,6 +206,7 @@ class VlmStructuredBase(Function): def setup(self): self.db = self.get_tool("db") + self.metrics = SummaryMetrics() self.time_overlap_threshold = self.get_param( "time_overlap_threshold", default=0.1 @@ -178,8 +217,14 @@ def setup(self): self.max_events_per_batch = self.get_param("max_events_per_batch", default=50) self.enable_llm_merging = self.get_param("enable_llm_merging", default=False) self.kafka_enabled = self.get_param("kafka_enabled", default=False) - self.filter_start_time = self.get_param("start_time", default=None) - self.filter_end_time = self.get_param("end_time", default=None) + _raw_start = self.get_param("start_time", default=None) + _raw_end = self.get_param("end_time", default=None) + self.filter_start_time = ( + _parse_timestamp(_raw_start) if _raw_start is not None else None + ) + self.filter_end_time = ( + _parse_timestamp(_raw_end) if _raw_end is not None else None + ) self.log_dir = os.environ.get("VIA_LOG_DIR", None) self.summary_start_time = None @@ -277,8 +322,36 @@ def _extract_json_from_vlm_response(cls, vlm_response: str) -> str: return content.strip().replace("\\n", "\n").replace('\\"', '"') @classmethod - def _parse_json_document(cls, doc: str) -> List[Event]: - """Parse a JSON document and return a list of Event objects.""" + def _parse_json_document( + cls, + doc: str, + doc_meta: Optional[dict] = None, + ) -> Tuple[List[Event], List[Event]]: + """Parse a JSON document and return validated events plus untyped events. + + Returns + ------- + (events, needs_type_inference) + *events* are ready to use. *needs_type_inference* contains + events that have a valid description but an empty/missing type + (only populated when ``LVS_DROP_EMPTY_EVENT_FIELDS`` is + enabled). Callers should pass the second list through + ``_infer_event_types`` to attempt LLM-based classification. + + Parameters + ---------- + doc: + Raw JSON (or VLM-wrapped JSON) text. + doc_meta: + Optional chunk metadata dict (from ``ChunkInfo``). When + provided, ``_chunk_boundaries`` extracts the chunk's time + window. Events with ``start_time >= end_time`` are rescued + using those boundaries when they form a valid (positive- + duration) window; otherwise the event is dropped. + """ + chunk_start_time, chunk_end_time = ( + cls._chunk_boundaries(doc_meta) if doc_meta else (None, None) + ) try: json_content = cls._extract_json_from_vlm_response(doc) with Metrics("VlmStructured/ParseJSONDocument", "green"): @@ -289,32 +362,212 @@ def _parse_json_document(cls, doc: str) -> List[Event]: events_data = data.get("events", []) if isinstance(data, dict) else data if not isinstance(events_data, list): logger.warning(f"Expected events list, got {type(events_data)}") - return [] + return [], [] + + drop_empty = os.environ.get( + "LVS_DROP_EMPTY_EVENT_FIELDS", "true" + ).lower() in ("true", "1", "yes", "on") + + valid_events: List[Event] = [] + deferred_events: List[Event] = [] + needs_type_inference: List[Event] = [] - events = [] for event_data in events_data: try: event = Event(**event_data) + + if drop_empty: + ev_type = (event.type or "").strip() + ev_desc = (event.description or "").strip() + if not ev_desc: + logger.warning( + "Dropping event with empty description " + "(type=%r, description=%r): %s", + event.type, + event.description, + event_data, + ) + continue + if not ev_type: + needs_type_inference.append(event) + continue + if event.start_time >= event.end_time: + deferred_events.append(event) + else: + valid_events.append(event) + except Exception as e: + logger.warning(f"Skipping invalid event {event_data}: {e}") + + if deferred_events: + for event in deferred_events: + # Replace VLM-emitted zero-duration timestamps with the + # authoritative chunk boundaries from content_metadata: + # - live stream β†’ start_ntp_float / end_ntp_float + # - file β†’ start_pts / end_pts + # (selected by ``_chunk_boundaries``). Events are dropped + # only when no chunk boundaries are available at all (e.g. + # legacy in-memory path with empty ``doc_meta``). + if chunk_start_time is not None and chunk_end_time is not None: logger.warning( - "Dropping zero/negative-duration event " + "Adjusting zero/negative-duration event " + "(start_time=%.3f, end_time=%.3f) to chunk " + "boundaries (%.3f, %.3f): %s", + event.start_time, + event.end_time, + chunk_start_time, + chunk_end_time, + event.description, + ) + event.start_time = chunk_start_time + event.end_time = chunk_end_time + valid_events.append(event) + else: + logger.warning( + "Dropping zero/negative-duration event β€” no chunk " + "boundaries in content_metadata " "(start_time=%.3f, end_time=%.3f): %s", event.start_time, event.end_time, event.description, ) - continue - events.append(event) - except Exception as e: - logger.warning(f"Skipping invalid event {event_data}: {e}") - logger.info(f"Parsed {len(events)} events from JSON document") - return events + logger.info( + f"Parsed {len(valid_events)} events from JSON document " + f"({len(needs_type_inference)} need type inference)" + ) + return valid_events, needs_type_inference except Exception as e: logger.warning(f"Failed to parse JSON document: {e}") + return [], [] + + # ── Event-list persistence ───────────────────────────────────────── + + def _store_event_list(self, doc: str, doc_i: int, doc_meta: dict) -> None: + """Persist an ``event_list`` document to the DB. + + This must be called during ``aprocess_doc`` so that + ``_get_known_event_types`` can retrieve the list later when + performing LLM-based type inference. + """ + meta = { + "chunkIdx": doc_meta.get("chunkIdx", doc_i), + "batch_i": doc_meta.get("batch_i", doc_i), + "doc_type": "event_list", + "uuid": doc_meta.get("uuid", self.uuids[0]), + "camera_id": doc_meta.get("camera_id", "default"), + } + with Metrics("VlmStructured/StoreEventList", "green"): + self.db.add_summary(summary=doc, metadata=meta) + logger.info("Stored event_list document for uuid=%s", meta["uuid"]) + + # ── LLM type inference ────────────────────────────────────────────── + + def _get_known_event_types(self, uuid: str) -> List[str]: + """Retrieve known event types from the event_list document in the DB.""" + try: + docs = self.db.retrieve_docs(uuid=uuid, doc_type="event_list") + if not docs: + logger.debug("No event_list document found for uuid=%s", uuid) + return [] + text = docs[0].get("text", "") + if not text: + return [] + data = json.loads(text) + events_list = data.get("events", []) + known_types = sorted( + { + (e["type"] if isinstance(e, dict) else e) + for e in events_list + if (isinstance(e, dict) and e.get("type")) + or (isinstance(e, str) and e.strip()) + } + ) + if known_types: + logger.info( + "Retrieved %d known event types for uuid=%s: %s", + len(known_types), + uuid, + known_types, + ) + return known_types + except Exception as e: + logger.warning( + "Failed to retrieve known event types for uuid=%s: %s", + uuid, + e, + ) + return [] + + async def _infer_event_types( + self, + events: List[Event], + uuid: str = "", + ) -> List[Event]: + """Use LLM to assign a type to events that have a description but no type. + If *uuid* is provided, the ``event_list`` document is fetched from + the DB to supply the LLM with known event types for that stream. + All events are sent to the LLM concurrently via ``asyncio.gather``. + Returns only the events for which a non-empty type was successfully + inferred. Events that cannot be typed are logged and discarded. + """ + if not events: return [] + known_types = self._get_known_event_types(uuid) if uuid else [] + + if known_types: + types_str = ", ".join(f"'{t}'" for t in known_types) + type_guidance = ( + f"The following event types are known for this stream: " + f"{types_str}.\n" + "Pick the most appropriate type from this list and only from this list\n\n" + ) + else: + type_guidance = "" + + async def _infer_single(event: Event) -> Optional[Event]: + prompt = ( + "You are classifying a video event. Given the description below, " + "reply with ONLY a short event type label (1-3 words). " + "Do not include any other text.\n\n" + f"{type_guidance}" + f"Description: {event.description}" + ) + try: + with Metrics("VlmStructured/InferEventType", "yellow"): + response = await self.llm.ainvoke(prompt) + t = remove_think_tags(response.content).strip().strip("\"'") + if t: + event.type = t + logger.info("Inferred type %r for event: %s", t, event.description) + return event + logger.warning( + "LLM returned empty type for event, dropping: %s", + event.description, + ) + except Exception as e: + logger.warning( + "LLM type inference failed for event, dropping: %s β€” %s", + event.description, + e, + ) + return None + + with Metrics("VlmStructured/InferEventTypes", "yellow"): + with get_openai_callback() as cb: + results = await asyncio.gather(*(_infer_single(e) for e in events)) + logger.info( + f"InferEventTypes - Total Tokens: {cb.total_tokens}, " + f"Prompt Tokens: {cb.prompt_tokens}, " + f"Completion Tokens: {cb.completion_tokens}, " + f"Total Cost (USD): ${cb.total_cost}" + ) + self.metrics.summary_tokens += cb.total_tokens + self.metrics.summary_requests += cb.successful_requests + return [e for e in results if e is not None] + # ── Merging ───────────────────────────────────────────────────────── async def _merge_descriptions_with_llm( @@ -348,6 +601,8 @@ async def _merge_descriptions_with_llm( f"Completion Tokens: {cb.completion_tokens}, " f"Total Cost (USD): ${cb.total_cost}" ) + self.metrics.summary_tokens += cb.total_tokens + self.metrics.summary_requests += cb.successful_requests return ( merged_description.strip() if isinstance(merged_description, str) @@ -447,18 +702,24 @@ async def _merge_similar_events(self, events: List[Event]) -> List[Event]: @staticmethod def _filter_events_by_time( events: List[Event], - start_time: Optional[float] = None, - end_time: Optional[float] = None, + start_time: Optional[Union[float, str]] = None, + end_time: Optional[Union[float, str]] = None, ) -> List[Event]: """Return only events that overlap the ``[start_time, end_time]`` window. An event is kept when its time span intersects the filter window, i.e. ``event.end_time >= start_time`` and ``event.start_time <= end_time``. If both bounds are *None* the original list is returned unchanged. + + *start_time* and *end_time* accept numeric values **or** ISO 8601 + strings; they are coerced to ``float`` epoch-seconds before comparison. """ if start_time is None and end_time is None: return events + start_time = _parse_timestamp(start_time) if start_time is not None else None + end_time = _parse_timestamp(end_time) if end_time is not None else None + filtered = [] for event in events: if start_time is not None and event.end_time < start_time: @@ -570,6 +831,7 @@ async def _aggregate_events_with_llm(self, merged_events: List[Event]) -> str: input_text = "\n\n".join(events_text) logger.info(f"Aggregating {len(merged_events)} events with LLM") + agg_start_time = time.time() with Metrics("VlmStructured/LLMAggregation", "cyan"): with get_openai_callback() as cb: aggregated_summary = await call_token_safe( @@ -586,6 +848,7 @@ async def _aggregate_events_with_llm(self, merged_events: List[Event]) -> str: f"Successful Requests: {cb.successful_requests}, " f"Total Cost (USD): ${cb.total_cost}" ) + self.metrics.aggregation_latency = time.time() - agg_start_time return aggregated_summary @@ -655,7 +918,30 @@ async def _build_result( return state - # ── Doc ingestion helper ──────────────────────────────────────────── + # ── Doc ingestion helpers ─────────────────────────────────────────── + + @staticmethod + def _chunk_boundaries(doc_meta: dict) -> tuple[float, float]: + """ + Extract ``(chunk_start_time, chunk_end_time)`` in seconds from *doc_meta*. + + Two metadata shapes are supported, depending on stream type: + + - **Live stream summarization** β€” RTVI populates absolute NTP wall + clock fields on the proto message; Logstash mirrors them as + ``start_ntp_float`` / ``end_ntp_float`` (float epoch-seconds). + Used for live because ``start_pts`` is unreliable for RTSP streams + (PTS rolls over per GStreamer pipeline restart). + + - **File summarization** β€” chunk boundaries come from the video + container's PTS (``start_pts`` / ``end_pts`` in nanoseconds, relative + to the asset's ``creation_time``). Returned as seconds-from-creation. + """ + if "start_ntp_float" in doc_meta and "end_ntp_float" in doc_meta: + return float(doc_meta["start_ntp_float"]), float(doc_meta["end_ntp_float"]) + if "start_pts" in doc_meta and "end_pts" in doc_meta: + return doc_meta["start_pts"] / 1e9, doc_meta["end_pts"] / 1e9 + return None, None def _store_raw_events( self, events: List[Event], doc_i: int, doc_meta: dict diff --git a/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py b/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py index 4f5f69cc..a488d2da 100644 --- a/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py +++ b/src/vss_ctx_rag/functions/summarization/vlm_structured_online.py @@ -53,7 +53,7 @@ class VlmStructuredOnlineSummarization(VlmStructuredBase): # ── DB retrieval ──────────────────────────────────────────────────── - def _fetch_events_from_db(self, uuids: List[str]) -> List[Event]: + async def _fetch_events_from_db(self, uuids: List[str]) -> List[Event]: """Retrieve raw event documents from the database and parse into Event objects. When *uuids* contains more than one entry, each parsed ``Event`` @@ -72,7 +72,11 @@ def _fetch_events_from_db(self, uuids: List[str]) -> List[Event]: text = doc.get("text", "") if not text: continue - events = self._parse_json_document(text) + doc_meta = {k: v for k, v in doc.items() if k != "text"} + events, needs_type = self._parse_json_document(text, doc_meta) + if needs_type: + inferred = await self._infer_event_types(needs_type, uuid=uuid) + events.extend(inferred) if multi: for event in events: event.uuid = uuid @@ -97,7 +101,7 @@ async def acall(self, state: dict): self.call_schema.validate(state) uuids = self._resolve_uuids(state) - events = self._fetch_events_from_db(uuids) + events = await self._fetch_events_from_db(uuids) start_time = state.get("start_time", self.filter_start_time) end_time = state.get("end_time", self.filter_end_time) @@ -117,12 +121,19 @@ async def acall(self, state: dict): async def aprocess_doc(self, doc: str, doc_i: int, doc_meta: dict): """Parse and store raw events to DB (no in-memory accumulation).""" try: + if doc_meta.get("doc_type") == "event_list": + self._store_event_list(doc, doc_i, doc_meta) + return logger.info("Processing structured doc %d for online storage", doc_i) doc_meta.setdefault("is_first", False) doc_meta.setdefault("is_last", False) with Metrics("StructuredOnlineSumm/aprocess_doc", "red") as bs: - events = self._parse_json_document(doc) + events, needs_type = self._parse_json_document(doc, doc_meta) + if needs_type: + uuid = doc_meta.get("uuid", self.uuids[0] if self.uuids else "") + inferred = await self._infer_event_types(needs_type, uuid=uuid) + events.extend(inferred) if events: logger.info(f"Extracted {len(events)} events from document {doc_i}") diff --git a/src/vss_ctx_rag/tools/storage/elasticsearch_db.py b/src/vss_ctx_rag/tools/storage/elasticsearch_db.py index 332b5b1e..e6a0895b 100644 --- a/src/vss_ctx_rag/tools/storage/elasticsearch_db.py +++ b/src/vss_ctx_rag/tools/storage/elasticsearch_db.py @@ -605,23 +605,28 @@ def drop_data(self, query=None): es_client.delete_by_query(index=self.index_name, body=query) except Exception as e: - logger.warning(f"Error dropping data: {e}") + if hasattr(e, "status_code") and e.status_code == 404: + logger.debug("Index '%s' already deleted", self.index_name) + else: + logger.warning(f"Error dropping data: {e}") def drop_collection(self): + """Delete the Elasticsearch index backing this tool. + + Idempotent on a missing index (ES returns 404 / 400 are ignored). + The cached ``_vector_store`` reference is intentionally NOT + recreated here: langchain's ``ElasticsearchStore`` constructor + bootstraps the index with its mapping on initialisation, which + leaves a 0-doc index behind that still consumes a shard against + ``cluster.max_shards_per_node``. The existing wrapper's + underlying ES client remains valid and can be reused + for subsequent writes β€” langchain auto-creates the index lazily + on the next ``add_documents`` call, picking up the visionllm + template's mapping declared by ``_ensure_index_template``. + """ try: es_client = self._vector_store.client es_client.indices.delete(index=self.index_name, ignore=[400, 404]) - - # Recreate the vector store - self._vector_store = ElasticsearchStore( - index_name=self.index_name, - embedding=self.embedding, - es_url=self.es_url, - strategy=ElasticsearchStore.ApproxRetrievalStrategy( - hybrid=True, rrf=False - ), - distance_strategy="COSINE", - ) except Exception as e: logger.warning(f"Error dropping collection: {e}") diff --git a/src/vss_ctx_rag/tools/storage/neo4j_db.py b/src/vss_ctx_rag/tools/storage/neo4j_db.py index 0bdfc125..c65f9bde 100644 --- a/src/vss_ctx_rag/tools/storage/neo4j_db.py +++ b/src/vss_ctx_rag/tools/storage/neo4j_db.py @@ -1136,6 +1136,30 @@ def get_neo4j_retriever( vector_db = config["vector_creator"]( multi_channel, retrieval_query, index_name ) + + # TODO: Upgrade to langchain-neo4j package + # Neo4j vector index can intermittently return None scores + # (e.g. due to eventual consistency after ingestion). Filter + # them out before langchain's validation check which cannot + # handle None in comparisons like `score < 0.0`. + _original_search = vector_db.similarity_search_with_score_by_vector + + def _safe_search_with_score(*args, **kwargs): + results = _original_search(*args, **kwargs) + filtered = [ + (doc, score) for doc, score in results if score is not None + ] + if len(filtered) < len(results): + logger.warning( + f"Filtered out {len(results) - len(filtered)} " + "result(s) with None similarity scores" + ) + return filtered + + vector_db.similarity_search_with_score_by_vector = ( + _safe_search_with_score + ) + search_k = top_k or config["default_k"] # Build base search kwargs search_kwargs = { diff --git a/uv.lock b/uv.lock index db9b0360..c16423aa 100644 --- a/uv.lock +++ b/uv.lock @@ -23,16 +23,18 @@ members = [ "vss-ctx-rag-nat", ] constraints = [ - { name = "authlib", specifier = ">=1.7.0" }, + { name = "authlib", specifier = ">=1.7.2" }, { name = "cryptography", specifier = ">=46.0.7" }, { name = "jaraco-context", specifier = ">=6.1.2" }, { name = "langgraph-api", specifier = ">=0.5" }, + { name = "langgraph-prebuilt", specifier = "==1.0.11" }, { name = "lupa", specifier = ">=2.8" }, { name = "nbconvert", specifier = ">=7.17.1" }, { name = "nltk", specifier = ">=3.9.4" }, { name = "pillow", specifier = ">=12.2.0" }, { name = "pygments", specifier = ">=2.20.0" }, { name = "transformers", specifier = ">=4.57.6" }, + { name = "urllib3", specifier = ">=2.7.0" }, ] overrides = [ { name = "bleach", specifier = ">=6.3.0" }, @@ -312,15 +314,15 @@ wheels = [ [[package]] name = "authlib" -version = "1.7.0" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/82/4d0603f30c1b4629b1f091bb266b0d7986434891d6940a8c87f8098db24e/authlib-1.7.0.tar.gz", hash = "sha256:b3e326c9aa9cc3ea95fe7d89fd880722d3608da4d00e8a27e061e64b48d801d5", size = 175890, upload-time = "2026-04-18T11:00:28.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/48/c954218b2a250e23f178f10167c4173fecb5a75d2c206f0a67ba58006c26/authlib-1.7.0-py2.py3-none-any.whl", hash = "sha256:e36817afb02f6f0b6bf55f150782499ddd6ddf44b402bb055d3263cc65ac9ae0", size = 258779, upload-time = "2026-04-18T11:00:26.64Z" }, + { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, ] [[package]] @@ -1787,10 +1789,11 @@ wheels = [ [[package]] name = "langchain-core" -version = "1.3.0" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, + { name = "langchain-protocol" }, { name = "langsmith" }, { name = "packaging" }, { name = "pydantic" }, @@ -1799,9 +1802,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/fe/20190232d9b513242899dbb0c2bb77e31b4d61e343743adbe90ebc2603d2/langchain_core-1.3.0.tar.gz", hash = "sha256:14a39f528bf459aa3aa40d0a7f7f1bae7520d435ef991ae14a4ceb74d8c49046", size = 860755, upload-time = "2026-04-17T14:51:38.298Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/03/7219502e8ca728d65eb44d7a3eb60239230742a70dbfc9241b9bfd61c4ab/langchain_core-1.3.2.tar.gz", hash = "sha256:fd7a50b2f28ba561fd9d7f5d2760bc9e06cf00cdf820a3ccafe88a94ffa8d5b7", size = 911813, upload-time = "2026-04-24T15:49:23.699Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/e2/dbfa347aa072a6dc4cd38d6f9ebfc730b4c14c258c47f480f4c5c546f177/langchain_core-1.3.0-py3-none-any.whl", hash = "sha256:baf16ee028475df177b9ab8869a751c79406d64a6f12125b93802991b566cced", size = 515140, upload-time = "2026-04-17T14:51:36.274Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d5/8fa4431007cbb7cfed7590f4d6a5dea3ad724f4174d248f6642ef5ce7d05/langchain_core-1.3.2-py3-none-any.whl", hash = "sha256:d44a66127f9f8db735bdfd0ab9661bccb47a97113cfd3f2d89c74864422b7274", size = 542390, upload-time = "2026-04-24T15:49:21.991Z" }, ] [[package]] @@ -1845,7 +1848,7 @@ wheels = [ [[package]] name = "langchain-nvidia-ai-endpoints" -version = "1.2.1" +version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1853,9 +1856,9 @@ dependencies = [ { name = "langchain-core" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/d5/5d70c7b7a66dfabc4c355e408a066e8bef7d2715f3b7854ce44704886119/langchain_nvidia_ai_endpoints-1.2.1.tar.gz", hash = "sha256:055d2511fa7374da65e5d3dd1705fb09125620a124c6247212d661286f64fa8d", size = 57520, upload-time = "2026-03-16T16:42:34.682Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/2f/29036df9a99212f27369a123d2b44b5eec0ffb1b15b1277bf71cc0a37606/langchain_nvidia_ai_endpoints-1.3.0.tar.gz", hash = "sha256:5223aa7988ee5044f38715ae757faa0af4ba64f2ed0c82851a99c052592eaa09", size = 58015, upload-time = "2026-05-07T23:06:33.579Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b7/99f72331842b0f62da891411c5590ff7fab70a1a753a9a1be9348921995e/langchain_nvidia_ai_endpoints-1.2.1-py3-none-any.whl", hash = "sha256:eafb2186dea25d163089552c062274664540f2cbe251861c515700645fbf256d", size = 61820, upload-time = "2026-03-16T16:42:33.657Z" }, + { url = "https://files.pythonhosted.org/packages/1f/34/dd21237e0534938061207ee733ef6da6c2dc62c9712932b379714817abc9/langchain_nvidia_ai_endpoints-1.3.0-py3-none-any.whl", hash = "sha256:cc2b356e96e86ffb92dcfe83980aa73227e1fad8f3a4cbdd76cdcf980c42e7cc", size = 63126, upload-time = "2026-05-07T23:06:32.585Z" }, ] [[package]] @@ -1872,6 +1875,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a1/8a20d19f69d022c10d34afa42d972cc50f971b880d0eb4a828cf3dd824a8/langchain_openai-1.1.9-py3-none-any.whl", hash = "sha256:ca2482b136c45fb67c0db84a9817de675e0eb8fb2203a33914c1b7a96f273940", size = 85769, upload-time = "2026-02-10T21:03:20.333Z" }, ] +[[package]] +name = "langchain-protocol" +version = "0.0.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/7d/ac74b64f9d3150cc90c172490e7321b26ccc76ecef87c3629c83eda6948f/langchain_protocol-0.0.13.tar.gz", hash = "sha256:7448ca507407a6aaa28a73884d74765540e65da891a14a6e062a196412bc554c", size = 5713, upload-time = "2026-04-28T21:08:11.584Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/04/89db2cf7d839aef9c6544b9e3495f522ec3e408cbab34c9c05e41a3d87b0/langchain_protocol-0.0.13-py3-none-any.whl", hash = "sha256:47d4f2a05827bf3a66b238082bf59e8313fd3a14e1b268bdd65c85b67a6b1f6c", size = 6832, upload-time = "2026-04-28T21:08:10.564Z" }, +] + [[package]] name = "langchain-text-splitters" version = "1.1.1" @@ -1916,15 +1931,15 @@ wheels = [ [[package]] name = "langgraph-prebuilt" -version = "1.0.10" +version = "1.0.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph-checkpoint" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/01471b1b5601f2e9c9a69c39fc9a2fb8611613ede0002e5a2b81c0acd850/langgraph_prebuilt-1.0.10.tar.gz", hash = "sha256:5a6fc513f8907074563b6218ff991c4ed9db19ac63101314919686e8029ddb07", size = 169769, upload-time = "2026-04-17T17:59:45.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/bb/0e0b3eb33b1f2f32f8810a49aa24b7d11a5b0ed45f679386095946a59557/langgraph_prebuilt-1.0.11.tar.gz", hash = "sha256:0e71545f706a134b6a80a2a56916562797b499e3e4ab6eed5ce89396ac03d322", size = 171759, upload-time = "2026-04-24T18:18:34.528Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/49/d073375beabdc6955df6cbe570ba7786836bd4c817ae998955d35037f2fd/langgraph_prebuilt-1.0.10-py3-none-any.whl", hash = "sha256:e3baa1977d819982e690a357ba5bb77ccc1d4d8d4a029c48e502a3b6d171185f", size = 36086, upload-time = "2026-04-17T17:59:44.395Z" }, + { url = "https://files.pythonhosted.org/packages/f6/8c/f4c574cb75ae9b8a474215d03a029ea723c919f65771ca1c82fe532d0297/langgraph_prebuilt-1.0.11-py3-none-any.whl", hash = "sha256:7afbaf5d64959e452976664c75bb8ec24098d3510cf9c205919baf443e7342ec", size = 36832, upload-time = "2026-04-24T18:18:33.586Z" }, ] [[package]] @@ -4690,11 +4705,11 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.3" +version = "2.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] @@ -4786,7 +4801,7 @@ wheels = [ [[package]] name = "vss-ctx-rag" -version = "3.0.0rc3" +version = "3.0.0rc9" source = { editable = "." } dependencies = [ { name = "bleach" }, @@ -4873,7 +4888,7 @@ requires-dist = [ { name = "langchain-elasticsearch", specifier = ">=1.0.0,<2.0.0" }, { name = "langchain-experimental", specifier = "==0.4.1" }, { name = "langchain-milvus", specifier = "==0.3.3" }, - { name = "langchain-nvidia-ai-endpoints", specifier = "==1.2.1" }, + { name = "langchain-nvidia-ai-endpoints", specifier = "==1.3.0" }, { name = "langchain-openai", specifier = ">=1.0.0,<2.0.0" }, { name = "langgraph", specifier = "==1.1.8" }, { name = "llvmlite", specifier = "==0.44.0" }, @@ -4922,7 +4937,7 @@ provides-extras = ["docs", "arango", "nat"] [[package]] name = "vss-ctx-rag-arango" -version = "3.0.0rc3" +version = "3.0.0rc9" source = { editable = "packages/vss_ctx_rag_arango" } dependencies = [ { name = "langchain-arangodb" }, @@ -4943,7 +4958,7 @@ requires-dist = [ [[package]] name = "vss-ctx-rag-nat" -version = "3.0.0rc3" +version = "3.0.0rc9" source = { editable = "packages/vss_ctx_rag_nat" } dependencies = [ { name = "vss-ctx-rag" }, From eafd91e324ff9b5dc75ba773d78cf535f7f7f881 Mon Sep 17 00:00:00 2001 From: David Du Date: Tue, 19 May 2026 19:08:32 -0700 Subject: [PATCH 4/8] 3.0.0rc11 --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/copy-pr-bot.yaml | 2 +- CONTRIBUTING.md | 45 +++++++++++++++++-- LICENSE | 4 +- packages/vss_ctx_rag_arango/pyproject.toml | 2 +- packages/vss_ctx_rag_nat/pyproject.toml | 2 +- pyproject.toml | 2 +- .../summarization/vlm_structured_base.py | 29 +++++++++--- src/vss_ctx_rag/models/state_models.py | 16 +++++++ src/vss_ctx_rag/tools/image/image_fetcher.py | 16 +++++++ uv.lock | 6 +-- 11 files changed, 107 insertions(+), 19 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index fff1a8d1..bac2974e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,4 +5,4 @@ ## Checklist - [ ] I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/context-aware-rag/blob/main/CONTRIBUTING.md). - [ ] New or existing tests cover these changes. -- [ ] The documentation is up to date with these changes. \ No newline at end of file +- [ ] The documentation is up to date with these changes. diff --git a/.github/copy-pr-bot.yaml b/.github/copy-pr-bot.yaml index a58a29c5..d965d8be 100644 --- a/.github/copy-pr-bot.yaml +++ b/.github/copy-pr-bot.yaml @@ -5,4 +5,4 @@ additional_vetters: - daviddu0425 - slakhotia-nv - prasshantg - - ashwaniag-nv \ No newline at end of file + - ashwaniag-nv diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ab16918..128f0db7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,13 +1,13 @@ ' + { + echo "$marker" + echo "## License Diff for OSRB" + echo + echo "**${ROWS}** changed packages require OSRB review (vs \`${BASE}\`)." + echo "Download the full CSV directly: [\`license-diff.csv\`](${ARTIFACT_URL}) (or browse the [workflow run](${RUN_URL}))." + echo + cat diff-table.md + echo + echo "
Raw CSV (inline)" + echo + echo '```csv' + cat license-diff.csv + echo '```' + echo "
" + echo + echo "_This check is informational. CODEOWNERS still gates merge β€” get approval from \`@NVIDIA-AI-Blueprints/VSS_OSRB_Approvers\` for the touched lockfile/manifest paths._" + } > comment.md + existing=$(gh api "repos/${REPO}/issues/${PR}/comments" --paginate \ + --jq "[.[] | select(.body | startswith(\"$marker\"))][0].id") + payload=$(jq -Rsn '{body: input}' < comment.md) + if [[ -n "$existing" && "$existing" != "null" ]]; then + echo "Updating existing comment $existing" + echo "$payload" | gh api -X PATCH "repos/${REPO}/issues/comments/${existing}" --input - > /dev/null + else + echo "Creating new comment on PR #${PR}" + echo "$payload" | gh api -X POST "repos/${REPO}/issues/${PR}/comments" --input - > /dev/null + fi + + - name: Fail when license diff is non-empty + if: steps.ctx.outputs.skip != 'true' && steps.gen.outputs.rows != '' && steps.gen.outputs.rows != '0' + env: + ROWS: ${{ steps.gen.outputs.rows }} + run: | + echo "::error title=License diff non-empty::${ROWS} packages changed; requires OSRB review." + exit 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..e2c52bbb --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +**/__pycache__ +*.mp4 +build/* +build +*.egg-info +py.typed +.env +examples/data/* +examples/data +docker/deploy/volumes/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7790732b..edb82b55 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,6 +18,7 @@ repos: rev: v4.5.0 hooks: - id: check-added-large-files + exclude: ^(uv\.lock|LICENSE\.3rdparty)$ - id: check-ast - id: check-case-conflict - id: check-docstring-first @@ -26,7 +27,7 @@ repos: - id: check-merge-conflict - id: check-toml - id: check-yaml - exclude: ^(config/config(\.internal)?\.yaml|data/configs/.+\.yaml|config/config_lvs\.yaml)$ + exclude: ^(config/config.yaml|data/configs/.+\.yaml|config/config_lvs\.yaml)$ - id: detect-private-key - id: end-of-file-fixer - id: mixed-line-ending @@ -48,3 +49,26 @@ repos: entry: trufflehog git file://. --since-commit HEAD --results=verified,unknown --fail language: golang stages: [pre-commit] + + - repo: local + hooks: + - id: dco-signoff + name: DCO sign-off check + entry: bash -c 'grep -q "^Signed-off-by" "$1" || { echo "ERROR - Commit missing DCO sign-off. Use git commit -s"; exit 1; }' -- + language: system + stages: [commit-msg] + + - id: copyright-headers + name: SPDX copyright headers + entry: python3 .github/scripts/check_copyright_headers.py + language: system + pass_filenames: false + stages: [pre-commit] + + - id: license-check-python + name: License Check (Python deps) + entry: bash .github/scripts/check_python_licenses.sh + language: system + files: ^(pyproject\.toml|packages/.+/pyproject\.toml|uv\.lock)$ + pass_filenames: false + stages: [pre-commit] diff --git a/docker/Dockerfile b/docker/Dockerfile index 627d0879..d7d7f0d7 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -31,26 +31,29 @@ RUN python3 -m pip install --user pipx && python3 -m pipx ensurepath && pipx ins ENV PATH=/home/appuser/.local/bin:$PATH USER root +ENV HOME=/root WORKDIR /app +RUN chown 1000:1000 /app -COPY pyproject.toml README.md LICENSE LICENSE.3rdparty uv.lock /app/ +COPY --chown=1000:1000 pyproject.toml README.md LICENSE LICENSE.3rdparty uv.lock /app/ -COPY src/ /app/src/ -COPY service/ /app/service/ -COPY test[s]/ /app/tests/ -COPY config/ /app/config/ -COPY packages/ /app/packages/ +COPY --chown=1000:1000 src/ /app/src/ +COPY --chown=1000:1000 service/ /app/service/ +COPY --chown=1000:1000 test[s]/ /app/tests/ +COPY --chown=1000:1000 config/ /app/config/ +COPY --chown=1000:1000 packages/ /app/packages/ -RUN mkdir -p /app/logs/ +RUN mkdir -p /app/logs/ && chown 1000:1000 /app/logs/ + +USER 1000 RUN touch /app/logs/vss_ctx_rag.log +USER root ENV UV_PROJECT_ENVIRONMENT="/usr/local/" RUN uv sync --locked --all-packages -RUN chown -R 1000:1000 /app /home/appuser - ENV VSS_LOG_FILE=/app/logs/vss_ctx_rag.log ENV HOME=/home/appuser diff --git a/docs/source/guides/nat/nat_function.md b/docs/source/guides/nat/nat_function.md index 3911692f..c313ada1 100644 --- a/docs/source/guides/nat/nat_function.md +++ b/docs/source/guides/nat/nat_function.md @@ -60,7 +60,7 @@ functions: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm @@ -118,7 +118,7 @@ functions: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm diff --git a/examples/pdf_qna.ipynb b/examples/pdf_qna.ipynb index 7d2c91bc..a758a81a 100644 --- a/examples/pdf_qna.ipynb +++ b/examples/pdf_qna.ipynb @@ -79,11 +79,16 @@ "metadata": {}, "outputs": [], "source": [ - "from nv_ingest.framework.orchestration.ray.util.pipeline.pipeline_runners import run_pipeline\n", - "from nv_ingest.framework.orchestration.ray.util.pipeline.pipeline_runners import PipelineCreationSchema\n", + "from nv_ingest.framework.orchestration.ray.util.pipeline.pipeline_runners import (\n", + " run_pipeline,\n", + ")\n", + "from nv_ingest.framework.orchestration.ray.util.pipeline.pipeline_runners import (\n", + " PipelineCreationSchema,\n", + ")\n", "from nv_ingest_client.client import Ingestor, NvIngestClient\n", "from nv_ingest_api.util.message_brokers.simple_message_broker import SimpleClient\n", "from nv_ingest_client.util.process_json_files import ingest_json_results_to_blob\n", + "\n", "# Start the pipeline subprocess for library mode\n", "config = PipelineCreationSchema()\n", "\n", @@ -92,7 +97,7 @@ "client = NvIngestClient(\n", " message_client_allocator=SimpleClient,\n", " message_client_port=7670,\n", - " message_client_hostname=\"localhost\"\n", + " message_client_hostname=\"localhost\",\n", ")" ] }, @@ -113,14 +118,14 @@ " paddle_output_format=\"markdown\",\n", " extract_infographics=True,\n", " # extract_method=\"nemoretriever_parse\", #Slower, but maximally accurate, especially for PDFs with pages that are scanned images\n", - " text_depth=\"page\"\n", + " text_depth=\"page\",\n", " )\n", ")\n", "\n", "results, failures = ingestor.ingest(show_progress=True, return_failures=True)\n", "\n", "print(ingest_json_results_to_blob(results[0]))\n", - "print(failures)\n" + "print(failures)" ] }, { @@ -150,7 +155,7 @@ "import json\n", "import pyaml_env\n", "\n", - "ingestion_url = \"http://:\" # default is localhost:8001\n", + "ingestion_url = \"http://:\" # default is localhost:8001\n", "headers = {\"Content-Type\": \"application/json\"}\n", "\n", "config = pyaml_env.parse_config(\"../config/config.yaml\")\n", @@ -166,15 +171,12 @@ "doc_index = 0\n", "for _, doc in enumerate(results[0]):\n", " if doc[\"document_type\"] == \"text\":\n", - " doc_data = {\n", - " \"document\": doc[\"metadata\"][\"content\"],\n", - " \"doc_index\": doc_index\n", - " }\n", - " \n", + " doc_data = {\"document\": doc[\"metadata\"][\"content\"], \"doc_index\": doc_index}\n", + "\n", " # Add metadata for first/last docs\n", " if doc_index == 0:\n", " doc_data[\"doc_metadata\"] = {\"is_first\": True}\n", - " \n", + "\n", " add_doc_data_list.append(doc_data)\n", " doc_index += 1\n", "\n", @@ -186,14 +188,10 @@ " print(f\"Added document {add_doc_data['doc_index']}\")\n", "\n", "# Add the terminating document\n", - "doc_data = {\n", - " \"document\": \".\",\n", - " \"doc_index\": doc_index,\n", - " \"doc_metadata\": {\"is_last\": True}\n", - " }\n", + "doc_data = {\"document\": \".\", \"doc_index\": doc_index, \"doc_metadata\": {\"is_last\": True}}\n", "response = requests.post(\n", " f\"{ingestion_url}/add_doc\", headers=headers, data=json.dumps(doc_data)\n", - ")\n" + ")" ] }, { @@ -217,7 +215,7 @@ "metadata": {}, "outputs": [], "source": [ - "retrieval_url = \"http://:\" # default is http://localhost:8000\n", + "retrieval_url = \"http://:\" # default is http://localhost:8000\n", "\n", "# Initialize service with same uuid as data ingestion\n", "\n", diff --git a/examples/qna_nat.ipynb b/examples/qna_nat.ipynb index 59c99f11..cc407ca9 100644 --- a/examples/qna_nat.ipynb +++ b/examples/qna_nat.ipynb @@ -55,11 +55,10 @@ "outputs": [], "source": [ "import os\n", - "from pathlib import Path\n", "import json\n", "\n", "# Verify environment variables\n", - "assert os.getenv('NVIDIA_API_KEY'), \"Please set NVIDIA_API_KEY environment variable\"\n" + "assert os.getenv(\"NVIDIA_API_KEY\"), \"Please set NVIDIA_API_KEY environment variable\"" ] }, { @@ -137,8 +136,8 @@ " \"User1: I am great too. Thanks for asking\",\n", " \"User2: So what did you do over the weekend?\",\n", " \"User1: I went hiking to Mission Peak\",\n", - " \"User3: Guys there is a fire. Let us get out of here\"\n", - "]\n" + " \"User3: Guys there is a fire. Let us get out of here\",\n", + "]" ] }, { @@ -149,6 +148,7 @@ "source": [ "import requests\n", "\n", + "\n", "def ingest_document(doc_list):\n", " \"\"\"Ingest document content using the NAT ingestion service.\"\"\"\n", " # Ingest documents\n", @@ -202,10 +202,11 @@ " data = {\n", " \"input_message\": question,\n", " }\n", - " \n", + "\n", " response = requests.post(url, headers=headers, json=data)\n", " return response.json()\n", "\n", + "\n", "# Example questions\n", "questions = [\n", " \"Who mentioned there is a fire?\",\n", diff --git a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py index 641d36ff..d9f8089d 100644 --- a/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py +++ b/packages/vss_ctx_rag_arango/src/vss_ctx_rag/plugins/arango/arango_db.py @@ -1307,7 +1307,12 @@ def persist_subtitle_frames(self, subtitle_frames: list[dict]): def fetch_subtitle_for_embedding(self) -> List[Dict[str, Any]]: """Fetch subtitle nodes without embeddings for embedding processing.""" - with Metrics("GraphRAG/ArangoDB/fetch_subtitle_for_embedding", "green"): + # fmt: off + with Metrics( + "GraphRAG/ArangoDB/fetch_subtitle_for_embedding", # pragma: allowlist secret + "green", + ): + # fmt: on query = """ LET subtitles = ( FOR s IN @@collection diff --git a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/__init__.py b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/__init__.py index 2e5d623a..9e128881 100644 --- a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/__init__.py +++ b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/__init__.py @@ -13,8 +13,22 @@ # See the License for the specific language governing permissions and # limitations under the License. -from .register_in import * -from .register_ret import * -from .utils import * -from .workflow.register_tool_call_workflow import * -from .workflow.tool_call_workflow import * +from .register_in import vss_ctx_rag_ingestion +from .register_ret import vss_ctx_rag_retrieval +from .utils import create_vss_ctx_rag_config, nat_to_vss_config +from .workflow.register_tool_call_workflow import ( + ToolCallWorkflowConfig, + tool_call_workflow, +) +from .workflow.tool_call_workflow import build_workflow_fn, get_document_ingestion_tool + +__all__ = [ + "vss_ctx_rag_ingestion", + "vss_ctx_rag_retrieval", + "create_vss_ctx_rag_config", + "nat_to_vss_config", + "ToolCallWorkflowConfig", + "tool_call_workflow", + "build_workflow_fn", + "get_document_ingestion_tool", +] diff --git a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-ingestion-function.yml b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-ingestion-function.yml index 4389a6e6..e7740040 100644 --- a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-ingestion-function.yml +++ b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-ingestion-function.yml @@ -42,7 +42,7 @@ functions: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm diff --git a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-retrieval-function.yml b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-retrieval-function.yml index 2e097308..f21cc85b 100644 --- a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-retrieval-function.yml +++ b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/function/config-retrieval-function.yml @@ -42,7 +42,7 @@ functions: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm diff --git a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-ingestion-workflow.yml b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-ingestion-workflow.yml index 08fd4578..83fe7a17 100644 --- a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-ingestion-workflow.yml +++ b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-ingestion-workflow.yml @@ -42,7 +42,7 @@ workflow: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm diff --git a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-retrieval-workflow.yml b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-retrieval-workflow.yml index f4ee96a8..5fbfa19a 100644 --- a/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-retrieval-workflow.yml +++ b/packages/vss_ctx_rag_nat/src/vss_ctx_rag/plugins/nat/nat_config/workflow/config-retrieval-workflow.yml @@ -41,7 +41,7 @@ workflow: db_host: "localhost" db_port: "7687" db_user: "neo4j" - db_password: "passneo4j" + db_password: "passneo4j" # pragma: allowlist secret embedding_model_name: embedding_llm diff --git a/src/vss_ctx_rag/context_manager/context_manager.py b/src/vss_ctx_rag/context_manager/context_manager.py index 51db33b5..3ede8a3e 100644 --- a/src/vss_ctx_rag/context_manager/context_manager.py +++ b/src/vss_ctx_rag/context_manager/context_manager.py @@ -478,8 +478,7 @@ def drop_collection(self) -> dict: return output except Exception as e: logger.error( - f"Process Index: {self.process_index} - " - f"Error dropping collection: {e}" + f"Process Index: {self.process_index} - Error dropping collection: {e}" ) return {"error": f"Error dropping collection: {e}"} diff --git a/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_ingestion_func.py b/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_ingestion_func.py index 4c16d4c0..ffd3bf1a 100644 --- a/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_ingestion_func.py +++ b/src/vss_ctx_rag/functions/rag/foundation_rag/foundation_ingestion_func.py @@ -55,7 +55,7 @@ async def acall(self, state: dict): async def aprocess_doc(self, doc: str, doc_i: int, doc_meta: dict): try: logger.info("Adding doc %d", doc_i) - logger.debug(f"APP_VECTORSTORE_URL {os.environ.get("APP_VECTORSTORE_URL")}") + logger.debug(f"APP_VECTORSTORE_URL {os.environ.get('APP_VECTORSTORE_URL')}") doc_meta.setdefault("is_first", False) doc_meta.setdefault("is_last", False) source = doc_meta.get("source", None) diff --git a/src/vss_ctx_rag/functions/rag/graph_rag/ingestion/base.py b/src/vss_ctx_rag/functions/rag/graph_rag/ingestion/base.py index 192798b2..37428d7b 100644 --- a/src/vss_ctx_rag/functions/rag/graph_rag/ingestion/base.py +++ b/src/vss_ctx_rag/functions/rag/graph_rag/ingestion/base.py @@ -183,7 +183,7 @@ def replace_node_ids_with_names(self, graph_documents: List[GraphDocument]): node_type = node.type if node.type else "Entity" # Generate a new ID based on hash of description + name + uuid - hash_input = f"{description}_{node_type}_{old_id}_{graph_doc.source.metadata.get("uuid", "default")}" + hash_input = f"{description}_{node_type}_{old_id}_{graph_doc.source.metadata.get('uuid', 'default')}" hash_obj = hashlib.sha1(hash_input.encode()) new_id = hash_obj.hexdigest() diff --git a/src/vss_ctx_rag/functions/rag/graph_rag/prompt.py b/src/vss_ctx_rag/functions/rag/graph_rag/prompt.py index 17b84cb1..b6c5510e 100644 --- a/src/vss_ctx_rag/functions/rag/graph_rag/prompt.py +++ b/src/vss_ctx_rag/functions/rag/graph_rag/prompt.py @@ -89,11 +89,11 @@ def generate_prompt_section( template=f""" ### {{tool_number}}. {cls.__name__} -{template_info['xml_format']} +{template_info["xml_format"]} - Use case: - {template_info['description']} + {template_info["description"]} {dynamic_rules} """, diff --git a/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py b/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py index 551bd033..505d2f62 100644 --- a/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py +++ b/src/vss_ctx_rag/functions/rag/graph_rag/retrieval/planner.py @@ -199,16 +199,16 @@ def thinking_agent(state: AgentState): evaluation_guidance = "" if state["iteration_count"] >= 2: guidance = evaluation_prompt_content - evaluation_guidance = f"""IMPORTANT: This is iteration {state['iteration_count']}. {guidance}""" + evaluation_guidance = f"""IMPORTANT: This is iteration {state["iteration_count"]}. {guidance}""" messages = [ thinking_sys_msg, HumanMessage( - content=f"""User Query: {state['original_query']} + content=f"""User Query: {state["original_query"]} -Previous Plan: {state['current_plan']} +Previous Plan: {state["current_plan"]} -Execution Results: {state['execution_results']}{evaluation_guidance} +Execution Results: {state["execution_results"]}{evaluation_guidance} Evaluate these results and determine if you need more information or if you can provide a complete answer. If more information is needed, create a new execution plan. If complete, respond with **COMPLETE**. """ @@ -493,11 +493,11 @@ def response_agent(state: AgentState): messages = [ response_sys_msg, HumanMessage( - content=f"""Original Query: {state['original_query']} + content=f"""Original Query: {state["original_query"]} -Final Analysis and Results: {state['current_plan']} +Final Analysis and Results: {state["current_plan"]} -All Execution Results: {state['execution_results']} +All Execution Results: {state["execution_results"]} Provide a clean, direct answer to the user's question based on this information. """ diff --git a/src/vss_ctx_rag/functions/rag/graph_rag/tools/graph_search_tool.py b/src/vss_ctx_rag/functions/rag/graph_rag/tools/graph_search_tool.py index d63efadc..57232a57 100644 --- a/src/vss_ctx_rag/functions/rag/graph_rag/tools/graph_search_tool.py +++ b/src/vss_ctx_rag/functions/rag/graph_rag/tools/graph_search_tool.py @@ -909,7 +909,7 @@ async def _arun( current_start = candidate_start_time except Exception as e: logger.debug( - f"Could not retrieve previous chunk {i+1}: {e}" + f"Could not retrieve previous chunk {i + 1}: {e}" ) logger.debug( @@ -944,7 +944,7 @@ async def _arun( current_end = candidate_end_time except Exception as e: logger.debug( - f"Could not retrieve next chunk {i+1}: {e}" + f"Could not retrieve next chunk {i + 1}: {e}" ) logger.debug(f"Next chunks to add: {next_chunks_to_add}") diff --git a/src/vss_ctx_rag/functions/summarization/summary_retriever.py b/src/vss_ctx_rag/functions/summarization/summary_retriever.py index 6619d7f6..a68f03db 100644 --- a/src/vss_ctx_rag/functions/summarization/summary_retriever.py +++ b/src/vss_ctx_rag/functions/summarization/summary_retriever.py @@ -91,7 +91,7 @@ async def acall(self, state: dict): for chunk in chunks ] logger.debug( - f"Docs: { [doc.page_content[:min(len(doc.page_content), 100)] for doc in docs]}" + f"Docs: {[doc.page_content[: min(len(doc.page_content), 100)] for doc in docs]}" ) logger.info(f"Creating summary with {len(docs)} docs") summary = self.summarization_chain.invoke({"context": docs}) diff --git a/src/vss_ctx_rag/models/state_models.py b/src/vss_ctx_rag/models/state_models.py index a99dd061..f4e3e09f 100644 --- a/src/vss_ctx_rag/models/state_models.py +++ b/src/vss_ctx_rag/models/state_models.py @@ -13,7 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - from typing import Any, TypedDict diff --git a/src/vss_ctx_rag/tools/image/image_fetcher.py b/src/vss_ctx_rag/tools/image/image_fetcher.py index fcb07c79..bcc75a0e 100644 --- a/src/vss_ctx_rag/tools/image/image_fetcher.py +++ b/src/vss_ctx_rag/tools/image/image_fetcher.py @@ -13,7 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - import os import base64 import glob diff --git a/src/vss_ctx_rag/tools/llm/llm_handler.py b/src/vss_ctx_rag/tools/llm/llm_handler.py index 0f4f715d..8cb57240 100644 --- a/src/vss_ctx_rag/tools/llm/llm_handler.py +++ b/src/vss_ctx_rag/tools/llm/llm_handler.py @@ -150,7 +150,7 @@ def update_tool(self, config, tools=None): model = (self.config.params.model or "").strip() api_key = (self.config.params.api_key or "").strip() if not api_key or api_key.strip() == "": - api_key = "NOAPIKEYSET" + api_key = "NOAPIKEYSET" # pragma: allowlist secret base_url = (self.config.params.base_url or "").strip() llm_params = { diff --git a/src/vss_ctx_rag/tools/storage/neo4j_db.py b/src/vss_ctx_rag/tools/storage/neo4j_db.py index c65f9bde..672cdcbb 100644 --- a/src/vss_ctx_rag/tools/storage/neo4j_db.py +++ b/src/vss_ctx_rag/tools/storage/neo4j_db.py @@ -653,7 +653,12 @@ def update_knn(self): ) def fetch_subtitle_for_embedding(self) -> List[Dict[str, Any]]: - with Metrics("GraphRAG/Neo4j/fetch_subtitle_for_embedding", "green"): + # fmt: off + with Metrics( + "GraphRAG/Neo4j/fetch_subtitle_for_embedding", # pragma: allowlist secret + "green", + ): + # fmt: on query = """ MATCH (s:Subtitle) WHERE s.embedding IS NULL AND s.text IS NOT NULL From 162f8aa2e99b23eeaae12b064c3f54d38cfc2fd0 Mon Sep 17 00:00:00 2001 From: David Du Date: Mon, 1 Jun 2026 11:40:51 -0700 Subject: [PATCH 7/8] fix tag commits (#59) Signed-off-by: David Du --- .../scripts/trigger-downstream-pipeline.sh | 21 +++++++++++++++++++ .github/workflows/ci.yml | 7 ++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/scripts/trigger-downstream-pipeline.sh b/.github/scripts/trigger-downstream-pipeline.sh index 7358d60d..42f8e4d1 100644 --- a/.github/scripts/trigger-downstream-pipeline.sh +++ b/.github/scripts/trigger-downstream-pipeline.sh @@ -141,6 +141,13 @@ def fetch_project_id(base_url: str, token: str, project_path: str) -> int: return int(response["id"]) +def resolve_release_tag() -> str: + """Return the Git tag name when this workflow run was triggered by a tag push.""" + if os.environ.get("GITHUB_REF_TYPE", "").strip() == "tag": + return os.environ.get("GITHUB_REF_NAME", "").strip() + return "" + + def trigger_pipeline( base_url: str, token: str, @@ -150,6 +157,7 @@ def trigger_pipeline( commit_sha: str, target_branch: str, compare_branch: str, + release_tag: str, ) -> dict[str, Any]: payload_pairs: list[tuple[str, str]] = [ ("ref", ref), @@ -160,6 +168,13 @@ def trigger_pipeline( ("variables[][key]", "CARAG_COMPARE_BRANCH"), ("variables[][value]", compare_branch), ] + if release_tag: + payload_pairs.extend( + [ + ("variables[][key]", "CARAG_RELEASE_TAG"), + ("variables[][value]", release_tag), + ] + ) payload = urlencode(payload_pairs).encode("utf-8") return request_json("Pipeline trigger", f"{base_url}/projects/{project_id}/pipeline", token, data=payload) @@ -265,6 +280,7 @@ def main() -> int: add_mask(segment) target_branch, compare_branch = resolve_branches() + release_tag = resolve_release_tag() project_id = fetch_project_id(base_url, token, project_path) pipeline = trigger_pipeline( @@ -276,6 +292,7 @@ def main() -> int: commit_sha, target_branch, compare_branch, + release_tag, ) pipeline_iid = str(pipeline.get("iid") or pipeline.get("id") or "") @@ -298,6 +315,8 @@ def main() -> int: print(f" {variable_name}={commit_sha}") print(f" CARAG_TARGET_BRANCH={target_branch}") print(f" CARAG_COMPARE_BRANCH={compare_branch}") + if release_tag: + print(f" CARAG_RELEASE_TAG={release_tag}") sha_short = pipeline_sha[:8] if pipeline_sha else "" commit_sha_short = commit_sha[:8] if commit_sha else "" @@ -314,6 +333,8 @@ def main() -> int: summary_lines.append(f"- **CARAG_TARGET_BRANCH:** `{target_branch}`") if compare_branch: summary_lines.append(f"- **CARAG_COMPARE_BRANCH:** `{compare_branch}`") + if release_tag: + summary_lines.append(f"- **CARAG_RELEASE_TAG:** `{release_tag}`") if pipeline_created_at: summary_lines.append(f"- **Created at:** {pipeline_created_at}") write_summary("\n".join(summary_lines)) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a45b1ea..6ea5ec4c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,12 @@ on: - main - develop - "pull-request/[0-9]+" - + tags: + - "[0-9]+.[0-9]+.[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+a[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+b[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+rc[0-9]+" + - "[0-9]+.[0-9]+.[0-9]+.dev[0-9]+" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true From 13cef1bc4d978202cab83f1af59ffb20623a9405 Mon Sep 17 00:00:00 2001 From: David Du Date: Mon, 1 Jun 2026 11:48:43 -0700 Subject: [PATCH 8/8] 3.0.0 (#61) * 3.0.0 Signed-off-by: David Du * 3.0.0 Signed-off-by: David Du --------- Signed-off-by: David Du --- .github/workflows/license-diff.yaml | 2 +- packages/vss_ctx_rag_arango/pyproject.toml | 2 +- packages/vss_ctx_rag_nat/pyproject.toml | 2 +- pyproject.toml | 2 +- uv.lock | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/license-diff.yaml b/.github/workflows/license-diff.yaml index 2f4e09cd..bb48d7c1 100644 --- a/.github/workflows/license-diff.yaml +++ b/.github/workflows/license-diff.yaml @@ -168,7 +168,7 @@ jobs: echo '```' echo "" echo - echo "_This check is informational. CODEOWNERS still gates merge β€” get approval from \`@NVIDIA-AI-Blueprints/VSS_OSRB_Approvers\` for the touched lockfile/manifest paths._" + echo "_This check is informational β€” get approval from \`@NVIDIA/carag-osrb-approvers\` before merging._" } > comment.md existing=$(gh api "repos/${REPO}/issues/${PR}/comments" --paginate \ --jq "[.[] | select(.body | startswith(\"$marker\"))][0].id") diff --git a/packages/vss_ctx_rag_arango/pyproject.toml b/packages/vss_ctx_rag_arango/pyproject.toml index 0cd23014..a2d66724 100644 --- a/packages/vss_ctx_rag_arango/pyproject.toml +++ b/packages/vss_ctx_rag_arango/pyproject.toml @@ -25,7 +25,7 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_arango" -version = "3.0.0rc11" +version = "3.0.0" dependencies = [ "vss_ctx_rag", "python-arango>=8.1.6", diff --git a/packages/vss_ctx_rag_nat/pyproject.toml b/packages/vss_ctx_rag_nat/pyproject.toml index 31448c4e..5ede3e4b 100644 --- a/packages/vss_ctx_rag_nat/pyproject.toml +++ b/packages/vss_ctx_rag_nat/pyproject.toml @@ -24,7 +24,7 @@ include = ["vss_ctx_rag.*"] [project] name = "vss_ctx_rag_nat" -version = "3.0.0rc11" +version = "3.0.0" dependencies = [ "vss_ctx_rag" ] diff --git a/pyproject.toml b/pyproject.toml index 606dd477..b6046003 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ requires = ["setuptools >= 64"] [project] name = "vss_ctx_rag" -version = "3.0.0rc11" +version = "3.0.0" description = "" readme = "README.md" requires-python = ">=3.12" diff --git a/uv.lock b/uv.lock index 83417456..a4416d68 100644 --- a/uv.lock +++ b/uv.lock @@ -4801,7 +4801,7 @@ wheels = [ [[package]] name = "vss-ctx-rag" -version = "3.0.0rc11" +version = "3.0.0" source = { editable = "." } dependencies = [ { name = "bleach" }, @@ -4937,7 +4937,7 @@ provides-extras = ["docs", "arango", "nat"] [[package]] name = "vss-ctx-rag-arango" -version = "3.0.0rc11" +version = "3.0.0" source = { editable = "packages/vss_ctx_rag_arango" } dependencies = [ { name = "langchain-arangodb" }, @@ -4958,7 +4958,7 @@ requires-dist = [ [[package]] name = "vss-ctx-rag-nat" -version = "3.0.0rc11" +version = "3.0.0" source = { editable = "packages/vss_ctx_rag_nat" } dependencies = [ { name = "vss-ctx-rag" },