Metadata-Version: 2.4
Name: airunner
Version: 4.8.5
Summary: Run local opensource AI models (Stable Diffusion, LLMs, TTS, STT, chatbots) in a lightweight Python GUI
Home-page: https://github.com/Capsize-Games/airunner
Author: Capsize LLC
Author-email: contact@capsizegames.com
License: Apache-2.0
Keywords: llm,pyside6,gui,local llm,stable diffusion,generative ai,local chatgpt,text-to-speech,speech-to-text,open source chatbot,python ai runner
Requires-Python: >=3.13.3
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: torch
Requires-Dist: torchvision
Requires-Dist: torchaudio
Requires-Dist: torchao
Requires-Dist: accelerate==1.7.0
Requires-Dist: huggingface-hub<1.0,>=0.24.0
Requires-Dist: tokenizers==0.21.1
Requires-Dist: optimum==1.25.1
Requires-Dist: numpy==2.2.5
Requires-Dist: pillow==10.4.0
Requires-Dist: alembic==1.15.2
Requires-Dist: aiosqlite==0.21.0
Requires-Dist: sqlalchemy==2.0.38
Requires-Dist: setuptools==78.1.0
Requires-Dist: facehuggershield==0.1.13
Requires-Dist: etils[epath]==1.12.2
Provides-Extra: nvidia
Requires-Dist: nvidia-cuda-runtime-cu12; extra == "nvidia"
Provides-Extra: huggingface
Requires-Dist: diffusers==0.33.1; extra == "huggingface"
Requires-Dist: controlnet_aux==0.0.9; extra == "huggingface"
Requires-Dist: safetensors==0.5.2; extra == "huggingface"
Requires-Dist: compel==2.1.0; extra == "huggingface"
Requires-Dist: transformers==4.51.3; extra == "huggingface"
Requires-Dist: datasets==3.6.0; extra == "huggingface"
Requires-Dist: peft==0.15.2; extra == "huggingface"
Provides-Extra: gui
Requires-Dist: PySide6==6.9.0; extra == "gui"
Requires-Dist: PySide6_Addons==6.9.0; extra == "gui"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "gui"
Provides-Extra: linux
Requires-Dist: tensorrt==10.9.0.34; extra == "linux"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: python-dotenv==1.0.1; extra == "dev"
Requires-Dist: coverage==7.8.0; extra == "dev"
Requires-Dist: black==25.1.0; extra == "dev"
Requires-Dist: pyinstaller==6.12.0; extra == "dev"
Provides-Extra: art
Requires-Dist: DeepCache==0.1.1; extra == "art"
Requires-Dist: tomesd==0.1.3; extra == "art"
Requires-Dist: timm<=0.6.7; extra == "art"
Provides-Extra: llm
Requires-Dist: bitsandbytes==0.45.5; extra == "llm"
Requires-Dist: sentence_transformers==3.4.1; extra == "llm"
Requires-Dist: sounddevice==0.5.1; extra == "llm"
Requires-Dist: pyttsx3==2.91; extra == "llm"
Requires-Dist: cryptography==44.0.3; extra == "llm"
Requires-Dist: sumy==0.11.0; extra == "llm"
Requires-Dist: sentencepiece==0.2.0; extra == "llm"
Provides-Extra: agents
Requires-Dist: llama-index==0.12.36; extra == "agents"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "agents"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "agents"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "agents"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "agents"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "agents"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "agents"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "agents"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "agents"
Requires-Dist: langchain-community==0.3.24; extra == "agents"
Requires-Dist: EbookLib==0.19; extra == "agents"
Requires-Dist: html2text==2024.2.26; extra == "agents"
Requires-Dist: rake_nltk==1.0.6; extra == "agents"
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"
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"
Provides-Extra: rabbitmq
Requires-Dist: pika; extra == "rabbitmq"
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: cached_path==1.7.3; 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"
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: all
Requires-Dist: nvidia-cuda-runtime-cu12; extra == "all"
Requires-Dist: diffusers==0.33.1; extra == "all"
Requires-Dist: controlnet_aux==0.0.9; extra == "all"
Requires-Dist: safetensors==0.5.2; extra == "all"
Requires-Dist: compel==2.1.0; extra == "all"
Requires-Dist: transformers==4.51.3; extra == "all"
Requires-Dist: datasets==3.6.0; extra == "all"
Requires-Dist: peft==0.15.2; extra == "all"
Requires-Dist: PySide6==6.9.0; extra == "all"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all"
Requires-Dist: tensorrt==10.9.0.34; extra == "all"
Requires-Dist: DeepCache==0.1.1; extra == "all"
Requires-Dist: tomesd==0.1.3; extra == "all"
Requires-Dist: timm<=0.6.7; extra == "all"
Requires-Dist: bitsandbytes==0.45.5; extra == "all"
Requires-Dist: sentence_transformers==3.4.1; extra == "all"
Requires-Dist: sounddevice==0.5.1; extra == "all"
Requires-Dist: pyttsx3==2.91; extra == "all"
Requires-Dist: cryptography==44.0.3; extra == "all"
Requires-Dist: sumy==0.11.0; extra == "all"
Requires-Dist: sentencepiece==0.2.0; extra == "all"
Requires-Dist: llama-index==0.12.36; extra == "all"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all"
Requires-Dist: langchain-community==0.3.24; extra == "all"
Requires-Dist: EbookLib==0.19; extra == "all"
Requires-Dist: html2text==2024.2.26; extra == "all"
Requires-Dist: rake_nltk==1.0.6; 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: inflect==7.5.0; extra == "all"
Requires-Dist: pycountry==24.6.1; extra == "all"
Requires-Dist: librosa==0.11.0; extra == "all"
Requires-Dist: pika; extra == "all"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all"
Requires-Dist: unidic==1.1.0; extra == "all"
Requires-Dist: mecab-python3==1.0.10; extra == "all"
Requires-Dist: fugashi==1.4.0; extra == "all"
Requires-Dist: pykakasi==2.3.0; extra == "all"
Requires-Dist: jamo==0.4.1; 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: nvidia-cuda-runtime-cu12; extra == "all"
Requires-Dist: diffusers==0.33.1; extra == "all"
Requires-Dist: controlnet_aux==0.0.9; extra == "all"
Requires-Dist: safetensors==0.5.2; extra == "all"
Requires-Dist: compel==2.1.0; extra == "all"
Requires-Dist: transformers==4.51.3; extra == "all"
Requires-Dist: datasets==3.6.0; extra == "all"
Requires-Dist: peft==0.15.2; extra == "all"
Requires-Dist: PySide6==6.9.0; extra == "all"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all"
Requires-Dist: tensorrt==10.9.0.34; extra == "all"
Requires-Dist: pytest; extra == "all"
Requires-Dist: python-dotenv==1.0.1; extra == "all"
Requires-Dist: coverage==7.8.0; extra == "all"
Requires-Dist: black==25.1.0; extra == "all"
Requires-Dist: pyinstaller==6.12.0; extra == "all"
Requires-Dist: DeepCache==0.1.1; extra == "all"
Requires-Dist: tomesd==0.1.3; extra == "all"
Requires-Dist: timm<=0.6.7; extra == "all"
Requires-Dist: bitsandbytes==0.45.5; extra == "all"
Requires-Dist: sentence_transformers==3.4.1; extra == "all"
Requires-Dist: sounddevice==0.5.1; extra == "all"
Requires-Dist: pyttsx3==2.91; extra == "all"
Requires-Dist: cryptography==44.0.3; extra == "all"
Requires-Dist: sumy==0.11.0; extra == "all"
Requires-Dist: sentencepiece==0.2.0; extra == "all"
Requires-Dist: llama-index==0.12.36; extra == "all"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all"
Requires-Dist: langchain-community==0.3.24; extra == "all"
Requires-Dist: EbookLib==0.19; extra == "all"
Requires-Dist: html2text==2024.2.26; extra == "all"
Requires-Dist: rake_nltk==1.0.6; 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: inflect==7.5.0; extra == "all"
Requires-Dist: pycountry==24.6.1; extra == "all"
Requires-Dist: librosa==0.11.0; extra == "all"
Requires-Dist: pika; extra == "all"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all"
Requires-Dist: unidic==1.1.0; extra == "all"
Requires-Dist: mecab-python3==1.0.10; extra == "all"
Requires-Dist: fugashi==1.4.0; extra == "all"
Requires-Dist: pykakasi==2.3.0; extra == "all"
Requires-Dist: jamo==0.4.1; 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: nvidia-cuda-runtime-cu12; extra == "all"
Requires-Dist: diffusers==0.33.1; extra == "all"
Requires-Dist: controlnet_aux==0.0.9; extra == "all"
Requires-Dist: safetensors==0.5.2; extra == "all"
Requires-Dist: compel==2.1.0; extra == "all"
Requires-Dist: transformers==4.51.3; extra == "all"
Requires-Dist: datasets==3.6.0; extra == "all"
Requires-Dist: peft==0.15.2; extra == "all"
Requires-Dist: PySide6==6.9.0; extra == "all"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all"
Requires-Dist: tensorrt==10.9.0.34; extra == "all"
Requires-Dist: DeepCache==0.1.1; extra == "all"
Requires-Dist: tomesd==0.1.3; extra == "all"
Requires-Dist: timm<=0.6.7; extra == "all"
Requires-Dist: bitsandbytes==0.45.5; extra == "all"
Requires-Dist: sentence_transformers==3.4.1; extra == "all"
Requires-Dist: sounddevice==0.5.1; extra == "all"
Requires-Dist: pyttsx3==2.91; extra == "all"
Requires-Dist: cryptography==44.0.3; extra == "all"
Requires-Dist: sumy==0.11.0; extra == "all"
Requires-Dist: sentencepiece==0.2.0; extra == "all"
Requires-Dist: llama-index==0.12.36; extra == "all"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all"
Requires-Dist: langchain-community==0.3.24; extra == "all"
Requires-Dist: EbookLib==0.19; extra == "all"
Requires-Dist: html2text==2024.2.26; extra == "all"
Requires-Dist: rake_nltk==1.0.6; 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: inflect==7.5.0; extra == "all"
Requires-Dist: pycountry==24.6.1; extra == "all"
Requires-Dist: librosa==0.11.0; extra == "all"
Requires-Dist: pika; extra == "all"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all"
Requires-Dist: unidic==1.1.0; extra == "all"
Requires-Dist: mecab-python3==1.0.10; extra == "all"
Requires-Dist: fugashi==1.4.0; extra == "all"
Requires-Dist: pykakasi==2.3.0; extra == "all"
Requires-Dist: jamo==0.4.1; 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"
Provides-Extra: all-dev
Requires-Dist: nvidia-cuda-runtime-cu12; extra == "all-dev"
Requires-Dist: diffusers==0.33.1; extra == "all-dev"
Requires-Dist: controlnet_aux==0.0.9; extra == "all-dev"
Requires-Dist: safetensors==0.5.2; extra == "all-dev"
Requires-Dist: compel==2.1.0; extra == "all-dev"
Requires-Dist: transformers==4.51.3; extra == "all-dev"
Requires-Dist: datasets==3.6.0; extra == "all-dev"
Requires-Dist: peft==0.15.2; extra == "all-dev"
Requires-Dist: PySide6==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all-dev"
Requires-Dist: tensorrt==10.9.0.34; extra == "all-dev"
Requires-Dist: pytest; extra == "all-dev"
Requires-Dist: python-dotenv==1.0.1; extra == "all-dev"
Requires-Dist: coverage==7.8.0; extra == "all-dev"
Requires-Dist: black==25.1.0; extra == "all-dev"
Requires-Dist: pyinstaller==6.12.0; extra == "all-dev"
Requires-Dist: DeepCache==0.1.1; extra == "all-dev"
Requires-Dist: tomesd==0.1.3; extra == "all-dev"
Requires-Dist: timm<=0.6.7; extra == "all-dev"
Requires-Dist: bitsandbytes==0.45.5; extra == "all-dev"
Requires-Dist: sentence_transformers==3.4.1; extra == "all-dev"
Requires-Dist: sounddevice==0.5.1; extra == "all-dev"
Requires-Dist: pyttsx3==2.91; extra == "all-dev"
Requires-Dist: cryptography==44.0.3; extra == "all-dev"
Requires-Dist: sumy==0.11.0; extra == "all-dev"
Requires-Dist: sentencepiece==0.2.0; extra == "all-dev"
Requires-Dist: llama-index==0.12.36; extra == "all-dev"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all-dev"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all-dev"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all-dev"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all-dev"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all-dev"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all-dev"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all-dev"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all-dev"
Requires-Dist: langchain-community==0.3.24; extra == "all-dev"
Requires-Dist: EbookLib==0.19; extra == "all-dev"
Requires-Dist: html2text==2024.2.26; extra == "all-dev"
Requires-Dist: rake_nltk==1.0.6; 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: 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: pika; extra == "all-dev"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all-dev"
Requires-Dist: unidic==1.1.0; extra == "all-dev"
Requires-Dist: mecab-python3==1.0.10; extra == "all-dev"
Requires-Dist: fugashi==1.4.0; extra == "all-dev"
Requires-Dist: pykakasi==2.3.0; extra == "all-dev"
Requires-Dist: jamo==0.4.1; 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: nvidia-cuda-runtime-cu12; extra == "all-dev"
Requires-Dist: diffusers==0.33.1; extra == "all-dev"
Requires-Dist: controlnet_aux==0.0.9; extra == "all-dev"
Requires-Dist: safetensors==0.5.2; extra == "all-dev"
Requires-Dist: compel==2.1.0; extra == "all-dev"
Requires-Dist: transformers==4.51.3; extra == "all-dev"
Requires-Dist: datasets==3.6.0; extra == "all-dev"
Requires-Dist: peft==0.15.2; extra == "all-dev"
Requires-Dist: PySide6==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all-dev"
Requires-Dist: tensorrt==10.9.0.34; extra == "all-dev"
Requires-Dist: pytest; extra == "all-dev"
Requires-Dist: python-dotenv==1.0.1; extra == "all-dev"
Requires-Dist: coverage==7.8.0; extra == "all-dev"
Requires-Dist: black==25.1.0; extra == "all-dev"
Requires-Dist: pyinstaller==6.12.0; extra == "all-dev"
Requires-Dist: DeepCache==0.1.1; extra == "all-dev"
Requires-Dist: tomesd==0.1.3; extra == "all-dev"
Requires-Dist: timm<=0.6.7; extra == "all-dev"
Requires-Dist: bitsandbytes==0.45.5; extra == "all-dev"
Requires-Dist: sentence_transformers==3.4.1; extra == "all-dev"
Requires-Dist: sounddevice==0.5.1; extra == "all-dev"
Requires-Dist: pyttsx3==2.91; extra == "all-dev"
Requires-Dist: cryptography==44.0.3; extra == "all-dev"
Requires-Dist: sumy==0.11.0; extra == "all-dev"
Requires-Dist: sentencepiece==0.2.0; extra == "all-dev"
Requires-Dist: llama-index==0.12.36; extra == "all-dev"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all-dev"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all-dev"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all-dev"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all-dev"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all-dev"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all-dev"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all-dev"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all-dev"
Requires-Dist: langchain-community==0.3.24; extra == "all-dev"
Requires-Dist: EbookLib==0.19; extra == "all-dev"
Requires-Dist: html2text==2024.2.26; extra == "all-dev"
Requires-Dist: rake_nltk==1.0.6; 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: 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: pika; extra == "all-dev"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all-dev"
Requires-Dist: unidic==1.1.0; extra == "all-dev"
Requires-Dist: mecab-python3==1.0.10; extra == "all-dev"
Requires-Dist: fugashi==1.4.0; extra == "all-dev"
Requires-Dist: pykakasi==2.3.0; extra == "all-dev"
Requires-Dist: jamo==0.4.1; 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: nvidia-cuda-runtime-cu12; extra == "all-dev"
Requires-Dist: diffusers==0.33.1; extra == "all-dev"
Requires-Dist: controlnet_aux==0.0.9; extra == "all-dev"
Requires-Dist: safetensors==0.5.2; extra == "all-dev"
Requires-Dist: compel==2.1.0; extra == "all-dev"
Requires-Dist: transformers==4.51.3; extra == "all-dev"
Requires-Dist: datasets==3.6.0; extra == "all-dev"
Requires-Dist: peft==0.15.2; extra == "all-dev"
Requires-Dist: PySide6==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Addons==6.9.0; extra == "all-dev"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "all-dev"
Requires-Dist: tensorrt==10.9.0.34; extra == "all-dev"
Requires-Dist: pytest; extra == "all-dev"
Requires-Dist: python-dotenv==1.0.1; extra == "all-dev"
Requires-Dist: coverage==7.8.0; extra == "all-dev"
Requires-Dist: black==25.1.0; extra == "all-dev"
Requires-Dist: pyinstaller==6.12.0; extra == "all-dev"
Requires-Dist: DeepCache==0.1.1; extra == "all-dev"
Requires-Dist: tomesd==0.1.3; extra == "all-dev"
Requires-Dist: timm<=0.6.7; extra == "all-dev"
Requires-Dist: bitsandbytes==0.45.5; extra == "all-dev"
Requires-Dist: sentence_transformers==3.4.1; extra == "all-dev"
Requires-Dist: sounddevice==0.5.1; extra == "all-dev"
Requires-Dist: pyttsx3==2.91; extra == "all-dev"
Requires-Dist: cryptography==44.0.3; extra == "all-dev"
Requires-Dist: sumy==0.11.0; extra == "all-dev"
Requires-Dist: sentencepiece==0.2.0; extra == "all-dev"
Requires-Dist: llama-index==0.12.36; extra == "all-dev"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "all-dev"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "all-dev"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "all-dev"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "all-dev"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "all-dev"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "all-dev"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "all-dev"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "all-dev"
Requires-Dist: langchain-community==0.3.24; extra == "all-dev"
Requires-Dist: EbookLib==0.19; extra == "all-dev"
Requires-Dist: html2text==2024.2.26; extra == "all-dev"
Requires-Dist: rake_nltk==1.0.6; 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: 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: pika; extra == "all-dev"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "all-dev"
Requires-Dist: unidic==1.1.0; extra == "all-dev"
Requires-Dist: mecab-python3==1.0.10; extra == "all-dev"
Requires-Dist: fugashi==1.4.0; extra == "all-dev"
Requires-Dist: pykakasi==2.3.0; extra == "all-dev"
Requires-Dist: jamo==0.4.1; 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"
Provides-Extra: windows
Requires-Dist: nvidia-cuda-runtime-cu12; extra == "windows"
Requires-Dist: diffusers==0.33.1; extra == "windows"
Requires-Dist: controlnet_aux==0.0.9; extra == "windows"
Requires-Dist: safetensors==0.5.2; extra == "windows"
Requires-Dist: compel==2.1.0; extra == "windows"
Requires-Dist: transformers==4.51.3; extra == "windows"
Requires-Dist: datasets==3.6.0; extra == "windows"
Requires-Dist: peft==0.15.2; extra == "windows"
Requires-Dist: PySide6==6.9.0; extra == "windows"
Requires-Dist: PySide6_Addons==6.9.0; extra == "windows"
Requires-Dist: PySide6_Essentials==6.9.0; extra == "windows"
Requires-Dist: pytest; extra == "windows"
Requires-Dist: python-dotenv==1.0.1; extra == "windows"
Requires-Dist: coverage==7.8.0; extra == "windows"
Requires-Dist: black==25.1.0; extra == "windows"
Requires-Dist: pyinstaller==6.12.0; extra == "windows"
Requires-Dist: DeepCache==0.1.1; extra == "windows"
Requires-Dist: tomesd==0.1.3; extra == "windows"
Requires-Dist: timm<=0.6.7; extra == "windows"
Requires-Dist: bitsandbytes==0.45.5; extra == "windows"
Requires-Dist: sentence_transformers==3.4.1; extra == "windows"
Requires-Dist: sounddevice==0.5.1; extra == "windows"
Requires-Dist: pyttsx3==2.91; extra == "windows"
Requires-Dist: cryptography==44.0.3; extra == "windows"
Requires-Dist: sumy==0.11.0; extra == "windows"
Requires-Dist: sentencepiece==0.2.0; extra == "windows"
Requires-Dist: llama-index==0.12.36; extra == "windows"
Requires-Dist: llama-index-readers-file==0.4.7; extra == "windows"
Requires-Dist: llama-index-readers-web==0.4.1; extra == "windows"
Requires-Dist: llama-index-llms-huggingface==0.5.0; extra == "windows"
Requires-Dist: llama-index-llms-groq==0.3.1; extra == "windows"
Requires-Dist: llama-index-embeddings-mistralai==0.3.0; extra == "windows"
Requires-Dist: llama-index-vector-stores-faiss==0.4.0; extra == "windows"
Requires-Dist: llama-index-embeddings-huggingface==0.5.4; extra == "windows"
Requires-Dist: llama-index-llms-openrouter==0.3.1; extra == "windows"
Requires-Dist: langchain-community==0.3.24; extra == "windows"
Requires-Dist: EbookLib==0.19; extra == "windows"
Requires-Dist: html2text==2024.2.26; extra == "windows"
Requires-Dist: rake_nltk==1.0.6; 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: inflect==7.5.0; extra == "windows"
Requires-Dist: pycountry==24.6.1; extra == "windows"
Requires-Dist: librosa==0.11.0; extra == "windows"
Requires-Dist: pika; extra == "windows"
Requires-Dist: librosa==0.11.0; 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: inflect==7.5.0; 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: cached_path==1.7.3; 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: unidic_lite==1.0.8; extra == "windows"
Requires-Dist: unidic==1.1.0; extra == "windows"
Requires-Dist: mecab-python3==1.0.10; extra == "windows"
Requires-Dist: fugashi==1.4.0; extra == "windows"
Requires-Dist: pykakasi==2.3.0; extra == "windows"
Requires-Dist: jamo==0.4.1; 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"
Dynamic: author
Dynamic: author-email
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: keywords
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

[![AI Runner Logo](images/banner.png)](https://github.com/Capsize-Games/airunner)

[![Discord](https://img.shields.io/discord/839511291466219541?color=5865F2&logo=discord&logoColor=white)](https://discord.gg/PUVDDCJ7gz)
![GitHub](https://img.shields.io/github/license/Capsize-Games/airunner)
[![PyPi](https://github.com/Capsize-Games/airunner/actions/workflows/pypi-dispatch.yml/badge.svg)](https://github.com/Capsize-Games/airunner/actions/workflows/pypi-dispatch.yml)
![GitHub last commit](https://img.shields.io/github/last-commit/Capsize-Games/airunner)

---

# AI Runner: Offline AI Inference Engine for Hackers, Makers, and Builders.

![image](https://github.com/user-attachments/assets/392375c8-a7f6-4e6e-8662-511cffc608aa)

Here are some of the things you can do with AI Runner:

- ✅ **Voice-based chatbots** for real-time conversations (three text-to-speech engines each with multiple voices to choose from)
- ✅ **Customizable agents with names, moods and personalities** for more engaging conversations
- ✅ **Retrieval-Augmented Generation** (RAG) for documents and websites
- ✅ **Text-to-Image** generation with **Stable Diffusion** and **ControlNet**
- ✅ **Image manipulation** with **inpainting**, **outpainting**, **ControlNet** and **Image filters**

For extra security, performance, and compatibility, AI Runner is built with **Wayland support**, **Python 3.13**, and the latest stable torch libraries.

---

## System Requirements

| Specification       | Minimum                              | Recommended                          |
|---------------------|--------------------------------------------|--------------------------------------------|
| **OS**             | Ubuntu 22.04, Windows 10                               | Ubuntu 22.04 (Wayland)                              |
| **CPU**            | Ryzen 2700K or Intel Core i7-8700K         | Ryzen 5800X or Intel Core i7-11700K        |
| **Memory**         | 16 GB RAM                                  | 32 GB RAM                                  |
| **GPU**            | NVIDIA RTX 3060 or better                  | NVIDIA RTX 4090 or better                  |
| **Network**        | Broadband (used to download models)        | Broadband (used to download models)        |
| **Storage**        | 22 GB                                      | 50 GB                                      |
---

## 💾 Installation Quick Start

### 🔧 Installation Steps

1. **Install system requirements**
   ```bash
   sudo apt update && sudo apt upgrade -y
   sudo apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git nvidia-cuda-toolkit pipewire libportaudio2 libxcb-cursor0 gnupg gpg-agent pinentry-curses espeak xclip cmake qt6-qpa-plugins qt6-wayland qt6-gtk-platformtheme mecab libmecab-dev mecab-ipadic-utf8
   sudo apt install espeak
   sudo apt install espeak-ng-espeak
   ```
2. **Create `airunner` directory**
   ```bash
   sudo mkdir ~/.local/share/airunner
   sudo chown $USER:$USER ~/.local/share/airunner
   ```
3. **Install AI Runner** - **Python 3.13+ required** `pyenv` and `venv` are recommended ([see wiki](https://github.com/Capsize-Games/airunner/wiki/Installation-instructions) for more info)
   ```bash
   pip install "typing-extensions==4.13.2"
   pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
   pip install airunner[all_dev]
   pip install -U timm
   ```
4. **Run AI Runner**
   ```bash
   airunner
   ```

For more options, including Docker, see the [Installation Wiki](https://github.com/Capsize-Games/airunner/wiki/Installation-instructions).

**Note: *AI Runner does not distribute AI art models. You are responsible for obtaining and your own.***

---

## 🛠️ Usage

### Basic Usage

- **Run AI Runner**: `airunner`
- **Build templates**: `airunner-build-ui`

---

## ⭐ Features

Below is a high-level list of capabilities in AI Runner:

| Feature                                  | Description                                                                                  |
|------------------------------------------|----------------------------------------------------------------------------------------------|
| **LLMs & Communication**                 |                                                                                              |
| Voice-based chatbot conversations        | Have real-time voice-chat sessions with an LLM (speech-to-text + text-to-speech)            |
| Text-to-speech (TTS)                     | Convert text to spoken audio using **OpenVoice**, **SpeechT5**, and **Espeak**                                       |
| Speech-to-text (STT)                     | Convert spoken audio to text with **Whisper**                                                   |
| Customizable chatbots                    | Create AI personalities and moods for more engaging conversations                            |
| Retrieval-Augmented Generation           | Use local doc or website data to enrich chat responses                                      |
| **Image Generation**                     |                                                                                              |
| Stable Diffusion (1.5, SDXL, Turbo)      | Generate images from textual prompts, sketches, or existing images                           |
| Drawing tools & ControlNet              | Fine-tune image outputs with extra input or guides                                          |
| LoRA & Embeddings                        | Load LoRA models or textual embeddings for specialized image generation                     |
| **Image Manipulation**                   |                                                                                              |
| Inpaint & Outpaint                       | Modify portions of generated images while keeping context                                   |
| Image filters                            | Blur, film grain, pixel art, etc.                                                            |
| **Utility**                              |                                                                                              |
| **Offline**                              | Everything runs locally, no external API required                                           |
| Fast generation                          | E.g., ~2 seconds on an RTX 2080s for stable diffusion                                        |
| Docker-based approach                    | Simplifies setup & ensures GPU acceleration works out of the box                            |
| Dark mode                                | Built-in theming (Light / Dark / System)                                                    |
| NSFW toggles                             | Enable or disable NSFW detection for images                                                 |
| Ethical guardrails                       | Basic guardrails for safe LLM usage (optional)                                              |
| **Extensions**                           | Build your own feature add-ons via the extension API                                        |
| **Python Library**                       | `pip install airunner` and embed it in your own projects                                    |
| **API Support**                          | Optionally use OpenRouter or other external LLMs                                            |

---

## ⚙️ System Requirements

### System Requirements

| Specification       | Minimum                              | Recommended                          |
|---------------------|--------------------------------------------|--------------------------------------------|
| **OS**             | Ubuntu 22.04, Windows 10                               | Ubuntu 22.04 (Wayland)                              |
| **CPU**            | Ryzen 2700K or Intel Core i7-8700K         | Ryzen 5800X or Intel Core i7-11700K        |
| **Memory**         | 16 GB RAM                                  | 32 GB RAM                                  |
| **GPU**            | NVIDIA RTX 3060 or better                  | NVIDIA RTX 4090 or better                  |
| **Network**        | Broadband (used to download models)        | Broadband (used to download models)        |
| **Storage**        | 22 GB (with models), 6 GB (without models) | 100 GB or higher                           |
---

### Models

These are the sizes of the various models that power AI Runner.

| Model                | Size     |
|-------------------------|----------|
| Controlnet (SD 1.5)             | 10.6 GB  |
| Controlnet (SDXL)             | 320.2 MB  |
| Safety Checker + Feature Extractor               | 3.2 GB   |
| SD 1.5                | 1.6 MB   |
| SDXL 1.0                | 6.45 MB   |
| LLM                     | 5.8 GB   |
| e5 large (embedding model) | 1.3 GB   |
| Whisper Tiny            | 155.4 MB |
| Speech T5 (Voice)       | 654.4 MB |
| OpenVoice (Voice)       | 4.0 GB |

---

## AI Models

By default, AI Runner installs essential TTS/STT and minimal LLM components.  
You **must supply** additional Stable Diffusion models (e.g., from [Hugging Face](https://huggingface.co/) or [Civitai](https://civitai.com/)).

Organize them under your local AI Runner data directory:
```plaintext
~/.local/share/airunner
├── art
│   └── models
│       ├── SD 1.5
│       │   ├── lora
│       │   └── embeddings
│       ├── Flux
│       ├── SDXL 1.0
│       │   ├── lora
│       │   └── embeddings
│       └── SDXL Turbo
│           ├── lora
│           └── embeddings
```

---

## Unit Tests

To run all tests:

```bash
python -m unittest discover -s src/airunner/tests
```

Or a single test:

```bash
python -m unittest src/airunner/tests/test_prompt_weight_convert.py
```

---

## Database

AI Runner supports a simple database system. See the [Wiki](https://github.com/Capsize-Games/airunner/wiki/Database) for how to:
- Switch engines (SQLite, etc.)
- Make schema changes
- Run migrations

---

## Advanced Features

- **Memory Optimization**: TF32 Mode, VAE/Attention Slicing, Torch 2.0, sequential CPU offload, ToMe token merging.  
- **Experimental Integrations**: Weather-based chatbot prompts, advanced command-line arguments (`--perform-llm-analysis`, `--disable-setup-wizard`, etc.).  
- **Safety & Guardrails**: Optional NSFW content detection and adjustable guardrails for LLMs.  

---

## Contributing

We welcome pull requests for new features, bug fixes, or documentation improvements. You can also build and share **extensions** to expand AI Runner’s functionality. For details, see the [Extensions Wiki](https://github.com/Capsize-Games/airunner/wiki/Extensions).

Take a look at the [Contributing document](https://github.com/Capsize-Games/airunner/CONTRIBUTING.md) and the [Development wiki page](https://github.com/Capsize-Games/airunner/wiki/Development) for detailed instructions.

---

## Thank You!

Thanks for checking out AI Runner.  
Get started with local AI inference in minutes—no more endless environment setup.  
Questions or ideas? Join our [Discord](https://discord.gg/PUVDDCJ7gz) or open a [GitHub Issue](https://github.com/Capsize-Games/airunner/issues).  

**Happy building!**
