dv-pipecat-ai 0.0.85.dev861__tar.gz → 0.0.85.dev863__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of dv-pipecat-ai might be problematic. Click here for more details.
- {dv_pipecat_ai-0.0.85.dev861/src/dv_pipecat_ai.egg-info → dv_pipecat_ai-0.0.85.dev863}/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863/src/dv_pipecat_ai.egg-info}/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/SOURCES.txt +1 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/frames.py +32 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/transcript_processor.py +3 -1
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/__init__.py +2 -0
- dv_pipecat_ai-0.0.85.dev863/src/pipecat/serializers/asterisk_chan_websocket_original.py +339 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/base_serializer.py +2 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/fastapi.py +48 -8
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.dockerignore +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/build.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/coverage.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/force_push_to_pypi.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/format.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/github.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/promote-prod.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/publish.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/publish_test.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/python-compatibility.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/set-traffic-split.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/sync-quickstart.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/tests.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.gitignore +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.readthedocs.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CHANGELOG.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CHANGELOG.md.template +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CLAUDE.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/COMMUNITY_INTEGRATIONS.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CONTRIBUTING.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/LICENSE +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/MANIFEST.in +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/README.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/SECURITY.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/ansible_deployment.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/cleanup_old_containers.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/codecov.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/ansible_setup.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/replace_env.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/setup_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create_inventory.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/delete_old_dockers.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/deploy.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/deploy_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/docker-compose.dev.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/dump_logs.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/env.example +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/fetch_logs.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/.helmignore +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/Chart.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/keda-api-key-secret.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/service.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-canary.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-prod.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-stage.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/istio/destination-virtualservice.yaml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/merge-code-into-single-file.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/pipecat.png +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/pyproject.toml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/restart.sh +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/restart_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/setup.cfg +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/top_level.txt +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/base_llm_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/direct_function.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/function_schema.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/aws_nova_sonic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/gemini_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/open_ai_realtime_adapter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/types.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/aic_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/koala_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/krisp_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/krisp_viva_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/interruptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/interruptions/min_words_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/base_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/data/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/data/smart-turn-v3.0.onnx +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/fal_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/http_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/local_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v2.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v3.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/README.md +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/silero_vad_v2.onnx +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/silero.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/base_clock.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/system_clock.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/ivr/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/voicemail/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/frames.proto +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/connection_metrics.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/metrics.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/base_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/user_bot_latency_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/turn_tracking_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/base_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/base_task.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/llm_switcher.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/pipeline.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/runner.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/service_switcher.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/task.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/task_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/to_be_updated/merge_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/tts_switcher.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/gated.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/gated_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/gated_open_ai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_response.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_response_universal.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/sentence.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/user_response.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/async_generator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/consumer_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/dtmf_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/frame_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/function_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/identity_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/null_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/stt_mute_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/langchain.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/strands_agents.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/gstreamer/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/idle_frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/logger.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/sentry.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/producer_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/text_transformer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/two_stage_user_idle_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/user_idle_processor.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/py.typed +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/daily.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/livekit.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/run.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/types.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/asterisk.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/convox.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/custom.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/exotel.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/livekit.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/plivo.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/protobuf.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/telnyx.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/twilio.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/vi.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ai_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ai_services.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/anthropic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/anthropic/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/models.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/asyncai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/asyncai/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/ready.wav +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/common.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/image.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/realtime/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cerebras/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cerebras/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/flux/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/flux/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepseek/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepseek/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/image.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fireworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fireworks/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fish/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fish/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/file_api.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/config.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/file_api.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/llm_vertex.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/google.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/image.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm_openai.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm_vertex.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/grok/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/grok/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hamsa/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hamsa/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/api.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/client.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/video.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hume/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hume/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/image_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/inworld/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/inworld/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/llm_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/lmnt/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/lmnt/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mcp_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mem0/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mem0/memory.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/minimax/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/minimax/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mistral/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mistral/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/moondream/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/moondream/vision.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/neuphonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/neuphonic/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/nim/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/nim/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ollama/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ollama/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/base_llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/image.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/events.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/azure.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/events.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openpipe/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openpipe/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openrouter/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openrouter/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/perplexity/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/perplexity/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/piper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/piper/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/playht/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/playht/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/qwen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/qwen/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/rime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/rime/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/salesforce/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/salesforce/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/simli/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/simli/video.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/soniox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/soniox/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/speechmatics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/speechmatics/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/stt_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tavus/video.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/together/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/together/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tts_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ultravox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ultravox/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vision_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vistaar/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vistaar/llm.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/websocket_service.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/base_stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/stt.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/xtts/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/xtts/tts.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/base_notifier.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/event_notifier.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/tests/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/tests/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transcriptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transcriptions/language.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_input.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_output.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/heygen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/heygen/transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/livekit/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/livekit/transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/audio.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/tk.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/small_webrtc.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/webrtc_connection.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/websocket_client.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/websocket_server.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/daily.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/helpers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/livekit.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/tavus.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/request_handler.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/tavus/transport.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/client.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/server.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/api.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/client.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/asyncio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/asyncio/task_manager.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/base_object.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/logger_config.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/network.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/redis.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/string.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/base_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/time.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/__init__.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/class_decorators.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/service_attributes.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/service_decorators.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/setup.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/utils.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/stop_container.yml +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/test_elevenlabs_stt_segmented.py +0 -0
- {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/uv.lock +0 -0
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/SOURCES.txt
RENAMED
|
@@ -239,6 +239,7 @@ src/pipecat/runner/types.py
|
|
|
239
239
|
src/pipecat/runner/utils.py
|
|
240
240
|
src/pipecat/serializers/__init__.py
|
|
241
241
|
src/pipecat/serializers/asterisk.py
|
|
242
|
+
src/pipecat/serializers/asterisk_chan_websocket_original.py
|
|
242
243
|
src/pipecat/serializers/base_serializer.py
|
|
243
244
|
src/pipecat/serializers/convox.py
|
|
244
245
|
src/pipecat/serializers/custom.py
|
|
@@ -1055,6 +1055,38 @@ class MetricsFrame(SystemFrame):
|
|
|
1055
1055
|
data: List[MetricsData]
|
|
1056
1056
|
|
|
1057
1057
|
|
|
1058
|
+
@dataclass
|
|
1059
|
+
class FunctionCallTrackingFrame(SystemFrame):
|
|
1060
|
+
"""Frame for tracking completed function call execution details.
|
|
1061
|
+
|
|
1062
|
+
Emitted when functions complete to track timing, parameters,
|
|
1063
|
+
responses, and status for analytics and debugging.
|
|
1064
|
+
|
|
1065
|
+
Parameters:
|
|
1066
|
+
message_id: ID of the transcript message that triggered this function
|
|
1067
|
+
function_name: Name of the function being called
|
|
1068
|
+
function_type: Type of function ('pre_call' or 'on_call')
|
|
1069
|
+
node_id: Flow node that triggered the function (optional)
|
|
1070
|
+
request_params: Parameters passed to the function
|
|
1071
|
+
response_data: Response returned by the function
|
|
1072
|
+
status_code: HTTP status code or function exit code
|
|
1073
|
+
latency_ms: Function execution time in milliseconds
|
|
1074
|
+
error_details: Error details if function failed
|
|
1075
|
+
metadata: Additional metadata (e.g., query_kb top results)
|
|
1076
|
+
"""
|
|
1077
|
+
|
|
1078
|
+
message_id: str = ""
|
|
1079
|
+
function_name: str = ""
|
|
1080
|
+
function_type: str = "" # 'pre_call' or 'on_call'
|
|
1081
|
+
node_id: Optional[str] = None
|
|
1082
|
+
request_params: Optional[Dict[str, Any]] = None
|
|
1083
|
+
response_data: Optional[Dict[str, Any]] = None
|
|
1084
|
+
status_code: Optional[int] = None
|
|
1085
|
+
latency_ms: Optional[float] = None
|
|
1086
|
+
error_details: Optional[Dict[str, Any]] = None
|
|
1087
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
1088
|
+
|
|
1089
|
+
|
|
1058
1090
|
@dataclass
|
|
1059
1091
|
class FunctionCallFromLLM:
|
|
1060
1092
|
"""Represents a function call returned by the LLM.
|
|
@@ -11,6 +11,7 @@ transcript messages with timestamps, enabling conversation history tracking and
|
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
from typing import List, Optional
|
|
14
|
+
import uuid
|
|
14
15
|
|
|
15
16
|
from loguru import logger
|
|
16
17
|
|
|
@@ -91,7 +92,7 @@ class UserTranscriptProcessor(BaseTranscriptProcessor):
|
|
|
91
92
|
user_id=frame.user_id,
|
|
92
93
|
content=frame.text,
|
|
93
94
|
timestamp=frame.timestamp,
|
|
94
|
-
message_id=
|
|
95
|
+
message_id=str(uuid.uuid4()),
|
|
95
96
|
)
|
|
96
97
|
await self._emit_update([message])
|
|
97
98
|
elif isinstance(frame, TranscriptDropFrame):
|
|
@@ -190,6 +191,7 @@ class AssistantTranscriptProcessor(BaseTranscriptProcessor):
|
|
|
190
191
|
role="assistant",
|
|
191
192
|
content=content,
|
|
192
193
|
timestamp=self._aggregation_start_time,
|
|
194
|
+
message_id=str(uuid.uuid4()),
|
|
193
195
|
)
|
|
194
196
|
await self._emit_update([message])
|
|
195
197
|
else:
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/__init__.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from .base_serializer import FrameSerializer, FrameSerializerType
|
|
2
|
+
from .asterisk import AsteriskFrameSerializer
|
|
2
3
|
from .convox import ConVoxFrameSerializer
|
|
3
4
|
from .custom import CustomFrameSerializer
|
|
4
5
|
from .exotel import ExotelFrameSerializer
|
|
@@ -10,6 +11,7 @@ from .vi import VIFrameSerializer
|
|
|
10
11
|
__all__ = [
|
|
11
12
|
"FrameSerializer",
|
|
12
13
|
"FrameSerializerType",
|
|
14
|
+
"AsteriskFrameSerializer",
|
|
13
15
|
"ConVoxFrameSerializer",
|
|
14
16
|
"CustomFrameSerializer",
|
|
15
17
|
"ExotelFrameSerializer",
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2024–2025, Daily
|
|
3
|
+
#
|
|
4
|
+
# SPDX-License-Identifier: BSD 2-Clause License
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""Asterisk WebSocket channel frame serialization interfaces for Pipecat."""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
from loguru import logger
|
|
13
|
+
from pydantic import BaseModel
|
|
14
|
+
|
|
15
|
+
from pipecat.audio.dtmf.types import KeypadEntry
|
|
16
|
+
from pipecat.audio.utils import (
|
|
17
|
+
alaw_to_pcm,
|
|
18
|
+
create_stream_resampler,
|
|
19
|
+
pcm_to_alaw,
|
|
20
|
+
pcm_to_ulaw,
|
|
21
|
+
ulaw_to_pcm,
|
|
22
|
+
)
|
|
23
|
+
from pipecat.frames.frames import (
|
|
24
|
+
AudioRawFrame,
|
|
25
|
+
CancelFrame,
|
|
26
|
+
EndFrame,
|
|
27
|
+
Frame,
|
|
28
|
+
InputAudioRawFrame,
|
|
29
|
+
InputDTMFFrame,
|
|
30
|
+
InputTransportMessageFrame,
|
|
31
|
+
InterruptionFrame,
|
|
32
|
+
StartFrame,
|
|
33
|
+
)
|
|
34
|
+
from pipecat.serializers.base_serializer import FrameSerializer, FrameSerializerType
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class AsteriskWsFrameSerializer(FrameSerializer):
|
|
38
|
+
"""Serializer for Asterisk WebSocket channel frames.
|
|
39
|
+
|
|
40
|
+
This serializer handles converting between Pipecat frames and Asterisk WebSocket
|
|
41
|
+
channel. It provides raw audio conversion (BINARY), and basic signalling(TEXT):
|
|
42
|
+
Asterisk to pipecat:
|
|
43
|
+
- when DTMF detected on Asterisk websocket channel we send InputDTMFFrame to pipecat.
|
|
44
|
+
Pipecat to Asterisk:
|
|
45
|
+
- when an EndFrame or CancelFrame is processed we send HANGUP to Asterisk websocket channel.
|
|
46
|
+
- when an InterruptionFrame is processed we send FLUSH_MEDIA to Asterisk websocket channel.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
class InputParams(BaseModel):
|
|
50
|
+
"""Configuration parameters for AsteriskFrameSerializer.
|
|
51
|
+
|
|
52
|
+
Parameters:
|
|
53
|
+
asterisk_sample_rate: Sample rate used by Asterisk, defaults to 8000 Hz.
|
|
54
|
+
encoding: Audio encoding (e.g., "ulaw", "alaw", "slin").
|
|
55
|
+
"""
|
|
56
|
+
asterisk_sample_rate: int = 8000
|
|
57
|
+
encoding: str = None # None means autodetect from Asterisk MEDIA_START event
|
|
58
|
+
|
|
59
|
+
def __init__(self, params: Optional[InputParams] = None):
|
|
60
|
+
"""Initialize the AsteriskFrameSerializer.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
params: Configuration parameters.
|
|
64
|
+
"""
|
|
65
|
+
self._asterisk_command_format = None # Will be set to "json" or "plain-text" after receiving the first MEDIA_START event
|
|
66
|
+
self._input_resampler = create_stream_resampler()
|
|
67
|
+
self._media_buffering_started = False
|
|
68
|
+
self._output_resampler = create_stream_resampler()
|
|
69
|
+
self._params = params or AsteriskWsFrameSerializer.InputParams()
|
|
70
|
+
self._pipeline_sample_rate = 0 # Will be populated during setup
|
|
71
|
+
|
|
72
|
+
self._asterisk_event_handlers = {
|
|
73
|
+
"MEDIA_START": self._handle_media_start,
|
|
74
|
+
"MEDIA_XOFF": self._handle_media_xoff,
|
|
75
|
+
"MEDIA_XON": self._handle_media_xon,
|
|
76
|
+
"DTMF_END": self._handle_dtmf_end,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async def raw_media_passthrough(data, in_sr, out_sr, resampler):
|
|
80
|
+
"""Pass through raw media without any conversion but resample if needed."""
|
|
81
|
+
return await resampler.resample(data, in_sr, out_sr)
|
|
82
|
+
|
|
83
|
+
self._encoders = {
|
|
84
|
+
"pcmu": pcm_to_ulaw,
|
|
85
|
+
"pcma": pcm_to_alaw,
|
|
86
|
+
"pcm16": raw_media_passthrough,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
self._decoders = {
|
|
90
|
+
"pcmu": ulaw_to_pcm,
|
|
91
|
+
"pcma": alaw_to_pcm,
|
|
92
|
+
"pcm16": raw_media_passthrough,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
# Asterisk event handlers
|
|
96
|
+
def _handle_media_start(self, message: dict):
|
|
97
|
+
"""MEDIA_START event handler.
|
|
98
|
+
|
|
99
|
+
MEDIA_START event is the first event we receive from Asterisk, we use it in deserialize method to identity which message format is used by Asterisk (json of plain-text).
|
|
100
|
+
But besides that, if the encoding is not defined, we attempt to detect it from the MEDIA_START event.
|
|
101
|
+
There are a few potentially useful parameters provided by Asterisk in the MEDIA_START event message:
|
|
102
|
+
connection_id: A UUID that will be set on the MEDIA_WEBSOCKET_CONNECTION_ID channel variable.
|
|
103
|
+
channel: The channel name on Asterisk.
|
|
104
|
+
channel_id: The channel's unique id on Asterisk.
|
|
105
|
+
format: The audio format set on the channel.
|
|
106
|
+
optimal_frame_size: The optimal frame size from Astersisk's perspective. It's not important as we always use media buffering, Asterisk will reframe and retime the audio as needed.
|
|
107
|
+
ptime: The packetization rate in milliseconds. It's not important as we always use media buffering, Asterisk will reframe and retime the audio as needed.
|
|
108
|
+
channel_variables: An object containing the variables currently set on the channel. This can be very handy for moving data from dialplan variables to the pipeline.
|
|
109
|
+
So we send MEDIA_START event object to the pipeline as InputTransportMessageFrame.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
message: The dictionary representing of the MEDIA_START event message from Asterisk.
|
|
113
|
+
"""
|
|
114
|
+
logger.info(f"Received MEDIA_START event from Asterisk: {message}")
|
|
115
|
+
logger.info(
|
|
116
|
+
f"Optional frame size for TTS: {message.get('optimal_frame_size')} bytes, ptime: {message.get('ptime')} ms, you might want to adjust your output trnasport parameters accordingly."
|
|
117
|
+
)
|
|
118
|
+
if self._params.encoding is None:
|
|
119
|
+
logger.info(
|
|
120
|
+
"Encoding is not provided, detecting Asterisk audio encoding from MEDIA_START event..."
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
format = message.get("format", "").strip().lower()
|
|
124
|
+
if format.startswith(
|
|
125
|
+
"slin"
|
|
126
|
+
): # asterisk slin format are like "slin12" or "slin16" .. "slin192"
|
|
127
|
+
_, bitrate = format.split("slin")
|
|
128
|
+
format = "slin"
|
|
129
|
+
|
|
130
|
+
if format in self._decoders:
|
|
131
|
+
self._params.encoding = format
|
|
132
|
+
logger.info(f"Detected Asterisk audio encoding: {self._params.encoding}")
|
|
133
|
+
if format.startswith("slin"):
|
|
134
|
+
if bitrate:
|
|
135
|
+
self._params.asterisk_sample_rate = int(bitrate) * 1000
|
|
136
|
+
else:
|
|
137
|
+
# in asterisk 'slin' assumes 8000 Hz if bitrate if not specified
|
|
138
|
+
self._params.asterisk_sample_rate = 8000
|
|
139
|
+
|
|
140
|
+
logger.info(
|
|
141
|
+
f"Detected Asterisk audio format 'slin{bitrate}', setting asterisk_sample_rate to {self._params.asterisk_sample_rate}"
|
|
142
|
+
)
|
|
143
|
+
else:
|
|
144
|
+
raise ValueError(
|
|
145
|
+
f"Unsupported or missing audio encoding in Asterisk MEDIA_START event: {format}"
|
|
146
|
+
)
|
|
147
|
+
return InputTransportMessageFrame(message=message)
|
|
148
|
+
|
|
149
|
+
def _handle_media_xoff(self, message: dict):
|
|
150
|
+
"""MEDIA_XOFF event handler.
|
|
151
|
+
|
|
152
|
+
The Asterisk's channel driver will send this event to the app when the frame queue length reaches the high water (XOFF) level.
|
|
153
|
+
The app should then pause sending media. Any media sent after this has a high probability of being dropped.
|
|
154
|
+
Asterisk buffer is ~1000 frames by 20ms (160 bytes for ulaw/alaw at 8000Hz), so it's ~20 seconds of audio or 160KB,
|
|
155
|
+
but the messages is sent when the buffer reaches the high water mark of ~900 frames.
|
|
156
|
+
Currently, we don't have flow control implemented yet, so we just log the event.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
message: The dictionary representing of the MEDIA_XOFF event message from Asterisk.
|
|
160
|
+
"""
|
|
161
|
+
logger.error(
|
|
162
|
+
f"Received MEDIA_XOFF event from Asterisk: {message}. Oops, we don't have flow control implemented yet, probably Asterisk will drop the following audio frames."
|
|
163
|
+
)
|
|
164
|
+
return None
|
|
165
|
+
|
|
166
|
+
def _handle_media_xon(self, message: dict):
|
|
167
|
+
"""MEDIA_XON event handler.
|
|
168
|
+
|
|
169
|
+
The Asterisk's channel driver will send this event to the app when the frame queue length drops below the low water (XON) level.
|
|
170
|
+
The app can then resume sending media.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
message: The dictionary representing of the MEDIA_XON event message from Asterisk.
|
|
174
|
+
"""
|
|
175
|
+
logger.info(
|
|
176
|
+
f"Received MEDIA_XON event from Asterisk: {message}. Asterisk audio buffer is ready to receive audio again."
|
|
177
|
+
)
|
|
178
|
+
return None
|
|
179
|
+
|
|
180
|
+
def _handle_dtmf_end(self, message: dict) -> Optional[InputDTMFFrame]:
|
|
181
|
+
"""DTMF_END event handler.
|
|
182
|
+
|
|
183
|
+
Handles DTMF_END events from Asterisk and converts them to InputDTMFFrame.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
message: The dictionary representing of the DTMF_END event message from Asterisk.
|
|
187
|
+
Returns:
|
|
188
|
+
An InputDTMFFrame if a valid DTMF digit is found, otherwise None.
|
|
189
|
+
"""
|
|
190
|
+
digit = message.get("digit")
|
|
191
|
+
if digit:
|
|
192
|
+
logger.info(f"DTMF received: {digit}")
|
|
193
|
+
try:
|
|
194
|
+
return InputDTMFFrame(KeypadEntry(digit))
|
|
195
|
+
except ValueError:
|
|
196
|
+
# Handle case where string doesn't match any enum value
|
|
197
|
+
logger.warning(f"Invalid DTMF digit received: {digit}")
|
|
198
|
+
return None
|
|
199
|
+
return None
|
|
200
|
+
|
|
201
|
+
@property
|
|
202
|
+
def type(self) -> FrameSerializerType:
|
|
203
|
+
"""Get the serialization type supported by this serializer.
|
|
204
|
+
Returns:
|
|
205
|
+
Always returns FrameSerializerType.MIXED.
|
|
206
|
+
It's not used by the serializer websocket transport and defined for compatibility with base class.
|
|
207
|
+
"""
|
|
208
|
+
return FrameSerializerType.MIXED
|
|
209
|
+
|
|
210
|
+
async def setup(self, frame: StartFrame):
|
|
211
|
+
"""Initialize the serializer with startup configuration.
|
|
212
|
+
Defined to set the pipeline input sample rate for resampling.
|
|
213
|
+
Args:
|
|
214
|
+
frame: StartFrame containing initialization parameters.
|
|
215
|
+
"""
|
|
216
|
+
self._pipeline_sample_rate = frame.audio_in_sample_rate
|
|
217
|
+
|
|
218
|
+
async def serialize(self, frame: Frame) -> str | bytes | None:
|
|
219
|
+
"""Convert a frame to its serialized representation sutable for Asterisk WebSocket channel.
|
|
220
|
+
Args:
|
|
221
|
+
frame: The frame to serialize.
|
|
222
|
+
Returns:
|
|
223
|
+
Serialized frame data as string, bytes, or None if serialization fails.
|
|
224
|
+
"""
|
|
225
|
+
if isinstance(frame, AudioRawFrame):
|
|
226
|
+
data = frame.audio
|
|
227
|
+
|
|
228
|
+
encoding = self._params.encoding.strip().lower()
|
|
229
|
+
|
|
230
|
+
try:
|
|
231
|
+
encoder = self._encoders[encoding]
|
|
232
|
+
except KeyError as e:
|
|
233
|
+
raise ValueError(f"Unsupported encoding: {self._params.encoding}") from e
|
|
234
|
+
|
|
235
|
+
serialized_data = await encoder(
|
|
236
|
+
data,
|
|
237
|
+
frame.sample_rate,
|
|
238
|
+
self._params.asterisk_sample_rate,
|
|
239
|
+
self._output_resampler,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
if serialized_data is None or len(serialized_data) == 0:
|
|
243
|
+
return None
|
|
244
|
+
|
|
245
|
+
# Asterisk media WebSocket channels require "START_MEDIA_BUFFERING" to enable audio buffering before sending it to Asterisk core.
|
|
246
|
+
# When media buffering is enabled, we can send raw binary audio in messages of arbitrary sizes, and Asterisk will frame them properly
|
|
247
|
+
# and it will generate silence to the channel if the buffer is empty and there is no audio to send.
|
|
248
|
+
# For our use case, it is crucial, as we can send audio frames of arbitrary sizes from Pipecat to Asterisk without worrying about framing/timing.
|
|
249
|
+
# Without media buffering enabled, Asterisk expects audio frames of specific sizes and timings, which complicates the implementation a lot,
|
|
250
|
+
# and probably not a good idea in general for TCP-based transports such as websockets.
|
|
251
|
+
# Therefore, we always send the "START_MEDIA_BUFFERING" command on before the first audio frame we send to Asterisk.
|
|
252
|
+
|
|
253
|
+
if not self._media_buffering_started:
|
|
254
|
+
self._media_buffering_started = True
|
|
255
|
+
command = (
|
|
256
|
+
"START_MEDIA_BUFFERING"
|
|
257
|
+
if self._asterisk_command_format == "plain-text"
|
|
258
|
+
else '{"command": "START_MEDIA_BUFFERING"}'
|
|
259
|
+
)
|
|
260
|
+
return (command, serialized_data)
|
|
261
|
+
|
|
262
|
+
return serialized_data
|
|
263
|
+
|
|
264
|
+
elif isinstance(frame, InterruptionFrame):
|
|
265
|
+
return (
|
|
266
|
+
"FLUSH_MEDIA"
|
|
267
|
+
if self._asterisk_command_format == "plain-text"
|
|
268
|
+
else '{"command": "FLUSH_MEDIA"}'
|
|
269
|
+
)
|
|
270
|
+
elif isinstance(frame, (EndFrame, CancelFrame)):
|
|
271
|
+
return (
|
|
272
|
+
"HANGUP"
|
|
273
|
+
if self._asterisk_command_format == "plain-text"
|
|
274
|
+
else '{"command": "HANGUP"}'
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
# Return None for unhandled frames
|
|
278
|
+
return None
|
|
279
|
+
|
|
280
|
+
async def deserialize(self, data: str | bytes) -> Frame | None:
|
|
281
|
+
"""Convert serialized data from Asterisk's websocket channel back to a frame object.
|
|
282
|
+
Args:
|
|
283
|
+
data: Serialized frame data as string or bytes.
|
|
284
|
+
Returns:
|
|
285
|
+
Reconstructed Frame object, or None if deserialization fails.
|
|
286
|
+
"""
|
|
287
|
+
if isinstance(data, bytes):
|
|
288
|
+
# If data is bytes, it's audio data
|
|
289
|
+
try:
|
|
290
|
+
decoder = self._decoders[self._params.encoding.strip().lower()]
|
|
291
|
+
except KeyError as e:
|
|
292
|
+
raise ValueError(f"Unsupported encoding: {self._params.encoding}") from e
|
|
293
|
+
|
|
294
|
+
deserialized_data = await decoder(
|
|
295
|
+
data,
|
|
296
|
+
self._params.asterisk_sample_rate,
|
|
297
|
+
self._pipeline_sample_rate,
|
|
298
|
+
self._input_resampler,
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
if deserialized_data is None or len(deserialized_data) == 0:
|
|
302
|
+
return None
|
|
303
|
+
|
|
304
|
+
audio_frame = InputAudioRawFrame(
|
|
305
|
+
audio=deserialized_data, num_channels=1, sample_rate=self._pipeline_sample_rate
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
return audio_frame
|
|
309
|
+
|
|
310
|
+
elif isinstance(data, str):
|
|
311
|
+
# Identify the format of signalling event from Asterisk websocket channel message based
|
|
312
|
+
# on the first message in the channel: "MEDIA_START", it might be json or plain-text
|
|
313
|
+
if self._asterisk_command_format is None and "MEDIA_START" in data:
|
|
314
|
+
try:
|
|
315
|
+
message = json.loads(data)
|
|
316
|
+
if message.get("event") == "MEDIA_START":
|
|
317
|
+
self._asterisk_command_format = "json"
|
|
318
|
+
except json.JSONDecodeError:
|
|
319
|
+
self._asterisk_command_format = "plain-text"
|
|
320
|
+
|
|
321
|
+
# Parse the message - try JSON first, fall back to plain-text
|
|
322
|
+
event = {}
|
|
323
|
+
try:
|
|
324
|
+
event = json.loads(data)
|
|
325
|
+
except json.JSONDecodeError:
|
|
326
|
+
# Fall back to plain-text parsing (space-separated key:value pairs)
|
|
327
|
+
event_entries = data.split(" ")
|
|
328
|
+
event["event"] = event_entries[0]
|
|
329
|
+
for entry in event_entries[1:]:
|
|
330
|
+
if ":" in entry:
|
|
331
|
+
key, value = entry.split(":", 1)
|
|
332
|
+
event[key] = value
|
|
333
|
+
|
|
334
|
+
handler = self._asterisk_event_handlers.get(event.get("event"))
|
|
335
|
+
if handler:
|
|
336
|
+
return handler(event)
|
|
337
|
+
else:
|
|
338
|
+
# we don't have a handler for this type of event
|
|
339
|
+
return None
|
|
@@ -18,10 +18,12 @@ class FrameSerializerType(Enum):
|
|
|
18
18
|
Parameters:
|
|
19
19
|
BINARY: Binary serialization format for compact representation.
|
|
20
20
|
TEXT: Text-based serialization format for human-readable output.
|
|
21
|
+
MIXED: Mixed format supporting both binary and text messages (e.g., Asterisk chan_websocket).
|
|
21
22
|
"""
|
|
22
23
|
|
|
23
24
|
BINARY = "binary"
|
|
24
25
|
TEXT = "text"
|
|
26
|
+
MIXED = "mixed"
|
|
25
27
|
|
|
26
28
|
|
|
27
29
|
class FrameSerializer(ABC):
|
|
@@ -81,20 +81,28 @@ class FastAPIWebsocketClient:
|
|
|
81
81
|
"""WebSocket client wrapper for handling connections and message passing.
|
|
82
82
|
|
|
83
83
|
Manages WebSocket state, message sending/receiving, and connection lifecycle
|
|
84
|
-
with support for
|
|
84
|
+
with support for binary, text, and mixed message types.
|
|
85
85
|
"""
|
|
86
86
|
|
|
87
|
-
def __init__(
|
|
87
|
+
def __init__(
|
|
88
|
+
self,
|
|
89
|
+
websocket: WebSocket,
|
|
90
|
+
is_binary: bool,
|
|
91
|
+
callbacks: FastAPIWebsocketCallbacks,
|
|
92
|
+
is_mixed: bool = False,
|
|
93
|
+
):
|
|
88
94
|
"""Initialize the WebSocket client.
|
|
89
95
|
|
|
90
96
|
Args:
|
|
91
97
|
websocket: The FastAPI WebSocket connection.
|
|
92
98
|
is_binary: Whether to use binary message format.
|
|
93
99
|
callbacks: Event callback functions.
|
|
100
|
+
is_mixed: Whether to use mixed mode (both binary and text messages).
|
|
94
101
|
"""
|
|
95
102
|
self._websocket = websocket
|
|
96
103
|
self._closing = False
|
|
97
104
|
self._is_binary = is_binary
|
|
105
|
+
self._is_mixed = is_mixed
|
|
98
106
|
self._callbacks = callbacks
|
|
99
107
|
self._leave_counter = 0
|
|
100
108
|
self._conversation_id = None
|
|
@@ -109,26 +117,56 @@ class FastAPIWebsocketClient:
|
|
|
109
117
|
if _.metadata and "call_id" in _.metadata:
|
|
110
118
|
self._conversation_id = _.metadata["call_id"]
|
|
111
119
|
|
|
120
|
+
async def _iter_mixed(self) -> typing.AsyncIterator[bytes | str]:
|
|
121
|
+
"""Async generator for receiving mixed binary and text WebSocket messages.
|
|
122
|
+
|
|
123
|
+
Yields:
|
|
124
|
+
Either bytes or string based on message type.
|
|
125
|
+
"""
|
|
126
|
+
while True:
|
|
127
|
+
message = await self._websocket.receive()
|
|
128
|
+
if message["type"] == "websocket.disconnect":
|
|
129
|
+
break
|
|
130
|
+
if "bytes" in message and message["bytes"] is not None:
|
|
131
|
+
yield message["bytes"]
|
|
132
|
+
elif "text" in message and message["text"] is not None:
|
|
133
|
+
yield message["text"]
|
|
134
|
+
|
|
112
135
|
def receive(self) -> typing.AsyncIterator[bytes | str]:
|
|
113
136
|
"""Get an async iterator for receiving WebSocket messages.
|
|
114
137
|
|
|
115
138
|
Returns:
|
|
116
139
|
An async iterator yielding bytes or strings based on message type.
|
|
117
140
|
"""
|
|
141
|
+
if self._is_mixed:
|
|
142
|
+
return self._iter_mixed()
|
|
118
143
|
return self._websocket.iter_bytes() if self._is_binary else self._websocket.iter_text()
|
|
119
144
|
|
|
120
|
-
async def
|
|
121
|
-
"""Send
|
|
145
|
+
async def _send_single(self, data: str | bytes):
|
|
146
|
+
"""Send a single message through the WebSocket connection.
|
|
122
147
|
|
|
123
148
|
Args:
|
|
124
149
|
data: The data to send (string or bytes).
|
|
125
150
|
"""
|
|
151
|
+
if isinstance(data, bytes):
|
|
152
|
+
await self._websocket.send_bytes(data)
|
|
153
|
+
elif isinstance(data, str):
|
|
154
|
+
await self._websocket.send_text(data)
|
|
155
|
+
|
|
156
|
+
async def send(self, data: str | bytes | tuple):
|
|
157
|
+
"""Send data through the WebSocket connection.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
data: The data to send (string, bytes, or tuple for multiple messages).
|
|
161
|
+
"""
|
|
126
162
|
try:
|
|
127
163
|
if self._can_send():
|
|
128
|
-
|
|
129
|
-
|
|
164
|
+
# Handle tuple of messages (e.g., for sending command + audio together)
|
|
165
|
+
if isinstance(data, tuple):
|
|
166
|
+
for item in data:
|
|
167
|
+
await self._send_single(item)
|
|
130
168
|
else:
|
|
131
|
-
await self.
|
|
169
|
+
await self._send_single(data)
|
|
132
170
|
except Exception as e:
|
|
133
171
|
if isinstance(e, WebSocketDisconnect):
|
|
134
172
|
logger.warning(
|
|
@@ -523,9 +561,11 @@ class FastAPIWebsocketTransport(BaseTransport):
|
|
|
523
561
|
)
|
|
524
562
|
|
|
525
563
|
is_binary = False
|
|
564
|
+
is_mixed = False
|
|
526
565
|
if self._params.serializer:
|
|
527
566
|
is_binary = self._params.serializer.type == FrameSerializerType.BINARY
|
|
528
|
-
|
|
567
|
+
is_mixed = self._params.serializer.type == FrameSerializerType.MIXED
|
|
568
|
+
self._client = FastAPIWebsocketClient(websocket, is_binary, self._callbacks, is_mixed)
|
|
529
569
|
|
|
530
570
|
self._input = FastAPIWebsocketInputTransport(
|
|
531
571
|
self, self._client, self._params, name=self._input_name
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/1-bug_report.yml
RENAMED
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/2-question.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/5-new-service.yml
RENAMED
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/6-dependency.yml
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/config.yml
RENAMED
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/PULL_REQUEST_TEMPLATE.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/force_push_to_pypi.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/promote-prod.yml
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/publish_test.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/set-traffic-split.yml
RENAMED
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/sync-quickstart.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|