uipath-langchain 0.0.145__tar.gz → 0.0.146__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 (301) hide show
  1. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/PKG-INFO +1 -1
  2. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/pyproject.toml +1 -1
  3. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_runtime.py +3 -3
  4. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_utils/_schema.py +65 -13
  5. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_init.py +10 -3
  6. uipath_langchain-0.0.146/tests/cli/test_schema.py +266 -0
  7. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/uv.lock +138 -124
  8. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.cursorrules +0 -0
  9. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.editorconfig +0 -0
  10. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.gitattributes +0 -0
  11. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/cd.yml +0 -0
  12. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/ci.yml +0 -0
  13. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/commitlint.yml +0 -0
  14. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/integration_tests.yml +0 -0
  15. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/lint-custom-version.yml +0 -0
  16. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/lint.yml +0 -0
  17. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/publish-dev.yml +0 -0
  18. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/publish-docs.yml +0 -0
  19. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/publish-prior-stable-version.yml +0 -0
  20. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/slack.yml +0 -0
  21. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/test-custom-version.yml +0 -0
  22. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.github/workflows/test.yml +0 -0
  23. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.gitignore +0 -0
  24. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.pre-commit-config.yaml +0 -0
  25. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.python-version +0 -0
  26. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.vscode/extensions.json +0 -0
  27. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/.vscode/settings.json +0 -0
  28. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/CONTRIBUTING.md +0 -0
  29. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/LICENSE +0 -0
  30. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/README.md +0 -0
  31. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/chat_models.md +0 -0
  32. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/context_grounding.md +0 -0
  33. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/human_in_the_loop.md +0 -0
  34. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/quick_start.md +0 -0
  35. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/quick_start_images/cloud_env_var_dark.png +0 -0
  36. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/quick_start_images/cloud_env_var_light.png +0 -0
  37. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/quick_start_images/invoke_output_dark.png +0 -0
  38. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/quick_start_images/invoke_output_light.png +0 -0
  39. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/click-storage-bucket.png +0 -0
  40. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-index-1.png +0 -0
  41. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-index-2.png +0 -0
  42. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-process.png +0 -0
  43. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-quiz-generator.png +0 -0
  44. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-storage-bucket-1.png +0 -0
  45. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/create-storage-bucket-2.png +0 -0
  46. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/folder-path.png +0 -0
  47. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/job-info.png +0 -0
  48. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/output.png +0 -0
  49. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/process-page.png +0 -0
  50. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/researcher-1.png +0 -0
  51. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/researcher-2.png +0 -0
  52. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/run-process-1.png +0 -0
  53. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/run-process-2.png +0 -0
  54. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/RAG/storage-bucket-content.png +0 -0
  55. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/coder-agent-package-overview.png +0 -0
  56. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/coder-agent-process-configuration.png +0 -0
  57. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/planner-agent-package-overview.png +0 -0
  58. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/planner-agent-process-configuration.png +0 -0
  59. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/researcher-agent-package-overview.png +0 -0
  60. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/multi-agent-distributed/researcher-agent-process-configuration.png +0 -0
  61. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/activate-apps.png +0 -0
  62. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/activate-deployment.png +0 -0
  63. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/copy-folder-path.png +0 -0
  64. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/deploy-solution-package-wizard.png +0 -0
  65. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/deploy-solution-package.png +0 -0
  66. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/monitor-agent.png +0 -0
  67. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/navigate-to-solution-folder.png +0 -0
  68. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/resume-condition.png +0 -0
  69. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/run-agent.png +0 -0
  70. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/solution-destination-folder.png +0 -0
  71. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/start-job.png +0 -0
  72. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/docs/sample_images/ticket-classification/upload-solution-package.png +0 -0
  73. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/README.md +0 -0
  74. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/env.example +0 -0
  75. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/input.example/quiz-generator-debug-input.json +0 -0
  76. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/input.example/researcher-debug-input.json +0 -0
  77. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/langgraph.json +0 -0
  78. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/pyproject.toml +0 -0
  79. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/quiz-generator-RAG-agent.mermaid +0 -0
  80. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/researcher-RAG-agent.mermaid +0 -0
  81. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/src/agents/quiz-generator-RAG-agent.py +0 -0
  82. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/src/agents/researcher-RAG-agent.py +0 -0
  83. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/uipath.json +0 -0
  84. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/RAG-quiz-generator/uv.lock +0 -0
  85. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/README.md +0 -0
  86. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/calculator-agent/graph.py +0 -0
  87. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/calculator-agent/langgraph.json +0 -0
  88. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/calculator-agent/pyproject.toml +0 -0
  89. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/calculator-agent/uipath.json +0 -0
  90. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/calculator-agent/uv.lock +0 -0
  91. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/.env.example +0 -0
  92. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/agent.mermaid +0 -0
  93. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/graph.py +0 -0
  94. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/langgraph.json +0 -0
  95. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/pyproject.toml +0 -0
  96. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/uipath.json +0 -0
  97. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/chat-agent/uv.lock +0 -0
  98. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/.env.example +0 -0
  99. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/agent.mermaid +0 -0
  100. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/graph.py +0 -0
  101. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/langgraph.json +0 -0
  102. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/pyproject.toml +0 -0
  103. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/uipath.json +0 -0
  104. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/company-research-agent/uv.lock +0 -0
  105. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/.env.template +0 -0
  106. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/.python-version +0 -0
  107. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/.vscode/launch.json +0 -0
  108. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/README.md +0 -0
  109. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/agent.mermaid +0 -0
  110. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/input.json +0 -0
  111. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/langgraph.json +0 -0
  112. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/pyproject.toml +0 -0
  113. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/src/email_organizer/__init__.py +0 -0
  114. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/src/email_organizer/main.py +0 -0
  115. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/src/email_organizer/outlook_client.py +0 -0
  116. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/uipath.json +0 -0
  117. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/email-organizer-agent/uv.lock +0 -0
  118. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/database.py +0 -0
  119. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/main.py +0 -0
  120. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/models.py +0 -0
  121. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/pyproject.toml +0 -0
  122. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/schemas.py +0 -0
  123. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/templates/index.html +0 -0
  124. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/hitl-inbox-server/uv.lock +0 -0
  125. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/.env.example +0 -0
  126. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/README.md +0 -0
  127. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/coder.mermaid +0 -0
  128. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/langgraph.json +0 -0
  129. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/planner.mermaid +0 -0
  130. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/pyproject.toml +0 -0
  131. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/researcher.mermaid +0 -0
  132. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/coder.py +0 -0
  133. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/planner.py +0 -0
  134. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/src/multi-agent-distributed/researcher.py +0 -0
  135. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/uipath.json +0 -0
  136. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-planner-researcher-coder-distributed/uv.lock +0 -0
  137. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/.env.example +0 -0
  138. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/README.md +0 -0
  139. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/agent.mermaid +0 -0
  140. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/graph.py +0 -0
  141. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/langgraph.json +0 -0
  142. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/pyproject.toml +0 -0
  143. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/uipath.json +0 -0
  144. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/multi-agent-supervisor-researcher-coder/uv.lock +0 -0
  145. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/.env.example +0 -0
  146. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/README.md +0 -0
  147. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/input.json +0 -0
  148. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/langgraph.json +0 -0
  149. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/main.py +0 -0
  150. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/pyproject.toml +0 -0
  151. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/oauth-external-apps-agent/uv.lock +0 -0
  152. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/.env.example +0 -0
  153. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/README.md +0 -0
  154. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/main.py +0 -0
  155. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/pyproject.toml +0 -0
  156. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/uipath.json +0 -0
  157. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/retrieval-chain/uv.lock +0 -0
  158. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/.env.example +0 -0
  159. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/README.md +0 -0
  160. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/agent.mermaid +0 -0
  161. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/langgraph.json +0 -0
  162. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/pyproject.toml +0 -0
  163. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  164. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  165. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  166. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/uipath.json +0 -0
  167. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-local-mcp/uv.lock +0 -0
  168. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/.env.example +0 -0
  169. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/README.md +0 -0
  170. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/agent.mermaid +0 -0
  171. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/langgraph.json +0 -0
  172. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/main.py +0 -0
  173. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/pyproject.toml +0 -0
  174. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/uipath.json +0 -0
  175. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/simple-remote-mcp/uv.lock +0 -0
  176. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/.env.example +0 -0
  177. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/README.md +0 -0
  178. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/agent.mermaid +0 -0
  179. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/escalation_app_solution/generic-escalation-app-solution-1.0.0.zip +0 -0
  180. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/langgraph.json +0 -0
  181. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/main.py +0 -0
  182. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/pyproject.toml +0 -0
  183. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/uipath.json +0 -0
  184. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/samples/ticket-classification/uv.lock +0 -0
  185. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/__init__.py +0 -0
  186. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/__init__.py +0 -0
  187. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_context.py +0 -0
  188. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_conversation.py +0 -0
  189. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_exception.py +0 -0
  190. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_graph_resolver.py +0 -0
  191. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_input.py +0 -0
  192. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_runtime/_output.py +0 -0
  193. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_templates/langgraph.json.template +0 -0
  194. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_templates/main.py.template +0 -0
  195. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/_utils/_graph.py +0 -0
  196. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_debug.py +0 -0
  197. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_dev.py +0 -0
  198. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_eval.py +0 -0
  199. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_new.py +0 -0
  200. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_cli/cli_run.py +0 -0
  201. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_resources/AGENTS.md +0 -0
  202. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_resources/REQUIRED_STRUCTURE.md +0 -0
  203. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_tracing/__init__.py +0 -0
  204. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_tracing/_instrument_traceable.py +0 -0
  205. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_tracing/_utils.py +0 -0
  206. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_utils/__init__.py +0 -0
  207. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_utils/_request_mixin.py +0 -0
  208. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_utils/_settings.py +0 -0
  209. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/_utils/_sleep_policy.py +0 -0
  210. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/__init__.py +0 -0
  211. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/agent.py +0 -0
  212. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/constants.py +0 -0
  213. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/exceptions.py +0 -0
  214. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/init_node.py +0 -0
  215. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/llm_node.py +0 -0
  216. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/router.py +0 -0
  217. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/state.py +0 -0
  218. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/terminate_node.py +0 -0
  219. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/tools/__init__.py +0 -0
  220. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/tools/tools.py +0 -0
  221. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/react/utils.py +0 -0
  222. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/__init__.py +0 -0
  223. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/context_tool.py +0 -0
  224. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/process_tool.py +0 -0
  225. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/tool_factory.py +0 -0
  226. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/tool_node.py +0 -0
  227. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/agent/tools/utils.py +0 -0
  228. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/chat/__init__.py +0 -0
  229. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/chat/models.py +0 -0
  230. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/embeddings/__init__.py +0 -0
  231. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/embeddings/embeddings.py +0 -0
  232. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/middlewares.py +0 -0
  233. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/py.typed +0 -0
  234. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/retrievers/__init__.py +0 -0
  235. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/retrievers/context_grounding_retriever.py +0 -0
  236. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/runtime_factories.py +0 -0
  237. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/tools/__init__.py +0 -0
  238. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/tools/preconfigured.py +0 -0
  239. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/vectorstores/__init__.py +0 -0
  240. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/src/uipath_langchain/vectorstores/context_grounding_vectorstore.py +0 -0
  241. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/common/trace_assert.py +0 -0
  242. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/common/validate_output.sh +0 -0
  243. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/expected_raw.json +0 -0
  244. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/expected_traces.json +0 -0
  245. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/input.json +0 -0
  246. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/langgraph.json +0 -0
  247. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/pyproject.toml +0 -0
  248. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/run.sh +0 -0
  249. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/src/assert.py +0 -0
  250. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/src/graph.py +0 -0
  251. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/company-research-agent/uv.lock +0 -0
  252. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/init-flow/expected_traces.json +0 -0
  253. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/init-flow/input.json +0 -0
  254. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/init-flow/pyproject.toml +0 -0
  255. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/init-flow/run.sh +0 -0
  256. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/init-flow/src/assert.py +0 -0
  257. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/expected_traces.json +0 -0
  258. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/input.json +0 -0
  259. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/langgraph.json +0 -0
  260. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/pyproject.toml +0 -0
  261. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/run.sh +0 -0
  262. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/src/assert.py +0 -0
  263. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/src/simple-local-mcp/graph.py +0 -0
  264. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/src/simple-local-mcp/math_server.py +0 -0
  265. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/src/simple-local-mcp/weather_server.py +0 -0
  266. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/simple-local-mcp/uv.lock +0 -0
  267. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/expected_traces.json +0 -0
  268. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/input.json +0 -0
  269. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/langgraph.json +0 -0
  270. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/pyproject.toml +0 -0
  271. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/raw_traces.jsonl +0 -0
  272. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/run.sh +0 -0
  273. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/src/assert.py +0 -0
  274. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/src/main.py +0 -0
  275. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/testcases/ticket-classification/uv.lock +0 -0
  276. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/__init__.py +0 -0
  277. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/agent/react/__init__.py +0 -0
  278. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/agent/react/test_utils.py +0 -0
  279. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/conftest.py +0 -0
  280. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/mocks/langgraph.json +0 -0
  281. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/mocks/simple_agent.py +0 -0
  282. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/mocks/uipath.json +0 -0
  283. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/test_init.py +0 -0
  284. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/cli/test_run.py +0 -0
  285. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/__init__.py +0 -0
  286. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/conftest.py +0 -0
  287. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/action_trigger_hitl.py +0 -0
  288. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/api_trigger_hitl.py +0 -0
  289. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/job_trigger_hitl.py +0 -0
  290. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/langgraph.json +0 -0
  291. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/uipath-default-escalation.json +0 -0
  292. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/mocks/uipath.json +0 -0
  293. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/test_action_trigger.py +0 -0
  294. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/test_hitl_api_trigger.py +0 -0
  295. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/test_hitl_default_escalation.py +0 -0
  296. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/hitl/test_hitl_job_trigger.py +0 -0
  297. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/test_dummy.py +0 -0
  298. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/tools/__init__.py +0 -0
  299. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/tools/conftest.py +0 -0
  300. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/tests/tools/mocks/agent_definition.json +0 -0
  301. {uipath_langchain-0.0.145 → uipath_langchain-0.0.146}/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.145
3
+ Version: 0.0.146
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.145"
3
+ version = "0.0.146"
4
4
  description = "UiPath Langchain"
5
5
  readme = { file = "README.md", content-type = "text/markdown" }
6
6
  requires-python = ">=3.10"
@@ -490,14 +490,14 @@ class LangGraphScriptRuntime(LangGraphRuntime):
490
490
  """Get entrypoint for this LangGraph runtime."""
491
491
  graph = await self.resolver()
492
492
  compiled_graph = graph.compile()
493
- schema = generate_schema_from_graph(compiled_graph)
493
+ schema_details = generate_schema_from_graph(compiled_graph)
494
494
 
495
495
  return Entrypoint(
496
496
  file_path=self.context.entrypoint, # type: ignore[call-arg]
497
497
  unique_id=str(uuid4()),
498
498
  type="agent",
499
- input=schema["input"],
500
- output=schema["output"],
499
+ input=schema_details.schema["input"],
500
+ output=schema_details.schema["output"],
501
501
  )
502
502
 
503
503
  async def cleanup(self) -> None:
@@ -1,27 +1,73 @@
1
+ from dataclasses import dataclass
1
2
  from typing import Any, Dict
2
3
 
3
4
  from langgraph.graph.state import CompiledStateGraph
4
5
 
5
6
 
6
- def resolve_refs(schema, root=None):
7
- """Recursively resolves $ref references in a JSON schema."""
7
+ @dataclass
8
+ class SchemaDetails:
9
+ schema: dict[str, Any]
10
+ has_input_circular_dependency: bool
11
+ has_output_circular_dependency: bool
12
+
13
+
14
+ def resolve_refs(schema, root=None, visited=None):
15
+ """Recursively resolves $ref references in a JSON schema, handling circular references.
16
+
17
+ Returns:
18
+ tuple: (resolved_schema, has_circular_dependency)
19
+ """
8
20
  if root is None:
9
- root = schema # Store the root schema to resolve $refs
21
+ root = schema
22
+
23
+ if visited is None:
24
+ visited = set()
25
+
26
+ has_circular = False
10
27
 
11
28
  if isinstance(schema, dict):
12
29
  if "$ref" in schema:
13
- ref_path = schema["$ref"].lstrip("#/").split("/")
30
+ ref_path = schema["$ref"]
31
+
32
+ if ref_path in visited:
33
+ # Circular dependency detected
34
+ return {
35
+ "type": "object",
36
+ "description": f"Circular reference to {ref_path}",
37
+ }, True
38
+
39
+ visited.add(ref_path)
40
+
41
+ # Resolve the reference
42
+ ref_parts = ref_path.lstrip("#/").split("/")
14
43
  ref_schema = root
15
- for part in ref_path:
44
+ for part in ref_parts:
16
45
  ref_schema = ref_schema.get(part, {})
17
- return resolve_refs(ref_schema, root)
18
46
 
19
- return {k: resolve_refs(v, root) for k, v in schema.items()}
47
+ result, circular = resolve_refs(ref_schema, root, visited)
48
+ has_circular = has_circular or circular
49
+
50
+ # Remove from visited after resolution (allows the same ref in different branches)
51
+ visited.discard(ref_path)
52
+
53
+ return result, has_circular
54
+
55
+ resolved_dict = {}
56
+ for k, v in schema.items():
57
+ resolved_value, circular = resolve_refs(v, root, visited)
58
+ resolved_dict[k] = resolved_value
59
+ has_circular = has_circular or circular
60
+ return resolved_dict, has_circular
20
61
 
21
62
  elif isinstance(schema, list):
22
- return [resolve_refs(item, root) for item in schema]
63
+ resolved_list = []
64
+ for item in schema:
65
+ resolved_item, circular = resolve_refs(item, root, visited)
66
+ resolved_list.append(resolved_item)
67
+ has_circular = has_circular or circular
68
+ return resolved_list, has_circular
23
69
 
24
- return schema
70
+ return schema, False
25
71
 
26
72
 
27
73
  def process_nullable_types(
@@ -45,8 +91,10 @@ def process_nullable_types(
45
91
 
46
92
  def generate_schema_from_graph(
47
93
  graph: CompiledStateGraph[Any, Any, Any],
48
- ) -> Dict[str, Any]:
94
+ ) -> SchemaDetails:
49
95
  """Extract input/output schema from a LangGraph graph"""
96
+ input_circular_dependency = False
97
+ output_circular_dependency = False
50
98
  schema = {
51
99
  "input": {"type": "object", "properties": {}, "required": []},
52
100
  "output": {"type": "object", "properties": {}, "required": []},
@@ -55,7 +103,9 @@ def generate_schema_from_graph(
55
103
  if hasattr(graph, "input_schema"):
56
104
  if hasattr(graph.input_schema, "model_json_schema"):
57
105
  input_schema = graph.input_schema.model_json_schema()
58
- unpacked_ref_def_properties = resolve_refs(input_schema)
106
+ unpacked_ref_def_properties, input_circular_dependency = resolve_refs(
107
+ input_schema
108
+ )
59
109
 
60
110
  # Process the schema to handle nullable types
61
111
  processed_properties = process_nullable_types(
@@ -70,7 +120,9 @@ def generate_schema_from_graph(
70
120
  if hasattr(graph, "output_schema"):
71
121
  if hasattr(graph.output_schema, "model_json_schema"):
72
122
  output_schema = graph.output_schema.model_json_schema()
73
- unpacked_ref_def_properties = resolve_refs(output_schema)
123
+ unpacked_ref_def_properties, output_circular_dependency = resolve_refs(
124
+ output_schema
125
+ )
74
126
 
75
127
  # Process the schema to handle nullable types
76
128
  processed_properties = process_nullable_types(
@@ -82,4 +134,4 @@ def generate_schema_from_graph(
82
134
  "required", []
83
135
  )
84
136
 
85
- return schema
137
+ return SchemaDetails(schema, input_circular_dependency, output_circular_dependency)
@@ -175,7 +175,7 @@ async def langgraph_init_middleware_async(
175
175
  else loaded_graph
176
176
  )
177
177
  compiled_graph = state_graph.compile()
178
- graph_schema = generate_schema_from_graph(compiled_graph)
178
+ schema_details = generate_schema_from_graph(compiled_graph)
179
179
 
180
180
  mermaids[graph.name] = compiled_graph.get_graph(xray=1).draw_mermaid()
181
181
 
@@ -197,11 +197,17 @@ async def langgraph_init_middleware_async(
197
197
  "filePath": graph.name,
198
198
  "uniqueId": str(uuid.uuid4()),
199
199
  "type": "agent",
200
- "input": graph_schema["input"],
201
- "output": graph_schema["output"],
200
+ "input": schema_details.schema["input"],
201
+ "output": schema_details.schema["output"],
202
202
  }
203
203
  entrypoints.append(new_entrypoint)
204
204
 
205
+ warning_circular_deps = f" schema of graph '{graph.name}' contains circular dependencies. Some types might not be correctly inferred."
206
+ if schema_details.has_input_circular_dependency:
207
+ console.warning("Input" + warning_circular_deps)
208
+ if schema_details.has_output_circular_dependency:
209
+ console.warning("Output" + warning_circular_deps)
210
+
205
211
  except Exception as e:
206
212
  console.error(f"Error during graph load: {e}")
207
213
  return MiddlewareResult(
@@ -243,6 +249,7 @@ async def langgraph_init_middleware_async(
243
249
  should_continue=False,
244
250
  should_include_stacktrace=True,
245
251
  )
252
+
246
253
  console.success(f"Created {click.style(config_path, fg='cyan')} file.")
247
254
 
248
255
  generate_agents_md_files(options)
@@ -0,0 +1,266 @@
1
+ """Tests for schema utility functions."""
2
+
3
+ from unittest.mock import MagicMock
4
+
5
+ from pydantic import BaseModel, Field
6
+
7
+ from uipath_langchain._cli._utils._schema import (
8
+ generate_schema_from_graph,
9
+ resolve_refs,
10
+ )
11
+
12
+
13
+ class TestResolveRefs:
14
+ """Tests for the resolve_refs function."""
15
+
16
+ def test_simple_schema_without_refs(self):
17
+ """Should return schema unchanged when no $refs exist."""
18
+ schema = {
19
+ "type": "object",
20
+ "properties": {"name": {"type": "string"}, "age": {"type": "integer"}},
21
+ }
22
+
23
+ result, has_circular = resolve_refs(schema)
24
+
25
+ assert result == schema
26
+ assert has_circular is False
27
+
28
+ def test_simple_ref_resolution(self):
29
+ """Should resolve a simple $ref to its definition."""
30
+ schema = {
31
+ "properties": {"user": {"$ref": "#/$defs/User"}},
32
+ "$defs": {
33
+ "User": {
34
+ "type": "object",
35
+ "properties": {"name": {"type": "string"}},
36
+ }
37
+ },
38
+ }
39
+
40
+ result, has_circular = resolve_refs(schema)
41
+
42
+ assert result["properties"]["user"]["type"] == "object"
43
+ assert result["properties"]["user"]["properties"]["name"]["type"] == "string"
44
+ assert has_circular is False
45
+
46
+ def test_circular_dependency_detection(self):
47
+ """Should detect circular dependencies in schema."""
48
+ schema = {
49
+ "properties": {"node": {"$ref": "#/$defs/Node"}},
50
+ "$defs": {
51
+ "Node": {
52
+ "type": "object",
53
+ "properties": {
54
+ "value": {"type": "string"},
55
+ "next": {"$ref": "#/$defs/Node"},
56
+ },
57
+ }
58
+ },
59
+ }
60
+
61
+ result, has_circular = resolve_refs(schema)
62
+
63
+ assert has_circular is True
64
+ # Check that circular ref was replaced with simplified schema
65
+ assert result["properties"]["node"]["properties"]["next"]["type"] == "object"
66
+ assert (
67
+ "Circular reference"
68
+ in result["properties"]["node"]["properties"]["next"]["description"]
69
+ )
70
+
71
+ def test_nested_refs_in_properties(self):
72
+ """Should resolve nested $refs in object properties."""
73
+ schema = {
74
+ "properties": {
75
+ "person": {"$ref": "#/$defs/Person"},
76
+ "address": {"$ref": "#/$defs/Address"},
77
+ },
78
+ "$defs": {
79
+ "Person": {
80
+ "type": "object",
81
+ "properties": {"name": {"type": "string"}},
82
+ },
83
+ "Address": {
84
+ "type": "object",
85
+ "properties": {"street": {"type": "string"}},
86
+ },
87
+ },
88
+ }
89
+
90
+ result, has_circular = resolve_refs(schema)
91
+
92
+ assert result["properties"]["person"]["type"] == "object"
93
+ assert result["properties"]["person"]["properties"]["name"]["type"] == "string"
94
+ assert result["properties"]["address"]["type"] == "object"
95
+ assert (
96
+ result["properties"]["address"]["properties"]["street"]["type"] == "string"
97
+ )
98
+ assert has_circular is False
99
+
100
+ def test_refs_in_arrays(self):
101
+ """Should resolve $refs inside array items."""
102
+ schema = {
103
+ "properties": {
104
+ "users": {
105
+ "type": "array",
106
+ "items": {"$ref": "#/$defs/User"},
107
+ }
108
+ },
109
+ "$defs": {
110
+ "User": {
111
+ "type": "object",
112
+ "properties": {"id": {"type": "integer"}},
113
+ }
114
+ },
115
+ }
116
+
117
+ result, has_circular = resolve_refs(schema)
118
+
119
+ assert result["properties"]["users"]["items"]["type"] == "object"
120
+ assert (
121
+ result["properties"]["users"]["items"]["properties"]["id"]["type"]
122
+ == "integer"
123
+ )
124
+ assert has_circular is False
125
+
126
+ def test_multiple_circular_dependencies(self):
127
+ """Should handle multiple circular dependencies in same schema."""
128
+ schema = {
129
+ "properties": {
130
+ "node1": {"$ref": "#/$defs/Node"},
131
+ "node2": {"$ref": "#/$defs/Node"},
132
+ },
133
+ "$defs": {
134
+ "Node": {
135
+ "type": "object",
136
+ "properties": {
137
+ "next": {"$ref": "#/$defs/Node"},
138
+ },
139
+ }
140
+ },
141
+ }
142
+
143
+ result, has_circular = resolve_refs(schema)
144
+
145
+ assert has_circular is True
146
+
147
+
148
+ class TestGenerateSchemaFromGraph:
149
+ """Tests for the generate_schema_from_graph function."""
150
+
151
+ def test_graph_without_schemas(self):
152
+ """Should return empty schemas when graph has no input/output schemas."""
153
+ mock_graph = MagicMock()
154
+ del mock_graph.input_schema
155
+ del mock_graph.output_schema
156
+
157
+ result = generate_schema_from_graph(mock_graph)
158
+
159
+ assert result.schema["input"] == {
160
+ "type": "object",
161
+ "properties": {},
162
+ "required": [],
163
+ }
164
+ assert result.schema["output"] == {
165
+ "type": "object",
166
+ "properties": {},
167
+ "required": [],
168
+ }
169
+ assert result.has_input_circular_dependency is False
170
+ assert result.has_output_circular_dependency is False
171
+
172
+ def test_graph_with_simple_schemas(self):
173
+ """Should extract input and output schemas from graph."""
174
+
175
+ class InputModel(BaseModel):
176
+ query: str = Field(description="User query")
177
+ max_results: int = Field(default=10)
178
+
179
+ class OutputModel(BaseModel):
180
+ response: str = Field(description="Agent response")
181
+
182
+ mock_graph = MagicMock()
183
+ mock_graph.input_schema = InputModel
184
+ mock_graph.output_schema = OutputModel
185
+
186
+ result = generate_schema_from_graph(mock_graph)
187
+
188
+ assert "query" in result.schema["input"]["properties"]
189
+ assert "max_results" in result.schema["input"]["properties"]
190
+ assert result.schema["input"]["properties"]["query"]["type"] == "string"
191
+ assert "response" in result.schema["output"]["properties"]
192
+ assert result.schema["output"]["properties"]["response"]["type"] == "string"
193
+ assert result.has_input_circular_dependency is False
194
+ assert result.has_output_circular_dependency is False
195
+
196
+ def test_graph_with_circular_input_schema(self):
197
+ """Should detect circular dependencies in input schema."""
198
+
199
+ class NodeInput(BaseModel):
200
+ value: str
201
+ children: list["NodeInput"] = Field(default_factory=list)
202
+
203
+ mock_graph = MagicMock()
204
+ mock_graph.input_schema = NodeInput
205
+ del mock_graph.output_schema
206
+
207
+ result = generate_schema_from_graph(mock_graph)
208
+
209
+ assert result.has_input_circular_dependency is True
210
+ assert result.has_output_circular_dependency is False
211
+ assert "value" in result.schema["input"]["properties"]
212
+
213
+ def test_graph_with_circular_output_schema(self):
214
+ """Should detect circular dependencies in output schema."""
215
+
216
+ class TreeOutput(BaseModel):
217
+ name: str
218
+ parent: "TreeOutput | None" = None
219
+
220
+ mock_graph = MagicMock()
221
+ del mock_graph.input_schema
222
+ mock_graph.output_schema = TreeOutput
223
+
224
+ result = generate_schema_from_graph(mock_graph)
225
+
226
+ assert result.has_input_circular_dependency is False
227
+ assert result.has_output_circular_dependency is True
228
+ assert "name" in result.schema["output"]["properties"]
229
+
230
+ def test_graph_with_both_circular_schemas(self):
231
+ """Should detect circular dependencies in both input and output schemas."""
232
+
233
+ class CircularInput(BaseModel):
234
+ data: str
235
+ ref: "CircularInput | None" = None
236
+
237
+ class CircularOutput(BaseModel):
238
+ result: str
239
+ next: "CircularOutput | None" = None
240
+
241
+ mock_graph = MagicMock()
242
+ mock_graph.input_schema = CircularInput
243
+ mock_graph.output_schema = CircularOutput
244
+
245
+ result = generate_schema_from_graph(mock_graph)
246
+
247
+ assert result.has_input_circular_dependency is True
248
+ assert result.has_output_circular_dependency is True
249
+ assert "data" in result.schema["input"]["properties"]
250
+ assert "result" in result.schema["output"]["properties"]
251
+
252
+ def test_graph_with_required_fields(self):
253
+ """Should extract required fields from schemas."""
254
+
255
+ class StrictModel(BaseModel):
256
+ required_field: str
257
+ optional_field: str | None = None
258
+
259
+ mock_graph = MagicMock()
260
+ mock_graph.input_schema = StrictModel
261
+ del mock_graph.output_schema
262
+
263
+ result = generate_schema_from_graph(mock_graph)
264
+
265
+ assert "required_field" in result.schema["input"]["required"]
266
+ assert "optional_field" not in result.schema["input"]["required"]