[build-system] requires = ["setuptools>=64", "setuptools_scm>=8"] build-backend = "setuptools.build_meta" [project] name = "pipecat-ai" dynamic = ["version"] description = "An open source framework for voice (and multimodal) assistants" license = "BSD-2-Clause" license-files = ["LICENSE"] readme = "README.md" requires-python = ">=3.10" keywords = ["webrtc", "audio", "video", "ai"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Topic :: Communications :: Conferencing", "Topic :: Multimedia :: Sound/Audio", "Topic :: Multimedia :: Video", "Topic :: Scientific/Engineering :: Artificial Intelligence" ] dependencies = [ "aiohttp>=3.11.12,<4", "audioop-lts~=0.2.1; python_version>='3.13'", "docstring_parser~=0.16", "loguru~=0.7.3", "Markdown>=3.7,<4", "nltk>=3.9.1,<4", "numpy>=1.26.4,<3", "Pillow>=11.1.0,<12", "protobuf~=5.29.3", "pydantic>=2.10.6,<3", "pyloudnorm~=0.1.1", "resampy~=0.4.3", "soxr~=0.5.0", "openai>=1.74.0,<2", # Explicit dependency pins for Python 3.11+ compatibility "numba>=0.60.0,<1", ] [project.urls] Source = "https://github.com/pipecat-ai/pipecat" Website = "https://pipecat.ai" [project.optional-dependencies] anthropic = [ "anthropic~=0.49.0" ] assemblyai = [ "websockets>=13.1,<15.0" ] asyncai = [ "websockets>=13.1,<15.0" ] aws = [ "aioboto3~=15.0.0", "websockets>=13.1,<15.0" ] aws-nova-sonic = [ "aws_sdk_bedrock_runtime~=0.0.2; python_version>='3.12'" ] azure = [ "azure-cognitiveservices-speech~=1.42.0"] cartesia = [ "cartesia~=2.0.3", "websockets>=13.1,<15.0" ] cerebras = [] deepseek = [] daily = [ "daily-python~=0.19.6" ] deepgram = [ "deepgram-sdk~=4.7.0" ] elevenlabs = [ "websockets>=13.1,<15.0" ] fal = [ "fal-client~=0.5.9" ] fireworks = [] fish = [ "ormsgpack~=1.7.0", "websockets>=13.1,<15.0" ] gladia = [ "websockets>=13.1,<15.0" ] google = [ "google-cloud-speech~=2.32.0", "google-cloud-texttospeech~=2.26.0", "google-genai~=1.24.0", "websockets>=13.1,<15.0" ] grok = [] groq = [ "groq~=0.23.0" ] gstreamer = [ "pygobject~=3.50.0" ] heygen = [ "livekit>=0.22.0", "websockets>=13.1,<15.0" ] inworld = [] krisp = [ "pipecat-ai-krisp~=0.4.0" ] koala = [ "pvkoala~=2.0.3" ] langchain = [ "langchain~=0.3.20", "langchain-community~=0.3.20", "langchain-openai~=0.3.9" ] livekit = [ "livekit~=0.22.0", "livekit-api~=0.8.2", "tenacity>=8.2.3,<10.0.0" ] lmnt = [ "websockets>=13.1,<15.0" ] local = [ "pyaudio~=0.2.14" ] mcp = [ "mcp[cli]~=1.9.4" ] mem0 = [ "mem0ai~=0.1.94" ] mlx-whisper = [ "mlx-whisper~=0.4.2" ] moondream = [ "einops~=0.8.0", "timm~=1.0.13", "transformers>=4.48.0" ] nim = [] neuphonic = [ "websockets>=13.1,<15.0" ] noisereduce = [ "noisereduce~=3.0.3" ] openai = [ "websockets>=13.1,<15.0" ] openpipe = [ "openpipe~=4.50.0" ] openrouter = [] perplexity = [] playht = [ "pyht>=0.1.6", "websockets>=13.1,<15.0" ] qwen = [] rime = [ "websockets>=13.1,<15.0" ] riva = [ "nvidia-riva-client~=2.21.1" ] runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<0.117.0", "pipecat-ai-small-webrtc-prebuilt>=1.0.0"] sambanova = [] sentry = [ "sentry-sdk~=2.23.1" ] local-smart-turn = [ "coremltools>=8.0", "transformers", "torch~=2.5.0", "torchaudio~=2.5.0" ] remote-smart-turn = [] silero = [ "onnxruntime~=1.20.1" ] simli = [ "simli-ai~=0.1.10"] soniox = [ "websockets>=13.1,<15.0" ] soundfile = [ "soundfile~=0.13.0" ] speechmatics = [ "speechmatics-rt>=0.4.0" ] tavus=[] together = [] tracing = [ "opentelemetry-sdk>=1.33.0", "opentelemetry-api>=1.33.0", "opentelemetry-instrumentation>=0.54b0" ] ultravox = [ "transformers>=4.48.0", "vllm~=0.7.3" ] webrtc = [ "aiortc~=1.11.0", "opencv-python~=4.11.0.86" ] websocket = [ "websockets>=13.1,<15.0", "fastapi>=0.115.6,<0.117.0" ] whisper = [ "faster-whisper~=1.1.1" ] [dependency-groups] dev = [ "build~=1.2.2", "coverage~=7.9.1", "grpcio-tools~=1.67.1", "pip-tools~=7.4.1", "pre-commit~=4.2.0", "pyright~=1.1.402", "pytest~=8.4.1", "pytest-asyncio~=1.0.0", "pytest-aiohttp==1.1.0", "ruff~=0.12.1", "setuptools~=78.1.1", "setuptools_scm~=8.3.1", "python-dotenv~=1.1.1", ] [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] "pipecat" = ["py.typed"] "pipecat.services.aws_nova_sonic" = ["src/pipecat/services/aws_nova_sonic/ready.wav"] [tool.pytest.ini_options] addopts = "--verbose" testpaths = ["tests"] pythonpath = ["src"] asyncio_default_fixture_loop_scope = "function" filterwarnings = [ "ignore:'audioop' is deprecated:DeprecationWarning", ] [tool.setuptools_scm] local_scheme = "no-local-version" fallback_version = "0.0.0-dev" [tool.ruff] exclude = [".git", "*_pb2.py"] line-length = 100 [tool.ruff.lint] select = [ "D", # Docstring rules "I", # Import rules ] ignore = [ "D105", # Missing docstring in magic methods (__str__, __repr__, etc.) ] [tool.ruff.lint.per-file-ignores] # Skip docstring checks for non-source code "examples/**/*.py" = ["D"] "tests/**/*.py" = ["D"] "scripts/**/*.py" = ["D"] "docs/**/*.py" = ["D"] # Skip D104 (missing docstring in public package) for __init__.py files "**/__init__.py" = ["D104"] # Skip specific rules for generated protobuf files "**/*_pb2.py" = ["D"] "src/pipecat/services/__init__.py" = ["D"] [tool.ruff.lint.pydocstyle] convention = "google" [tool.coverage.run] command_line = "--module pytest" source = ["src"] omit = ["*/tests/*"]