dv-pipecat-ai 0.0.93.dev2__tar.gz → 0.0.93.dev3__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.
- {dv_pipecat_ai-0.0.93.dev2/src/dv_pipecat_ai.egg-info → dv_pipecat_ai-0.0.93.dev3}/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3/src/dv_pipecat_ai.egg-info}/PKG-INFO +1 -1
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/dv_pipecat_ai.egg-info/SOURCES.txt +3 -0
- dv_pipecat_ai-0.0.93.dev3/src/pipecat/adapters/services/open_ai_responses_adapter.py +242 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/llm_response_universal.py +104 -7
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/__init__.py +1 -0
- dv_pipecat_ai-0.0.93.dev3/src/pipecat/services/openai/responses/llm.py +572 -0
- dv_pipecat_ai-0.0.93.dev3/src/pipecat/services/speechmatics/__init__.py +5 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/service_decorators.py +8 -2
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.dockerignore +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/1-bug_report.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/2-question.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/3-feature_request.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/4-service-issue.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/5-new-service.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/6-dependency.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/7-troubleshooting.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/build.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/coverage.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/force_push_to_pypi.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/format.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/github.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/promote-prod.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/publish.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/publish_test.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/python-compatibility.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/set-traffic-split.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/sync-quickstart.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.github/workflows/tests.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.gitignore +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/.readthedocs.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/CHANGELOG.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/CHANGELOG.md.template +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/CLAUDE.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/COMMUNITY_INTEGRATIONS.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/CONTRIBUTING.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/DOCKER_BUILD_OPTIMIZATION_SUMMARY.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/LICENSE +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/MANIFEST.in +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/README.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/SECURITY.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/UPSTREAM_SYNC.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/ansible_deployment.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/cleanup_old_containers.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/codecov.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create-new-machine/ansible.cfg +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create-new-machine/ansible_setup.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create-new-machine/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create-new-machine/replace_env.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create-new-machine/setup_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/create_inventory.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/delete_old_dockers.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/deploy.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/deploy_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/docker-compose.dev.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/dump_logs.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/env.example +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/fetch_logs.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/inventory.ini +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/.helmignore +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/Chart.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/_helpers.tpl +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/backendconfig.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/cluster-role.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/deployment.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/hpa.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/ingress.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/keda-api-key-secret.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/keda-scaledobject.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/keda-trigger-auth.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/pdb.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/templates/service.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/values-canary.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/values-prod.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/values-stage.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/dv-pipecat/values.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/k8s/istio/destination-virtualservice.yaml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/merge-code-into-single-file.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/pipecat.png +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/pyproject.toml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/restart.sh +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/restart_playbook.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/setup.cfg +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/dv_pipecat_ai.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/dv_pipecat_ai.egg-info/requires.txt +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/dv_pipecat_ai.egg-info/top_level.txt +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/base_llm_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/schemas/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/schemas/direct_function.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/schemas/function_schema.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/schemas/tools_schema.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/anthropic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/aws_nova_sonic_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/bedrock_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/gemini_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/open_ai_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/adapters/services/open_ai_realtime_adapter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-0.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-1.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-2.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-3.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-4.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-5.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-6.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-7.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-8.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-9.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-pound.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/dtmf-star.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/types.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/dtmf/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/aic_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/base_audio_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/koala_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/krisp_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/krisp_viva_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/noisereduce_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/filters/pyrnn_local_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/interruptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/interruptions/base_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/interruptions/min_words_interruption_strategy.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/mixers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/mixers/base_audio_mixer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/mixers/soundfile_mixer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/resamplers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/resamplers/base_audio_resampler.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/resamplers/resampy_resampler.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/resamplers/soxr_resampler.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/resamplers/soxr_stream_resampler.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/base_turn_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/base_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/data/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/data/smart-turn-v3.0.onnx +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/fal_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/http_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/local_coreml_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/local_smart_turn.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v2.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/turn/smart_turn/local_smart_turn_v3.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/data/README.md +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/data/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/data/silero_vad.onnx +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/data/silero_vad_v2.onnx +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/silero.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/audio/vad/vad_analyzer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/clocks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/clocks/base_clock.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/clocks/system_clock.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/extensions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/extensions/ivr/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/extensions/ivr/ivr_navigator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/extensions/voicemail/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/extensions/voicemail/voicemail_detector.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/frames/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/frames/frames.proto +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/frames/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/frames/protobufs/frames_pb2.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/metrics/connection_metrics.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/metrics/metrics.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/base_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/loggers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/loggers/debug_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/loggers/llm_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/loggers/transcription_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/loggers/user_bot_latency_log_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/observers/turn_tracking_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/base_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/base_task.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/llm_switcher.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/pipeline.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/runner.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/service_switcher.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/sync_parallel_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/task.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/task_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/to_be_updated/merge_pipeline.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/pipeline/tts_switcher.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/dtmf_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/gated.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/gated_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/gated_open_ai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/llm_context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/llm_response.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/openai_llm_context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/sentence.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/user_response.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/aggregators/vision_image_frame.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/async_generator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/audio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/audio/audio_buffer_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/consumer_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/dtmf_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/frame_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/function_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/identity_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/null_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/stt_mute_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/wake_check_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/filters/wake_notifier_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/frameworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/frameworks/langchain.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/frameworks/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/frameworks/strands_agents.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/gstreamer/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/gstreamer/pipeline_source.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/idle_frame_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/logger.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/metrics/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/metrics/frame_processor_metrics.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/metrics/sentry.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/producer_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/text_transformer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/transcript_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/two_stage_user_idle_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/processors/user_idle_processor.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/py.typed +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/daily.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/livekit.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/run.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/types.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/runner/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/asterisk.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/asterisk_chan_websocket_original.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/base_serializer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/convox.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/custom.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/exotel.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/livekit.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/plivo.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/protobuf.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/tatatele.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/telnyx.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/twilio.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/serializers/vi.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ai_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ai_services.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/anthropic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/anthropic/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/assemblyai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/assemblyai/models.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/assemblyai/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/asyncai/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/asyncai/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/nova_sonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/nova_sonic/context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/nova_sonic/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/nova_sonic/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/nova_sonic/ready.wav +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws_nova_sonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws_nova_sonic/aws.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws_nova_sonic/context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/aws_nova_sonic/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/common.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/image.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/realtime/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/azure/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/cartesia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/cartesia/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/cartesia/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/cerebras/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/cerebras/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepgram/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepgram/flux/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepgram/flux/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepgram/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepgram/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepseek/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/deepseek/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/elevenlabs/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/elevenlabs/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/elevenlabs/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fal/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fal/image.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fal/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fireworks/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fireworks/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fish/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/fish/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gemini_multimodal_live/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gemini_multimodal_live/events.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gemini_multimodal_live/file_api.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gemini_multimodal_live/gemini.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gladia/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gladia/config.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/gladia/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/gemini_live/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/gemini_live/file_api.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/gemini_live/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/gemini_live/llm_vertex.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/google.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/image.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/llm_openai.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/llm_vertex.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/rtvi.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/google/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/grok/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/grok/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/groq/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/groq/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/groq/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/groq/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/hamsa/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/hamsa/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/heygen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/heygen/api.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/heygen/client.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/heygen/video.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/hume/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/hume/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/image_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/inworld/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/inworld/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/llm_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/lmnt/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/lmnt/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/mcp_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/mem0/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/mem0/memory.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/minimax/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/minimax/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/mistral/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/mistral/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/moondream/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/moondream/vision.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/neuphonic/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/neuphonic/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/nim/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/nim/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ollama/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ollama/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/base_llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/image.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/realtime/context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/realtime/events.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/realtime/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/realtime/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2/src/pipecat/services/speechmatics → dv_pipecat_ai-0.0.93.dev3/src/pipecat/services/openai/responses}/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime/azure.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime/context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime/events.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/azure.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/context.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/events.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/frames.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openai_realtime_beta/openai.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openpipe/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openpipe/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openrouter/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/openrouter/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/perplexity/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/perplexity/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/piper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/piper/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/playht/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/playht/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/qwen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/qwen/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/rime/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/rime/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ringg/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ringg/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/riva/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/riva/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/riva/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/salesforce/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/salesforce/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sambanova/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sambanova/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sambanova/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sarvam/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sarvam/_sdk.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sarvam/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/sarvam/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/simli/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/simli/video.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/soniox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/soniox/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/speechmatics/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/stt_latency.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/stt_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/tavus/video.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/together/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/together/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/tts_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ultravox/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/ultravox/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/vision_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/vistaar/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/vistaar/llm.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/websocket_service.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/whisper/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/whisper/base_stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/whisper/stt.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/xtts/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/services/xtts/tts.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/sync/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/sync/base_notifier.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/sync/event_notifier.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/tests/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/tests/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transcriptions/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transcriptions/language.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/base_input.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/base_output.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/base_transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/daily/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/daily/transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/daily/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/heygen/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/heygen/transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/livekit/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/livekit/transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/local/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/local/audio.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/local/tk.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/fastapi_websocket.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/small_webrtc.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/webrtc_connection.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/websocket_client.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/network/websocket_server.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/daily.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/helpers/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/helpers/daily_rest.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/livekit.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/services/tavus.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/smallwebrtc/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/smallwebrtc/connection.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/smallwebrtc/request_handler.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/smallwebrtc/transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/tavus/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/tavus/transport.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/websocket/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/websocket/client.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/websocket/fastapi.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/websocket/server.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/whatsapp/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/whatsapp/api.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/transports/whatsapp/client.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/asyncio/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/asyncio/task_manager.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/base_object.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/logger_config.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/network.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/redis.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/string.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/base_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/base_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/markdown_text_filter.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/pattern_pair_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/simple_text_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/text/skip_tags_aggregator.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/time.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/__init__.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/class_decorators.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/conversation_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/service_attributes.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/setup.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/turn_context_provider.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/tracing/turn_trace_observer.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/pipecat/utils/utils.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/stop_container.yml +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/test_elevenlabs_stt_segmented.py +0 -0
- {dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/uv.lock +0 -0
{dv_pipecat_ai-0.0.93.dev2 → dv_pipecat_ai-0.0.93.dev3}/src/dv_pipecat_ai.egg-info/SOURCES.txt
RENAMED
|
@@ -98,6 +98,7 @@ src/pipecat/adapters/services/bedrock_adapter.py
|
|
|
98
98
|
src/pipecat/adapters/services/gemini_adapter.py
|
|
99
99
|
src/pipecat/adapters/services/open_ai_adapter.py
|
|
100
100
|
src/pipecat/adapters/services/open_ai_realtime_adapter.py
|
|
101
|
+
src/pipecat/adapters/services/open_ai_responses_adapter.py
|
|
101
102
|
src/pipecat/audio/__init__.py
|
|
102
103
|
src/pipecat/audio/utils.py
|
|
103
104
|
src/pipecat/audio/dtmf/__init__.py
|
|
@@ -378,6 +379,8 @@ src/pipecat/services/openai/realtime/context.py
|
|
|
378
379
|
src/pipecat/services/openai/realtime/events.py
|
|
379
380
|
src/pipecat/services/openai/realtime/frames.py
|
|
380
381
|
src/pipecat/services/openai/realtime/llm.py
|
|
382
|
+
src/pipecat/services/openai/responses/__init__.py
|
|
383
|
+
src/pipecat/services/openai/responses/llm.py
|
|
381
384
|
src/pipecat/services/openai_realtime/__init__.py
|
|
382
385
|
src/pipecat/services/openai_realtime/azure.py
|
|
383
386
|
src/pipecat/services/openai_realtime/context.py
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2024–2025, Daily
|
|
3
|
+
#
|
|
4
|
+
# SPDX-License-Identifier: BSD 2-Clause License
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
"""OpenAI Responses API adapter for Pipecat."""
|
|
8
|
+
|
|
9
|
+
import copy
|
|
10
|
+
from typing import Any, Dict, List, Optional, TypedDict
|
|
11
|
+
|
|
12
|
+
from loguru import logger
|
|
13
|
+
from openai._types import NotGiven as OpenAINotGiven
|
|
14
|
+
from openai.types.responses import FunctionToolParam, ResponseInputItemParam
|
|
15
|
+
|
|
16
|
+
from pipecat.adapters.base_llm_adapter import BaseLLMAdapter
|
|
17
|
+
from pipecat.adapters.schemas.tools_schema import ToolsSchema
|
|
18
|
+
from pipecat.processors.aggregators.llm_context import (
|
|
19
|
+
LLMContext,
|
|
20
|
+
LLMContextMessage,
|
|
21
|
+
LLMSpecificMessage,
|
|
22
|
+
NotGiven,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class OpenAIResponsesLLMInvocationParams(TypedDict, total=False):
|
|
27
|
+
"""Context-based parameters for invoking OpenAI Responses API."""
|
|
28
|
+
|
|
29
|
+
input: List[ResponseInputItemParam]
|
|
30
|
+
tools: List[FunctionToolParam] | OpenAINotGiven
|
|
31
|
+
tool_choice: str | dict | OpenAINotGiven
|
|
32
|
+
instructions: str
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class OpenAIResponsesLLMAdapter(BaseLLMAdapter[OpenAIResponsesLLMInvocationParams]):
|
|
36
|
+
"""OpenAI Responses API adapter for Pipecat.
|
|
37
|
+
|
|
38
|
+
Handles:
|
|
39
|
+
|
|
40
|
+
- Converting LLMContext messages to Responses API input items
|
|
41
|
+
- Converting Pipecat's standardized tools schema to Responses API function tool format
|
|
42
|
+
- Extracting and sanitizing messages from the LLM context for logging
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
"""Initialize the adapter."""
|
|
47
|
+
super().__init__()
|
|
48
|
+
self._warned_system_instruction = False
|
|
49
|
+
|
|
50
|
+
@property
|
|
51
|
+
def id_for_llm_specific_messages(self) -> str:
|
|
52
|
+
"""Get the identifier used in LLMSpecificMessage instances."""
|
|
53
|
+
return "openai_responses"
|
|
54
|
+
|
|
55
|
+
def get_llm_invocation_params(
|
|
56
|
+
self,
|
|
57
|
+
context: LLMContext,
|
|
58
|
+
*,
|
|
59
|
+
system_instruction: Optional[str] = None,
|
|
60
|
+
) -> OpenAIResponsesLLMInvocationParams:
|
|
61
|
+
"""Get Responses API invocation parameters from a universal LLM context.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
context: The LLM context containing messages, tools, etc.
|
|
65
|
+
system_instruction: Optional system instruction from service settings.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Dictionary of parameters for the Responses API.
|
|
69
|
+
"""
|
|
70
|
+
messages = self.get_messages(context)
|
|
71
|
+
input_items = self._convert_messages_to_input(messages)
|
|
72
|
+
|
|
73
|
+
params: OpenAIResponsesLLMInvocationParams = {
|
|
74
|
+
"input": input_items,
|
|
75
|
+
"tools": self.from_standard_tools(context.tools),
|
|
76
|
+
"tool_choice": context.tool_choice,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if system_instruction:
|
|
80
|
+
# Compatibility: The Responses API requires at least one input
|
|
81
|
+
# message when instructions are provided. Contexts that worked with
|
|
82
|
+
# OpenAILLMService (system_instruction + empty messages) need the
|
|
83
|
+
# instructions converted to an initial developer message.
|
|
84
|
+
if not input_items:
|
|
85
|
+
params["input"] = [{"role": "developer", "content": system_instruction}]
|
|
86
|
+
else:
|
|
87
|
+
params["instructions"] = system_instruction
|
|
88
|
+
|
|
89
|
+
return params
|
|
90
|
+
|
|
91
|
+
def to_provider_tools_format(self, tools_schema: ToolsSchema) -> List[FunctionToolParam]:
|
|
92
|
+
"""Convert function schemas to Responses API function tool format.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
tools_schema: The Pipecat tools schema to convert.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
List of Responses API function tool definitions.
|
|
99
|
+
"""
|
|
100
|
+
functions_schema = tools_schema.standard_tools
|
|
101
|
+
result = []
|
|
102
|
+
for func in functions_schema:
|
|
103
|
+
d = func.to_default_dict()
|
|
104
|
+
tool: FunctionToolParam = {
|
|
105
|
+
"type": "function",
|
|
106
|
+
"name": d["name"],
|
|
107
|
+
"parameters": d.get("parameters", {}),
|
|
108
|
+
"strict": d.get("strict", None),
|
|
109
|
+
}
|
|
110
|
+
if "description" in d:
|
|
111
|
+
tool["description"] = d["description"]
|
|
112
|
+
result.append(tool)
|
|
113
|
+
return result
|
|
114
|
+
|
|
115
|
+
def get_messages_for_logging(self, context: LLMContext) -> List[Dict[str, Any]]:
|
|
116
|
+
"""Get messages from context in a format ready for logging.
|
|
117
|
+
|
|
118
|
+
Removes or truncates sensitive data like image content for safe logging.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
context: The LLM context containing messages.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
List of messages in a format ready for logging.
|
|
125
|
+
"""
|
|
126
|
+
msgs = []
|
|
127
|
+
for message in self.get_messages(context):
|
|
128
|
+
msg = copy.deepcopy(message)
|
|
129
|
+
if "content" in msg:
|
|
130
|
+
if isinstance(msg["content"], list):
|
|
131
|
+
for item in msg["content"]:
|
|
132
|
+
if item.get("type") == "image_url":
|
|
133
|
+
if item["image_url"]["url"].startswith("data:image/"):
|
|
134
|
+
item["image_url"]["url"] = "data:image/..."
|
|
135
|
+
if item.get("type") == "input_audio":
|
|
136
|
+
item["input_audio"]["data"] = "..."
|
|
137
|
+
msgs.append(msg)
|
|
138
|
+
return msgs
|
|
139
|
+
|
|
140
|
+
def _convert_messages_to_input(
|
|
141
|
+
self, messages: List[LLMContextMessage]
|
|
142
|
+
) -> List[ResponseInputItemParam]:
|
|
143
|
+
"""Convert LLMContext messages to Responses API input items.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
messages: Messages from the LLMContext.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
List of Responses API input items.
|
|
150
|
+
"""
|
|
151
|
+
result: List[ResponseInputItemParam] = []
|
|
152
|
+
is_first = True
|
|
153
|
+
|
|
154
|
+
for message in messages:
|
|
155
|
+
if isinstance(message, LLMSpecificMessage):
|
|
156
|
+
result.append(message.message)
|
|
157
|
+
is_first = False
|
|
158
|
+
continue
|
|
159
|
+
|
|
160
|
+
role = message.get("role")
|
|
161
|
+
|
|
162
|
+
if role == "system":
|
|
163
|
+
if is_first and not self._warned_system_instruction:
|
|
164
|
+
logger.warning(
|
|
165
|
+
"System messages in LLMContext are converted to 'developer' role for the "
|
|
166
|
+
"Responses API. Consider using system_instruction instead, which "
|
|
167
|
+
"maps to the 'instructions' parameter."
|
|
168
|
+
)
|
|
169
|
+
self._warned_system_instruction = True
|
|
170
|
+
content = message.get("content", "")
|
|
171
|
+
if isinstance(content, list):
|
|
172
|
+
content = self._convert_multimodal_content(content)
|
|
173
|
+
result.append({"role": "developer", "content": content})
|
|
174
|
+
|
|
175
|
+
elif role == "user":
|
|
176
|
+
content = message.get("content", "")
|
|
177
|
+
if isinstance(content, list):
|
|
178
|
+
content = self._convert_multimodal_content(content)
|
|
179
|
+
result.append({"role": "user", "content": content})
|
|
180
|
+
|
|
181
|
+
elif role == "assistant":
|
|
182
|
+
tool_calls = message.get("tool_calls")
|
|
183
|
+
if tool_calls:
|
|
184
|
+
for tc in tool_calls:
|
|
185
|
+
func = tc.get("function", {})
|
|
186
|
+
result.append(
|
|
187
|
+
{
|
|
188
|
+
"type": "function_call",
|
|
189
|
+
"call_id": tc.get("id", ""),
|
|
190
|
+
"name": func.get("name", ""),
|
|
191
|
+
"arguments": func.get("arguments", ""),
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
else:
|
|
195
|
+
content = message.get("content", "")
|
|
196
|
+
if isinstance(content, list):
|
|
197
|
+
content = self._convert_multimodal_content(content)
|
|
198
|
+
result.append({"role": "assistant", "content": content})
|
|
199
|
+
|
|
200
|
+
elif role == "tool":
|
|
201
|
+
content = message.get("content", "")
|
|
202
|
+
if not isinstance(content, str):
|
|
203
|
+
content = str(content)
|
|
204
|
+
result.append(
|
|
205
|
+
{
|
|
206
|
+
"type": "function_call_output",
|
|
207
|
+
"call_id": message.get("tool_call_id", ""),
|
|
208
|
+
"output": content,
|
|
209
|
+
}
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
is_first = False
|
|
213
|
+
|
|
214
|
+
return result
|
|
215
|
+
|
|
216
|
+
def _convert_multimodal_content(self, content: list) -> list:
|
|
217
|
+
"""Convert multimodal content parts to Responses API format.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
content: List of content parts from the LLMContext message.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
List of content parts in Responses API format.
|
|
224
|
+
"""
|
|
225
|
+
result = []
|
|
226
|
+
for part in content:
|
|
227
|
+
part_type = part.get("type")
|
|
228
|
+
if part_type == "text":
|
|
229
|
+
result.append({"type": "input_text", "text": part.get("text", "")})
|
|
230
|
+
elif part_type == "image_url":
|
|
231
|
+
image_url_obj = part.get("image_url", {})
|
|
232
|
+
result.append(
|
|
233
|
+
{
|
|
234
|
+
"type": "input_image",
|
|
235
|
+
"image_url": image_url_obj.get("url", ""),
|
|
236
|
+
"detail": image_url_obj.get("detail", "auto"),
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
else:
|
|
240
|
+
# Pass through other types as-is (e.g. input_audio when supported)
|
|
241
|
+
result.append(part)
|
|
242
|
+
return result
|
|
@@ -13,6 +13,7 @@ LLM processing, and text-to-speech components in conversational AI pipelines.
|
|
|
13
13
|
|
|
14
14
|
import asyncio
|
|
15
15
|
import json
|
|
16
|
+
import time
|
|
16
17
|
from abc import abstractmethod
|
|
17
18
|
from typing import Any, Dict, List, Literal, Optional, Set
|
|
18
19
|
|
|
@@ -39,6 +40,7 @@ from pipecat.frames.frames import (
|
|
|
39
40
|
InterruptionFrame,
|
|
40
41
|
LLMContextAssistantTimestampFrame,
|
|
41
42
|
LLMContextFrame,
|
|
43
|
+
LLMProcessingInitiatedFrame,
|
|
42
44
|
LLMFullResponseEndFrame,
|
|
43
45
|
LLMFullResponseStartFrame,
|
|
44
46
|
LLMMessagesAppendFrame,
|
|
@@ -50,6 +52,7 @@ from pipecat.frames.frames import (
|
|
|
50
52
|
StartFrame,
|
|
51
53
|
TextFrame,
|
|
52
54
|
TranscriptionFrame,
|
|
55
|
+
TranscriptDropFrame,
|
|
53
56
|
TTSTextFrame,
|
|
54
57
|
UserImageRawFrame,
|
|
55
58
|
UserStartedSpeakingFrame,
|
|
@@ -132,6 +135,7 @@ class LLMContextAggregator(FrameProcessor):
|
|
|
132
135
|
Args:
|
|
133
136
|
direction: The direction to push the frame (upstream or downstream).
|
|
134
137
|
"""
|
|
138
|
+
await self.push_frame(LLMProcessingInitiatedFrame(), direction)
|
|
135
139
|
frame = self._get_context_frame()
|
|
136
140
|
await self.push_frame(frame, direction)
|
|
137
141
|
|
|
@@ -234,12 +238,21 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
234
238
|
self._aggregation_event = asyncio.Event()
|
|
235
239
|
self._aggregation_task = None
|
|
236
240
|
|
|
241
|
+
# Smart aggregation push state — enables immediate push of late
|
|
242
|
+
# transcriptions and prevents duplicate STT outputs from triggering
|
|
243
|
+
# duplicate LLM calls.
|
|
244
|
+
self._latest_final_transcript = ""
|
|
245
|
+
self._last_user_speaking_time: float = 0
|
|
246
|
+
self._last_aggregation_push_time: float = 0
|
|
247
|
+
self._pending_transcription_ids: List[int] = []
|
|
248
|
+
|
|
237
249
|
async def reset(self):
|
|
238
250
|
"""Reset the aggregation state and interruption strategies."""
|
|
239
251
|
await super().reset()
|
|
240
252
|
self._was_bot_speaking = False
|
|
241
253
|
self._seen_interim_results = False
|
|
242
254
|
self._waiting_for_aggregation = False
|
|
255
|
+
self._pending_transcription_ids.clear()
|
|
243
256
|
[await s.reset() for s in self._interruption_strategies]
|
|
244
257
|
|
|
245
258
|
async def process_frame(self, frame: Frame, direction: FrameDirection):
|
|
@@ -304,12 +317,22 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
304
317
|
"""Process the current aggregation and push it downstream."""
|
|
305
318
|
aggregation = self._aggregation
|
|
306
319
|
await self.reset()
|
|
320
|
+
# Notify BotSpeakingFrameMonitor to tighten VAD before LLM starts
|
|
321
|
+
await self.push_frame(LLMProcessingInitiatedFrame())
|
|
307
322
|
self._context.add_message({"role": self.role, "content": aggregation})
|
|
308
323
|
frame = LLMContextFrame(self._context)
|
|
309
324
|
await self.push_frame(frame)
|
|
325
|
+
self._last_aggregation_push_time = time.time()
|
|
310
326
|
|
|
311
|
-
async def push_aggregation(self):
|
|
312
|
-
"""Push the current aggregation based on interruption strategies and conditions.
|
|
327
|
+
async def push_aggregation(self, trigger_interruption: bool = False):
|
|
328
|
+
"""Push the current aggregation based on interruption strategies and conditions.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
trigger_interruption: If True and no interruption strategies are
|
|
332
|
+
configured, push an InterruptionFrame to stop bot speech before
|
|
333
|
+
submitting the user message. Used by smart push logic for late
|
|
334
|
+
transcriptions that should interrupt the bot.
|
|
335
|
+
"""
|
|
313
336
|
if len(self._aggregation) > 0:
|
|
314
337
|
if self.interruption_strategies and self._bot_speaking:
|
|
315
338
|
should_interrupt = await self._should_interrupt_based_on_strategies()
|
|
@@ -322,9 +345,12 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
322
345
|
await self._process_aggregation()
|
|
323
346
|
else:
|
|
324
347
|
logger.debug("Interruption conditions not met - not pushing aggregation")
|
|
325
|
-
# Don't process aggregation,
|
|
348
|
+
# Don't process aggregation, discard pending transcriptions and reset
|
|
349
|
+
await self._discard_pending_transcriptions("interruption_conditions_not_met")
|
|
326
350
|
await self.reset()
|
|
327
351
|
else:
|
|
352
|
+
if trigger_interruption:
|
|
353
|
+
await self.push_frame(InterruptionFrame(), FrameDirection.DOWNSTREAM)
|
|
328
354
|
# No interruption config - normal behavior (always push aggregation)
|
|
329
355
|
await self._process_aggregation()
|
|
330
356
|
# Handles the case where both the user and the bot are not speaking,
|
|
@@ -355,6 +381,21 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
355
381
|
|
|
356
382
|
return any([await should_interrupt(s) for s in self._interruption_strategies])
|
|
357
383
|
|
|
384
|
+
async def _discard_pending_transcriptions(self, reason: str):
|
|
385
|
+
"""Notify upstream processors that pending transcripts should be dropped.
|
|
386
|
+
|
|
387
|
+
When interruption strategies reject user speech, the words were already
|
|
388
|
+
emitted to the transcript. This sends TranscriptDropFrame upstream so
|
|
389
|
+
TranscriptProcessor removes those words from the conversation transcript.
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
reason: Descriptive reason for the drop (for logging).
|
|
393
|
+
"""
|
|
394
|
+
if self._pending_transcription_ids:
|
|
395
|
+
drop_frame = TranscriptDropFrame(transcript_ids=list(self._pending_transcription_ids))
|
|
396
|
+
await self.push_frame(drop_frame, FrameDirection.UPSTREAM)
|
|
397
|
+
self._pending_transcription_ids.clear()
|
|
398
|
+
|
|
358
399
|
async def _start(self, frame: StartFrame):
|
|
359
400
|
self._create_aggregation_task()
|
|
360
401
|
|
|
@@ -382,6 +423,13 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
382
423
|
await s.append_audio(frame.audio, frame.sample_rate)
|
|
383
424
|
|
|
384
425
|
async def _handle_user_started_speaking(self, frame: UserStartedSpeakingFrame):
|
|
426
|
+
# Clear stale aggregation from previous utterance to prevent it from
|
|
427
|
+
# leaking into the new one. Also drop pending transcript IDs upstream.
|
|
428
|
+
if len(self._aggregation) > 0:
|
|
429
|
+
self._aggregation = ""
|
|
430
|
+
await self._discard_pending_transcriptions("user_started_speaking")
|
|
431
|
+
self._latest_final_transcript = ""
|
|
432
|
+
self._last_user_speaking_time = time.time()
|
|
385
433
|
self._user_speaking = True
|
|
386
434
|
self._waiting_for_aggregation = True
|
|
387
435
|
self._was_bot_speaking = self._bot_speaking
|
|
@@ -393,6 +441,7 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
393
441
|
self._emulating_vad = False
|
|
394
442
|
|
|
395
443
|
async def _handle_user_stopped_speaking(self, _: UserStoppedSpeakingFrame):
|
|
444
|
+
self._last_user_speaking_time = time.time()
|
|
396
445
|
self._user_speaking = False
|
|
397
446
|
# We just stopped speaking. Let's see if there's some aggregation to
|
|
398
447
|
# push. If the last thing we saw is an interim transcription, let's wait
|
|
@@ -421,17 +470,64 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
421
470
|
return
|
|
422
471
|
|
|
423
472
|
self._aggregation += f" {text}" if self._aggregation else text
|
|
473
|
+
self._pending_transcription_ids.append(frame.id)
|
|
424
474
|
# We just got a final result, so let's reset interim results.
|
|
425
475
|
self._seen_interim_results = False
|
|
426
|
-
|
|
427
|
-
|
|
476
|
+
|
|
477
|
+
# Smart aggregation push: when the user is NOT speaking (VAD stopped),
|
|
478
|
+
# check if this late transcription should be pushed immediately rather
|
|
479
|
+
# than waiting for the background task timeout (saves 200-500ms TTFB).
|
|
480
|
+
if not self._user_speaking:
|
|
481
|
+
time_since_stopped = time.time() - self._last_user_speaking_time
|
|
482
|
+
should_push = False
|
|
483
|
+
should_interrupt = False
|
|
484
|
+
|
|
485
|
+
# Condition 1: User stopped < 1s ago + new (non-duplicate) text.
|
|
486
|
+
# Covers normal late transcription delivery from STT.
|
|
487
|
+
if time_since_stopped < 1.0 and self._latest_final_transcript != text:
|
|
488
|
+
# If we also pushed aggregation < 1s ago, this is a rapid
|
|
489
|
+
# correction/addition — interrupt the bot's stale response.
|
|
490
|
+
if time.time() - self._last_aggregation_push_time < 1.0:
|
|
491
|
+
should_interrupt = True
|
|
492
|
+
should_push = True
|
|
493
|
+
# Condition 2: User stopped 1-3s ago + bot silent + new text.
|
|
494
|
+
# Covers very slow STT delivery when nobody is talking.
|
|
495
|
+
elif (
|
|
496
|
+
not self._bot_speaking
|
|
497
|
+
and time_since_stopped < 3.0
|
|
498
|
+
and self._latest_final_transcript != text
|
|
499
|
+
):
|
|
500
|
+
if time.time() - self._last_aggregation_push_time < 3.0:
|
|
501
|
+
should_interrupt = True
|
|
502
|
+
should_push = True
|
|
503
|
+
# Condition 3: Frame metadata override from STT or upstream processor.
|
|
504
|
+
elif frame.metadata.get("push_aggregation", False):
|
|
505
|
+
should_push = True
|
|
506
|
+
|
|
507
|
+
if should_push:
|
|
508
|
+
if should_interrupt:
|
|
509
|
+
# Single-word filter: don't interrupt bot for backchannel
|
|
510
|
+
# utterances like "ok", "hmm", "yes".
|
|
511
|
+
if len(self._aggregation.split()) > 1:
|
|
512
|
+
await self.push_aggregation(should_interrupt)
|
|
513
|
+
else:
|
|
514
|
+
await self.push_aggregation()
|
|
515
|
+
else:
|
|
516
|
+
# No immediate push — fall back to background task timeout.
|
|
517
|
+
self._aggregation_event.set()
|
|
518
|
+
else:
|
|
519
|
+
# User is still speaking — just reset the aggregation timer.
|
|
520
|
+
self._aggregation_event.set()
|
|
521
|
+
|
|
522
|
+
self._latest_final_transcript = text
|
|
428
523
|
|
|
429
524
|
async def _handle_interim_transcription(self, _: InterimTranscriptionFrame):
|
|
430
525
|
self._seen_interim_results = True
|
|
431
526
|
|
|
432
527
|
def _create_aggregation_task(self):
|
|
433
|
-
|
|
434
|
-
|
|
528
|
+
pass
|
|
529
|
+
# if not self._aggregation_task:
|
|
530
|
+
# self._aggregation_task = self.create_task(self._aggregation_task_handler())
|
|
435
531
|
|
|
436
532
|
async def _cancel_aggregation_task(self):
|
|
437
533
|
if self._aggregation_task:
|
|
@@ -510,6 +606,7 @@ class LLMUserAggregator(LLMContextAggregator):
|
|
|
510
606
|
if self._bot_speaking and not self._params.enable_emulated_vad_interruptions:
|
|
511
607
|
# If emulated VAD interruptions are disabled and bot is speaking, ignore
|
|
512
608
|
logger.debug("Ignoring user speaking emulation, bot is speaking.")
|
|
609
|
+
await self._discard_pending_transcriptions("emulated_vad_ignored")
|
|
513
610
|
await self.reset()
|
|
514
611
|
else:
|
|
515
612
|
# Either bot is not speaking, or emulated VAD interruptions are enabled
|