dv-pipecat-flows 0.0.0.dev2764__tar.gz → 0.0.0.dev2766__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.dev2764/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.0.dev2766}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/scm_file_list.json +1 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/scm_version.json +2 -2
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/processors/user_turn_observer.py +32 -11
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.agents/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.agents/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.claude/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.claude/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.gitattributes +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.gitignore +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.python-version +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.readthedocs.yaml +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/AGENTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/CHANGELOG.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/CLAUDE.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/CONTRIBUTING.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/LICENSE +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/MANIFEST.in +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/.env.example +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/.gitignore +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/ARCHITECTURE.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CODE_MAP.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CONFIG.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CONTRACTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/COPILOT_TODO.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/DISTRIBUTION.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/HLD.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/METHODS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/VOICE_E2E.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/ANALYSIS_stagehand_vs_hybrid.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/RESULTS.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/_env.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/bench.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/bench_browseruse.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/bench_stagehand.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/inspect_browseruse.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/inspect_browseruse_showcase.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/inspect_stagehand_prompt.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/pages/checkout.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/pages/dashboard.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/pages/signup.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/results_browseruse.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/results_perception.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/results_stagehand.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/tasks.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/try_hybrid.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/try_hybrid_multistep.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/try_hybrid_oneshot.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/pyproject.toml +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/scripts/dev-stack.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/uv.lock +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/dev-requirements.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/docker-compose.dev.yml +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/.eslintrc.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/.prettierrc +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/css/tailwind.css +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/examples/food_ordering.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/examples/movie_explorer.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/examples/patient_intake.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/examples/restaurant_reservation.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/examples/travel_planner.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/favicon.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/index.html +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/canvas.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/editorState.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/sidePanel.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/toolbar.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/main.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/baseNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/endNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/flowNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/functionNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/index.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/mergeNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/startNode.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/types.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/utils/export.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/utils/helpers.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/utils/import.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/utils/validation.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/jsdoc.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/package-lock.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/package.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/postcss.config.cjs +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/public/favicon.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/public/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/tailwind.config.cjs +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/vercel.json +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/vite.config.js +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/engine_primitives_plan.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/env.example +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/images/food-ordering-flow.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/pipecat-flows.png +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/pipecat_upgrade.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/pyproject.toml +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/remote-asterisk-code/README.md +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/remote-asterisk-code/extensions.conf +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/remote-asterisk-code/rtp.conf +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/requirements.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/azure_latency_probe.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/check-pypi-package.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/fix-ruff.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/langfuse_export.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/pre-commit.sh +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/setup.cfg +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/__init__.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/actions.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/adapters.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/condition_evaluator.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/exceptions.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/flow_validator.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/manager.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/processors/__init__.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/router_mode.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/types.py +0 -0
- {dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/uv.lock +0 -0
|
@@ -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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.agents/skills/loki-logs/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/.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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/.env.example
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CODE_MAP.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CONFIG.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/CONTRACTS.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/HLD.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/METHODS.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/docs/VOICE_E2E.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/RESULTS.md
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/_env.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/tasks.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/browser_copilot/eval/try_hybrid.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/canvas.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/editorState.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/sidePanel.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/editor/toolbar.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/baseNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/endNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/flowNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/functionNode.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/mergeNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/nodes/startNode.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/editor/js/utils/helpers.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/images/food-ordering-flow.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/remote-asterisk-code/README.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/remote-asterisk-code/rtp.conf
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/azure_latency_probe.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/scripts/check-pypi-package.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/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.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/__init__.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/actions.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/adapters.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/router_mode.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.0.dev2764 → dv_pipecat_flows-0.0.0.dev2766}/src/pipecat_flows/types.py
RENAMED
|
File without changes
|
|
File without changes
|