dv-pipecat-flows 0.0.0.dev2245__tar.gz → 0.0.0.dev2248__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 (114) hide show
  1. {dv_pipecat_flows-0.0.0.dev2245/src/dv_pipecat_flows.egg-info → dv_pipecat_flows-0.0.0.dev2248}/PKG-INFO +1 -1
  2. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248/src/dv_pipecat_flows.egg-info}/PKG-INFO +1 -1
  3. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/condition_evaluator.py +29 -7
  4. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.agents/skills/loki-logs/SKILL.md +0 -0
  5. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.agents/skills/loki-logs/query-reference.md +0 -0
  6. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.claude/skills/loki-logs/SKILL.md +0 -0
  7. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.claude/skills/loki-logs/query-reference.md +0 -0
  8. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.gitattributes +0 -0
  9. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.gitignore +0 -0
  10. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.pre-commit-config.yaml +0 -0
  11. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.python-version +0 -0
  12. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/.readthedocs.yaml +0 -0
  13. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/AGENTS.md +0 -0
  14. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/CHANGELOG.md +0 -0
  15. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/CLAUDE.md +0 -0
  16. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/CONTRIBUTING.md +0 -0
  17. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/LICENSE +0 -0
  18. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/MANIFEST.in +0 -0
  19. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/README.md +0 -0
  20. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/dev-requirements.txt +0 -0
  21. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/docker-compose.dev.yml +0 -0
  22. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/.eslintrc.json +0 -0
  23. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/.prettierrc +0 -0
  24. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/css/tailwind.css +0 -0
  25. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/examples/food_ordering.json +0 -0
  26. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/examples/movie_explorer.json +0 -0
  27. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/examples/patient_intake.json +0 -0
  28. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/examples/restaurant_reservation.json +0 -0
  29. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/examples/travel_planner.json +0 -0
  30. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/favicon.png +0 -0
  31. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/favicon.svg +0 -0
  32. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/index.html +0 -0
  33. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/editor/canvas.js +0 -0
  34. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/editor/editorState.js +0 -0
  35. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/editor/sidePanel.js +0 -0
  36. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/editor/toolbar.js +0 -0
  37. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/main.js +0 -0
  38. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/baseNode.js +0 -0
  39. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/endNode.js +0 -0
  40. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/flowNode.js +0 -0
  41. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/functionNode.js +0 -0
  42. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/index.js +0 -0
  43. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/mergeNode.js +0 -0
  44. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/nodes/startNode.js +0 -0
  45. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/types.js +0 -0
  46. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/utils/export.js +0 -0
  47. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/utils/helpers.js +0 -0
  48. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/utils/import.js +0 -0
  49. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/js/utils/validation.js +0 -0
  50. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/jsdoc.json +0 -0
  51. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/package-lock.json +0 -0
  52. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/package.json +0 -0
  53. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/postcss.config.cjs +0 -0
  54. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/public/favicon.png +0 -0
  55. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/public/favicon.svg +0 -0
  56. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/tailwind.config.cjs +0 -0
  57. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/vercel.json +0 -0
  58. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/editor/vite.config.js +0 -0
  59. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/engine_primitives_plan.md +0 -0
  60. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/env.example +0 -0
  61. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/.gitignore +0 -0
  62. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/README.md +0 -0
  63. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/RESULTS.md +0 -0
  64. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/UNIFIED_KB_BENCHMARKS.md +0 -0
  65. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/chunkers.py +0 -0
  66. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/contracts.py +0 -0
  67. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datagen/generate_corpus.py +0 -0
  68. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datagen/generate_dataset.py +0 -0
  69. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datagen/generate_hybrid.py +0 -0
  70. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datagen/templates/insurance.yaml +0 -0
  71. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datasets/.gitignore +0 -0
  72. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datasets/v1_hybrid/manifest.json +0 -0
  73. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datasets/v1_retrieval/manifest.json +0 -0
  74. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datasets/v1_retrieval_long/manifest.json +0 -0
  75. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/datasets/v1_synthetic/manifest.json +0 -0
  76. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_filter_pick.py +0 -0
  77. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_filter_scaling.py +0 -0
  78. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_hybrid.py +0 -0
  79. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_latency.py +0 -0
  80. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_rerank.py +0 -0
  81. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/runners/run_retrieval.py +0 -0
  82. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/service/API.md +0 -0
  83. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/service/__init__.py +0 -0
  84. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/service/app.py +0 -0
  85. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/evals/kb/service/jobs.py +0 -0
  86. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/images/food-ordering-flow.png +0 -0
  87. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/pipecat-flows.png +0 -0
  88. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/pipecat_upgrade.md +0 -0
  89. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/pyproject.toml +0 -0
  90. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/remote-asterisk-code/README.md +0 -0
  91. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/remote-asterisk-code/extensions.conf +0 -0
  92. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/remote-asterisk-code/rtp.conf +0 -0
  93. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/requirements.txt +0 -0
  94. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/scripts/check-pypi-package.py +0 -0
  95. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/scripts/fix-ruff.sh +0 -0
  96. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/scripts/pre-commit.sh +0 -0
  97. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/setup.cfg +0 -0
  98. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/dv_pipecat_flows.egg-info/SOURCES.txt +0 -0
  99. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/dv_pipecat_flows.egg-info/dependency_links.txt +0 -0
  100. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/dv_pipecat_flows.egg-info/requires.txt +0 -0
  101. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/dv_pipecat_flows.egg-info/top_level.txt +0 -0
  102. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/__init__.py +0 -0
  103. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/actions.py +0 -0
  104. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/adapters.py +0 -0
  105. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/exceptions.py +0 -0
  106. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/flow_validator.py +0 -0
  107. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/manager.py +0 -0
  108. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/processors/__init__.py +0 -0
  109. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/processors/router_mode_guard.py +0 -0
  110. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/processors/speak_interruption_guard.py +0 -0
  111. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/processors/user_turn_observer.py +0 -0
  112. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/router_mode.py +0 -0
  113. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/src/pipecat_flows/types.py +0 -0
  114. {dv_pipecat_flows-0.0.0.dev2245 → dv_pipecat_flows-0.0.0.dev2248}/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.dev2245
3
+ Version: 0.0.0.dev2248
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.dev2245
3
+ Version: 0.0.0.dev2248
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
@@ -37,6 +37,12 @@ Null/type policy:
37
37
  * ``null == "paid"`` -> False (no equality between None and a non-None RHS).
38
38
  * ``exists`` returns True only when the resolved value is non-None and
39
39
  non-empty-string; ``not_exists`` is its inverse.
40
+
41
+ Case sensitivity:
42
+ String comparisons (``equals``, ``not_equals``, ``contains``, ``in``) are
43
+ case-INsensitive. LLM-extracted values are inconsistently cased
44
+ ("Yes"/"yes"/"YES") and authors write conditions in one form. Numeric and
45
+ null-shape ops (``greater_than`` etc., ``exists``) are unaffected.
40
46
  """
41
47
 
42
48
  from __future__ import annotations
@@ -150,6 +156,12 @@ def _coerce_numeric(value: Any) -> Optional[float]:
150
156
  return None
151
157
 
152
158
 
159
+ def _ci_str(value: Any) -> Any:
160
+ """Lowercase a string for case-insensitive comparison; pass non-strings
161
+ through unchanged. Used by string ops below."""
162
+ return value.lower() if isinstance(value, str) else value
163
+
164
+
153
165
  def _evaluate_rule(
154
166
  rule: Rule,
155
167
  state: Dict[str, Any],
@@ -192,14 +204,20 @@ def _evaluate_rule(
192
204
  lhs_num, rhs_num = _coerce_numeric(lhs), _coerce_numeric(rhs)
193
205
  if lhs_num is not None and rhs_num is not None:
194
206
  return lhs_num == rhs_num
195
- return str(lhs) == str(rhs)
207
+ # String compare is case-INsensitive — LLM-extracted values are
208
+ # inconsistently cased ("Yes"/"yes"/"YES") and authors write conditions
209
+ # in one form. NOTE: this is a behavior change — agents that relied on
210
+ # case to distinguish (e.g. "Apple" vs "apple" as different categories)
211
+ # will now treat them as equal. ``not_equals`` likewise inverts for
212
+ # case-only-different values.
213
+ return _ci_str(str(lhs)) == _ci_str(str(rhs))
196
214
  if op == "not_equals":
197
215
  if lhs is None:
198
216
  return rhs is not None # None != anything-non-None
199
217
  lhs_num, rhs_num = _coerce_numeric(lhs), _coerce_numeric(rhs)
200
218
  if lhs_num is not None and rhs_num is not None:
201
219
  return lhs_num != rhs_num
202
- return str(lhs) != str(rhs)
220
+ return _ci_str(str(lhs)) != _ci_str(str(rhs))
203
221
 
204
222
  if op in ("greater_than", "less_than", "greater_or_equal", "less_or_equal"):
205
223
  lhs_num, rhs_num = _coerce_numeric(lhs), _coerce_numeric(rhs)
@@ -214,24 +232,28 @@ def _evaluate_rule(
214
232
  return lhs_num <= rhs_num # less_or_equal
215
233
 
216
234
  if op == "contains":
217
- # Strings: substring; lists: membership.
235
+ # Strings: substring; lists: membership. Strings are case-insensitive
236
+ # (see ``equals`` rationale); list membership lowercases string
237
+ # elements so ``["Yes", "No"] contains "yes"`` matches.
218
238
  if lhs is None:
219
239
  return False
220
240
  if isinstance(lhs, str):
221
- return str(rhs) in lhs
241
+ return _ci_str(str(rhs)) in _ci_str(lhs)
222
242
  if isinstance(lhs, (list, tuple, set)):
223
- return rhs in lhs
243
+ rhs_ci = _ci_str(rhs)
244
+ return any(_ci_str(item) == rhs_ci for item in lhs)
224
245
  return False
225
246
 
226
247
  if op == "in":
227
248
  # `variable IN value` — value is the haystack (list or comma-string).
228
249
  if rhs is None:
229
250
  return False
251
+ lhs_ci = _ci_str(lhs)
230
252
  if isinstance(rhs, (list, tuple, set)):
231
- return lhs in rhs
253
+ return any(_ci_str(item) == lhs_ci for item in rhs)
232
254
  if isinstance(rhs, str):
233
255
  # Comma-separated convenience: "en,hi,es".
234
- return str(lhs) in [s.strip() for s in rhs.split(",")]
256
+ return _ci_str(str(lhs)) in [_ci_str(s.strip()) for s in rhs.split(",")]
235
257
  return False
236
258
 
237
259
  return False