dv-pipecat-ai 0.0.93.dev71__tar.gz → 0.0.93.dev73__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.
Files changed (521) hide show
  1. {dv_pipecat_ai-0.0.93.dev71/src/dv_pipecat_ai.egg-info → dv_pipecat_ai-0.0.93.dev73}/PKG-INFO +1 -1
  2. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73/src/dv_pipecat_ai.egg-info}/PKG-INFO +1 -1
  3. dv_pipecat_ai-0.0.93.dev73/src/pipecat/adapters/services/gemini_adapter.py +618 -0
  4. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/llm.py +90 -10
  5. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/websocket_service.py +3 -1
  6. dv_pipecat_ai-0.0.93.dev71/src/pipecat/adapters/services/gemini_adapter.py +0 -315
  7. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.dockerignore +0 -0
  8. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
  9. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
  10. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
  11. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
  12. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
  13. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
  14. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
  15. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  17. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/build.yaml +0 -0
  18. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/coverage.yaml +0 -0
  19. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/force_push_to_pypi.yml +0 -0
  20. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/format.yaml +0 -0
  21. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/github.yml +0 -0
  22. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/promote-prod.yml +0 -0
  23. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/publish.yaml +0 -0
  24. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/publish_test.yaml +0 -0
  25. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/python-compatibility.yaml +0 -0
  26. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/set-traffic-split.yml +0 -0
  27. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/sync-quickstart.yaml +0 -0
  28. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.github/workflows/tests.yaml +0 -0
  29. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.gitignore +0 -0
  30. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.pre-commit-config.yaml +0 -0
  31. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/.readthedocs.yaml +0 -0
  32. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/CHANGELOG.md +0 -0
  33. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/CHANGELOG.md.template +0 -0
  34. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/CLAUDE.md +0 -0
  35. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/COMMUNITY_INTEGRATIONS.md +0 -0
  36. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/CONTRIBUTING.md +0 -0
  37. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
  38. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/LICENSE +0 -0
  39. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/MANIFEST.in +0 -0
  40. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/README.md +0 -0
  41. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/SECURITY.md +0 -0
  42. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/UPSTREAM_SYNC.md +0 -0
  43. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/ansible.cfg +0 -0
  44. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/ansible_deployment.sh +0 -0
  45. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/changelog/4567.fixed.md +0 -0
  46. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/cleanup_old_containers.yml +0 -0
  47. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/codecov.yml +0 -0
  48. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create-new-machine/ansible.cfg +0 -0
  49. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create-new-machine/ansible_setup.sh +0 -0
  50. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create-new-machine/inventory.ini +0 -0
  51. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create-new-machine/replace_env.yml +0 -0
  52. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create-new-machine/setup_playbook.yml +0 -0
  53. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/create_inventory.py +0 -0
  54. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/delete_old_dockers.sh +0 -0
  55. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/deploy.sh +0 -0
  56. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/deploy_playbook.yml +0 -0
  57. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/docker-compose.dev.yml +0 -0
  58. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/dump_logs.yml +0 -0
  59. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/env.example +0 -0
  60. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/fetch_logs.yml +0 -0
  61. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/inventory.ini +0 -0
  62. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/.helmignore +0 -0
  63. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/Chart.yaml +0 -0
  64. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
  65. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
  66. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
  67. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
  68. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
  69. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
  70. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/keda-api-key-secret.yaml +0 -0
  71. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
  72. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
  73. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
  74. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/templates/service.yaml +0 -0
  75. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/values-canary.yaml +0 -0
  76. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/values-prod.yaml +0 -0
  77. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/values-stage.yaml +0 -0
  78. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/dv-pipecat/values.yaml +0 -0
  79. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/k8s/istio/destination-virtualservice.yaml +0 -0
  80. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/merge-code-into-single-file.sh +0 -0
  81. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/pipecat.png +0 -0
  82. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/pyproject.toml +0 -0
  83. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/restart.sh +0 -0
  84. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/restart_playbook.yml +0 -0
  85. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/setup.cfg +0 -0
  86. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/dv_pipecat_ai.egg-info/SOURCES.txt +0 -0
  87. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/dv_pipecat_ai.egg-info/dependency_links.txt +0 -0
  88. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
  89. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/dv_pipecat_ai.egg-info/top_level.txt +0 -0
  90. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/__init__.py +0 -0
  91. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/__init__.py +0 -0
  92. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/base_llm_adapter.py +0 -0
  93. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/schemas/__init__.py +0 -0
  94. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/schemas/direct_function.py +0 -0
  95. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/schemas/function_schema.py +0 -0
  96. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
  97. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/__init__.py +0 -0
  98. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
  99. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/aws_nova_sonic_adapter.py +0 -0
  100. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
  101. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
  102. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/open_ai_realtime_adapter.py +0 -0
  103. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/adapters/services/open_ai_responses_adapter.py +0 -0
  104. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/__init__.py +0 -0
  105. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/__init__.py +0 -0
  106. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
  107. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
  108. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
  109. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
  110. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
  111. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
  112. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
  113. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
  114. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
  115. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
  116. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
  117. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
  118. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/types.py +0 -0
  119. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/dtmf/utils.py +0 -0
  120. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/__init__.py +0 -0
  121. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/aic_filter.py +0 -0
  122. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
  123. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/koala_filter.py +0 -0
  124. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/krisp_filter.py +0 -0
  125. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/krisp_viva_filter.py +0 -0
  126. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
  127. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
  128. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/interruptions/__init__.py +0 -0
  129. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
  130. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/interruptions/min_words_interruption_strategy.py +0 -0
  131. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/mixers/__init__.py +0 -0
  132. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
  133. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
  134. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/resamplers/__init__.py +0 -0
  135. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
  136. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
  137. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
  138. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
  139. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/__init__.py +0 -0
  140. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
  141. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
  142. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/base_smart_turn.py +0 -0
  143. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/data/__init__.py +0 -0
  144. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/data/smart-turn-v3.0.onnx +0 -0
  145. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/fal_smart_turn.py +0 -0
  146. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/http_smart_turn.py +0 -0
  147. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py +0 -0
  148. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/local_smart_turn.py +0 -0
  149. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v2.py +0 -0
  150. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v3.py +0 -0
  151. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/utils.py +0 -0
  152. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/__init__.py +0 -0
  153. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/data/README.md +0 -0
  154. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/data/__init__.py +0 -0
  155. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
  156. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/data/silero_vad_v2.onnx +0 -0
  157. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/silero.py +0 -0
  158. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
  159. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/clocks/__init__.py +0 -0
  160. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/clocks/base_clock.py +0 -0
  161. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/clocks/system_clock.py +0 -0
  162. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/extensions/__init__.py +0 -0
  163. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/extensions/ivr/__init__.py +0 -0
  164. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
  165. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/extensions/voicemail/__init__.py +0 -0
  166. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
  167. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/frames/__init__.py +0 -0
  168. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/frames/frames.proto +0 -0
  169. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/frames/frames.py +0 -0
  170. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
  171. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/metrics/__init__.py +0 -0
  172. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/metrics/connection_metrics.py +0 -0
  173. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/metrics/metrics.py +0 -0
  174. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/__init__.py +0 -0
  175. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/base_observer.py +0 -0
  176. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/loggers/__init__.py +0 -0
  177. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
  178. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
  179. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
  180. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/loggers/user_bot_latency_log_observer.py +0 -0
  181. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/observers/turn_tracking_observer.py +0 -0
  182. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/__init__.py +0 -0
  183. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/base_pipeline.py +0 -0
  184. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/base_task.py +0 -0
  185. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/llm_switcher.py +0 -0
  186. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
  187. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/pipeline.py +0 -0
  188. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/runner.py +0 -0
  189. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/service_switcher.py +0 -0
  190. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
  191. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/task.py +0 -0
  192. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/task_observer.py +0 -0
  193. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/to_be_updated/merge_pipeline.py +0 -0
  194. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/pipeline/tts_switcher.py +0 -0
  195. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/__init__.py +0 -0
  196. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/__init__.py +0 -0
  197. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
  198. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/gated.py +0 -0
  199. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/gated_llm_context.py +0 -0
  200. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/gated_open_ai_llm_context.py +0 -0
  201. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/llm_context.py +0 -0
  202. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/llm_response.py +0 -0
  203. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/llm_response_universal.py +0 -0
  204. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
  205. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/sentence.py +0 -0
  206. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/user_response.py +0 -0
  207. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
  208. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/async_generator.py +0 -0
  209. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/audio/__init__.py +0 -0
  210. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
  211. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/consumer_processor.py +0 -0
  212. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/dtmf_aggregator.py +0 -0
  213. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/__init__.py +0 -0
  214. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/frame_filter.py +0 -0
  215. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/function_filter.py +0 -0
  216. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/identity_filter.py +0 -0
  217. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/null_filter.py +0 -0
  218. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/stt_mute_filter.py +0 -0
  219. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
  220. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
  221. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/frame_processor.py +0 -0
  222. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/frameworks/__init__.py +0 -0
  223. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/frameworks/langchain.py +0 -0
  224. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/frameworks/rtvi.py +0 -0
  225. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/frameworks/strands_agents.py +0 -0
  226. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/gstreamer/__init__.py +0 -0
  227. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
  228. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/idle_frame_processor.py +0 -0
  229. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/logger.py +0 -0
  230. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/metrics/__init__.py +0 -0
  231. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
  232. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/metrics/sentry.py +0 -0
  233. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/producer_processor.py +0 -0
  234. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/text_transformer.py +0 -0
  235. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/transcript_processor.py +0 -0
  236. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/two_stage_user_idle_processor.py +0 -0
  237. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/processors/user_idle_processor.py +0 -0
  238. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/py.typed +0 -0
  239. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/__init__.py +0 -0
  240. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/daily.py +0 -0
  241. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/livekit.py +0 -0
  242. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/run.py +0 -0
  243. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/types.py +0 -0
  244. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/runner/utils.py +0 -0
  245. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/__init__.py +0 -0
  246. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/asterisk.py +0 -0
  247. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/asterisk_chan_websocket_json.py +0 -0
  248. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/asterisk_chan_websocket_original.py +0 -0
  249. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/base_serializer.py +0 -0
  250. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/convox.py +0 -0
  251. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/custom.py +0 -0
  252. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/exotel.py +0 -0
  253. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/knowlarity.py +0 -0
  254. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/livekit.py +0 -0
  255. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/plivo.py +0 -0
  256. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/protobuf.py +0 -0
  257. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/tatatele.py +0 -0
  258. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/telnyx.py +0 -0
  259. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/twilio.py +0 -0
  260. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/serializers/vi.py +0 -0
  261. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/__init__.py +0 -0
  262. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ai_service.py +0 -0
  263. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ai_services.py +0 -0
  264. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/anthropic/__init__.py +0 -0
  265. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/anthropic/llm.py +0 -0
  266. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/assemblyai/__init__.py +0 -0
  267. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/assemblyai/models.py +0 -0
  268. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/assemblyai/stt.py +0 -0
  269. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/asyncai/__init__.py +0 -0
  270. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/asyncai/tts.py +0 -0
  271. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/__init__.py +0 -0
  272. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/llm.py +0 -0
  273. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/nova_sonic/__init__.py +0 -0
  274. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/nova_sonic/context.py +0 -0
  275. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/nova_sonic/frames.py +0 -0
  276. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/nova_sonic/llm.py +0 -0
  277. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/nova_sonic/ready.wav +0 -0
  278. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/stt.py +0 -0
  279. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/tts.py +0 -0
  280. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws/utils.py +0 -0
  281. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
  282. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
  283. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
  284. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
  285. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/__init__.py +0 -0
  286. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/common.py +0 -0
  287. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/image.py +0 -0
  288. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/llm.py +0 -0
  289. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/realtime/__init__.py +0 -0
  290. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/realtime/llm.py +0 -0
  291. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/stt.py +0 -0
  292. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/azure/tts.py +0 -0
  293. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/cartesia/__init__.py +0 -0
  294. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/cartesia/stt.py +0 -0
  295. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/cartesia/tts.py +0 -0
  296. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/cerebras/__init__.py +0 -0
  297. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/cerebras/llm.py +0 -0
  298. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepgram/__init__.py +0 -0
  299. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepgram/flux/__init__.py +0 -0
  300. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepgram/flux/stt.py +0 -0
  301. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepgram/stt.py +0 -0
  302. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepgram/tts.py +0 -0
  303. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepseek/__init__.py +0 -0
  304. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/deepseek/llm.py +0 -0
  305. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/elevenlabs/__init__.py +0 -0
  306. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/elevenlabs/stt.py +0 -0
  307. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/elevenlabs/tts.py +0 -0
  308. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fal/__init__.py +0 -0
  309. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fal/image.py +0 -0
  310. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fal/stt.py +0 -0
  311. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fireworks/__init__.py +0 -0
  312. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fireworks/llm.py +0 -0
  313. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fish/__init__.py +0 -0
  314. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/fish/tts.py +0 -0
  315. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
  316. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
  317. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gemini_multimodal_live/file_api.py +0 -0
  318. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
  319. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gladia/__init__.py +0 -0
  320. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gladia/config.py +0 -0
  321. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/gladia/stt.py +0 -0
  322. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/__init__.py +0 -0
  323. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/frames.py +0 -0
  324. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/gemini_live/__init__.py +0 -0
  325. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/gemini_live/file_api.py +0 -0
  326. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/gemini_live/llm.py +0 -0
  327. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/gemini_live/llm_vertex.py +0 -0
  328. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/google.py +0 -0
  329. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/image.py +0 -0
  330. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/llm_openai.py +0 -0
  331. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/llm_vertex.py +0 -0
  332. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/rtvi.py +0 -0
  333. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/stt.py +0 -0
  334. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/google/tts.py +0 -0
  335. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/grok/__init__.py +0 -0
  336. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/grok/llm.py +0 -0
  337. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/groq/__init__.py +0 -0
  338. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/groq/llm.py +0 -0
  339. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/groq/stt.py +0 -0
  340. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/groq/tts.py +0 -0
  341. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/hamsa/__init__.py +0 -0
  342. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/hamsa/stt.py +0 -0
  343. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/hamsa/tts.py +0 -0
  344. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/heygen/__init__.py +0 -0
  345. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/heygen/api.py +0 -0
  346. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/heygen/client.py +0 -0
  347. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/heygen/video.py +0 -0
  348. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/hume/__init__.py +0 -0
  349. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/hume/tts.py +0 -0
  350. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/image_service.py +0 -0
  351. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/inworld/__init__.py +0 -0
  352. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/inworld/tts.py +0 -0
  353. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/llm_service.py +0 -0
  354. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/lmnt/__init__.py +0 -0
  355. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/lmnt/tts.py +0 -0
  356. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/mcp_service.py +0 -0
  357. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/mem0/__init__.py +0 -0
  358. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/mem0/memory.py +0 -0
  359. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/minimax/__init__.py +0 -0
  360. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/minimax/tts.py +0 -0
  361. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/mistral/__init__.py +0 -0
  362. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/mistral/llm.py +0 -0
  363. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/moondream/__init__.py +0 -0
  364. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/moondream/vision.py +0 -0
  365. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/neuphonic/__init__.py +0 -0
  366. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/neuphonic/tts.py +0 -0
  367. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/nim/__init__.py +0 -0
  368. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/nim/llm.py +0 -0
  369. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ollama/__init__.py +0 -0
  370. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ollama/llm.py +0 -0
  371. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/__init__.py +0 -0
  372. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/base_llm.py +0 -0
  373. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/image.py +0 -0
  374. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/llm.py +0 -0
  375. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/realtime/__init__.py +0 -0
  376. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/realtime/context.py +0 -0
  377. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/realtime/events.py +0 -0
  378. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/realtime/frames.py +0 -0
  379. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/realtime/llm.py +0 -0
  380. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/responses/__init__.py +0 -0
  381. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/responses/llm.py +0 -0
  382. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/stt.py +0 -0
  383. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai/tts.py +0 -0
  384. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime/__init__.py +0 -0
  385. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime/azure.py +0 -0
  386. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime/context.py +0 -0
  387. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime/events.py +0 -0
  388. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime/frames.py +0 -0
  389. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
  390. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
  391. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
  392. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
  393. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
  394. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
  395. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openpipe/__init__.py +0 -0
  396. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openpipe/llm.py +0 -0
  397. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openrouter/__init__.py +0 -0
  398. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/openrouter/llm.py +0 -0
  399. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/perplexity/__init__.py +0 -0
  400. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/perplexity/llm.py +0 -0
  401. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/piper/__init__.py +0 -0
  402. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/piper/tts.py +0 -0
  403. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/playht/__init__.py +0 -0
  404. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/playht/tts.py +0 -0
  405. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/qwen/__init__.py +0 -0
  406. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/qwen/llm.py +0 -0
  407. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/rime/__init__.py +0 -0
  408. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/rime/tts.py +0 -0
  409. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ringg/__init__.py +0 -0
  410. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ringg/stt.py +0 -0
  411. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ringg_qwen/__init__.py +0 -0
  412. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ringg_qwen/llm.py +0 -0
  413. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/riva/__init__.py +0 -0
  414. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/riva/stt.py +0 -0
  415. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/riva/tts.py +0 -0
  416. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/salesforce/__init__.py +0 -0
  417. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/salesforce/llm.py +0 -0
  418. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sambanova/__init__.py +0 -0
  419. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sambanova/llm.py +0 -0
  420. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sambanova/stt.py +0 -0
  421. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sarvam/__init__.py +0 -0
  422. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sarvam/_sdk.py +0 -0
  423. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sarvam/stt.py +0 -0
  424. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/sarvam/tts.py +0 -0
  425. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/simli/__init__.py +0 -0
  426. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/simli/video.py +0 -0
  427. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/soniox/__init__.py +0 -0
  428. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/soniox/stt.py +0 -0
  429. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/speechmatics/__init__.py +0 -0
  430. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/speechmatics/stt.py +0 -0
  431. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/stt_latency.py +0 -0
  432. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/stt_service.py +0 -0
  433. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/tavus/__init__.py +0 -0
  434. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/tavus/video.py +0 -0
  435. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/together/__init__.py +0 -0
  436. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/together/llm.py +0 -0
  437. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/tts_service.py +0 -0
  438. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ultravox/__init__.py +0 -0
  439. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/ultravox/stt.py +0 -0
  440. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/vision_service.py +0 -0
  441. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/vistaar/__init__.py +0 -0
  442. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/vistaar/llm.py +0 -0
  443. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/whisper/__init__.py +0 -0
  444. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/whisper/base_stt.py +0 -0
  445. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/whisper/stt.py +0 -0
  446. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/xtts/__init__.py +0 -0
  447. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/services/xtts/tts.py +0 -0
  448. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/sync/__init__.py +0 -0
  449. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/sync/base_notifier.py +0 -0
  450. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/sync/event_notifier.py +0 -0
  451. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/tests/__init__.py +0 -0
  452. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/tests/utils.py +0 -0
  453. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transcriptions/__init__.py +0 -0
  454. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transcriptions/language.py +0 -0
  455. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/__init__.py +0 -0
  456. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/base_input.py +0 -0
  457. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/base_output.py +0 -0
  458. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/base_transport.py +0 -0
  459. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/daily/__init__.py +0 -0
  460. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/daily/transport.py +0 -0
  461. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/daily/utils.py +0 -0
  462. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/heygen/__init__.py +0 -0
  463. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/heygen/transport.py +0 -0
  464. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/livekit/__init__.py +0 -0
  465. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/livekit/transport.py +0 -0
  466. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/local/__init__.py +0 -0
  467. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/local/audio.py +0 -0
  468. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/local/tk.py +0 -0
  469. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/__init__.py +0 -0
  470. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
  471. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/small_webrtc.py +0 -0
  472. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/webrtc_connection.py +0 -0
  473. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/websocket_client.py +0 -0
  474. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/network/websocket_server.py +0 -0
  475. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/__init__.py +0 -0
  476. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/daily.py +0 -0
  477. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/helpers/__init__.py +0 -0
  478. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
  479. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/livekit.py +0 -0
  480. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/services/tavus.py +0 -0
  481. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
  482. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
  483. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/smallwebrtc/request_handler.py +0 -0
  484. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
  485. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/tavus/__init__.py +0 -0
  486. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/tavus/transport.py +0 -0
  487. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/websocket/__init__.py +0 -0
  488. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/websocket/client.py +0 -0
  489. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/websocket/fastapi.py +0 -0
  490. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/websocket/server.py +0 -0
  491. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/whatsapp/__init__.py +0 -0
  492. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/whatsapp/api.py +0 -0
  493. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/transports/whatsapp/client.py +0 -0
  494. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/__init__.py +0 -0
  495. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/asyncio/__init__.py +0 -0
  496. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/asyncio/task_manager.py +0 -0
  497. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/base_object.py +0 -0
  498. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/logger_config.py +0 -0
  499. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/network.py +0 -0
  500. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/redis.py +0 -0
  501. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/string.py +0 -0
  502. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/__init__.py +0 -0
  503. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
  504. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/base_text_filter.py +0 -0
  505. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
  506. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
  507. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
  508. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
  509. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/time.py +0 -0
  510. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/__init__.py +0 -0
  511. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/class_decorators.py +0 -0
  512. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
  513. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/service_attributes.py +0 -0
  514. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/service_decorators.py +0 -0
  515. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/setup.py +0 -0
  516. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
  517. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
  518. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/src/pipecat/utils/utils.py +0 -0
  519. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/stop_container.yml +0 -0
  520. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/test_elevenlabs_stt_segmented.py +0 -0
  521. {dv_pipecat_ai-0.0.93.dev71 → dv_pipecat_ai-0.0.93.dev73}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-ai
3
- Version: 0.0.93.dev71
3
+ Version: 0.0.93.dev73
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.93.dev71
3
+ Version: 0.0.93.dev73
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
@@ -0,0 +1,618 @@
1
+ #
2
+ # Copyright (c) 2024–2025, Daily
3
+ #
4
+ # SPDX-License-Identifier: BSD 2-Clause License
5
+ #
6
+
7
+ """Gemini LLM adapter for Pipecat."""
8
+
9
+ import base64
10
+ import json
11
+ from dataclasses import dataclass
12
+ from typing import Any, Dict, List, Optional, TypedDict
13
+
14
+ from loguru import logger
15
+ from openai import NotGiven
16
+
17
+ from pipecat.adapters.base_llm_adapter import BaseLLMAdapter
18
+ from pipecat.adapters.schemas.tools_schema import AdapterType, ToolsSchema
19
+ from pipecat.processors.aggregators.llm_context import (
20
+ LLMContext,
21
+ LLMContextMessage,
22
+ LLMSpecificMessage,
23
+ LLMStandardMessage,
24
+ )
25
+
26
+ try:
27
+ from google.genai.types import (
28
+ Blob,
29
+ Content,
30
+ FunctionCall,
31
+ FunctionResponse,
32
+ Part,
33
+ )
34
+ except ModuleNotFoundError as e:
35
+ logger.error(f"Exception: {e}")
36
+ logger.error("In order to use Google AI, you need to `pip install pipecat-ai[google]`.")
37
+ raise Exception(f"Missing module: {e}")
38
+
39
+
40
+ class GeminiLLMInvocationParams(TypedDict):
41
+ """Context-based parameters for invoking Gemini LLM."""
42
+
43
+ system_instruction: Optional[str]
44
+ messages: List[Content]
45
+ tools: List[Any] | NotGiven
46
+
47
+
48
+ class GeminiLLMAdapter(BaseLLMAdapter[GeminiLLMInvocationParams]):
49
+ """Gemini-specific adapter for Pipecat.
50
+
51
+ Handles:
52
+ - Extracting parameters for Gemini's API from a universal LLM context
53
+ - Converting Pipecat's standardized tools schema to Gemini's function-calling format.
54
+ - Extracting and sanitizing messages from the LLM context for logging with Gemini.
55
+ """
56
+
57
+ @property
58
+ def id_for_llm_specific_messages(self) -> str:
59
+ """Get the identifier used in LLMSpecificMessage instances for Google."""
60
+ return "google"
61
+
62
+ def get_llm_invocation_params(self, context: LLMContext) -> GeminiLLMInvocationParams:
63
+ """Get Gemini-specific LLM invocation parameters from a universal LLM context.
64
+
65
+ Args:
66
+ context: The LLM context containing messages, tools, etc.
67
+
68
+ Returns:
69
+ Dictionary of parameters for Gemini's API.
70
+ """
71
+ messages = self._from_universal_context_messages(self.get_messages(context))
72
+ return {
73
+ "system_instruction": messages.system_instruction,
74
+ "messages": messages.messages,
75
+ # NOTE: LLMContext's tools are guaranteed to be a ToolsSchema (or NOT_GIVEN)
76
+ "tools": self.from_standard_tools(context.tools),
77
+ }
78
+
79
+ def to_provider_tools_format(self, tools_schema: ToolsSchema) -> List[Dict[str, Any]]:
80
+ """Convert tool schemas to Gemini's function-calling format.
81
+
82
+ Args:
83
+ tools_schema: The tools schema containing standard and custom tool definitions.
84
+
85
+ Returns:
86
+ List of tool definitions formatted for Gemini's function-calling API.
87
+ Includes both converted standard tools and any custom Gemini-specific tools.
88
+ """
89
+ functions_schema = tools_schema.standard_tools
90
+ formatted_standard_tools = (
91
+ [{"function_declarations": [func.to_default_dict() for func in functions_schema]}]
92
+ if functions_schema
93
+ else []
94
+ )
95
+ custom_gemini_tools = []
96
+ if tools_schema.custom_tools:
97
+ custom_gemini_tools = tools_schema.custom_tools.get(AdapterType.GEMINI, [])
98
+
99
+ return formatted_standard_tools + custom_gemini_tools
100
+
101
+ def get_messages_for_logging(self, context: LLMContext) -> List[Dict[str, Any]]:
102
+ """Get messages from a universal LLM context in a format ready for logging about Gemini.
103
+
104
+ Removes or truncates sensitive data like image content for safe logging.
105
+
106
+ Args:
107
+ context: The LLM context containing messages.
108
+
109
+ Returns:
110
+ List of messages in a format ready for logging about Gemini.
111
+ """
112
+ # Get messages in Gemini's format
113
+ messages = self._from_universal_context_messages(self.get_messages(context)).messages
114
+
115
+ # Sanitize messages for logging
116
+ messages_for_logging = []
117
+ for message in messages:
118
+ obj = message.to_json_dict()
119
+ try:
120
+ if "parts" in obj:
121
+ for part in obj["parts"]:
122
+ if "inline_data" in part:
123
+ part["inline_data"]["data"] = "..."
124
+ if "thought_signature" in part:
125
+ part["thought_signature"] = "..."
126
+ except Exception as e:
127
+ logger.debug(f"Error: {e}")
128
+ messages_for_logging.append(obj)
129
+ return messages_for_logging
130
+
131
+ @dataclass
132
+ class ConvertedMessages:
133
+ """Container for Google-formatted messages converted from universal context."""
134
+
135
+ messages: List[Content]
136
+ system_instruction: Optional[str] = None
137
+
138
+ def _from_universal_context_messages(
139
+ self, universal_context_messages: List[LLMContextMessage]
140
+ ) -> ConvertedMessages:
141
+ """Restructures messages to ensure proper Google format and message ordering.
142
+
143
+ This method handles conversion of OpenAI-formatted messages to Google format,
144
+ with special handling for function calls, function responses, system messages,
145
+ and Gemini thought signatures (required for Gemini 3 multi-turn tool calls).
146
+
147
+ The final message order is preserved as:
148
+
149
+ 1. Function calls (from model)
150
+ 2. Function responses (from user)
151
+ 3. Text messages (converted from system messages)
152
+
153
+ Note::
154
+
155
+ System messages are only added back when there are no regular text
156
+ messages in the context, ensuring proper conversation continuity
157
+ after function calls.
158
+ """
159
+ system_instruction = None
160
+ messages = []
161
+ # tool_call_id -> function_name mapping, populated by tool_calls messages and
162
+ # consumed by tool-result messages to fill FunctionResponse.name correctly.
163
+ tool_call_id_to_name_mapping: Dict[str, str] = {}
164
+ # Collected separately, then applied to messages after all conversion is done.
165
+ thought_signature_dicts: List[dict] = []
166
+
167
+ # Process each message, preserving Google-formatted messages and converting others
168
+ for message in universal_context_messages:
169
+ if isinstance(message, LLMSpecificMessage):
170
+ # Thought-signature messages are pushed by GoogleLLMService during
171
+ # streaming. They aren't real conversation messages -- they're
172
+ # bookmarks pointing at parts of other messages. Collect them now
173
+ # and apply them once we've built the full message list.
174
+ if (
175
+ isinstance(message.message, dict)
176
+ and message.message.get("type") == "thought_signature"
177
+ ):
178
+ thought_signature_dicts.append(message.message)
179
+ continue
180
+
181
+ # Otherwise assume that LLMSpecificMessage wraps a message in Google format
182
+ messages.append(message.message)
183
+ continue
184
+
185
+ # Convert standard format to Google format
186
+ converted = self._from_standard_message(
187
+ message,
188
+ already_have_system_instruction=bool(system_instruction),
189
+ tool_call_id_to_name_mapping=tool_call_id_to_name_mapping,
190
+ )
191
+ if isinstance(converted, Content):
192
+ # Regular (non-system) message
193
+ messages.append(converted)
194
+ else:
195
+ # System instruction
196
+ system_instruction = converted
197
+
198
+ # Apply thought signatures to the corresponding messages.
199
+ # MUST happen before _merge_parallel_tool_calls_for_thinking so that
200
+ # signatures end up on the Parts before parallel-call grouping runs.
201
+ self._apply_thought_signatures_to_messages(thought_signature_dicts, messages)
202
+
203
+ # When thinking is enabled, merge parallel tool calls into single messages
204
+ # (Gemini expects parallel tool calls as multiple Parts in one Content).
205
+ messages = self._merge_parallel_tool_calls_for_thinking(thought_signature_dicts, messages)
206
+
207
+ # Check if we only have function-related messages (no regular text)
208
+ has_regular_messages = any(
209
+ len(msg.parts) == 1
210
+ and getattr(msg.parts[0], "text", None)
211
+ and not getattr(msg.parts[0], "function_call", None)
212
+ and not getattr(msg.parts[0], "function_response", None)
213
+ for msg in messages
214
+ )
215
+
216
+ # Add system instruction back as a user message if we only have function messages
217
+ if system_instruction and not has_regular_messages:
218
+ messages.append(Content(role="user", parts=[Part(text=system_instruction)]))
219
+
220
+ # Remove any empty messages
221
+ messages = [m for m in messages if m.parts]
222
+
223
+ return self.ConvertedMessages(messages=messages, system_instruction=system_instruction)
224
+
225
+ def _from_standard_message(
226
+ self,
227
+ message: LLMStandardMessage,
228
+ already_have_system_instruction: bool,
229
+ tool_call_id_to_name_mapping: Optional[Dict[str, str]] = None,
230
+ ) -> Content | str:
231
+ """Convert standard universal context message to Google Content object.
232
+
233
+ Handles conversion of text, images, and function calls to Google's
234
+ format.
235
+ System instructions are returned as a plain string.
236
+
237
+ Args:
238
+ message: Message in standard universal context format.
239
+ already_have_system_instruction: Whether we already have a system instruction
240
+ tool_call_id_to_name_mapping: Mutable map used to thread function names
241
+ from tool_call messages to subsequent tool-response messages. Mutated
242
+ in place when an assistant message with ``tool_calls`` is seen, and
243
+ read when a ``role == "tool"`` message is seen. Required for
244
+ Gemini's ``FunctionResponse.name`` to match the original
245
+ ``FunctionCall.name`` (Gemini 3 enforces this match).
246
+
247
+ Returns:
248
+ Content object with role and parts, or a plain string for system
249
+ messages.
250
+
251
+ Examples:
252
+ Standard text message::
253
+
254
+ {
255
+ "role": "user",
256
+ "content": "Hello there"
257
+ }
258
+
259
+ Converts to Google Content with::
260
+
261
+ Content(
262
+ role="user",
263
+ parts=[Part(text="Hello there")]
264
+ )
265
+
266
+ Standard function call message::
267
+
268
+ {
269
+ "role": "assistant",
270
+ "tool_calls": [
271
+ {
272
+ "id": "call_abc",
273
+ "function": {
274
+ "name": "search",
275
+ "arguments": '{"query": "test"}'
276
+ }
277
+ }
278
+ ]
279
+ }
280
+
281
+ Converts to Google Content with::
282
+
283
+ Content(
284
+ role="model",
285
+ parts=[Part(function_call=FunctionCall(
286
+ id="call_abc", name="search", args={"query": "test"}
287
+ ))]
288
+ )
289
+ """
290
+ role = message["role"]
291
+ content = message.get("content", [])
292
+ if role == "system":
293
+ if already_have_system_instruction:
294
+ role = "user" # Convert system message to user role if we already have a system instruction
295
+ else:
296
+ # System instructions are returned as plain text
297
+ if isinstance(content, str):
298
+ return content
299
+ elif isinstance(content, list):
300
+ # If content is a list, we assume it's a list of text parts, per the standard
301
+ return " ".join(part["text"] for part in content if part.get("type") == "text")
302
+ elif role == "assistant":
303
+ role = "model"
304
+
305
+ parts = []
306
+ if message.get("tool_calls"):
307
+ for tc in message["tool_calls"]:
308
+ tc_id = tc.get("id")
309
+ name = tc["function"]["name"]
310
+ # Remember (id -> name) so a later tool-response message can fill
311
+ # FunctionResponse.name correctly. Gemini 3 rejects mismatches.
312
+ if tc_id is not None and tool_call_id_to_name_mapping is not None:
313
+ tool_call_id_to_name_mapping[tc_id] = name
314
+ parts.append(
315
+ Part(
316
+ function_call=FunctionCall(
317
+ # id is required for thought_signature bookmarks to
318
+ # find the right Part on the next-turn invocation.
319
+ id=tc_id,
320
+ name=name,
321
+ args=json.loads(tc["function"]["arguments"]),
322
+ )
323
+ )
324
+ )
325
+ elif role == "tool":
326
+ # Tool results come back to the model as user-role messages
327
+ # (Gemini convention; the model can't be both asker and responder).
328
+ role = "user"
329
+ try:
330
+ response = json.loads(message["content"])
331
+ if isinstance(response, dict):
332
+ response_dict = response
333
+ else:
334
+ response_dict = {"value": response}
335
+ except Exception as e:
336
+ # Response might not be JSON-deserializable.
337
+ # This occurs with a UserImageFrame, for example, where we get a plain "COMPLETED" string.
338
+ response_dict = {"value": message["content"]}
339
+ # Look up function name by tool_call_id; fall back to the legacy
340
+ # hard-coded name if we don't have the mapping (e.g. tool result
341
+ # without a preceding tool_call in context).
342
+ tc_id = message.get("tool_call_id")
343
+ function_name = "tool_call_result"
344
+ if (
345
+ tc_id is not None
346
+ and tool_call_id_to_name_mapping is not None
347
+ and tc_id in tool_call_id_to_name_mapping
348
+ ):
349
+ function_name = tool_call_id_to_name_mapping[tc_id]
350
+ parts.append(
351
+ Part(
352
+ function_response=FunctionResponse(
353
+ id=tc_id,
354
+ name=function_name,
355
+ response=response_dict,
356
+ )
357
+ )
358
+ )
359
+ elif isinstance(content, str):
360
+ parts.append(Part(text=content))
361
+ elif isinstance(content, list):
362
+ for c in content:
363
+ if c["type"] == "text":
364
+ parts.append(Part(text=c["text"]))
365
+ elif c["type"] == "image_url":
366
+ parts.append(
367
+ Part(
368
+ inline_data=Blob(
369
+ mime_type="image/jpeg",
370
+ data=base64.b64decode(c["image_url"]["url"].split(",")[1]),
371
+ )
372
+ )
373
+ )
374
+ elif c["type"] == "input_audio":
375
+ input_audio = c["input_audio"]
376
+ audio_bytes = base64.b64decode(input_audio["data"])
377
+ parts.append(Part(inline_data=Blob(mime_type="audio/wav", data=audio_bytes)))
378
+
379
+ return Content(role=role, parts=parts)
380
+
381
+ def _merge_parallel_tool_calls_for_thinking(
382
+ self, thought_signature_dicts: List[dict], messages: List[Content]
383
+ ) -> List[Content]:
384
+ """Merge parallel tool calls into single Content objects when thinking is enabled.
385
+
386
+ Gemini expects parallel tool calls (multiple function calls made
387
+ simultaneously) to be in a single Content with multiple function_call
388
+ Parts. This method takes a list of Content messages, where parallel
389
+ tool calls may be split across multiple messages, and merges them into
390
+ single messages.
391
+
392
+ This only has an effect when thought_signatures are present (i.e., when
393
+ thinking is enabled). When thinking is disabled, merging doesn't matter.
394
+ When thinking is enabled, there is a guarantee that the first tool call
395
+ (and only the first) in any batch of parallel tool calls will have a
396
+ thought_signature. This allows us to distinguish:
397
+
398
+ - Parallel tool calls: share a single thought_signature (on the first call)
399
+ - Sequential tool calls: each have their own thought_signature
400
+
401
+ Algorithm: A tool call message with a thought_signature starts a new
402
+ parallel group. Any tool call messages after it without a
403
+ thought_signature get merged into that group, regardless of what
404
+ messages appear in between.
405
+
406
+ Args:
407
+ thought_signature_dicts: A list of thought signature dicts, used
408
+ to determine if the work of merging is necessary.
409
+ messages: List of Content messages to process.
410
+
411
+ Returns:
412
+ List of Content messages with parallel tool calls merged when
413
+ thought_signatures are present, otherwise unchanged.
414
+ """
415
+ if not messages:
416
+ return messages
417
+
418
+ # Fast-exit if no function-call-related thought signatures
419
+ # This is a shortcut for determining both:
420
+ # - whether thinking is enabled, and
421
+ # - whether there are function calls in the messages
422
+ has_function_call_signatures = any(
423
+ ts.get("bookmark", {}).get("function_call") for ts in thought_signature_dicts
424
+ )
425
+ if not has_function_call_signatures:
426
+ return messages
427
+
428
+ def is_tool_call_message(msg: Content) -> bool:
429
+ """Check if message contains only function_call parts."""
430
+ return bool(
431
+ msg.role == "model"
432
+ and msg.parts
433
+ and all(getattr(part, "function_call", None) for part in msg.parts)
434
+ )
435
+
436
+ def message_has_thought_signature(msg: Content) -> bool:
437
+ """Check if any part in the message has a thought_signature."""
438
+ if msg.parts is None:
439
+ return False
440
+ return any(getattr(part, "thought_signature", None) for part in msg.parts)
441
+
442
+ merged_messages = []
443
+ i = 0
444
+
445
+ while i < len(messages):
446
+ current = messages[i]
447
+
448
+ # If this is a tool call message with a thought signature, start merging
449
+ if is_tool_call_message(current) and message_has_thought_signature(current):
450
+ merged_parts = list(current.parts)
451
+ other_messages = []
452
+ j = i + 1
453
+
454
+ # Scan forward, merging tool calls without signatures, collecting others
455
+ while j < len(messages):
456
+ next_msg = messages[j]
457
+ if is_tool_call_message(next_msg):
458
+ if message_has_thought_signature(next_msg):
459
+ # New parallel group starts, stop here
460
+ break
461
+ else:
462
+ # Merge this call into the current group
463
+ merged_parts.extend(next_msg.parts)
464
+ j += 1
465
+ else:
466
+ # Collect non-tool-call message, keep scanning
467
+ other_messages.append(next_msg)
468
+ j += 1
469
+
470
+ # Output merged calls, then collected other messages
471
+ merged_messages.append(Content(role="model", parts=merged_parts))
472
+ merged_messages.extend(other_messages)
473
+ i = j
474
+ else:
475
+ merged_messages.append(current)
476
+ i += 1
477
+
478
+ return merged_messages
479
+
480
+ def _apply_thought_signatures_to_messages(
481
+ self, thought_signature_dicts: List[dict], messages: List[Content]
482
+ ) -> None:
483
+ """Apply thought signatures to corresponding assistant messages.
484
+
485
+ See GoogleLLMService for more details about thought signatures.
486
+
487
+ Args:
488
+ thought_signature_dicts: A list of dicts containing:
489
+ - "signature": a thought signature
490
+ - "bookmark": a bookmark to identify the message part to apply the signature to.
491
+ The bookmark may contain one of:
492
+ - "function_call" (a function call ID string)
493
+ - "text" (a text string)
494
+ - "inline_data" (a Blob)
495
+ The list of thought signature dicts is in order.
496
+ messages: List of messages to apply the thought signatures to.
497
+ """
498
+ if not thought_signature_dicts:
499
+ return
500
+
501
+ # For debugging, print out thought signatures and their bookmarks
502
+ logger.debug(f"Thought signatures to apply: {len(thought_signature_dicts)}")
503
+ for ts in thought_signature_dicts:
504
+ bookmark = ts.get("bookmark")
505
+ if bookmark is None:
506
+ continue
507
+ if bookmark.get("function_call"):
508
+ logger.trace(f" - To function call: {bookmark['function_call']}")
509
+ elif bookmark.get("text"):
510
+ text = bookmark["text"]
511
+ log_display_text = f"{text[:50]}..." if len(text) > 50 else text
512
+ logger.trace(f" - To text: {log_display_text}")
513
+ elif bookmark.get("inline_data"):
514
+ logger.trace(f" - To inline data")
515
+
516
+ # Get all assistant messages
517
+ assistant_messages = [
518
+ message
519
+ for message in messages
520
+ if isinstance(message, Content) and message.role == "model"
521
+ ]
522
+
523
+ # Apply thought signatures to the corresponding assistant messages.
524
+ # Thought signatures are already in message order.
525
+ thought_signatures_applied = 0
526
+ message_start_index = 0 # Track where to start searching for the next matching message.
527
+ for thought_signature_dict in thought_signature_dicts:
528
+ signature = thought_signature_dict.get("signature")
529
+ bookmark = thought_signature_dict.get("bookmark")
530
+ if not signature or not bookmark:
531
+ continue
532
+
533
+ # Search through remaining assistant messages for a match
534
+ for i in range(message_start_index, len(assistant_messages)):
535
+ message = assistant_messages[i]
536
+ if not message.parts:
537
+ continue
538
+
539
+ # We're assuming that the thought signature always applies to the last part
540
+ last_part = message.parts[-1]
541
+
542
+ # If the bookmark matches the part...
543
+ if self._thought_signature_bookmark_matches_part(bookmark, last_part):
544
+ # Apply the thought signature
545
+ last_part.thought_signature = signature
546
+ thought_signatures_applied += 1
547
+
548
+ # Update the start index and stop searching for a match
549
+ message_start_index = i + 1
550
+ break
551
+
552
+ # For debugging, print out how many thought signatures were applied
553
+ logger.debug(f"Applied {thought_signatures_applied} thought signatures.")
554
+
555
+ def _thought_signature_bookmark_matches_part(self, bookmark: dict, part: Part) -> bool:
556
+ if function_call_bookmark := bookmark.get("function_call"):
557
+ return self._thought_signature_function_call_bookmark_matches_part(
558
+ function_call_bookmark, part
559
+ )
560
+ elif text_bookmark := bookmark.get("text"):
561
+ return self._thought_signature_text_bookmark_matches_part(text_bookmark, part)
562
+ elif inline_data := bookmark.get("inline_data"):
563
+ return self._thought_signature_inline_data_bookmark_matches_part(inline_data, part)
564
+ else:
565
+ logger.warning(f"Unknown thought signature bookmark type: {bookmark}")
566
+
567
+ return False
568
+
569
+ def _thought_signature_function_call_bookmark_matches_part(
570
+ self, bookmark_function_call_id: str, part: Part
571
+ ) -> bool:
572
+ if (
573
+ hasattr(part, "function_call")
574
+ and part.function_call
575
+ and part.function_call.id == bookmark_function_call_id
576
+ ):
577
+ logger.trace(f"Thought signature function call match: {bookmark_function_call_id}")
578
+ return True
579
+
580
+ return False
581
+
582
+ def _thought_signature_text_bookmark_matches_part(self, bookmark_text: str, part: Part) -> bool:
583
+ if hasattr(part, "text") and part.text:
584
+ # Normalize whitespace for comparison
585
+ bookmark_text = " ".join(bookmark_text.split())
586
+ part_text = " ".join(part.text.split())
587
+ # Check that either:
588
+ # - the part text is the same as the bookmark text
589
+ # - a prefix of the bookmark text (in case the part text was truncated due to interruption)
590
+ # - the bookmark text is a prefix of the part text (in case the bookmark represents just first chunk of multi-chunk text)
591
+ if (
592
+ part_text == bookmark_text
593
+ or bookmark_text.startswith(part_text)
594
+ or part_text.startswith(bookmark_text)
595
+ ):
596
+ log_display_text = f"{part.text[:50]}..." if len(part.text) > 50 else part.text
597
+ logger.trace(f"Thought signature text match: {log_display_text}")
598
+ return True
599
+
600
+ return False
601
+
602
+ def _thought_signature_inline_data_bookmark_matches_part(
603
+ self, bookmark_inline_data: Blob, part: Part
604
+ ) -> bool:
605
+ if (
606
+ hasattr(part, "inline_data")
607
+ and part.inline_data
608
+ and part.inline_data.data is not None
609
+ and bookmark_inline_data.data is not None
610
+ # Comparing length should be good enough for matching inline data,
611
+ # especially since we're already matching thought signatures in
612
+ # strict message order. Comparing actual data is expensive.
613
+ and len(part.inline_data.data) == len(bookmark_inline_data.data)
614
+ ):
615
+ logger.trace(f"Thought signature inline data match")
616
+ return True
617
+
618
+ return False