dv-pipecat-flows 0.0.22.dev2200__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.
Files changed (89) hide show
  1. {dv_pipecat_flows-0.0.22.dev2200/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.22.dev2300}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/actions.py +53 -0
  4. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.agents/skills/loki-logs/SKILL.md +0 -0
  5. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.agents/skills/loki-logs/query-reference.md +0 -0
  6. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.claude/skills/loki-logs/SKILL.md +0 -0
  7. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.claude/skills/loki-logs/query-reference.md +0 -0
  8. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.gitattributes +0 -0
  9. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.gitignore +0 -0
  10. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.pre-commit-config.yaml +0 -0
  11. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.python-version +0 -0
  12. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/.readthedocs.yaml +0 -0
  13. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/AGENTS.md +0 -0
  14. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/CHANGELOG.md +0 -0
  15. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/CLAUDE.md +0 -0
  16. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/CONTRIBUTING.md +0 -0
  17. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/LICENSE +0 -0
  18. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/MANIFEST.in +0 -0
  19. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/README.md +0 -0
  20. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/dev-requirements.txt +0 -0
  21. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/docker-compose.dev.yml +0 -0
  22. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/.eslintrc.json +0 -0
  23. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/.prettierrc +0 -0
  24. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/css/tailwind.css +0 -0
  25. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/food_ordering.json +0 -0
  26. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/movie_explorer.json +0 -0
  27. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/patient_intake.json +0 -0
  28. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/restaurant_reservation.json +0 -0
  29. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/examples/travel_planner.json +0 -0
  30. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/favicon.png +0 -0
  31. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/favicon.svg +0 -0
  32. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/index.html +0 -0
  33. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/canvas.js +0 -0
  34. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/editorState.js +0 -0
  35. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/sidePanel.js +0 -0
  36. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/editor/toolbar.js +0 -0
  37. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/main.js +0 -0
  38. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/baseNode.js +0 -0
  39. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/endNode.js +0 -0
  40. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/flowNode.js +0 -0
  41. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/functionNode.js +0 -0
  42. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/index.js +0 -0
  43. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/mergeNode.js +0 -0
  44. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/nodes/startNode.js +0 -0
  45. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/types.js +0 -0
  46. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/export.js +0 -0
  47. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/helpers.js +0 -0
  48. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/import.js +0 -0
  49. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/js/utils/validation.js +0 -0
  50. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/jsdoc.json +0 -0
  51. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/package-lock.json +0 -0
  52. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/package.json +0 -0
  53. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/postcss.config.cjs +0 -0
  54. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.png +0 -0
  55. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/public/favicon.svg +0 -0
  56. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/tailwind.config.cjs +0 -0
  57. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/vercel.json +0 -0
  58. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/editor/vite.config.js +0 -0
  59. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/engine_primitives_plan.md +0 -0
  60. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/env.example +0 -0
  61. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/images/food-ordering-flow.png +0 -0
  62. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/pipecat-flows.png +0 -0
  63. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/pipecat_upgrade.md +0 -0
  64. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/pyproject.toml +0 -0
  65. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/README.md +0 -0
  66. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/extensions.conf +0 -0
  67. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/remote-asterisk-code/rtp.conf +0 -0
  68. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/requirements.txt +0 -0
  69. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/scripts/check-pypi-package.py +0 -0
  70. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/scripts/fix-ruff.sh +0 -0
  71. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/scripts/pre-commit.sh +0 -0
  72. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/setup.cfg +0 -0
  73. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  74. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  75. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  76. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  77. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/__init__.py +0 -0
  78. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/adapters.py +0 -0
  79. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/condition_evaluator.py +0 -0
  80. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/exceptions.py +0 -0
  81. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/flow_validator.py +0 -0
  82. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/manager.py +0 -0
  83. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/__init__.py +0 -0
  84. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  85. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  86. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  87. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/router_mode.py +0 -0
  88. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/src/pipecat_flows/types.py +0 -0
  89. {dv_pipecat_flows-0.0.22.dev2200 → dv_pipecat_flows-0.0.22.dev2300}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-flows
3
- Version: 0.0.22.dev2200
3
+ Version: 0.0.22.dev2300
4
4
  Summary: Conversation Flow management for Pipecat AI applications
5
5
  License: BSD 2-Clause License
6
6
  Project-URL: Source, https://github.com/pipecat-ai/pipecat-flows
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-flows
3
- Version: 0.0.22.dev2200
3
+ Version: 0.0.22.dev2300
4
4
  Summary: Conversation Flow management for Pipecat AI applications
5
5
  License: BSD 2-Clause License
6
6
  Project-URL: Source, https://github.com/pipecat-ai/pipecat-flows
@@ -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)