dv-pipecat-flows 0.0.23.dev3__tar.gz → 0.0.23.dev5__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 (91) hide show
  1. {dv_pipecat_flows-0.0.23.dev3/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.23.dev5}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/actions.py +2 -2
  4. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/manager.py +39 -3
  5. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.agents/skills/loki-logs/SKILL.md +0 -0
  6. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.agents/skills/loki-logs/query-reference.md +0 -0
  7. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.claude/skills/loki-logs/SKILL.md +0 -0
  8. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.claude/skills/loki-logs/query-reference.md +0 -0
  9. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.gitattributes +0 -0
  10. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.gitignore +0 -0
  11. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.pre-commit-config.yaml +0 -0
  12. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.python-version +0 -0
  13. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/.readthedocs.yaml +0 -0
  14. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/AGENTS.md +0 -0
  15. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/CHANGELOG.md +0 -0
  16. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/CLAUDE.md +0 -0
  17. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/CONTRIBUTING.md +0 -0
  18. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/LICENSE +0 -0
  19. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/MANIFEST.in +0 -0
  20. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/README.md +0 -0
  21. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/dev-requirements.txt +0 -0
  22. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/docker-compose.dev.yml +0 -0
  23. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/.eslintrc.json +0 -0
  24. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/.prettierrc +0 -0
  25. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/css/tailwind.css +0 -0
  26. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/examples/food_ordering.json +0 -0
  27. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/examples/movie_explorer.json +0 -0
  28. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/examples/patient_intake.json +0 -0
  29. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/examples/restaurant_reservation.json +0 -0
  30. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/examples/travel_planner.json +0 -0
  31. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/favicon.png +0 -0
  32. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/favicon.svg +0 -0
  33. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/index.html +0 -0
  34. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/editor/canvas.js +0 -0
  35. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/editor/editorState.js +0 -0
  36. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/editor/sidePanel.js +0 -0
  37. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/editor/toolbar.js +0 -0
  38. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/main.js +0 -0
  39. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/baseNode.js +0 -0
  40. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/endNode.js +0 -0
  41. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/flowNode.js +0 -0
  42. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/functionNode.js +0 -0
  43. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/index.js +0 -0
  44. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/mergeNode.js +0 -0
  45. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/nodes/startNode.js +0 -0
  46. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/types.js +0 -0
  47. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/utils/export.js +0 -0
  48. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/utils/helpers.js +0 -0
  49. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/utils/import.js +0 -0
  50. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/js/utils/validation.js +0 -0
  51. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/jsdoc.json +0 -0
  52. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/package-lock.json +0 -0
  53. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/package.json +0 -0
  54. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/postcss.config.cjs +0 -0
  55. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/public/favicon.png +0 -0
  56. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/public/favicon.svg +0 -0
  57. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/tailwind.config.cjs +0 -0
  58. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/vercel.json +0 -0
  59. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/editor/vite.config.js +0 -0
  60. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/engine_primitives_plan.md +0 -0
  61. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/env.example +0 -0
  62. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/images/food-ordering-flow.png +0 -0
  63. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/pipecat-flows.png +0 -0
  64. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/pipecat_upgrade.md +0 -0
  65. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/pyproject.toml +0 -0
  66. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/remote-asterisk-code/README.md +0 -0
  67. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/remote-asterisk-code/extensions.conf +0 -0
  68. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/remote-asterisk-code/rtp.conf +0 -0
  69. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/requirements.txt +0 -0
  70. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/scripts/check-pypi-package.py +0 -0
  71. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/scripts/fix-ruff.sh +0 -0
  72. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/scripts/pre-commit.sh +0 -0
  73. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/setup.cfg +0 -0
  74. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  75. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  76. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  77. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/scm_file_list.json +0 -0
  78. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/scm_version.json +0 -0
  79. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  80. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/__init__.py +0 -0
  81. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/adapters.py +0 -0
  82. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/condition_evaluator.py +0 -0
  83. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/exceptions.py +0 -0
  84. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/flow_validator.py +0 -0
  85. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/processors/__init__.py +0 -0
  86. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  87. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  88. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  89. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/router_mode.py +0 -0
  90. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/src/pipecat_flows/types.py +0 -0
  91. {dv_pipecat_flows-0.0.23.dev3 → dv_pipecat_flows-0.0.23.dev5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-flows
3
- Version: 0.0.23.dev3
3
+ Version: 0.0.23.dev5
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.23.dev3
3
+ Version: 0.0.23.dev5
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
@@ -73,7 +73,7 @@ _EXTRACT_VAR_RE = re.compile(
73
73
  )
74
74
 
75
75
 
76
- def _substitute_extract_vars(text: str, state: dict) -> str:
76
+ def substitute_extract_vars(text: str, state: dict) -> str:
77
77
  """Replace ``[{var}]`` / ``@[{var}]`` occurrences with ``state[var]``.
78
78
 
79
79
  Supports dotted paths (``[{user.name}]``). Unknown variables (key not
@@ -483,7 +483,7 @@ class ActionManager:
483
483
  # text_raw stays unrendered so the split-cache's prefix derivation
484
484
  # remains stable across calls.
485
485
  state = self._flow_manager.state if isinstance(self._flow_manager.state, dict) else {}
486
- text = _substitute_extract_vars(text, state)
486
+ text = substitute_extract_vars(text, state)
487
487
 
488
488
  await self._maybe_switch_tts_service_for_action(action)
489
489
 
@@ -71,7 +71,7 @@ from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
71
71
  from pipecat.services.llm_service import FunctionCallParams
72
72
  from pipecat.transports.base_transport import BaseTransport
73
73
 
74
- from pipecat_flows.actions import ActionError, ActionManager
74
+ from pipecat_flows.actions import ActionError, ActionManager, substitute_extract_vars
75
75
  from pipecat_flows.adapters import create_adapter
76
76
  from pipecat_flows.condition_evaluator import evaluate_conditions
77
77
  from pipecat_flows.exceptions import (
@@ -832,9 +832,15 @@ class FlowManager:
832
832
  )
833
833
  else:
834
834
  # Node function - defer to pipecat's default run_llm logic
835
- # This waits for all parallel function calls to complete
835
+ # This waits for all parallel function calls to complete.
836
+ # A tool (e.g. a widget send) can opt out of the follow-up LLM
837
+ # completion by tagging its result with _suppress_followup_llm;
838
+ # pop it so the sentinel never leaks into the LLM context.
839
+ suppress_followup_llm = (
840
+ isinstance(result, dict) and result.pop("_suppress_followup_llm", False)
841
+ )
836
842
  properties = FunctionCallResultProperties(
837
- run_llm=None,
843
+ run_llm=False if suppress_followup_llm else None,
838
844
  on_context_updated=None,
839
845
  )
840
846
 
@@ -4071,6 +4077,31 @@ In all of these cases, you can provide a `name` in your new node's config for de
4071
4077
  """Generate a conversation summary from a given context."""
4072
4078
  return await self._adapter.generate_summary(self._llm, summary_prompt, context)
4073
4079
 
4080
+ def _resolve_extract_tokens(
4081
+ self, messages: Optional[List[dict]]
4082
+ ) -> Optional[List[dict]]:
4083
+ """Substitute ``[{name}]`` extract tokens in message content from
4084
+ ``self.state``.
4085
+
4086
+ Router/agent nodes write their extracted values into ``self.state`` at
4087
+ runtime; the backend lowerer only resolves compile-time vars
4088
+ (custom_args, api_responses), so a downstream node's role/task prompt
4089
+ that references an extracted value would otherwise reach the LLM as a
4090
+ literal ``[{name}]`` marker. Mirrors the Speak/tts_say pass in
4091
+ ``actions.substitute_extract_vars``. Returns shallow copies so the
4092
+ source NodeConfig messages stay in token form for the next entry;
4093
+ unknown keys are left literal.
4094
+ """
4095
+ if not messages:
4096
+ return messages
4097
+ resolved: List[dict] = []
4098
+ for message in messages:
4099
+ content = message.get("content") if isinstance(message, dict) else None
4100
+ if isinstance(content, str) and "[{" in content:
4101
+ message = {**message, "content": substitute_extract_vars(content, self.state)}
4102
+ resolved.append(message)
4103
+ return resolved
4104
+
4074
4105
  async def _update_llm_context(
4075
4106
  self,
4076
4107
  role_messages: Optional[List[dict]],
@@ -4096,6 +4127,11 @@ In all of these cases, you can provide a `name` in your new node's config for de
4096
4127
  try:
4097
4128
  messages = []
4098
4129
 
4130
+ # Resolve runtime ``[{name}]`` extract tokens against self.state
4131
+ # before the prompts enter context (see _resolve_extract_tokens).
4132
+ role_messages = self._resolve_extract_tokens(role_messages)
4133
+ task_messages = self._resolve_extract_tokens(task_messages)
4134
+
4099
4135
  # Add role messages if provided.
4100
4136
  # Note that these come before any possible summary message; some
4101
4137
  # LLMs only support a single system instruction, and the first role