dv-pipecat-flows 0.0.22.dev2100__tar.gz → 0.0.22.dev2300__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.22.dev2100/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.22.dev2300}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/actions.py +53 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/manager.py +55 -2
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/types.py +6 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.agents/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.agents/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.claude/skills/loki-logs/SKILL.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.claude/skills/loki-logs/query-reference.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.gitattributes +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.gitignore +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.pre-commit-config.yaml +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.python-version +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/.readthedocs.yaml +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/AGENTS.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/CHANGELOG.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/CLAUDE.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/CONTRIBUTING.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/LICENSE +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/MANIFEST.in +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/README.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/dev-requirements.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/docker-compose.dev.yml +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/.eslintrc.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/.prettierrc +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/css/tailwind.css +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/food_ordering.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/movie_explorer.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/patient_intake.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/restaurant_reservation.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/travel_planner.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/favicon.png +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/index.html +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/canvas.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/editorState.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/sidePanel.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/toolbar.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/main.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/baseNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/endNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/flowNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/functionNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/index.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/mergeNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/startNode.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/types.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/export.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/helpers.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/import.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/validation.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/jsdoc.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/package-lock.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/package.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/postcss.config.cjs +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.png +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.svg +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/tailwind.config.cjs +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/vercel.json +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/vite.config.js +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/engine_primitives_plan.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/env.example +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/images/food-ordering-flow.png +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/pipecat-flows.png +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/pipecat_upgrade.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/pyproject.toml +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/README.md +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/extensions.conf +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/rtp.conf +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/requirements.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/scripts/check-pypi-package.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/scripts/fix-ruff.sh +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/scripts/pre-commit.sh +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/setup.cfg +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/__init__.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/adapters.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/condition_evaluator.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/exceptions.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/flow_validator.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/__init__.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/router_mode.py +0 -0
- {dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/uv.lock +0 -0
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/actions.py
RENAMED
|
@@ -25,6 +25,7 @@ Actions are used to perform side effects during conversations, such as:
|
|
|
25
25
|
|
|
26
26
|
import asyncio
|
|
27
27
|
import inspect
|
|
28
|
+
import re
|
|
28
29
|
from dataclasses import dataclass
|
|
29
30
|
from typing import TYPE_CHECKING, Callable, Dict, List, Optional, Tuple
|
|
30
31
|
|
|
@@ -56,6 +57,48 @@ if TYPE_CHECKING:
|
|
|
56
57
|
ONGOING_ACTIONS_WAIT_TIMEOUT_S = 60.0
|
|
57
58
|
|
|
58
59
|
|
|
60
|
+
# Router/Agent-extracted variable token: ``[{name}]`` (distinct from custom
|
|
61
|
+
# ``{{name}}`` on the FE — see VariableSelect.tsx). Resolved at TTS time from
|
|
62
|
+
# ``flow_manager.state``, where ``_run_router_node`` (and the flattened
|
|
63
|
+
# agent_node→llm_router path) writes the LLM's extracted args. Backend
|
|
64
|
+
# lowering only substitutes compile-time vars (custom_args, api_responses);
|
|
65
|
+
# anything a router extracts at runtime needs this pass to reach TTS.
|
|
66
|
+
#
|
|
67
|
+
# Pattern matches BOTH the FE's dominant mention form ``@[{var}]`` (the
|
|
68
|
+
# ``@``-prefixed visible text inside a Tiptap mention span) AND the raw
|
|
69
|
+
# ``[{var}]`` form — mirrors how ``replace_custom_variables`` handles both
|
|
70
|
+
# ``@{{var}}`` and ``{{var}}`` for custom_args.
|
|
71
|
+
_EXTRACT_VAR_RE = re.compile(
|
|
72
|
+
r"@?\[\{\s*([A-Za-z_][A-Za-z0-9_.]*)\s*\}\]"
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _substitute_extract_vars(text: str, state: dict) -> str:
|
|
77
|
+
"""Replace ``[{var}]`` / ``@[{var}]`` occurrences with ``state[var]``.
|
|
78
|
+
|
|
79
|
+
Supports dotted paths (``[{user.name}]``). Unknown variables (key not
|
|
80
|
+
in state, or any path segment missing) are LEFT LITERAL — the marker
|
|
81
|
+
survives so downstream debugging can spot the misconfigured extract.
|
|
82
|
+
"""
|
|
83
|
+
if not text or "[{" not in text or not isinstance(state, dict):
|
|
84
|
+
return text
|
|
85
|
+
|
|
86
|
+
def _resolve(key: str):
|
|
87
|
+
cur = state
|
|
88
|
+
for seg in key.split("."):
|
|
89
|
+
if isinstance(cur, dict) and seg in cur:
|
|
90
|
+
cur = cur[seg]
|
|
91
|
+
else:
|
|
92
|
+
return None
|
|
93
|
+
return cur
|
|
94
|
+
|
|
95
|
+
def _repl(match: "re.Match[str]") -> str:
|
|
96
|
+
value = _resolve(match.group(1))
|
|
97
|
+
return str(value) if value is not None else match.group(0)
|
|
98
|
+
|
|
99
|
+
return _EXTRACT_VAR_RE.sub(_repl, text)
|
|
100
|
+
|
|
101
|
+
|
|
59
102
|
@dataclass
|
|
60
103
|
class FunctionActionFrame(ControlFrame):
|
|
61
104
|
"""Frame containing a function action to be executed.
|
|
@@ -432,6 +475,16 @@ class ActionManager:
|
|
|
432
475
|
logger.error("TTS action missing 'text' / 'text_variants' field")
|
|
433
476
|
return
|
|
434
477
|
|
|
478
|
+
# Runtime resolution of [{var}] / @[{var}] tokens against
|
|
479
|
+
# flow_manager.state. Backend lowering substitutes {{var}} (custom
|
|
480
|
+
# args) and ((tool.field)) (pre-call outputs) at compile time, but
|
|
481
|
+
# router/agent-extracted vars only exist at runtime — without this
|
|
482
|
+
# pass, the bot speaks literals like "@[{user_name}]" verbatim.
|
|
483
|
+
# text_raw stays unrendered so the split-cache's prefix derivation
|
|
484
|
+
# remains stable across calls.
|
|
485
|
+
state = self._flow_manager.state if isinstance(self._flow_manager.state, dict) else {}
|
|
486
|
+
text = _substitute_extract_vars(text, state)
|
|
487
|
+
|
|
435
488
|
await self._maybe_switch_tts_service_for_action(action)
|
|
436
489
|
|
|
437
490
|
use_cache = action.get("use_cache", False)
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/manager.py
RENAMED
|
@@ -622,6 +622,7 @@ class FlowManager:
|
|
|
622
622
|
handler: Optional[Callable | FlowsDirectFunctionWrapper],
|
|
623
623
|
transition_to: Optional[str],
|
|
624
624
|
transition_callback: Optional[Callable] = None,
|
|
625
|
+
state_update_keys: Optional[List[str]] = None,
|
|
625
626
|
) -> Callable:
|
|
626
627
|
"""Create a transition function for the given name and handler.
|
|
627
628
|
|
|
@@ -630,6 +631,14 @@ class FlowManager:
|
|
|
630
631
|
handler: Optional function to process data.
|
|
631
632
|
transition_to: Optional node to transition to (static flows).
|
|
632
633
|
transition_callback: Optional callback for dynamic transitions.
|
|
634
|
+
state_update_keys: Optional list of argument names — when the
|
|
635
|
+
LLM calls this function, the named keys from
|
|
636
|
+
``params.arguments`` are copied into ``flow_manager.state``
|
|
637
|
+
before the transition resolves. Used by backend wiring to
|
|
638
|
+
flatten ``agent_node → llm_router`` transitions and still
|
|
639
|
+
propagate the router's ``router_extract`` variables (e.g.
|
|
640
|
+
``language``) into state, preserving parity with
|
|
641
|
+
``_run_router_node``'s ``state.update(extracted)``.
|
|
633
642
|
|
|
634
643
|
Returns:
|
|
635
644
|
Async function that handles the tool invocation.
|
|
@@ -652,6 +661,26 @@ class FlowManager:
|
|
|
652
661
|
function_start_time = time.time()
|
|
653
662
|
try:
|
|
654
663
|
logger.debug(f"Function called: {name}")
|
|
664
|
+
# Flattened-router extract: copy LLM-supplied args into
|
|
665
|
+
# ``flow_manager.state`` BEFORE the transition resolves, so
|
|
666
|
+
# downstream nodes (e.g. Speak picking variant by
|
|
667
|
+
# ``state["language"]``) see the new values on their first
|
|
668
|
+
# ``_set_node`` after the transition. Mirrors the
|
|
669
|
+
# ``state.update(extracted)`` that ``_run_router_node`` does
|
|
670
|
+
# on the non-flattened path.
|
|
671
|
+
if state_update_keys and params.arguments:
|
|
672
|
+
extract_update = {
|
|
673
|
+
key: params.arguments[key]
|
|
674
|
+
for key in state_update_keys
|
|
675
|
+
if key in params.arguments
|
|
676
|
+
}
|
|
677
|
+
if extract_update:
|
|
678
|
+
self.state.update(extract_update)
|
|
679
|
+
logger.debug(
|
|
680
|
+
f"[FLATTENED_ROUTER_EXTRACT] state.update keys="
|
|
681
|
+
f"{list(extract_update.keys())} function={name}"
|
|
682
|
+
)
|
|
683
|
+
|
|
655
684
|
function_call_id = await start_tracking(
|
|
656
685
|
transcript_handler=self._transcript_handler,
|
|
657
686
|
tool_name=name,
|
|
@@ -901,6 +930,7 @@ class FlowManager:
|
|
|
901
930
|
handler: Optional[Callable | FlowsDirectFunctionWrapper],
|
|
902
931
|
transition_to: Optional[str] = None,
|
|
903
932
|
transition_callback: Optional[Callable] = None,
|
|
933
|
+
state_update_keys: Optional[List[str]] = None,
|
|
904
934
|
) -> None:
|
|
905
935
|
"""Register a function with the LLM if not already registered.
|
|
906
936
|
|
|
@@ -924,7 +954,11 @@ class FlowManager:
|
|
|
924
954
|
|
|
925
955
|
# Create transition function
|
|
926
956
|
transition_func = await self._create_transition_func(
|
|
927
|
-
name,
|
|
957
|
+
name,
|
|
958
|
+
handler,
|
|
959
|
+
transition_to,
|
|
960
|
+
transition_callback,
|
|
961
|
+
state_update_keys=state_update_keys,
|
|
928
962
|
)
|
|
929
963
|
|
|
930
964
|
# Register function with LLM (or LLMSwitcher).
|
|
@@ -2322,8 +2356,26 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2322
2356
|
isinstance(a, dict) and a.get("type") == "tts_say"
|
|
2323
2357
|
for a in pre_actions
|
|
2324
2358
|
):
|
|
2359
|
+
# ``Event.wait()`` that's never set hangs forever — a bare
|
|
2360
|
+
# ``await`` here was a transition-deadlock vector when the
|
|
2361
|
+
# ``BotStoppedSpeakingFrame`` never reaches ActionManager
|
|
2362
|
+
# (cancelled pipeline, dropped frame, abruptly closed
|
|
2363
|
+
# transport). Mirror ``actions.py:_maybe_wait_for_ongoing_
|
|
2364
|
+
# actions_to_finish``'s 60s ``wait_for`` backstop so the
|
|
2365
|
+
# node still transitions instead of permanently parking.
|
|
2366
|
+
from pipecat_flows.actions import ONGOING_ACTIONS_WAIT_TIMEOUT_S
|
|
2325
2367
|
try:
|
|
2326
|
-
await
|
|
2368
|
+
await asyncio.wait_for(
|
|
2369
|
+
self._action_manager._ongoing_actions_finished_event.wait(),
|
|
2370
|
+
timeout=ONGOING_ACTIONS_WAIT_TIMEOUT_S,
|
|
2371
|
+
)
|
|
2372
|
+
except asyncio.TimeoutError:
|
|
2373
|
+
logger.warning(
|
|
2374
|
+
f"audio-wait on '{node_id}' timed out after "
|
|
2375
|
+
f"{ONGOING_ACTIONS_WAIT_TIMEOUT_S}s — "
|
|
2376
|
+
f"BotStoppedSpeakingFrame never arrived; continuing "
|
|
2377
|
+
f"with short-circuit to avoid a permanent hang"
|
|
2378
|
+
)
|
|
2327
2379
|
except Exception as wait_exc:
|
|
2328
2380
|
logger.warning(
|
|
2329
2381
|
f"audio-wait on '{node_id}' failed ({wait_exc!r}); "
|
|
@@ -2558,6 +2610,7 @@ In all of these cases, you can provide a `name` in your new node's config for de
|
|
|
2558
2610
|
handler=schema.handler,
|
|
2559
2611
|
transition_to=schema.transition_to,
|
|
2560
2612
|
transition_callback=schema.transition_callback,
|
|
2613
|
+
state_update_keys=schema.state_update_keys,
|
|
2561
2614
|
)
|
|
2562
2615
|
|
|
2563
2616
|
async def register_direct_function(func):
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/types.py
RENAMED
|
@@ -273,6 +273,12 @@ class FlowsFunctionSchema:
|
|
|
273
273
|
handler: Optional[FunctionHandler] = None
|
|
274
274
|
transition_to: Optional[str] = None
|
|
275
275
|
transition_callback: Optional[Callable] = None
|
|
276
|
+
# When the LLM calls this function, copy these keys from
|
|
277
|
+
# ``params.arguments`` into ``flow_manager.state`` BEFORE the transition
|
|
278
|
+
# resolves. Used by backend wiring to flatten ``agent_node → llm_router``
|
|
279
|
+
# transitions and still propagate the router's ``router_extract``
|
|
280
|
+
# variables (e.g. ``language``) into state. Empty/None = no-op.
|
|
281
|
+
state_update_keys: Optional[List[str]] = None
|
|
276
282
|
|
|
277
283
|
def __post_init__(self):
|
|
278
284
|
"""Validate the schema configuration.
|
|
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
|
|
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
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/canvas.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/editorState.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/sidePanel.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/toolbar.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/baseNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/endNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/flowNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/functionNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/index.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/mergeNode.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/startNode.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/export.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/helpers.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/import.js
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/validation.js
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/package-lock.json
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/postcss.config.cjs
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.png
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.svg
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/editor/tailwind.config.cjs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/engine_primitives_plan.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/images/food-ordering-flow.png
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/README.md
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/rtp.conf
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/scripts/check-pypi-package.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
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/__init__.py
RENAMED
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/adapters.py
RENAMED
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dv_pipecat_flows-0.0.22.dev2100 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/router_mode.py
RENAMED
|
File without changes
|
|
File without changes
|