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.

Files changed (505) hide show
  1. {dv_pipecat_ai-0.0.85.dev861/src/dv_pipecat_ai.egg-info → dv_pipecat_ai-0.0.85.dev863}/PKG-INFO +1 -1
  2. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863/src/dv_pipecat_ai.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/SOURCES.txt +1 -0
  4. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/frames.py +32 -0
  5. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/transcript_processor.py +3 -1
  6. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/__init__.py +2 -0
  7. dv_pipecat_ai-0.0.85.dev863/src/pipecat/serializers/asterisk_chan_websocket_original.py +339 -0
  8. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/base_serializer.py +2 -0
  9. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/fastapi.py +48 -8
  10. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.dockerignore +0 -0
  11. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
  12. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
  13. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
  14. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
  15. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
  16. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
  17. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
  18. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  20. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/build.yaml +0 -0
  21. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/coverage.yaml +0 -0
  22. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/force_push_to_pypi.yml +0 -0
  23. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/format.yaml +0 -0
  24. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/github.yml +0 -0
  25. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/promote-prod.yml +0 -0
  26. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/publish.yaml +0 -0
  27. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/publish_test.yaml +0 -0
  28. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/python-compatibility.yaml +0 -0
  29. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/set-traffic-split.yml +0 -0
  30. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/sync-quickstart.yaml +0 -0
  31. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.github/workflows/tests.yaml +0 -0
  32. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.gitignore +0 -0
  33. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.pre-commit-config.yaml +0 -0
  34. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/.readthedocs.yaml +0 -0
  35. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CHANGELOG.md +0 -0
  36. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CHANGELOG.md.template +0 -0
  37. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CLAUDE.md +0 -0
  38. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/COMMUNITY_INTEGRATIONS.md +0 -0
  39. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/CONTRIBUTING.md +0 -0
  40. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
  41. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/LICENSE +0 -0
  42. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/MANIFEST.in +0 -0
  43. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/README.md +0 -0
  44. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/SECURITY.md +0 -0
  45. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/ansible.cfg +0 -0
  46. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/ansible_deployment.sh +0 -0
  47. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/cleanup_old_containers.yml +0 -0
  48. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/codecov.yml +0 -0
  49. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/ansible.cfg +0 -0
  50. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/ansible_setup.sh +0 -0
  51. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/inventory.ini +0 -0
  52. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/replace_env.yml +0 -0
  53. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create-new-machine/setup_playbook.yml +0 -0
  54. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/create_inventory.py +0 -0
  55. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/delete_old_dockers.sh +0 -0
  56. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/deploy.sh +0 -0
  57. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/deploy_playbook.yml +0 -0
  58. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/docker-compose.dev.yml +0 -0
  59. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/dump_logs.yml +0 -0
  60. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/env.example +0 -0
  61. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/fetch_logs.yml +0 -0
  62. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/inventory.ini +0 -0
  63. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/.helmignore +0 -0
  64. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/Chart.yaml +0 -0
  65. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
  66. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
  67. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
  68. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
  69. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
  70. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
  71. {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
  72. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
  73. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
  74. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
  75. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/templates/service.yaml +0 -0
  76. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-canary.yaml +0 -0
  77. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-prod.yaml +0 -0
  78. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values-stage.yaml +0 -0
  79. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/dv-pipecat/values.yaml +0 -0
  80. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/k8s/istio/destination-virtualservice.yaml +0 -0
  81. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/merge-code-into-single-file.sh +0 -0
  82. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/pipecat.png +0 -0
  83. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/pyproject.toml +0 -0
  84. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/restart.sh +0 -0
  85. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/restart_playbook.yml +0 -0
  86. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/setup.cfg +0 -0
  87. {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
  88. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
  89. {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
  90. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/__init__.py +0 -0
  91. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/__init__.py +0 -0
  92. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/base_llm_adapter.py +0 -0
  93. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/__init__.py +0 -0
  94. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/direct_function.py +0 -0
  95. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/function_schema.py +0 -0
  96. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
  97. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/__init__.py +0 -0
  98. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
  99. {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
  100. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
  101. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/gemini_adapter.py +0 -0
  102. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
  103. {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
  104. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/__init__.py +0 -0
  105. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/__init__.py +0 -0
  106. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
  107. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
  108. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
  109. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
  110. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
  111. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
  112. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
  113. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
  114. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
  115. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
  116. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
  117. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
  118. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/types.py +0 -0
  119. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/dtmf/utils.py +0 -0
  120. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/__init__.py +0 -0
  121. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/aic_filter.py +0 -0
  122. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
  123. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/koala_filter.py +0 -0
  124. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/krisp_filter.py +0 -0
  125. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/krisp_viva_filter.py +0 -0
  126. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
  127. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
  128. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/interruptions/__init__.py +0 -0
  129. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
  130. {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
  131. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/__init__.py +0 -0
  132. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
  133. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
  134. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/__init__.py +0 -0
  135. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
  136. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
  137. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
  138. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
  139. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/__init__.py +0 -0
  140. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
  141. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/utils.py +0 -0
  152. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/__init__.py +0 -0
  153. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/README.md +0 -0
  154. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/__init__.py +0 -0
  155. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
  156. {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
  157. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/silero.py +0 -0
  158. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
  159. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/__init__.py +0 -0
  160. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/base_clock.py +0 -0
  161. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/clocks/system_clock.py +0 -0
  162. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/__init__.py +0 -0
  163. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/ivr/__init__.py +0 -0
  164. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
  165. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/voicemail/__init__.py +0 -0
  166. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
  167. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/__init__.py +0 -0
  168. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/frames.proto +0 -0
  169. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
  170. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/__init__.py +0 -0
  171. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/connection_metrics.py +0 -0
  172. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/metrics/metrics.py +0 -0
  173. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/__init__.py +0 -0
  174. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/base_observer.py +0 -0
  175. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/__init__.py +0 -0
  176. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
  177. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
  178. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
  179. {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
  180. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/observers/turn_tracking_observer.py +0 -0
  181. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/__init__.py +0 -0
  182. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/base_pipeline.py +0 -0
  183. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/base_task.py +0 -0
  184. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/llm_switcher.py +0 -0
  185. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
  186. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/pipeline.py +0 -0
  187. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/runner.py +0 -0
  188. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/service_switcher.py +0 -0
  189. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
  190. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/task.py +0 -0
  191. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/task_observer.py +0 -0
  192. {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
  193. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/pipeline/tts_switcher.py +0 -0
  194. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/__init__.py +0 -0
  195. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/__init__.py +0 -0
  196. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
  197. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/gated.py +0 -0
  198. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/gated_llm_context.py +0 -0
  199. {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
  200. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_context.py +0 -0
  201. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_response.py +0 -0
  202. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/llm_response_universal.py +0 -0
  203. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
  204. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/sentence.py +0 -0
  205. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/user_response.py +0 -0
  206. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
  207. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/async_generator.py +0 -0
  208. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/audio/__init__.py +0 -0
  209. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
  210. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/consumer_processor.py +0 -0
  211. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/dtmf_aggregator.py +0 -0
  212. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/__init__.py +0 -0
  213. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/frame_filter.py +0 -0
  214. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/function_filter.py +0 -0
  215. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/identity_filter.py +0 -0
  216. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/null_filter.py +0 -0
  217. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/stt_mute_filter.py +0 -0
  218. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
  219. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
  220. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frame_processor.py +0 -0
  221. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/__init__.py +0 -0
  222. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/langchain.py +0 -0
  223. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/rtvi.py +0 -0
  224. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/frameworks/strands_agents.py +0 -0
  225. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/gstreamer/__init__.py +0 -0
  226. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
  227. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/idle_frame_processor.py +0 -0
  228. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/logger.py +0 -0
  229. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/__init__.py +0 -0
  230. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
  231. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/metrics/sentry.py +0 -0
  232. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/producer_processor.py +0 -0
  233. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/text_transformer.py +0 -0
  234. {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
  235. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/processors/user_idle_processor.py +0 -0
  236. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/py.typed +0 -0
  237. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/__init__.py +0 -0
  238. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/daily.py +0 -0
  239. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/livekit.py +0 -0
  240. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/run.py +0 -0
  241. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/types.py +0 -0
  242. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/runner/utils.py +0 -0
  243. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/asterisk.py +0 -0
  244. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/convox.py +0 -0
  245. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/custom.py +0 -0
  246. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/exotel.py +0 -0
  247. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/livekit.py +0 -0
  248. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/plivo.py +0 -0
  249. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/protobuf.py +0 -0
  250. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/telnyx.py +0 -0
  251. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/twilio.py +0 -0
  252. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/serializers/vi.py +0 -0
  253. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/__init__.py +0 -0
  254. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ai_service.py +0 -0
  255. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ai_services.py +0 -0
  256. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/anthropic/__init__.py +0 -0
  257. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/anthropic/llm.py +0 -0
  258. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/__init__.py +0 -0
  259. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/models.py +0 -0
  260. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/assemblyai/stt.py +0 -0
  261. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/asyncai/__init__.py +0 -0
  262. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/asyncai/tts.py +0 -0
  263. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/__init__.py +0 -0
  264. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/llm.py +0 -0
  265. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/__init__.py +0 -0
  266. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/context.py +0 -0
  267. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/frames.py +0 -0
  268. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/llm.py +0 -0
  269. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/nova_sonic/ready.wav +0 -0
  270. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/stt.py +0 -0
  271. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/tts.py +0 -0
  272. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws/utils.py +0 -0
  273. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
  274. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
  275. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
  276. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
  277. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/__init__.py +0 -0
  278. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/common.py +0 -0
  279. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/image.py +0 -0
  280. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/llm.py +0 -0
  281. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/realtime/__init__.py +0 -0
  282. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/realtime/llm.py +0 -0
  283. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/stt.py +0 -0
  284. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/azure/tts.py +0 -0
  285. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/__init__.py +0 -0
  286. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/stt.py +0 -0
  287. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cartesia/tts.py +0 -0
  288. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cerebras/__init__.py +0 -0
  289. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/cerebras/llm.py +0 -0
  290. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/__init__.py +0 -0
  291. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/flux/__init__.py +0 -0
  292. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/flux/stt.py +0 -0
  293. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/stt.py +0 -0
  294. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepgram/tts.py +0 -0
  295. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepseek/__init__.py +0 -0
  296. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/deepseek/llm.py +0 -0
  297. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/__init__.py +0 -0
  298. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/stt.py +0 -0
  299. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/elevenlabs/tts.py +0 -0
  300. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/__init__.py +0 -0
  301. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/image.py +0 -0
  302. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fal/stt.py +0 -0
  303. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fireworks/__init__.py +0 -0
  304. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fireworks/llm.py +0 -0
  305. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fish/__init__.py +0 -0
  306. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/fish/tts.py +0 -0
  307. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
  308. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
  309. {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
  310. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
  311. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/__init__.py +0 -0
  312. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/config.py +0 -0
  313. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/gladia/stt.py +0 -0
  314. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/__init__.py +0 -0
  315. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/frames.py +0 -0
  316. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/__init__.py +0 -0
  317. {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
  318. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/gemini_live/llm.py +0 -0
  319. {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
  320. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/google.py +0 -0
  321. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/image.py +0 -0
  322. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm.py +0 -0
  323. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm_openai.py +0 -0
  324. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/llm_vertex.py +0 -0
  325. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/rtvi.py +0 -0
  326. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/stt.py +0 -0
  327. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/google/tts.py +0 -0
  328. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/grok/__init__.py +0 -0
  329. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/grok/llm.py +0 -0
  330. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/__init__.py +0 -0
  331. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/llm.py +0 -0
  332. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/stt.py +0 -0
  333. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/groq/tts.py +0 -0
  334. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hamsa/__init__.py +0 -0
  335. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hamsa/stt.py +0 -0
  336. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/__init__.py +0 -0
  337. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/api.py +0 -0
  338. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/client.py +0 -0
  339. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/heygen/video.py +0 -0
  340. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hume/__init__.py +0 -0
  341. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/hume/tts.py +0 -0
  342. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/image_service.py +0 -0
  343. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/inworld/__init__.py +0 -0
  344. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/inworld/tts.py +0 -0
  345. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/llm_service.py +0 -0
  346. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/lmnt/__init__.py +0 -0
  347. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/lmnt/tts.py +0 -0
  348. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mcp_service.py +0 -0
  349. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mem0/__init__.py +0 -0
  350. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mem0/memory.py +0 -0
  351. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/minimax/__init__.py +0 -0
  352. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/minimax/tts.py +0 -0
  353. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mistral/__init__.py +0 -0
  354. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/mistral/llm.py +0 -0
  355. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/moondream/__init__.py +0 -0
  356. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/moondream/vision.py +0 -0
  357. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/neuphonic/__init__.py +0 -0
  358. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/neuphonic/tts.py +0 -0
  359. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/nim/__init__.py +0 -0
  360. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/nim/llm.py +0 -0
  361. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ollama/__init__.py +0 -0
  362. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ollama/llm.py +0 -0
  363. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/__init__.py +0 -0
  364. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/base_llm.py +0 -0
  365. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/image.py +0 -0
  366. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/llm.py +0 -0
  367. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/__init__.py +0 -0
  368. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/context.py +0 -0
  369. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/events.py +0 -0
  370. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/frames.py +0 -0
  371. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/realtime/llm.py +0 -0
  372. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/stt.py +0 -0
  373. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai/tts.py +0 -0
  374. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/__init__.py +0 -0
  375. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/azure.py +0 -0
  376. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/context.py +0 -0
  377. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/events.py +0 -0
  378. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime/frames.py +0 -0
  379. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
  380. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
  381. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
  382. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
  383. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
  384. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
  385. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openpipe/__init__.py +0 -0
  386. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openpipe/llm.py +0 -0
  387. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openrouter/__init__.py +0 -0
  388. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/openrouter/llm.py +0 -0
  389. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/perplexity/__init__.py +0 -0
  390. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/perplexity/llm.py +0 -0
  391. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/piper/__init__.py +0 -0
  392. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/piper/tts.py +0 -0
  393. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/playht/__init__.py +0 -0
  394. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/playht/tts.py +0 -0
  395. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/qwen/__init__.py +0 -0
  396. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/qwen/llm.py +0 -0
  397. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/rime/__init__.py +0 -0
  398. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/rime/tts.py +0 -0
  399. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/__init__.py +0 -0
  400. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/stt.py +0 -0
  401. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/riva/tts.py +0 -0
  402. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/salesforce/__init__.py +0 -0
  403. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/salesforce/llm.py +0 -0
  404. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/__init__.py +0 -0
  405. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/llm.py +0 -0
  406. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sambanova/stt.py +0 -0
  407. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/__init__.py +0 -0
  408. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/stt.py +0 -0
  409. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/sarvam/tts.py +0 -0
  410. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/simli/__init__.py +0 -0
  411. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/simli/video.py +0 -0
  412. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/soniox/__init__.py +0 -0
  413. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/soniox/stt.py +0 -0
  414. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/speechmatics/__init__.py +0 -0
  415. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/speechmatics/stt.py +0 -0
  416. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/stt_service.py +0 -0
  417. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tavus/__init__.py +0 -0
  418. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tavus/video.py +0 -0
  419. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/together/__init__.py +0 -0
  420. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/together/llm.py +0 -0
  421. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/tts_service.py +0 -0
  422. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ultravox/__init__.py +0 -0
  423. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/ultravox/stt.py +0 -0
  424. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vision_service.py +0 -0
  425. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vistaar/__init__.py +0 -0
  426. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/vistaar/llm.py +0 -0
  427. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/websocket_service.py +0 -0
  428. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/__init__.py +0 -0
  429. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/base_stt.py +0 -0
  430. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/whisper/stt.py +0 -0
  431. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/xtts/__init__.py +0 -0
  432. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/services/xtts/tts.py +0 -0
  433. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/__init__.py +0 -0
  434. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/base_notifier.py +0 -0
  435. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/sync/event_notifier.py +0 -0
  436. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/tests/__init__.py +0 -0
  437. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/tests/utils.py +0 -0
  438. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transcriptions/__init__.py +0 -0
  439. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transcriptions/language.py +0 -0
  440. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/__init__.py +0 -0
  441. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_input.py +0 -0
  442. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_output.py +0 -0
  443. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/base_transport.py +0 -0
  444. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/__init__.py +0 -0
  445. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/transport.py +0 -0
  446. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/daily/utils.py +0 -0
  447. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/heygen/__init__.py +0 -0
  448. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/heygen/transport.py +0 -0
  449. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/livekit/__init__.py +0 -0
  450. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/livekit/transport.py +0 -0
  451. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/__init__.py +0 -0
  452. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/audio.py +0 -0
  453. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/local/tk.py +0 -0
  454. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/__init__.py +0 -0
  455. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
  456. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/small_webrtc.py +0 -0
  457. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/webrtc_connection.py +0 -0
  458. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/websocket_client.py +0 -0
  459. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/network/websocket_server.py +0 -0
  460. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/__init__.py +0 -0
  461. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/daily.py +0 -0
  462. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/helpers/__init__.py +0 -0
  463. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
  464. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/livekit.py +0 -0
  465. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/services/tavus.py +0 -0
  466. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
  467. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
  468. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/request_handler.py +0 -0
  469. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
  470. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/tavus/__init__.py +0 -0
  471. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/tavus/transport.py +0 -0
  472. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/__init__.py +0 -0
  473. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/client.py +0 -0
  474. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/websocket/server.py +0 -0
  475. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/__init__.py +0 -0
  476. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/api.py +0 -0
  477. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/transports/whatsapp/client.py +0 -0
  478. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/__init__.py +0 -0
  479. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/asyncio/__init__.py +0 -0
  480. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/asyncio/task_manager.py +0 -0
  481. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/base_object.py +0 -0
  482. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/logger_config.py +0 -0
  483. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/network.py +0 -0
  484. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/redis.py +0 -0
  485. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/string.py +0 -0
  486. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/__init__.py +0 -0
  487. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
  488. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/base_text_filter.py +0 -0
  489. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
  490. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
  491. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
  492. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
  493. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/time.py +0 -0
  494. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/__init__.py +0 -0
  495. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/class_decorators.py +0 -0
  496. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
  497. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/service_attributes.py +0 -0
  498. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/service_decorators.py +0 -0
  499. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/setup.py +0 -0
  500. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
  501. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
  502. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/src/pipecat/utils/utils.py +0 -0
  503. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/stop_container.yml +0 -0
  504. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/test_elevenlabs_stt_segmented.py +0 -0
  505. {dv_pipecat_ai-0.0.85.dev861 → dv_pipecat_ai-0.0.85.dev863}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-ai
3
- Version: 0.0.85.dev861
3
+ Version: 0.0.85.dev863
4
4
  Summary: An open source framework for voice (and multimodal) assistants
5
5
  License-Expression: BSD-2-Clause
6
6
  Project-URL: Source, https://github.com/pipecat-ai/pipecat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-ai
3
- Version: 0.0.85.dev861
3
+ Version: 0.0.85.dev863
4
4
  Summary: An open source framework for voice (and multimodal) assistants
5
5
  License-Expression: BSD-2-Clause
6
6
  Project-URL: Source, https://github.com/pipecat-ai/pipecat
@@ -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=frame.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:
@@ -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 both binary and text message types.
84
+ with support for binary, text, and mixed message types.
85
85
  """
86
86
 
87
- def __init__(self, websocket: WebSocket, is_binary: bool, callbacks: FastAPIWebsocketCallbacks):
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 send(self, data: str | bytes):
121
- """Send data through the WebSocket connection.
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
- if self._is_binary:
129
- await self._websocket.send_bytes(data)
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._websocket.send_text(data)
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
- self._client = FastAPIWebsocketClient(websocket, is_binary, self._callbacks)
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