uipath-langchain 0.0.132__tar.gz → 0.0.133__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 (271) hide show
  1. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/PKG-INFO +3 -2
  2. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/pyproject.toml +3 -2
  3. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/calculator-agent/uv.lock +8 -8
  4. uipath_langchain-0.0.133/src/uipath_langchain/tools/__init__.py +0 -0
  5. uipath_langchain-0.0.133/src/uipath_langchain/tools/preconfigured.py +191 -0
  6. uipath_langchain-0.0.133/tests/tools/__init__.py +1 -0
  7. uipath_langchain-0.0.133/tests/tools/conftest.py +72 -0
  8. uipath_langchain-0.0.133/tests/tools/mocks/agent_definition.json +226 -0
  9. uipath_langchain-0.0.133/tests/tools/test_preconfigured.py +94 -0
  10. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/uv.lock +1699 -1685
  11. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.cursorrules +0 -0
  12. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.editorconfig +0 -0
  13. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.gitattributes +0 -0
  14. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/cd.yml +0 -0
  15. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/ci.yml +0 -0
  16. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/commitlint.yml +0 -0
  17. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/integration_tests.yml +0 -0
  18. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/lint-custom-version.yml +0 -0
  19. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/lint.yml +0 -0
  20. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/publish-dev.yml +0 -0
  21. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/publish-docs.yml +0 -0
  22. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/publish-prior-stable-version.yml +0 -0
  23. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/slack.yml +0 -0
  24. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/test-custom-version.yml +0 -0
  25. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.github/workflows/test.yml +0 -0
  26. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.gitignore +0 -0
  27. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.pre-commit-config.yaml +0 -0
  28. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.python-version +0 -0
  29. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.vscode/extensions.json +0 -0
  30. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/.vscode/settings.json +0 -0
  31. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/CONTRIBUTING.md +0 -0
  32. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/LICENSE +0 -0
  33. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/README.md +0 -0
  34. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/chat_models.md +0 -0
  35. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/context_grounding.md +0 -0
  36. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/human_in_the_loop.md +0 -0
  37. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/quick_start.md +0 -0
  38. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/quick_start_images/cloud_env_var_dark.png +0 -0
  39. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/quick_start_images/cloud_env_var_light.png +0 -0
  40. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/quick_start_images/invoke_output_dark.png +0 -0
  41. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/quick_start_images/invoke_output_light.png +0 -0
  42. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/click-storage-bucket.png +0 -0
  43. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-index-1.png +0 -0
  44. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-index-2.png +0 -0
  45. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-process.png +0 -0
  46. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-quiz-generator.png +0 -0
  47. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-storage-bucket-1.png +0 -0
  48. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/create-storage-bucket-2.png +0 -0
  49. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/folder-path.png +0 -0
  50. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/job-info.png +0 -0
  51. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/output.png +0 -0
  52. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/process-page.png +0 -0
  53. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/researcher-1.png +0 -0
  54. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/researcher-2.png +0 -0
  55. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/run-process-1.png +0 -0
  56. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/run-process-2.png +0 -0
  57. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/RAG/storage-bucket-content.png +0 -0
  58. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/coder-agent-package-overview.png +0 -0
  59. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/coder-agent-process-configuration.png +0 -0
  60. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/planner-agent-package-overview.png +0 -0
  61. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/planner-agent-process-configuration.png +0 -0
  62. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/researcher-agent-package-overview.png +0 -0
  63. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/multi-agent-distributed/researcher-agent-process-configuration.png +0 -0
  64. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/activate-apps.png +0 -0
  65. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/activate-deployment.png +0 -0
  66. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/copy-folder-path.png +0 -0
  67. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/deploy-solution-package-wizard.png +0 -0
  68. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/deploy-solution-package.png +0 -0
  69. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/monitor-agent.png +0 -0
  70. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/navigate-to-solution-folder.png +0 -0
  71. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/resume-condition.png +0 -0
  72. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/run-agent.png +0 -0
  73. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/solution-destination-folder.png +0 -0
  74. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/start-job.png +0 -0
  75. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/docs/sample_images/ticket-classification/upload-solution-package.png +0 -0
  76. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/README.md +0 -0
  77. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/env.example +0 -0
  78. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/input.example/quiz-generator-debug-input.json +0 -0
  79. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/input.example/researcher-debug-input.json +0 -0
  80. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/langgraph.json +0 -0
  81. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/pyproject.toml +0 -0
  82. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/quiz-generator-RAG-agent.mermaid +0 -0
  83. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/researcher-RAG-agent.mermaid +0 -0
  84. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/src/agents/quiz-generator-RAG-agent.py +0 -0
  85. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/src/agents/researcher-RAG-agent.py +0 -0
  86. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/uipath.json +0 -0
  87. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/RAG-quiz-generator/uv.lock +0 -0
  88. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/README.md +0 -0
  89. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/calculator-agent/graph.py +0 -0
  90. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/calculator-agent/langgraph.json +0 -0
  91. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/calculator-agent/pyproject.toml +0 -0
  92. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/calculator-agent/uipath.json +0 -0
  93. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/.env.example +0 -0
  94. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/agent.mermaid +0 -0
  95. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/graph.py +0 -0
  96. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/langgraph.json +0 -0
  97. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/pyproject.toml +0 -0
  98. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/uipath.json +0 -0
  99. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/chat-agent/uv.lock +0 -0
  100. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/.env.example +0 -0
  101. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/agent.mermaid +0 -0
  102. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/graph.py +0 -0
  103. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/langgraph.json +0 -0
  104. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/pyproject.toml +0 -0
  105. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/uipath.json +0 -0
  106. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/company-research-agent/uv.lock +0 -0
  107. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/.env.template +0 -0
  108. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/.python-version +0 -0
  109. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/.vscode/launch.json +0 -0
  110. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/README.md +0 -0
  111. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/agent.mermaid +0 -0
  112. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/input.json +0 -0
  113. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/langgraph.json +0 -0
  114. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/pyproject.toml +0 -0
  115. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/src/email_organizer/__init__.py +0 -0
  116. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/src/email_organizer/main.py +0 -0
  117. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/src/email_organizer/outlook_client.py +0 -0
  118. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/uipath.json +0 -0
  119. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/email-organizer-agent/uv.lock +0 -0
  120. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/database.py +0 -0
  121. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/main.py +0 -0
  122. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/models.py +0 -0
  123. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/pyproject.toml +0 -0
  124. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/schemas.py +0 -0
  125. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/templates/index.html +0 -0
  126. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/hitl-inbox-server/uv.lock +0 -0
  127. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/.env.example +0 -0
  128. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/README.md +0 -0
  129. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/coder.mermaid +0 -0
  130. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/langgraph.json +0 -0
  131. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/planner.mermaid +0 -0
  132. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/pyproject.toml +0 -0
  133. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/researcher.mermaid +0 -0
  134. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/coder.py +0 -0
  135. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/planner.py +0 -0
  136. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/researcher.py +0 -0
  137. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/uipath.json +0 -0
  138. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-planner-researcher-coder-distributed/uv.lock +0 -0
  139. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/.env.example +0 -0
  140. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/README.md +0 -0
  141. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/agent.mermaid +0 -0
  142. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/graph.py +0 -0
  143. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/langgraph.json +0 -0
  144. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/pyproject.toml +0 -0
  145. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/uipath.json +0 -0
  146. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/multi-agent-supervisor-researcher-coder/uv.lock +0 -0
  147. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/.env.example +0 -0
  148. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/README.md +0 -0
  149. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/main.py +0 -0
  150. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/pyproject.toml +0 -0
  151. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/uipath.json +0 -0
  152. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/retrieval-chain/uv.lock +0 -0
  153. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/.env.example +0 -0
  154. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/README.md +0 -0
  155. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/agent.mermaid +0 -0
  156. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/langgraph.json +0 -0
  157. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/pyproject.toml +0 -0
  158. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  159. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  160. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  161. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/uipath.json +0 -0
  162. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-local-mcp/uv.lock +0 -0
  163. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/.env.example +0 -0
  164. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/README.md +0 -0
  165. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/agent.mermaid +0 -0
  166. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/langgraph.json +0 -0
  167. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/main.py +0 -0
  168. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/pyproject.toml +0 -0
  169. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/uipath.json +0 -0
  170. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/simple-remote-mcp/uv.lock +0 -0
  171. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/.env.example +0 -0
  172. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/README.md +0 -0
  173. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/agent.mermaid +0 -0
  174. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/escalation_app_solution/generic-escalation-app-solution-1.0.0.zip +0 -0
  175. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/langgraph.json +0 -0
  176. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/main.py +0 -0
  177. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/pyproject.toml +0 -0
  178. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/uipath.json +0 -0
  179. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/samples/ticket-classification/uv.lock +0 -0
  180. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/__init__.py +0 -0
  181. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/__init__.py +0 -0
  182. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_context.py +0 -0
  183. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_conversation.py +0 -0
  184. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_exception.py +0 -0
  185. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_input.py +0 -0
  186. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_output.py +0 -0
  187. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_runtime/_runtime.py +0 -0
  188. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_templates/langgraph.json.template +0 -0
  189. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_templates/main.py.template +0 -0
  190. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/_utils/_graph.py +0 -0
  191. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/cli_dev.py +0 -0
  192. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/cli_eval.py +0 -0
  193. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/cli_init.py +0 -0
  194. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/cli_new.py +0 -0
  195. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_cli/cli_run.py +0 -0
  196. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_tracing/__init__.py +0 -0
  197. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_tracing/_instrument_traceable.py +0 -0
  198. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_tracing/_oteladapter.py +0 -0
  199. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_tracing/_utils.py +0 -0
  200. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_utils/__init__.py +0 -0
  201. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_utils/_request_mixin.py +0 -0
  202. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_utils/_settings.py +0 -0
  203. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/_utils/_sleep_policy.py +0 -0
  204. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/builder/agent_config.py +0 -0
  205. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/chat/__init__.py +0 -0
  206. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/chat/models.py +0 -0
  207. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/embeddings/__init__.py +0 -0
  208. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/embeddings/embeddings.py +0 -0
  209. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/middlewares.py +0 -0
  210. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/retrievers/__init__.py +0 -0
  211. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/retrievers/context_grounding_retriever.py +0 -0
  212. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/vectorstores/__init__.py +0 -0
  213. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/src/uipath_langchain/vectorstores/context_grounding_vectorstore.py +0 -0
  214. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/Dockerfile +0 -0
  215. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/README.md +0 -0
  216. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/common/print_output.sh +0 -0
  217. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/.env.example +0 -0
  218. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/agent.mermaid +0 -0
  219. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/input.json +0 -0
  220. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/langgraph.json +0 -0
  221. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/pyproject.toml +0 -0
  222. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/run.sh +0 -0
  223. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/src/assert.py +0 -0
  224. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/src/graph.py +0 -0
  225. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/uipath.json +0 -0
  226. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/company-research-agent/uv.lock +0 -0
  227. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/.env.example +0 -0
  228. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/README.md +0 -0
  229. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/agent.mermaid +0 -0
  230. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/input.json +0 -0
  231. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/langgraph.json +0 -0
  232. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/pyproject.toml +0 -0
  233. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/run.sh +0 -0
  234. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/src/assert.py +0 -0
  235. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  236. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  237. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  238. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/uipath.json +0 -0
  239. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/simple-local-mcp/uv.lock +0 -0
  240. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/.env.example +0 -0
  241. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/README.md +0 -0
  242. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/agent.mermaid +0 -0
  243. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/input.json +0 -0
  244. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/langgraph.json +0 -0
  245. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/pyproject.toml +0 -0
  246. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/run.sh +0 -0
  247. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/src/assert.py +0 -0
  248. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/src/main.py +0 -0
  249. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/uipath.json +0 -0
  250. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/testcases/ticket-classification/uv.lock +0 -0
  251. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/__init__.py +0 -0
  252. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/builder/test_config.py +0 -0
  253. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/cli/conftest.py +0 -0
  254. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/cli/mocks/langgraph.json +0 -0
  255. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/cli/mocks/simple_agent.py +0 -0
  256. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/cli/mocks/uipath.json +0 -0
  257. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/cli/test_run.py +0 -0
  258. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/__init__.py +0 -0
  259. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/conftest.py +0 -0
  260. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/action_trigger_hitl.py +0 -0
  261. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/api_trigger_hitl.py +0 -0
  262. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/job_trigger_hitl.py +0 -0
  263. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/langgraph.json +0 -0
  264. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/uipath-default-escalation.json +0 -0
  265. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/mocks/uipath.json +0 -0
  266. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/test_action_trigger.py +0 -0
  267. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/test_hitl_api_trigger.py +0 -0
  268. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/test_hitl_default_escalation.py +0 -0
  269. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/hitl/test_hitl_job_trigger.py +0 -0
  270. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/test_dummy.py +0 -0
  271. {uipath_langchain-0.0.132 → uipath_langchain-0.0.133}/tests/tracing/test_oteladapter.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath-langchain
3
- Version: 0.0.132
3
+ Version: 0.0.133
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
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Topic :: Software Development :: Build Tools
16
16
  Requires-Python: >=3.10
17
17
  Requires-Dist: httpx>=0.27.0
18
+ Requires-Dist: jsonschema-pydantic>=0.6
18
19
  Requires-Dist: langchain-community>=0.3.21
19
20
  Requires-Dist: langchain-core>=0.3.34
20
21
  Requires-Dist: langchain-openai>=0.3.3
@@ -25,7 +26,7 @@ Requires-Dist: openai>=1.65.5
25
26
  Requires-Dist: openinference-instrumentation-langchain>=0.1.50
26
27
  Requires-Dist: pydantic-settings>=2.6.0
27
28
  Requires-Dist: python-dotenv>=1.0.1
28
- Requires-Dist: uipath<2.2.0,>=2.1.56
29
+ Requires-Dist: uipath<2.2.0,>=2.1.60
29
30
  Provides-Extra: langchain
30
31
  Description-Content-Type: text/markdown
31
32
 
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "uipath-langchain"
3
- version = "0.0.132"
3
+ version = "0.0.133"
4
4
  description = "UiPath Langchain"
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  requires-python = ">=3.10"
7
7
  dependencies = [
8
- "uipath>=2.1.56, <2.2.0",
8
+ "uipath>=2.1.60, <2.2.0",
9
9
  "langgraph>=0.5.0, <0.7.0",
10
10
  "langchain-core>=0.3.34",
11
11
  "langgraph-checkpoint-sqlite>=2.0.3",
@@ -17,6 +17,7 @@ dependencies = [
17
17
  "httpx>=0.27.0",
18
18
  "openai>=1.65.5",
19
19
  "openinference-instrumentation-langchain>=0.1.50",
20
+ "jsonschema-pydantic>=0.6",
20
21
  ]
21
22
  classifiers = [
22
23
  "Development Status :: 3 - Alpha",
@@ -285,7 +285,7 @@ requires-dist = [
285
285
  { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.11.1" },
286
286
  { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.1" },
287
287
  { name = "uipath", specifier = ">=2.1.54" },
288
- { name = "uipath-langchain", editable = "../../" },
288
+ { name = "uipath-langchain", directory = "../../" },
289
289
  ]
290
290
  provides-extras = ["dev"]
291
291
 
@@ -557,7 +557,7 @@ name = "exceptiongroup"
557
557
  version = "1.3.0"
558
558
  source = { registry = "https://pypi.org/simple" }
559
559
  dependencies = [
560
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
560
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
561
561
  ]
562
562
  sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 }
563
563
  wheels = [
@@ -2640,7 +2640,7 @@ wheels = [
2640
2640
 
2641
2641
  [[package]]
2642
2642
  name = "uipath"
2643
- version = "2.1.54"
2643
+ version = "2.1.56"
2644
2644
  source = { registry = "https://pypi.org/simple" }
2645
2645
  dependencies = [
2646
2646
  { name = "azure-monitor-opentelemetry" },
@@ -2658,15 +2658,15 @@ dependencies = [
2658
2658
  { name = "tomli" },
2659
2659
  { name = "truststore" },
2660
2660
  ]
2661
- sdist = { url = "https://files.pythonhosted.org/packages/e8/4f/5e34bde81c3ccd98a937101c4cd069901cb9f0158b53dea0f58bd4f908ec/uipath-2.1.54.tar.gz", hash = "sha256:bc3bedea41fa4517495eba6a14a6e794d8e93740ee1dd229f417ee0e325c367c", size = 2001743 }
2661
+ sdist = { url = "https://files.pythonhosted.org/packages/73/bd/058b5f5c1e8b41db0c1f4fd3d8eb73c88eb9ead4edb538ae7b2304fa65e1/uipath-2.1.56.tar.gz", hash = "sha256:3afdcf7ebab02d88115d6700d93da19a7cf50b93123a3faf1755c25e6adffcd3", size = 2006943 }
2662
2662
  wheels = [
2663
- { url = "https://files.pythonhosted.org/packages/94/ce/dc6c7e8b20474761ec17c7e8fcfd3619880c921bcfbe3df3d1f6890c71d6/uipath-2.1.54-py3-none-any.whl", hash = "sha256:379105de535f1c3922794fb14574790aa7c1b4b63256ebcff7d28f486ef34df3", size = 228190 },
2663
+ { url = "https://files.pythonhosted.org/packages/17/0e/58e805e67788859a4a6811a224f723436990058ca085905b2f3b0dd6aa3a/uipath-2.1.56-py3-none-any.whl", hash = "sha256:0ea1c738da38c2c808bf03d4590cd715cd187187f2972e5c5f38d1034ad84245", size = 228414 },
2664
2664
  ]
2665
2665
 
2666
2666
  [[package]]
2667
2667
  name = "uipath-langchain"
2668
- version = "0.0.130"
2669
- source = { editable = "../../" }
2668
+ version = "0.0.132"
2669
+ source = { directory = "../../" }
2670
2670
  dependencies = [
2671
2671
  { name = "httpx" },
2672
2672
  { name = "langchain" },
@@ -2695,7 +2695,7 @@ requires-dist = [
2695
2695
  { name = "openinference-instrumentation-langchain", specifier = ">=0.1.50" },
2696
2696
  { name = "pydantic-settings", specifier = ">=2.6.0" },
2697
2697
  { name = "python-dotenv", specifier = ">=1.0.1" },
2698
- { name = "uipath", specifier = ">=2.1.49,<2.2.0" },
2698
+ { name = "uipath", specifier = ">=2.1.56,<2.2.0" },
2699
2699
  { name = "uipath-langchain", marker = "extra == 'langchain'", specifier = ">=0.0.2" },
2700
2700
  ]
2701
2701
  provides-extras = ["langchain"]
@@ -0,0 +1,191 @@
1
+ import json
2
+ import logging
3
+ from typing import Iterable, Optional, Type
4
+
5
+ import httpx
6
+ from jsonschema_pydantic import jsonschema_to_pydantic as create_model # type: ignore
7
+ from langchain_core.caches import BaseCache
8
+ from langchain_core.runnables.utils import Output
9
+ from langchain_core.tools import BaseTool, StructuredTool
10
+ from langgraph.types import interrupt
11
+ from pydantic import BaseModel
12
+ from uipath import UiPath
13
+ from uipath.agent.models.agent import (
14
+ AgentDefinition,
15
+ AgentEscalationChannel,
16
+ AgentEscalationResourceConfig,
17
+ AgentIntegrationToolResourceConfig,
18
+ AgentProcessToolResourceConfig,
19
+ AgentResourceConfig,
20
+ )
21
+ from uipath.models import CreateAction, InvokeProcess
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def create_process_tool(resource: AgentProcessToolResourceConfig) -> Iterable[BaseTool]:
27
+ async def process(**kwargs) -> BaseModel:
28
+ return interrupt(
29
+ InvokeProcess(
30
+ name=resource.name,
31
+ input_arguments=kwargs,
32
+ process_folder_path=resource.properties.folder_path,
33
+ )
34
+ )
35
+
36
+ input_schema = create_model(resource.input_schema)
37
+
38
+ class ProcessTool(StructuredTool):
39
+ @property
40
+ def OutputType(self) -> type[Output]:
41
+ return create_model(resource.output_schema)
42
+
43
+ yield ProcessTool(
44
+ name=resource.name,
45
+ args_schema=input_schema,
46
+ description=resource.description,
47
+ coroutine=process,
48
+ )
49
+
50
+
51
+ def create_escalation_tool_from_channel(channel: AgentEscalationChannel) -> BaseTool:
52
+ async def escalate(**kwargs) -> BaseModel:
53
+ recipients = channel.recipients
54
+ if len(recipients) > 1:
55
+ logger.warning(
56
+ "Received more than one recipient. Defaulting to first recipient."
57
+ )
58
+ assignee = recipients[0].value if recipients else None
59
+ return interrupt(
60
+ CreateAction(
61
+ title=channel.description,
62
+ data=kwargs,
63
+ assignee=assignee,
64
+ app_name=channel.properties.app_name,
65
+ app_folder_path=None, # Channels specify folder name but not folder path.
66
+ app_folder_key=channel.properties.resource_key,
67
+ app_key=channel.properties.resource_key,
68
+ app_version=channel.properties.app_version,
69
+ )
70
+ )
71
+
72
+ input_schema = create_model(channel.input_schema)
73
+
74
+ class EscalationTool(StructuredTool):
75
+ @property
76
+ def OutputType(self) -> type[Output]:
77
+ return create_model(channel.output_schema)
78
+
79
+ return EscalationTool(
80
+ name=channel.name,
81
+ args_schema=input_schema,
82
+ description=channel.description,
83
+ coroutine=escalate,
84
+ )
85
+
86
+
87
+ def create_escalation_tool(
88
+ resource: AgentEscalationResourceConfig,
89
+ ) -> Iterable[BaseTool]:
90
+ for channel in resource.channels:
91
+ yield create_escalation_tool_from_channel(channel)
92
+
93
+
94
+ def create_integration_tool(
95
+ resource: AgentIntegrationToolResourceConfig,
96
+ ) -> Iterable[BaseTool]:
97
+ async def integration(**kwargs) -> BaseModel:
98
+ uipath = UiPath()
99
+ remote_connection = await uipath.connections.retrieve_async(
100
+ resource.properties.connection.id
101
+ )
102
+ token = await uipath.connections.retrieve_token_async(
103
+ resource.properties.connection.id
104
+ )
105
+ tool_url = f"{remote_connection.api_base_uri}/v3/element/instances/{remote_connection.element_instance_id}{resource.properties.tool_path}"
106
+
107
+ response = await httpx.AsyncClient().request(
108
+ resource.properties.method,
109
+ tool_url,
110
+ headers={"Authorization": f"Bearer {token.access_token}"},
111
+ content=json.dumps(kwargs),
112
+ )
113
+ return response.json()
114
+
115
+ input_schema = create_model(resource.input_schema)
116
+
117
+ class IntegrationTool(StructuredTool):
118
+ @property
119
+ def OutputType(self) -> type[Output]:
120
+ return create_model({})
121
+
122
+ yield IntegrationTool(
123
+ name=resource.name,
124
+ args_schema=input_schema,
125
+ description=resource.description,
126
+ coroutine=integration,
127
+ )
128
+
129
+
130
+ def create_cached_wrapper_from_tool(
131
+ wrapped: BaseTool, cache: Optional[BaseCache]
132
+ ) -> BaseTool:
133
+ if cache is None:
134
+ return wrapped
135
+ else:
136
+
137
+ async def cached_invocation(**kwargs) -> BaseModel:
138
+ namespace = f"{wrapped.name}.tool_invoke"
139
+ key = str(kwargs)
140
+ cached = cache.lookup(namespace, key)
141
+ if cached:
142
+ return cached[0]
143
+ response = await wrapped.ainvoke(input=kwargs)
144
+ cache.update(namespace, key, [response])
145
+ return response
146
+
147
+ input_schema = wrapped.args_schema
148
+
149
+ class CachedTool(StructuredTool):
150
+ OutputType: Type[BaseModel] = wrapped.OutputType
151
+
152
+ return CachedTool(
153
+ name=wrapped.name,
154
+ args_schema=input_schema,
155
+ description=wrapped.description,
156
+ coroutine=cached_invocation,
157
+ )
158
+
159
+
160
+ def create_cached_wrapper(
161
+ tools: Iterable[BaseTool], cache: Optional[BaseCache]
162
+ ) -> Iterable[BaseTool]:
163
+ for wrapped in tools:
164
+ yield create_cached_wrapper_from_tool(wrapped, cache)
165
+
166
+
167
+ def create_resource_tool(
168
+ resource: AgentResourceConfig, cache: Optional[BaseCache] = None
169
+ ) -> Iterable[BaseTool]:
170
+ match resource:
171
+ case AgentProcessToolResourceConfig():
172
+ return create_cached_wrapper(create_process_tool(resource), cache)
173
+ case AgentIntegrationToolResourceConfig():
174
+ return create_cached_wrapper(create_integration_tool(resource), cache)
175
+ case AgentEscalationResourceConfig():
176
+ return create_cached_wrapper(create_escalation_tool(resource), cache)
177
+ case _:
178
+ raise NotImplementedError()
179
+
180
+
181
+ def safe_extract_tools(
182
+ agent_definition: AgentDefinition, cache: Optional[BaseCache] = None
183
+ ) -> list[BaseTool]:
184
+ tools = []
185
+ for resource in agent_definition.resources:
186
+ try:
187
+ for structured_tool in create_resource_tool(resource, cache):
188
+ tools.append(structured_tool)
189
+ except NotImplementedError:
190
+ logger.warning(f"Unable to convert {resource.name} into a tool.")
191
+ return tools
@@ -0,0 +1 @@
1
+ # Init file to make the tests directory a package
@@ -0,0 +1,72 @@
1
+ import os
2
+ from contextlib import contextmanager
3
+
4
+
5
+ def get_file_path(file_name: str) -> str:
6
+ """
7
+ Get the path to a mock file, checking multiple possible locations.
8
+
9
+ Args:
10
+ file_name: Name of the file to locate
11
+
12
+ Returns:
13
+ Absolute path to the file
14
+ """
15
+ if os.path.isfile(f"mocks/{file_name}"):
16
+ return os.path.abspath(f"mocks/{file_name}")
17
+ else:
18
+ return os.path.abspath(f"tests/tools/mocks/{file_name}")
19
+
20
+
21
+ @contextmanager
22
+ def uipath_connection_mock(httpx_mock, response):
23
+ httpx_mock.add_response(
24
+ url="https://example.com/api/v1/Connections/connection-id",
25
+ method="GET",
26
+ json=response,
27
+ )
28
+
29
+ try:
30
+ yield
31
+ finally:
32
+ pass
33
+
34
+
35
+ @contextmanager
36
+ def uipath_token_mock(httpx_mock, response):
37
+ httpx_mock.add_response(
38
+ url="https://example.com/api/v1/Connections/connection-id/token?tokenType=direct",
39
+ method="GET",
40
+ json=response,
41
+ )
42
+
43
+ try:
44
+ yield
45
+ finally:
46
+ pass
47
+
48
+
49
+ @contextmanager
50
+ def uipath_integration_mock(httpx_mock, response):
51
+ httpx_mock.add_response(
52
+ url="https://example.uipath.com//v3/element/instances/0/integration",
53
+ method="POST",
54
+ json=response,
55
+ )
56
+
57
+ try:
58
+ yield
59
+ finally:
60
+ pass
61
+
62
+
63
+ @contextmanager
64
+ def uipath_interrupt_mock(mocker, tool_response):
65
+ mocker.patch(
66
+ "uipath_langchain.tools.preconfigured.interrupt", return_value=tool_response
67
+ )
68
+
69
+ try:
70
+ yield
71
+ finally:
72
+ pass
@@ -0,0 +1,226 @@
1
+ {
2
+ "id": "agent-id",
3
+ "name": "agent-name",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "query": {
8
+ "type": "string"
9
+ }
10
+ }
11
+ },
12
+ "outputSchema": {
13
+ "type": "object",
14
+ "properties": {
15
+ "content": {
16
+ "type": "string",
17
+ "description": "Output content"
18
+ }
19
+ }
20
+ },
21
+ "version": "1.0.0",
22
+ "resources": [
23
+ {
24
+ "name": "Integration",
25
+ "description": "Integration.",
26
+ "$resourceType": "tool",
27
+ "inputSchema": {
28
+ "type": "object",
29
+ "properties": {
30
+ "query": {
31
+ "type": "string",
32
+ "description": "Query.",
33
+ "title": "Query"
34
+ }
35
+ },
36
+ "required": [
37
+ "query"
38
+ ]
39
+ },
40
+ "type": "integration",
41
+ "properties": {
42
+ "toolPath": "/integration",
43
+ "objectName": "v2::integration",
44
+ "toolDisplayName": "Integration",
45
+ "toolDescription": "Integration.",
46
+ "method": "POST",
47
+ "connection": {
48
+ "id": "connection-id",
49
+ "name": "integration",
50
+ "owner": null,
51
+ "createTime": null,
52
+ "updateTime": null,
53
+ "state": "enabled",
54
+ "apiBaseUri": "https://example.uipath.com/",
55
+ "elementInstanceId": 0,
56
+ "connector": {
57
+ "key": "connector-key",
58
+ "name": "connector-name",
59
+ "image": "connector-image",
60
+ "enabled": true
61
+ },
62
+ "isDefault": false,
63
+ "lastUsedTime": null,
64
+ "connectionIdentity": null,
65
+ "pollingIntervalInMinutes": null,
66
+ "folder": {
67
+ "key": "folder-key",
68
+ "path": "folder-path"
69
+ },
70
+ "elementVersion": null,
71
+ "solutionProperties": {
72
+ "resourceKey": "solution-resource-key"
73
+ }
74
+ },
75
+ "bodyStructure": {
76
+ "contentType": "json"
77
+ }
78
+ },
79
+ "location": "external",
80
+ "settings": {},
81
+ "guardrail": {
82
+ "policies": []
83
+ },
84
+ "iconUrl": "icon-url",
85
+ "id": "resource-1",
86
+ "isPreview": false
87
+ },
88
+ {
89
+ "name": "Escalation",
90
+ "description": "Human review.",
91
+ "$resourceType": "escalation",
92
+ "channels": [
93
+ {
94
+ "id": "escalation",
95
+ "name": "Channel",
96
+ "type": "actionCenter",
97
+ "description": "Channel description",
98
+ "inputSchema": {
99
+ "type": "object",
100
+ "properties": {
101
+ "name": {
102
+ "type": "string",
103
+ "description": "Name."
104
+ }
105
+ },
106
+ "required": [
107
+ "name"
108
+ ]
109
+ },
110
+ "outputSchema": {
111
+ "type": "object",
112
+ "properties": {
113
+ "status": {
114
+ "type": "string",
115
+ "description": "Escalation status."
116
+ }
117
+ },
118
+ "required": [
119
+ "status"
120
+ ]
121
+ },
122
+ "properties": {
123
+ "appName": "ActionApp",
124
+ "appVersion": 1,
125
+ "folderName": null,
126
+ "resourceKey": "resource-key",
127
+ "isActionableMessageEnabled": false,
128
+ "actionableMessageMetaData": null
129
+ },
130
+ "recipients": [
131
+ {
132
+ "type": 2,
133
+ "value": "test-group-id",
134
+ "displayName": "test-group"
135
+ }
136
+ ],
137
+ "inputSchemaDotnetTypeMapping": {
138
+ "name": "System.String"
139
+ },
140
+ "outputSchemaDotnetTypeMapping": {
141
+ "status": "System.String"
142
+ },
143
+ "outcomeMapping": {
144
+ "Submit": "continue"
145
+ }
146
+ }
147
+ ],
148
+ "isAgentMemoryEnabled": false,
149
+ "id": "resource-2",
150
+ "governanceProperties": {
151
+ "isEscalatedAtRuntime": false
152
+ },
153
+ "escalationType": 0,
154
+ "vsEscalationProperties": null
155
+ },
156
+ {
157
+ "name": "Agent",
158
+ "description": "Agent.",
159
+ "$resourceType": "tool",
160
+ "inputSchema": {
161
+ "type": "object",
162
+ "properties": {
163
+ "name": {
164
+ "type": "string"
165
+ }
166
+ }
167
+ },
168
+ "type": "agent",
169
+ "outputSchema": {
170
+ "type": "object",
171
+ "properties": {
172
+ "content": {
173
+ "type": "str",
174
+ "description": "Output content"
175
+ }
176
+ },
177
+ "required": [
178
+ "content"
179
+ ]
180
+ },
181
+ "properties": {
182
+ "folderPath": "solution-folder",
183
+ "processName": "process-name"
184
+ },
185
+ "settings": {
186
+ "maxAttempts": null,
187
+ "retryDelay": null,
188
+ "timeout": null
189
+ },
190
+ "location": "external",
191
+ "guardrail": {
192
+ "policies": []
193
+ },
194
+ "id": "resource-3",
195
+ "referenceKey": "resource-3-reference-key"
196
+ },
197
+ {
198
+ "name": "Unknown",
199
+ "description": "Unknown.",
200
+ "$resourceType": "unknown"
201
+ }
202
+ ],
203
+ "type": "lowCode",
204
+ "messages": [
205
+ {
206
+ "role": "system",
207
+ "content": "System Prompt"
208
+ },
209
+ {
210
+ "role": "user",
211
+ "content": "User Prompt"
212
+ }
213
+ ],
214
+ "features": [],
215
+ "settings": {
216
+ "engine": "basic-v1",
217
+ "model": "model-1",
218
+ "max_tokens": 16384,
219
+ "temperature": 0.0
220
+ },
221
+ "metadata": {
222
+ "storageVersion": "22.0.0",
223
+ "isConversational": false
224
+ },
225
+ "guardrails": []
226
+ }
@@ -0,0 +1,94 @@
1
+ import copy
2
+ import json
3
+
4
+ from pydantic import TypeAdapter
5
+ from uipath.agent.models.agent import AgentDefinition
6
+
7
+ from tests.tools.conftest import (
8
+ get_file_path,
9
+ uipath_connection_mock,
10
+ uipath_integration_mock,
11
+ uipath_interrupt_mock,
12
+ uipath_token_mock,
13
+ )
14
+ from uipath_langchain.tools.preconfigured import safe_extract_tools
15
+
16
+
17
+ class TestSafeExtractTools:
18
+ """Test class for tool extraction."""
19
+
20
+ async def test_extraction(self, monkeypatch, httpx_mock, mocker) -> None:
21
+ # Arrange
22
+ monkeypatch.setenv("UIPATH_URL", "https://example.com/")
23
+ monkeypatch.setenv("UIPATH_ACCESS_TOKEN", "1234567890")
24
+
25
+ agent_definition = get_file_path("agent_definition.json")
26
+ with open(agent_definition) as agent_definition_file:
27
+ agent_definition_json = json.load(agent_definition_file)
28
+ agent_definition = TypeAdapter(AgentDefinition).validate_python(
29
+ agent_definition_json
30
+ )
31
+ tool_response = {"foo": "bar"}
32
+
33
+ # Act
34
+ tools = safe_extract_tools(agent_definition)
35
+
36
+ # Assert tools and schema definitions
37
+ assert len(tools) == 3
38
+ assert tools[0].input_schema.model_json_schema().get("properties") == {
39
+ "query": {"description": "Query.", "title": "Query", "type": "string"}
40
+ }
41
+ assert tools[0].OutputType.model_json_schema().get("properties") == {}
42
+ assert tools[1].input_schema.model_json_schema().get("properties") == {
43
+ "name": {"description": "Name.", "title": "Name", "type": "string"}
44
+ }
45
+ assert tools[1].OutputType.model_json_schema().get("properties") == {
46
+ "status": {
47
+ "description": "Escalation status.",
48
+ "title": "Status",
49
+ "type": "string",
50
+ }
51
+ }
52
+ assert tools[2].input_schema.model_json_schema().get("properties") == {
53
+ "name": {
54
+ "anyOf": [{"type": "string"}, {"type": "null"}],
55
+ "default": None,
56
+ "title": "Name",
57
+ }
58
+ }
59
+ assert tools[2].OutputType.model_json_schema().get("properties") == {
60
+ "content": {"description": "Output content", "title": "Content"}
61
+ }
62
+
63
+ # Invoke Integration
64
+ mock_connection = copy.deepcopy(
65
+ agent_definition_json["resources"][0]["properties"]["connection"]
66
+ )
67
+ mock_connection["element_instance_id"] = 1 # Updated instance id.
68
+
69
+ with (
70
+ uipath_connection_mock(httpx_mock, response=mock_connection),
71
+ uipath_token_mock(httpx_mock, response={"accessToken": "accessToken"}),
72
+ uipath_integration_mock(httpx_mock, tool_response),
73
+ ):
74
+ # Act
75
+ response = await tools[0].ainvoke(input={"query": "query"})
76
+
77
+ # Assert
78
+ assert response == tool_response
79
+
80
+ # Invoke Escalation
81
+ with uipath_interrupt_mock(mocker, tool_response):
82
+ # Act
83
+ response = await tools[1].ainvoke(input={"name": "name"})
84
+
85
+ # Assert
86
+ assert response == tool_response
87
+
88
+ # Invoke Escalation
89
+ with uipath_interrupt_mock(mocker, tool_response):
90
+ # Act
91
+ response = await tools[2].ainvoke(input={"name": "name"})
92
+
93
+ # Assert
94
+ assert response == tool_response