dv-pipecat-flows 0.0.22.dev1900__tar.gz → 0.0.22.dev2000__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.dev1900/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.22.dev2000}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/manager.py +66 -41
  4. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.agents/skills/loki-logs/SKILL.md +0 -0
  5. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.agents/skills/loki-logs/query-reference.md +0 -0
  6. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.claude/skills/loki-logs/SKILL.md +0 -0
  7. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.claude/skills/loki-logs/query-reference.md +0 -0
  8. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.gitattributes +0 -0
  9. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.gitignore +0 -0
  10. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.pre-commit-config.yaml +0 -0
  11. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.python-version +0 -0
  12. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/.readthedocs.yaml +0 -0
  13. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/AGENTS.md +0 -0
  14. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/CHANGELOG.md +0 -0
  15. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/CLAUDE.md +0 -0
  16. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/CONTRIBUTING.md +0 -0
  17. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/LICENSE +0 -0
  18. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/MANIFEST.in +0 -0
  19. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/README.md +0 -0
  20. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/dev-requirements.txt +0 -0
  21. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/docker-compose.dev.yml +0 -0
  22. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/.eslintrc.json +0 -0
  23. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/.prettierrc +0 -0
  24. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/css/tailwind.css +0 -0
  25. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/examples/food_ordering.json +0 -0
  26. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/examples/movie_explorer.json +0 -0
  27. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/examples/patient_intake.json +0 -0
  28. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/examples/restaurant_reservation.json +0 -0
  29. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/examples/travel_planner.json +0 -0
  30. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/favicon.png +0 -0
  31. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/favicon.svg +0 -0
  32. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/index.html +0 -0
  33. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/editor/canvas.js +0 -0
  34. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/editor/editorState.js +0 -0
  35. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/editor/sidePanel.js +0 -0
  36. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/editor/toolbar.js +0 -0
  37. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/main.js +0 -0
  38. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/baseNode.js +0 -0
  39. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/endNode.js +0 -0
  40. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/flowNode.js +0 -0
  41. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/functionNode.js +0 -0
  42. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/index.js +0 -0
  43. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/mergeNode.js +0 -0
  44. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/nodes/startNode.js +0 -0
  45. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/types.js +0 -0
  46. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/utils/export.js +0 -0
  47. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/utils/helpers.js +0 -0
  48. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/utils/import.js +0 -0
  49. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/js/utils/validation.js +0 -0
  50. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/jsdoc.json +0 -0
  51. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/package-lock.json +0 -0
  52. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/package.json +0 -0
  53. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/postcss.config.cjs +0 -0
  54. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/public/favicon.png +0 -0
  55. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/public/favicon.svg +0 -0
  56. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/tailwind.config.cjs +0 -0
  57. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/vercel.json +0 -0
  58. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/editor/vite.config.js +0 -0
  59. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/engine_primitives_plan.md +0 -0
  60. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/env.example +0 -0
  61. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/images/food-ordering-flow.png +0 -0
  62. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/pipecat-flows.png +0 -0
  63. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/pipecat_upgrade.md +0 -0
  64. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/pyproject.toml +0 -0
  65. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/remote-asterisk-code/README.md +0 -0
  66. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/remote-asterisk-code/extensions.conf +0 -0
  67. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/remote-asterisk-code/rtp.conf +0 -0
  68. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/requirements.txt +0 -0
  69. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/scripts/check-pypi-package.py +0 -0
  70. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/scripts/fix-ruff.sh +0 -0
  71. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/scripts/pre-commit.sh +0 -0
  72. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/setup.cfg +0 -0
  73. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  74. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  75. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  76. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  77. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/__init__.py +0 -0
  78. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/actions.py +0 -0
  79. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/adapters.py +0 -0
  80. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/condition_evaluator.py +0 -0
  81. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/exceptions.py +0 -0
  82. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/flow_validator.py +0 -0
  83. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/processors/__init__.py +0 -0
  84. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  85. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  86. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  87. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/router_mode.py +0 -0
  88. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/src/pipecat_flows/types.py +0 -0
  89. {dv_pipecat_flows-0.0.22.dev1900 → dv_pipecat_flows-0.0.22.dev2000}/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.dev1900
3
+ Version: 0.0.22.dev2000
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.dev1900
3
+ Version: 0.0.22.dev2000
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
@@ -2075,22 +2075,69 @@ In all of these cases, you can provide a `name` in your new node's config for de
2075
2075
  previous_node_id = self._current_node
2076
2076
  router_pick = self._last_router_pick
2077
2077
  self._last_router_pick = None
2078
+ # In v2 deterministic lowering, ``FlowConfig.nodes`` is keyed by
2079
+ # ``node.name`` (see calling/flow_builder_v2.py:214), and
2080
+ # ``self._current_node`` stores that same dict key — so
2081
+ # ``previous_node_id`` IS the previous node's name. No lookup
2082
+ # against ``self._nodes`` needed. Backend's
2083
+ # ``tools/helper.py:build_tool_call_log_response`` matches these
2084
+ # against ``AgentVersionNode.name → label`` to populate
2085
+ # source_node_label / target_node_label for the FE pill.
2078
2086
  transition_tool_name = f"transition_to_{node_id}"
2079
- transition_args: Dict[str, Any] = {
2080
- "from_node_id": previous_node_id,
2081
- "to_node_id": node_id,
2082
- }
2083
- if router_pick:
2084
- transition_args.update(router_pick)
2085
- transition_call_id = await start_tracking(
2086
- transcript_handler=getattr(self, "_transcript_handler", None),
2087
- tool_name=transition_tool_name,
2088
- args=transition_args,
2089
- tool_phase="on_call",
2090
- tool_type="transition",
2091
- current_node=previous_node_id,
2092
- logger=logger,
2093
- )
2087
+ transition_call_id: Optional[str] = None
2088
+ # Skip the initial node entry — it's not a transition (no prior
2089
+ # node) and the FE pill would render as "Unknown → X" with no
2090
+ # useful information. Also skip in static-flow init paths where
2091
+ # the engine briefly _set_nodes the same node twice during setup.
2092
+ # Log atomically (start + complete back-to-back at the TOP of
2093
+ # _set_node) so each entry always has executed_at set. Earlier
2094
+ # design held the start_tracking call open until the bottom of
2095
+ # _set_node, but in deep auto_transition chains (Speak→Router→
2096
+ # Speak→End) the outer _set_node calls often never reach their
2097
+ # complete_tracking because End's hangup tears down the call
2098
+ # mid-chain — leaving stub entries with null status/latency/
2099
+ # executed_at. Atomic logging makes every transition self-
2100
+ # contained: zero risk of half-baked entries shipping to history.
2101
+ if previous_node_id is not None and previous_node_id != node_id:
2102
+ transition_args: Dict[str, Any] = {
2103
+ "from_node_id": previous_node_id,
2104
+ "to_node_id": node_id,
2105
+ # FE pill key aliases consumed by CallTranscriptViewer.
2106
+ "source_node": previous_node_id,
2107
+ "target_node": node_id,
2108
+ }
2109
+ if router_pick:
2110
+ transition_args.update(router_pick)
2111
+ logger.info(
2112
+ f"[node_transition] from={previous_node_id} to={node_id} "
2113
+ f"router_pick={router_pick}"
2114
+ )
2115
+ transition_call_id = await start_tracking(
2116
+ transcript_handler=getattr(self, "_transcript_handler", None),
2117
+ tool_name=transition_tool_name,
2118
+ args=transition_args,
2119
+ tool_phase="on_call",
2120
+ # `node_transition` matches the FE's filter in
2121
+ # components/call-details/CallTranscriptViewer.tsx so this
2122
+ # renders as a NodeTransitionDivider pill rather than a
2123
+ # generic tool pill.
2124
+ tool_type="node_transition",
2125
+ current_node=previous_node_id,
2126
+ logger=logger,
2127
+ )
2128
+ # Atomic completion right after start — see comment above.
2129
+ await complete_tracking(
2130
+ transcript_handler=getattr(self, "_transcript_handler", None),
2131
+ function_call_id=transition_call_id,
2132
+ tool_name=transition_tool_name,
2133
+ function_start_time=transition_start_time,
2134
+ response_data={
2135
+ "to_node_id": node_id,
2136
+ "from_node_id": previous_node_id,
2137
+ },
2138
+ status_code=200,
2139
+ logger=logger,
2140
+ )
2094
2141
 
2095
2142
  try:
2096
2143
  # Clear any pending transition state when starting a new node
@@ -2508,19 +2555,10 @@ In all of these cases, you can provide a `name` in your new node's config for de
2508
2555
 
2509
2556
  # node_entered observer is now emitted at the *top* of _set_node
2510
2557
  # so short-circuit paths (auto_transition / router-mode) get it too.
2511
-
2512
- await complete_tracking(
2513
- transcript_handler=getattr(self, "_transcript_handler", None),
2514
- function_call_id=transition_call_id,
2515
- tool_name=transition_tool_name,
2516
- function_start_time=transition_start_time,
2517
- response_data={
2518
- "to_node_id": node_id,
2519
- "to_node_label": node_config.get("label"),
2520
- },
2521
- status_code=200,
2522
- logger=logger,
2523
- )
2558
+ # Transition tool-log is also emitted atomically at the top of
2559
+ # _set_node (right after `previous_node_id` capture) — no
2560
+ # complete_tracking needed here, deferred completion was
2561
+ # unreliable for outer nodes when the call ended mid-chain.
2524
2562
 
2525
2563
  except Exception as e:
2526
2564
  # If setup crashed inside an uninterruptible node, the guard is
@@ -2532,19 +2570,6 @@ In all of these cases, you can provide a `name` in your new node's config for de
2532
2570
  except Exception:
2533
2571
  pass
2534
2572
  logger.error(f"Error setting node {node_id}: {str(e)}")
2535
- try:
2536
- await complete_tracking(
2537
- transcript_handler=getattr(self, "_transcript_handler", None),
2538
- function_call_id=transition_call_id,
2539
- tool_name=transition_tool_name,
2540
- function_start_time=transition_start_time,
2541
- response_data=None,
2542
- status_code=500,
2543
- error_details={"error": str(e), "type": type(e).__name__},
2544
- logger=logger,
2545
- )
2546
- except Exception as track_exc:
2547
- logger.warning(f"complete_tracking failed for {transition_tool_name}: {track_exc!r}")
2548
2573
  raise FlowError(f"Failed to set node {node_id}: {str(e)}") from e
2549
2574
 
2550
2575
  def _schedule_deferred_post_actions(self, post_actions: List[ActionConfig]) -> None: