dv-pipecat-flows 0.0.0.dev2810__tar.gz → 0.0.0.dev2828__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_flows-0.0.0.dev2810/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.0.dev2828}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/scm_file_list.json +6 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/scm_version.json +2 -2
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/manager.py +46 -21
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/processors/router_mode_guard.py +11 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/processors/user_turn_observer.py +32 -11
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.agents/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.agents/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.claude/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.claude/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.gitattributes +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.gitignore +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.python-version +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.readthedocs.yaml +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/AGENTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/CHANGELOG.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/CLAUDE.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/CONTRIBUTING.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/LICENSE +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/MANIFEST.in +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/.env.example +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/.gitignore +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/ARCHITECTURE.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CODE_MAP.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CONFIG.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CONTRACTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/COPILOT_TODO.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/DISTRIBUTION.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/HLD.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/METHODS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/VOICE_E2E.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/ANALYSIS_stagehand_vs_hybrid.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/RESULTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/_env.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/bench.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/bench_browseruse.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/bench_stagehand.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/inspect_browseruse.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/inspect_browseruse_showcase.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/inspect_stagehand_prompt.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/pages/checkout.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/pages/dashboard.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/pages/signup.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/results_browseruse.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/results_perception.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/results_stagehand.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/tasks.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/try_hybrid.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/try_hybrid_multistep.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/try_hybrid_oneshot.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/pyproject.toml +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/scripts/dev-stack.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/uv.lock +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/dev-requirements.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/docker-compose.dev.yml +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/.eslintrc.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/.prettierrc +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/css/tailwind.css +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/food_ordering.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/movie_explorer.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/patient_intake.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/restaurant_reservation.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/travel_planner.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/favicon.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/index.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/canvas.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/editorState.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/sidePanel.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/toolbar.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/main.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/baseNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/endNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/flowNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/functionNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/index.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/mergeNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/startNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/types.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/export.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/helpers.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/import.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/validation.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/jsdoc.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/package-lock.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/package.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/postcss.config.cjs +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/public/favicon.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/public/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/tailwind.config.cjs +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/vercel.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/vite.config.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/engine_primitives_plan.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/env.example +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/images/food-ordering-flow.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/pipecat-flows.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/pipecat_upgrade.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/pyproject.toml +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/remote-asterisk-code/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/remote-asterisk-code/extensions.conf +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/remote-asterisk-code/rtp.conf +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/requirements.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/azure_latency_probe.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/check-pypi-package.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/fix-ruff.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/langfuse_export.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/pre-commit.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/setup.cfg +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/__init__.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/actions.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/adapters.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/condition_evaluator.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/exceptions.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/flow_validator.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/processors/__init__.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/router_mode.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/types.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/uv.lock +0 -0
|
@@ -333,6 +333,7 @@
|
|
|
333
333
|
"ringg-bot/ringg_processors/realtime_audio_suppressor.py",
|
|
334
334
|
"ringg-bot/ringg_processors/realtime_tts_bridge.py",
|
|
335
335
|
"ringg-bot/ringg_processors/screen_auto_injector.py",
|
|
336
|
+
"ringg-bot/ringg_processors/tts_cache.py",
|
|
336
337
|
"ringg-bot/ringg_processors/two_stage_user_idle_processor.py",
|
|
337
338
|
"ringg-bot/ringg_processors/user_activity_reset_processor.py",
|
|
338
339
|
"ringg-bot/scripts/delete_agent_cache.py",
|
|
@@ -382,6 +383,7 @@
|
|
|
382
383
|
"ringg-bot/tests/test_dom_context_injector.py",
|
|
383
384
|
"ringg-bot/tests/test_dropped_turn_regeneration.py",
|
|
384
385
|
"ringg-bot/tests/test_end_call_schema.py",
|
|
386
|
+
"ringg-bot/tests/test_end_call_teardown.py",
|
|
385
387
|
"ringg-bot/tests/test_env_config_asterisk_ami.py",
|
|
386
388
|
"ringg-bot/tests/test_execute_plan.py",
|
|
387
389
|
"ringg-bot/tests/test_find_button_api_config.py",
|
|
@@ -411,6 +413,7 @@
|
|
|
411
413
|
"ringg-bot/tests/test_merge_parallel_tool_responses.py",
|
|
412
414
|
"ringg-bot/tests/test_metrics_bridge.py",
|
|
413
415
|
"ringg-bot/tests/test_metrics_collector_llm.py",
|
|
416
|
+
"ringg-bot/tests/test_no_bot_calls_are_failed.py",
|
|
414
417
|
"ringg-bot/tests/test_on_call_api_pre_call_message.py",
|
|
415
418
|
"ringg-bot/tests/test_on_call_jq_metadata.py",
|
|
416
419
|
"ringg-bot/tests/test_on_call_sdk_context.py",
|
|
@@ -445,6 +448,7 @@
|
|
|
445
448
|
"ringg-bot/tests/test_transcript_timestamp_format.py",
|
|
446
449
|
"ringg-bot/tests/test_transfer_custom_vars.py",
|
|
447
450
|
"ringg-bot/tests/test_transfer_summary_api_tool.py",
|
|
451
|
+
"ringg-bot/tests/test_tts_cache.py",
|
|
448
452
|
"ringg-bot/tests/test_tts_currency.py",
|
|
449
453
|
"ringg-bot/tests/test_variable_replacement.py",
|
|
450
454
|
"ringg-bot/tests/test_wandb_llm.py",
|
|
@@ -650,9 +654,11 @@
|
|
|
650
654
|
"tests/test_openai_realtime_transcript_filter.py",
|
|
651
655
|
"tests/test_response_formatters.py",
|
|
652
656
|
"tests/test_router_extract_schema.py",
|
|
657
|
+
"tests/test_router_mode_guard.py",
|
|
653
658
|
"tests/test_router_no_unclear.py",
|
|
654
659
|
"tests/test_router_wait_idle.py",
|
|
655
660
|
"tests/test_tts_split_cache.py",
|
|
661
|
+
"tests/test_user_turn_observer.py",
|
|
656
662
|
"tests/test_voicemail_detector.py",
|
|
657
663
|
"uv.lock"
|
|
658
664
|
]
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/manager.py
RENAMED
|
@@ -48,7 +48,7 @@ from typing import (
|
|
|
48
48
|
|
|
49
49
|
from loguru import logger
|
|
50
50
|
from utils.tracking_helpers import start_tracking, complete_tracking
|
|
51
|
-
from utils.collect_normalizers import
|
|
51
|
+
from utils.collect_normalizers import normalize_collect_value
|
|
52
52
|
from utils.collect_prompts import collect_prompt
|
|
53
53
|
from pipecat.frames.frames import (
|
|
54
54
|
DTMFUpdateSettingsFrame,
|
|
@@ -2689,6 +2689,7 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2689
2689
|
"""
|
|
2690
2690
|
self._collect_readback = "" # grouped, language-matched read-back for the confirm
|
|
2691
2691
|
self._collect_reply = "" # LLM free reply for a conversational (non-digit) turn
|
|
2692
|
+
self._collect_repeat = False # LLM-decided: caller asked to hear the digits back
|
|
2692
2693
|
context_messages = [
|
|
2693
2694
|
{"role": "user", "content": turn}
|
|
2694
2695
|
for turn in turns
|
|
@@ -2732,6 +2733,14 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2732
2733
|
"the number; make no promises or commitments."
|
|
2733
2734
|
),
|
|
2734
2735
|
},
|
|
2736
|
+
"repeat_request": {
|
|
2737
|
+
"type": "boolean",
|
|
2738
|
+
"description": (
|
|
2739
|
+
"true ONLY if the caller's latest message asks to hear back the "
|
|
2740
|
+
"digits captured so far; false when they are offering to dictate "
|
|
2741
|
+
"again themselves."
|
|
2742
|
+
),
|
|
2743
|
+
},
|
|
2735
2744
|
},
|
|
2736
2745
|
)
|
|
2737
2746
|
try:
|
|
@@ -2749,6 +2758,11 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2749
2758
|
"empty and put a SHORT on-topic reply in `reply`: answer in one "
|
|
2750
2759
|
"sentence, then ask again for the number — stay on topic, make no "
|
|
2751
2760
|
"promises.\n"
|
|
2761
|
+
"Set `repeat_request` to true ONLY when the caller's latest message "
|
|
2762
|
+
"asks to hear back what has been captured so far ('repeat that', "
|
|
2763
|
+
"'what do you have?', 'दोबारा बोलिए'). An offer to dictate again "
|
|
2764
|
+
"('मैं फिर से बताती हूँ', 'I'll tell you again') is NOT a repeat "
|
|
2765
|
+
"request.\n"
|
|
2752
2766
|
"Digits: read each spoken number-word in the order spoken and join its "
|
|
2753
2767
|
"digits left to right — a digit-word adds one digit, 'double X' adds "
|
|
2754
2768
|
"XX, 'triple X' adds XXX (in any language, incl. डबल/ट्रिपल), and a lone "
|
|
@@ -2778,6 +2792,7 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2778
2792
|
reply = (extracted or {}).get("reply")
|
|
2779
2793
|
self._collect_readback = readback.strip() if isinstance(readback, str) else ""
|
|
2780
2794
|
self._collect_reply = reply.strip() if isinstance(reply, str) else ""
|
|
2795
|
+
self._collect_repeat = bool((extracted or {}).get("repeat_request"))
|
|
2781
2796
|
return re.sub(r"\D", "", value) if isinstance(value, str) else ""
|
|
2782
2797
|
|
|
2783
2798
|
async def _reextract_if_corrected(
|
|
@@ -2939,9 +2954,10 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2939
2954
|
# the CORRECTED number at once — instead of asking "what should it
|
|
2940
2955
|
# be?" and making them repeat what they just said. The idempotent
|
|
2941
2956
|
# extractor merges "no, the first part is 807" into 70823… →
|
|
2942
|
-
# 8072341303.
|
|
2943
|
-
#
|
|
2944
|
-
#
|
|
2957
|
+
# 8072341303. Only a plain rejection with no new digits falls
|
|
2958
|
+
# through to the re-ask — and starts FRESH (start_ts advanced), so
|
|
2959
|
+
# the rejected number's turns can't concatenate into the caller's
|
|
2960
|
+
# re-dictation (live call 2a3f6513). Bounded by ``corrections``.
|
|
2945
2961
|
while True:
|
|
2946
2962
|
confirmed = await self._confirm_collected(
|
|
2947
2963
|
node_id, getattr(self, "_collect_readback", "") or " ".join(buffer)
|
|
@@ -2958,7 +2974,9 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2958
2974
|
if corrected is not None:
|
|
2959
2975
|
buffer, normalized = corrected
|
|
2960
2976
|
continue # re-read the corrected number, no "what should it be?"
|
|
2977
|
+
start_ts = time.monotonic()
|
|
2961
2978
|
buffer = ""
|
|
2979
|
+
echoed = ""
|
|
2962
2980
|
await self._task.queue_frame(
|
|
2963
2981
|
TTSSpeakFrame(text=collect_prompt(language, "restart_denied"))
|
|
2964
2982
|
)
|
|
@@ -2987,8 +3005,7 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2987
3005
|
# correction during the echo phase ("no, the 3rd is 5": 7765 → 7755)
|
|
2988
3006
|
# changes the value but not the length, so a length check would mis-read
|
|
2989
3007
|
# the fix as "no progress" and burn a miss instead of echoing it below.
|
|
2990
|
-
|
|
2991
|
-
if buffer and turns and is_repeat_request(turns[-1]):
|
|
3008
|
+
if buffer and getattr(self, "_collect_repeat", False):
|
|
2992
3009
|
# Re-reads bypass the miss counter, so the absolute deadline is the
|
|
2993
3010
|
# only bound — without it a caller repeating "say it again" loops
|
|
2994
3011
|
# forever (a turn lands every cycle, never silence, never a miss).
|
|
@@ -3092,7 +3109,9 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3092
3109
|
if normalized:
|
|
3093
3110
|
# Same as phone: a "no, it's X" correction re-extracts over the turns
|
|
3094
3111
|
# we already have and re-reads the CORRECTED code at once; only a
|
|
3095
|
-
# plain rejection with no new digits asks "what should it be?"
|
|
3112
|
+
# plain rejection with no new digits asks "what should it be?" —
|
|
3113
|
+
# and starts FRESH (start_ts advanced) so the rejected code's turns
|
|
3114
|
+
# can't concatenate into the re-dictation (live call 2a3f6513).
|
|
3096
3115
|
while True:
|
|
3097
3116
|
confirmed = await self._confirm_collected(
|
|
3098
3117
|
node_id, getattr(self, "_collect_readback", "") or " ".join(normalized)
|
|
@@ -3109,7 +3128,9 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3109
3128
|
if corrected is not None:
|
|
3110
3129
|
buffer, normalized = corrected
|
|
3111
3130
|
continue # re-read the corrected code, no "what should it be?"
|
|
3131
|
+
start_ts = time.monotonic()
|
|
3112
3132
|
buffer = ""
|
|
3133
|
+
echoed = ""
|
|
3113
3134
|
await self._task.queue_frame(
|
|
3114
3135
|
TTSSpeakFrame(text=collect_prompt(language, "restart_denied"))
|
|
3115
3136
|
)
|
|
@@ -3135,8 +3156,7 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3135
3156
|
# asked to hear it back, RE-READ the digits-so-far (no miss); else re-ask
|
|
3136
3157
|
# and count a miss. Compare by VALUE not length so a same-length
|
|
3137
3158
|
# correction during the echo phase counts as progress (echoed below).
|
|
3138
|
-
|
|
3139
|
-
if buffer and turns and is_repeat_request(turns[-1]):
|
|
3159
|
+
if buffer and getattr(self, "_collect_repeat", False):
|
|
3140
3160
|
# Re-reads bypass the miss counter, so the absolute deadline is the
|
|
3141
3161
|
# only bound — without it a caller repeating "say it again" loops
|
|
3142
3162
|
# forever (a turn lands every cycle, never silence, never a miss).
|
|
@@ -3196,7 +3216,8 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3196
3216
|
# knows WHAT is being confirmed. Works in any language.
|
|
3197
3217
|
answer = await self._extract_spoken_value(
|
|
3198
3218
|
node_id,
|
|
3199
|
-
"yes if the caller agrees the value is correct, no if they say it is
|
|
3219
|
+
"yes if the caller agrees the value is correct, no if they say it is "
|
|
3220
|
+
"wrong, repeat if they ask to hear the value read back again",
|
|
3200
3221
|
timeout_s=10.0,
|
|
3201
3222
|
system_prompt=(
|
|
3202
3223
|
"The assistant just read a value back to the caller and asked them "
|
|
@@ -3205,13 +3226,16 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3205
3226
|
"confirmed it is correct. If they point out ANY mistake or give a "
|
|
3206
3227
|
"different value — even while sounding agreeable (e.g. 'no, the "
|
|
3207
3228
|
"last one is 5 not 3', 'haan but change the first digit') — that "
|
|
3208
|
-
"is NOT confirmed; answer 'no'. Answer '
|
|
3209
|
-
"
|
|
3229
|
+
"is NOT confirmed; answer 'no'. Answer 'repeat' ONLY if they ask "
|
|
3230
|
+
"to HEAR the value again ('repeat that', 'दोबारा बोलिए') — a "
|
|
3231
|
+
"caller saying it is wrong and offering to dictate it again "
|
|
3232
|
+
"('नहीं, मैं फिर से बताती हूँ') means 'no', not 'repeat'. Answer "
|
|
3233
|
+
"'yes' only if they accept it exactly as read."
|
|
3210
3234
|
),
|
|
3211
3235
|
context_prefix=[
|
|
3212
3236
|
{"role": "assistant", "content": f"I have {readback}. Is that correct?"}
|
|
3213
3237
|
],
|
|
3214
|
-
enum_values=["yes", "no"],
|
|
3238
|
+
enum_values=["yes", "no", "repeat"],
|
|
3215
3239
|
)
|
|
3216
3240
|
# Hard guard: a genuine confirmation never contains digits, a correction
|
|
3217
3241
|
# ("no, the last is 5 not 3") always does. If the reply has any digit,
|
|
@@ -3224,17 +3248,18 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
3224
3248
|
else ""
|
|
3225
3249
|
)
|
|
3226
3250
|
has_digit = any(ch.isdigit() for ch in reply)
|
|
3227
|
-
# A request to hear it again ("can you repeat?") is NOT a yes or a no —
|
|
3228
|
-
# re-read the value and DON'T burn a confirm attempt (bounded so a caller
|
|
3229
|
-
# stuck on "repeat" can't loop forever). A digit-carrying reply is a
|
|
3230
|
-
# correction, handled just below, so only a digit-free reply is a repeat.
|
|
3231
|
-
if not has_digit and is_repeat_request(reply):
|
|
3232
|
-
repeats += 1
|
|
3233
|
-
if repeats <= 3:
|
|
3234
|
-
continue
|
|
3235
3251
|
if has_digit:
|
|
3236
3252
|
return False
|
|
3237
3253
|
text = (answer or "").strip().lower()
|
|
3254
|
+
# A request to hear it again (LLM-decided — "मैं फिर से बताती हूँ" /
|
|
3255
|
+
# "I'll tell you again" classifies as 'no', not 'repeat'; the old
|
|
3256
|
+
# substring match looped on that false positive, live call 2a3f6513)
|
|
3257
|
+
# is NOT a yes or a no — re-read the value and DON'T burn a confirm
|
|
3258
|
+
# attempt (bounded so a caller stuck on "repeat" can't loop forever).
|
|
3259
|
+
if text.startswith("repeat"):
|
|
3260
|
+
repeats += 1
|
|
3261
|
+
if repeats <= 3:
|
|
3262
|
+
continue
|
|
3238
3263
|
if text.startswith("yes"):
|
|
3239
3264
|
return True
|
|
3240
3265
|
if text.startswith("no"):
|
|
@@ -48,6 +48,7 @@ from typing import Callable, Tuple, Type
|
|
|
48
48
|
|
|
49
49
|
from pipecat.frames.frames import (
|
|
50
50
|
Frame,
|
|
51
|
+
LLMContextFrame,
|
|
51
52
|
LLMMessagesFrame,
|
|
52
53
|
LLMRunFrame,
|
|
53
54
|
LLMTextFrame,
|
|
@@ -63,6 +64,16 @@ logger = logging.getLogger(__name__)
|
|
|
63
64
|
# race-free fix for the spurious-bot-text problem.
|
|
64
65
|
_TRIGGER_FRAME_TYPES: Tuple[Type[Frame], ...] = (
|
|
65
66
|
OpenAILLMContextFrame,
|
|
67
|
+
# Universal context frame. `LLMContextFrame` and `OpenAILLMContextFrame` are
|
|
68
|
+
# SIBLINGS (both extend Frame directly), so matching one does NOT match the
|
|
69
|
+
# other — both must be listed. The pipeline picks between them from a single
|
|
70
|
+
# switch in the bot: `context = LLMContext() if (_use_responses or
|
|
71
|
+
# _use_universal_for_google) else OpenAILLMContext()`. Omitting this one let
|
|
72
|
+
# the LLM fire during router-mode nodes on every Responses-API agent
|
|
73
|
+
# (gpt-5.4-mini/nano are forced onto Responses regardless of the
|
|
74
|
+
# `use_responses_api` toggle) and every google/gemma agent — the bot spoke
|
|
75
|
+
# spurious freeform text instead of routing silently.
|
|
76
|
+
LLMContextFrame,
|
|
66
77
|
LLMMessagesFrame,
|
|
67
78
|
LLMRunFrame,
|
|
68
79
|
)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
"""Observer that timestamps
|
|
1
|
+
"""Observer that timestamps the user-turn-committed context frame
|
|
2
|
+
(:class:`OpenAILLMContextFrame` **or** :class:`LLMContextFrame`) so router-mode
|
|
2
3
|
nodes can detect "user turn is now committed to context" without reaching
|
|
3
4
|
into the user context aggregator's private state.
|
|
4
5
|
|
|
@@ -7,22 +8,27 @@ Why an observer, not a FrameProcessor:
|
|
|
7
8
|
public ``PipelineTask.add_observer`` API.
|
|
8
9
|
* We only need a passive timestamp + an ``asyncio.Event`` — no frame routing.
|
|
9
10
|
|
|
10
|
-
Why
|
|
11
|
+
Why a context frame and not ``UserStoppedSpeakingFrame``:
|
|
11
12
|
* ``UserStoppedSpeakingFrame`` is raw VAD — it fires the instant the mic
|
|
12
13
|
detects silence, BEFORE the STT final lands and BEFORE the user-context
|
|
13
14
|
aggregator appends the turn. Router gates that release on this signal
|
|
14
15
|
classify against an empty/stale context.
|
|
15
|
-
*
|
|
16
|
+
* The context frame is pushed by ``LLMUserContextAggregator``
|
|
16
17
|
(``llm_response._process_aggregation``) only AFTER the final transcript
|
|
17
18
|
is appended to the LLM context. It is the canonical "user turn is now
|
|
18
19
|
in the context the router will read" event.
|
|
19
20
|
* Router-mode never queues ``LLMRunFrame`` for the router node itself, so
|
|
20
|
-
the only
|
|
21
|
-
|
|
21
|
+
the only context frame produced during a router invocation comes from
|
|
22
|
+
the aggregator's turn-complete path — no competing source.
|
|
23
|
+
|
|
24
|
+
BOTH context-frame flavours must be matched (see
|
|
25
|
+
``_USER_TURN_COMMITTED_FRAME_TYPES``): the aggregator emits
|
|
26
|
+
``LLMContextFrame`` on the Responses-API / google / gemma paths and
|
|
27
|
+
``OpenAILLMContextFrame`` on the Chat Completions path.
|
|
22
28
|
|
|
23
29
|
State exposed:
|
|
24
30
|
* ``last_user_context_pushed_ts``: monotonic time of the latest
|
|
25
|
-
|
|
31
|
+
user-turn context frame (user turn committed to context).
|
|
26
32
|
* ``last_user_stopped_ts``: backwards-compatible alias kept in sync with
|
|
27
33
|
``last_user_context_pushed_ts`` so existing callers keep working.
|
|
28
34
|
* ``event``: ``asyncio.Event`` set on every such frame; the consumer is
|
|
@@ -38,26 +44,41 @@ from typing import List, Tuple
|
|
|
38
44
|
|
|
39
45
|
from pipecat.frames.frames import (
|
|
40
46
|
InterimTranscriptionFrame,
|
|
47
|
+
LLMContextFrame,
|
|
41
48
|
TranscriptionFrame,
|
|
42
49
|
UserStartedSpeakingFrame,
|
|
43
50
|
)
|
|
44
51
|
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContextFrame
|
|
45
52
|
from pipecat.observers.base_observer import BaseObserver, FramePushed
|
|
46
53
|
|
|
54
|
+
# Both context-frame flavours mean the same thing here: "the user's turn is now
|
|
55
|
+
# committed to the context the router will read". Which one the aggregator emits
|
|
56
|
+
# is decided by one switch in the bot:
|
|
57
|
+
#
|
|
58
|
+
# context = LLMContext() if (_use_responses or _use_universal_for_google)
|
|
59
|
+
# else OpenAILLMContext()
|
|
60
|
+
#
|
|
61
|
+
# They are SIBLINGS (both extend Frame directly, neither subclasses the other),
|
|
62
|
+
# so matching one does NOT match the other. Keying on only OpenAILLMContextFrame
|
|
63
|
+
# left every Responses-API / google / gemma agent's router waiting the full
|
|
64
|
+
# ``router_wait_for_user_timeout`` (15s) after the caller had already replied.
|
|
65
|
+
_USER_TURN_COMMITTED_FRAME_TYPES = (OpenAILLMContextFrame, LLMContextFrame)
|
|
66
|
+
|
|
47
67
|
# Bound the per-call transcript log so a very long call can't grow it without
|
|
48
68
|
# limit; far more than any single Collect dictation needs.
|
|
49
69
|
_MAX_TRANSCRIPT_LOG = 256
|
|
50
70
|
|
|
51
71
|
|
|
52
72
|
class UserTurnObserver(BaseObserver):
|
|
53
|
-
"""Tracks the timestamp of the most recent
|
|
73
|
+
"""Tracks the timestamp of the most recent user-turn context frame.
|
|
54
74
|
|
|
55
75
|
Router-mode uses this to (a) detect a user reply already committed to
|
|
56
76
|
context BEFORE the router was entered (barge-in during the preceding
|
|
57
77
|
Speak's TTS) and (b) await the NEXT user reply when none is available.
|
|
58
78
|
|
|
59
|
-
The observer is keyed on
|
|
60
|
-
|
|
79
|
+
The observer is keyed on the context frame (either flavour, see
|
|
80
|
+
``_USER_TURN_COMMITTED_FRAME_TYPES``) rather than the raw VAD
|
|
81
|
+
``UserStoppedSpeakingFrame`` because only the former guarantees the
|
|
61
82
|
user's transcript has been appended to the LLM context the router reads.
|
|
62
83
|
"""
|
|
63
84
|
|
|
@@ -93,7 +114,7 @@ class UserTurnObserver(BaseObserver):
|
|
|
93
114
|
|
|
94
115
|
@property
|
|
95
116
|
def event(self) -> asyncio.Event:
|
|
96
|
-
"""The asyncio.Event set on each
|
|
117
|
+
"""The asyncio.Event set on each user-turn context frame.
|
|
97
118
|
|
|
98
119
|
Callers MUST ``.clear()`` before awaiting if they want to wait for the
|
|
99
120
|
NEXT frame (vs. immediately returning on a stale set state).
|
|
@@ -101,7 +122,7 @@ class UserTurnObserver(BaseObserver):
|
|
|
101
122
|
return self._event
|
|
102
123
|
|
|
103
124
|
async def on_push_frame(self, data: FramePushed) -> None:
|
|
104
|
-
if isinstance(data.frame,
|
|
125
|
+
if isinstance(data.frame, _USER_TURN_COMMITTED_FRAME_TYPES):
|
|
105
126
|
now = time.monotonic()
|
|
106
127
|
self.last_user_context_pushed_ts = now
|
|
107
128
|
self.last_user_stopped_ts = now
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.agents/skills/loki-logs/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/.claude/skills/loki-logs/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/.env.example
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CODE_MAP.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CONFIG.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/CONTRACTS.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/HLD.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/METHODS.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/docs/VOICE_E2E.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/RESULTS.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/_env.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/bench.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/tasks.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/eval/try_hybrid.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/browser_copilot/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/examples/food_ordering.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/canvas.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/editorState.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/sidePanel.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/editor/toolbar.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/baseNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/endNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/flowNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/functionNode.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/mergeNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/nodes/startNode.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/helpers.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/js/utils/validation.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/editor/tailwind.config.cjs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/images/food-ordering-flow.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/remote-asterisk-code/README.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/remote-asterisk-code/rtp.conf
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/azure_latency_probe.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/check-pypi-package.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/scripts/langfuse_export.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/__init__.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/actions.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/adapters.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/router_mode.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2810 → dv_pipecat_flows-0.0.0.dev2828}/src/pipecat_flows/types.py
RENAMED
|
File without changes
|
|
File without changes
|