[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.11" 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 = [ "aiofiles>=24.1.0,<27", "aiohttp>=3.11.12,<4", "audioop-lts~=0.2.1; python_version>='3.13'", "docstring_parser>=0.16,<1", "loguru~=0.7.3", "Markdown>=3.7,<4", "nltk>=3.9.4,<4", "numpy>=1.26.4,<3", "Pillow>=11.1.0,<13", "protobuf>=5.29.6,<7", "pydantic>=2.10.6,<3", "pyloudnorm~=0.2.0", "resampy~=0.4.3", "soxr~=1.0.0", "openai>=1.74.0,<3", # Pinning numba to resolve package dependencies "numba>=0.61.2,<1", "wait_for2>=0.4.1,<1; python_version<'3.12'", # Required by LocalSmartTurnAnalyzerV3 # Inlined here instead of using a self-referential extra for Poetry compatibility. "transformers>=4.48.0,<6", "onnxruntime~=1.24.3", ] [project.urls] Homepage = "https://pipecat.ai" Documentation = "https://docs.pipecat.ai/" Source = "https://github.com/pipecat-ai/pipecat" Issues = "https://github.com/pipecat-ai/pipecat/issues" Changelog = "https://github.com/pipecat-ai/pipecat/blob/main/CHANGELOG.md" [project.optional-dependencies] aic = [ "aic-sdk~=2.2.0" ] anthropic = [ "anthropic>=0.49.0,<1" ] assemblyai = [ "pipecat-ai[websockets-base]" ] asyncai = [ "pipecat-ai[websockets-base]" ] aws = [ "aioboto3>=15.5.0,<16", "pipecat-ai[websockets-base]" ] aws-nova-sonic = [ "aws_sdk_bedrock_runtime~=0.4.0; python_version>='3.12'" ] azure = [ "azure-cognitiveservices-speech>=1.47.0,<2"] cartesia = [ "pipecat-ai[websockets-base]" ] camb = [ "camb-sdk>=1.5.4,<2" ] cerebras = [] daily = [ "daily-python~=0.28.0" ] deepgram = [ "deepgram-sdk>=6.1.1,<7", "pipecat-ai[websockets-base]" ] deepseek = [] elevenlabs = [ "pipecat-ai[websockets-base]" ] fal = [] fireworks = [] fish = [ "ormsgpack>=1.7.0,<2", "pipecat-ai[websockets-base]" ] gladia = [ "pipecat-ai[websockets-base]" ] google = [ "google-cloud-speech>=2.33.0,<3", "google-cloud-texttospeech>=2.31.0,<3", "google-genai>=1.68.0,<2", "pipecat-ai[websockets-base]" ] gradium = [ "pipecat-ai[websockets-base]" ] grok = [] groq = [ "groq>=0.23.0,<2" ] gstreamer = [ "pygobject~=3.50.0" ] heygen = [ "livekit>=1.0.13,<2", "pipecat-ai[websockets-base]" ] hume = [ "hume>=0.11.2,<1" ] inception = [] inworld = [ "pipecat-ai[websockets-base]" ] koala = [ "pvkoala~=2.0.3" ] kokoro = [ "kokoro-onnx>=0.5.0,<1", "requests>=2.32.5,<3" ] langchain = [ "langchain>=1.2.13,<2", "langchain-community>=0.4.1,<1", "langchain-openai>=1.1.12,<2" ] lemonslice = [ "pipecat-ai[daily]" ] livekit = [ "livekit>=1.0.13,<2", "livekit-api>=1.0.5,<2", "tenacity>=8.2.3,<10.0.0", "pyjwt>=2.12.0,<3" ] lmnt = [ "pipecat-ai[websockets-base]" ] local = [ "pyaudio~=0.2.14" ] local-smart-turn = [ "coremltools>=8.0", "transformers>=4.48.0,<6", "torch>=2.5.0,<3", "torchaudio>=2.5.0,<3" ] mcp = [ "mcp[cli]>=1.11.0,<2" ] mem0 = [ "mem0ai>=1.0.8,<2" ] mistral = ["mistralai>=2.0.0,<3"] mlx-whisper = [ "mlx-whisper~=0.4.2" ] moondream = [ "accelerate~=1.10.0", "einops~=0.8.0", "pyvips[binary]~=3.0.0", "timm~=1.0.13", "transformers>=4.48.0,<6" ] nebius = [] neuphonic = [ "pipecat-ai[websockets-base]" ] novita = [] nvidia = [ "nvidia-riva-client>=2.25.1,<3", "protobuf>=6.31.1,<7" ] openai = [ "pipecat-ai[websockets-base]" ] rnnoise = [ "pyrnnoise~=0.4.1" ] openrouter = [] perplexity = [] piper = [ "piper-tts>=1.3.0,<2", "requests>=2.32.5,<3" ] qwen = [] resembleai = [ "pipecat-ai[websockets-base]" ] rime = [ "pipecat-ai[websockets-base]" ] runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<1", "pipecat-ai-prebuilt>=1.0.1"] sagemaker = ["aws_sdk_sagemaker_runtime_http2; python_version>='3.12'"] sambanova = [] sarvam = [ "sarvamai==0.1.28", "pipecat-ai[websockets-base]" ] sentry = [ "sentry-sdk>=2.28.0,<3" ] silero = [] simli = [ "simli-ai~=2.0.1"] smallest = [ "pipecat-ai[websockets-base]" ] soniox = [ "pipecat-ai[websockets-base]" ] soundfile = [ "soundfile~=0.13.1" ] speechmatics = [ "speechmatics-voice[smart]~=0.2.8" ] strands = [ "strands-agents>=1.9.1,<2" ] tavus = [ "pipecat-ai[daily]" ] together = [] tracing = [ "opentelemetry-sdk>=1.33.0,<2", "opentelemetry-api>=1.33.0,<2", "opentelemetry-instrumentation>=0.54b0,<1" ] ultravox = [ "pipecat-ai[websockets-base]" ] vonage-video-connector = [ "vonage-video-connector~=0.2.3b0; python_full_version>='3.13' and python_full_version<'3.14' and platform_system=='Linux'" ] webrtc = [ "aiortc>=1.14.0,<2", "opencv-python>=4.11.0.86,<5" ] websocket = [ "pipecat-ai[websockets-base]", "fastapi>=0.115.6,<1" ] websockets-base = [ "websockets>=13.1,<16.0" ] whisper = [ "faster-whisper~=1.2.1" ] xai = [ "pipecat-ai[websockets-base]" ] [dependency-groups] dev = [ "build~=1.4.0", "coverage~=7.13.4", "grpcio-tools>=1.67.1,<2", "pip-tools~=7.5.3", "pre-commit~=4.5.1", "pyright==1.1.408", "pytest>=9.0.0,<10", "pytest-asyncio>=1.0.0,<2", "pytest-aiohttp>=1.0.0,<2", "ruff>=0.12.11,<1", "setuptools~=78.1.1", "setuptools_scm~=8.3.1", "python-dotenv>=1.0.1,<2.0.0", "towncrier~=25.8.0", ] docs = [ "sphinx>=8.1.3", "sphinx-rtd-theme", "sphinx-markdown-builder", "sphinx-autodoc-typehints", "toml", ] [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] "pipecat" = ["py.typed"] "pipecat.audio.dtmf" = [ "src/pipecat/audio/dtmf/dtmf-0.wav", "src/pipecat/audio/dtmf/dtmf-1.wav", "src/pipecat/audio/dtmf/dtmf-2.wav", "src/pipecat/audio/dtmf/dtmf-3.wav", "src/pipecat/audio/dtmf/dtmf-4.wav", "src/pipecat/audio/dtmf/dtmf-5.wav", "src/pipecat/audio/dtmf/dtmf-6.wav", "src/pipecat/audio/dtmf/dtmf-7.wav", "src/pipecat/audio/dtmf/dtmf-8.wav", "src/pipecat/audio/dtmf/dtmf-9.wav", "src/pipecat/audio/dtmf/dtmf-pound.wav", "src/pipecat/audio/dtmf/dtmf-star.wav", ] "pipecat.services.aws_nova_sonic" = ["src/pipecat/services/aws_nova_sonic/ready.wav"] "pipecat.audio.turn.smart_turn.data" = ["src/pipecat/audio/turn/smart_turn/data/smart-turn-v3.2-cpu.onnx"] [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 "UP", # Modern Python ] 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"] [tool.ruff.lint.pydocstyle] convention = "google" [tool.coverage.run] command_line = "--module pytest" source = ["src"] omit = ["*/tests/*"] [tool.towncrier] package = "pipecat" package_dir = "src" filename = "CHANGELOG.md" directory = "changelog" start_string = "\n" template = "changelog/_template.md.j2" title_format = "## [{version}] - {project_date}" issue_format = "[#{issue}](https://github.com/pipecat-ai/pipecat/pull/{issue})" underlines = ["", "", ""] wrap = true [[tool.towncrier.type]] directory = "added" name = "Added" showcontent = true [[tool.towncrier.type]] directory = "changed" name = "Changed" showcontent = true [[tool.towncrier.type]] directory = "deprecated" name = "Deprecated" showcontent = true [[tool.towncrier.type]] directory = "removed" name = "Removed" showcontent = true [[tool.towncrier.type]] directory = "fixed" name = "Fixed" showcontent = true [[tool.towncrier.type]] directory = "performance" name = "Performance" showcontent = true [[tool.towncrier.type]] directory = "security" name = "Security" showcontent = true [[tool.towncrier.type]] directory = "other" name = "Other" showcontent = true