dv-pipecat-flows 0.0.22.dev2500__tar.gz → 0.0.22.dev2700__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.dev2500/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.22.dev2700}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/manager.py +41 -66
  4. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/uv.lock +109 -1185
  5. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.agents/skills/loki-logs/SKILL.md +0 -0
  6. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.agents/skills/loki-logs/query-reference.md +0 -0
  7. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.claude/skills/loki-logs/SKILL.md +0 -0
  8. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.claude/skills/loki-logs/query-reference.md +0 -0
  9. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.gitattributes +0 -0
  10. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.gitignore +0 -0
  11. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.pre-commit-config.yaml +0 -0
  12. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.python-version +0 -0
  13. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/.readthedocs.yaml +0 -0
  14. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/AGENTS.md +0 -0
  15. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/CHANGELOG.md +0 -0
  16. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/CLAUDE.md +0 -0
  17. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/CONTRIBUTING.md +0 -0
  18. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/LICENSE +0 -0
  19. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/MANIFEST.in +0 -0
  20. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/README.md +0 -0
  21. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/dev-requirements.txt +0 -0
  22. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/docker-compose.dev.yml +0 -0
  23. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/.eslintrc.json +0 -0
  24. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/.prettierrc +0 -0
  25. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/css/tailwind.css +0 -0
  26. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/examples/food_ordering.json +0 -0
  27. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/examples/movie_explorer.json +0 -0
  28. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/examples/patient_intake.json +0 -0
  29. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/examples/restaurant_reservation.json +0 -0
  30. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/examples/travel_planner.json +0 -0
  31. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/favicon.png +0 -0
  32. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/favicon.svg +0 -0
  33. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/index.html +0 -0
  34. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/editor/canvas.js +0 -0
  35. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/editor/editorState.js +0 -0
  36. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/editor/sidePanel.js +0 -0
  37. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/editor/toolbar.js +0 -0
  38. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/main.js +0 -0
  39. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/baseNode.js +0 -0
  40. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/endNode.js +0 -0
  41. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/flowNode.js +0 -0
  42. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/functionNode.js +0 -0
  43. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/index.js +0 -0
  44. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/mergeNode.js +0 -0
  45. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/nodes/startNode.js +0 -0
  46. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/types.js +0 -0
  47. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/utils/export.js +0 -0
  48. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/utils/helpers.js +0 -0
  49. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/utils/import.js +0 -0
  50. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/js/utils/validation.js +0 -0
  51. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/jsdoc.json +0 -0
  52. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/package-lock.json +0 -0
  53. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/package.json +0 -0
  54. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/postcss.config.cjs +0 -0
  55. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/public/favicon.png +0 -0
  56. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/public/favicon.svg +0 -0
  57. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/tailwind.config.cjs +0 -0
  58. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/vercel.json +0 -0
  59. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/editor/vite.config.js +0 -0
  60. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/engine_primitives_plan.md +0 -0
  61. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/env.example +0 -0
  62. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/images/food-ordering-flow.png +0 -0
  63. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/pipecat-flows.png +0 -0
  64. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/pipecat_upgrade.md +0 -0
  65. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/pyproject.toml +0 -0
  66. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/remote-asterisk-code/README.md +0 -0
  67. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/remote-asterisk-code/extensions.conf +0 -0
  68. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/remote-asterisk-code/rtp.conf +0 -0
  69. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/requirements.txt +0 -0
  70. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/scripts/check-pypi-package.py +0 -0
  71. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/scripts/fix-ruff.sh +0 -0
  72. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/scripts/pre-commit.sh +0 -0
  73. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/setup.cfg +0 -0
  74. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  75. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  76. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  77. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  78. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/__init__.py +0 -0
  79. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/actions.py +0 -0
  80. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/adapters.py +0 -0
  81. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/condition_evaluator.py +0 -0
  82. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/exceptions.py +0 -0
  83. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/flow_validator.py +0 -0
  84. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/processors/__init__.py +0 -0
  85. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  86. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  87. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  88. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/router_mode.py +0 -0
  89. {dv_pipecat_flows-0.0.22.dev2500 → dv_pipecat_flows-0.0.22.dev2700}/src/pipecat_flows/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-flows
3
- Version: 0.0.22.dev2500
3
+ Version: 0.0.22.dev2700
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.dev2500
3
+ Version: 0.0.22.dev2700
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
@@ -2234,69 +2234,22 @@ In all of these cases, you can provide a `name` in your new node's config for de
2234
2234
  previous_node_id = self._current_node
2235
2235
  router_pick = self._last_router_pick
2236
2236
  self._last_router_pick = None
2237
- # In v2 deterministic lowering, ``FlowConfig.nodes`` is keyed by
2238
- # ``node.name`` (see calling/flow_builder_v2.py:214), and
2239
- # ``self._current_node`` stores that same dict key — so
2240
- # ``previous_node_id`` IS the previous node's name. No lookup
2241
- # against ``self._nodes`` needed. Backend's
2242
- # ``tools/helper.py:build_tool_call_log_response`` matches these
2243
- # against ``AgentVersionNode.name → label`` to populate
2244
- # source_node_label / target_node_label for the FE pill.
2245
2237
  transition_tool_name = f"transition_to_{node_id}"
2246
- transition_call_id: Optional[str] = None
2247
- # Skip the initial node entry — it's not a transition (no prior
2248
- # node) and the FE pill would render as "Unknown → X" with no
2249
- # useful information. Also skip in static-flow init paths where
2250
- # the engine briefly _set_nodes the same node twice during setup.
2251
- # Log atomically (start + complete back-to-back at the TOP of
2252
- # _set_node) so each entry always has executed_at set. Earlier
2253
- # design held the start_tracking call open until the bottom of
2254
- # _set_node, but in deep auto_transition chains (Speak→Router→
2255
- # Speak→End) the outer _set_node calls often never reach their
2256
- # complete_tracking because End's hangup tears down the call
2257
- # mid-chain — leaving stub entries with null status/latency/
2258
- # executed_at. Atomic logging makes every transition self-
2259
- # contained: zero risk of half-baked entries shipping to history.
2260
- if previous_node_id is not None and previous_node_id != node_id:
2261
- transition_args: Dict[str, Any] = {
2262
- "from_node_id": previous_node_id,
2263
- "to_node_id": node_id,
2264
- # FE pill key aliases consumed by CallTranscriptViewer.
2265
- "source_node": previous_node_id,
2266
- "target_node": node_id,
2267
- }
2268
- if router_pick:
2269
- transition_args.update(router_pick)
2270
- logger.info(
2271
- f"[node_transition] from={previous_node_id} to={node_id} "
2272
- f"router_pick={router_pick}"
2273
- )
2274
- transition_call_id = await start_tracking(
2275
- transcript_handler=getattr(self, "_transcript_handler", None),
2276
- tool_name=transition_tool_name,
2277
- args=transition_args,
2278
- tool_phase="on_call",
2279
- # `node_transition` matches the FE's filter in
2280
- # components/call-details/CallTranscriptViewer.tsx so this
2281
- # renders as a NodeTransitionDivider pill rather than a
2282
- # generic tool pill.
2283
- tool_type="node_transition",
2284
- current_node=previous_node_id,
2285
- logger=logger,
2286
- )
2287
- # Atomic completion right after start — see comment above.
2288
- await complete_tracking(
2289
- transcript_handler=getattr(self, "_transcript_handler", None),
2290
- function_call_id=transition_call_id,
2291
- tool_name=transition_tool_name,
2292
- function_start_time=transition_start_time,
2293
- response_data={
2294
- "to_node_id": node_id,
2295
- "from_node_id": previous_node_id,
2296
- },
2297
- status_code=200,
2298
- logger=logger,
2299
- )
2238
+ transition_args: Dict[str, Any] = {
2239
+ "from_node_id": previous_node_id,
2240
+ "to_node_id": node_id,
2241
+ }
2242
+ if router_pick:
2243
+ transition_args.update(router_pick)
2244
+ transition_call_id = await start_tracking(
2245
+ transcript_handler=getattr(self, "_transcript_handler", None),
2246
+ tool_name=transition_tool_name,
2247
+ args=transition_args,
2248
+ tool_phase="on_call",
2249
+ tool_type="transition",
2250
+ current_node=previous_node_id,
2251
+ logger=logger,
2252
+ )
2300
2253
 
2301
2254
  try:
2302
2255
  # Clear any pending transition state when starting a new node
@@ -2790,10 +2743,19 @@ In all of these cases, you can provide a `name` in your new node's config for de
2790
2743
 
2791
2744
  # node_entered observer is now emitted at the *top* of _set_node
2792
2745
  # so short-circuit paths (auto_transition / router-mode) get it too.
2793
- # Transition tool-log is also emitted atomically at the top of
2794
- # _set_node (right after `previous_node_id` capture) — no
2795
- # complete_tracking needed here, deferred completion was
2796
- # unreliable for outer nodes when the call ended mid-chain.
2746
+
2747
+ await complete_tracking(
2748
+ transcript_handler=getattr(self, "_transcript_handler", None),
2749
+ function_call_id=transition_call_id,
2750
+ tool_name=transition_tool_name,
2751
+ function_start_time=transition_start_time,
2752
+ response_data={
2753
+ "to_node_id": node_id,
2754
+ "to_node_label": node_config.get("label"),
2755
+ },
2756
+ status_code=200,
2757
+ logger=logger,
2758
+ )
2797
2759
 
2798
2760
  except Exception as e:
2799
2761
  # If setup crashed inside an uninterruptible node, the guard is
@@ -2805,6 +2767,19 @@ In all of these cases, you can provide a `name` in your new node's config for de
2805
2767
  except Exception:
2806
2768
  pass
2807
2769
  logger.error(f"Error setting node {node_id}: {str(e)}")
2770
+ try:
2771
+ await complete_tracking(
2772
+ transcript_handler=getattr(self, "_transcript_handler", None),
2773
+ function_call_id=transition_call_id,
2774
+ tool_name=transition_tool_name,
2775
+ function_start_time=transition_start_time,
2776
+ response_data=None,
2777
+ status_code=500,
2778
+ error_details={"error": str(e), "type": type(e).__name__},
2779
+ logger=logger,
2780
+ )
2781
+ except Exception as track_exc:
2782
+ logger.warning(f"complete_tracking failed for {transition_tool_name}: {track_exc!r}")
2808
2783
  raise FlowError(f"Failed to set node {node_id}: {str(e)}") from e
2809
2784
 
2810
2785
  def _schedule_deferred_post_actions(self, post_actions: List[ActionConfig]) -> None: