From 627dd8b7fffaba22211ea9f78ab6f3937c884e95 Mon Sep 17 00:00:00 2001 From: hoangducnhatminh Date: Thu, 26 Mar 2026 16:30:05 +0700 Subject: [PATCH 1/3] use open source vllm and vi --- docs/livekit-agent-tutorial.md | 400 ++++++++++++++++++++++++ docs/livekit-agent-tutorial.pdf | Bin 0 -> 351146 bytes examples/prompts.py | 14 + examples/tools.py | 15 + examples/voice_agent.py | 103 ++++-- src/local_livekit_plugins/__init__.py | 7 +- src/local_livekit_plugins/vieneu_tts.py | 163 ++++++++++ test_vieneu.py | 38 +++ 8 files changed, 718 insertions(+), 22 deletions(-) create mode 100644 docs/livekit-agent-tutorial.md create mode 100644 docs/livekit-agent-tutorial.pdf create mode 100644 examples/prompts.py create mode 100644 examples/tools.py create mode 100644 src/local_livekit_plugins/vieneu_tts.py create mode 100644 test_vieneu.py diff --git a/docs/livekit-agent-tutorial.md b/docs/livekit-agent-tutorial.md new file mode 100644 index 0000000..e722382 --- /dev/null +++ b/docs/livekit-agent-tutorial.md @@ -0,0 +1,400 @@ +# LiveKit Voice Agent: Behind the Scenes + +This guide explains how LiveKit's `AgentSession` coordinates multiple AI models (VAD, STT, LLM, TTS) into a seamless real-time voice experience. + +## High-Level Architecture + +The `AgentSession` acts as the "brain" or "orchestrator" of the voice agent. It manages the full lifecycle of a conversation by linking several components together: + +```mermaid +graph TD + A["Room (rtc.Room)"] -->|Audio Stream| B[VAD] + B -->|Speech Detected| C[Audio Buffer] + C -->|Speech Ended| D[STT] + D -->|Transcript| E[LLM] + E -->|Text Stream| F[TTS] + F -->|Audio Stream| G[Audio Source] + G -->|Agent Voice| A +``` + +### 🧠 Key Concepts: Server vs. Room +Before diving into the components, it’s crucial to understand two terms that are often used interchangeably: + +> [!TIP] +> **LiveKit Server = The Building** (The physical software running on a machine). It provides the infrastructure to route data. +> +> **LiveKit Room = A Conference Room** (A logical space created inside the server). It is the specific context where participants interact. +> +> **Key Difference**: One **Server** can host thousands of **Rooms**. When the agent joins, it connects to a specific **Room** *on* a specific **Server**. + +### 1. Voice Activity Detection (VAD) +**The Trigger**: VAD is always listening to the incoming audio track from the room. +- **How it works**: It looks for patterns in the audio energy consistent with human speech. +- **Behind the scenes**: + - **Audio Path**: `AgentSession` runs a background task (`_forward_audio_task`) that continuously pulls raw audio frames from the participant's track. + - **Parallel Processing**: These frames are pushed into two separate internal queues simultaneously: one for the **VAD** and one for the **STT**. + - **VAD Decision**: The VAD model (like Silero) processes the stream and emits events (`START_OF_SPEECH`, `END_OF_SPEECH`). + - **Buffering Control**: When VAD detects `START_OF_SPEECH`, the session enters a "speaking" state. It continues to collect audio in the STT buffer until VAD detects `END_OF_SPEECH` and the "endpointing delay" (silence threshold) has passed. +- **Implementation**: In your code, you use `silero.VAD.load()`, which is a highly efficient local VAD model. + +### 2. Speech-to-Text (STT) +**The Translator**: Once the VAD identifies a complete utterance, the buffered audio is sent to the STT model. + +#### 🛠️ Internal Step-by-Step: +1. **Frame Collection**: While the user is speaking, LiveKit collects audio in **20ms chunks** (standard WebRTC frames). These are stored in an `AudioBuffer`. +2. **Trigger**: As soon as the VAD detects silence (exceeding the `min_silence_duration`), it "vends" the entire collected buffer to the STT. +3. **Normalization**: The [FasterWhisperSTT](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/faster_whisper_stt.py#L133-L142) plugin converts the raw `int16` audio data (which ranges from -32768 to 32767) into `float32` values normalized between **[-1.0, 1.0]**. +4. **Inference**: The normalized array is passed to the `faster-whisper` model. + - **Chunk Sizes**: Whisper models internally work on **30-second windows**. If your speech is shorter, it is padded; if longer, it is processed in overlapping blocks. + - **Beam Search**: The model explores multiple possible text paths (defined by `beam_size`) to find the most likely sentence. +5. **Reconstruction**: The model returns "segments". The plugin joins these segments into a single string of text. +6. **Handoff**: The text is wrapped in a `SpeechEvent` and sent to the LLM via the `ChatContext`. + +#### 🚀 Local Integration: +- **[FasterWhisperSTT](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/faster_whisper_stt.py)**: A custom-built local plugin for this project. +- **Why Faster-Whisper?**: It is an implementation of OpenAI's Whisper model using CTranslate2, which is up to **4x faster** than the original version and uses significantly less memory. + +### 3. Large Language Model (LLM) +**The Intelligence**: The transcript from the STT is added to the conversation history (`ChatContext`) and sent to the LLM. +- **How it works**: The LLM processes the message and generates a response. To keep latency low, it usually **streams** its response word-by-word or sentence-by-sentence. +- **Implementation**: In the example, `lk_openai.LLM.with_ollama(...)` allows you to use a local model (via Ollama) using the standard OpenAI protocol. + +### 4. Text-to-Speech (TTS) +**The Voice**: As the LLM generates text chunks, they are immediately fed into the TTS engine. +- **How it works**: The TTS converts the text back into audio. +- **Local Integration**: + - **[PiperTTS](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/piper_tts.py)**: This plugin creates a `_PiperChunkedStream`. It synthesizes audio for each text block provided by the LLM. It uses a thread pool to handle the synthesis without blocking the main event loop. +- **Real-Time Synergy**: LiveKit matches the timing of the TTS audio output with the room's clock to ensure a smooth, conversational feel. + +--- + +## The "Magic" of `AgentSession` + +What makes the LiveKit Agents SDK special is how it handles the **complex edge cases** that occur during real conversations: + +### 🔇 Turn Detection & Endpointing +`AgentSession` doesn't just wait for the user to stop talking. It uses an **endpointing delay** (e.g., 500ms). If the user pauses for longer than this, it assumes they are finished. This prevents the agent from cutting the user off mid-sentence. + +### ✋ Interruptions +If the user starts talking while the agent is still speaking, `AgentSession` detects this via the VAD. +- It immediately **stops** the agent's current audio playback. +- It **discards** any pending audio chunks in the TTS queue. +- It **cancels** the LLM generation task. +- This creates the natural experience where the agent stops immediately when you "talk over" it. + +### 🔄 State Management +The session manages a state machine for both the user and the agent: +- `user_state`: `listening` ↔ `speaking` +- `agent_state`: `listening` ↔ `thinking` ↔ `speaking` + +You can see this in [voice_agent.py](file:///home/vrh3/workspace/projects/voice-agent/examples/voice_agent.py#L215-L222), where latency is tracked by measuring the time between `user_input_transcribed` and `agent_state == "speaking"`. + +--- + +## Code Highlight: The Setup in `voice_agent.py` + +When you return the `AgentSession` object: + +```python +return AgentSession( + stt=FasterWhisperSTT(...), # Custom local model + llm=lk_openai.LLM(...), # OpenAI-compatiable local LLM + tts=PiperTTS(...), # Custom local voice + vad=silero.VAD.load(), # Standard VAD plugin +) +``` + +You are essentially providing the session with its vital organs. The session itself provides the "nervous system" that makes them all work together automatically without you having to write the networking or audio synchronization code yourself. +--- + +## The Engine: Background Tasks + +To provide a real-time experience, the system runs several asynchronous tasks in the background. Here is a breakdown of the most important ones: + +### 🌐 Connection & Infrastructure +- **`_job_ctx_connect`**: The initial task that connects your agent worker to the LiveKit Server. +- **`_forward_audio_task`**: The high-level loop that constantly pulls audio frames from the room and feeds them into the system's "ears." +- **`_update_activity`**: Manages the transitions between different agent behaviors (e.g., if you have multiple agents in one session). + +### ❤️ The Heart (AgentActivity) +- **`_scheduling_task`**: The "Main Loop" of your agent. It monitors the speech queue and decides when to transition between states: `listening` → `thinking` → `speaking`. +- **`_tts_task`**: Created every time the agent needs to speak. It handles the text synthesis (e.g., via Piper) and forwards the audio to the room. +- **`_on_enter_task` / `_on_exit_task`**: Lifecycle hooks that run your custom logic when an agent initializes or shuts down. + +### 👂 The Senses (AudioRecognition) +- **`_vad_task`**: Continuously processes audio frames through the VAD model (Silero) to detect speech vs. silence. +- **`_stt_task`**: Manages the STT engine (FasterWhisper). It waits for the VAD's signal to know when to start and stop transcription. +- **`_end_of_turn_task`**: The "Patience" task. It waits for the 0.5s silence delay after speech stops to see if the user is truly finished or just pausing. + +### 🔊 The "Last Mile" (RoomIO) +- **`_forward_audio`**: Sends the synthesized audio from the agent's TTS back into the room's participant track. +- **`_wait_for_playout`**: A delicate task that ensures the agent doesn't start thinking about its *next* response until the *current* audio has actually finished playing in the user's ears. + +You can see these tasks being created in the [AgentSession](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_session.py) and [AgentActivity](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py) source files. +--- + +## The Brain: LLM Prompting & Tools + +The LLM is the core decision-maker of your agent. Here is how it interacts with your code and the user: + +### 📝 How is the model prompted? +The "Instruction" you provide during the `Agent` initialization is treated as the **System Prompt**. +- **Location**: In your `VoiceAssistant` class ([voice_agent.py:92-101](file:///home/vrh3/workspace/projects/voice-agent/examples/voice_agent.py#L92-L101)), the `instructions` argument is passed to the base `Agent` class. +- **Behind the scenes**: Under the hood, the SDK injects these instructions as the first message in the `ChatContext` with the role `system`. + +### 📖 Does it handle conversation history? +**Yes, completely.** +- `AgentSession` maintains a `ChatContext` object that acts as a short-term memory. +- Every time the user speaks, their transcript is added as a `user` message. +- Every time the agent responds, its reply is added as an `assistant` message. +- This entire context is sent to the LLM on every turn, allowing it to remember what was said earlier (e.g., answering "What did I just say?"). + +### 🛠️ Does it handle tool calls? +**Yes, the SDK provides a robust framework for function calling.** +- **Integration**: You can define Python functions and pass them to the `Agent` or `AgentSession` in the `tools` list. +- **Execution**: If the LLM decides to use a tool, it emits a "tool call" chunk. The `AgentActivity` intercepts this, runs your Python function, captures the output, and automatically sends it back to the LLM to continue the response. +- **Example Flow**: + 1. User: "What's the weather in London?" + 2. LLM: `[Tool Call: get_weather(city="London")]` + 3. System: (Runs your local function) -> "Sunny, 20°C" + 4. LLM: "The weather in London is sunny and 20°C." + +You can see how the instructions and history are managed in the [Agent](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent.py) and [AgentActivity](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py) files. +--- + +## The Room: Communication Hub + +If the `AgentSession` is the brain, the **Room (`rtc.Room`)** is the physical space where the conversation happens. + +### 🏢 What is a Room? +A LiveKit Room is a real-time session that connects multiple users and bots together. It acts as the central router for all audio, video, and data. + +### 👥 Key Concepts inside a Room +- **Participants**: Everyone in the room (including your Agent) is a `Participant`. + - **Local Participant**: This is your Agent itself. + - **Remote Participants**: These are the human users or other bots connected to the same room. +- **Tracks**: The actual streams of data. + - **Audio Track**: What the VAD listens to and what the TTS publishes to. + - **Video Track**: Used for vision-based agents or avatars. +- **Publications**: When a participant "shares" a track with the room, they **Publish** it. Your agent's TTS publishes an audio track so others can hear it. +- **Subscriptions**: To hear someone, you must **Subscribe** to their track. The `AgentSession` automatically subscribes to the users' audio tracks so it can "hear" them. + +### 🔗 Relationship with AgentSession +The `AgentSession` is essentially a specialized LiveKit client that: +1. **Joins** a Room. +2. **Scans** for human participants. +3. **Subscribes** to their audio. +4. **Pipes** that audio into the VAD and STT. +5. **Generates** its own audio and **Publishes** it back into the same Room. + +Without the Room, the Agent would be "locked in a dark box" with no way to receive input or send output. + +--- + +## The Senses: Silero VAD + +**Silero VAD** is the "ears" of your agent that distinguish between speech and background noise. + +### 🧠 What is Silero VAD? +Silero is a pre-trained, high-performance Voice Activity Detection (VAD) model. In this project, it runs locally using the **ONNX Runtime**, making it extremely fast and private. + +### ⚙️ How it works +The VAD doesn't "understand" words; it only calculates the **probability** that a chunk of audio contains human speech. +- **Windowing**: It processes audio in small windows (usually 32ms). +- **Probability**: For each window, it outputs a value between 0.0 and 1.0. +- **State Machine**: It uses several buffers and thresholds to decide when someone has *started* and *stopped* speaking. + +### 🛠️ Key Parameters (Tweaking Performance) +You can find these in the `silero.VAD.load()` call: +- **`activation_threshold` (default 0.5)**: If the model is >50% sure it's speech, it marks it as active. +- **`min_speech_duration` (default 0.05s)**: Prevents accidental triggers from very short noises (like a cough or a click). +- **`min_silence_duration` (default 0.55s)**: How long the user must be silent before the VAD says "they stopped speaking." +- **`prefix_padding_duration` (default 0.5s)**: One of the most important settings. It keeps a "pre-roll" buffer of audio so that when speech is detected, the *beginning* of the sentence isn't cut off. + +### 🖥️ CPU vs GPU +By default, Silero VAD in this project **uses the CPU** (`force_cpu=True`). + +**Why not the GPU?** +- **Data Transfer Overhead**: Silero is a very "light" model. The time it takes to move audio data from your system RAM to the GPU's VRAM (and back) is often greater than the time it takes the CPU to just run the calculation. +- **Latency**: For real-time voice, every millisecond counts. Running VAD on the CPU eliminates the bus latency associated with the GPU. +- **Efficiency**: It saves your GPU's power and memory for much heavier tasks, like running the LLM (Ollama/vLLM) or a vision model. + +You can see this logic in [onnx_model.py:43-49](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/plugins/silero/onnx_model.py#L43-L49). + +### 🚀 Why Silero? +- **Local & Private**: No audio leaves your server for voice detection. +- **Efficiency**: It is much lighter than running a full STT model (like Whisper) continuously. +- **Robustness**: It is specifically trained to handle various backgrounds, accents, and languages. + +You can dive deeper into the implementation in the [silero/vad.py](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/plugins/silero/vad.py) source file. + +--- + +## RTC: The Infrastructure + +While the `livekit.agents` package handles the "AI logic," the **`livekit.rtc`** package handles the "networking and media." + +### 🔌 What is RTC? +**RTC** stands for **Real-Time Communication**. It is the technology that allows audio and video to travel across the internet with almost zero delay (less than 200ms). + +### 🛠️ What does the RTC layer do? +Think of the RTC layer as the **"Broadcasting Station"** and the **"Wire"**: +- **Connection Management**: It handles the complexities of WebRTC (ICE, STUN, TURN) to make sure your agent can connect to the LiveKit server, even through firewalls. +- **Media Streaming**: It breaks your audio (from TTS) into tiny packets and sends them over the network. It also "paints" incoming packets back into audio frames for your VAD and STT. +- **Synchronization**: It ensures that audio and video stay in sync (lip-sync). +- **Resampler**: It can change the sample rate of audio on the fly (e.g., converting 48KHz high-quality music to 16KHz for a voice model). + +### 🪜 The Hierarchy +1. **Application Layer**: Your `VoiceAssistant` in `voice_agent.py`. (Your logic) +2. **Agents Layer**: `AgentSession`, `VAD`, `STT`, `LLM`. (Artificial Intelligence) +3. **RTC Layer**: `Room`, `Participant`, `AudioTrack`, `AudioFrame`. (Connectivity & Media) + +Without the RTC layer, you would have an AI that can "think" and "generate" speech, but no way to send it to a human user or hear what they are saying. + +--- + +## The Hub: LiveKit Server + +The **LiveKit Server** is the central "switchboard" or "router" that makes everything possible. + +### 🔌 What is it? +LiveKit is an open-source, high-performance WebRTC server. Its primary job is to connect participants (users and agents) and route their audio/video streams efficiently. + +### 🏗️ SFU Architecture (Selective Forwarding Unit) +Unlike older video conferencing tech that "mixes" everyone's audio into one stream (which is slow and heavy), LiveKit uses an **SFU** model: +- **Routing, not Mixing**: It receives your agent's audio once and "forwards" it to every subscribed user. It doesn't need to peek inside the audio data, making it extremely fast. +- **Adaptive**: If a user has a bad internet connection, the server can send them a lower-quality version of the stream without affecting other users. + +### 🔑 Why is it "The Hub"? +1. **Orchestration**: It decides who is in which room and who is allowed to speak. +2. **Signaling**: It handles the "handshake" between your agent worker and the users. +3. **Connectivity**: It includes built-in **STUN/TURN** servers to help participants connect even when they are behind complex office firewalls. +4. **Scalability**: You can run one server for a small app, or a cluster of servers to support millions of concurrent users. + +4. **Scalability**: You can run one server for a small app, or a cluster of servers to support millions of concurrent users. + +### 🔗 How your Agent connects +Your agent worker (the code you run) connects to the server using: +- **`LIVEKIT_URL`**: The address of the server (e.g., `wss://your-project.livekit.cloud`). +- **`LIVEKIT_API_KEY` / `SECRET`**: Used to generate access tokens so the server knows your agent is authorized to join the room. + +In this architecture, the **Server** is the cloud (or self-hosted) infrastructure, while your **Agent Worker** is the "local" brain that provides the intelligence. + +--- + +## Audio Data: The AudioBuffer + +To understand how the agent "hears," you need to know exactly how audio is packaged. + +### 📦 What is an AudioBuffer? +In the LiveKit SDK, an [`AudioBuffer`](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/utils/audio.py#L16) is a flexible container. It is defined as: +```python +AudioBuffer = Union[list[rtc.AudioFrame], rtc.AudioFrame] +``` +This means it can be a single unit of audio or a collection of many units (which is what the VAD sends to the STT). + +### 🎞️ Anatomy of an AudioFrame +An **`AudioFrame`** is the "brick" that builds the wall of sound. It contains four critical pieces of information: + +1. **`data`**: The raw sound. It is stored as **bytes**. + - **Format**: Usually 16-bit signed integers (PCM). + - **Size**: `samples_per_channel * num_channels * 2 bytes`. +2. **`sample_rate`**: How many "snapshots" of sound are taken per second (e.g., `16000` for Whisper, `48000` for high-quality audio). +3. **`num_channels`**: `1` for mono (standard for voice models) or `2` for stereo. +4. **`samples_per_channel`**: How many snapshots are in *this* specific frame. + +### 🔄 The Flow of Data: From Voice to Text + +The journey of a single "Hello" from your mouth to the agent's brain involves several hops: + +```mermaid +sequenceDiagram + participant User as 🎙️ Human User + participant Room as 🏢 LiveKit Room + participant Agent as 🤖 Agent Worker + participant VAD as 👂 VAD (Silero) + participant STT as 👄 STT (Whisper) + + Note over User,Room: The Room is hosted by the LiveKit Server (SFU) + User->>Room: 1. Publish Audio (20ms Opus frames) + Room->>Agent: 2. Forward Audio (Subscription) + Agent->>VAD: 3. Feed 20ms PCM frames + VAD->>VAD: 4. Detecting Speech? + loop During Speech + Agent->>Agent: 5. Store frames in AudioBuffer + end + VAD->>Agent: 6. Speech Ended (Silence detected) + Agent->>STT: 7. Hand over full AudioBuffer + STT->>Agent: 8. "Hello" (Text) +``` + +#### 1. 🎙️ Why is the Server the "First Contact" for the Agent? +While the **User** is the actual source, your **Agent Worker** doesn't talk directly to the user's phone. They both connect to the **LiveKit Server**. +- The user **Publishes** their audio to the server. +- The agent **Subscribes** to that audio. +- The server is the "meeting point" where the data handoff happens. + +#### 2. ⚡ Step-By-Step Breakdown: +1. **Capture**: Your microphone captures sound and converts it to digital signals. + - *Implemented by*: Browser/Client App via `navigator.mediaDevices.getUserMedia` (Web API). +2. **Packetization**: Your browser/app breaks the sound into **20ms packets** (usually compressed with **Opus** to save bandwidth). + - *Implemented by*: libwebrtc (C++ engine) inside the browser. +3. **Handoff**: These packets travel over the internet to the **LiveKit Server**. + - *Implemented by*: Standard WebRTC/UDP transport protocols. +4. **Routing**: The server quickly identifies that the Agent is interested in this audio and "forwards" the packets immediately. + - *Implemented by*: LiveKit Server (Go) `SelectiveForwardingUnit` (SFU) logic. +5. **Reconstruction**: The Agent Worker receives the packets, decodes them back to raw **PCM**, and creates an `rtc.AudioFrame`. + - *Implemented by*: [AudioStream._run](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/rtc/audio_stream.py#L263) receives FFI events and [AudioFrame._from_owned_info](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/rtc/audio_frame.py#L125) builds the Python object. +6. **Sensing (VAD)**: The `AgentSession` feeds every 20ms frame into the Silero VAD. + - *Implemented by*: [AudioRecognition.push_audio](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/audio_recognition.py#L150) sends the frame to the VAD and STT internal channels. +7. **Collecting**: If the VAD says "this is speech," the session starts piling these 20ms "bricks" into an `AudioBuffer`. + - *Implemented by*: [AudioRecognition._on_vad_event](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/audio_recognition.py#L434) handles speech state, while the frames are queued in the [STTNode](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/audio_recognition.py#L616). +8. **Translating (STT)**: Once the user stops talking (detected by silence), the entire pile of bricks is sent to the Whisper model to be translated into text. + - *Implemented by*: [FasterWhisperSTT._recognize_impl](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/faster_whisper_stt.py#L133) which normalizes the full buffer and runs the whisper inference. + +You can see the helper functions for managing these buffers (like `combine_frames`) in the [utils/audio.py](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/utils/audio.py) file. +--- + +### 🧠 The Intelligence & Voice: Flow of Text + +Once the "Hello" is translated into text, the "thinking" and "speaking" phase begins: + +```mermaid +sequenceDiagram + participant STT as 👄 STT (Whisper) + participant Act as ⚙️ AgentActivity + participant LLM as 🧠 LLM (vLLM/Ollama) + participant TTS as 🗣️ TTS (Piper) + participant Room as 🏢 LiveKit Room + participant User as 🎙️ Human User + + STT->>Act: 1. Final Transcript ("Hello") + Act->>Act: 2. Update ChatContext (User: "Hello") + Act->>LLM: 3. chat(chat_ctx, tools) + loop Streaming Response + LLM->>Act: 4. Text Chunk ("Hi") + LLM->>Act: 5. Text Chunk (" there!") + Act->>TTS: 6. push_text("Hi there!") + end + Note over TTS: Synthesizing Audio... + TTS->>Room: 7. Publish AudioFrames + Room->>User: 8. Forward Audio (Subscription) + User->>Room: 9. Playout complete (Signal) + Room->>Act: 10. Playout complete +``` + +#### ⚡ Step-By-Step Breakdown: +1. **Context Update**: The transcript is added to the `ChatContext` (the Agent's short-term memory). + - *Implemented by*: [AgentActivity._pipeline_reply_task](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py#L1702) (Inserts the message into `chat_ctx`). +2. **Inquiry**: `AgentActivity` sends the full conversation history to the Language Model (LLM). + - *Implemented by*: `perform_llm_inference` (internal function in [agent_activity.py](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py#L1714)). +3. **Streaming**: The LLM sends back text chunks as they are generated (you don't wait for the full sentence). + - *Implemented by*: LLM yielding `ChatChunk` objects via `llm_gen_data.text_ch`. +4. **Synthesis**: Each text chunk is immediately sent to the **Piper TTS** model to be turned into audio. + - *Implemented by*: [PiperTTS.synthesize](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/piper_tts.py#L196) and its internal [synthesis bridge](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/piper_tts.py#L73). +5. **Broadcasting**: The Agent publishes the resulting audio frames back into the **Room**. + - *Implemented by*: [AudioEmitter.push](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/tts/tts.py#L717) and [AudioSource.capture_frame](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/rtc/audio_source.py#L102). +6. **Playout**: Your browser/app receives these audio packets, decodes them, and plays them through your speakers. + - *Implemented by*: Client-side WebRTC engine; completion tracked in [agent_activity.py:on_playout_done](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py#L948). + +You can see the coordination logic in the [AgentActivity](file:///home/vrh3/workspace/projects/voice-agent/.venv/lib/python3.12/site-packages/livekit/agents/voice/agent_activity.py) and the synthesis loop in [PiperTTS](file:///home/vrh3/workspace/projects/voice-agent/src/local_livekit_plugins/piper_tts.py#L182-L210). diff --git a/docs/livekit-agent-tutorial.pdf b/docs/livekit-agent-tutorial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c14c6b171ce616547fa214e0b8572633a33b4eec GIT binary patch literal 351146 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≶%eOcNnbwJ#}20>bQy64-Spd~CWwOxRd6n}mQK)1CL&V6m2n{NPGfFfqBK6NJsogJN@)T)X zD#DfK=el+d7<;ovyv_j~+#8jr5289FfRNjSxyEhfc>^!&-ig+Cz169g9d3#w2qrEv zg4Jf#jgtGrn2DHZzg|fD{qs?40D+qX_?$C*B(xfBJjTG-KypQ8IyAk(VjC2O?qf)| zg4vjhu4l))NU&i7@;8I$Z^BtRuTV!Pn00^*Spp)a0n?#Diid(|N6S*ptVvo5CjT;< zs`Qe}2Nja_Cp#;i8A8oeb>=1=&27jABb88Ds%6KdKKPQDlq^shmzzV(LKUFtG`bK-zOH5$!Gv(lTi;T5Z$ z$-CRWA_z?r+|QQxfWU0fTP%#v&M&vTd_<~js?4CM(n9hOd?taTAa*@p`c{P%0U^hJ z%45)AkEVC(a;AIOKIXh*gFiuvYU|g=dH~`MWL?`QNdR`p2^$`~O2w6mgMz7Xw9U9h z4{o(xG=o_;a2XMILpEVSCu0*L3%06s`6 z?;NBf+4N39mu^*%=uK*@kbuSt5o!BE$Vf^vH)wZM%B-?MO&HH~b8u>1iy2$mBX)(g zCyq-Uj>Q)-P}xLP>XT>+$3xqidEmQsa{0B8z7rQNa&t6oKtvohWUCQ|K6><+di%|GGKg2>{#dx+Vy>

    Km)N2z7^?IPG(A;1Yhpn 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

    <6 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

      }Cc&k|FUd@;`@5 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 str: + """Trả về ngày giờ hiện tại ở định dạng dễ đọc.""" + now = datetime.now() + # Format: Thứ Năm, 26 tháng 03 năm 2026, 16:00:39 + # In Vietnamese + days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] + day_str = days[now.weekday()] + return f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" diff --git a/examples/voice_agent.py b/examples/voice_agent.py index 41fef9a..02e4196 100644 --- a/examples/voice_agent.py +++ b/examples/voice_agent.py @@ -37,20 +37,24 @@ # Add parent directory to path for local development (must be before other imports) sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src")) +from datetime import datetime from dotenv import load_dotenv -# Load environment variables from examples/.env.local (must be before plugin imports) + +# Load environment variables (try .env.local first, then .env) _script_dir = os.path.dirname(os.path.abspath(__file__)) load_dotenv(os.path.join(_script_dir, ".env.local")) +load_dotenv(os.path.join(_script_dir, ".env")) # LiveKit imports - plugins must be imported on main thread from livekit import agents -from livekit.agents import AgentSession, Agent, RoomInputOptions +from livekit.agents import AgentSession, Agent, RoomInputOptions, llm + from livekit.plugins import silero from livekit.plugins import openai as lk_openai # Local plugins -from local_livekit_plugins import FasterWhisperSTT, PiperTTS +from local_livekit_plugins import FasterWhisperSTT, VieNeuTTS, PiperTTS # Configure logging logging.basicConfig( @@ -68,27 +72,63 @@ # Local pipeline settings WHISPER_MODEL = os.getenv("WHISPER_MODEL", "medium") WHISPER_DEVICE = os.getenv("WHISPER_DEVICE", "cuda") +STT_PROVIDER = os.getenv("STT_PROVIDER", "faster_whisper").lower() +VLLM_ASR_MODEL = os.getenv("VLLM_ASR_MODEL", "qwen3asr") +VLLM_ASR_BASE_URL = os.getenv("VLLM_ASR_BASE_URL", "http://10.148.180.105:1670/v1") +TTS_PROVIDER = os.getenv("TTS_PROVIDER", "vieneu").lower() PIPER_MODEL_PATH = os.getenv("PIPER_MODEL_PATH", "") PIPER_USE_CUDA = os.getenv("PIPER_USE_CUDA", "false").lower() == "true" + +VIENEU_API_BASE = os.getenv("VIENEU_API_BASE", "http://localhost:23333/v1") +VIENEU_MODEL_NAME = os.getenv("VIENEU_MODEL_NAME", "pnnbao-ump/VieNeu-TTS") +VIENEU_VOICE_ID = os.getenv("VIENEU_VOICE_ID", "") # e.g. "nu_m_001" + +LLM_PROVIDER = os.getenv("LLM_PROVIDER", "ollama").lower() +LANGUAGE = os.getenv("LANGUAGE", "vi").lower() # "vi" or "en" OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "llama3.1:8b") OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1") +VLLM_MODEL = os.getenv("VLLM_MODEL", "qwen3_vl") +VLLM_BASE_URL = os.getenv("VLLM_BASE_URL", "http://10.148.180.105:22003/v1") # ============================================================================= # Agent Definition # ============================================================================= +from tools import AssistantFnc + + class VoiceAssistant(Agent): """A simple voice assistant that responds to user queries.""" - def __init__(self) -> None: + def __init__(self, tools: list[llm.FunctionTool] | None = None) -> None: + now = datetime.now() + days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] + day_str = days[now.weekday()] + current_time_str = f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" + + from prompts import VIETNAMESE_RESPONSE_SYSTEM_PROMPT, ENGLISH_RESPONSE_SYSTEM_PROMPT + + # Select prompt based on desired language + if LANGUAGE == "en": + base_prompt = ENGLISH_RESPONSE_SYSTEM_PROMPT + # For dynamic instructions in English + now_msg = f"Current time is: {now.strftime('%A, %d/%m/%Y %H:%M:%S')}." + else: + base_prompt = VIETNAMESE_RESPONSE_SYSTEM_PROMPT + now_msg = f"Hiện tại là: {current_time_str}." + + instructions=f"{now_msg}\n\n{base_prompt}" + super().__init__( - instructions="""You are a helpful voice AI assistant. - Keep your responses concise and conversational - aim for 1-2 sentences. - Be friendly and natural in your speech patterns.""" + instructions=instructions, + tools=tools, ) + + + # ============================================================================= # Pipeline Factories # ============================================================================= @@ -105,30 +145,52 @@ def create_local_session() -> AgentSession: logger.info("=" * 60) logger.info("STARTING LOCAL PIPELINE") logger.info("=" * 60) - logger.info(f" STT: FasterWhisper ({WHISPER_MODEL} on {WHISPER_DEVICE})") - logger.info(f" LLM: Ollama ({OLLAMA_MODEL})") - logger.info(f" TTS: Piper (CUDA: {PIPER_USE_CUDA})") + if STT_PROVIDER == "vllm": + logger.info(f" STT: vLLM ({VLLM_ASR_MODEL})") + else: + logger.info(f" STT: FasterWhisper ({WHISPER_MODEL} on {WHISPER_DEVICE})") + if LLM_PROVIDER == "vllm": + logger.info(f" LLM: vLLM ({VLLM_MODEL})") + else: + logger.info(f" LLM: Ollama ({OLLAMA_MODEL})") + + if TTS_PROVIDER == "piper": + logger.info(f" TTS: Piper (CUDA: {PIPER_USE_CUDA})") + if not PIPER_MODEL_PATH: + raise ValueError( + "PIPER_MODEL_PATH not set. Download a voice model from:\n" + "https://huggingface.co/rhasspy/piper-voices" + ) + else: + logger.info(f" TTS: VieNeu ({VIENEU_MODEL_NAME} at {VIENEU_API_BASE})") + logger.info("=" * 60) - if not PIPER_MODEL_PATH: - raise ValueError( - "PIPER_MODEL_PATH not set. Download a voice model from:\n" - "https://huggingface.co/rhasspy/piper-voices" - ) - return AgentSession( - stt=FasterWhisperSTT( + stt=lk_openai.STT( + model=VLLM_ASR_MODEL, + base_url=VLLM_ASR_BASE_URL, + detect_language=True, + ) if STT_PROVIDER == "vllm" else FasterWhisperSTT( model_size=WHISPER_MODEL, device=WHISPER_DEVICE, compute_type="float16" if WHISPER_DEVICE == "cuda" else "int8", + language=None, # Enable auto-detection ), - llm=lk_openai.LLM.with_ollama( + llm=lk_openai.LLM( + model=VLLM_MODEL, + base_url=VLLM_BASE_URL, + ) if LLM_PROVIDER == "vllm" else lk_openai.LLM.with_ollama( model=OLLAMA_MODEL, base_url=OLLAMA_BASE_URL, ), tts=PiperTTS( model_path=PIPER_MODEL_PATH, use_cuda=PIPER_USE_CUDA, + ) if TTS_PROVIDER == "piper" else VieNeuTTS( + api_base=VIENEU_API_BASE, + model_name=VIENEU_MODEL_NAME, + voice_id=VIENEU_VOICE_ID if VIENEU_VOICE_ID else None, ), vad=silero.VAD.load(), ) @@ -199,10 +261,13 @@ def on_agent_state_changed(ev) -> None: # Start the agent session await session.start( room=ctx.room, - agent=VoiceAssistant(), + agent=VoiceAssistant(), # Removed tools for now due to vLLM server limitations room_input_options=RoomInputOptions(), ) + + + # Send initial greeting await session.generate_reply( instructions="Greet the user and let them know you're ready to help." diff --git a/src/local_livekit_plugins/__init__.py b/src/local_livekit_plugins/__init__.py index fab402b..e460796 100644 --- a/src/local_livekit_plugins/__init__.py +++ b/src/local_livekit_plugins/__init__.py @@ -10,10 +10,10 @@ PiperTTS: Fast local text-to-speech using Piper Example: - >>> from local_livekit_plugins import FasterWhisperSTT, PiperTTS + >>> from local_livekit_plugins import FasterWhisperSTT, VieNeuTTS >>> >>> stt = FasterWhisperSTT(model_size="medium", device="cuda") - >>> tts = PiperTTS(model_path="/path/to/voice.onnx") + >>> tts = VieNeuTTS(api_base="http://localhost:23333/v1") Repository: https://github.com/CoreWorxLab/local-livekit-plugins License: MIT @@ -24,5 +24,6 @@ from .faster_whisper_stt import FasterWhisperSTT from .piper_tts import PiperTTS +from .vieneu_tts import VieNeuTTS -__all__ = ["FasterWhisperSTT", "PiperTTS", "__version__"] +__all__ = ["FasterWhisperSTT", "PiperTTS", "VieNeuTTS", "__version__"] diff --git a/src/local_livekit_plugins/vieneu_tts.py b/src/local_livekit_plugins/vieneu_tts.py new file mode 100644 index 0000000..ba5d1bb --- /dev/null +++ b/src/local_livekit_plugins/vieneu_tts.py @@ -0,0 +1,163 @@ +""" +VieNeu-TTS Plugin for LiveKit Agents +==================================== + +High-quality Vietnamese text-to-speech with instant voice cloning. +Integrates the VieNeu-TTS remote client with LiveKit's streaming architecture. +""" + +from __future__ import annotations + +import asyncio +import logging +import sys +import uuid +import numpy as np +from pathlib import Path +from typing import TYPE_CHECKING, Optional, Any, Dict + +from livekit.agents import tts, APIConnectOptions + +if TYPE_CHECKING: + from livekit.agents.tts.tts import AudioEmitter + +# Add VieNeu-TTS source directory to path if it exists locally +_project_root = Path(__file__).parent.parent.parent +_vieneu_src = _project_root / "models" / "VieNeu-TTS" / "src" +if _vieneu_src.exists() and str(_vieneu_src) not in sys.path: + # Insert at the beginning to prefer the version in the models folder + sys.path.insert(0, str(_vieneu_src)) + +try: + from vieneu.remote import RemoteVieNeuTTS +except ImportError: + # This might happen during initial setup if paths aren't fully ready + RemoteVieNeuTTS = None + +logger = logging.getLogger(__name__) + +class VieNeuTTS(tts.TTS): + """ + LiveKit TTS plugin using VieNeu-TTS for high-quality Vietnamese speech. + + Args: + api_base: URL of the VieNeu-TTS server (e.g., LMDeploy server). + model_name: Name of the model registered on the server. + voice_id: Optional ID of a preset voice. If None, uses the model's default. + """ + + def __init__( + self, + api_base: str = "http://localhost:23333/v1", + model_name: str = "pnnbao-ump/VieNeu-TTS", + voice_id: Optional[str] = None, + ) -> None: + if RemoteVieNeuTTS is None: + raise ImportError( + "Could not find 'vieneu' package. Ensure 'models/VieNeu-TTS/src' is in your path." + ) + + super().__init__( + capabilities=tts.TTSCapabilities(streaming=False), + sample_rate=24000, # VieNeu standard sample rate + num_channels=1, + ) + + self._api_base = api_base + self._model_name = model_name + self._voice_id = voice_id + + logger.info(f"Connecting to VieNeu-TTS server at {api_base} (model: {model_name})") + + # Initialize client + self._client = RemoteVieNeuTTS( + api_base=api_base, + model_name=model_name + ) + + # Resolve voice data if specified + self._voice_data = None + if voice_id: + try: + # VieNeu preset voices are available via this call + self._voice_data = self._client.get_preset_voice(voice_id) + logger.info(f"VieNeuTTS initialized with voice: {voice_id}") + except Exception as e: + logger.error(f"Failed to resolve VieNeu voice '{voice_id}': {e}") + + def synthesize( + self, + text: str, + *, + conn_options: APIConnectOptions | None = None, + ) -> tts.ChunkedStream: + """ + Synthesize speech from Vietnamese text. + """ + if conn_options is None: + conn_options = APIConnectOptions() + + logger.debug(f"Synthesizing ({len(text)} chars) via VieNeu: {text[:50]}...") + + return _VieNeuChunkedStream( + tts_plugin=self, + input_text=text, + conn_options=conn_options, + ) + +class _VieNeuChunkedStream(tts.ChunkedStream): + """ + Manages the streaming response from the VieNeu-TTS server. + """ + + def __init__( + self, + *, + tts_plugin: VieNeuTTS, + input_text: str, + conn_options: APIConnectOptions, + ) -> None: + super().__init__(tts=tts_plugin, input_text=input_text, conn_options=conn_options) + self._plugin = tts_plugin + + async def _run(self, emitter: AudioEmitter) -> None: + """ + Execution loop for the synthesis stream. + """ + emitter.initialize( + request_id=str(uuid.uuid4()), + sample_rate=self._plugin.sample_rate, + num_channels=self._plugin.num_channels, + mime_type="audio/pcm", + ) + + loop = asyncio.get_running_loop() + + try: + # We run the blocking stream generator in a thread pool + def process_synthesis(): + # Get the stream generator from the client + gen = self._plugin._client.infer_stream( + self._input_text, + voice=self._plugin._voice_data + ) + + for audio_chunk in gen: + if audio_chunk is None or len(audio_chunk) == 0: + continue + + # VieNeu returns float32 numpy arrays [-1.0, 1.0] + # We convert to int16 PCM for LiveKit + pcm_chunk = (audio_chunk * 32767).astype(np.int16).tobytes() + + # Push directly to the emitter + emitter.push(pcm_chunk) + + # Run the synthesis and emission in a background thread + await loop.run_in_executor(None, process_synthesis) + + except Exception as e: + logger.exception(f"Unexpected error during VieNeu synthesis: {e}") + finally: + # Signal the end of the stream + emitter.flush() diff --git a/test_vieneu.py b/test_vieneu.py new file mode 100644 index 0000000..7c9445f --- /dev/null +++ b/test_vieneu.py @@ -0,0 +1,38 @@ +import logging +import sys +import os +from pathlib import Path + +# Add src to path +sys.path.insert(0, os.path.join(os.getcwd(), "src")) + +import asyncio +import local_livekit_plugins +print(f"📦 Imported local_livekit_plugins from: {local_livekit_plugins.__file__}") + +from local_livekit_plugins import VieNeuTTS + +logging.basicConfig(level=logging.INFO) + +async def test_init(): + try: + print("🚀 Testing VieNeuTTS initialization...") + # Note: VieNeuTTS will add models/VieNeu-TTS/src to sys.path itself + tts = VieNeuTTS( + api_base="http://localhost:23333/v1", + model_name="pnnbao-ump/VieNeu-TTS" + ) + print("✅ VieNeuTTS initialized successfully!") + + # Test synthesis capability (without streaming to room) + print("🗣️ Testing synthesis stream...") + stream = tts.synthesize("Xin chào, tôi là trợ lý ảo.") + print(f"✅ Stream created for: {stream.input_text}") + + except Exception as e: + print(f"❌ Test failed: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + asyncio.run(test_init()) From 3bad2fbca58cd535175027fe641669a6fd9e6e25 Mon Sep 17 00:00:00 2001 From: hoangducnhatminh Date: Thu, 26 Mar 2026 16:46:40 +0700 Subject: [PATCH 2/3] add tools --- examples/tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/tools.py b/examples/tools.py index cdb75a5..cdc516e 100644 --- a/examples/tools.py +++ b/examples/tools.py @@ -1,10 +1,10 @@ from datetime import datetime -from livekit.agents import llm +from livekit.agents.llm import function_tool class AssistantFnc: """Helper functions for the assistant.""" - @llm.function_tool(description="Hàm này trả về ngày giờ hiện tại.") + @function_tool(description="Hàm này trả về ngày giờ hiện tại.") def get_datetime(self) -> str: """Trả về ngày giờ hiện tại ở định dạng dễ đọc.""" now = datetime.now() From bc64f42b949663f5e2a8e7cc8bfea290f2345e02 Mon Sep 17 00:00:00 2001 From: hoangducnhatminh Date: Thu, 2 Apr 2026 15:44:14 +0700 Subject: [PATCH 3/3] version_with booking --- .claude/CLAUDE.md | 18 + .claude/docs/CLAUDE.md | 14 + .claude/docs/vinrobotics_introduction.md | 17 + .claude/skills/explain-code/SKILL.md | 13 + .claude/skills/notes/notes.md | 5 + .gitignore | 2 +- docs/mcp_tools.md | 183 +++ examples/prompts.py | 14 - examples/tools.py | 15 - examples/voice_agent.py | 288 ---- .../__init__.py | 0 .../faster_whisper_stt.py | 0 .../piper_tts.py | 0 .../vieneu_tts.py | 84 +- pyproject.toml | 5 +- {examples => scripts}/.env.local.example | 0 scripts/config.py | 49 + scripts/generic_agent.py | 38 + scripts/prompts.py | 64 + scripts/test_display.py | 32 + scripts/test_filter.py | 69 + scripts/tools.py | 53 + scripts/voice_agent.py | 430 ++++++ test_vieneu.py | 38 - uv.lock | 1222 ++++++++--------- 25 files changed, 1632 insertions(+), 1021 deletions(-) create mode 100644 .claude/CLAUDE.md create mode 100644 .claude/docs/CLAUDE.md create mode 100644 .claude/docs/vinrobotics_introduction.md create mode 100644 .claude/skills/explain-code/SKILL.md create mode 100644 .claude/skills/notes/notes.md create mode 100644 docs/mcp_tools.md delete mode 100644 examples/prompts.py delete mode 100644 examples/tools.py delete mode 100644 examples/voice_agent.py rename {src/local_livekit_plugins => local_livekit_plugins}/__init__.py (100%) rename {src/local_livekit_plugins => local_livekit_plugins}/faster_whisper_stt.py (100%) rename {src/local_livekit_plugins => local_livekit_plugins}/piper_tts.py (100%) rename {src/local_livekit_plugins => local_livekit_plugins}/vieneu_tts.py (61%) rename {examples => scripts}/.env.local.example (100%) create mode 100644 scripts/config.py create mode 100644 scripts/generic_agent.py create mode 100644 scripts/prompts.py create mode 100644 scripts/test_display.py create mode 100644 scripts/test_filter.py create mode 100644 scripts/tools.py create mode 100644 scripts/voice_agent.py delete mode 100644 test_vieneu.py diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000..ebfafbd --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1,18 @@ +CLAUDE.md should be a routing file, not a knowledge dump. Keep it under 150 lines. Point to .claude/rules/*.md for detailed specs and docs/ for architecture. + + + +### Auto-Update Memory (MANDATORY) + +**Update memory files AS YOU GO, not at the end.** When you learn something new, update immediately. + +| Trigger | Action | +|---------|--------| +| User shares a fact about themselves | → Update `memory-profile.md` | +| User states a preference | → Update `memory-preferences.md` | +| A decision is made | → Update `memory-decisions.md` with date | +| Completing substantive work | → Add to `memory-sessions.md` | + +**Skip:** Quick factual questions, trivial tasks with no new info. + +**DO NOT ASK. Just update the files when you learn something.** \ No newline at end of file diff --git a/.claude/docs/CLAUDE.md b/.claude/docs/CLAUDE.md new file mode 100644 index 0000000..49fe97b --- /dev/null +++ b/.claude/docs/CLAUDE.md @@ -0,0 +1,14 @@ +### Auto-Update Memory (MANDATORY) + +**Update memory files AS YOU GO, not at the end.** When you learn something new, update immediately. + +| Trigger | Action | +|---------|--------| +| User shares a fact about themselves | → Update `memory-profile.md` | +| User states a preference | → Update `memory-preferences.md` | +| A decision is made | → Update `memory-decisions.md` with date | +| Completing substantive work | → Add to `memory-sessions.md` | + +**Skip:** Quick factual questions, trivial tasks with no new info. + +**DO NOT ASK. Just update the files when you learn something.** \ No newline at end of file diff --git a/.claude/docs/vinrobotics_introduction.md b/.claude/docs/vinrobotics_introduction.md new file mode 100644 index 0000000..bdd21ab --- /dev/null +++ b/.claude/docs/vinrobotics_introduction.md @@ -0,0 +1,17 @@ +1. Thông tin chung về VinRobotics +- Tên đầy đủ: Công ty Cổ phần Nghiên cứu Phát triển và Ứng dụng Người máy VinRobotics. +- Ngày thành lập: 20/11/2024. +- Vốn điều lệ: 1.000 tỷ đồng. +- Cơ cấu cổ đông: Tập đoàn Vingroup (51%), ông Phạm Nhật Vượng (39%), ông Phạm Nhật Quân Anh (5%) và ông Phạm Nhật Minh Hoàng (5%). +- Lãnh đạo: Tổng Giám đốc là ông Ngô Quốc Hưng (người có nhiều kinh nghiệm trong lĩnh vực AI và Robotics). + +2. Lĩnh vực hoạt động và Mục tiêu +- VinRobotics không chỉ phục vụ hệ sinh thái của Vingroup mà còn hướng tới thị trường doanh nghiệp bên ngoài trong các ngành kinh tế trọng điểm. +- Nghiên cứu & Phát triển: Tập trung vào các giải pháp tự động hóa, robot công nghiệp và trí tuệ nhân tạo (AI). +- Sản xuất & Tích hợp: Chuyên về các loại người máy thông minh, robot nâng hạ, bốc xếp hàng hóa và các thiết bị máy móc chuyên dụng khác. +- Triết lý: "Công nghệ robot vị nhân sinh" – tối ưu hóa quy trình sản xuất và nâng cao hiệu quả công việc trong công nghiệp, dịch vụ và đời sống. + +3. Các thực thể liên quan (Hệ sinh thái Robotics của Vingroup) +- Ngoài VinRobotics, Vingroup còn thành lập các đơn vị chuyên biệt khác để bao phủ toàn diện mảng Humanoid và Physical AI: +- VinMotion: Tập trung vào phát triển robot hình người (Humanoid Robot) tích hợp Physical AI. Vào khoảng tháng 6/2025, VinMotion đã ra mắt nguyên mẫu robot hình người "Made in Vietnam" đầu tiên. +- VinDynamics: Chuyên về các giải pháp kỹ thuật tiên tiến cho thế hệ robot thông minh, làm chủ các công nghệ lõi để hỗ trợ con người trong cuộc sống hàng ngày. \ No newline at end of file diff --git a/.claude/skills/explain-code/SKILL.md b/.claude/skills/explain-code/SKILL.md new file mode 100644 index 0000000..44cbe17 --- /dev/null +++ b/.claude/skills/explain-code/SKILL.md @@ -0,0 +1,13 @@ +--- +name: explain-code +description: Explains code with visual diagrams and analogies. Use when explaining how code works, teaching about a codebase, or when the user asks "how does this work?" +--- + +When explaining code, always include: + +1. **Start with an analogy**: Compare the code to something from everyday life +2. **Draw a diagram**: Use ASCII art to show the flow, structure, or relationships +3. **Walk through the code**: Explain step-by-step what happens +4. **Highlight a gotcha**: What's a common mistake or misconception? + +Keep explanations conversational. For complex concepts, use multiple analogies. \ No newline at end of file diff --git a/.claude/skills/notes/notes.md b/.claude/skills/notes/notes.md new file mode 100644 index 0000000..a97c21d --- /dev/null +++ b/.claude/skills/notes/notes.md @@ -0,0 +1,5 @@ +Skills docx from aitmpl: https://app.aitmpl.com/component/skill/document-processing/docx +skills docx from claude: https://github.com/anthropics/skills/blob/main/skills/docx/SKILL.md +documents to build skills from claude: https://resources.anthropic.com/hubfs/The-Complete-Guide-to-Building-Skill-for-Claude.pdf + +https://code.claude.com/docs/en/hooks-guide \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5024bbd..fd1749e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ wheels/ *.egg-info/ .installed.cfg *.egg - +mcp/ # Virtual environments .venv/ venv/ diff --git a/docs/mcp_tools.md b/docs/mcp_tools.md new file mode 100644 index 0000000..1b07f3f --- /dev/null +++ b/docs/mcp_tools.md @@ -0,0 +1,183 @@ +# MCP Server Usage in AgentSession + +In the LiveKit Agents runtime, `mcp_servers` are used to provide external tools to a voice agent via the Model Context Protocol (MCP). Here's a breakdown of how they are integrated and used. + +## 1. Initialization in `AgentSession` + +`mcp_servers` is an optional argument in the `AgentSession` constructor. It is stored as a property and can be accessed by the session. + +```python +# livekit/agents/voice/agent_session.py + +class AgentSession(...): + def __init__( + self, + ..., + mcp_servers: NotGivenOr[list[mcp.MCPServer]] = NOT_GIVEN, + ... + ) -> None: + ... + self._mcp_servers = mcp_servers or None + + @property + def mcp_servers(self) -> list[mcp.MCPServer] | None: + return self._mcp_servers +``` + +## 2. Managing MCP Tools with `AgentActivity` + +The `AgentSession` manages one or more `AgentActivity` instances. When an `AgentActivity` starts, it initializes the MCP servers and discovers their available tools. + +```python +# livekit/agents/voice/agent_activity.py + +class AgentActivity(...): + async def _start_session(self) -> None: + ... + if self.mcp_servers: + # Initialize each server and list tools + gathered = await asyncio.gather( + *(_list_mcp_tools_task(s) for s in self.mcp_servers), + return_exceptions=True, + ) + # Store discovered MCP tools + self._mcp_tools = tools +``` + +`AgentActivity` prioritizes the `mcp_servers` defined on the `Agent` itself, falling back to the session's servers if none are provided by the agent. + +```python +@property +def mcp_servers(self) -> list[mcp.MCPServer] | None: + return ( + self._agent.mcp_servers + if is_given(self._agent.mcp_servers) + else self._session.mcp_servers + ) +``` + +## 3. Tool Discovery and Implementation + +Each discovered MCP tool is wrapped as a `RawFunctionTool`. This allows them to be treated interchangeably with other function tools. + +```python +# livekit/agents/llm/mcp.py + +MCPTool = RawFunctionTool + +class MCPServer(ABC): + def _make_function_tool(self, ...) -> MCPTool: + async def _tool_called(raw_arguments: dict[str, Any]) -> Any: + # Forward the call to the actual MCP server + tool_result = await self._client.call_tool(name, raw_arguments) + return tool_result.content[0].model_dump_json() + + return function_tool(_tool_called, raw_schema=raw_schema) +``` + +## 4. Integration with LLM + +The `AgentActivity` combines all available tools (session tools, agent tools, and MCP tools) into a single list that is provided to the LLM during inference. + +```python +@property +def tools(self) -> list[llm.FunctionTool | llm.RawFunctionTool | mcp.MCPTool]: + return self._session.tools + self._agent.tools + self._mcp_tools +``` + +## 5. Tool Layers in `AgentActivity` + +`AgentActivity` combines tools from multiple sources to provide the LLM with a complete set of capabilities. + +### 1. `self._session.tools` +These are **global tools** defined at the session level. +- **Where they come from**: They are passed into the `AgentSession` constructor. +- **Scope**: They are shared across all agents that might run within that session (e.g., if you hand off from one agent to another, these tools remain available). +- **Implementation**: In `AgentSession`, these are stored in `self._tools`. + +### 2. `self._agent.tools` +These are **agent-specific tools**. +- **Where they come from**: + 1. Tools passed directly into the `Agent` constructor. + 2. Methods within the `Agent` class (or its subclasses) that are decorated with `@llm.function_tool`. The `Agent` class automatically discovers these using `find_function_tools(self)`. +- **Scope**: They are only available while that specific agent is active. +- **Implementation**: In `Agent`, these are stored in `self._tools`. + +### How they are used together +In `AgentActivity.tools`, these are combined with any discovered MCP tools to create the final list of tools provided to the LLM: + +## 6. LLM Tool Integration: Prompting and Decision-Making + +When the agent interacts with an LLM, the tools are not hidden in a text prompt; they are provided as a core part of the model's interface. + +### How Tools are "Prompted" +Tools are not added to the text prompt (like the system instructions). Instead, they are converted into a structured format (JSON Schema) and sent as a specialized `tools` parameter in the API call to the LLM provider (e.g., OpenAI). + +```python +# livekit/agents/inference/llm.py + +def to_fnc_ctx(fnc_ctx: list[llm.FunctionTool | llm.RawFunctionTool]) -> list[ChatCompletionToolParam]: + # Converts tools into OpenAI-compatible JSON Schema + return [ + { + "type": "function", + "function": fnc.raw_schema if is_raw(fnc) else build_openai_schema(fnc) + } for fnc in fnc_ctx + ] +``` + +### When the LLM Decides to Use Tools +The decision-making happens entirely within the LLM model itself. +1. **Model Reasoning**: Based on the user's request and the tool descriptions provided in the schema, the model determines if a tool is needed. +2. **Tool Call Generation**: If needed, the model returns a special `tool_calls` message instead of (or in addition to) regular text. +3. **Detection**: The `LLMStream` in the LiveKit runtime parses these tool calls from the API response: + +```python +# livekit/agents/inference/llm.py + +def _parse_choice(self, choice: Choice) -> llm.ChatChunk | None: + if choice.delta.tool_calls: + # Detected that the LLM wants to call a tool + return llm.ChatChunk(tool_calls=...) +``` + +## 7. Deep Dive: `_execute_tools_task` Workflow + +The `_execute_tools_task` function in `livekit/agents/voice/generation.py` is the core engine for tool execution. It handles everything from argument validation to parallel task management. + +### Detailed Workflow Stages + +#### 1. Setup and Event Listening +The function initializes a list of `tasks` and defines a `_tool_completed` helper. It starts an `async for` loop over `function_stream`, which yields tool calls as they are parsed from the LLM's response. This allow the agent to start executing the first tool even while the LLM is still generating the second one. + +#### 2. Discovery and Type Safety +For each incoming call: +- It looks up the function name in the `ToolContext`. +- It verifies that the tool choice allows for execution (e.g., not `tool_choice="none"`). +- It validates that the tool is a supported type (`FunctionTool` or `RawFunctionTool`). + +#### 3. Intelligent Argument Preparation (Dependency Injection) +`llm_utils.prepare_function_arguments` is called to: +- **Parse the LLM's JSON**: Converts the string arguments into Python types. +- **Dependency Injection**: If the tool's signature includes special types like `RunContext`, `AgentSession`, or `SpeechHandle`, the utility automatically injects the current instances of these objects. This makes it easy for developers to access the current session state inside their tools. + +#### 4. Asynchronous Task Spawning +Instead of executing tools sequentially, the function creates a sub-task for each call using `asyncio.create_task(_traceable_fnc_tool(...))`. +- **Parallelism**: This allows multiple tools to run simultaneously if requested by the LLM. +- **Monitoring**: It uses `_set_activity_task_info` to mark these tasks as "inline tasks," allowing the runtime to track tool-driven state changes. + +#### 5. Observability and Tracing +Each tool execution is wrapped in an **OpenTelemetry span** via `tracer.start_as_current_span("function_tool")`. This records: +- The tool's name and arguments. +- The return value or any exception that occurred. +- Performance metrics (how long the execution took). + +#### 6. Graceful Interruption and Shielding +When the function finishes its loop, it waits for all spawned tasks with `asyncio.gather`. +- **Shielding**: It uses `asyncio.shield` to ensure that if the agent session is cancelled (e.g., due to user interruption), currently running tool calls are allowed to finish. This prevents leaving the system in an inconsistent state. + +#### 7. Result Reporting +The result of each tool is captured and sent back to the `AgentActivity` via callbacks. These results are ultimately fed back into the LLM's conversation history as `FunctionCallOutput` messages. + + + diff --git a/examples/prompts.py b/examples/prompts.py deleted file mode 100644 index 7fb03fb..0000000 --- a/examples/prompts.py +++ /dev/null @@ -1,14 +0,0 @@ -ENGLISH_RESPONSE_SYSTEM_PROMPT = """You are a helpful voice AI assistant. - -CRITICAL: You MUST ALWAYS respond in English. Even if the user speaks to you in another language, you must respond in English only. -Do not echo the user's language if it is not English. - -Keep your responses concise and conversational - aim for 1-2 sentences. -Be friendly and natural in your speech patterns.""" - - -VIETNAMESE_RESPONSE_SYSTEM_PROMPT = """You are a helpful voice AI assistant. - -CRITICAL: You MUST ALWAYS respond in Vietnamese. And plain text, do not have any markdown format. - -Be friendly and natural in your speech patterns.""" \ No newline at end of file diff --git a/examples/tools.py b/examples/tools.py deleted file mode 100644 index cdc516e..0000000 --- a/examples/tools.py +++ /dev/null @@ -1,15 +0,0 @@ -from datetime import datetime -from livekit.agents.llm import function_tool - -class AssistantFnc: - """Helper functions for the assistant.""" - - @function_tool(description="Hàm này trả về ngày giờ hiện tại.") - def get_datetime(self) -> str: - """Trả về ngày giờ hiện tại ở định dạng dễ đọc.""" - now = datetime.now() - # Format: Thứ Năm, 26 tháng 03 năm 2026, 16:00:39 - # In Vietnamese - days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] - day_str = days[now.weekday()] - return f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" diff --git a/examples/voice_agent.py b/examples/voice_agent.py deleted file mode 100644 index 02e4196..0000000 --- a/examples/voice_agent.py +++ /dev/null @@ -1,288 +0,0 @@ -#!/usr/bin/env python3 -""" -Local Voice Agent Example -========================= - -A complete example showing how to use the local STT/TTS plugins -with LiveKit Agents. Supports both cloud and local pipelines. - -Usage: - # Start with local pipeline - USE_LOCAL=true python voice_agent.py dev - - # Start with cloud pipeline (requires API keys) - python voice_agent.py dev - -Environment Variables: - USE_LOCAL - Set to "true" for local pipeline - WHISPER_MODEL - FasterWhisper model size (default: "medium") - WHISPER_DEVICE - "cuda" or "cpu" (default: "cuda") - PIPER_MODEL_PATH - Path to Piper .onnx model - OLLAMA_MODEL - Ollama model name (default: "llama3.1:8b") - OLLAMA_BASE_URL - Ollama API URL (default: "http://localhost:11434/v1") - -For cloud pipeline: - DEEPGRAM_API_KEY - Deepgram API key - OPENAI_API_KEY - OpenAI API key - CARTESIA_API_KEY - Cartesia API key -""" - -from __future__ import annotations - -import logging -import os -import sys -import time - -# Add parent directory to path for local development (must be before other imports) -sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src")) - -from datetime import datetime -from dotenv import load_dotenv - - -# Load environment variables (try .env.local first, then .env) -_script_dir = os.path.dirname(os.path.abspath(__file__)) -load_dotenv(os.path.join(_script_dir, ".env.local")) -load_dotenv(os.path.join(_script_dir, ".env")) - -# LiveKit imports - plugins must be imported on main thread -from livekit import agents -from livekit.agents import AgentSession, Agent, RoomInputOptions, llm - -from livekit.plugins import silero -from livekit.plugins import openai as lk_openai - -# Local plugins -from local_livekit_plugins import FasterWhisperSTT, VieNeuTTS, PiperTTS - -# Configure logging -logging.basicConfig( - level=logging.INFO, - format="%(asctime)s | %(name)-20s | %(levelname)-8s | %(message)s" -) -logger = logging.getLogger("voice-agent") - -# ============================================================================= -# Configuration -# ============================================================================= - -USE_LOCAL = os.getenv("USE_LOCAL", "false").lower() == "true" - -# Local pipeline settings -WHISPER_MODEL = os.getenv("WHISPER_MODEL", "medium") -WHISPER_DEVICE = os.getenv("WHISPER_DEVICE", "cuda") -STT_PROVIDER = os.getenv("STT_PROVIDER", "faster_whisper").lower() -VLLM_ASR_MODEL = os.getenv("VLLM_ASR_MODEL", "qwen3asr") -VLLM_ASR_BASE_URL = os.getenv("VLLM_ASR_BASE_URL", "http://10.148.180.105:1670/v1") -TTS_PROVIDER = os.getenv("TTS_PROVIDER", "vieneu").lower() -PIPER_MODEL_PATH = os.getenv("PIPER_MODEL_PATH", "") -PIPER_USE_CUDA = os.getenv("PIPER_USE_CUDA", "false").lower() == "true" - -VIENEU_API_BASE = os.getenv("VIENEU_API_BASE", "http://localhost:23333/v1") -VIENEU_MODEL_NAME = os.getenv("VIENEU_MODEL_NAME", "pnnbao-ump/VieNeu-TTS") -VIENEU_VOICE_ID = os.getenv("VIENEU_VOICE_ID", "") # e.g. "nu_m_001" - -LLM_PROVIDER = os.getenv("LLM_PROVIDER", "ollama").lower() -LANGUAGE = os.getenv("LANGUAGE", "vi").lower() # "vi" or "en" -OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "llama3.1:8b") -OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1") -VLLM_MODEL = os.getenv("VLLM_MODEL", "qwen3_vl") -VLLM_BASE_URL = os.getenv("VLLM_BASE_URL", "http://10.148.180.105:22003/v1") - - -# ============================================================================= -# Agent Definition -# ============================================================================= - -from tools import AssistantFnc - - -class VoiceAssistant(Agent): - """A simple voice assistant that responds to user queries.""" - - def __init__(self, tools: list[llm.FunctionTool] | None = None) -> None: - now = datetime.now() - days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] - day_str = days[now.weekday()] - current_time_str = f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" - - from prompts import VIETNAMESE_RESPONSE_SYSTEM_PROMPT, ENGLISH_RESPONSE_SYSTEM_PROMPT - - # Select prompt based on desired language - if LANGUAGE == "en": - base_prompt = ENGLISH_RESPONSE_SYSTEM_PROMPT - # For dynamic instructions in English - now_msg = f"Current time is: {now.strftime('%A, %d/%m/%Y %H:%M:%S')}." - else: - base_prompt = VIETNAMESE_RESPONSE_SYSTEM_PROMPT - now_msg = f"Hiện tại là: {current_time_str}." - - instructions=f"{now_msg}\n\n{base_prompt}" - - super().__init__( - instructions=instructions, - tools=tools, - ) - - - - - -# ============================================================================= -# Pipeline Factories -# ============================================================================= - -def create_local_session() -> AgentSession: - """ - Create an AgentSession using fully local STT/LLM/TTS. - - Requirements: - - Ollama running with desired model - - Piper voice model downloaded - - CUDA toolkit (optional, for GPU acceleration) - """ - logger.info("=" * 60) - logger.info("STARTING LOCAL PIPELINE") - logger.info("=" * 60) - if STT_PROVIDER == "vllm": - logger.info(f" STT: vLLM ({VLLM_ASR_MODEL})") - else: - logger.info(f" STT: FasterWhisper ({WHISPER_MODEL} on {WHISPER_DEVICE})") - if LLM_PROVIDER == "vllm": - logger.info(f" LLM: vLLM ({VLLM_MODEL})") - else: - logger.info(f" LLM: Ollama ({OLLAMA_MODEL})") - - if TTS_PROVIDER == "piper": - logger.info(f" TTS: Piper (CUDA: {PIPER_USE_CUDA})") - if not PIPER_MODEL_PATH: - raise ValueError( - "PIPER_MODEL_PATH not set. Download a voice model from:\n" - "https://huggingface.co/rhasspy/piper-voices" - ) - else: - logger.info(f" TTS: VieNeu ({VIENEU_MODEL_NAME} at {VIENEU_API_BASE})") - - logger.info("=" * 60) - - return AgentSession( - stt=lk_openai.STT( - model=VLLM_ASR_MODEL, - base_url=VLLM_ASR_BASE_URL, - detect_language=True, - ) if STT_PROVIDER == "vllm" else FasterWhisperSTT( - model_size=WHISPER_MODEL, - device=WHISPER_DEVICE, - compute_type="float16" if WHISPER_DEVICE == "cuda" else "int8", - language=None, # Enable auto-detection - ), - llm=lk_openai.LLM( - model=VLLM_MODEL, - base_url=VLLM_BASE_URL, - ) if LLM_PROVIDER == "vllm" else lk_openai.LLM.with_ollama( - model=OLLAMA_MODEL, - base_url=OLLAMA_BASE_URL, - ), - tts=PiperTTS( - model_path=PIPER_MODEL_PATH, - use_cuda=PIPER_USE_CUDA, - ) if TTS_PROVIDER == "piper" else VieNeuTTS( - api_base=VIENEU_API_BASE, - model_name=VIENEU_MODEL_NAME, - voice_id=VIENEU_VOICE_ID if VIENEU_VOICE_ID else None, - ), - vad=silero.VAD.load(), - ) - - -def create_cloud_session() -> AgentSession: - """ - Create an AgentSession using cloud STT/LLM/TTS services. - - Requirements: - - DEEPGRAM_API_KEY - - OPENAI_API_KEY - - CARTESIA_API_KEY - """ - logger.info("=" * 60) - logger.info("STARTING CLOUD PIPELINE") - logger.info("=" * 60) - logger.info(" STT: Deepgram Nova-2") - logger.info(" LLM: OpenAI GPT-4o-mini") - logger.info(" TTS: Cartesia Sonic") - logger.info("=" * 60) - - return AgentSession( - stt="deepgram/nova-2", - llm="openai/gpt-4o-mini", - tts="cartesia/sonic", - vad=silero.VAD.load(), - ) - - -# ============================================================================= -# Agent Entrypoint -# ============================================================================= - -async def entrypoint(ctx: agents.JobContext) -> None: - """Main entrypoint for the voice agent.""" - - logger.info(f"Joining room: {ctx.room.name}") - await ctx.connect() - - # Create session based on configuration - session = create_local_session() if USE_LOCAL else create_cloud_session() - - # ========================================================================== - # Round-trip latency tracking - # ========================================================================== - # Measures time from user speech transcribed to agent starting to speak. - # This captures: LLM processing + TTS first byte (STT already done). - - _transcription_time: float | None = None - - @session.on("user_input_transcribed") - def on_user_input_transcribed(ev) -> None: - nonlocal _transcription_time - _transcription_time = time.perf_counter() - logger.debug(f"User said: {ev.transcript[:80]}...") - - @session.on("agent_state_changed") - def on_agent_state_changed(ev) -> None: - nonlocal _transcription_time - if ev.new_state == "speaking" and _transcription_time is not None: - latency_ms = (time.perf_counter() - _transcription_time) * 1000 - logger.info(f"ROUND-TRIP LATENCY: {latency_ms:.0f}ms (LLM + TTS)") - _transcription_time = None - - # ========================================================================== - - # Start the agent session - await session.start( - room=ctx.room, - agent=VoiceAssistant(), # Removed tools for now due to vLLM server limitations - room_input_options=RoomInputOptions(), - ) - - - - - # Send initial greeting - await session.generate_reply( - instructions="Greet the user and let them know you're ready to help." - ) - - logger.info("Agent ready - listening for speech...") - - -# ============================================================================= -# Main -# ============================================================================= - -if __name__ == "__main__": - agents.cli.run_app( - agents.WorkerOptions( - entrypoint_fnc=entrypoint, - ) - ) diff --git a/src/local_livekit_plugins/__init__.py b/local_livekit_plugins/__init__.py similarity index 100% rename from src/local_livekit_plugins/__init__.py rename to local_livekit_plugins/__init__.py diff --git a/src/local_livekit_plugins/faster_whisper_stt.py b/local_livekit_plugins/faster_whisper_stt.py similarity index 100% rename from src/local_livekit_plugins/faster_whisper_stt.py rename to local_livekit_plugins/faster_whisper_stt.py diff --git a/src/local_livekit_plugins/piper_tts.py b/local_livekit_plugins/piper_tts.py similarity index 100% rename from src/local_livekit_plugins/piper_tts.py rename to local_livekit_plugins/piper_tts.py diff --git a/src/local_livekit_plugins/vieneu_tts.py b/local_livekit_plugins/vieneu_tts.py similarity index 61% rename from src/local_livekit_plugins/vieneu_tts.py rename to local_livekit_plugins/vieneu_tts.py index ba5d1bb..ad066d0 100644 --- a/src/local_livekit_plugins/vieneu_tts.py +++ b/local_livekit_plugins/vieneu_tts.py @@ -22,7 +22,7 @@ from livekit.agents.tts.tts import AudioEmitter # Add VieNeu-TTS source directory to path if it exists locally -_project_root = Path(__file__).parent.parent.parent +_project_root = Path(__file__).parent.parent _vieneu_src = _project_root / "models" / "VieNeu-TTS" / "src" if _vieneu_src.exists() and str(_vieneu_src) not in sys.path: # Insert at the beginning to prefer the version in the models folder @@ -50,7 +50,7 @@ def __init__( self, api_base: str = "http://localhost:23333/v1", model_name: str = "pnnbao-ump/VieNeu-TTS", - voice_id: Optional[str] = None, + voice_id: Optional[str] = "Doan", # Default to Doan if not specified ) -> None: if RemoteVieNeuTTS is None: raise ImportError( @@ -97,6 +97,18 @@ def synthesize( if conn_options is None: conn_options = APIConnectOptions() + # Filter out empty or JSON-like content that shouldn't be synthesized + stripped_text = text.strip() + if not stripped_text or stripped_text in ("{}", "[]"): + logger.debug(f"Skipping synthesis for non-textual content: '{text}'") + # Return an empty stream that flushes immediately + from .vieneu_tts import _VieNeuEmptyStream + return _VieNeuEmptyStream( + tts_plugin=self, + input_text=text, + conn_options=conn_options, + ) + logger.debug(f"Synthesizing ({len(text)} chars) via VieNeu: {text[:50]}...") return _VieNeuChunkedStream( @@ -105,6 +117,32 @@ def synthesize( conn_options=conn_options, ) +class _VieNeuEmptyStream(tts.ChunkedStream): + """ + An empty stream that satisfies the API but generates no audio. + """ + def __init__( + self, + *, + tts_plugin: VieNeuTTS, + input_text: str, + conn_options: APIConnectOptions, + ) -> None: + super().__init__(tts=tts_plugin, input_text=input_text, conn_options=conn_options) + + async def _run(self, emitter: AudioEmitter) -> None: + emitter.initialize( + request_id=str(uuid.uuid4()), + sample_rate=self._tts.sample_rate, + num_channels=self._tts.num_channels, + mime_type="audio/pcm", + ) + # Push at least one silent frame to avoid livekit-agents "no audio frames" error + # A 100ms silent buffer (longer than previous 10ms to be safer) + silence = b"\x00" * int(self._tts.sample_rate * 0.1 * 2) + emitter.push(silence) + emitter.flush() + class _VieNeuChunkedStream(tts.ChunkedStream): """ Manages the streaming response from the VieNeu-TTS server. @@ -133,25 +171,32 @@ async def _run(self, emitter: AudioEmitter) -> None: loop = asyncio.get_running_loop() + pushed_any = False try: # We run the blocking stream generator in a thread pool def process_synthesis(): - # Get the stream generator from the client - gen = self._plugin._client.infer_stream( - self._input_text, - voice=self._plugin._voice_data - ) - - for audio_chunk in gen: - if audio_chunk is None or len(audio_chunk) == 0: - continue - - # VieNeu returns float32 numpy arrays [-1.0, 1.0] - # We convert to int16 PCM for LiveKit - pcm_chunk = (audio_chunk * 32767).astype(np.int16).tobytes() + nonlocal pushed_any + try: + # Get the stream generator from the client + gen = self._plugin._client.infer_stream( + self._input_text, + voice=self._plugin._voice_data + ) - # Push directly to the emitter - emitter.push(pcm_chunk) + for audio_chunk in gen: + if audio_chunk is None or len(audio_chunk) == 0: + continue + + # VieNeu returns float32 numpy arrays [-1.0, 1.0] + # We convert to int16 PCM for LiveKit + pcm_chunk = (audio_chunk * 32767).astype(np.int16).tobytes() + + # Push directly to the emitter + emitter.push(pcm_chunk) + pushed_any = True + except Exception as e: + logger.error(f"Error in VieNeu synthesis thread: {e}") + raise # Run the synthesis and emission in a background thread await loop.run_in_executor(None, process_synthesis) @@ -160,4 +205,9 @@ def process_synthesis(): logger.exception(f"Unexpected error during VieNeu synthesis: {e}") finally: # Signal the end of the stream + if not pushed_any: + logger.warning(f"No audio frames were pushed for text: '{self._input_text}'. Pushing silence fallback.") + # Push a short silent frame (100ms) + silence = b"\x00" * int(self._tts.sample_rate * 0.1 * 2) + emitter.push(silence) emitter.flush() diff --git a/pyproject.toml b/pyproject.toml index ead3b84..0a1e7e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,10 @@ dependencies = [ "piper-tts>=1.2.0", "numpy>=1.24.0", "python-dotenv>=1.0.0", - "torch>=2.0.0", # Provides CUDA 12 libraries for faster-whisper + "torch==2.10.0+cu128", # Provides CUDA 12 libraries for faster-whisper + "pydantic-settings>=2.13.1", + "torchaudio==2.10.0+cu128", + "torchvision==0.25.0+cu128", ] [project.optional-dependencies] diff --git a/examples/.env.local.example b/scripts/.env.local.example similarity index 100% rename from examples/.env.local.example rename to scripts/.env.local.example diff --git a/scripts/config.py b/scripts/config.py new file mode 100644 index 0000000..3b11c86 --- /dev/null +++ b/scripts/config.py @@ -0,0 +1,49 @@ +import os +from pydantic import BaseModel, Field + +class Settings(BaseModel): + USE_LOCAL: bool = Field(default_factory=lambda: os.getenv("USE_LOCAL", "false").lower() == "true") + + # Local pipeline settings + WHISPER_MODEL: str = Field(default_factory=lambda: os.getenv("WHISPER_MODEL", "medium")) + WHISPER_DEVICE: str = Field(default_factory=lambda: os.getenv("WHISPER_DEVICE", "cuda")) + STT_PROVIDER: str = Field(default_factory=lambda: os.getenv("STT_PROVIDER", "faster_whisper").lower()) + VLLM_ASR_MODEL: str = Field(default_factory=lambda: os.getenv("VLLM_ASR_MODEL", "qwen3asr")) + VLLM_ASR_BASE_URL: str = Field(default_factory=lambda: os.getenv("VLLM_ASR_BASE_URL", "http://10.148.180.105:1670/v1")) + TTS_PROVIDER: str = Field(default_factory=lambda: os.getenv("TTS_PROVIDER", "vieneu").lower()) + PIPER_MODEL_PATH: str = Field(default_factory=lambda: os.getenv("PIPER_MODEL_PATH", "")) + PIPER_USE_CUDA: bool = Field(default_factory=lambda: os.getenv("PIPER_USE_CUDA", "false").lower() == "true") + + VIENEU_API_BASE: str = Field(default_factory=lambda: os.getenv("VIENEU_API_BASE", "http://localhost:23333/v1")) + VIENEU_MODEL_NAME: str = Field(default_factory=lambda: os.getenv("VIENEU_MODEL_NAME", "pnnbao-ump/VieNeu-TTS")) + VIENEU_VOICE_ID: str = Field(default_factory=lambda: os.getenv("VIENEU_VOICE_ID", "Doan")) # e.g. "nu_m_001" + + LLM_PROVIDER: str = Field(default_factory=lambda: os.getenv("LLM_PROVIDER", "ollama").lower()) + LANGUAGE: str = Field(default_factory=lambda: os.getenv("LANGUAGE", "vi").lower()) # "vi" or "en" + OLLAMA_MODEL: str = Field(default_factory=lambda: os.getenv("OLLAMA_MODEL", "llama3.1:8b")) + OLLAMA_BASE_URL: str = Field(default_factory=lambda: os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1")) + VLLM_MODEL: str = Field(default_factory=lambda: os.getenv("VLLM_MODEL", "qwen3_vl")) + VLLM_BASE_URL: str = Field(default_factory=lambda: os.getenv("VLLM_BASE_URL", "http://10.148.180.105:22003/v1")) + +# Create a singleton instance +settings = Settings() + +# Export variables for backward compatibility +USE_LOCAL = settings.USE_LOCAL +WHISPER_MODEL = settings.WHISPER_MODEL +WHISPER_DEVICE = settings.WHISPER_DEVICE +STT_PROVIDER = settings.STT_PROVIDER +VLLM_ASR_MODEL = settings.VLLM_ASR_MODEL +VLLM_ASR_BASE_URL = settings.VLLM_ASR_BASE_URL +TTS_PROVIDER = settings.TTS_PROVIDER +PIPER_MODEL_PATH = settings.PIPER_MODEL_PATH +PIPER_USE_CUDA = settings.PIPER_USE_CUDA +VIENEU_API_BASE = settings.VIENEU_API_BASE +VIENEU_MODEL_NAME = settings.VIENEU_MODEL_NAME +VIENEU_VOICE_ID = settings.VIENEU_VOICE_ID +LLM_PROVIDER = settings.LLM_PROVIDER +LANGUAGE = settings.LANGUAGE +OLLAMA_MODEL = settings.OLLAMA_MODEL +OLLAMA_BASE_URL = settings.OLLAMA_BASE_URL +VLLM_MODEL = settings.VLLM_MODEL +VLLM_BASE_URL = settings.VLLM_BASE_URL diff --git a/scripts/generic_agent.py b/scripts/generic_agent.py new file mode 100644 index 0000000..6c02699 --- /dev/null +++ b/scripts/generic_agent.py @@ -0,0 +1,38 @@ +from livekit.agents import Agent +from livekit.agents.job import get_job_context +from livekit.agents.llm import function_tool +from livekit import api +import logging + +logger = logging.getLogger(__name__) + +class GenericAgent(Agent): + # Tự động chào khi vào phòng + # async def on_enter(self): + # self.session.generate_reply() + + # Tự động kết thúc cuộc trò chuyện khi người dùng yêu cầu + @function_tool + async def end_conversation(self): + """Gọi hàm này khi người dùng muốn kết thúc cuộc trò chuyện""" + self.session.interrupt() + + await self.session.generate_reply( + instructions=f"tạm biệt", allow_interruptions=False + ) + + job_ctx = get_job_context() + await job_ctx.api.room.delete_room(api.DeleteRoomRequest(room=job_ctx.room.name)) + + async def on_enter(self): + """Called when the agent becomes active.""" + logger.info("Agent session started") + + # Generate initial greeting + await self.session.generate_reply( + instructions="Greet the user warmly and ask how you can help them today." + ) + + async def on_exit(self): + """Called when the agent session ends.""" + logger.info("Agent session ended") diff --git a/scripts/prompts.py b/scripts/prompts.py new file mode 100644 index 0000000..9eb97e8 --- /dev/null +++ b/scripts/prompts.py @@ -0,0 +1,64 @@ +ENGLISH_RESPONSE_SYSTEM_PROMPT = """You are a helpful voice AI assistant. + +CRITICAL: You MUST ALWAYS respond in English. Even if the user speaks to you in another language, you must respond in English only. +Do not echo the user's language if it is not English. + +Keep your responses concise and conversational - aim for 1-2 sentences. +Be friendly and natural in your speech patterns. You can use tools get datetime to get current datetime""" + + +VIETNAMESE_RESPONSE_SYSTEM_PROMPT_OLD = """Bạn là một tiếp tân thông minh của công ty Vinrobotics. +Nhiệm vụ của bạn là hỗ trợ khách hàng, nhân viên và khách thăm với thái độ chuyên nghiệp, thân thiện và hiệu quả. Bạn có các khả năng đặc biệt (skill/tools) sau: + +1. QUÉT & ĐỊNH DANH: + - Quét mã QR (`scan_qr_code`) để thực hiện Check-in/Check-out cho khách hoặc nhân viên. + - Quét Căn cước công dân (`scan_cccd`) để lấy thông tin định danh khi cần thiết. + - Kiểm tra nhận diện khuôn mặt (`verify_face_id`) để xác thực danh tính, ngăn chặn việc mạo danh. + +2. ĐĂNG KÝ KHÁCH: + - Thu thập thông tin thông qua đối thoại (Q&A) để đăng ký khách thăm (`register_visitor`). Hãy hỏi tên, mục đích đến và thông tin liên lạc một cách tự nhiên. + +3. TRA CỨU THÔNG TIN: + - Tra cứu thông tin thời gian thực từ internet (`search_web`) khi người dùng hỏi về thời tiết, tin tức hoặc kiến thức chung. + +4. HỖ TRỢ TRỰC TIẾP (Human-in-the-loop): + - Khi cần xác nhận hoặc thông tin từ lãnh đạo cấp cao, hãy sử dụng `call_staff` để kết nối và nhận chỉ thị. + +5. QUAN SÁT THÔNG MINH: + - Bạn có quyền truy cập vào `get_camera_frame`. Công cụ này trả về dữ liệu nhận dạng và hình ảnh (image_data). + - Khi được yêu cầu "mô tả những gì bạn thấy" hoặc khi cần nhận diện môi trường xung quanh robot, hãy gọi `get_camera_frame`. + - Ưu tiên tóm tắt tổng quát tình huống và các vật thể nổi bật nhất thay vì liệt kê vụn vặt. + +QUY TẮC CÔNG VIỆC: +- Luôn phản hồi ngắn gọn (1-2 câu), tự nhiên và mang tính hội thoại. +- Chỉ phản hồi bằng **tiếng Việt**. Nếu khách nói tiếng Anh, vẫn phải trả lời bằng tiếng Việt chuyên nghiệp. +- Khi sử dụng camera, hãy duy trì luồng trực tiếp cho đến khi khách yêu cầu dừng. +- KHÔNG tự động dừng camera (`stop_camera_detection`) trừ khi được yêu cầu. + +Hãy luôn sẵn sàng phục vụ và mang lại trải nghiệm tốt nhất cho mọi người đến Vinrobotics!""" + + +VIETNAMESE_RESPONSE_SYSTEM_PROMPT= """You are a helpful voice AI assistant supporting Vietnamese. +Be friendly and natural in your speech patterns. Please be smart to understand human intents and trigger tools. These tools are considered as your built-in capabilities. + +CONCISENESS RULE: +- Keep your responses concise and conversational - aim for 1-2 sentences. +- Avoid long lists or over-explaining unless the user asks for "chi tiết" (detail) or "liệt kê" (list). + +CRITICAL LANGUAGE RULE: +- You MUST respond ONLY in **Vietnamese** (Tiếng Việt). Please translate to Vietnamese unless it's places. +- If the user speaks English, Chinese, or Thai, you must still respond in Vietnamese. You may briefly acknowledge you understood them but immediately switch to Vietnamese. +- Do not use markdown formatting like **bold** or *italics* in your spoken output. Use plain text without ``**`` or ``*``. + +MULTIMODAL SCENE ANALYSIS: +- You have access to `get_camera_frame`. This tool returns numerical detections AND a `image_data` field (Base64 JPEG). +- When asked to "describe what you see" or for "more detail", call `get_camera_frame`. +- Use the detections for precise counts and the `image_data` to describe the scene qualitatively (colors, lighting, relative positions, emotions, etc.) using your vision capabilities. +- IMPORTANT: When describing, prioritize a high-level summary of the scene. Instead of listing every single object, describe the overall situation and the most prominent items. + +CAMERA PERSISTENCE & PREVIEW RULE: +- When you use the camera, you MUST ensure the preview window is visible to the user. +- Calling `get_camera_frame` will automatically start the camera with preview if it's not running. +- Keep the camera running so the user can continue to see the live stream. +- Do NOT call `stop_camera_detection` automatically after answering. +- Only stop the camera if the user explicitly asks you to "stop the camera" or "turn off the video".""" \ No newline at end of file diff --git a/scripts/test_display.py b/scripts/test_display.py new file mode 100644 index 0000000..3967cb0 --- /dev/null +++ b/scripts/test_display.py @@ -0,0 +1,32 @@ +import cv2 +import numpy as np +import os +import time + +def test_display(display): + print(f"Testing DISPLAY={display}") + os.environ["DISPLAY"] = display + + # Try to create a simple window + img = np.zeros((480, 640, 3), np.uint8) + cv2.putText(img, f"Testing Display {display}", (100, 240), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) + + window_name = f"Test Window {display}" + try: + cv2.namedWindow(window_name, cv2.WINDOW_NORMAL) + cv2.imshow(window_name, img) + key = cv2.waitKey(2000) + print(f"Window shown on {display}, waitKey returned {key}") + cv2.destroyWindow(window_name) + return True + except Exception as e: + print(f"Failed on {display}: {str(e)}") + return False + +if __name__ == "__main__": + displays = [":0", ":1", ":2"] + current = os.environ.get("DISPLAY", "None") + print(f"Current DISPLAY in environment: {current}") + + for d in displays: + test_display(d) diff --git a/scripts/test_filter.py b/scripts/test_filter.py new file mode 100644 index 0000000..ffa2b2c --- /dev/null +++ b/scripts/test_filter.py @@ -0,0 +1,69 @@ +import asyncio +import re +from typing import AsyncIterable + +# Mocking the pattern and function from filters.py for testing +THOUGHT_PATTERN = re.compile(r".*?", re.DOTALL) + +async def filter_thoughts(text: AsyncIterable[str]) -> AsyncIterable[str]: + buffer = "" + async for chunk in text: + buffer += chunk + + full_text = buffer + clean_text = THOUGHT_PATTERN.sub("", full_text) + + if "[SILENCE]" in clean_text: + if not clean_text.replace("[SILENCE]", "").strip(): + return + + yield clean_text + +async def mock_stream(chunks: list[str]): + for chunk in chunks: + yield chunk + +async def test_filter(): + test_cases = [ + { + "name": "Thoughts and Answer", + "chunks": ["Maybe I should say hi.", " Hello there!"], + "expected": " Hello there!" + }, + { + "name": "Pure Silence", + "chunks": ["Nothing to say.", " [SILENCE]"], + "expected": None + }, + { + "name": "Mixed Silence (should not happens if LLM follows instructions, but let's test)", + "chunks": [" [SILENCE] But actually I have something to say."], + "expected": " [SILENCE] But actually I have something to say." + }, + { + "name": "Multiple Thoughts", + "chunks": ["A", " B ", "C"], + "expected": " B " + } + ] + + for case in test_cases: + print(f"Testing: {case['name']}") + result = "" + async for filtered in filter_thoughts(mock_stream(case['chunks'])): + result += filtered + + if case['expected'] is None: + if result == "": + print("✅ PASSED (Empty as expected)") + else: + print(f"❌ FAILED (Expected empty, got '{result}')") + else: + if result == case['expected']: + print(f"✅ PASSED") + else: + print(f"❌ FAILED (Expected '{case['expected']}', got '{result}')") + print("-" * 20) + +if __name__ == "__main__": + asyncio.run(test_filter()) diff --git a/scripts/tools.py b/scripts/tools.py new file mode 100644 index 0000000..a63c414 --- /dev/null +++ b/scripts/tools.py @@ -0,0 +1,53 @@ +from datetime import datetime +from livekit.agents.llm import function_tool + +class AssistantFnc: + """Helper functions for the assistant.""" + + @function_tool(description="Hàm này trả về ngày giờ hiện tại.") + async def get_datetime(self) -> str: + """Trả về ngày giờ hiện tại ở định dạng dễ đọc.""" + now = datetime.now() + # Format: Thứ Năm, 26 tháng 03 năm 2026, 16:00:39 + # In Vietnamese + days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] + day_str = days[now.weekday()] + return f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" + + @function_tool(description="Quét mã QR để thực hiện check-in hoặc check-out.") + async def scan_qr_code(self, operation: str) -> str: + """Quét mã QR. operation có thể là 'check-in' hoặc 'check-out'.""" + # Simulated QR scan + return f"Mã QR đã được quét thành công. Đã thực hiện {operation} cho khách hàng." + + @function_tool(description="Quét Căn cước công dân (CCCD) để lấy thông tin định danh.") + async def scan_cccd(self) -> str: + """Quét thẻ CCCD và trả về thông tin cơ bản.""" + # Simulated CCCD scan + return "Đã quét CCCD thành công. Họ tên: Nguyễn Văn A, Số CCCD: 012345678901, Địa chỉ: Hà Nội." + + @function_tool(description="Đăng ký thông tin khách đến thăm công ty.") + async def register_visitor(self, name: str, purpose: str, contact: str) -> str: + """Đăng ký khách thăm. Cần tên khách, mục đích và thông tin liên lạc.""" + # Simulated registration + return f"Đã đăng ký thành công cho khách {name}. Mục đích: {purpose}. Chúng tôi sẽ liên hệ qua {contact}." + + @function_tool(description="Tìm kiếm thông tin thời gian thực từ internet.") + async def search_web(self, query: str) -> str: + """Tìm kiếm thông tin từ internet cho các câu hỏi về thời sự, thời tiết, kiến thức mới.""" + # Simulated web search + return f"Kết quả tìm kiếm cho '{query}': Đây là thông tin cập nhật mới nhất từ internet về vấn đề này." + + @function_tool(description="Gọi điện cho nhân viên công ty (ví dụ: anh Huy) để lấy thông tin hoặc xác nhận.") + async def call_staff(self, staff_name: str, reason: str) -> str: + """Thực hiện cuộc gọi cho nhân viên. Ví dụ: 'anh Huy'.""" + # Simulated human-in-the-loop call + if "Huy" in staff_name: + return f"Đang kết nối với anh Huy... Anh Huy xác nhận: 'Cứ cho khách vào, tôi đang đợi ở phòng họp số 1'." + return f"Đang gọi cho {staff_name}... Hiện tại nhân viên không nhấc máy, vui lòng thử lại sau." + + @function_tool(description="Kiểm tra nhận diện khuôn mặt (Face ID) để đảm bảo không có giả mạo.") + async def verify_face_id(self) -> str: + """Thực hiện kiểm tra Face ID.""" + # Simulated Face ID check + return "Face ID trùng khớp. Xác nhận danh tính thành công. Có thể tiếp tục công việc." diff --git a/scripts/voice_agent.py b/scripts/voice_agent.py new file mode 100644 index 0000000..064c26a --- /dev/null +++ b/scripts/voice_agent.py @@ -0,0 +1,430 @@ +from __future__ import annotations + +import logging +import os +import sys +import time +from datetime import datetime +from dotenv import load_dotenv + +load_dotenv(".env") + +from livekit import agents +from livekit.agents import AgentSession, Agent, RoomInputOptions, llm, RunContext +from livekit.plugins import silero +from livekit.plugins import openai as lk_openai +from livekit.agents.llm import function_tool +from livekit.agents.llm.tool_context import StopResponse +from livekit.plugins import noise_cancellation +# livekit-plugins-noise-cancellation +from livekit.agents import mcp + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s | %(name)-20s | %(levelname)-8s | %(message)s" +) +logger = logging.getLogger("voice-agent") + + +from scripts.config import ( + USE_LOCAL, WHISPER_MODEL, WHISPER_DEVICE, STT_PROVIDER, + VLLM_ASR_MODEL, VLLM_ASR_BASE_URL, TTS_PROVIDER, + PIPER_MODEL_PATH, PIPER_USE_CUDA, VIENEU_API_BASE, + VIENEU_MODEL_NAME, VIENEU_VOICE_ID, LLM_PROVIDER, + LANGUAGE, OLLAMA_MODEL, OLLAMA_BASE_URL, + VLLM_MODEL, VLLM_BASE_URL +) + +from scripts.tools import AssistantFnc +from scripts.prompts import VIETNAMESE_RESPONSE_SYSTEM_PROMPT, ENGLISH_RESPONSE_SYSTEM_PROMPT +from local_livekit_plugins import FasterWhisperSTT, VieNeuTTS, PiperTTS +from scripts.generic_agent import GenericAgent + +class VoiceAssistant(GenericAgent): + """A simple voice assistant that responds to user queries.""" + def __init__(self) -> None: + # Select prompt based on desired language + if LANGUAGE == "en": + base_prompt = ENGLISH_RESPONSE_SYSTEM_PROMPT + else: + base_prompt = VIETNAMESE_RESPONSE_SYSTEM_PROMPT + now_msg = "" + + instructions=f"{now_msg}\n\n{base_prompt}" + + super().__init__( + instructions=instructions, + ) + + self.airbnbs = { + "san francisco": [ + { + "id": "sf001", + "name": "Loft ấm cúng tại trung tâm", + "address": "123 Market Street, San Francisco, CA", + "price": 150, + "amenities": ["WiFi", "Nhà bếp", "Không gian làm việc"], + }, + { + "id": "sf002", + "name": "Nhà kiểu Victorian với tầm nhìn ra vịnh", + "address": "456 Castro Street, San Francisco, CA", + "price": 220, + "amenities": ["WiFi", "Chỗ đậu xe", "Máy giặt/Máy sấy", "Tầm nhìn ra vịnh"], + }, + { + "id": "sf003", + "name": "Studio hiện đại gần Cầu Cổng Vàng", + "address": "789 Presidio Avenue, San Francisco, CA", + "price": 180, + "amenities": ["WiFi", "Nhà bếp", "Cho phép mang thú cưng"], + }, + ], + "new york": [ + { + "id": "ny001", + "name": "Căn hộ gạch nâu (Brownstone) tại Brooklyn", + "address": "321 Bedford Avenue, Brooklyn, NY", + "price": 175, + "amenities": ["WiFi", "Nhà bếp", "Lối vào sân sau"], + }, + { + "id": "ny002", + "name": "Penthouse ngắm cảnh trời Manhattan", + "address": "555 Fifth Avenue, Manhattan, NY", + "price": 350, + "amenities": ["WiFi", "Phòng tập gym", "Lễ tân", "Tầm nhìn ra thành phố"], + }, + { + "id": "ny003", + "name": "Loft nghệ thuật tại East Village", + "address": "88 Avenue A, Manhattan, NY", + "price": 195, + "amenities": ["WiFi", "Máy giặt", "Tường gạch trần"], + }, + ], + "los angeles": [ + { + "id": "la001", + "name": "Bungalow tại bãi biển Venice", + "address": "234 Ocean Front Walk, Venice, CA", + "price": 200, + "amenities": ["WiFi", "Lối ra bãi biển", "Sân trong"], + }, + { + "id": "la002", + "name": "Biệt thự đồi Hollywood", + "address": "777 Mulholland Drive, Los Angeles, CA", + "price": 400, + "amenities": ["WiFi", "Hồ bơi", "Tầm nhìn ra thành phố", "Bồn tắm nước nóng"], + }, + ], + } + + # Track bookings + self.bookings = [] + + @function_tool + async def search_airbnbs(self, context: RunContext, city: str) -> str: + """Search for available Airbnbs in a city. + + Args: + city: The city name to search for Airbnbs (e.g., 'San Francisco', 'New York', 'Los Angeles') + """ + city_lower = city.lower() + + if city_lower not in self.airbnbs: + return f"Sorry, I don't have any Airbnb listings for {city} at the moment. Available cities are: San Francisco, New York, and Los Angeles." + + listings = self.airbnbs[city_lower] + result = f"Found {len(listings)} Airbnbs in {city}:\n\n" + + for listing in listings: + result += f"• {listing['name']}\n" + result += f" Address: {listing['address']}\n" + result += f" Price: ${listing['price']} per night\n" + result += f" Amenities: {', '.join(listing['amenities'])}\n" + result += f" ID: {listing['id']}\n\n" + + return result + + @function_tool + async def book_airbnb(self, context: RunContext, airbnb_id: str, guest_name: str, check_in_date: str, check_out_date: str) -> str: + """Book an Airbnb. + + Args: + airbnb_id: The ID of the Airbnb to book (e.g., 'sf001') + guest_name: Name of the guest making the booking + check_in_date: Check-in date (e.g., 'January 15, 2025') + check_out_date: Check-out date (e.g., 'January 20, 2025') + """ + # Find the Airbnb + airbnb = None + for city_listings in self.airbnbs.values(): + for listing in city_listings: + if listing['id'] == airbnb_id: + airbnb = listing + break + if airbnb: + break + + if not airbnb: + return f"Sorry, I couldn't find an Airbnb with ID {airbnb_id}. Please search for available listings first." + + # Create booking + booking = { + "confirmation_number": f"BK{len(self.bookings) + 1001}", + "airbnb_name": airbnb['name'], + "address": airbnb['address'], + "guest_name": guest_name, + "check_in": check_in_date, + "check_out": check_out_date, + "total_price": airbnb['price'], + } + + self.bookings.append(booking) + + result = f"✓ Booking confirmed!\n\n" + result += f"Confirmation Number: {booking['confirmation_number']}\n" + result += f"Property: {booking['airbnb_name']}\n" + result += f"Address: {booking['address']}\n" + result += f"Guest: {booking['guest_name']}\n" + result += f"Check-in: {booking['check_in']}\n" + result += f"Check-out: {booking['check_out']}\n" + result += f"Nightly Rate: ${booking['total_price']}\n\n" + result += f"You'll receive a confirmation email shortly. Have a great stay!" + + return result + + @function_tool + async def get_current_date_and_time(self, context: RunContext) -> str: + """Trả về ngày giờ hiện tại""" + now = datetime.now() + # Format: Thứ Năm, 26 tháng 03 năm 2026, 16:00:39 + # In Vietnamese + + days = ["Thứ Hai", "Thứ Ba", "Thứ Tư", "Thứ Năm", "Thứ Sáu", "Thứ Bảy", "Chủ Nhật"] + day_str = days[now.weekday()] + return f"{day_str}, {now.strftime('%d/%m/%Y %H:%M:%S')}" + + # @function_tool + # async def observe_scene(self, context: RunContext) -> str: + # """Sử dụng camera để quan sát và nhận dạng các đối tượng trong môi trường. + # Hàm này trả về cả danh sách đối tượng và mô tả chi tiết từ YOLO. + # """ + # logger.info("Agent is observing the scene...") + + # # We need to call the MCP tool 'get_camera_frame' + # # Since MCP tools are attached to the session, we can call them via the session's tool call logic + # # OR we can just use the tool context. + + # try: + # # Look for the MCP tool in the session + # # Note: In a real scenario, we might want to call the tool by name + # # For simplicity, we assume the agent will call get_camera_frame directly if needed, + # # but providing this wrapper helps enforce the "give to LLM" logic. + + # # Actually, the best way for the agent to "see" is to use the existing prompt logic + # # but provide a better summary of what it sees. + + # # If the user specifically wants the agent to "detect objects", + # # we can use this tool to trigger the behavior. + # return "Please call `get_camera_frame` to receive the visual data and then provide a concise description in Vietnamese as per your instructions." + # except Exception as e: + # logger.error(f"Error in observe_scene: {e}") + # return f"Lỗi khi quan sát: {e}" + + async def on_user_turn_completed(self, turn_ctx: llm.ChatContext, new_message: llm.ChatMessage) -> None: + """Filter out background noise when the agent is speaking.""" + # Use simple heuristic: if agent is speaking, ignore everything except stop keywords + if self._activity and self._activity.current_speech: + transcript = " ".join(new_message.content) if isinstance(new_message.content, list) else str(new_message.content) + transcript_lower = transcript.lower().strip() + + stop_keywords = ["stop", "dừng lại", "thôi", "im đi", "dừng", "đợi đã", "wait", "hold on"] + if not any(kw in transcript_lower for kw in stop_keywords): + logger.info(f"Ignoring background speech while agent is speaking: {transcript}") + raise StopResponse() + + + + + +# ============================================================================= +# Pipeline Factories +# ============================================================================= + +def create_local_session() -> AgentSession: + """ + Create an AgentSession using fully local STT/LLM/TTS. + + Requirements: + - Ollama running with desired model + - Piper voice model downloaded + - CUDA toolkit (optional, for GPU acceleration) + """ + logger.info("=" * 60) + logger.info("STARTING LOCAL PIPELINE") + logger.info("=" * 60) + if STT_PROVIDER == "vllm": + logger.info(f" STT: vLLM ({VLLM_ASR_MODEL})") + else: + logger.info(f" STT: FasterWhisper ({WHISPER_MODEL} on {WHISPER_DEVICE})") + if LLM_PROVIDER == "vllm": + logger.info(f" LLM: vLLM ({VLLM_MODEL})") + else: + logger.info(f" LLM: Ollama ({OLLAMA_MODEL})") + + if TTS_PROVIDER == "piper": + logger.info(f" TTS: Piper (CUDA: {PIPER_USE_CUDA})") + if not PIPER_MODEL_PATH: + raise ValueError( + "PIPER_MODEL_PATH not set. Download a voice model from:\n" + "https://huggingface.co/rhasspy/piper-voices" + ) + else: + logger.info(f" TTS: VieNeu ({VIENEU_MODEL_NAME} at {VIENEU_API_BASE})") + + logger.info("=" * 60) + + return AgentSession( + stt=lk_openai.STT( + model=VLLM_ASR_MODEL, + base_url=VLLM_ASR_BASE_URL, + detect_language=["Vietnamese", "English"], + ) if STT_PROVIDER == "vllm" else FasterWhisperSTT( + model_size=WHISPER_MODEL, + device=WHISPER_DEVICE, + compute_type="float16" if WHISPER_DEVICE == "cuda" else "int8", + language="None", # Enable auto-detection + ), + llm=lk_openai.LLM( + model=VLLM_MODEL, + base_url=VLLM_BASE_URL, + ) if LLM_PROVIDER == "vllm" else lk_openai.LLM.with_ollama( + model=OLLAMA_MODEL, + base_url=OLLAMA_BASE_URL, + ), + tts=PiperTTS( + model_path=PIPER_MODEL_PATH, + use_cuda=PIPER_USE_CUDA, + ) if TTS_PROVIDER == "piper" else VieNeuTTS( + api_base=VIENEU_API_BASE, + model_name=VIENEU_MODEL_NAME, + voice_id=VIENEU_VOICE_ID if VIENEU_VOICE_ID else None, + ), + vad=silero.VAD.load(), + allow_interruptions=False, + discard_audio_if_uninterruptible=False, + tts_text_transforms=["filter_markdown", "filter_emoji", "filter_thoughts"], + + + # MCP servers + mcp_servers=[ + mcp.MCPServerStdio( + command="/home/vrh3/workspace/projects/voice-agent/mcp/YOLO-MCP-Server/.venv/bin/python", + args=["/home/vrh3/workspace/projects/voice-agent/mcp/YOLO-MCP-Server/server.py"], + env={ + "PYTHONPATH": "/home/vrh3/workspace/projects/voice-agent/mcp/YOLO-MCP-Server", + "DISPLAY": os.environ.get("DISPLAY", ":1"), + "XAUTHORITY": os.environ.get("XAUTHORITY", ""), + "XDG_RUNTIME_DIR": os.environ.get("XDG_RUNTIME_DIR", f"/run/user/{os.getuid()}"), + "QT_X11_NO_MITSHM": "1" + }, + client_session_timeout_seconds=20 + ) + ], + ) + + + +# ============================================================================= +# Agent Entrypoint +# ============================================================================= + +async def entrypoint(ctx: agents.JobContext) -> None: + """Main entrypoint for the voice agent.""" + + logger.info(f"Joining room: {ctx.room.name}") + await ctx.connect() + + # Create session based on configuration + session = create_local_session() if USE_LOCAL else create_cloud_session() + + # ========================================================================== + # Round-trip latency tracking + # ========================================================================== + # Measures time from user speech transcribed to agent starting to speak. + # This captures: LLM processing + TTS first byte (STT already done). + + _transcription_time: float | None = None + + @session.on("user_input_transcribed") + def on_user_input_transcribed(ev) -> None: + nonlocal _transcription_time + _transcription_time = time.perf_counter() + logger.info(f"User said: {ev.transcript}") + + # Custom interruption logic + stop_keywords = ["stop", "dừng lại", "thôi", "im đi", "dừng", "đợi đã", "wait", "hold on"] + transcript_lower = ev.transcript.lower().strip() + if any(kw in transcript_lower for kw in stop_keywords): + logger.info("STOP keyword detected, interrupting agent...") + session.interrupt(force=True) + + @session.on("agent_answer_transcribed") + def on_agent_answer_transcribed(ev) -> None: + logger.info(f"LLM Answer: {ev.transcript}") + + @session.on("agent_state_changed") + def on_agent_state_changed(ev) -> None: + nonlocal _transcription_time + if ev.new_state == "speaking" and _transcription_time is not None: + latency_ms = (time.perf_counter() - _transcription_time) * 1000 + logger.info(f"ROUND-TRIP LATENCY: {latency_ms:.0f}ms (LLM + TTS)") + _transcription_time = None + + # ========================================================================== + + # Start the agent session + await session.start( + room=ctx.room, + agent=VoiceAssistant(), + room_input_options=RoomInputOptions( + # Enable noise cancellation + noise_cancellation=noise_cancellation.BVC(), + # For telephony, use: noise_cancellation.BVCTelephony() + ), + ) + + + # Handle session events + @session.on("agent_state_changed") + def on_state_changed(ev): + """Log agent state changes.""" + logger.info(f"State: {ev.old_state} -> {ev.new_state}") + + @session.on("user_started_speaking") + def on_user_speaking(): + """Track when user starts speaking.""" + logger.debug("User started speaking") + + @session.on("user_stopped_speaking") + def on_user_stopped(): + """Track when user stops speaking.""" + logger.debug("User stopped speaking") + + + logger.info("Agent ready - listening for speech...") + + +# ============================================================================= +# Main +# ============================================================================= + +if __name__ == "__main__": + agents.cli.run_app( + agents.WorkerOptions( + entrypoint_fnc=entrypoint, + ) + ) diff --git a/test_vieneu.py b/test_vieneu.py deleted file mode 100644 index 7c9445f..0000000 --- a/test_vieneu.py +++ /dev/null @@ -1,38 +0,0 @@ -import logging -import sys -import os -from pathlib import Path - -# Add src to path -sys.path.insert(0, os.path.join(os.getcwd(), "src")) - -import asyncio -import local_livekit_plugins -print(f"📦 Imported local_livekit_plugins from: {local_livekit_plugins.__file__}") - -from local_livekit_plugins import VieNeuTTS - -logging.basicConfig(level=logging.INFO) - -async def test_init(): - try: - print("🚀 Testing VieNeuTTS initialization...") - # Note: VieNeuTTS will add models/VieNeu-TTS/src to sys.path itself - tts = VieNeuTTS( - api_base="http://localhost:23333/v1", - model_name="pnnbao-ump/VieNeu-TTS" - ) - print("✅ VieNeuTTS initialized successfully!") - - # Test synthesis capability (without streaming to room) - print("🗣️ Testing synthesis stream...") - stream = tts.synthesize("Xin chào, tôi là trợ lý ảo.") - print(f"✅ Stream created for: {stream.input_text}") - - except Exception as e: - print(f"❌ Test failed: {e}") - import traceback - traceback.print_exc() - -if __name__ == "__main__": - asyncio.run(test_init()) diff --git a/uv.lock b/uv.lock index 4e213f5..f8394c4 100644 --- a/uv.lock +++ b/uv.lock @@ -262,11 +262,10 @@ wheels = [ [[package]] name = "certifi" -version = "2025.11.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } +version = "2022.12.7" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, + { url = "https://download.pytorch.org/whl/certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" }, ] [[package]] @@ -353,91 +352,10 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, - { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, - { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, - { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, - { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, - { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, - { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, - { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, - { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +version = "2.1.1" +source = { registry = "https://download.pytorch.org/whl/cu128" } +wheels = [ + { url = "https://download.pytorch.org/whl/charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" }, ] [[package]] @@ -455,10 +373,9 @@ wheels = [ [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, + { url = "https://download.pytorch.org/whl/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, ] [[package]] @@ -478,8 +395,8 @@ name = "ctranslate2" version = "4.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "pyyaml" }, { name = "setuptools" }, ] @@ -516,6 +433,38 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/98/5635e23ab7135c1dd6e650d5a6636b273cc8e63198066cd31df18d31fa27/ctranslate2-4.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:37b0a05ecddf5f0df5400918e9fe5dc9fb7e2d224e2a5c025ca211d4ede024f6", size = 18864881, upload-time = "2025-11-07T16:09:44.453Z" }, ] +[[package]] +name = "cuda-bindings" +version = "12.9.4" +source = { registry = "https://download.pytorch.org/whl/cu128" } +dependencies = [ + { name = "cuda-pathfinder" }, +] +wheels = [ + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a022c96b8bd847e8dc0675523431149a4c3e872f440e3002213dbb9e08f0331a" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d3c842c2a4303b2a580fe955018e31aea30278be19795ae05226235268032e5" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6a429dc6c13148ff1e27c44f40a3dd23203823e637b87fd0854205195988306" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c912a3d9e6b6651853eed8eed96d6800d69c08e94052c292fec3f282c5a817c9" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:694ba35023846625ef471257e6b5a4bc8af690f961d197d77d34b1d1db393f56" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf8bfaedc238f3b115d957d1fd6562b7e8435ba57f6d0e2f87d0e7149ccb2da5" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3adf4958dcf68ae7801a59b73fb00a8b37f8d0595060d66ceae111b1002de38d" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f53a7f453d4b2643d8663d036bafe29b5ba89eb904c133180f295df6dc151e5" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b72ee72a9cc1b531db31eebaaee5c69a8ec3500e32c6933f2d3b15297b53686" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20f2699d61d724de3eb3f3369d57e2b245f93085cab44fd37c3bea036cea1a6f" }, + { url = "https://download.pytorch.org/whl/cu128/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80bffc357df9988dca279734bc9674c3934a654cab10cadeed27ce17d8635ee" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.2.2" +source = { registry = "https://download.pytorch.org/whl/cu128" } +wheels = [ + { url = "https://download.pytorch.org/whl/cuda_pathfinder-1.2.2-py3-none-any.whl" }, +] + [[package]] name = "distro" version = "1.9.0" @@ -574,10 +523,10 @@ wheels = [ [[package]] name = "filelock" version = "3.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +source = { registry = "https://download.pytorch.org/whl/cu128" } +sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, + { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2" }, ] [[package]] @@ -713,10 +662,10 @@ wheels = [ [[package]] name = "fsspec" version = "2025.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", size = 309285, upload-time = "2025-10-30T14:58:44.036Z" } +source = { registry = "https://download.pytorch.org/whl/cu128" } +sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", size = 200966, upload-time = "2025-10-30T14:58:42.53Z" }, + { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d" }, ] [[package]] @@ -891,23 +840,21 @@ wheels = [ [[package]] name = "idna" -version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +version = "3.4" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, + { url = "https://download.pytorch.org/whl/idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" }, ] [[package]] name = "importlib-metadata" -version = "8.7.0" -source = { registry = "https://pypi.org/simple" } +version = "7.1.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, + { url = "https://download.pytorch.org/whl/importlib_metadata-7.1.0-py3-none-any.whl" }, ] [[package]] @@ -922,13 +869,12 @@ wheels = [ [[package]] name = "jinja2" version = "3.1.6" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, + { url = "https://download.pytorch.org/whl/jinja2-3.1.6-py3-none-any.whl" }, ] [[package]] @@ -1034,8 +980,8 @@ version = "1.0.19" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofiles" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "protobuf" }, { name = "types-protobuf" }, ] @@ -1050,13 +996,11 @@ wheels = [ [[package]] name = "livekit-agents" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiofiles" }, { name = "aiohttp" }, { name = "av" }, - { name = "certifi" }, { name = "click" }, { name = "colorama" }, { name = "docstring-parser" }, @@ -1066,8 +1010,8 @@ dependencies = [ { name = "livekit-blingfire" }, { name = "livekit-protocol" }, { name = "nest-asyncio" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "openai" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp" }, @@ -1078,21 +1022,20 @@ dependencies = [ { name = "pydantic" }, { name = "pyjwt" }, { name = "sounddevice" }, - { name = "typer" }, { name = "types-protobuf" }, { name = "typing-extensions" }, { name = "watchfiles" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/49/d1/17957531cfb92e57ce9bd2494041491069724509425cb9d094c4471546cd/livekit_agents-1.3.3.tar.gz", hash = "sha256:22442d985e2055deb20763c241fb9e6d350822d181e10908b9a181d20d71017a", size = 562181, upload-time = "2025-11-19T21:20:36.594Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/9b/644e0f6029ca66c852327889736fa15965b0f9dfcb1f6097261b1f8c6aad/livekit_agents-1.2.14.tar.gz", hash = "sha256:f21b8440c28175d77d4dae06318d649e8ac734b50c2dfc7aa84fe12f6247f184", size = 527839, upload-time = "2025-10-01T17:54:59.771Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/c4/a6fb618c3c6115a419db11ec8218202a9e51d97e9bd8502b195e053432d5/livekit_agents-1.3.3-py3-none-any.whl", hash = "sha256:91b1408a08ca95651e3f759acc64088724caee78707dfdb31e9f883d7426694e", size = 636962, upload-time = "2025-11-19T21:20:34.681Z" }, + { url = "https://files.pythonhosted.org/packages/31/4e/6925dbc1ae052373215d9802bbbddb40ee7ed7dc561d106021490b4807ac/livekit_agents-1.2.14-py3-none-any.whl", hash = "sha256:505e65db56a1acc1d8d4379712230d5ef72e856331a6cdeb3d8adb9203335608", size = 597012, upload-time = "2025-10-01T17:54:58.039Z" }, ] [package.optional-dependencies] codecs = [ { name = "av" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, ] images = [ { name = "pillow" }, @@ -1149,73 +1092,73 @@ wheels = [ [[package]] name = "livekit-plugins-cartesia" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "livekit-agents" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/2b/519a80a075b7b1ed98cf1ce427d60511529882f11dbbc9698a1199c35324/livekit_plugins_cartesia-1.3.3.tar.gz", hash = "sha256:3355d454ac2b1ba64f6df0fa84983eee8ea4fad34a3ba9fc7764157fd202acbd", size = 12242, upload-time = "2025-11-19T21:20:52.864Z" } +sdist = { url = "https://files.pythonhosted.org/packages/31/80/0bbdd4f014042d3ff4d49463dc5b65a72b782f4023e19ee163ae5a08a5f6/livekit_plugins_cartesia-1.2.14.tar.gz", hash = "sha256:2dcbe4cc4aa6e28a38ac8bdf39dc138f2a4fb0a61de3d9d2dbd2765e6da040b8", size = 10597, upload-time = "2025-10-01T17:55:17.718Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/d6/bada0e5ce7cd663e08270d6fee0bd52c2535dc9c4956cb2d743e2d14e559/livekit_plugins_cartesia-1.3.3-py3-none-any.whl", hash = "sha256:7bb232fcc0ffad727fab55f235bcd60b095049bcd59aeaed58227e8ffe8044e4", size = 15146, upload-time = "2025-11-19T21:20:52.021Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5c/0203c81b7c6a9055aff83e41fed1d198e46f97c8243c367098a1da3c53dc/livekit_plugins_cartesia-1.2.14-py3-none-any.whl", hash = "sha256:09e20c1372e3fd4d05f67e48cf5f1b69e6cc5912c773b61ef5346a22f07a4cdd", size = 13131, upload-time = "2025-10-01T17:55:16.511Z" }, ] [[package]] name = "livekit-plugins-deepgram" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "livekit-agents", extra = ["codecs"] }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/df/c260c8ec2e561ed74293257c978e0ee8c506648d2c48ca426ac584fa9901/livekit_plugins_deepgram-1.3.3.tar.gz", hash = "sha256:d60bbaea9e97b5b0af99df3b59a059e0efe98e230f008f982875045c93bd2a21", size = 15308, upload-time = "2025-11-19T21:20:56.199Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/8b/dc7fbb94d34b7396b0ca9fa9cd3412077636f5509ff8769ef6e5b56d3e77/livekit_plugins_deepgram-1.2.14.tar.gz", hash = "sha256:43a05bf5d008c1f68faffa9da5efee78d3e389a83420251616dfa1e420a2fae3", size = 14546, upload-time = "2025-10-01T17:55:20.707Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/31/ef747638ce66b6d52d188ee179ad5d3e7237a5cd5ca879ee23ed0d903910/livekit_plugins_deepgram-1.3.3-py3-none-any.whl", hash = "sha256:b1b127b26ff4a443255dd4d8a406adc4c5964e5254813450c2356367bd2f9a25", size = 21207, upload-time = "2025-11-19T21:20:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/d1/90/b2caecf4e7f0998f29e5d2313e3179f181c0dafeade5f60734307aff5bfc/livekit_plugins_deepgram-1.2.14-py3-none-any.whl", hash = "sha256:149b8a17999fcf84dc5f5fba454ed58bd25677222a0332d6976743085f37ae79", size = 20562, upload-time = "2025-10-01T17:55:19.735Z" }, ] [[package]] name = "livekit-plugins-openai" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "livekit-agents", extra = ["codecs", "images"] }, { name = "openai", extra = ["realtime"] }, ] -sdist = { url = "https://files.pythonhosted.org/packages/de/13/25cbbf86a7e7e6ecfb8cd3e51e2a72d20c65c5ca9701883eaee83c685aac/livekit_plugins_openai-1.3.3.tar.gz", hash = "sha256:4c43bc37a4854fccd545d1b502c5b52dee53b37a40dbe41343ff33b46b55ffc1", size = 45471, upload-time = "2025-11-19T21:21:25.837Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/df/d91a00dbffe7787829cef5802ad80140dd56f9fc18920606ff99c39e6b37/livekit_plugins_openai-1.2.14.tar.gz", hash = "sha256:70297df328878406abcd4eb680ad9ea770ae1a92be8bc590907f0ee364e65b00", size = 44810, upload-time = "2025-10-01T17:55:45.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/66/7ae04029ab9a65f96f6bd35f161c47044af2e3dedfe1404e28cebe43d7e3/livekit_plugins_openai-1.3.3-py3-none-any.whl", hash = "sha256:d7840dca3e68a22cbbc18ef720308bed917ba88180e163aa2a4849996c0a4ea7", size = 52280, upload-time = "2025-11-19T21:21:24.913Z" }, + { url = "https://files.pythonhosted.org/packages/d5/9c/7f5272dcf55e2c9c2603e148982a523f8103eb7bc0da09aff3fb1806b4c1/livekit_plugins_openai-1.2.14-py3-none-any.whl", hash = "sha256:b80e2c7c1a932dbb968c665df4f1cab5e16b8b9bb0620e72f88936ea4ca7edfb", size = 51697, upload-time = "2025-10-01T17:55:44.611Z" }, ] [[package]] name = "livekit-plugins-silero" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "livekit-agents" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "onnxruntime" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/e8/c738d5122f1a7dbbd52ccb2a6cab957ebdc769d618c38cb79b07b1f975ad/livekit_plugins_silero-1.3.3.tar.gz", hash = "sha256:b2828eae8f5c917042d1ce83415561fdc258f1d28ed44231edbcac3ef7e07b59", size = 1955354, upload-time = "2025-11-19T21:21:34.649Z" } +sdist = { url = "https://files.pythonhosted.org/packages/22/b0/436011ae88837da9e58a23ca121150fb2dad798c9b42de5aa6b8b5920f00/livekit_plugins_silero-1.2.14.tar.gz", hash = "sha256:72a6802927beabf594522327d310e8e01f403766b4f4051f9ecc100203c5b2dd", size = 1955142, upload-time = "2025-10-01T17:55:57.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/fd/64c426a9ba636009d88e31cd1d061f324a606189d71b756ea5cd953b33c0/livekit_plugins_silero-1.3.3-py3-none-any.whl", hash = "sha256:d72d2984db3d24bbae5778ece65b389b3e6d243631bc001a429741b113f50317", size = 3903483, upload-time = "2025-11-19T21:21:32.954Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5c/6d9c2066d52a922f795aeed8f111055f0eadcaa1513de0fb39e94f8e35e8/livekit_plugins_silero-1.2.14-py3-none-any.whl", hash = "sha256:b4a7dd4b61d1120c2bff6816e1716826d15d563f3d6e1acbad9a831acb281d31", size = 3903298, upload-time = "2025-10-01T17:55:55.417Z" }, ] [[package]] name = "livekit-plugins-turn-detector" -version = "1.3.3" +version = "1.2.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "livekit-agents" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "onnxruntime" }, { name = "transformers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/d9/767b8d8fb27575572c5510ace1b077d4d23b1a7c9f1976967c1c642f3dbb/livekit_plugins_turn_detector-1.3.3.tar.gz", hash = "sha256:aef1cf0d60f985470182e0e394faa0e1fe44a6416f076d364e766dc830f2b379", size = 8690, upload-time = "2025-11-19T21:21:47.397Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/9d/cbc0b31378e469c22fdc37e088e9eb35fdd091564d65ab61e39f78b27df3/livekit_plugins_turn_detector-1.2.14.tar.gz", hash = "sha256:d4284e28c93cf485ecad3e235e4eb99389014531a5d07a91a539486aae1d29c7", size = 8159, upload-time = "2025-10-01T17:56:10.266Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/95/c36eb6bcd5d361c8a5c9b15e07394c9f5d04d35e310eb23f87fe0a22aff4/livekit_plugins_turn_detector-1.3.3-py3-none-any.whl", hash = "sha256:a283b1e8e381d8f5d065a960fda33735b1642783e9a5ec8c9a79d7684b596731", size = 10356, upload-time = "2025-11-19T21:21:46.27Z" }, + { url = "https://files.pythonhosted.org/packages/43/76/f52027b2b6f2b5a12ef0fa5422c524912f5c86a55b26dc7ab041798c0a98/livekit_plugins_turn_detector-1.2.14-py3-none-any.whl", hash = "sha256:5e4e819f65d2b14e3e0eb852a52623e4722bb247d60e841457f2b878c87ad5c8", size = 9926, upload-time = "2025-10-01T17:56:09.393Z" }, ] [[package]] @@ -1239,11 +1182,14 @@ dependencies = [ { name = "faster-whisper" }, { name = "livekit-agents", extra = ["silero", "turn-detector"] }, { name = "livekit-plugins-openai" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "piper-tts" }, + { name = "pydantic-settings" }, { name = "python-dotenv" }, { name = "torch" }, + { name = "torchaudio" }, + { name = "torchvision" }, ] [package.optional-dependencies] @@ -1269,8 +1215,11 @@ requires-dist = [ { name = "livekit-plugins-openai", specifier = "~=1.0" }, { name = "numpy", specifier = ">=1.24.0" }, { name = "piper-tts", specifier = ">=1.2.0" }, + { name = "pydantic-settings", specifier = ">=2.13.1" }, { name = "python-dotenv", specifier = ">=1.0.0" }, - { name = "torch", specifier = ">=2.0.0" }, + { name = "torch", specifier = "==2.10.0+cu128" }, + { name = "torchaudio", specifier = "==2.10.0+cu128" }, + { name = "torchvision", specifier = "==0.25.0+cu128" }, ] provides-extras = ["cloud"] @@ -1282,119 +1231,48 @@ dev = [ { name = "ruff", specifier = ">=0.1.0" }, ] -[[package]] -name = "markdown-it-py" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, -] - [[package]] name = "markupsafe" version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, - { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, - { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, - { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, - { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, - { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, - { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +source = { registry = "https://download.pytorch.org/whl/cu128" } +wheels = [ + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp310-cp310-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp311-cp311-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp312-cp312-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314-win_amd64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" }, + { url = "https://download.pytorch.org/whl/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl" }, ] [[package]] name = "mpmath" version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +source = { registry = "https://download.pytorch.org/whl/cu128" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f" } 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" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" }, ] [[package]] @@ -1582,11 +1460,10 @@ wheels = [ [[package]] name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +version = "1.0.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, + { url = "https://download.pytorch.org/whl/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d" }, ] [[package]] @@ -1601,312 +1478,327 @@ wheels = [ [[package]] name = "networkx" version = "3.4.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" }, ] [[package]] name = "networkx" version = "3.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037" } 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" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec" }, ] [[package]] name = "numpy" version = "2.2.6" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } resolution-markers = [ "python_full_version < '3.11'", ] -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/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { 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" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00" }, ] [[package]] name = "numpy" version = "2.3.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10" }, + { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218" }, + { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d" }, + { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5" }, + { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7" }, + { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4" }, + { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e" }, + { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748" }, + { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c" }, + { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c" }, + { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa" }, + { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e" }, + { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5" }, + { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4" }, + { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d" }, + { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28" }, + { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b" }, + { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c" }, + { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952" }, + { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa" }, + { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013" }, + { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff" }, + { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188" }, + { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0" }, + { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903" }, + { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d" }, + { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017" }, + { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf" }, + { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce" }, + { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e" }, + { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b" }, + { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae" }, + { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd" }, + { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f" }, + { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a" }, + { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139" }, + { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e" }, + { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9" }, + { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946" }, + { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1" }, + { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3" }, + { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234" }, + { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7" }, + { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82" }, + { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0" }, + { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63" }, + { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9" }, + { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b" }, + { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520" }, + { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c" }, + { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8" }, + { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248" }, + { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e" }, + { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2" }, + { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad" }, + { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39" }, + { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20" }, + { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52" }, + { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b" }, + { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3" }, + { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227" }, + { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5" }, + { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf" }, + { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42" }, + { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310" }, + { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c" }, + { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18" }, + { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff" }, + { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb" }, + { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7" }, + { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425" }, ] [[package]] name = "nvidia-cublas-cu12" version = "12.8.4.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { 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://pypi.nvidia.com/nvidia-cublas-cu12/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0" }, + { url = "https://pypi.nvidia.com/nvidia-cublas-cu12/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142" }, ] [[package]] name = "nvidia-cuda-cupti-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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" }, + { url = "https://pypi.nvidia.com/nvidia-cuda-cupti-cu12/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed" }, + { url = "https://pypi.nvidia.com/nvidia-cuda-cupti-cu12/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182" }, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" version = "12.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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://pypi.nvidia.com/nvidia-cuda-nvrtc-cu12/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994" }, + { url = "https://pypi.nvidia.com/nvidia-cuda-nvrtc-cu12/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8" }, ] [[package]] name = "nvidia-cuda-runtime-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { 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://pypi.nvidia.com/nvidia-cuda-runtime-cu12/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d" }, + { url = "https://pypi.nvidia.com/nvidia-cuda-runtime-cu12/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90" }, ] [[package]] name = "nvidia-cudnn-cu12" version = "9.10.2.21" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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" }, + { url = "https://pypi.nvidia.com/nvidia-cudnn-cu12/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8" }, + { url = "https://pypi.nvidia.com/nvidia-cudnn-cu12/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8" }, ] [[package]] name = "nvidia-cufft-cu12" version = "11.3.3.83" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { 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://pypi.nvidia.com/nvidia-cufft-cu12/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a" }, + { url = "https://pypi.nvidia.com/nvidia-cufft-cu12/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74" }, ] [[package]] name = "nvidia-cufile-cu12" version = "1.13.1.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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" }, + { url = "https://pypi.nvidia.com/nvidia-cufile-cu12/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc" }, + { url = "https://pypi.nvidia.com/nvidia-cufile-cu12/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a" }, ] [[package]] name = "nvidia-curand-cu12" version = "10.3.9.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { 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://pypi.nvidia.com/nvidia-curand-cu12/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd" }, + { url = "https://pypi.nvidia.com/nvidia-curand-cu12/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9" }, ] [[package]] name = "nvidia-cusolver-cu12" version = "11.7.3.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "nvidia-cublas-cu12" }, { name = "nvidia-cusparse-cu12" }, { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { 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://pypi.nvidia.com/nvidia-cusolver-cu12/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0" }, + { url = "https://pypi.nvidia.com/nvidia-cusolver-cu12/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450" }, ] [[package]] name = "nvidia-cusparse-cu12" version = "12.5.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { 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://pypi.nvidia.com/nvidia-cusparse-cu12/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc" }, + { url = "https://pypi.nvidia.com/nvidia-cusparse-cu12/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b" }, ] [[package]] name = "nvidia-cusparselt-cu12" version = "0.7.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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" }, + { url = "https://pypi.nvidia.com/nvidia-cusparselt-cu12/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5" }, + { url = "https://pypi.nvidia.com/nvidia-cusparselt-cu12/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623" }, ] [[package]] name = "nvidia-nccl-cu12" version = "2.27.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { 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://pypi.nvidia.com/nvidia-nccl-cu12/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:31432ad4d1fb1004eb0c56203dc9bc2178a1ba69d1d9e02d64a6938ab5e40e7a" }, + { url = "https://pypi.nvidia.com/nvidia-nccl-cu12/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457" }, ] [[package]] name = "nvidia-nvjitlink-cu12" version = "12.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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://pypi.nvidia.com/nvidia-nvjitlink-cu12/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88" }, + { url = "https://pypi.nvidia.com/nvidia-nvjitlink-cu12/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7" }, ] [[package]] name = "nvidia-nvshmem-cu12" -version = "3.3.20" -source = { registry = "https://pypi.org/simple" } +version = "3.4.5" +source = { registry = "https://download.pytorch.org/whl/cu128" } 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://pypi.nvidia.com/nvidia-nvshmem-cu12/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b48363fc6964dede448029434c6abed6c5e37f823cb43c3bcde7ecfc0457e15" }, + { url = "https://pypi.nvidia.com/nvidia-nvshmem-cu12/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd" }, ] [[package]] name = "nvidia-nvtx-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } 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://pypi.nvidia.com/nvidia-nvtx-cu12/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615" }, + { url = "https://pypi.nvidia.com/nvidia-nvtx-cu12/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f" }, ] [[package]] @@ -1916,8 +1808,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "coloredlogs" }, { name = "flatbuffers" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "protobuf" }, { name = "sympy" }, @@ -2086,11 +1978,10 @@ wheels = [ [[package]] name = "packaging" -version = "25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +version = "24.1" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://download.pytorch.org/whl/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" }, ] [[package]] @@ -2105,99 +1996,99 @@ wheels = [ [[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/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b", size = 5289809, upload-time = "2025-10-15T18:21:27.791Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1", size = 4650606, upload-time = "2025-10-15T18:21:29.823Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363", size = 6221023, upload-time = "2025-10-15T18:21:31.415Z" }, - { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca", size = 8024937, upload-time = "2025-10-15T18:21:33.453Z" }, - { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e", size = 6334139, upload-time = "2025-10-15T18:21:35.395Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782", size = 7026074, upload-time = "2025-10-15T18:21:37.219Z" }, - { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10", size = 6448852, upload-time = "2025-10-15T18:21:39.168Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa", size = 7117058, upload-time = "2025-10-15T18:21:40.997Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275", size = 6295431, upload-time = "2025-10-15T18:21:42.518Z" }, - { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d", size = 7000412, upload-time = "2025-10-15T18:21:44.404Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7", size = 2435903, upload-time = "2025-10-15T18:21:46.29Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc", size = 5289798, upload-time = "2025-10-15T18:21:47.763Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257", size = 4650589, upload-time = "2025-10-15T18:21:49.515Z" }, - { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642", size = 6230472, upload-time = "2025-10-15T18:21:51.052Z" }, - { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3", size = 8033887, upload-time = "2025-10-15T18:21:52.604Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c", size = 6343964, upload-time = "2025-10-15T18:21:54.619Z" }, - { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227", size = 7034756, upload-time = "2025-10-15T18:21:56.151Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b", size = 6458075, upload-time = "2025-10-15T18:21:57.759Z" }, - { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e", size = 7125955, upload-time = "2025-10-15T18:21:59.372Z" }, - { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739", size = 6298440, upload-time = "2025-10-15T18:22:00.982Z" }, - { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e", size = 6999256, upload-time = "2025-10-15T18:22:02.617Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d", size = 2436025, upload-time = "2025-10-15T18:22:04.598Z" }, - { 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" }, - { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8", size = 5215068, upload-time = "2025-10-15T18:23:59.594Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a", size = 4614994, upload-time = "2025-10-15T18:24:01.669Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197", size = 5246639, upload-time = "2025-10-15T18:24:03.403Z" }, - { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c", size = 6986839, upload-time = "2025-10-15T18:24:05.344Z" }, - { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e", size = 5313505, upload-time = "2025-10-15T18:24:07.137Z" }, - { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76", size = 5963654, upload-time = "2025-10-15T18:24:09.579Z" }, - { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5", size = 6997850, upload-time = "2025-10-15T18:24:11.495Z" }, +source = { registry = "https://download.pytorch.org/whl/cu128" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/08/26e68b6b5da219c2a2cb7b563af008b53bb8e6b6fcb3fa40715fcdb2523a/pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/4e58fb097fb74c7b4758a680aacd558810a417d1edaa7000142976ef9d2f/pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1" }, + { url = "https://files.pythonhosted.org/packages/4b/e0/1fa492aa9f77b3bc6d471c468e62bfea1823056bf7e5e4f1914d7ab2565e/pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363" }, + { url = "https://files.pythonhosted.org/packages/c1/09/4de7cd03e33734ccd0c876f0251401f1314e819cbfd89a0fcb6e77927cc6/pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca" }, + { url = "https://files.pythonhosted.org/packages/2e/69/0688e7c1390666592876d9d474f5e135abb4acb39dcb583c4dc5490f1aff/pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/880921e98f525b9b44ce747ad1ea8f73fd7e992bafe3ca5e5644bf433dea/pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782" }, + { url = "https://files.pythonhosted.org/packages/28/03/96f718331b19b355610ef4ebdbbde3557c726513030665071fd025745671/pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10" }, + { url = "https://files.pythonhosted.org/packages/3a/a0/6a193b3f0cc9437b122978d2c5cbce59510ccf9a5b48825096ed7472da2f/pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa" }, + { url = "https://files.pythonhosted.org/packages/a7/c4/043192375eaa4463254e8e61f0e2ec9a846b983929a8d0a7122e0a6d6fff/pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275" }, + { url = "https://files.pythonhosted.org/packages/92/c6/c2f2fc7e56301c21827e689bb8b0b465f1b52878b57471a070678c0c33cd/pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d" }, + { url = "https://files.pythonhosted.org/packages/b2/d2/5f675067ba82da7a1c238a73b32e3fd78d67f9d9f80fbadd33a40b9c0481/pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/a2f6773b64edb921a756eb0729068acad9fc5208a53f4a349396e9436721/pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc" }, + { url = "https://files.pythonhosted.org/packages/2e/05/069b1f8a2e4b5a37493da6c5868531c3f77b85e716ad7a590ef87d58730d/pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257" }, + { url = "https://files.pythonhosted.org/packages/61/e3/2c820d6e9a36432503ead175ae294f96861b07600a7156154a086ba7111a/pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642" }, + { url = "https://files.pythonhosted.org/packages/4f/89/63427f51c64209c5e23d4d52071c8d0f21024d3a8a487737caaf614a5795/pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3" }, + { url = "https://files.pythonhosted.org/packages/f6/1b/c9711318d4901093c15840f268ad649459cd81984c9ec9887756cca049a5/pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c" }, + { url = "https://files.pythonhosted.org/packages/41/1e/db9470f2d030b4995083044cd8738cdd1bf773106819f6d8ba12597d5352/pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227" }, + { url = "https://files.pythonhosted.org/packages/cc/b0/6177a8bdd5ee4ed87cba2de5a3cc1db55ffbbec6176784ce5bb75aa96798/pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b" }, + { url = "https://files.pythonhosted.org/packages/bc/5e/61537aa6fa977922c6a03253a0e727e6e4a72381a80d63ad8eec350684f2/pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/d5033539344ee3cbd9a4d69e12e63ca3a44a739eb2d4c8da350a3d38edd7/pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739" }, + { url = "https://files.pythonhosted.org/packages/4d/42/aaca386de5cc8bd8a0254516957c1f265e3521c91515b16e286c662854c4/pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e" }, + { url = "https://files.pythonhosted.org/packages/ba/f1/9197c9c2d5708b785f631a6dfbfa8eb3fb9672837cb92ae9af812c13b4ed/pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d" }, + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79" }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0" }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a" }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad" }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6" }, + { 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" }, + { 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" }, + { 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" }, + { 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" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7" }, + { url = "https://files.pythonhosted.org/packages/1d/b3/582327e6c9f86d037b63beebe981425d6811104cb443e8193824ef1a2f27/pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/67748211d119f3b6540baf90f92fae73ae51d5217b171b0e8b5f7e5d558f/pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a" }, + { url = "https://files.pythonhosted.org/packages/2d/e1/f8281e5d844c41872b273b9f2c34a4bf64ca08905668c8ae730eedc7c9fa/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197" }, + { url = "https://files.pythonhosted.org/packages/94/5a/0d8ab8ffe8a102ff5df60d0de5af309015163bf710c7bb3e8311dd3b3ad0/pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c" }, + { url = "https://files.pythonhosted.org/packages/20/2e/3434380e8110b76cd9eb00a363c484b050f949b4bbe84ba770bb8508a02c/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e" }, + { url = "https://files.pythonhosted.org/packages/57/ca/5a9d38900d9d74785141d6580950fe705de68af735ff6e727cb911b64740/pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76" }, + { url = "https://files.pythonhosted.org/packages/95/7e/f896623c3c635a90537ac093c6a618ebe1a90d87206e42309cb5d98a1b9e/pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5" }, ] [[package]] @@ -2530,6 +2421,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] +[[package]] +name = "pydantic-settings" +version = "2.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/6d/fffca34caecc4a3f97bda81b2098da5e8ab7efc9a66e819074a11955d87e/pydantic_settings-2.13.1.tar.gz", hash = "sha256:b4c11847b15237fb0171e1462bf540e294affb9b86db4d9aa5c01730bdbe4025", size = 223826, upload-time = "2026-02-19T13:45:08.055Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/4b/ccc026168948fec4f7555b9164c724cf4125eac006e176541483d2c959be/pydantic_settings-2.13.1-py3-none-any.whl", hash = "sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237", size = 58929, upload-time = "2026-02-19T13:45:06.034Z" }, +] + [[package]] name = "pygments" version = "2.19.2" @@ -2771,30 +2676,16 @@ wheels = [ [[package]] name = "requests" -version = "2.32.5" -source = { registry = "https://pypi.org/simple" } +version = "2.28.1" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, -] - -[[package]] -name = "rich" -version = "14.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://download.pytorch.org/whl/requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" }, ] [[package]] @@ -2851,20 +2742,10 @@ wheels = [ [[package]] name = "setuptools" -version = "80.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, -] - -[[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" } +version = "70.2.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } 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" }, + { url = "https://download.pytorch.org/whl/setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05" }, ] [[package]] @@ -2894,13 +2775,13 @@ wheels = [ [[package]] name = "sympy" version = "1.14.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "mpmath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517" } 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" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" }, ] [[package]] @@ -2979,75 +2860,133 @@ wheels = [ [[package]] name = "torch" -version = "2.9.1" -source = { registry = "https://pypi.org/simple" } +version = "2.10.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ + { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { 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 = "networkx", version = "3.4.2", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "networkx", version = "3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cufile-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "sys_platform == 'linux'" }, { name = "setuptools", marker = "python_full_version >= '3.12'" }, { name = "sympy" }, - { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "triton", marker = "sys_platform == 'linux'" }, { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/56/9577683b23072075ed2e40d725c52c2019d71a972fab8e083763da8e707e/torch-2.9.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:1cc208435f6c379f9b8fdfd5ceb5be1e3b72a6bdf1cb46c0d2812aa73472db9e", size = 104207681, upload-time = "2025-11-12T15:19:56.48Z" }, - { url = "https://files.pythonhosted.org/packages/38/45/be5a74f221df8f4b609b78ff79dc789b0cc9017624544ac4dd1c03973150/torch-2.9.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:9fd35c68b3679378c11f5eb73220fdcb4e6f4592295277fbb657d31fd053237c", size = 899794036, upload-time = "2025-11-12T15:21:01.886Z" }, - { url = "https://files.pythonhosted.org/packages/67/95/a581e8a382596b69385a44bab2733f1273d45c842f5d4a504c0edc3133b6/torch-2.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:2af70e3be4a13becba4655d6cc07dcfec7ae844db6ac38d6c1dafeb245d17d65", size = 110969861, upload-time = "2025-11-12T15:21:30.145Z" }, - { url = "https://files.pythonhosted.org/packages/ad/51/1756dc128d2bf6ea4e0a915cb89ea5e730315ff33d60c1ff56fd626ba3eb/torch-2.9.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:a83b0e84cc375e3318a808d032510dde99d696a85fe9473fc8575612b63ae951", size = 74452222, upload-time = "2025-11-12T15:20:46.223Z" }, - { url = "https://files.pythonhosted.org/packages/15/db/c064112ac0089af3d2f7a2b5bfbabf4aa407a78b74f87889e524b91c5402/torch-2.9.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:62b3fd888277946918cba4478cf849303da5359f0fb4e3bfb86b0533ba2eaf8d", size = 104220430, upload-time = "2025-11-12T15:20:31.705Z" }, - { url = "https://files.pythonhosted.org/packages/56/be/76eaa36c9cd032d3b01b001e2c5a05943df75f26211f68fae79e62f87734/torch-2.9.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d033ff0ac3f5400df862a51bdde9bad83561f3739ea0046e68f5401ebfa67c1b", size = 899821446, upload-time = "2025-11-12T15:20:15.544Z" }, - { url = "https://files.pythonhosted.org/packages/47/cc/7a2949e38dfe3244c4df21f0e1c27bce8aedd6c604a587dd44fc21017cb4/torch-2.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:0d06b30a9207b7c3516a9e0102114024755a07045f0c1d2f2a56b1819ac06bcb", size = 110973074, upload-time = "2025-11-12T15:21:39.958Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ce/7d251155a783fb2c1bb6837b2b7023c622a2070a0a72726ca1df47e7ea34/torch-2.9.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:52347912d868653e1528b47cafaf79b285b98be3f4f35d5955389b1b95224475", size = 74463887, upload-time = "2025-11-12T15:20:36.611Z" }, - { 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" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:e186f57ef1de1aa877943259819468fc6f27efb583b4a91f9215ada7b7f4e6cc" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:36368507b56eaa51acbd3c96ac8893bb9a86991ffcd0699fea3a1a74a2b8bdcb" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:14d2831b9292c3a9b0d80116451315a08ffe8db745d403d06000bc47165b1f9e" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:85ed7944655ea6fd69377692e9cbfd7bba28d99696ceae79985e7caa99cf0a95" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1d01ffaebf64715c0f507a39463149cb19e596ff702bd4bcf862601f2881dabc" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:3523fda6e2cfab2b04ae09b1424681358e508bb3faa11ceb67004113d5e7acad" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:6f09cdf2415516be028ae82e6b985bcfc3eac37bc52ab401142689f6224516ca" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:628e89bd5110ced7debee2a57c69959725b7fbc64eab81a39dd70e46c7e28ba5" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:fbde8f6a9ec8c76979a0d14df21c10b9e5cab6f0d106a73ca73e2179bc597cae" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:bdbcc703382f948e951c063448c9406bf38ce66c41dd698d9e2733fcf96c037a" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:7b4bd23ed63de97456fcc81c26fea9f02ee02ce1112111c4dac0d8cfe574b23e" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313-win_amd64.whl", hash = "sha256:4d1b0b49c54223c7c04050b49eac141d77b6edbc34aea1dfc74a6fdb661baa8c" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:f1f8b840c64b645a4bc61a393db48effb9c92b2dc26c8373873911f0750d1ea7" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:23f58258012bcf1c349cb22af387e33aadca7f83ea617b080e774eb41e4fe8ff" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp313-cp313t-win_amd64.whl", hash = "sha256:01b216e097b17a5277cfb47c383cdcacf06abeadcb0daca0c76b59e72854c3b6" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:c42377bc2607e3e1c60da71b792fb507c3938c87fd6edab8b21c59c91473c36d" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:37d71feea068776855686a1512058df3f19f6f040a151f055aa746601678744f" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314-win_amd64.whl", hash = "sha256:c57017ca29e62271e362fdeee7d20070e254755a5148b30b553d8a10fc83c7ef" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:777461f50b2daf77e4bdd8e2ad34bdfc5a993bf1bdf2ab9ef39f5edfe4e9c12b" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7bcba6a7c5f0987a13298b1ca843155dcceceac758fa3c7ccd5c7af4059a1080" }, + { url = "https://download.pytorch.org/whl/cu128/torch-2.10.0%2Bcu128-cp314-cp314t-win_amd64.whl", hash = "sha256:70d89143c956389d4806cb4e5fe0b1129fe0db280e1073288d17fa76c101cba4" }, +] + +[[package]] +name = "torchaudio" +version = "2.10.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } +dependencies = [ + { name = "torch" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4a216a274d1ceae9e7a4903b0bc140e61d304efef1bf010826fccd059648abf4" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7065bd10ab6994d30667568e8c6498794678ce1ee23d2f0756fb28ce6d623482" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:4c4a5976ae4ca70ed2e99b92c56cf42630d34c2f71f0e021a4c6b917b375cea7" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:502d5bcdbfde751fc8d79169f66da412d28570a09a86526136fe55708edee693" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c50ed1f4bf6743a82f8e621eed1108ffd66c5812d00a9f695c749f9ce5fecde4" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:680fb8dd4e682ecb67c9465ffb3c08cf87926a08b2431eddfc527cc5facefdab" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:08b56d10d1cd8536d40e18caceedc5567a30f5eb24381cde1dfa620724187c92" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26b91a173cee6db9abff68b48d64236950ffc5628d06448ecdd7ac56841e10a" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:9a890dfbc7a3301f5ce7930f3ce452841f0c34e51686609628e99ed52c5cc775" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2a0608579d4e8ecc951cc34c4a7b4edacac8ad32e00d809fa89589cd7f98fd63" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:d7c6ba8e513b94cd9d5f43eed4780737ef1b50941df112adfb5f401c1b216b7a" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313-win_amd64.whl", hash = "sha256:7c819ba73bdad53008238bdf7609c6f0807effe344f7bdc51a9cab397d988766" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c0093580702055734f3facb06aa8bede3f090ba626fb3bfcb280e155058a7f6e" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1529792164ebd43bb973a0464326a333ada488c65b61e833d00b1ef82dc28d36" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp313-cp313t-win_amd64.whl", hash = "sha256:0dcb78ddc06439410a12da8317f38b59fc1a810eea8284589bc00178ed09183d" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:3d41ec271681b00b73d006cfccca42c7aa6b87560961c21af1d35d241d5d10c6" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:90852cbeb1f3519b8b5d91ced7945827e92ad53048687384a7a3c401aeb5cced" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314-win_amd64.whl", hash = "sha256:54656003221cf49b9b99eea9dc7ed6a49351635b7e55ad579d558dafd4d674f0" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:de318c9c00d3cb2cd57eaa67cfe63beff7fe7ec851ba8976c016994080df19ce" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:e6aaaf49a986faef74e8d3a04412ed0bb17c748aaf6dc6bd748726d8beba0886" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchaudio-2.10.0%2Bcu128-cp314-cp314t-win_amd64.whl", hash = "sha256:e80f81a454f182a48310c16b68ec1cc2d439d76eebcf6ed03bd3a69fef9986b0" }, +] + +[[package]] +name = "torchvision" +version = "0.25.0+cu128" +source = { registry = "https://download.pytorch.org/whl/cu128" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7fe593ec669dcb74c3749548c21ae302edbb610d1844bf2bae622accdef76dbc" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:43350ca113e9f224dedb90b0dbc31853fde4f322794cbe4a7589fccab5768f0c" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp310-cp310-win_amd64.whl", hash = "sha256:cef372be1a78856000cd04b72e5d738a0d851022c68b6900cbbd61dc91c25f79" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5d576c65d40198627e0fad03bddeb0ef536371312f2bdfcc804c22fd28fa6018" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ebf2b495c76097796b9a2eac9290efbcae96e0fd9e5ae52c40eff188610bb440" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:af00b4e0cdb3f490f4393e9a335b622fe1b92fd5afb181033256ccba03b9637c" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:8623e534ef6a815bd6407d4b52dd70c7154e2eda626ad4b9cb895d36c5a3305b" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:1255a0ca2bf987acf9f103b96c5c4cfe3415fc4a1eef17fa08af527a04a4f573" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:068e519838b4a8b32a09521244b170edd8c2ac9eeb6538b7bf492cd70e57ebf5" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:12c253520a26483fe3c614f63ff16eca6d9b0b4ebe510699b7d15d88e6c0cd35" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:a9c0de893dce9c2913c9c7ae88a916910f92d02b99da149678806d18e8079f29" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313-win_amd64.whl", hash = "sha256:e2e0317e3861bba1b5aeba7c1cb4bcd50937cf0bffdbea478619d1f5f73e9050" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:58b2971b55c761f1d2491bd80fcc4618ea97d363d387a9dd3aff23220cbee264" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:1b6878b043513ea3dea1b90bfb5193455d9b248b8c4d5e66ea9f5d1643a43f13" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp313-cp313t-win_amd64.whl", hash = "sha256:96cd2ba7b289117873b2a8f4c80605d38118d920b1045f3ce21a9f0ca68a701e" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e2dbf9ea9f4b2416822249e96ff3ad873d9a84e51285d6b9967732be3015c523" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:5b7ad3fb6cf03ef2a2fd617cb4b4e41efa9bb0143c67f506c2a3e6765c7b12ad" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314-win_amd64.whl", hash = "sha256:a52ff3b072e89280f41499813e11c418d168ffc502b86cb17767bab29f432b3a" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:687987fbcb074fd7f7a61cf2b407b1eac07588ace8351a3a36978546a00adc52" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:84c5e2cb699235339b8a5c295e974a795244a45d1104ecee658d9d19600cdc75" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torchvision-0.25.0%2Bcu128-cp314-cp314t-win_amd64.whl", hash = "sha256:d1cf27bc2da13fd9e83694ae601b1bf4135c24d9c9e9ec249056896395a78a9e" }, ] [[package]] name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } +version = "4.66.5" +source = { registry = "https://download.pytorch.org/whl/cu128" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://download.pytorch.org/whl/tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd" }, ] [[package]] @@ -3057,8 +2996,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.3.5", source = { registry = "https://download.pytorch.org/whl/cu128" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, @@ -3074,31 +3013,23 @@ wheels = [ [[package]] name = "triton" -version = "3.5.1" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/6e/676ab5019b4dde8b9b7bab71245102fc02778ef3df48218b298686b9ffd6/triton-3.5.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fc53d849f879911ea13f4a877243afc513187bc7ee92d1f2c0f1ba3169e3c94", size = 170320692, upload-time = "2025-11-11T17:40:46.074Z" }, - { url = "https://files.pythonhosted.org/packages/b0/72/ec90c3519eaf168f22cb1757ad412f3a2add4782ad3a92861c9ad135d886/triton-3.5.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:61413522a48add32302353fdbaaf92daaaab06f6b5e3229940d21b5207f47579", size = 170425802, upload-time = "2025-11-11T17:40:53.209Z" }, - { 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" }, -] - -[[package]] -name = "typer" -version = "0.20.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "rich" }, - { name = "shellingham" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, +version = "3.6.0" +source = { registry = "https://download.pytorch.org/whl/cu128" } +wheels = [ + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d0b7b9b4f29ade31cf7bd7c237b50d270a2487cf943d034b307a9b3f73d9c7" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:72d6b3eeaa13444ca29ba65d55fc57b6411373a2b8e619f63ae5962d3d9ea249" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:290687f4f310ce794a07d6a43fa94dea9bda86615bf04578533378503bed715a" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e021e87e8f266c6f87bf379b669c43c2800aac6247bdf5d518cb553e3c403c00" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e42d084864d12b8784736fe51a0cd05f6cc56775b25c8102c9d80c421f4e298" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f5928e6d44c34a97bbe164cceddc0ef2007121c89ebcfba5415cf452de7ee9f" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:58d57d6796b0004076315433526fe9d4af42044d430afdee1e6cd42a76bd6d09" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0075039ff27765480083b1a109999bf27110f3542f1f9fad95f0f9065a36da79" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ff9ec4c96f405bf2735c531af27f8cc2215927440e52fb1fbc8014961d5d12" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a619c81f8e77116b1d10aec34d62db72daa5c0fb70a6478c9afab25edb729c52" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20ed2f770f7217b8a994cba99e7cac37e7be735a3991344990b80ab4fea964c4" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d800bda666ebbe7ec2146e3f5eb271ee87f8fac724011dc7f25dee9bfb5f7f" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89b87d2837849a9bcd3d960ad2e3dac0345c6e1359b9859e29f68083cbda9b1d" }, + { url = "https://download-r2.pytorch.org/whl/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:621c0e5973d834507ec69dcf909f35f0b02c5df490fde100433cef83359b7eeb" }, ] [[package]] @@ -3113,10 +3044,9 @@ wheels = [ [[package]] name = "typing-extensions" version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://download.pytorch.org/whl/typing_extensions-4.15.0-py3-none-any.whl" }, ] [[package]] @@ -3133,11 +3063,10 @@ wheels = [ [[package]] name = "urllib3" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +version = "1.26.13" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://download.pytorch.org/whl/urllib3-1.26.13-py2.py3-none-any.whl", hash = "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc" }, ] [[package]] @@ -3430,9 +3359,8 @@ wheels = [ [[package]] name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +version = "3.19.2" +source = { registry = "https://download.pytorch.org/whl/cu128" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, + { url = "https://download.pytorch.org/whl/zipp-3.19.2-py3-none-any.whl" }, ]