soprano-sdk 0.2.17__tar.gz → 0.2.19__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 (109) hide show
  1. soprano_sdk-0.2.19/.claude/settings.local.json +7 -0
  2. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/PKG-INFO +1 -1
  3. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/pyproject.toml +1 -1
  4. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/agents/adaptor.py +5 -3
  5. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/authenticators/mfa.py +1 -1
  6. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_adaptor_logging.py +1 -1
  7. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/.github/workflows/test_build_and_publish.yaml +0 -0
  8. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/.gitignore +0 -0
  9. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/.python-version +0 -0
  10. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/CLAUDE.md +0 -0
  11. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/LICENSE +0 -0
  12. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/README.md +0 -0
  13. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/__init__.py +0 -0
  14. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/booking_helpers.py +0 -0
  15. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/concert_ticket_booking.yaml +0 -0
  16. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/concert_tools.py +0 -0
  17. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/example_runner.py +0 -0
  18. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/concert_booking/tool.py +0 -0
  19. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/framework_example.yaml +0 -0
  20. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/greeting_functions.py +0 -0
  21. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/greeting_workflow.yaml +0 -0
  22. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/main.py +0 -0
  23. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/payment_async_functions.py +0 -0
  24. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/payment_async_workflow.yaml +0 -0
  25. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/persistence/README.md +0 -0
  26. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/persistence/conversation_based.py +0 -0
  27. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/persistence/entity_based.py +0 -0
  28. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/persistence/mongodb_demo.py +0 -0
  29. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/return_functions.py +0 -0
  30. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/return_workflow.yaml +0 -0
  31. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/structured_output_example.yaml +0 -0
  32. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/README.md +0 -0
  33. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/crewai_supervisor_ui.py +0 -0
  34. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/langgraph_supervisor_ui.py +0 -0
  35. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/tools/__init__.py +0 -0
  36. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/tools/crewai_tools.py +0 -0
  37. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/tools/langgraph_tools.py +0 -0
  38. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/supervisors/workflow_tools.py +0 -0
  39. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/test_payment_async.py +0 -0
  40. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/tools/__init__.py +0 -0
  41. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/tools/address.py +0 -0
  42. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/examples/validator.py +0 -0
  43. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/langgraph_demo.py +0 -0
  44. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/langgraph_selfloop_demo.py +0 -0
  45. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/langgraph_v.py +0 -0
  46. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/main.py +0 -0
  47. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/return_fsm.excalidraw +0 -0
  48. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/return_state_machine.png +0 -0
  49. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/legacy/ui.py +0 -0
  50. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/scripts/visualize_workflow.py +0 -0
  51. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/scripts/workflow_demo.py +0 -0
  52. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/scripts/workflow_demo_ui.py +0 -0
  53. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/__init__.py +0 -0
  54. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/agents/__init__.py +0 -0
  55. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/agents/factory.py +0 -0
  56. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/agents/structured_output.py +0 -0
  57. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/authenticators/__init__.py +0 -0
  58. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/core/__init__.py +0 -0
  59. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/core/constants.py +0 -0
  60. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/core/engine.py +0 -0
  61. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/core/rollback_strategies.py +0 -0
  62. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/core/state.py +0 -0
  63. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/engine.py +0 -0
  64. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/__init__.py +0 -0
  65. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/async_function.py +0 -0
  66. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/base.py +0 -0
  67. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/call_function.py +0 -0
  68. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/collect_input.py +0 -0
  69. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/nodes/factory.py +0 -0
  70. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/routing/__init__.py +0 -0
  71. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/routing/router.py +0 -0
  72. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/tools.py +0 -0
  73. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/__init__.py +0 -0
  74. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/function.py +0 -0
  75. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/logger.py +0 -0
  76. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/template.py +0 -0
  77. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/tool.py +0 -0
  78. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/utils/tracing.py +0 -0
  79. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/validation/__init__.py +0 -0
  80. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/validation/schema.py +0 -0
  81. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/soprano_sdk/validation/validator.py +0 -0
  82. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/debug_jinja2.py +0 -0
  83. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_agent_factory.py +0 -0
  84. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_async_function.py +0 -0
  85. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_collect_input_refactor.py +0 -0
  86. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_external_values.py +0 -0
  87. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_inputs_validation.py +0 -0
  88. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_jinja2_path.py +0 -0
  89. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_jinja2_standalone.py +0 -0
  90. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_mfa_scenarios.py +0 -0
  91. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_persistence.py +0 -0
  92. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_structured_output.py +0 -0
  93. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_transition_routing.py +0 -0
  94. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/tests/test_workflow_tool_context_update.py +0 -0
  95. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/todo.md +0 -0
  96. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/.eslintrc.cjs +0 -0
  97. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/.gitignore +0 -0
  98. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/README.md +0 -0
  99. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/index.html +0 -0
  100. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/package-lock.json +0 -0
  101. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/package.json +0 -0
  102. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/App.jsx +0 -0
  103. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/CustomNode.jsx +0 -0
  104. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/StepDetailsModal.jsx +0 -0
  105. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/WorkflowGraph.jsx +0 -0
  106. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/WorkflowInfoPanel.jsx +0 -0
  107. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/assets/react.svg +0 -0
  108. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/src/main.jsx +0 -0
  109. {soprano_sdk-0.2.17 → soprano_sdk-0.2.19}/workflow-visualizer/vite.config.js +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(uv run pytest:*)"
5
+ ]
6
+ }
7
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soprano-sdk
3
- Version: 0.2.17
3
+ Version: 0.2.19
4
4
  Summary: YAML-driven workflow engine with AI agent integration for building conversational SOPs
5
5
  Author: Arvind Thangamani
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "soprano-sdk"
7
- version = "0.2.17"
7
+ version = "0.2.19"
8
8
  description = "YAML-driven workflow engine with AI agent integration for building conversational SOPs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -59,7 +59,9 @@ class CrewAIAgentAdapter(AgentAdapter):
59
59
  return response
60
60
 
61
61
  # Convert to string for parsing
62
- response_str = str(response)
62
+ response_str_raw = str(response)
63
+
64
+ response_str = response_str_raw[response_str_raw.find("{"): response_str_raw.rfind("}")+1]
63
65
 
64
66
  # Strategy 2: Try json.loads()
65
67
  try:
@@ -78,8 +80,8 @@ class CrewAIAgentAdapter(AgentAdapter):
78
80
  except (ValueError, SyntaxError, TypeError) as e:
79
81
  logger.error(f"ast.literal_eval() failed: {e}")
80
82
 
81
- # No schema and all parsing failed - return as string
82
- logger.error("No schema provided and parsing failed, returning raw response")
83
+ # All parsing failed - return as string
84
+ logger.error("All parsing strategies failed, returning raw response")
83
85
  return response_str
84
86
 
85
87
  def invoke(self, messages: List[Dict[str, str]]) -> Any:
@@ -176,7 +176,7 @@ class MFANodeConfig:
176
176
  """)
177
177
 
178
178
  if mfa_model := mfa_config.get('model'):
179
- agent_config.update(model_name=mfa_model)
179
+ agent_config.update(model=mfa_model)
180
180
 
181
181
  max_attempts = mfa_config.get('max_attempts', 3)
182
182
  on_max_attempts_reached = mfa_config.get('on_max_attempts_reached')
@@ -66,7 +66,7 @@ class TestCrewAIAdapterLogging:
66
66
  adapter.invoke([{"role": "user", "content": "Hello"}])
67
67
 
68
68
  # Verify correct logging
69
- mock_logger.info.assert_called_once_with(
69
+ mock_logger.info.assert_any_call(
70
70
  "Invoking CrewAIAgentAdapter agent with messages"
71
71
  )
72
72
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes