dv-pipecat-ai 0.0.85.dev818__tar.gz → 0.0.85.dev819__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 (502) hide show
  1. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/PKG-INFO +1 -1
  2. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/dv_pipecat_ai.egg-info/PKG-INFO +1 -1
  3. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/dv_pipecat_ai.egg-info/SOURCES.txt +1 -0
  4. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/salesforce/llm.py +148 -26
  5. dv_pipecat_ai-0.0.85.dev819/src/pipecat/utils/redis.py +58 -0
  6. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.dockerignore +0 -0
  7. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
  8. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
  9. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
  10. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
  11. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
  12. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
  13. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
  14. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/build.yaml +0 -0
  17. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/coverage.yaml +0 -0
  18. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/force_push_to_pypi.yml +0 -0
  19. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/format.yaml +0 -0
  20. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/github.yml +0 -0
  21. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/promote-prod.yml +0 -0
  22. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/publish.yaml +0 -0
  23. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/publish_test.yaml +0 -0
  24. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/python-compatibility.yaml +0 -0
  25. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/set-traffic-split.yml +0 -0
  26. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/sync-quickstart.yaml +0 -0
  27. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.github/workflows/tests.yaml +0 -0
  28. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.gitignore +0 -0
  29. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.pre-commit-config.yaml +0 -0
  30. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/.readthedocs.yaml +0 -0
  31. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/CHANGELOG.md +0 -0
  32. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/CHANGELOG.md.template +0 -0
  33. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/CLAUDE.md +0 -0
  34. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/COMMUNITY_INTEGRATIONS.md +0 -0
  35. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/CONTRIBUTING.md +0 -0
  36. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
  37. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/LICENSE +0 -0
  38. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/MANIFEST.in +0 -0
  39. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/README.md +0 -0
  40. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/SECURITY.md +0 -0
  41. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/ansible.cfg +0 -0
  42. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/ansible_deployment.sh +0 -0
  43. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/cleanup_old_containers.yml +0 -0
  44. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/codecov.yml +0 -0
  45. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create-new-machine/ansible.cfg +0 -0
  46. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create-new-machine/ansible_setup.sh +0 -0
  47. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create-new-machine/inventory.ini +0 -0
  48. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create-new-machine/replace_env.yml +0 -0
  49. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create-new-machine/setup_playbook.yml +0 -0
  50. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/create_inventory.py +0 -0
  51. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/delete_old_dockers.sh +0 -0
  52. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/deploy.sh +0 -0
  53. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/deploy_playbook.yml +0 -0
  54. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/docker-compose.dev.yml +0 -0
  55. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/dump_logs.yml +0 -0
  56. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/env.example +0 -0
  57. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/fetch_logs.yml +0 -0
  58. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/inventory.ini +0 -0
  59. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/.helmignore +0 -0
  60. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/Chart.yaml +0 -0
  61. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
  62. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
  63. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
  64. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
  65. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
  66. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
  67. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/keda-api-key-secret.yaml +0 -0
  68. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
  69. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
  70. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
  71. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/templates/service.yaml +0 -0
  72. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/values-canary.yaml +0 -0
  73. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/values-prod.yaml +0 -0
  74. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/values-stage.yaml +0 -0
  75. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/dv-pipecat/values.yaml +0 -0
  76. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/k8s/istio/destination-virtualservice.yaml +0 -0
  77. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/merge-code-into-single-file.sh +0 -0
  78. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/pipecat.png +0 -0
  79. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/pyproject.toml +0 -0
  80. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/restart.sh +0 -0
  81. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/restart_playbook.yml +0 -0
  82. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/setup.cfg +0 -0
  83. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/dv_pipecat_ai.egg-info/dependency_links.txt +0 -0
  84. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
  85. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/dv_pipecat_ai.egg-info/top_level.txt +0 -0
  86. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/__init__.py +0 -0
  87. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/__init__.py +0 -0
  88. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/base_llm_adapter.py +0 -0
  89. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/schemas/__init__.py +0 -0
  90. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/schemas/direct_function.py +0 -0
  91. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/schemas/function_schema.py +0 -0
  92. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
  93. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/__init__.py +0 -0
  94. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
  95. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/aws_nova_sonic_adapter.py +0 -0
  96. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
  97. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/gemini_adapter.py +0 -0
  98. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
  99. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/adapters/services/open_ai_realtime_adapter.py +0 -0
  100. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/__init__.py +0 -0
  101. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/__init__.py +0 -0
  102. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
  103. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
  104. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
  105. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
  106. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
  107. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
  108. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
  109. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
  110. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
  111. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
  112. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
  113. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
  114. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/types.py +0 -0
  115. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/dtmf/utils.py +0 -0
  116. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/__init__.py +0 -0
  117. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/aic_filter.py +0 -0
  118. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
  119. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/koala_filter.py +0 -0
  120. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/krisp_filter.py +0 -0
  121. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/krisp_viva_filter.py +0 -0
  122. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
  123. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
  124. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/interruptions/__init__.py +0 -0
  125. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
  126. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/interruptions/min_words_interruption_strategy.py +0 -0
  127. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/mixers/__init__.py +0 -0
  128. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
  129. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
  130. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/resamplers/__init__.py +0 -0
  131. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
  132. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
  133. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
  134. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
  135. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/__init__.py +0 -0
  136. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
  137. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
  138. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/base_smart_turn.py +0 -0
  139. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/data/__init__.py +0 -0
  140. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/data/smart-turn-v3.0.onnx +0 -0
  141. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/fal_smart_turn.py +0 -0
  142. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/http_smart_turn.py +0 -0
  143. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py +0 -0
  144. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/local_smart_turn.py +0 -0
  145. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v2.py +0 -0
  146. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v3.py +0 -0
  147. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/utils.py +0 -0
  148. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/__init__.py +0 -0
  149. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/data/README.md +0 -0
  150. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/data/__init__.py +0 -0
  151. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
  152. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/data/silero_vad_v2.onnx +0 -0
  153. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/silero.py +0 -0
  154. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
  155. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/clocks/__init__.py +0 -0
  156. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/clocks/base_clock.py +0 -0
  157. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/clocks/system_clock.py +0 -0
  158. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/extensions/__init__.py +0 -0
  159. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/extensions/ivr/__init__.py +0 -0
  160. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
  161. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/extensions/voicemail/__init__.py +0 -0
  162. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
  163. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/frames/__init__.py +0 -0
  164. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/frames/frames.proto +0 -0
  165. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/frames/frames.py +0 -0
  166. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
  167. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/metrics/__init__.py +0 -0
  168. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/metrics/metrics.py +0 -0
  169. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/__init__.py +0 -0
  170. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/base_observer.py +0 -0
  171. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/loggers/__init__.py +0 -0
  172. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
  173. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
  174. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
  175. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/loggers/user_bot_latency_log_observer.py +0 -0
  176. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/observers/turn_tracking_observer.py +0 -0
  177. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/__init__.py +0 -0
  178. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/base_pipeline.py +0 -0
  179. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/base_task.py +0 -0
  180. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/llm_switcher.py +0 -0
  181. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
  182. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/pipeline.py +0 -0
  183. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/runner.py +0 -0
  184. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/service_switcher.py +0 -0
  185. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
  186. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/task.py +0 -0
  187. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/task_observer.py +0 -0
  188. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/to_be_updated/merge_pipeline.py +0 -0
  189. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/pipeline/tts_switcher.py +0 -0
  190. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/__init__.py +0 -0
  191. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/__init__.py +0 -0
  192. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
  193. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/gated.py +0 -0
  194. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/gated_llm_context.py +0 -0
  195. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/gated_open_ai_llm_context.py +0 -0
  196. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/llm_context.py +0 -0
  197. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/llm_response.py +0 -0
  198. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/llm_response_universal.py +0 -0
  199. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
  200. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/sentence.py +0 -0
  201. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/user_response.py +0 -0
  202. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
  203. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/async_generator.py +0 -0
  204. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/audio/__init__.py +0 -0
  205. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
  206. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/consumer_processor.py +0 -0
  207. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/dtmf_aggregator.py +0 -0
  208. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/__init__.py +0 -0
  209. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/frame_filter.py +0 -0
  210. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/function_filter.py +0 -0
  211. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/identity_filter.py +0 -0
  212. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/null_filter.py +0 -0
  213. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/stt_mute_filter.py +0 -0
  214. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
  215. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
  216. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/frame_processor.py +0 -0
  217. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/frameworks/__init__.py +0 -0
  218. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/frameworks/langchain.py +0 -0
  219. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/frameworks/rtvi.py +0 -0
  220. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/frameworks/strands_agents.py +0 -0
  221. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/gstreamer/__init__.py +0 -0
  222. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
  223. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/idle_frame_processor.py +0 -0
  224. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/logger.py +0 -0
  225. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/metrics/__init__.py +0 -0
  226. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
  227. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/metrics/sentry.py +0 -0
  228. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/producer_processor.py +0 -0
  229. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/text_transformer.py +0 -0
  230. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/transcript_processor.py +0 -0
  231. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/two_stage_user_idle_processor.py +0 -0
  232. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/processors/user_idle_processor.py +0 -0
  233. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/py.typed +0 -0
  234. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/__init__.py +0 -0
  235. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/daily.py +0 -0
  236. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/livekit.py +0 -0
  237. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/run.py +0 -0
  238. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/types.py +0 -0
  239. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/runner/utils.py +0 -0
  240. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/__init__.py +0 -0
  241. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/asterisk.py +0 -0
  242. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/base_serializer.py +0 -0
  243. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/convox.py +0 -0
  244. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/custom.py +0 -0
  245. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/exotel.py +0 -0
  246. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/livekit.py +0 -0
  247. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/plivo.py +0 -0
  248. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/protobuf.py +0 -0
  249. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/telnyx.py +0 -0
  250. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/serializers/twilio.py +0 -0
  251. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/__init__.py +0 -0
  252. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ai_service.py +0 -0
  253. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ai_services.py +0 -0
  254. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/anthropic/__init__.py +0 -0
  255. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/anthropic/llm.py +0 -0
  256. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/assemblyai/__init__.py +0 -0
  257. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/assemblyai/models.py +0 -0
  258. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/assemblyai/stt.py +0 -0
  259. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/asyncai/__init__.py +0 -0
  260. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/asyncai/tts.py +0 -0
  261. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/__init__.py +0 -0
  262. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/llm.py +0 -0
  263. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/nova_sonic/__init__.py +0 -0
  264. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/nova_sonic/context.py +0 -0
  265. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/nova_sonic/frames.py +0 -0
  266. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/nova_sonic/llm.py +0 -0
  267. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/nova_sonic/ready.wav +0 -0
  268. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/stt.py +0 -0
  269. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/tts.py +0 -0
  270. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws/utils.py +0 -0
  271. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
  272. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
  273. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
  274. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
  275. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/__init__.py +0 -0
  276. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/common.py +0 -0
  277. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/image.py +0 -0
  278. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/llm.py +0 -0
  279. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/realtime/__init__.py +0 -0
  280. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/realtime/llm.py +0 -0
  281. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/stt.py +0 -0
  282. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/azure/tts.py +0 -0
  283. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/cartesia/__init__.py +0 -0
  284. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/cartesia/stt.py +0 -0
  285. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/cartesia/tts.py +0 -0
  286. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/cerebras/__init__.py +0 -0
  287. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/cerebras/llm.py +0 -0
  288. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepgram/__init__.py +0 -0
  289. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepgram/flux/__init__.py +0 -0
  290. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepgram/flux/stt.py +0 -0
  291. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepgram/stt.py +0 -0
  292. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepgram/tts.py +0 -0
  293. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepseek/__init__.py +0 -0
  294. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/deepseek/llm.py +0 -0
  295. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/elevenlabs/__init__.py +0 -0
  296. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/elevenlabs/stt.py +0 -0
  297. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/elevenlabs/tts.py +0 -0
  298. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fal/__init__.py +0 -0
  299. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fal/image.py +0 -0
  300. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fal/stt.py +0 -0
  301. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fireworks/__init__.py +0 -0
  302. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fireworks/llm.py +0 -0
  303. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fish/__init__.py +0 -0
  304. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/fish/tts.py +0 -0
  305. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
  306. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
  307. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gemini_multimodal_live/file_api.py +0 -0
  308. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
  309. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gladia/__init__.py +0 -0
  310. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gladia/config.py +0 -0
  311. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/gladia/stt.py +0 -0
  312. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/__init__.py +0 -0
  313. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/frames.py +0 -0
  314. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/gemini_live/__init__.py +0 -0
  315. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/gemini_live/file_api.py +0 -0
  316. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/gemini_live/llm.py +0 -0
  317. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/gemini_live/llm_vertex.py +0 -0
  318. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/google.py +0 -0
  319. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/image.py +0 -0
  320. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/llm.py +0 -0
  321. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/llm_openai.py +0 -0
  322. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/llm_vertex.py +0 -0
  323. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/rtvi.py +0 -0
  324. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/stt.py +0 -0
  325. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/google/tts.py +0 -0
  326. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/grok/__init__.py +0 -0
  327. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/grok/llm.py +0 -0
  328. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/groq/__init__.py +0 -0
  329. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/groq/llm.py +0 -0
  330. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/groq/stt.py +0 -0
  331. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/groq/tts.py +0 -0
  332. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/hamsa/__init__.py +0 -0
  333. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/hamsa/stt.py +0 -0
  334. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/heygen/__init__.py +0 -0
  335. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/heygen/api.py +0 -0
  336. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/heygen/client.py +0 -0
  337. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/heygen/video.py +0 -0
  338. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/hume/__init__.py +0 -0
  339. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/hume/tts.py +0 -0
  340. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/image_service.py +0 -0
  341. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/inworld/__init__.py +0 -0
  342. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/inworld/tts.py +0 -0
  343. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/llm_service.py +0 -0
  344. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/lmnt/__init__.py +0 -0
  345. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/lmnt/tts.py +0 -0
  346. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/mcp_service.py +0 -0
  347. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/mem0/__init__.py +0 -0
  348. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/mem0/memory.py +0 -0
  349. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/minimax/__init__.py +0 -0
  350. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/minimax/tts.py +0 -0
  351. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/mistral/__init__.py +0 -0
  352. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/mistral/llm.py +0 -0
  353. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/moondream/__init__.py +0 -0
  354. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/moondream/vision.py +0 -0
  355. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/neuphonic/__init__.py +0 -0
  356. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/neuphonic/tts.py +0 -0
  357. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/nim/__init__.py +0 -0
  358. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/nim/llm.py +0 -0
  359. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ollama/__init__.py +0 -0
  360. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ollama/llm.py +0 -0
  361. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/__init__.py +0 -0
  362. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/base_llm.py +0 -0
  363. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/image.py +0 -0
  364. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/llm.py +0 -0
  365. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/realtime/__init__.py +0 -0
  366. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/realtime/context.py +0 -0
  367. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/realtime/events.py +0 -0
  368. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/realtime/frames.py +0 -0
  369. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/realtime/llm.py +0 -0
  370. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/stt.py +0 -0
  371. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai/tts.py +0 -0
  372. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime/__init__.py +0 -0
  373. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime/azure.py +0 -0
  374. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime/context.py +0 -0
  375. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime/events.py +0 -0
  376. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime/frames.py +0 -0
  377. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
  378. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
  379. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
  380. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
  381. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
  382. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
  383. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openpipe/__init__.py +0 -0
  384. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openpipe/llm.py +0 -0
  385. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openrouter/__init__.py +0 -0
  386. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/openrouter/llm.py +0 -0
  387. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/perplexity/__init__.py +0 -0
  388. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/perplexity/llm.py +0 -0
  389. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/piper/__init__.py +0 -0
  390. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/piper/tts.py +0 -0
  391. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/playht/__init__.py +0 -0
  392. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/playht/tts.py +0 -0
  393. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/qwen/__init__.py +0 -0
  394. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/qwen/llm.py +0 -0
  395. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/rime/__init__.py +0 -0
  396. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/rime/tts.py +0 -0
  397. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/riva/__init__.py +0 -0
  398. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/riva/stt.py +0 -0
  399. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/riva/tts.py +0 -0
  400. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/salesforce/__init__.py +0 -0
  401. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sambanova/__init__.py +0 -0
  402. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sambanova/llm.py +0 -0
  403. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sambanova/stt.py +0 -0
  404. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sarvam/__init__.py +0 -0
  405. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sarvam/stt.py +0 -0
  406. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/sarvam/tts.py +0 -0
  407. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/simli/__init__.py +0 -0
  408. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/simli/video.py +0 -0
  409. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/soniox/__init__.py +0 -0
  410. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/soniox/stt.py +0 -0
  411. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/speechmatics/__init__.py +0 -0
  412. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/speechmatics/stt.py +0 -0
  413. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/stt_service.py +0 -0
  414. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/tavus/__init__.py +0 -0
  415. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/tavus/video.py +0 -0
  416. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/together/__init__.py +0 -0
  417. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/together/llm.py +0 -0
  418. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/tts_service.py +0 -0
  419. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ultravox/__init__.py +0 -0
  420. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/ultravox/stt.py +0 -0
  421. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/vision_service.py +0 -0
  422. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/vistaar/__init__.py +0 -0
  423. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/vistaar/llm.py +0 -0
  424. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/websocket_service.py +0 -0
  425. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/whisper/__init__.py +0 -0
  426. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/whisper/base_stt.py +0 -0
  427. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/whisper/stt.py +0 -0
  428. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/xtts/__init__.py +0 -0
  429. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/services/xtts/tts.py +0 -0
  430. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/sync/__init__.py +0 -0
  431. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/sync/base_notifier.py +0 -0
  432. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/sync/event_notifier.py +0 -0
  433. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/tests/__init__.py +0 -0
  434. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/tests/utils.py +0 -0
  435. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transcriptions/__init__.py +0 -0
  436. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transcriptions/language.py +0 -0
  437. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/__init__.py +0 -0
  438. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/base_input.py +0 -0
  439. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/base_output.py +0 -0
  440. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/base_transport.py +0 -0
  441. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/daily/__init__.py +0 -0
  442. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/daily/transport.py +0 -0
  443. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/daily/utils.py +0 -0
  444. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/heygen/__init__.py +0 -0
  445. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/heygen/transport.py +0 -0
  446. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/livekit/__init__.py +0 -0
  447. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/livekit/transport.py +0 -0
  448. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/local/__init__.py +0 -0
  449. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/local/audio.py +0 -0
  450. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/local/tk.py +0 -0
  451. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/__init__.py +0 -0
  452. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
  453. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/small_webrtc.py +0 -0
  454. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/webrtc_connection.py +0 -0
  455. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/websocket_client.py +0 -0
  456. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/network/websocket_server.py +0 -0
  457. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/__init__.py +0 -0
  458. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/daily.py +0 -0
  459. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/helpers/__init__.py +0 -0
  460. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
  461. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/livekit.py +0 -0
  462. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/services/tavus.py +0 -0
  463. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
  464. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
  465. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/smallwebrtc/request_handler.py +0 -0
  466. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
  467. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/tavus/__init__.py +0 -0
  468. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/tavus/transport.py +0 -0
  469. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/websocket/__init__.py +0 -0
  470. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/websocket/client.py +0 -0
  471. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/websocket/fastapi.py +0 -0
  472. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/websocket/server.py +0 -0
  473. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/whatsapp/__init__.py +0 -0
  474. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/whatsapp/api.py +0 -0
  475. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/transports/whatsapp/client.py +0 -0
  476. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/__init__.py +0 -0
  477. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/asyncio/__init__.py +0 -0
  478. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/asyncio/task_manager.py +0 -0
  479. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/base_object.py +0 -0
  480. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/logger_config.py +0 -0
  481. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/network.py +0 -0
  482. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/string.py +0 -0
  483. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/__init__.py +0 -0
  484. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
  485. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/base_text_filter.py +0 -0
  486. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
  487. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
  488. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
  489. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
  490. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/time.py +0 -0
  491. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/__init__.py +0 -0
  492. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/class_decorators.py +0 -0
  493. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
  494. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/service_attributes.py +0 -0
  495. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/service_decorators.py +0 -0
  496. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/setup.py +0 -0
  497. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
  498. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
  499. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/src/pipecat/utils/utils.py +0 -0
  500. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/stop_container.yml +0 -0
  501. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/test_elevenlabs_stt_segmented.py +0 -0
  502. {dv_pipecat_ai-0.0.85.dev818 → dv_pipecat_ai-0.0.85.dev819}/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.dev818
3
+ Version: 0.0.85.dev819
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.dev818
3
+ Version: 0.0.85.dev819
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
@@ -477,6 +477,7 @@ src/pipecat/utils/__init__.py
477
477
  src/pipecat/utils/base_object.py
478
478
  src/pipecat/utils/logger_config.py
479
479
  src/pipecat/utils/network.py
480
+ src/pipecat/utils/redis.py
480
481
  src/pipecat/utils/string.py
481
482
  src/pipecat/utils/time.py
482
483
  src/pipecat/utils/utils.py
@@ -8,10 +8,9 @@
8
8
 
9
9
  import asyncio
10
10
  import json
11
- import os
12
11
  import time
13
- from typing import Any, Dict, List, Optional, AsyncGenerator
14
12
  from dataclasses import dataclass
13
+ from typing import AsyncGenerator, Dict, Optional
15
14
 
16
15
  import httpx
17
16
  from loguru import logger
@@ -40,6 +39,7 @@ from pipecat.processors.aggregators.llm_response import (
40
39
  LLMUserAggregatorParams,
41
40
  )
42
41
  from env_config import api_config
42
+ from pipecat.utils.redis import create_async_redis_client
43
43
 
44
44
 
45
45
  @dataclass
@@ -56,8 +56,8 @@ class SalesforceAgentLLMService(LLMService):
56
56
  """Salesforce Agent API LLM service implementation.
57
57
 
58
58
  This service integrates with Salesforce Agent API to provide conversational
59
- AI capabilities using Salesforce's Agentforce platform. It follows the same
60
- pattern as Vistaar LLM service for proper frame processing.
59
+
60
+ AI capabilities using Salesforce's Agentforce platform.
61
61
  """
62
62
 
63
63
  def __init__(
@@ -65,38 +65,48 @@ class SalesforceAgentLLMService(LLMService):
65
65
  *,
66
66
  model: str = "salesforce-agent",
67
67
  session_timeout_secs: float = 3600.0,
68
+ agent_id: str = api_config.SALESFORCE_AGENT_ID,
69
+ org_domain: str = api_config.SALESFORCE_ORG_DOMAIN,
70
+ client_id: str = api_config.SALESFORCE_CLIENT_ID,
71
+ client_secret: str = api_config.SALESFORCE_CLIENT_SECRET,
72
+ api_host: str = api_config.SALESFORCE_API_HOST,
73
+ redis_url: Optional[str] = None,
68
74
  **kwargs,
69
75
  ):
70
76
  """Initialize Salesforce Agent LLM service.
71
77
 
72
78
  Reads configuration from environment variables:
73
79
  - SALESFORCE_AGENT_ID: The Salesforce agent ID to interact with
74
- - SALESFORCE_API_KEY: OAuth access token (optional, will use client credentials if not provided)
75
80
  - SALESFORCE_ORG_DOMAIN: Salesforce org domain (e.g., https://myorg.my.salesforce.com)
76
81
  - SALESFORCE_CLIENT_ID: Connected app client ID for OAuth
77
82
  - SALESFORCE_CLIENT_SECRET: Connected app client secret for OAuth
78
- - SALESFORCE_API_HOST: Salesforce API host (default: https://api.salesforce.com)
83
+ - SALESFORCE_API_HOST: Salesforce API host base URL (e.g., https://api.salesforce.com)
79
84
 
80
85
  Args:
81
86
  model: The model name (defaults to "salesforce-agent").
82
87
  session_timeout_secs: Session timeout in seconds (default: 1 hour).
88
+ agent_id: Salesforce agent ID. Defaults to SALESFORCE_AGENT_ID.
89
+ org_domain: Salesforce org domain. Defaults to SALESFORCE_ORG_DOMAIN.
90
+ client_id: Salesforce connected app client ID. Defaults to SALESFORCE_CLIENT_ID.
91
+ client_secret: Salesforce connected app client secret. Defaults to SALESFORCE_CLIENT_SECRET.
92
+ api_host: Salesforce API host base URL. Defaults to SALESFORCE_API_HOST.
93
+ redis_url: Optional Redis URL override for token caching.
83
94
  **kwargs: Additional arguments passed to parent LLMService.
84
95
  """
85
96
  # Initialize parent LLM service
86
97
  super().__init__(**kwargs)
87
-
88
- self._agent_id = api_config.SALESFORCE_AGENT_ID
89
- self._api_key = api_config.SALESFORCE_API_KEY
90
- self._org_domain = api_config.SALESFORCE_ORG_DOMAIN
91
- self._client_id = api_config.SALESFORCE_CLIENT_ID
92
- self._client_secret = api_config.SALESFORCE_CLIENT_SECRET
93
- self._api_host = api_config.SALESFORCE_API_HOST
98
+ self._agent_id = agent_id
99
+ self._org_domain = org_domain
100
+ self._client_id = client_id
101
+ self._client_secret = client_secret
102
+ self._api_host = api_host
94
103
 
95
104
 
96
105
  # Validate required environment variables
97
106
  required_vars = {
98
107
  "SALESFORCE_AGENT_ID": self._agent_id,
99
108
  "SALESFORCE_ORG_DOMAIN": self._org_domain,
109
+ "SALESFORCE_API_HOST": self._api_host,
100
110
  "SALESFORCE_CLIENT_ID": self._client_id,
101
111
  "SALESFORCE_CLIENT_SECRET": self._client_secret,
102
112
  }
@@ -109,31 +119,140 @@ class SalesforceAgentLLMService(LLMService):
109
119
 
110
120
  self._session_timeout_secs = session_timeout_secs
111
121
 
122
+ if redis_url is not None:
123
+ self._redis_url = redis_url
124
+ else:
125
+ self._redis_url = getattr(api_config, "REDIS_URL", None)
126
+ self._redis_client = None
127
+ self._redis_client_init_attempted = False
128
+ self._token_cache_key = f"salesforce_agent_access_token:{self._agent_id}"
129
+ self._token_cache_leeway_secs = 300
130
+ self._sequence_counter = 0
131
+ self._warmup_task: Optional[asyncio.Task] = None
132
+
112
133
  # Session management
113
134
  self._sessions: Dict[str, SalesforceSessionInfo] = {}
114
135
  self._current_session_id: Optional[str] = None
115
136
 
116
137
  # HTTP client for API calls
117
- self._http_client = httpx.AsyncClient(timeout=30.0)
138
+ self._http_client = httpx.AsyncClient(
139
+ timeout=30.0,
140
+ limits=httpx.Limits(
141
+ max_keepalive_connections=10,
142
+ max_connections=100,
143
+ keepalive_expiry=None,
144
+ ),
145
+ )
146
+
147
+ self._schedule_session_warmup()
118
148
 
119
149
 
120
150
  async def __aenter__(self):
121
151
  """Async context manager entry."""
152
+ await self.ensure_session_ready()
122
153
  return self
123
154
 
124
155
  async def __aexit__(self, exc_type, exc_val, exc_tb):
125
156
  """Async context manager exit."""
157
+ if self._warmup_task:
158
+ try:
159
+ await asyncio.shield(self._warmup_task)
160
+ except Exception as exc: # pragma: no cover - warmup best effort
161
+ logger.debug(f"Salesforce warmup task failed during exit: {exc}")
162
+ finally:
163
+ self._warmup_task = None
164
+
126
165
  await self._cleanup_sessions()
127
166
  await self._http_client.aclose()
128
167
 
168
+ if self._redis_client:
169
+ close_coro = getattr(self._redis_client, "close", None)
170
+ if callable(close_coro):
171
+ try:
172
+ await close_coro()
173
+ except Exception as exc: # pragma: no cover - best effort cleanup
174
+ logger.debug(f"Failed to close Redis client cleanly: {exc}")
175
+ self._redis_client = None
176
+ self._redis_client_init_attempted = False
177
+
129
178
  def can_generate_metrics(self) -> bool:
130
179
  """Check if this service can generate processing metrics."""
131
180
  return True
132
181
 
182
+ def _schedule_session_warmup(self):
183
+ """Kick off background warm-up if an event loop is running."""
184
+ try:
185
+ loop = asyncio.get_running_loop()
186
+ except RuntimeError:
187
+ return
188
+
189
+ if loop.is_closed():
190
+ return
191
+
192
+ async def _warmup():
193
+ try:
194
+ await self.ensure_session_ready()
195
+ except Exception as exc: # pragma: no cover - warmup best effort
196
+ logger.warning(f"Salesforce warmup failed: {exc}")
197
+ raise
198
+
199
+ task = loop.create_task(_warmup())
200
+
201
+ def _on_done(warmup_task: asyncio.Task):
202
+ if warmup_task.cancelled():
203
+ logger.debug("Salesforce warmup task cancelled")
204
+ elif warmup_task.exception():
205
+ logger.warning(f"Salesforce warmup task error: {warmup_task.exception()}")
206
+ self._warmup_task = None
207
+
208
+ task.add_done_callback(_on_done)
209
+ self._warmup_task = task
210
+
211
+ def _get_redis_client(self):
212
+ """Return a Redis client for token caching if configured."""
213
+ if self._redis_client is None and not self._redis_client_init_attempted:
214
+ self._redis_client_init_attempted = True
215
+ self._redis_client = create_async_redis_client(
216
+ self._redis_url, decode_responses=True, encoding="utf-8", logger=logger
217
+ )
218
+
219
+ return self._redis_client
220
+
221
+ async def _get_cached_access_token(self) -> Optional[str]:
222
+ """Return cached access token from Redis."""
223
+ redis_client = self._get_redis_client()
224
+ if not redis_client:
225
+ return None
226
+
227
+ try:
228
+ return await redis_client.get(self._token_cache_key)
229
+ except Exception as exc: # pragma: no cover - cache failures shouldn't break flow
230
+ logger.warning(f"Failed to read Salesforce token from Redis: {exc}")
231
+ return None
232
+
233
+ async def _set_cached_access_token(self, token: str, expires_in: Optional[int]):
234
+ """Persist access token in Redis with TTL matching Salesforce expiry."""
235
+ redis_client = self._get_redis_client()
236
+ if not redis_client:
237
+ return
238
+
239
+ ttl_seconds = 3600
240
+ if expires_in is not None:
241
+ try:
242
+ ttl_seconds = max(int(expires_in) - self._token_cache_leeway_secs, 30)
243
+ except (TypeError, ValueError):
244
+ logger.debug("Unable to parse Salesforce token expiry; falling back to default TTL")
245
+
246
+ try:
247
+ await redis_client.set(self._token_cache_key, token, ex=ttl_seconds)
248
+ except Exception as exc: # pragma: no cover - cache failures shouldn't break flow
249
+ logger.warning(f"Failed to store Salesforce token in Redis: {exc}")
250
+
133
251
  async def _get_access_token(self) -> str:
134
252
  """Get OAuth access token using client credentials."""
135
- if self._api_key and not self._api_key.startswith("Bearer"):
136
- return self._api_key
253
+ cached_token = await self._get_cached_access_token()
254
+ if cached_token:
255
+ return cached_token
137
256
 
138
257
  token_url = f"{self._org_domain}/services/oauth2/token"
139
258
  data = {
@@ -146,7 +265,9 @@ class SalesforceAgentLLMService(LLMService):
146
265
  response = await self._http_client.post(token_url, data=data)
147
266
  response.raise_for_status()
148
267
  token_data = response.json()
149
- return token_data["access_token"]
268
+ access_token = token_data["access_token"]
269
+ await self._set_cached_access_token(access_token, token_data.get("expires_in"))
270
+ return access_token
150
271
  except Exception as e:
151
272
  logger.error(f"Failed to get access token: {e}")
152
273
  raise
@@ -207,13 +328,17 @@ class SalesforceAgentLLMService(LLMService):
207
328
  return self._current_session_id
208
329
  else:
209
330
  # Session expired, remove it
210
- del self._sessions[self._current_session_id]
331
+ self._sessions.pop(self._current_session_id, None)
211
332
  self._current_session_id = None
212
333
 
213
334
  # Create new session
214
335
  self._current_session_id = await self._create_session()
215
336
  return self._current_session_id
216
337
 
338
+ async def ensure_session_ready(self) -> str:
339
+ """Ensure a Salesforce session is ready for use."""
340
+ return await self._get_or_create_session()
341
+
217
342
  async def _cleanup_sessions(self):
218
343
  """Clean up expired sessions."""
219
344
  current_time = time.time()
@@ -236,7 +361,7 @@ class SalesforceAgentLLMService(LLMService):
236
361
  except Exception as e:
237
362
  logger.warning(f"Failed to end session {session_id}: {e}")
238
363
  finally:
239
- del self._sessions[session_id]
364
+ self._sessions.pop(session_id, None)
240
365
  if self._current_session_id == session_id:
241
366
  self._current_session_id = None
242
367
 
@@ -272,7 +397,8 @@ class SalesforceAgentLLMService(LLMService):
272
397
 
273
398
  def _generate_sequence_id(self) -> int:
274
399
  """Generate a sequence ID for the message."""
275
- return int(time.time() * 1000) % 2147483647 # Keep within int32 range
400
+ self._sequence_counter += 1
401
+ return self._sequence_counter
276
402
 
277
403
  async def _stream_salesforce_response(self, session_id: str, user_message: str) -> AsyncGenerator[str, None]:
278
404
  """Stream response from Salesforce Agent API."""
@@ -337,8 +463,6 @@ class SalesforceAgentLLMService(LLMService):
337
463
 
338
464
  async def _process_context(self, context: OpenAILLMContext):
339
465
  """Process the LLM context and generate streaming response.
340
-
341
- Following Vistaar pattern for simple, direct processing.
342
466
 
343
467
  Args:
344
468
  context: The OpenAI LLM context containing messages to process.
@@ -387,8 +511,6 @@ class SalesforceAgentLLMService(LLMService):
387
511
 
388
512
  async def process_frame(self, frame: Frame, direction: FrameDirection):
389
513
  """Process frames for LLM completion requests.
390
-
391
- Following the exact Vistaar pattern - call super() for non-context frames only.
392
514
 
393
515
  Args:
394
516
  frame: The frame to process.
@@ -431,7 +553,7 @@ class SalesforceAgentLLMService(LLMService):
431
553
  """Create context aggregators for Salesforce LLM.
432
554
 
433
555
  Since Salesforce uses OpenAI-compatible message format, we reuse OpenAI's
434
- context aggregators directly, similar to how Vistaar works.
556
+ context aggregators directly
435
557
 
436
558
  Args:
437
559
  context: The LLM context to create aggregators for.
@@ -462,4 +584,4 @@ class SalesforceAgentLLMService(LLMService):
462
584
  try:
463
585
  asyncio.create_task(self._http_client.aclose())
464
586
  except:
465
- pass
587
+ pass
@@ -0,0 +1,58 @@
1
+ """Async Redis helper utilities."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, Optional, TYPE_CHECKING
6
+
7
+ from urllib.parse import urlparse
8
+
9
+ try:
10
+ import redis.asyncio as redis
11
+ except ImportError: # pragma: no cover - Redis is optional
12
+ redis = None
13
+
14
+
15
+ if TYPE_CHECKING: # pragma: no cover - typing aid
16
+ from redis.asyncio import Redis
17
+
18
+
19
+ def create_async_redis_client(
20
+ url: Optional[str],
21
+ *,
22
+ decode_responses: bool = True,
23
+ encoding: str = "utf-8",
24
+ logger: Optional[Any] = None,
25
+ **kwargs,
26
+ ) -> Optional["Redis"]:
27
+ """Return a configured async Redis client or None if unavailable.
28
+
29
+ Args:
30
+ url: Redis connection URL.
31
+ decode_responses: Whether to decode responses to str.
32
+ encoding: Character encoding to use with decoded responses.
33
+ logger: Optional logger supporting .warning() for diagnostics.
34
+ **kwargs: Additional keyword arguments forwarded to Redis.from_url.
35
+ """
36
+ if redis is None:
37
+ return None
38
+
39
+ if not url or url in {"redis_url", "REDIS_URL"}:
40
+ return None
41
+
42
+ parsed = urlparse(url)
43
+ connection_kwargs = {
44
+ "decode_responses": decode_responses,
45
+ "encoding": encoding,
46
+ }
47
+ connection_kwargs.update(kwargs)
48
+
49
+ if parsed.scheme == "rediss":
50
+ connection_kwargs.setdefault("ssl_cert_reqs", "none")
51
+ connection_kwargs.setdefault("ssl_check_hostname", False)
52
+
53
+ try:
54
+ return redis.Redis.from_url(url, **connection_kwargs)
55
+ except Exception as exc: # pragma: no cover - best effort logging
56
+ if logger is not None:
57
+ logger.warning(f"Failed to create Redis client: {exc}")
58
+ return None