uipath-langchain 0.0.143__tar.gz → 0.0.144__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.

Potentially problematic release.


This version of uipath-langchain might be problematic. Click here for more details.

Files changed (299) hide show
  1. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/PKG-INFO +1 -1
  2. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/pyproject.toml +2 -2
  3. uipath_langchain-0.0.144/src/uipath_langchain/_cli/_runtime/_exception.py +43 -0
  4. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_graph_resolver.py +10 -12
  5. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_input.py +2 -2
  6. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_output.py +5 -8
  7. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_runtime.py +12 -6
  8. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_utils/_request_mixin.py +5 -2
  9. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/__init__.py +12 -0
  10. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/agent.py +76 -0
  11. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/constants.py +2 -0
  12. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/exceptions.py +11 -0
  13. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/init_node.py +16 -0
  14. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/llm_node.py +44 -0
  15. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/router.py +97 -0
  16. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/state.py +18 -0
  17. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/terminate_node.py +53 -0
  18. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/tools/__init__.py +7 -0
  19. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/tools/tools.py +50 -0
  20. uipath_langchain-0.0.144/src/uipath_langchain/agent/react/utils.py +39 -0
  21. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/__init__.py +8 -0
  22. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/context_tool.py +42 -0
  23. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/process_tool.py +51 -0
  24. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/tool_factory.py +39 -0
  25. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/tool_node.py +22 -0
  26. uipath_langchain-0.0.144/src/uipath_langchain/agent/tools/utils.py +11 -0
  27. uipath_langchain-0.0.144/tests/agent/react/__init__.py +1 -0
  28. uipath_langchain-0.0.144/tests/agent/react/test_utils.py +135 -0
  29. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/uv.lock +4 -4
  30. uipath_langchain-0.0.143/src/uipath_langchain/_cli/_runtime/_exception.py +0 -17
  31. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.cursorrules +0 -0
  32. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.editorconfig +0 -0
  33. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.gitattributes +0 -0
  34. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/cd.yml +0 -0
  35. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/ci.yml +0 -0
  36. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/commitlint.yml +0 -0
  37. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/integration_tests.yml +0 -0
  38. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/lint-custom-version.yml +0 -0
  39. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/lint.yml +0 -0
  40. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/publish-dev.yml +0 -0
  41. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/publish-docs.yml +0 -0
  42. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/publish-prior-stable-version.yml +0 -0
  43. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/slack.yml +0 -0
  44. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/test-custom-version.yml +0 -0
  45. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.github/workflows/test.yml +0 -0
  46. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.gitignore +0 -0
  47. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.pre-commit-config.yaml +0 -0
  48. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.python-version +0 -0
  49. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.vscode/extensions.json +0 -0
  50. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/.vscode/settings.json +0 -0
  51. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/CONTRIBUTING.md +0 -0
  52. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/LICENSE +0 -0
  53. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/README.md +0 -0
  54. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/chat_models.md +0 -0
  55. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/context_grounding.md +0 -0
  56. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/human_in_the_loop.md +0 -0
  57. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/quick_start.md +0 -0
  58. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/quick_start_images/cloud_env_var_dark.png +0 -0
  59. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/quick_start_images/cloud_env_var_light.png +0 -0
  60. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/quick_start_images/invoke_output_dark.png +0 -0
  61. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/quick_start_images/invoke_output_light.png +0 -0
  62. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/click-storage-bucket.png +0 -0
  63. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-index-1.png +0 -0
  64. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-index-2.png +0 -0
  65. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-process.png +0 -0
  66. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-quiz-generator.png +0 -0
  67. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-storage-bucket-1.png +0 -0
  68. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/create-storage-bucket-2.png +0 -0
  69. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/folder-path.png +0 -0
  70. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/job-info.png +0 -0
  71. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/output.png +0 -0
  72. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/process-page.png +0 -0
  73. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/researcher-1.png +0 -0
  74. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/researcher-2.png +0 -0
  75. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/run-process-1.png +0 -0
  76. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/run-process-2.png +0 -0
  77. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/RAG/storage-bucket-content.png +0 -0
  78. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/coder-agent-package-overview.png +0 -0
  79. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/coder-agent-process-configuration.png +0 -0
  80. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/planner-agent-package-overview.png +0 -0
  81. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/planner-agent-process-configuration.png +0 -0
  82. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/researcher-agent-package-overview.png +0 -0
  83. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/multi-agent-distributed/researcher-agent-process-configuration.png +0 -0
  84. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/activate-apps.png +0 -0
  85. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/activate-deployment.png +0 -0
  86. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/copy-folder-path.png +0 -0
  87. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/deploy-solution-package-wizard.png +0 -0
  88. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/deploy-solution-package.png +0 -0
  89. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/monitor-agent.png +0 -0
  90. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/navigate-to-solution-folder.png +0 -0
  91. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/resume-condition.png +0 -0
  92. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/run-agent.png +0 -0
  93. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/solution-destination-folder.png +0 -0
  94. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/start-job.png +0 -0
  95. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/docs/sample_images/ticket-classification/upload-solution-package.png +0 -0
  96. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/README.md +0 -0
  97. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/env.example +0 -0
  98. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/input.example/quiz-generator-debug-input.json +0 -0
  99. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/input.example/researcher-debug-input.json +0 -0
  100. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/langgraph.json +0 -0
  101. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/pyproject.toml +0 -0
  102. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/quiz-generator-RAG-agent.mermaid +0 -0
  103. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/researcher-RAG-agent.mermaid +0 -0
  104. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/src/agents/quiz-generator-RAG-agent.py +0 -0
  105. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/src/agents/researcher-RAG-agent.py +0 -0
  106. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/uipath.json +0 -0
  107. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/RAG-quiz-generator/uv.lock +0 -0
  108. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/README.md +0 -0
  109. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/calculator-agent/graph.py +0 -0
  110. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/calculator-agent/langgraph.json +0 -0
  111. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/calculator-agent/pyproject.toml +0 -0
  112. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/calculator-agent/uipath.json +0 -0
  113. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/calculator-agent/uv.lock +0 -0
  114. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/.env.example +0 -0
  115. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/agent.mermaid +0 -0
  116. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/graph.py +0 -0
  117. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/langgraph.json +0 -0
  118. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/pyproject.toml +0 -0
  119. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/uipath.json +0 -0
  120. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/chat-agent/uv.lock +0 -0
  121. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/.env.example +0 -0
  122. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/agent.mermaid +0 -0
  123. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/graph.py +0 -0
  124. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/langgraph.json +0 -0
  125. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/pyproject.toml +0 -0
  126. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/uipath.json +0 -0
  127. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/company-research-agent/uv.lock +0 -0
  128. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/.env.template +0 -0
  129. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/.python-version +0 -0
  130. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/.vscode/launch.json +0 -0
  131. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/README.md +0 -0
  132. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/agent.mermaid +0 -0
  133. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/input.json +0 -0
  134. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/langgraph.json +0 -0
  135. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/pyproject.toml +0 -0
  136. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/src/email_organizer/__init__.py +0 -0
  137. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/src/email_organizer/main.py +0 -0
  138. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/src/email_organizer/outlook_client.py +0 -0
  139. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/uipath.json +0 -0
  140. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/email-organizer-agent/uv.lock +0 -0
  141. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/database.py +0 -0
  142. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/main.py +0 -0
  143. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/models.py +0 -0
  144. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/pyproject.toml +0 -0
  145. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/schemas.py +0 -0
  146. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/templates/index.html +0 -0
  147. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/hitl-inbox-server/uv.lock +0 -0
  148. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/.env.example +0 -0
  149. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/README.md +0 -0
  150. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/coder.mermaid +0 -0
  151. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/langgraph.json +0 -0
  152. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/planner.mermaid +0 -0
  153. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/pyproject.toml +0 -0
  154. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/researcher.mermaid +0 -0
  155. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/coder.py +0 -0
  156. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/planner.py +0 -0
  157. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/researcher.py +0 -0
  158. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/uipath.json +0 -0
  159. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-planner-researcher-coder-distributed/uv.lock +0 -0
  160. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/.env.example +0 -0
  161. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/README.md +0 -0
  162. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/agent.mermaid +0 -0
  163. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/graph.py +0 -0
  164. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/langgraph.json +0 -0
  165. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/pyproject.toml +0 -0
  166. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/uipath.json +0 -0
  167. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/multi-agent-supervisor-researcher-coder/uv.lock +0 -0
  168. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/.env.example +0 -0
  169. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/README.md +0 -0
  170. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/input.json +0 -0
  171. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/langgraph.json +0 -0
  172. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/main.py +0 -0
  173. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/pyproject.toml +0 -0
  174. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/oauth-external-apps-agent/uv.lock +0 -0
  175. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/.env.example +0 -0
  176. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/README.md +0 -0
  177. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/main.py +0 -0
  178. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/pyproject.toml +0 -0
  179. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/uipath.json +0 -0
  180. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/retrieval-chain/uv.lock +0 -0
  181. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/.env.example +0 -0
  182. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/README.md +0 -0
  183. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/agent.mermaid +0 -0
  184. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/langgraph.json +0 -0
  185. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/pyproject.toml +0 -0
  186. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  187. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  188. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  189. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/uipath.json +0 -0
  190. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-local-mcp/uv.lock +0 -0
  191. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/.env.example +0 -0
  192. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/README.md +0 -0
  193. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/agent.mermaid +0 -0
  194. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/langgraph.json +0 -0
  195. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/main.py +0 -0
  196. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/pyproject.toml +0 -0
  197. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/uipath.json +0 -0
  198. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/simple-remote-mcp/uv.lock +0 -0
  199. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/.env.example +0 -0
  200. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/README.md +0 -0
  201. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/agent.mermaid +0 -0
  202. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/escalation_app_solution/generic-escalation-app-solution-1.0.0.zip +0 -0
  203. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/langgraph.json +0 -0
  204. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/main.py +0 -0
  205. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/pyproject.toml +0 -0
  206. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/uipath.json +0 -0
  207. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/samples/ticket-classification/uv.lock +0 -0
  208. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/__init__.py +0 -0
  209. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/__init__.py +0 -0
  210. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_context.py +0 -0
  211. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_runtime/_conversation.py +0 -0
  212. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_templates/langgraph.json.template +0 -0
  213. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_templates/main.py.template +0 -0
  214. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/_utils/_graph.py +0 -0
  215. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_debug.py +0 -0
  216. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_dev.py +0 -0
  217. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_eval.py +0 -0
  218. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_init.py +0 -0
  219. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_new.py +0 -0
  220. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_cli/cli_run.py +0 -0
  221. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_resources/AGENTS.md +0 -0
  222. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_resources/REQUIRED_STRUCTURE.md +0 -0
  223. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_tracing/__init__.py +0 -0
  224. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_tracing/_instrument_traceable.py +0 -0
  225. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_tracing/_utils.py +0 -0
  226. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_utils/__init__.py +0 -0
  227. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_utils/_settings.py +0 -0
  228. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/_utils/_sleep_policy.py +0 -0
  229. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/chat/__init__.py +0 -0
  230. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/chat/models.py +0 -0
  231. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/embeddings/__init__.py +0 -0
  232. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/embeddings/embeddings.py +0 -0
  233. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/middlewares.py +0 -0
  234. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/py.typed +0 -0
  235. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/retrievers/__init__.py +0 -0
  236. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/retrievers/context_grounding_retriever.py +0 -0
  237. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/tools/__init__.py +0 -0
  238. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/tools/preconfigured.py +0 -0
  239. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/vectorstores/__init__.py +0 -0
  240. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/src/uipath_langchain/vectorstores/context_grounding_vectorstore.py +0 -0
  241. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/common/trace_assert.py +0 -0
  242. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/common/validate_output.sh +0 -0
  243. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/expected_raw.json +0 -0
  244. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/expected_traces.json +0 -0
  245. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/input.json +0 -0
  246. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/langgraph.json +0 -0
  247. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/pyproject.toml +0 -0
  248. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/run.sh +0 -0
  249. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/src/assert.py +0 -0
  250. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/src/graph.py +0 -0
  251. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/company-research-agent/uv.lock +0 -0
  252. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/init-flow/expected_traces.json +0 -0
  253. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/init-flow/input.json +0 -0
  254. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/init-flow/pyproject.toml +0 -0
  255. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/init-flow/run.sh +0 -0
  256. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/init-flow/src/assert.py +0 -0
  257. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/expected_traces.json +0 -0
  258. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/input.json +0 -0
  259. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/langgraph.json +0 -0
  260. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/pyproject.toml +0 -0
  261. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/run.sh +0 -0
  262. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/src/assert.py +0 -0
  263. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  264. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  265. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  266. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/simple-local-mcp/uv.lock +0 -0
  267. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/expected_traces.json +0 -0
  268. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/input.json +0 -0
  269. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/langgraph.json +0 -0
  270. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/pyproject.toml +0 -0
  271. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/raw_traces.jsonl +0 -0
  272. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/run.sh +0 -0
  273. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/src/assert.py +0 -0
  274. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/src/main.py +0 -0
  275. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/testcases/ticket-classification/uv.lock +0 -0
  276. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/__init__.py +0 -0
  277. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/conftest.py +0 -0
  278. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/mocks/langgraph.json +0 -0
  279. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/mocks/simple_agent.py +0 -0
  280. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/mocks/uipath.json +0 -0
  281. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/test_init.py +0 -0
  282. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/cli/test_run.py +0 -0
  283. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/__init__.py +0 -0
  284. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/conftest.py +0 -0
  285. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/action_trigger_hitl.py +0 -0
  286. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/api_trigger_hitl.py +0 -0
  287. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/job_trigger_hitl.py +0 -0
  288. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/langgraph.json +0 -0
  289. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/uipath-default-escalation.json +0 -0
  290. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/mocks/uipath.json +0 -0
  291. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/test_action_trigger.py +0 -0
  292. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/test_hitl_api_trigger.py +0 -0
  293. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/test_hitl_default_escalation.py +0 -0
  294. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/hitl/test_hitl_job_trigger.py +0 -0
  295. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/test_dummy.py +0 -0
  296. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/tools/__init__.py +0 -0
  297. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/tools/conftest.py +0 -0
  298. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/tools/mocks/agent_definition.json +0 -0
  299. {uipath_langchain-0.0.143 → uipath_langchain-0.0.144}/tests/tools/test_preconfigured.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath-langchain
3
- Version: 0.0.143
3
+ Version: 0.0.144
4
4
  Summary: UiPath Langchain
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-langchain-python
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "uipath-langchain"
3
- version = "0.0.143"
3
+ version = "0.0.144"
4
4
  description = "UiPath Langchain"
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  requires-python = ">=3.10"
@@ -111,4 +111,4 @@ asyncio_mode = "auto"
111
111
  name = "testpypi"
112
112
  url = "https://test.pypi.org/simple/"
113
113
  publish-url = "https://test.pypi.org/legacy/"
114
- explicit = true
114
+ explicit = true
@@ -0,0 +1,43 @@
1
+ from enum import Enum
2
+ from typing import Optional, Union
3
+
4
+ from uipath._cli._runtime._contracts import (
5
+ UiPathBaseRuntimeError,
6
+ UiPathErrorCategory,
7
+ UiPathErrorCode,
8
+ )
9
+
10
+
11
+ class LangGraphErrorCode(Enum):
12
+ CONFIG_MISSING = "CONFIG_MISSING"
13
+ CONFIG_INVALID = "CONFIG_INVALID"
14
+
15
+ GRAPH_NOT_FOUND = "GRAPH_NOT_FOUND"
16
+ GRAPH_IMPORT_ERROR = "GRAPH_IMPORT_ERROR"
17
+ GRAPH_TYPE_ERROR = "GRAPH_TYPE_ERROR"
18
+ GRAPH_VALUE_ERROR = "GRAPH_VALUE_ERROR"
19
+ GRAPH_LOAD_ERROR = "GRAPH_LOAD_ERROR"
20
+ GRAPH_INVALID_UPDATE = "GRAPH_INVALID_UPDATE"
21
+ GRAPH_EMPTY_INPUT = "GRAPH_EMPTY_INPUT"
22
+
23
+ DB_QUERY_FAILED = "DB_QUERY_FAILED"
24
+ DB_TABLE_CREATION_FAILED = "DB_TABLE_CREATION_FAILED"
25
+ HITL_EVENT_CREATION_FAILED = "HITL_EVENT_CREATION_FAILED"
26
+ DB_INSERT_FAILED = "DB_INSERT_FAILED"
27
+ LICENSE_NOT_AVAILABLE = "LICENSE_NOT_AVAILABLE"
28
+
29
+
30
+ class LangGraphRuntimeError(UiPathBaseRuntimeError):
31
+ """Custom exception for LangGraph runtime errors with structured error information."""
32
+
33
+ def __init__(
34
+ self,
35
+ code: Union[LangGraphErrorCode, UiPathErrorCode],
36
+ title: str,
37
+ detail: str,
38
+ category: UiPathErrorCategory = UiPathErrorCategory.UNKNOWN,
39
+ status: Optional[int] = None,
40
+ ):
41
+ super().__init__(
42
+ code.value, title, detail, category, status, prefix="LANGGRAPH"
43
+ )
@@ -2,12 +2,10 @@ import asyncio
2
2
  from typing import Any, Awaitable, Callable, Optional
3
3
 
4
4
  from langgraph.graph.state import CompiledStateGraph, StateGraph
5
- from uipath._cli._runtime._contracts import (
6
- UiPathErrorCategory,
7
- )
5
+ from uipath._cli._runtime._contracts import UiPathErrorCategory, UiPathErrorCode
8
6
 
9
7
  from .._utils._graph import GraphConfig, LangGraphConfig
10
- from ._exception import LangGraphRuntimeError
8
+ from ._exception import LangGraphErrorCode, LangGraphRuntimeError
11
9
 
12
10
 
13
11
  class LangGraphJsonResolver:
@@ -36,7 +34,7 @@ class LangGraphJsonResolver:
36
34
  config = LangGraphConfig()
37
35
  if not config.exists:
38
36
  raise LangGraphRuntimeError(
39
- "CONFIG_MISSING",
37
+ LangGraphErrorCode.CONFIG_MISSING,
40
38
  "Invalid configuration",
41
39
  "Failed to load configuration",
42
40
  UiPathErrorCategory.DEPLOYMENT,
@@ -46,7 +44,7 @@ class LangGraphJsonResolver:
46
44
  config.load_config()
47
45
  except Exception as e:
48
46
  raise LangGraphRuntimeError(
49
- "CONFIG_INVALID",
47
+ LangGraphErrorCode.CONFIG_INVALID,
50
48
  "Invalid configuration",
51
49
  f"Failed to load configuration: {str(e)}",
52
50
  UiPathErrorCategory.DEPLOYMENT,
@@ -59,7 +57,7 @@ class LangGraphJsonResolver:
59
57
  elif not entrypoint:
60
58
  graph_names = ", ".join(g.name for g in graphs)
61
59
  raise LangGraphRuntimeError(
62
- "ENTRYPOINT_MISSING",
60
+ UiPathErrorCode.ENTRYPOINT_MISSING,
63
61
  "Entrypoint required",
64
62
  f"Multiple graphs available. Please specify one of: {graph_names}.",
65
63
  UiPathErrorCategory.DEPLOYMENT,
@@ -69,7 +67,7 @@ class LangGraphJsonResolver:
69
67
  self.graph_config = config.get_graph(entrypoint)
70
68
  if not self.graph_config:
71
69
  raise LangGraphRuntimeError(
72
- "GRAPH_NOT_FOUND",
70
+ LangGraphErrorCode.GRAPH_NOT_FOUND,
73
71
  "Graph not found",
74
72
  f"Graph '{entrypoint}' not found.",
75
73
  UiPathErrorCategory.DEPLOYMENT,
@@ -83,28 +81,28 @@ class LangGraphJsonResolver:
83
81
  )
84
82
  except ImportError as e:
85
83
  raise LangGraphRuntimeError(
86
- "GRAPH_IMPORT_ERROR",
84
+ LangGraphErrorCode.GRAPH_IMPORT_ERROR,
87
85
  "Graph import failed",
88
86
  f"Failed to import graph '{entrypoint}': {str(e)}",
89
87
  UiPathErrorCategory.USER,
90
88
  ) from e
91
89
  except TypeError as e:
92
90
  raise LangGraphRuntimeError(
93
- "GRAPH_TYPE_ERROR",
91
+ LangGraphErrorCode.GRAPH_TYPE_ERROR,
94
92
  "Invalid graph type",
95
93
  f"Graph '{entrypoint}' is not a valid StateGraph or CompiledStateGraph: {str(e)}",
96
94
  UiPathErrorCategory.USER,
97
95
  ) from e
98
96
  except ValueError as e:
99
97
  raise LangGraphRuntimeError(
100
- "GRAPH_VALUE_ERROR",
98
+ LangGraphErrorCode.GRAPH_VALUE_ERROR,
101
99
  "Invalid graph value",
102
100
  f"Invalid value in graph '{entrypoint}': {str(e)}",
103
101
  UiPathErrorCategory.USER,
104
102
  ) from e
105
103
  except Exception as e:
106
104
  raise LangGraphRuntimeError(
107
- "GRAPH_LOAD_ERROR",
105
+ LangGraphErrorCode.GRAPH_LOAD_ERROR,
108
106
  "Failed to load graph",
109
107
  f"Unexpected error loading graph '{entrypoint}': {str(e)}",
110
108
  UiPathErrorCategory.USER,
@@ -13,7 +13,7 @@ from uipath._cli._runtime._hitl import HitlReader
13
13
 
14
14
  from ._context import LangGraphRuntimeContext
15
15
  from ._conversation import uipath_to_human_messages
16
- from ._exception import LangGraphRuntimeError
16
+ from ._exception import LangGraphErrorCode, LangGraphRuntimeError
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
@@ -140,7 +140,7 @@ async def _get_latest_trigger(
140
140
  return cast(tuple[str, str, str, str, str], tuple(result))
141
141
  except Exception as e:
142
142
  raise LangGraphRuntimeError(
143
- "DB_QUERY_FAILED",
143
+ LangGraphErrorCode.DB_QUERY_FAILED,
144
144
  "Database query failed",
145
145
  f"Error querying resume trigger information: {str(e)}",
146
146
  UiPathErrorCategory.SYSTEM,
@@ -3,13 +3,10 @@ import logging
3
3
  from typing import Any
4
4
 
5
5
  from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver
6
- from uipath._cli._runtime._contracts import (
7
- UiPathErrorCategory,
8
- UiPathResumeTrigger,
9
- )
6
+ from uipath._cli._runtime._contracts import UiPathErrorCategory, UiPathResumeTrigger
10
7
  from uipath._cli._runtime._hitl import HitlProcessor
11
8
 
12
- from ._exception import LangGraphRuntimeError
9
+ from ._exception import LangGraphErrorCode, LangGraphRuntimeError
13
10
 
14
11
  logger = logging.getLogger(__name__)
15
12
 
@@ -93,7 +90,7 @@ async def create_and_save_resume_trigger(
93
90
  """)
94
91
  except Exception as e:
95
92
  raise LangGraphRuntimeError(
96
- "DB_TABLE_CREATION_FAILED",
93
+ LangGraphErrorCode.DB_TABLE_CREATION_FAILED,
97
94
  "Failed to create resume triggers table",
98
95
  f"Database error while creating table: {str(e)}",
99
96
  UiPathErrorCategory.SYSTEM,
@@ -104,7 +101,7 @@ async def create_and_save_resume_trigger(
104
101
  resume_trigger = await hitl_processor.create_resume_trigger()
105
102
  except Exception as e:
106
103
  raise LangGraphRuntimeError(
107
- "HITL_EVENT_CREATION_FAILED",
104
+ LangGraphErrorCode.HITL_EVENT_CREATION_FAILED,
108
105
  "Failed to process HITL request",
109
106
  f"Error while trying to process HITL request: {str(e)}",
110
107
  UiPathErrorCategory.SYSTEM,
@@ -139,7 +136,7 @@ async def create_and_save_resume_trigger(
139
136
  await memory.conn.commit()
140
137
  except Exception as e:
141
138
  raise LangGraphRuntimeError(
142
- "DB_INSERT_FAILED",
139
+ LangGraphErrorCode.DB_INSERT_FAILED,
143
140
  "Failed to save resume trigger",
144
141
  f"Database error while saving resume trigger: {str(e)}",
145
142
  UiPathErrorCategory.SYSTEM,
@@ -12,6 +12,7 @@ from uipath._cli._runtime._contracts import (
12
12
  UiPathBaseRuntime,
13
13
  UiPathBreakpointResult,
14
14
  UiPathErrorCategory,
15
+ UiPathErrorCode,
15
16
  UiPathResumeTrigger,
16
17
  UiPathRuntimeResult,
17
18
  UiPathRuntimeStatus,
@@ -23,7 +24,7 @@ from uipath._events._events import (
23
24
  )
24
25
 
25
26
  from ._context import LangGraphRuntimeContext
26
- from ._exception import LangGraphRuntimeError
27
+ from ._exception import LangGraphErrorCode, LangGraphRuntimeError
27
28
  from ._graph_resolver import AsyncResolver, LangGraphJsonResolver
28
29
  from ._input import get_graph_input
29
30
  from ._output import create_and_save_resume_trigger, serialize_output
@@ -79,7 +80,11 @@ class LangGraphRuntime(UiPathBaseRuntime):
79
80
  graph_config = self._get_graph_config()
80
81
 
81
82
  # Execute without streaming
82
- graph_output = await compiled_graph.ainvoke(graph_input, graph_config)
83
+ graph_output = await compiled_graph.ainvoke(
84
+ graph_input,
85
+ graph_config,
86
+ interrupt_before=self.context.breakpoints,
87
+ )
83
88
 
84
89
  # Get final state and create result
85
90
  self.context.result = await self._create_runtime_result(
@@ -140,6 +145,7 @@ class LangGraphRuntime(UiPathBaseRuntime):
140
145
  async for stream_chunk in compiled_graph.astream(
141
146
  graph_input,
142
147
  graph_config,
148
+ interrupt_before=self.context.breakpoints,
143
149
  stream_mode=["messages", "updates"],
144
150
  subgraphs=True,
145
151
  ):
@@ -426,7 +432,7 @@ class LangGraphRuntime(UiPathBaseRuntime):
426
432
 
427
433
  if isinstance(e, GraphRecursionError):
428
434
  return LangGraphRuntimeError(
429
- "GRAPH_RECURSION_ERROR",
435
+ LangGraphErrorCode.GRAPH_LOAD_ERROR,
430
436
  "Graph recursion limit exceeded",
431
437
  detail,
432
438
  UiPathErrorCategory.USER,
@@ -434,7 +440,7 @@ class LangGraphRuntime(UiPathBaseRuntime):
434
440
 
435
441
  if isinstance(e, InvalidUpdateError):
436
442
  return LangGraphRuntimeError(
437
- "GRAPH_INVALID_UPDATE",
443
+ LangGraphErrorCode.GRAPH_INVALID_UPDATE,
438
444
  str(e),
439
445
  detail,
440
446
  UiPathErrorCategory.USER,
@@ -442,14 +448,14 @@ class LangGraphRuntime(UiPathBaseRuntime):
442
448
 
443
449
  if isinstance(e, EmptyInputError):
444
450
  return LangGraphRuntimeError(
445
- "GRAPH_EMPTY_INPUT",
451
+ LangGraphErrorCode.GRAPH_EMPTY_INPUT,
446
452
  "The input data is empty",
447
453
  detail,
448
454
  UiPathErrorCategory.USER,
449
455
  )
450
456
 
451
457
  return LangGraphRuntimeError(
452
- "EXECUTION_ERROR",
458
+ UiPathErrorCode.EXECUTION_ERROR,
453
459
  "Graph execution failed",
454
460
  detail,
455
461
  UiPathErrorCategory.USER,
@@ -20,7 +20,10 @@ from tenacity import (
20
20
  from uipath._cli._runtime._contracts import UiPathErrorCategory, UiPathRuntimeError
21
21
  from uipath._utils._ssl_context import get_httpx_client_kwargs
22
22
 
23
- from uipath_langchain._cli._runtime._exception import LangGraphRuntimeError
23
+ from uipath_langchain._cli._runtime._exception import (
24
+ LangGraphErrorCode,
25
+ LangGraphRuntimeError,
26
+ )
24
27
  from uipath_langchain._utils._settings import (
25
28
  UiPathClientFactorySettings,
26
29
  UiPathClientSettings,
@@ -371,7 +374,7 @@ class UiPathRequestMixin(BaseModel):
371
374
  title = body.get("title", "").lower()
372
375
  if title == "license not available":
373
376
  raise LangGraphRuntimeError(
374
- code="LICENSE_NOT_AVAILABLE",
377
+ code=LangGraphErrorCode.LICENSE_NOT_AVAILABLE,
375
378
  title=body.get("title", "License Not Available"),
376
379
  detail=body.get(
377
380
  "detail", "License not available for this service"
@@ -0,0 +1,12 @@
1
+ """UiPath ReAct Agent implementation"""
2
+
3
+ from .agent import create_agent
4
+ from .state import AgentGraphNode, AgentGraphState
5
+ from .utils import resolve_output_model
6
+
7
+ __all__ = [
8
+ "create_agent",
9
+ "AgentGraphState",
10
+ "AgentGraphNode",
11
+ "resolve_output_model",
12
+ ]
@@ -0,0 +1,76 @@
1
+ import os
2
+ from typing import Sequence, Type
3
+
4
+ from langchain_core.language_models import BaseChatModel
5
+ from langchain_core.messages import HumanMessage, SystemMessage
6
+ from langchain_core.tools import BaseTool
7
+ from langgraph.constants import END, START
8
+ from langgraph.graph import StateGraph
9
+ from pydantic import BaseModel
10
+
11
+ from ..tools import create_tool_node
12
+ from .init_node import (
13
+ create_init_node,
14
+ )
15
+ from .llm_node import (
16
+ create_llm_node,
17
+ )
18
+ from .router import (
19
+ route_agent,
20
+ )
21
+ from .state import AgentGraphNode, AgentGraphState
22
+ from .terminate_node import (
23
+ create_terminate_node,
24
+ )
25
+ from .tools import create_flow_control_tools
26
+
27
+
28
+ def create_agent(
29
+ model: BaseChatModel,
30
+ tools: Sequence[BaseTool],
31
+ messages: Sequence[SystemMessage | HumanMessage],
32
+ *,
33
+ state_schema: Type[AgentGraphState] = AgentGraphState,
34
+ response_format: type[BaseModel] | None = None,
35
+ recursion_limit: int = 50,
36
+ ) -> StateGraph[AgentGraphState]:
37
+ """Build agent graph with INIT -> AGENT <-> TOOLS loop, terminated by control flow tools.
38
+
39
+ Control flow tools (end_execution, raise_error) are auto-injected alongside regular tools.
40
+ """
41
+ os.environ["LANGCHAIN_RECURSION_LIMIT"] = str(recursion_limit)
42
+
43
+ agent_tools = list(tools)
44
+ flow_control_tools: list[BaseTool] = create_flow_control_tools(response_format)
45
+ llm_tools: list[BaseTool] = [*agent_tools, *flow_control_tools]
46
+
47
+ init_node = create_init_node(messages)
48
+ agent_node = create_llm_node(model, llm_tools)
49
+ tool_nodes = create_tool_node(agent_tools)
50
+ terminate_node = create_terminate_node(response_format)
51
+
52
+ builder: StateGraph[AgentGraphState] = StateGraph(state_schema)
53
+ builder.add_node(AgentGraphNode.INIT, init_node)
54
+ builder.add_node(AgentGraphNode.AGENT, agent_node)
55
+
56
+ for tool_name, tool_node in tool_nodes.items():
57
+ builder.add_node(tool_name, tool_node)
58
+
59
+ builder.add_node(AgentGraphNode.TERMINATE, terminate_node)
60
+
61
+ builder.add_edge(START, AgentGraphNode.INIT)
62
+ builder.add_edge(AgentGraphNode.INIT, AgentGraphNode.AGENT)
63
+
64
+ tool_node_names = list(tool_nodes.keys())
65
+ builder.add_conditional_edges(
66
+ AgentGraphNode.AGENT,
67
+ route_agent,
68
+ [AgentGraphNode.AGENT, *tool_node_names, AgentGraphNode.TERMINATE],
69
+ )
70
+
71
+ for tool_name in tool_node_names:
72
+ builder.add_edge(tool_name, AgentGraphNode.AGENT)
73
+
74
+ builder.add_edge(AgentGraphNode.TERMINATE, END)
75
+
76
+ return builder
@@ -0,0 +1,2 @@
1
+ # Agent routing configuration
2
+ MAX_SUCCESSIVE_COMPLETIONS = 1
@@ -0,0 +1,11 @@
1
+ """Exceptions for the basic agent loop."""
2
+
3
+ from uipath._cli._runtime._contracts import UiPathRuntimeError
4
+
5
+
6
+ class AgentNodeRoutingException(Exception):
7
+ pass
8
+
9
+
10
+ class AgentTerminationException(UiPathRuntimeError):
11
+ pass
@@ -0,0 +1,16 @@
1
+ """State initialization node for the ReAct Agent graph."""
2
+
3
+ from typing import Sequence
4
+
5
+ from langchain_core.messages import HumanMessage, SystemMessage
6
+
7
+ from .state import AgentGraphState
8
+
9
+
10
+ def create_init_node(
11
+ messages: Sequence[SystemMessage | HumanMessage],
12
+ ):
13
+ def graph_state_init(_: AgentGraphState):
14
+ return {"messages": list(messages)}
15
+
16
+ return graph_state_init
@@ -0,0 +1,44 @@
1
+ """LLM node implementation for LangGraph."""
2
+
3
+ from typing import Sequence
4
+
5
+ from langchain_core.language_models import BaseChatModel
6
+ from langchain_core.messages import AIMessage, AnyMessage
7
+ from langchain_core.tools import BaseTool
8
+
9
+ from .constants import MAX_SUCCESSIVE_COMPLETIONS
10
+ from .state import AgentGraphState
11
+ from .utils import count_successive_completions
12
+
13
+
14
+ def create_llm_node(
15
+ model: BaseChatModel,
16
+ tools: Sequence[BaseTool] | None = None,
17
+ ):
18
+ """Invoke LLM with tools and dynamically control tool_choice based on successive completions.
19
+
20
+ When successive completions reach the limit, tool_choice is set to "required" to force
21
+ the LLM to use a tool and prevent infinite reasoning loops.
22
+ """
23
+ bindable_tools = list(tools) if tools else []
24
+ base_llm = model.bind_tools(bindable_tools) if bindable_tools else model
25
+
26
+ async def llm_node(state: AgentGraphState):
27
+ messages: list[AnyMessage] = state["messages"]
28
+
29
+ successive_completions = count_successive_completions(messages)
30
+
31
+ if successive_completions >= MAX_SUCCESSIVE_COMPLETIONS and bindable_tools:
32
+ llm = base_llm.bind(tool_choice="required")
33
+ else:
34
+ llm = base_llm
35
+
36
+ response = await llm.ainvoke(messages)
37
+ if not isinstance(response, AIMessage):
38
+ raise TypeError(
39
+ f"LLM returned {type(response).__name__} instead of AIMessage"
40
+ )
41
+
42
+ return {"messages": [response]}
43
+
44
+ return llm_node
@@ -0,0 +1,97 @@
1
+ """Routing functions for conditional edges in the agent graph."""
2
+
3
+ from typing import Literal
4
+
5
+ from langchain_core.messages import AIMessage, AnyMessage, ToolCall
6
+ from uipath.agent.react import END_EXECUTION_TOOL, RAISE_ERROR_TOOL
7
+
8
+ from .constants import MAX_SUCCESSIVE_COMPLETIONS
9
+ from .exceptions import AgentNodeRoutingException
10
+ from .state import AgentGraphNode, AgentGraphState
11
+ from .utils import count_successive_completions
12
+
13
+ FLOW_CONTROL_TOOLS = [END_EXECUTION_TOOL.name, RAISE_ERROR_TOOL.name]
14
+
15
+
16
+ def __filter_control_flow_tool_calls(
17
+ tool_calls: list[ToolCall],
18
+ ) -> list[ToolCall]:
19
+ """Remove control flow tools when multiple tool calls exist."""
20
+ if len(tool_calls) <= 1:
21
+ return tool_calls
22
+
23
+ return [tc for tc in tool_calls if tc.get("name") not in FLOW_CONTROL_TOOLS]
24
+
25
+
26
+ def __has_control_flow_tool(tool_calls: list[ToolCall]) -> bool:
27
+ """Check if any tool call is of a control flow tool."""
28
+ return any(tc.get("name") in FLOW_CONTROL_TOOLS for tc in tool_calls)
29
+
30
+
31
+ def __validate_last_message_is_AI(messages: list[AnyMessage]) -> AIMessage:
32
+ """Validate and return last message from state.
33
+
34
+ Raises:
35
+ AgentNodeRoutingException: If messages are empty or last message is not AIMessage
36
+ """
37
+ if not messages:
38
+ raise AgentNodeRoutingException(
39
+ "No messages in state - cannot route after agent"
40
+ )
41
+
42
+ last_message = messages[-1]
43
+ if not isinstance(last_message, AIMessage):
44
+ raise AgentNodeRoutingException(
45
+ f"Last message is not AIMessage (type: {type(last_message).__name__}) - cannot route after agent"
46
+ )
47
+
48
+ return last_message
49
+
50
+
51
+ def route_agent(
52
+ state: AgentGraphState,
53
+ ) -> list[str] | Literal[AgentGraphNode.AGENT, AgentGraphNode.TERMINATE]:
54
+ """Route after agent: handles all routing logic including control flow detection.
55
+
56
+ Routing logic:
57
+ 1. If multiple tool calls exist, filter out control flow tools (EndExecution, RaiseError)
58
+ 2. If control flow tool(s) remain, route to TERMINATE
59
+ 3. If regular tool calls remain, route to specific tool nodes (return list of tool names)
60
+ 4. If no tool calls, handle successive completions
61
+
62
+ Returns:
63
+ - list[str]: Tool node names for parallel execution
64
+ - AgentGraphNode.AGENT: For successive completions
65
+ - AgentGraphNode.TERMINATE: For control flow termination
66
+
67
+ Raises:
68
+ AgentNodeRoutingException: When encountering unexpected state (empty messages, non-AIMessage, or excessive completions)
69
+ """
70
+ messages = state.get("messages", [])
71
+ last_message = __validate_last_message_is_AI(messages)
72
+
73
+ tool_calls = list(last_message.tool_calls) if last_message.tool_calls else []
74
+ tool_calls = __filter_control_flow_tool_calls(tool_calls)
75
+
76
+ if tool_calls and __has_control_flow_tool(tool_calls):
77
+ return AgentGraphNode.TERMINATE
78
+
79
+ if tool_calls:
80
+ return [tc["name"] for tc in tool_calls]
81
+
82
+ successive_completions = count_successive_completions(messages)
83
+
84
+ if successive_completions > MAX_SUCCESSIVE_COMPLETIONS:
85
+ raise AgentNodeRoutingException(
86
+ f"Agent exceeded successive completions limit without producing tool calls "
87
+ f"(completions: {successive_completions}, max: {MAX_SUCCESSIVE_COMPLETIONS}). "
88
+ f"This should not happen as tool_choice='required' is enforced at the limit."
89
+ )
90
+
91
+ if last_message.content:
92
+ return AgentGraphNode.AGENT
93
+
94
+ raise AgentNodeRoutingException(
95
+ f"Agent produced empty response without tool calls "
96
+ f"(completions: {successive_completions}, has_content: False)"
97
+ )
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import StrEnum
4
+
5
+ from langgraph.graph import MessagesState
6
+
7
+
8
+ class AgentGraphState(MessagesState):
9
+ """Agent Graph state for standard loop execution."""
10
+
11
+ pass
12
+
13
+
14
+ class AgentGraphNode(StrEnum):
15
+ INIT = "init"
16
+ AGENT = "agent"
17
+ TOOLS = "tools"
18
+ TERMINATE = "terminate"
@@ -0,0 +1,53 @@
1
+ """Termination node for the Agent graph."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from langchain_core.messages import AIMessage
6
+ from pydantic import BaseModel
7
+ from uipath._cli._runtime._contracts import UiPathErrorCode
8
+ from uipath.agent.react import END_EXECUTION_TOOL, RAISE_ERROR_TOOL
9
+
10
+ from .exceptions import (
11
+ AgentNodeRoutingException,
12
+ AgentTerminationException,
13
+ )
14
+ from .state import AgentGraphState
15
+
16
+
17
+ def create_terminate_node(
18
+ response_schema: type[BaseModel] | None = None,
19
+ ):
20
+ """Validates and returns end_execution args, or raises AgentTerminationException for raise_error."""
21
+
22
+ def terminate_node(state: AgentGraphState):
23
+ last_message = state["messages"][-1]
24
+ if not isinstance(last_message, AIMessage):
25
+ raise AgentNodeRoutingException(
26
+ f"Expected last message to be AIMessage, got {type(last_message).__name__}"
27
+ )
28
+
29
+ for tool_call in last_message.tool_calls:
30
+ tool_name = tool_call["name"]
31
+
32
+ if tool_name == END_EXECUTION_TOOL.name:
33
+ args = tool_call["args"]
34
+ output_schema = response_schema or END_EXECUTION_TOOL.args_schema
35
+ validated = output_schema.model_validate(args)
36
+ return validated.model_dump()
37
+
38
+ if tool_name == RAISE_ERROR_TOOL.name:
39
+ error_message = tool_call["args"].get(
40
+ "message", "The LLM did not set the error message"
41
+ )
42
+ detail = tool_call["args"].get("details", "")
43
+ raise AgentTerminationException(
44
+ code=UiPathErrorCode.EXECUTION_ERROR,
45
+ title=error_message,
46
+ detail=detail,
47
+ )
48
+
49
+ raise AgentNodeRoutingException(
50
+ "No control flow tool call found in terminate node. Unexpected state."
51
+ )
52
+
53
+ return terminate_node
@@ -0,0 +1,7 @@
1
+ from .tools import (
2
+ create_flow_control_tools,
3
+ )
4
+
5
+ __all__ = [
6
+ "create_flow_control_tools",
7
+ ]