Metadata-Version: 2.4
Name: airunner-services
Version: 6.1.3
Summary: AIRunner headless service package
Home-page: https://github.com/Capsize-Games/airunner
Author: Capsize LLC
Author-email: contact@capsizegames.com
License: GPL-3.0-only
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Requires-Python: >=3.13.3
Description-Content-Type: text/markdown
Requires-Dist: airunner-common==6.1.3
Requires-Dist: facehuggershield==1.0.0
Requires-Dist: numpy==2.2.5
Requires-Dist: packaging>=24.0
Requires-Dist: pillow==12.2.0
Requires-Dist: pydantic<3.0,>=2.7
Requires-Dist: nltk>=3.9.1
Requires-Dist: alembic==1.13.2
Requires-Dist: sqlalchemy==2.0.38
Requires-Dist: jinja2==3.1.6
Requires-Dist: pyyaml==6.0.2
Requires-Dist: python-dotenv==1.2.2
Requires-Dist: fastapi==0.115.0
Requires-Dist: python-multipart>=0.0.27
Requires-Dist: uvicorn[standard]==0.34.0
Requires-Dist: psutil>=5.9.0
Requires-Dist: pandas>=2.0.0
Provides-Extra: core
Provides-Extra: nvidia
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "nvidia"
Provides-Extra: linux
Provides-Extra: development
Requires-Dist: pytest; extra == "development"
Requires-Dist: pytest-timeout; extra == "development"
Requires-Dist: responses>=0.25.0; extra == "development"
Requires-Dist: coverage==7.8.0; extra == "development"
Requires-Dist: black==26.3.1; extra == "development"
Requires-Dist: pyinstaller==6.12.0; extra == "development"
Requires-Dist: flake8==7.2.0; extra == "development"
Requires-Dist: mypy==1.16.0; extra == "development"
Requires-Dist: autoflake==2.3.1; extra == "development"
Requires-Dist: pandas>=2.0.0; extra == "development"
Requires-Dist: pyarrow>=14.0.0; extra == "development"
Requires-Dist: tqdm>=4.0.0; extra == "development"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-timeout; extra == "dev"
Requires-Dist: responses>=0.25.0; extra == "dev"
Requires-Dist: coverage==7.8.0; extra == "dev"
Requires-Dist: black==26.3.1; extra == "dev"
Requires-Dist: pyinstaller==6.12.0; extra == "dev"
Requires-Dist: flake8==7.2.0; extra == "dev"
Requires-Dist: mypy==1.16.0; extra == "dev"
Requires-Dist: autoflake==2.3.1; extra == "dev"
Requires-Dist: pandas>=2.0.0; extra == "dev"
Requires-Dist: pyarrow>=14.0.0; extra == "dev"
Requires-Dist: tqdm>=4.0.0; extra == "dev"
Provides-Extra: art
Requires-Dist: DeepCache==0.1.1; extra == "art"
Requires-Dist: tomesd==0.1.3; extra == "art"
Requires-Dist: gguf==0.17.1; extra == "art"
Provides-Extra: huggingface
Requires-Dist: diffusers==0.38.0; extra == "huggingface"
Requires-Dist: controlnet_aux==0.0.10; extra == "huggingface"
Requires-Dist: safetensors==0.8.0; extra == "huggingface"
Requires-Dist: kornia; extra == "huggingface"
Requires-Dist: timm; extra == "huggingface"
Requires-Dist: compel==2.4.0; extra == "huggingface"
Requires-Dist: transformers==5.8.1; extra == "huggingface"
Requires-Dist: datasets==4.0.0; extra == "huggingface"
Provides-Extra: llm-native
Requires-Dist: torch==2.13.0+cu129; extra == "llm-native"
Requires-Dist: torchvision==0.28.0+cu129; extra == "llm-native"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "llm-native"
Requires-Dist: accelerate==1.14.0; extra == "llm-native"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "llm-native"
Requires-Dist: tokenizers==0.22.2; extra == "llm-native"
Requires-Dist: optimum==1.25.1; extra == "llm-native"
Requires-Dist: llama-cpp-python==0.3.21; extra == "llm-native"
Requires-Dist: bitsandbytes==0.46.1; extra == "llm-native"
Requires-Dist: sentence_transformers==5.6.1; extra == "llm-native"
Requires-Dist: cryptography==46.0.7; extra == "llm-native"
Requires-Dist: sumy==0.11.0; extra == "llm-native"
Requires-Dist: sentencepiece==0.2.1; extra == "llm-native"
Requires-Dist: lingua-language-detector==2.1.0; extra == "llm-native"
Requires-Dist: markdown==3.8.1; extra == "llm-native"
Requires-Dist: libzim==3.7.0; extra == "llm-native"
Requires-Dist: mistral_common>=1.8.5; extra == "llm-native"
Requires-Dist: rank-bm25>=0.2.2; extra == "llm-native"
Requires-Dist: llama-cloud==0.1.23; extra == "llm-native"
Requires-Dist: langchain-core==1.3.3; extra == "llm-native"
Requires-Dist: langchain-huggingface==1.2.2; extra == "llm-native"
Requires-Dist: langgraph==1.0.8; extra == "llm-native"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "llm-native"
Requires-Dist: langsmith>=0.8.0; extra == "llm-native"
Requires-Dist: langchain-ollama==1.0.0; extra == "llm-native"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "llm-native"
Requires-Dist: EbookLib==0.19; extra == "llm-native"
Requires-Dist: mobi==0.4.1; extra == "llm-native"
Requires-Dist: pypdf>=5.6.0; extra == "llm-native"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "llm-native"
Provides-Extra: stt-native
Requires-Dist: sounddevice==0.5.1; extra == "stt-native"
Provides-Extra: art-python
Requires-Dist: torch==2.13.0+cu129; extra == "art-python"
Requires-Dist: torchvision==0.28.0+cu129; extra == "art-python"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "art-python"
Requires-Dist: accelerate==1.14.0; extra == "art-python"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "art-python"
Requires-Dist: tokenizers==0.22.2; extra == "art-python"
Requires-Dist: optimum==1.25.1; extra == "art-python"
Requires-Dist: diffusers==0.38.0; extra == "art-python"
Requires-Dist: controlnet_aux==0.0.10; extra == "art-python"
Requires-Dist: safetensors==0.8.0; extra == "art-python"
Requires-Dist: kornia; extra == "art-python"
Requires-Dist: timm; extra == "art-python"
Requires-Dist: compel==2.4.0; extra == "art-python"
Requires-Dist: transformers==5.8.1; extra == "art-python"
Requires-Dist: datasets==4.0.0; extra == "art-python"
Requires-Dist: DeepCache==0.1.1; extra == "art-python"
Requires-Dist: tomesd==0.1.3; extra == "art-python"
Requires-Dist: gguf==0.17.1; extra == "art-python"
Provides-Extra: llm
Requires-Dist: torch==2.13.0+cu129; extra == "llm"
Requires-Dist: torchvision==0.28.0+cu129; extra == "llm"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "llm"
Requires-Dist: accelerate==1.14.0; extra == "llm"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "llm"
Requires-Dist: tokenizers==0.22.2; extra == "llm"
Requires-Dist: optimum==1.25.1; extra == "llm"
Requires-Dist: llama-cpp-python==0.3.21; extra == "llm"
Requires-Dist: bitsandbytes==0.46.1; extra == "llm"
Requires-Dist: sentence_transformers==5.6.1; extra == "llm"
Requires-Dist: cryptography==46.0.7; extra == "llm"
Requires-Dist: sumy==0.11.0; extra == "llm"
Requires-Dist: sentencepiece==0.2.1; extra == "llm"
Requires-Dist: lingua-language-detector==2.1.0; extra == "llm"
Requires-Dist: markdown==3.8.1; extra == "llm"
Requires-Dist: libzim==3.7.0; extra == "llm"
Requires-Dist: mistral_common>=1.8.5; extra == "llm"
Requires-Dist: rank-bm25>=0.2.2; extra == "llm"
Requires-Dist: llama-cloud==0.1.23; extra == "llm"
Requires-Dist: langchain-core==1.3.3; extra == "llm"
Requires-Dist: langchain-huggingface==1.2.2; extra == "llm"
Requires-Dist: langgraph==1.0.8; extra == "llm"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "llm"
Requires-Dist: langsmith>=0.8.0; extra == "llm"
Requires-Dist: langchain-ollama==1.0.0; extra == "llm"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "llm"
Requires-Dist: EbookLib==0.19; extra == "llm"
Requires-Dist: mobi==0.4.1; extra == "llm"
Requires-Dist: pypdf>=5.6.0; extra == "llm"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "llm"
Requires-Dist: sounddevice==0.5.1; extra == "llm"
Requires-Dist: pyttsx3==2.91; extra == "llm"
Provides-Extra: llm-weather
Requires-Dist: requests-cache==1.2.1; extra == "llm-weather"
Requires-Dist: retry-requests==2.0.0; extra == "llm-weather"
Requires-Dist: openmeteo_requests==1.4.0; extra == "llm-weather"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "llm-weather"
Provides-Extra: llm-weather
Requires-Dist: requests-cache==1.2.1; extra == "llm-weather"
Requires-Dist: retry-requests==2.0.0; extra == "llm-weather"
Requires-Dist: openmeteo_requests==1.4.0; extra == "llm-weather"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "llm-weather"
Provides-Extra: tts
Requires-Dist: inflect==7.5.0; extra == "tts"
Requires-Dist: pycountry==24.6.1; extra == "tts"
Requires-Dist: librosa==0.11.0; extra == "tts"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "tts"
Provides-Extra: tts-python
Requires-Dist: torch==2.13.0+cu129; extra == "tts-python"
Requires-Dist: torchvision==0.28.0+cu129; extra == "tts-python"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "tts-python"
Requires-Dist: accelerate==1.14.0; extra == "tts-python"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "tts-python"
Requires-Dist: tokenizers==0.22.2; extra == "tts-python"
Requires-Dist: optimum==1.25.1; extra == "tts-python"
Requires-Dist: inflect==7.5.0; extra == "tts-python"
Requires-Dist: pycountry==24.6.1; extra == "tts-python"
Requires-Dist: librosa==0.11.0; extra == "tts-python"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "tts-python"
Requires-Dist: pyttsx3==2.91; extra == "tts-python"
Requires-Dist: pydub==0.25.1; extra == "tts-python"
Requires-Dist: wavmark==0.0.3; extra == "tts-python"
Requires-Dist: eng_to_ipa==0.0.2; extra == "tts-python"
Requires-Dist: unidecode==1.4.0; extra == "tts-python"
Requires-Dist: langid==1.1.6; extra == "tts-python"
Requires-Dist: txtsplit==1.0.0; extra == "tts-python"
Requires-Dist: num2words==0.5.14; extra == "tts-python"
Requires-Dist: g2p_en==2.1.0; extra == "tts-python"
Requires-Dist: anyascii==0.3.2; extra == "tts-python"
Requires-Dist: loguru==0.7.3; extra == "tts-python"
Requires-Dist: pypinyin==0.54.0; extra == "tts-python"
Requires-Dist: jieba==0.42.1; extra == "tts-python"
Requires-Dist: cn2an==0.5.23; extra == "tts-python"
Requires-Dist: g2pkk>=0.1.2; extra == "tts-python"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "tts-python"
Requires-Dist: networkx==3.4.2; extra == "tts-python"
Provides-Extra: openvoice
Requires-Dist: librosa==0.11.0; extra == "openvoice"
Requires-Dist: pydub==0.25.1; extra == "openvoice"
Requires-Dist: wavmark==0.0.3; extra == "openvoice"
Requires-Dist: eng_to_ipa==0.0.2; extra == "openvoice"
Requires-Dist: inflect==7.5.0; extra == "openvoice"
Requires-Dist: unidecode==1.4.0; extra == "openvoice"
Requires-Dist: langid==1.1.6; extra == "openvoice"
Provides-Extra: melotts
Requires-Dist: txtsplit==1.0.0; extra == "melotts"
Requires-Dist: num2words==0.5.14; extra == "melotts"
Requires-Dist: g2p_en==2.1.0; extra == "melotts"
Requires-Dist: anyascii==0.3.2; extra == "melotts"
Requires-Dist: loguru==0.7.3; extra == "melotts"
Provides-Extra: openvoice-cn
Requires-Dist: pypinyin==0.54.0; extra == "openvoice-cn"
Requires-Dist: jieba==0.42.1; extra == "openvoice-cn"
Requires-Dist: cn2an==0.5.23; extra == "openvoice-cn"
Provides-Extra: openvoice-jp
Requires-Dist: unidic_lite==1.0.8; extra == "openvoice-jp"
Requires-Dist: unidic==1.1.0; extra == "openvoice-jp"
Requires-Dist: mecab-python3==1.0.10; extra == "openvoice-jp"
Requires-Dist: fugashi==1.4.0; extra == "openvoice-jp"
Requires-Dist: pykakasi==2.3.0; extra == "openvoice-jp"
Provides-Extra: openvoice-kr
Requires-Dist: jamo==0.4.1; extra == "openvoice-kr"
Requires-Dist: python-mecab-ko==1.3.7; extra == "openvoice-kr"
Requires-Dist: python-mecab-ko-dic==2.1.1.post2; extra == "openvoice-kr"
Provides-Extra: openvoice-tw
Requires-Dist: g2pkk>=0.1.2; extra == "openvoice-tw"
Provides-Extra: gruut-support
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "gruut-support"
Requires-Dist: networkx==3.4.2; extra == "gruut-support"
Provides-Extra: search
Requires-Dist: ddgs>=9.0.0; extra == "search"
Requires-Dist: aiohttp>=3.13.4; extra == "search"
Requires-Dist: google-api-python-client>=2.170.0; extra == "search"
Requires-Dist: wikipedia>=1.4.0; extra == "search"
Requires-Dist: scrapy==2.14.2; extra == "search"
Requires-Dist: trafilatura==2.0.0; extra == "search"
Provides-Extra: computer-use
Requires-Dist: pyautogui>=0.9.54; extra == "computer-use"
Requires-Dist: pyscreeze>=1.0.1; extra == "computer-use"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "computer-use"
Requires-Dist: pygetwindow>=0.0.9; extra == "computer-use"
Provides-Extra: computer-use
Requires-Dist: pyautogui>=0.9.54; extra == "computer-use"
Requires-Dist: pyscreeze>=1.0.1; extra == "computer-use"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "computer-use"
Requires-Dist: pygetwindow>=0.0.9; extra == "computer-use"
Provides-Extra: headless
Requires-Dist: torch==2.13.0+cu129; extra == "headless"
Requires-Dist: torchvision==0.28.0+cu129; extra == "headless"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "headless"
Requires-Dist: accelerate==1.14.0; extra == "headless"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "headless"
Requires-Dist: tokenizers==0.22.2; extra == "headless"
Requires-Dist: optimum==1.25.1; extra == "headless"
Requires-Dist: llama-cpp-python==0.3.21; extra == "headless"
Requires-Dist: bitsandbytes==0.46.1; extra == "headless"
Requires-Dist: sentence_transformers==5.6.1; extra == "headless"
Requires-Dist: cryptography==46.0.7; extra == "headless"
Requires-Dist: sumy==0.11.0; extra == "headless"
Requires-Dist: sentencepiece==0.2.1; extra == "headless"
Requires-Dist: lingua-language-detector==2.1.0; extra == "headless"
Requires-Dist: markdown==3.8.1; extra == "headless"
Requires-Dist: libzim==3.7.0; extra == "headless"
Requires-Dist: mistral_common>=1.8.5; extra == "headless"
Requires-Dist: rank-bm25>=0.2.2; extra == "headless"
Requires-Dist: llama-cloud==0.1.23; extra == "headless"
Requires-Dist: langchain-core==1.3.3; extra == "headless"
Requires-Dist: langchain-huggingface==1.2.2; extra == "headless"
Requires-Dist: langgraph==1.0.8; extra == "headless"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "headless"
Requires-Dist: langsmith>=0.8.0; extra == "headless"
Requires-Dist: langchain-ollama==1.0.0; extra == "headless"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "headless"
Requires-Dist: EbookLib==0.19; extra == "headless"
Requires-Dist: mobi==0.4.1; extra == "headless"
Requires-Dist: pypdf>=5.6.0; extra == "headless"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "headless"
Requires-Dist: sounddevice==0.5.1; extra == "headless"
Requires-Dist: diffusers==0.38.0; extra == "headless"
Requires-Dist: controlnet_aux==0.0.10; extra == "headless"
Requires-Dist: safetensors==0.8.0; extra == "headless"
Requires-Dist: kornia; extra == "headless"
Requires-Dist: timm; extra == "headless"
Requires-Dist: compel==2.4.0; extra == "headless"
Requires-Dist: transformers==5.8.1; extra == "headless"
Requires-Dist: datasets==4.0.0; extra == "headless"
Requires-Dist: DeepCache==0.1.1; extra == "headless"
Requires-Dist: tomesd==0.1.3; extra == "headless"
Requires-Dist: gguf==0.17.1; extra == "headless"
Requires-Dist: inflect==7.5.0; extra == "headless"
Requires-Dist: pycountry==24.6.1; extra == "headless"
Requires-Dist: librosa==0.11.0; extra == "headless"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "headless"
Requires-Dist: pyttsx3==2.91; extra == "headless"
Requires-Dist: pydub==0.25.1; extra == "headless"
Requires-Dist: wavmark==0.0.3; extra == "headless"
Requires-Dist: eng_to_ipa==0.0.2; extra == "headless"
Requires-Dist: unidecode==1.4.0; extra == "headless"
Requires-Dist: langid==1.1.6; extra == "headless"
Requires-Dist: txtsplit==1.0.0; extra == "headless"
Requires-Dist: num2words==0.5.14; extra == "headless"
Requires-Dist: g2p_en==2.1.0; extra == "headless"
Requires-Dist: anyascii==0.3.2; extra == "headless"
Requires-Dist: loguru==0.7.3; extra == "headless"
Requires-Dist: pypinyin==0.54.0; extra == "headless"
Requires-Dist: jieba==0.42.1; extra == "headless"
Requires-Dist: cn2an==0.5.23; extra == "headless"
Requires-Dist: g2pkk>=0.1.2; extra == "headless"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "headless"
Requires-Dist: networkx==3.4.2; extra == "headless"
Provides-Extra: desktop
Requires-Dist: torch==2.13.0+cu129; extra == "desktop"
Requires-Dist: torchvision==0.28.0+cu129; extra == "desktop"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "desktop"
Requires-Dist: accelerate==1.14.0; extra == "desktop"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "desktop"
Requires-Dist: tokenizers==0.22.2; extra == "desktop"
Requires-Dist: optimum==1.25.1; extra == "desktop"
Requires-Dist: llama-cpp-python==0.3.21; extra == "desktop"
Requires-Dist: bitsandbytes==0.46.1; extra == "desktop"
Requires-Dist: sentence_transformers==5.6.1; extra == "desktop"
Requires-Dist: cryptography==46.0.7; extra == "desktop"
Requires-Dist: sumy==0.11.0; extra == "desktop"
Requires-Dist: sentencepiece==0.2.1; extra == "desktop"
Requires-Dist: lingua-language-detector==2.1.0; extra == "desktop"
Requires-Dist: markdown==3.8.1; extra == "desktop"
Requires-Dist: libzim==3.7.0; extra == "desktop"
Requires-Dist: mistral_common>=1.8.5; extra == "desktop"
Requires-Dist: rank-bm25>=0.2.2; extra == "desktop"
Requires-Dist: llama-cloud==0.1.23; extra == "desktop"
Requires-Dist: langchain-core==1.3.3; extra == "desktop"
Requires-Dist: langchain-huggingface==1.2.2; extra == "desktop"
Requires-Dist: langgraph==1.0.8; extra == "desktop"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "desktop"
Requires-Dist: langsmith>=0.8.0; extra == "desktop"
Requires-Dist: langchain-ollama==1.0.0; extra == "desktop"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "desktop"
Requires-Dist: EbookLib==0.19; extra == "desktop"
Requires-Dist: mobi==0.4.1; extra == "desktop"
Requires-Dist: pypdf>=5.6.0; extra == "desktop"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "desktop"
Requires-Dist: sounddevice==0.5.1; extra == "desktop"
Requires-Dist: diffusers==0.38.0; extra == "desktop"
Requires-Dist: controlnet_aux==0.0.10; extra == "desktop"
Requires-Dist: safetensors==0.8.0; extra == "desktop"
Requires-Dist: kornia; extra == "desktop"
Requires-Dist: timm; extra == "desktop"
Requires-Dist: compel==2.4.0; extra == "desktop"
Requires-Dist: transformers==5.8.1; extra == "desktop"
Requires-Dist: datasets==4.0.0; extra == "desktop"
Requires-Dist: DeepCache==0.1.1; extra == "desktop"
Requires-Dist: tomesd==0.1.3; extra == "desktop"
Requires-Dist: gguf==0.17.1; extra == "desktop"
Requires-Dist: inflect==7.5.0; extra == "desktop"
Requires-Dist: pycountry==24.6.1; extra == "desktop"
Requires-Dist: librosa==0.11.0; extra == "desktop"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "desktop"
Requires-Dist: pyttsx3==2.91; extra == "desktop"
Requires-Dist: pydub==0.25.1; extra == "desktop"
Requires-Dist: wavmark==0.0.3; extra == "desktop"
Requires-Dist: eng_to_ipa==0.0.2; extra == "desktop"
Requires-Dist: unidecode==1.4.0; extra == "desktop"
Requires-Dist: langid==1.1.6; extra == "desktop"
Requires-Dist: txtsplit==1.0.0; extra == "desktop"
Requires-Dist: num2words==0.5.14; extra == "desktop"
Requires-Dist: g2p_en==2.1.0; extra == "desktop"
Requires-Dist: anyascii==0.3.2; extra == "desktop"
Requires-Dist: loguru==0.7.3; extra == "desktop"
Requires-Dist: pypinyin==0.54.0; extra == "desktop"
Requires-Dist: jieba==0.42.1; extra == "desktop"
Requires-Dist: cn2an==0.5.23; extra == "desktop"
Requires-Dist: g2pkk>=0.1.2; extra == "desktop"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "desktop"
Requires-Dist: networkx==3.4.2; extra == "desktop"
Requires-Dist: requests-cache==1.2.1; extra == "desktop"
Requires-Dist: retry-requests==2.0.0; extra == "desktop"
Requires-Dist: openmeteo_requests==1.4.0; extra == "desktop"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "desktop"
Requires-Dist: ddgs>=9.0.0; extra == "desktop"
Requires-Dist: aiohttp>=3.13.4; extra == "desktop"
Requires-Dist: google-api-python-client>=2.170.0; extra == "desktop"
Requires-Dist: wikipedia>=1.4.0; extra == "desktop"
Requires-Dist: scrapy==2.14.2; extra == "desktop"
Requires-Dist: trafilatura==2.0.0; extra == "desktop"
Requires-Dist: pyautogui>=0.9.54; extra == "desktop"
Requires-Dist: pyscreeze>=1.0.1; extra == "desktop"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "desktop"
Requires-Dist: pygetwindow>=0.0.9; extra == "desktop"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "desktop"
Provides-Extra: all
Requires-Dist: torch==2.13.0+cu129; extra == "all"
Requires-Dist: torchvision==0.28.0+cu129; extra == "all"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "all"
Requires-Dist: accelerate==1.14.0; extra == "all"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "all"
Requires-Dist: tokenizers==0.22.2; extra == "all"
Requires-Dist: optimum==1.25.1; extra == "all"
Requires-Dist: llama-cpp-python==0.3.21; extra == "all"
Requires-Dist: bitsandbytes==0.46.1; extra == "all"
Requires-Dist: sentence_transformers==5.6.1; extra == "all"
Requires-Dist: cryptography==46.0.7; extra == "all"
Requires-Dist: sumy==0.11.0; extra == "all"
Requires-Dist: sentencepiece==0.2.1; extra == "all"
Requires-Dist: lingua-language-detector==2.1.0; extra == "all"
Requires-Dist: markdown==3.8.1; extra == "all"
Requires-Dist: libzim==3.7.0; extra == "all"
Requires-Dist: mistral_common>=1.8.5; extra == "all"
Requires-Dist: rank-bm25>=0.2.2; extra == "all"
Requires-Dist: llama-cloud==0.1.23; extra == "all"
Requires-Dist: langchain-core==1.3.3; extra == "all"
Requires-Dist: langchain-huggingface==1.2.2; extra == "all"
Requires-Dist: langgraph==1.0.8; extra == "all"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "all"
Requires-Dist: langsmith>=0.8.0; extra == "all"
Requires-Dist: langchain-ollama==1.0.0; extra == "all"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "all"
Requires-Dist: EbookLib==0.19; extra == "all"
Requires-Dist: mobi==0.4.1; extra == "all"
Requires-Dist: pypdf>=5.6.0; extra == "all"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "all"
Requires-Dist: sounddevice==0.5.1; extra == "all"
Requires-Dist: diffusers==0.38.0; extra == "all"
Requires-Dist: controlnet_aux==0.0.10; extra == "all"
Requires-Dist: safetensors==0.8.0; extra == "all"
Requires-Dist: kornia; extra == "all"
Requires-Dist: timm; extra == "all"
Requires-Dist: compel==2.4.0; extra == "all"
Requires-Dist: transformers==5.8.1; extra == "all"
Requires-Dist: datasets==4.0.0; extra == "all"
Requires-Dist: DeepCache==0.1.1; extra == "all"
Requires-Dist: tomesd==0.1.3; extra == "all"
Requires-Dist: gguf==0.17.1; extra == "all"
Requires-Dist: inflect==7.5.0; extra == "all"
Requires-Dist: pycountry==24.6.1; extra == "all"
Requires-Dist: librosa==0.11.0; extra == "all"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "all"
Requires-Dist: pyttsx3==2.91; extra == "all"
Requires-Dist: pydub==0.25.1; extra == "all"
Requires-Dist: wavmark==0.0.3; extra == "all"
Requires-Dist: eng_to_ipa==0.0.2; extra == "all"
Requires-Dist: unidecode==1.4.0; extra == "all"
Requires-Dist: langid==1.1.6; extra == "all"
Requires-Dist: txtsplit==1.0.0; extra == "all"
Requires-Dist: num2words==0.5.14; extra == "all"
Requires-Dist: g2p_en==2.1.0; extra == "all"
Requires-Dist: anyascii==0.3.2; extra == "all"
Requires-Dist: loguru==0.7.3; extra == "all"
Requires-Dist: pypinyin==0.54.0; extra == "all"
Requires-Dist: jieba==0.42.1; extra == "all"
Requires-Dist: cn2an==0.5.23; extra == "all"
Requires-Dist: g2pkk>=0.1.2; extra == "all"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "all"
Requires-Dist: networkx==3.4.2; extra == "all"
Requires-Dist: requests-cache==1.2.1; extra == "all"
Requires-Dist: retry-requests==2.0.0; extra == "all"
Requires-Dist: openmeteo_requests==1.4.0; extra == "all"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "all"
Requires-Dist: ddgs>=9.0.0; extra == "all"
Requires-Dist: aiohttp>=3.13.4; extra == "all"
Requires-Dist: google-api-python-client>=2.170.0; extra == "all"
Requires-Dist: wikipedia>=1.4.0; extra == "all"
Requires-Dist: scrapy==2.14.2; extra == "all"
Requires-Dist: trafilatura==2.0.0; extra == "all"
Requires-Dist: pyautogui>=0.9.54; extra == "all"
Requires-Dist: pyscreeze>=1.0.1; extra == "all"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "all"
Requires-Dist: pygetwindow>=0.0.9; extra == "all"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "all"
Provides-Extra: all-dev
Requires-Dist: torch==2.13.0+cu129; extra == "all-dev"
Requires-Dist: torchvision==0.28.0+cu129; extra == "all-dev"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "all-dev"
Requires-Dist: accelerate==1.14.0; extra == "all-dev"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "all-dev"
Requires-Dist: tokenizers==0.22.2; extra == "all-dev"
Requires-Dist: optimum==1.25.1; extra == "all-dev"
Requires-Dist: llama-cpp-python==0.3.21; extra == "all-dev"
Requires-Dist: bitsandbytes==0.46.1; extra == "all-dev"
Requires-Dist: sentence_transformers==5.6.1; extra == "all-dev"
Requires-Dist: cryptography==46.0.7; extra == "all-dev"
Requires-Dist: sumy==0.11.0; extra == "all-dev"
Requires-Dist: sentencepiece==0.2.1; extra == "all-dev"
Requires-Dist: lingua-language-detector==2.1.0; extra == "all-dev"
Requires-Dist: markdown==3.8.1; extra == "all-dev"
Requires-Dist: libzim==3.7.0; extra == "all-dev"
Requires-Dist: mistral_common>=1.8.5; extra == "all-dev"
Requires-Dist: rank-bm25>=0.2.2; extra == "all-dev"
Requires-Dist: llama-cloud==0.1.23; extra == "all-dev"
Requires-Dist: langchain-core==1.3.3; extra == "all-dev"
Requires-Dist: langchain-huggingface==1.2.2; extra == "all-dev"
Requires-Dist: langgraph==1.0.8; extra == "all-dev"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "all-dev"
Requires-Dist: langsmith>=0.8.0; extra == "all-dev"
Requires-Dist: langchain-ollama==1.0.0; extra == "all-dev"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "all-dev"
Requires-Dist: EbookLib==0.19; extra == "all-dev"
Requires-Dist: mobi==0.4.1; extra == "all-dev"
Requires-Dist: pypdf>=5.6.0; extra == "all-dev"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "all-dev"
Requires-Dist: sounddevice==0.5.1; extra == "all-dev"
Requires-Dist: diffusers==0.38.0; extra == "all-dev"
Requires-Dist: controlnet_aux==0.0.10; extra == "all-dev"
Requires-Dist: safetensors==0.8.0; extra == "all-dev"
Requires-Dist: kornia; extra == "all-dev"
Requires-Dist: timm; extra == "all-dev"
Requires-Dist: compel==2.4.0; extra == "all-dev"
Requires-Dist: transformers==5.8.1; extra == "all-dev"
Requires-Dist: datasets==4.0.0; extra == "all-dev"
Requires-Dist: DeepCache==0.1.1; extra == "all-dev"
Requires-Dist: tomesd==0.1.3; extra == "all-dev"
Requires-Dist: gguf==0.17.1; extra == "all-dev"
Requires-Dist: inflect==7.5.0; extra == "all-dev"
Requires-Dist: pycountry==24.6.1; extra == "all-dev"
Requires-Dist: librosa==0.11.0; extra == "all-dev"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "all-dev"
Requires-Dist: pyttsx3==2.91; extra == "all-dev"
Requires-Dist: pydub==0.25.1; extra == "all-dev"
Requires-Dist: wavmark==0.0.3; extra == "all-dev"
Requires-Dist: eng_to_ipa==0.0.2; extra == "all-dev"
Requires-Dist: unidecode==1.4.0; extra == "all-dev"
Requires-Dist: langid==1.1.6; extra == "all-dev"
Requires-Dist: txtsplit==1.0.0; extra == "all-dev"
Requires-Dist: num2words==0.5.14; extra == "all-dev"
Requires-Dist: g2p_en==2.1.0; extra == "all-dev"
Requires-Dist: anyascii==0.3.2; extra == "all-dev"
Requires-Dist: loguru==0.7.3; extra == "all-dev"
Requires-Dist: pypinyin==0.54.0; extra == "all-dev"
Requires-Dist: jieba==0.42.1; extra == "all-dev"
Requires-Dist: cn2an==0.5.23; extra == "all-dev"
Requires-Dist: g2pkk>=0.1.2; extra == "all-dev"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "all-dev"
Requires-Dist: networkx==3.4.2; extra == "all-dev"
Requires-Dist: requests-cache==1.2.1; extra == "all-dev"
Requires-Dist: retry-requests==2.0.0; extra == "all-dev"
Requires-Dist: openmeteo_requests==1.4.0; extra == "all-dev"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "all-dev"
Requires-Dist: ddgs>=9.0.0; extra == "all-dev"
Requires-Dist: aiohttp>=3.13.4; extra == "all-dev"
Requires-Dist: google-api-python-client>=2.170.0; extra == "all-dev"
Requires-Dist: wikipedia>=1.4.0; extra == "all-dev"
Requires-Dist: scrapy==2.14.2; extra == "all-dev"
Requires-Dist: trafilatura==2.0.0; extra == "all-dev"
Requires-Dist: pyautogui>=0.9.54; extra == "all-dev"
Requires-Dist: pyscreeze>=1.0.1; extra == "all-dev"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "all-dev"
Requires-Dist: pygetwindow>=0.0.9; extra == "all-dev"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "all-dev"
Requires-Dist: pytest; extra == "all-dev"
Requires-Dist: pytest-timeout; extra == "all-dev"
Requires-Dist: responses>=0.25.0; extra == "all-dev"
Requires-Dist: coverage==7.8.0; extra == "all-dev"
Requires-Dist: black==26.3.1; extra == "all-dev"
Requires-Dist: pyinstaller==6.12.0; extra == "all-dev"
Requires-Dist: flake8==7.2.0; extra == "all-dev"
Requires-Dist: mypy==1.16.0; extra == "all-dev"
Requires-Dist: autoflake==2.3.1; extra == "all-dev"
Requires-Dist: pandas>=2.0.0; extra == "all-dev"
Requires-Dist: pyarrow>=14.0.0; extra == "all-dev"
Requires-Dist: tqdm>=4.0.0; extra == "all-dev"
Provides-Extra: all-native
Requires-Dist: torch==2.13.0+cu129; extra == "all-native"
Requires-Dist: torchvision==0.28.0+cu129; extra == "all-native"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "all-native"
Requires-Dist: accelerate==1.14.0; extra == "all-native"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "all-native"
Requires-Dist: tokenizers==0.22.2; extra == "all-native"
Requires-Dist: optimum==1.25.1; extra == "all-native"
Requires-Dist: llama-cpp-python==0.3.21; extra == "all-native"
Requires-Dist: bitsandbytes==0.46.1; extra == "all-native"
Requires-Dist: sentence_transformers==5.6.1; extra == "all-native"
Requires-Dist: cryptography==46.0.7; extra == "all-native"
Requires-Dist: sumy==0.11.0; extra == "all-native"
Requires-Dist: sentencepiece==0.2.1; extra == "all-native"
Requires-Dist: lingua-language-detector==2.1.0; extra == "all-native"
Requires-Dist: markdown==3.8.1; extra == "all-native"
Requires-Dist: libzim==3.7.0; extra == "all-native"
Requires-Dist: mistral_common>=1.8.5; extra == "all-native"
Requires-Dist: rank-bm25>=0.2.2; extra == "all-native"
Requires-Dist: llama-cloud==0.1.23; extra == "all-native"
Requires-Dist: langchain-core==1.3.3; extra == "all-native"
Requires-Dist: langchain-huggingface==1.2.2; extra == "all-native"
Requires-Dist: langgraph==1.0.8; extra == "all-native"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "all-native"
Requires-Dist: langsmith>=0.8.0; extra == "all-native"
Requires-Dist: langchain-ollama==1.0.0; extra == "all-native"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "all-native"
Requires-Dist: EbookLib==0.19; extra == "all-native"
Requires-Dist: mobi==0.4.1; extra == "all-native"
Requires-Dist: pypdf>=5.6.0; extra == "all-native"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "all-native"
Requires-Dist: sounddevice==0.5.1; extra == "all-native"
Requires-Dist: diffusers==0.38.0; extra == "all-native"
Requires-Dist: controlnet_aux==0.0.10; extra == "all-native"
Requires-Dist: safetensors==0.8.0; extra == "all-native"
Requires-Dist: kornia; extra == "all-native"
Requires-Dist: timm; extra == "all-native"
Requires-Dist: compel==2.4.0; extra == "all-native"
Requires-Dist: transformers==5.8.1; extra == "all-native"
Requires-Dist: datasets==4.0.0; extra == "all-native"
Requires-Dist: DeepCache==0.1.1; extra == "all-native"
Requires-Dist: tomesd==0.1.3; extra == "all-native"
Requires-Dist: gguf==0.17.1; extra == "all-native"
Requires-Dist: inflect==7.5.0; extra == "all-native"
Requires-Dist: pycountry==24.6.1; extra == "all-native"
Requires-Dist: librosa==0.11.0; extra == "all-native"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "all-native"
Requires-Dist: pyttsx3==2.91; extra == "all-native"
Requires-Dist: pydub==0.25.1; extra == "all-native"
Requires-Dist: wavmark==0.0.3; extra == "all-native"
Requires-Dist: eng_to_ipa==0.0.2; extra == "all-native"
Requires-Dist: unidecode==1.4.0; extra == "all-native"
Requires-Dist: langid==1.1.6; extra == "all-native"
Requires-Dist: txtsplit==1.0.0; extra == "all-native"
Requires-Dist: num2words==0.5.14; extra == "all-native"
Requires-Dist: g2p_en==2.1.0; extra == "all-native"
Requires-Dist: anyascii==0.3.2; extra == "all-native"
Requires-Dist: loguru==0.7.3; extra == "all-native"
Requires-Dist: pypinyin==0.54.0; extra == "all-native"
Requires-Dist: jieba==0.42.1; extra == "all-native"
Requires-Dist: cn2an==0.5.23; extra == "all-native"
Requires-Dist: g2pkk>=0.1.2; extra == "all-native"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "all-native"
Requires-Dist: networkx==3.4.2; extra == "all-native"
Requires-Dist: requests-cache==1.2.1; extra == "all-native"
Requires-Dist: retry-requests==2.0.0; extra == "all-native"
Requires-Dist: openmeteo_requests==1.4.0; extra == "all-native"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "all-native"
Requires-Dist: ddgs>=9.0.0; extra == "all-native"
Requires-Dist: aiohttp>=3.13.4; extra == "all-native"
Requires-Dist: google-api-python-client>=2.170.0; extra == "all-native"
Requires-Dist: wikipedia>=1.4.0; extra == "all-native"
Requires-Dist: scrapy==2.14.2; extra == "all-native"
Requires-Dist: trafilatura==2.0.0; extra == "all-native"
Requires-Dist: pyautogui>=0.9.54; extra == "all-native"
Requires-Dist: pyscreeze>=1.0.1; extra == "all-native"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "all-native"
Requires-Dist: pygetwindow>=0.0.9; extra == "all-native"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "all-native"
Requires-Dist: unidic_lite==1.0.8; extra == "all-native"
Requires-Dist: unidic==1.1.0; extra == "all-native"
Requires-Dist: mecab-python3==1.0.10; extra == "all-native"
Requires-Dist: fugashi==1.4.0; extra == "all-native"
Requires-Dist: pykakasi==2.3.0; extra == "all-native"
Requires-Dist: jamo==0.4.1; extra == "all-native"
Requires-Dist: python-mecab-ko==1.3.7; extra == "all-native"
Requires-Dist: python-mecab-ko-dic==2.1.1.post2; extra == "all-native"
Provides-Extra: all-dev-native
Requires-Dist: torch==2.13.0+cu129; extra == "all-dev-native"
Requires-Dist: torchvision==0.28.0+cu129; extra == "all-dev-native"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "all-dev-native"
Requires-Dist: accelerate==1.14.0; extra == "all-dev-native"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "all-dev-native"
Requires-Dist: tokenizers==0.22.2; extra == "all-dev-native"
Requires-Dist: optimum==1.25.1; extra == "all-dev-native"
Requires-Dist: llama-cpp-python==0.3.21; extra == "all-dev-native"
Requires-Dist: bitsandbytes==0.46.1; extra == "all-dev-native"
Requires-Dist: sentence_transformers==5.6.1; extra == "all-dev-native"
Requires-Dist: cryptography==46.0.7; extra == "all-dev-native"
Requires-Dist: sumy==0.11.0; extra == "all-dev-native"
Requires-Dist: sentencepiece==0.2.1; extra == "all-dev-native"
Requires-Dist: lingua-language-detector==2.1.0; extra == "all-dev-native"
Requires-Dist: markdown==3.8.1; extra == "all-dev-native"
Requires-Dist: libzim==3.7.0; extra == "all-dev-native"
Requires-Dist: mistral_common>=1.8.5; extra == "all-dev-native"
Requires-Dist: rank-bm25>=0.2.2; extra == "all-dev-native"
Requires-Dist: llama-cloud==0.1.23; extra == "all-dev-native"
Requires-Dist: langchain-core==1.3.3; extra == "all-dev-native"
Requires-Dist: langchain-huggingface==1.2.2; extra == "all-dev-native"
Requires-Dist: langgraph==1.0.8; extra == "all-dev-native"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "all-dev-native"
Requires-Dist: langsmith>=0.8.0; extra == "all-dev-native"
Requires-Dist: langchain-ollama==1.0.0; extra == "all-dev-native"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "all-dev-native"
Requires-Dist: EbookLib==0.19; extra == "all-dev-native"
Requires-Dist: mobi==0.4.1; extra == "all-dev-native"
Requires-Dist: pypdf>=5.6.0; extra == "all-dev-native"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "all-dev-native"
Requires-Dist: sounddevice==0.5.1; extra == "all-dev-native"
Requires-Dist: diffusers==0.38.0; extra == "all-dev-native"
Requires-Dist: controlnet_aux==0.0.10; extra == "all-dev-native"
Requires-Dist: safetensors==0.8.0; extra == "all-dev-native"
Requires-Dist: kornia; extra == "all-dev-native"
Requires-Dist: timm; extra == "all-dev-native"
Requires-Dist: compel==2.4.0; extra == "all-dev-native"
Requires-Dist: transformers==5.8.1; extra == "all-dev-native"
Requires-Dist: datasets==4.0.0; extra == "all-dev-native"
Requires-Dist: DeepCache==0.1.1; extra == "all-dev-native"
Requires-Dist: tomesd==0.1.3; extra == "all-dev-native"
Requires-Dist: gguf==0.17.1; extra == "all-dev-native"
Requires-Dist: inflect==7.5.0; extra == "all-dev-native"
Requires-Dist: pycountry==24.6.1; extra == "all-dev-native"
Requires-Dist: librosa==0.11.0; extra == "all-dev-native"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "all-dev-native"
Requires-Dist: pyttsx3==2.91; extra == "all-dev-native"
Requires-Dist: pydub==0.25.1; extra == "all-dev-native"
Requires-Dist: wavmark==0.0.3; extra == "all-dev-native"
Requires-Dist: eng_to_ipa==0.0.2; extra == "all-dev-native"
Requires-Dist: unidecode==1.4.0; extra == "all-dev-native"
Requires-Dist: langid==1.1.6; extra == "all-dev-native"
Requires-Dist: txtsplit==1.0.0; extra == "all-dev-native"
Requires-Dist: num2words==0.5.14; extra == "all-dev-native"
Requires-Dist: g2p_en==2.1.0; extra == "all-dev-native"
Requires-Dist: anyascii==0.3.2; extra == "all-dev-native"
Requires-Dist: loguru==0.7.3; extra == "all-dev-native"
Requires-Dist: pypinyin==0.54.0; extra == "all-dev-native"
Requires-Dist: jieba==0.42.1; extra == "all-dev-native"
Requires-Dist: cn2an==0.5.23; extra == "all-dev-native"
Requires-Dist: g2pkk>=0.1.2; extra == "all-dev-native"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "all-dev-native"
Requires-Dist: networkx==3.4.2; extra == "all-dev-native"
Requires-Dist: requests-cache==1.2.1; extra == "all-dev-native"
Requires-Dist: retry-requests==2.0.0; extra == "all-dev-native"
Requires-Dist: openmeteo_requests==1.4.0; extra == "all-dev-native"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "all-dev-native"
Requires-Dist: ddgs>=9.0.0; extra == "all-dev-native"
Requires-Dist: aiohttp>=3.13.4; extra == "all-dev-native"
Requires-Dist: google-api-python-client>=2.170.0; extra == "all-dev-native"
Requires-Dist: wikipedia>=1.4.0; extra == "all-dev-native"
Requires-Dist: scrapy==2.14.2; extra == "all-dev-native"
Requires-Dist: trafilatura==2.0.0; extra == "all-dev-native"
Requires-Dist: pyautogui>=0.9.54; extra == "all-dev-native"
Requires-Dist: pyscreeze>=1.0.1; extra == "all-dev-native"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "all-dev-native"
Requires-Dist: pygetwindow>=0.0.9; extra == "all-dev-native"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "all-dev-native"
Requires-Dist: unidic_lite==1.0.8; extra == "all-dev-native"
Requires-Dist: unidic==1.1.0; extra == "all-dev-native"
Requires-Dist: mecab-python3==1.0.10; extra == "all-dev-native"
Requires-Dist: fugashi==1.4.0; extra == "all-dev-native"
Requires-Dist: pykakasi==2.3.0; extra == "all-dev-native"
Requires-Dist: jamo==0.4.1; extra == "all-dev-native"
Requires-Dist: python-mecab-ko==1.3.7; extra == "all-dev-native"
Requires-Dist: python-mecab-ko-dic==2.1.1.post2; extra == "all-dev-native"
Requires-Dist: pytest; extra == "all-dev-native"
Requires-Dist: pytest-timeout; extra == "all-dev-native"
Requires-Dist: responses>=0.25.0; extra == "all-dev-native"
Requires-Dist: coverage==7.8.0; extra == "all-dev-native"
Requires-Dist: black==26.3.1; extra == "all-dev-native"
Requires-Dist: pyinstaller==6.12.0; extra == "all-dev-native"
Requires-Dist: flake8==7.2.0; extra == "all-dev-native"
Requires-Dist: mypy==1.16.0; extra == "all-dev-native"
Requires-Dist: autoflake==2.3.1; extra == "all-dev-native"
Requires-Dist: pandas>=2.0.0; extra == "all-dev-native"
Requires-Dist: pyarrow>=14.0.0; extra == "all-dev-native"
Requires-Dist: tqdm>=4.0.0; extra == "all-dev-native"
Provides-Extra: windows
Requires-Dist: torch==2.13.0+cu129; extra == "windows"
Requires-Dist: torchvision==0.28.0+cu129; extra == "windows"
Requires-Dist: torchaudio==2.11.0+cu129; extra == "windows"
Requires-Dist: accelerate==1.14.0; extra == "windows"
Requires-Dist: huggingface-hub<2.0,>=1.5.0; extra == "windows"
Requires-Dist: tokenizers==0.22.2; extra == "windows"
Requires-Dist: optimum==1.25.1; extra == "windows"
Requires-Dist: llama-cpp-python==0.3.21; extra == "windows"
Requires-Dist: bitsandbytes==0.46.1; extra == "windows"
Requires-Dist: sentence_transformers==5.6.1; extra == "windows"
Requires-Dist: cryptography==46.0.7; extra == "windows"
Requires-Dist: sumy==0.11.0; extra == "windows"
Requires-Dist: sentencepiece==0.2.1; extra == "windows"
Requires-Dist: lingua-language-detector==2.1.0; extra == "windows"
Requires-Dist: markdown==3.8.1; extra == "windows"
Requires-Dist: libzim==3.7.0; extra == "windows"
Requires-Dist: mistral_common>=1.8.5; extra == "windows"
Requires-Dist: rank-bm25>=0.2.2; extra == "windows"
Requires-Dist: llama-cloud==0.1.23; extra == "windows"
Requires-Dist: langchain-core==1.3.3; extra == "windows"
Requires-Dist: langchain-huggingface==1.2.2; extra == "windows"
Requires-Dist: langgraph==1.0.8; extra == "windows"
Requires-Dist: langgraph-prebuilt==1.0.7; extra == "windows"
Requires-Dist: langsmith>=0.8.0; extra == "windows"
Requires-Dist: langchain-ollama==1.0.0; extra == "windows"
Requires-Dist: langchain-text-splitters==1.1.2; extra == "windows"
Requires-Dist: EbookLib==0.19; extra == "windows"
Requires-Dist: mobi==0.4.1; extra == "windows"
Requires-Dist: pypdf>=5.6.0; extra == "windows"
Requires-Dist: beautifulsoup4>=4.12.0; extra == "windows"
Requires-Dist: sounddevice==0.5.1; extra == "windows"
Requires-Dist: diffusers==0.38.0; extra == "windows"
Requires-Dist: controlnet_aux==0.0.10; extra == "windows"
Requires-Dist: safetensors==0.8.0; extra == "windows"
Requires-Dist: kornia; extra == "windows"
Requires-Dist: timm; extra == "windows"
Requires-Dist: compel==2.4.0; extra == "windows"
Requires-Dist: transformers==5.8.1; extra == "windows"
Requires-Dist: datasets==4.0.0; extra == "windows"
Requires-Dist: DeepCache==0.1.1; extra == "windows"
Requires-Dist: tomesd==0.1.3; extra == "windows"
Requires-Dist: gguf==0.17.1; extra == "windows"
Requires-Dist: inflect==7.5.0; extra == "windows"
Requires-Dist: pycountry==24.6.1; extra == "windows"
Requires-Dist: librosa==0.11.0; extra == "windows"
Requires-Dist: torchcodec<0.10,>=0.8.0; extra == "windows"
Requires-Dist: pyttsx3==2.91; extra == "windows"
Requires-Dist: pydub==0.25.1; extra == "windows"
Requires-Dist: wavmark==0.0.3; extra == "windows"
Requires-Dist: eng_to_ipa==0.0.2; extra == "windows"
Requires-Dist: unidecode==1.4.0; extra == "windows"
Requires-Dist: langid==1.1.6; extra == "windows"
Requires-Dist: txtsplit==1.0.0; extra == "windows"
Requires-Dist: num2words==0.5.14; extra == "windows"
Requires-Dist: g2p_en==2.1.0; extra == "windows"
Requires-Dist: anyascii==0.3.2; extra == "windows"
Requires-Dist: loguru==0.7.3; extra == "windows"
Requires-Dist: pypinyin==0.54.0; extra == "windows"
Requires-Dist: jieba==0.42.1; extra == "windows"
Requires-Dist: cn2an==0.5.23; extra == "windows"
Requires-Dist: g2pkk>=0.1.2; extra == "windows"
Requires-Dist: gruut[de,es,fr]==2.4.0; extra == "windows"
Requires-Dist: networkx==3.4.2; extra == "windows"
Requires-Dist: requests-cache==1.2.1; extra == "windows"
Requires-Dist: retry-requests==2.0.0; extra == "windows"
Requires-Dist: openmeteo_requests==1.4.0; extra == "windows"
Requires-Dist: openmeteo_sdk>=1.22.0; extra == "windows"
Requires-Dist: ddgs>=9.0.0; extra == "windows"
Requires-Dist: aiohttp>=3.13.4; extra == "windows"
Requires-Dist: google-api-python-client>=2.170.0; extra == "windows"
Requires-Dist: wikipedia>=1.4.0; extra == "windows"
Requires-Dist: scrapy==2.14.2; extra == "windows"
Requires-Dist: trafilatura==2.0.0; extra == "windows"
Requires-Dist: pyautogui>=0.9.54; extra == "windows"
Requires-Dist: pyscreeze>=1.0.1; extra == "windows"
Requires-Dist: python-xlib>=0.33; platform_system == "Linux" and extra == "windows"
Requires-Dist: pygetwindow>=0.0.9; extra == "windows"
Requires-Dist: nvidia-cuda-runtime-cu12==12.9.79; extra == "windows"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# Services

The `services/` package is AIRunner's headless orchestration layer. It
owns the daemon entry points, FastAPI server wiring, runtime registry,
downloads, persistence, lifecycle control, and the modality services that
coordinate LLM, STT, TTS, and art workloads.

```mermaid
flowchart LR
    GUI[src/ GUI client] --> Daemon[services/ daemon routes]
    Daemon --> Registry[runtime registry]
    Daemon --> Client[canonical daemon HTTP client]
    Registry --> Sidecars[llama.cpp or whisper.cpp sidecars]
    Daemon --> Data[(AIRUNNER_BASE_PATH)]
    Daemon --> Scripts[scripts/ tooling]
```

## What This Package Owns

- FastAPI server bootstrap and daemon entry points
- runtime routing, runtime load or unload control, and health checks
- service-level downloads, migrations, persistence, and settings
- orchestration for daemon-backed LLM, TTS, STT, and art requests
- the canonical daemon HTTP client (`airunner_services.daemon_client`),
  which the desktop client imports through the thin `airunner.daemon_client`
  re-export layer

Importable service code lives under `services/src/airunner_services/`.

The package split contract is documented in
[docs/architecture/package_split_contract.md](../docs/architecture/package_split_contract.md),
the package map lives in
[docs/architecture/layered_product_architecture.md](../docs/architecture/layered_product_architecture.md),
and the architecture audit is tracked in
[docs/architecture/architecture-complexity-audit.md](../docs/architecture/architecture-complexity-audit.md).

## Installation

For normal repo development, use the developer installer. It installs the
split packages in editable mode and builds the pinned native sidecars used
by daemon-backed functional tests:

```bash
./scripts/install.sh
```

For an isolated service environment, install the local package stack and a
service extra that matches the workload you are validating:

```bash
python -m venv venv
source venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install -e './services[headless,development]'
```

Use `services[desktop]` when you want the broader desktop-oriented extra
set, and use `./deployment/install_distributed.sh` when you are installing
the daemon or GUI client into separate roots.

## Test Running

The quickest service checks are the daemon runtime smoke commands exposed
by the repo test runner:

```bash
./venv/bin/python scripts/run_tests.py --llm-runtime-smoke
./venv/bin/python scripts/run_tests.py --stt-runtime-smoke
./venv/bin/python scripts/run_tests.py --art-runtime-smoke
./venv/bin/python scripts/run_tests.py --tts-runtime-smoke
```

The bootstrap sanity check for the server surface is:

```bash
./venv/bin/python -m pytest services/tests/test_service_bootstrap.py -v
```

When a change touches daemon routes, workers, or runtime coordination,
pair those smoke checks with the relevant daemon-backed functional suites
in `services/tests/`, especially:

```bash
./venv/bin/python -m pytest services/tests/test_tts_synthesize_functional.py -v --timeout=120
./venv/bin/python -m pytest services/tests/test_llm_functional.py -v --timeout=900
./venv/bin/python -m pytest services/tests/test_llm_tts_functional.py -v --timeout=1200
./venv/bin/python -m pytest services/tests/test_stt_transcribe_functional.py -v --timeout=1200
```

The functional tests live under `services/tests/` because they validate the
composed product boundary, even when the behavior under test is primarily
owned by `services/`.
