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