dv-pipecat-flows 0.0.0.dev2072__tar.gz → 0.0.0.dev2087__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 (115) hide show
  1. {dv_pipecat_flows-0.0.0.dev2072/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.0.dev2087}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/actions.py +29 -10
  4. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.agents/skills/loki-logs/SKILL.md +0 -0
  5. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.agents/skills/loki-logs/query-reference.md +0 -0
  6. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.claude/skills/loki-logs/SKILL.md +0 -0
  7. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.claude/skills/loki-logs/query-reference.md +0 -0
  8. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.gitattributes +0 -0
  9. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.gitignore +0 -0
  10. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.pre-commit-config.yaml +0 -0
  11. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.python-version +0 -0
  12. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/.readthedocs.yaml +0 -0
  13. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/AGENTS.md +0 -0
  14. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/CHANGELOG.md +0 -0
  15. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/CLAUDE.md +0 -0
  16. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/CONTRIBUTING.md +0 -0
  17. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/LICENSE +0 -0
  18. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/MANIFEST.in +0 -0
  19. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/README.md +0 -0
  20. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/dev-requirements.txt +0 -0
  21. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/docker-compose.dev.yml +0 -0
  22. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/.eslintrc.json +0 -0
  23. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/.prettierrc +0 -0
  24. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/css/tailwind.css +0 -0
  25. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/examples/food_ordering.json +0 -0
  26. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/examples/movie_explorer.json +0 -0
  27. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/examples/patient_intake.json +0 -0
  28. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/examples/restaurant_reservation.json +0 -0
  29. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/examples/travel_planner.json +0 -0
  30. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/favicon.png +0 -0
  31. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/favicon.svg +0 -0
  32. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/index.html +0 -0
  33. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/editor/canvas.js +0 -0
  34. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/editor/editorState.js +0 -0
  35. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/editor/sidePanel.js +0 -0
  36. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/editor/toolbar.js +0 -0
  37. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/main.js +0 -0
  38. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/baseNode.js +0 -0
  39. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/endNode.js +0 -0
  40. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/flowNode.js +0 -0
  41. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/functionNode.js +0 -0
  42. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/index.js +0 -0
  43. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/mergeNode.js +0 -0
  44. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/nodes/startNode.js +0 -0
  45. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/types.js +0 -0
  46. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/utils/export.js +0 -0
  47. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/utils/helpers.js +0 -0
  48. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/utils/import.js +0 -0
  49. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/js/utils/validation.js +0 -0
  50. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/jsdoc.json +0 -0
  51. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/package-lock.json +0 -0
  52. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/package.json +0 -0
  53. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/postcss.config.cjs +0 -0
  54. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/public/favicon.png +0 -0
  55. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/public/favicon.svg +0 -0
  56. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/tailwind.config.cjs +0 -0
  57. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/vercel.json +0 -0
  58. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/editor/vite.config.js +0 -0
  59. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/engine_primitives_plan.md +0 -0
  60. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/env.example +0 -0
  61. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/.gitignore +0 -0
  62. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/README.md +0 -0
  63. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/RESULTS.md +0 -0
  64. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/UNIFIED_KB_BENCHMARKS.md +0 -0
  65. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/chunkers.py +0 -0
  66. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/contracts.py +0 -0
  67. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datagen/generate_corpus.py +0 -0
  68. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datagen/generate_dataset.py +0 -0
  69. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datagen/generate_hybrid.py +0 -0
  70. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datagen/templates/insurance.yaml +0 -0
  71. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datasets/.gitignore +0 -0
  72. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datasets/v1_hybrid/manifest.json +0 -0
  73. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datasets/v1_retrieval/manifest.json +0 -0
  74. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datasets/v1_retrieval_long/manifest.json +0 -0
  75. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/datasets/v1_synthetic/manifest.json +0 -0
  76. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_filter_pick.py +0 -0
  77. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_filter_scaling.py +0 -0
  78. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_hybrid.py +0 -0
  79. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_latency.py +0 -0
  80. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_rerank.py +0 -0
  81. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/runners/run_retrieval.py +0 -0
  82. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/service/API.md +0 -0
  83. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/service/__init__.py +0 -0
  84. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/service/app.py +0 -0
  85. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/evals/kb/service/jobs.py +0 -0
  86. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/images/food-ordering-flow.png +0 -0
  87. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/pipecat-flows.png +0 -0
  88. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/pipecat_upgrade.md +0 -0
  89. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/pyproject.toml +0 -0
  90. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/remote-asterisk-code/README.md +0 -0
  91. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/remote-asterisk-code/extensions.conf +0 -0
  92. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/remote-asterisk-code/rtp.conf +0 -0
  93. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/requirements.txt +0 -0
  94. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/scripts/check-pypi-package.py +0 -0
  95. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/scripts/fix-ruff.sh +0 -0
  96. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/scripts/pre-commit.sh +0 -0
  97. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/setup.cfg +0 -0
  98. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  99. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  100. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  101. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  102. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/__init__.py +0 -0
  103. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/adapters.py +0 -0
  104. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/condition_evaluator.py +0 -0
  105. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/data_extractor.py +0 -0
  106. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/exceptions.py +0 -0
  107. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/flow_validator.py +0 -0
  108. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/manager.py +0 -0
  109. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/processors/__init__.py +0 -0
  110. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  111. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  112. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  113. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/router_mode.py +0 -0
  114. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/src/pipecat_flows/types.py +0 -0
  115. {dv_pipecat_flows-0.0.0.dev2072 → dv_pipecat_flows-0.0.0.dev2087}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dv-pipecat-flows
3
- Version: 0.0.0.dev2072
3
+ Version: 0.0.0.dev2087
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.0.dev2072
3
+ Version: 0.0.0.dev2087
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
@@ -312,11 +312,16 @@ class ActionManager:
312
312
 
313
313
  Args:
314
314
  action: Action configuration containing:
315
- - text: Text to speak (required)
315
+ - text: Text to speak (required, resolved)
316
+ - text_raw: Raw template with {{var}} markers (optional)
316
317
  - use_cache: Use caching for TTS audio (optional, default: False)
317
318
 
318
- Note: Caching functionality must be provided via dependency injection through
319
- flow_manager.state['say_with_cache_handler'] if use_cache=True.
319
+ Caching is opt-in via dependency injection: when use_cache=True and
320
+ flow_manager.state['say_with_cache_handler'] is set, the handler is
321
+ invoked as `await handler(text=..., text_raw=...) -> bool`. Returning
322
+ True means the handler served the audio downstream (and pushed an
323
+ ActionFinishedFrame downstream itself). Returning False (or raising)
324
+ falls back to live TTS via TTSSpeakFrame.
320
325
 
321
326
  To prevent the LLM from immediately responding after TTS in pre-actions,
322
327
  set respond_immediately=false in the node configuration.
@@ -327,18 +332,32 @@ class ActionManager:
327
332
  return
328
333
 
329
334
  use_cache = action.get("use_cache", False)
335
+ cache_handler = (
336
+ self._flow_manager.state.get("say_with_cache_handler") if use_cache else None
337
+ )
330
338
 
331
339
  try:
332
- # For now, always use the standard TTS path to avoid pipeline issues
333
- # Caching can be implemented at the TTS service level instead
334
-
335
340
  # Mark that we're starting the action
336
341
  self._increment_ongoing_actions_count()
337
342
 
338
- # Queue the TTS frame
339
- await self._task.queue_frame(TTSSpeakFrame(text=text))
340
-
341
- # Queue frame marking the end of the action
343
+ served_from_cache = False
344
+ if cache_handler is not None:
345
+ try:
346
+ text_raw = action.get("text_raw") or text
347
+ served_from_cache = bool(await cache_handler(text=text, text_raw=text_raw))
348
+ except Exception as e:
349
+ logger.error(f"tts_say cache handler raised, falling back to live TTS: {e}")
350
+ served_from_cache = False
351
+
352
+ if not served_from_cache:
353
+ # Live TTS path
354
+ await self._task.queue_frame(TTSSpeakFrame(text=text))
355
+
356
+ # Queue frame marking the end of the action. Even on the cached
357
+ # path this is safe: the frame is queued at the source and has to
358
+ # traverse the entire pipeline to reach our downstream filter,
359
+ # while the cached audio was pushed downstream of the TTS service
360
+ # and reaches the wire sooner.
342
361
  await self._task.queue_frame(ActionFinishedFrame())
343
362
 
344
363
  except Exception as e: