stackone-ai 2.3.0__tar.gz → 2.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/development-workflow.md +1 -1
  2. stackone_ai-2.4.0/.envrc +2 -0
  3. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitignore +4 -0
  4. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitleaks.toml +1 -6
  5. stackone_ai-2.4.0/.release-please-manifest.json +3 -0
  6. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/CHANGELOG.md +15 -0
  7. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/CLAUDE.md +10 -32
  8. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/PKG-INFO +59 -24
  9. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/README.md +58 -23
  10. stackone_ai-2.4.0/examples/search_tool_example.py +314 -0
  11. stackone_ai-2.4.0/examples/semantic_search_example.py +424 -0
  12. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/test_examples.py +2 -1
  13. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/flake.lock +75 -15
  14. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/flake.nix +59 -34
  15. stackone_ai-2.4.0/pyproject.toml +111 -0
  16. stackone_ai-2.4.0/stackone_ai/__init__.py +25 -0
  17. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/constants.py +3 -0
  18. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/feedback/tool.py +3 -2
  19. stackone_ai-2.4.0/stackone_ai/local_search.py +170 -0
  20. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/models.py +36 -34
  21. stackone_ai-2.4.0/stackone_ai/semantic_search.py +213 -0
  22. stackone_ai-2.4.0/stackone_ai/toolset.py +851 -0
  23. stackone_ai-2.4.0/stackone_ai/utils/normalize.py +17 -0
  24. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/conftest.py +18 -6
  25. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_feedback.py +27 -25
  26. stackone_ai-2.3.0/tests/test_utility_tools.py → stackone_ai-2.4.0/tests/test_local_search.py +2 -242
  27. stackone_ai-2.4.0/tests/test_semantic_search.py +1014 -0
  28. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_tool_calling.py +13 -12
  29. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_toolset.py +2 -1
  30. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/uv.lock +1 -1
  31. stackone_ai-2.3.0/.claude/skills/release-please/SKILL.md +0 -51
  32. stackone_ai-2.3.0/.release-please-manifest.json +0 -3
  33. stackone_ai-2.3.0/examples/utility_tools_example.py +0 -214
  34. stackone_ai-2.3.0/pyproject.toml +0 -118
  35. stackone_ai-2.3.0/stackone_ai/__init__.py +0 -11
  36. stackone_ai-2.3.0/stackone_ai/toolset.py +0 -415
  37. stackone_ai-2.3.0/stackone_ai/utility_tools.py +0 -347
  38. stackone_ai-2.3.0/vendor/stackone-ai-node/.envrc +0 -1
  39. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/examples-standards.md +0 -0
  40. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/git-workflow.md +0 -0
  41. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/nix-workflow.md +0 -0
  42. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/no-relative-imports.md +0 -0
  43. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/package-installation.md +0 -0
  44. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/release-please-standards.md +0 -0
  45. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/uv-scripts.md +0 -0
  46. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/development-workflow.mdc +0 -0
  47. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/examples-standards.mdc +0 -0
  48. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/git-workflow.mdc +0 -0
  49. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/no-relative-imports.mdc +0 -0
  50. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/package-installation.mdc +0 -0
  51. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/release-please-standards.mdc +0 -0
  52. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/uv-scripts.mdc +0 -0
  53. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/actions/setup-nix/action.yaml +0 -0
  54. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/dependabot.yaml +0 -0
  55. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/ci.yaml +0 -0
  56. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/nix-flake-update.yaml +0 -0
  57. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/nix-flake.yaml +0 -0
  58. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/release.yaml +0 -0
  59. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitmodules +0 -0
  60. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.mcp.json +0 -0
  61. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.release-please-config.json +0 -0
  62. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/LICENSE +0 -0
  63. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/crewai_integration.py +0 -0
  64. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/file_uploads.py +0 -0
  65. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/index.py +0 -0
  66. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/langchain_integration.py +0 -0
  67. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/openai_integration.py +0 -0
  68. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/stackone_account_ids.py +0 -0
  69. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/justfile +0 -0
  70. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/feedback/__init__.py +0 -0
  71. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/integrations/__init__.py +0 -0
  72. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/integrations/langgraph.py +0 -0
  73. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/py.typed +0 -0
  74. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/utils/__init__.py +0 -0
  75. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/utils/tfidf_index.py +0 -0
  76. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/mocks/serve.ts +0 -0
  77. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_fetch_tools.py +0 -0
  78. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_integrations_langgraph.py +0 -0
  79. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_models.py +0 -0
  80. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_tfidf_index.py +0 -0
  81. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/development-workflow.md +0 -0
  82. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/file-operations.md +0 -0
  83. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/git-workflow.md +0 -0
  84. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/pnpm-usage.md +0 -0
  85. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/typescript-patterns.md +0 -0
  86. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/typescript-testing.md +0 -0
  87. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/skills/orama-integration/SKILL.md +0 -0
  88. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/development-workflow.mdc +0 -0
  89. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/file-operations.mdc +0 -0
  90. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/git-workflow.mdc +0 -0
  91. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/orama-integration.mdc +0 -0
  92. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/pnpm-usage.mdc +0 -0
  93. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/typescript-patterns.mdc +0 -0
  94. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/typescript-testing.mdc +0 -0
  95. {stackone_ai-2.3.0 → stackone_ai-2.4.0/vendor/stackone-ai-node}/.envrc +0 -0
  96. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.git +0 -0
  97. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/CODEOWNERS +0 -0
  98. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/actions/setup-nix/action.yaml +0 -0
  99. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/check-title.yaml +0 -0
  100. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/ci.yaml +0 -0
  101. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/claude.yaml +0 -0
  102. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/dry-publish.yaml +0 -0
  103. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/nix-flake.yaml +0 -0
  104. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/release.yaml +0 -0
  105. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.gitignore +0 -0
  106. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.gitleaks.toml +0 -0
  107. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.mcp.json +0 -0
  108. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.oxfmtrc.jsonc +0 -0
  109. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.oxlintrc.jsonc +0 -0
  110. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/AGENTS.md +0 -0
  111. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/CHANGELOG.md +0 -0
  112. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/CLAUDE.md +0 -0
  113. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/LICENSE +0 -0
  114. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/README.md +0 -0
  115. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/README.md +0 -0
  116. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.test.ts +0 -0
  117. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.ts +0 -0
  118. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/anthropic-integration.ts +0 -0
  119. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.test.ts +0 -0
  120. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.ts +0 -0
  121. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools-debug.ts +0 -0
  122. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools.test.ts +0 -0
  123. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools.ts +0 -0
  124. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/meta-tools.ts +0 -0
  125. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-integration.test.ts +0 -0
  126. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-integration.ts +0 -0
  127. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-responses-integration.test.ts +0 -0
  128. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-responses-integration.ts +0 -0
  129. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/package.json +0 -0
  130. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.test.ts +0 -0
  131. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.ts +0 -0
  132. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tsconfig.json +0 -0
  133. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/flake.lock +0 -0
  134. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/flake.nix +0 -0
  135. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/knip.config.ts +0 -0
  136. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/lefthook.yaml +0 -0
  137. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.example-api.ts +0 -0
  138. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.mcp.ts +0 -0
  139. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.openai.ts +0 -0
  140. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.stackone-ai.ts +0 -0
  141. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.stackone-rpc.ts +0 -0
  142. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.ts +0 -0
  143. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.utils.ts +0 -0
  144. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/mcp-server.ts +0 -0
  145. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/node.ts +0 -0
  146. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/package.json +0 -0
  147. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/pnpm-lock.yaml +0 -0
  148. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/pnpm-workspace.yaml +0 -0
  149. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/consts.ts +0 -0
  150. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/feedback.test.ts +0 -0
  151. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/feedback.ts +0 -0
  152. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/headers.test.ts +0 -0
  153. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/headers.ts +0 -0
  154. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/index.ts +0 -0
  155. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/mcp-client.test.ts +0 -0
  156. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/mcp-client.ts +0 -0
  157. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/requestBuilder.test.ts +0 -0
  158. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/requestBuilder.ts +0 -0
  159. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/rpc-client.test.ts +0 -0
  160. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/rpc-client.ts +0 -0
  161. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/schema.ts +0 -0
  162. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.test-d.ts +0 -0
  163. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.test.ts +0 -0
  164. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.ts +0 -0
  165. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.test-d.ts +0 -0
  166. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.test.ts +0 -0
  167. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.ts +0 -0
  168. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/types.ts +0 -0
  169. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/array.test.ts +0 -0
  170. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/array.ts +0 -0
  171. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.test.ts +0 -0
  172. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.ts +0 -0
  173. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone.test.ts +0 -0
  174. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone.ts +0 -0
  175. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/tfidf-index.test.ts +0 -0
  176. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/tfidf-index.ts +0 -0
  177. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/try-import.test.ts +0 -0
  178. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/try-import.ts +0 -0
  179. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/type.ts +0 -0
  180. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/tsconfig.json +0 -0
  181. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/tsdown.config.ts +0 -0
  182. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/vitest.config.ts +0 -0
  183. {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/vitest.setup.ts +0 -0
@@ -17,7 +17,7 @@ This rule provides code style guidelines and project conventions for the StackOn
17
17
  ## Type Annotations
18
18
 
19
19
  - Full type annotations required for all public APIs
20
- - Use Python 3.11+ typing features
20
+ - Use Python 3.10+ typing features
21
21
  - Run `just ty` to verify type correctness
22
22
  - Strict ty configuration is enforced
23
23
 
@@ -0,0 +1,2 @@
1
+ watch_file uv.lock
2
+ use flake
@@ -17,3 +17,7 @@ build/
17
17
 
18
18
  # Git hooks (managed by Nix)
19
19
  .pre-commit-config.yaml
20
+
21
+ # Agent skills (managed by Nix via agent-skills-nix)
22
+ .claude/skills
23
+ .agents/skills
@@ -6,9 +6,4 @@ useDefault = true
6
6
 
7
7
  [allowlist]
8
8
  description = "Global allowlist"
9
- paths = [
10
- '''uv\.lock$''',
11
- '''venv/''',
12
- '''\.venv/''',
13
- '''\.ruff_cache/''',
14
- ]
9
+ paths = ['''uv\.lock$''', '''venv/''', '''\.venv/''', '''\.ruff_cache/''']
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "2.4.0"
3
+ }
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.0](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.3.1...stackone-ai-v2.4.0) (2026-03-06)
4
+
5
+
6
+ ### Features
7
+
8
+ * **search:** Semantic Tool Search ([#149](https://github.com/StackOneHQ/stackone-ai-python/issues/149)) ([ac76d1b](https://github.com/StackOneHQ/stackone-ai-python/commit/ac76d1b12734f81ad29c2e30cf968ff2f1a1326c))
9
+ * **skills:** add just-commands skill with dynamic context injection ([#133](https://github.com/StackOneHQ/stackone-ai-python/issues/133)) ([bf9f3fb](https://github.com/StackOneHQ/stackone-ai-python/commit/bf9f3fb46c4a6dbb55e76c83ceef0eb465b481fb))
10
+
11
+ ## [2.3.1](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.3.0...stackone-ai-v2.3.1) (2026-01-29)
12
+
13
+
14
+ ### Documentation
15
+
16
+ * fix Python version requirement to 3.10+ ([#131](https://github.com/StackOneHQ/stackone-ai-python/issues/131)) ([ef2b4e3](https://github.com/StackOneHQ/stackone-ai-python/commit/ef2b4e3d06290d4fdc638bc66eec0c48b177c4f0))
17
+
3
18
  ## [2.3.0](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.1.1...stackone-ai-v2.3.0) (2026-01-29)
4
19
 
5
20
 
@@ -5,7 +5,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
5
5
  ## Rules and Skills Structure
6
6
 
7
7
  - **Rules** (`.claude/rules/`): Automatically loaded based on file paths. Source of truth for project conventions.
8
- - **Skills** (`.claude/skills/`): Manually invoked for specific integrations.
8
+ - **Skills** (`.agents/skills/`, `.claude/skills/`): Managed by Nix via [agent-skills-nix](https://github.com/Kyure-A/agent-skills-nix). Skills are sourced from [StackOneHQ/skills](https://github.com/StackOneHQ/skills) and installed automatically when entering `nix develop`.
9
9
  - **Cursor rules** (`.cursor/rules/`): Symlinks to `.claude/rules/` for consistency.
10
10
 
11
11
  ## Available Skills
@@ -27,26 +27,15 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
27
27
  | **uv-scripts** | `scripts/**/*.py` | Utility script standards with UV |
28
28
  | **examples-standards** | `examples/**/*` | Example requirements and organization |
29
29
 
30
- ## Project Overview
31
-
32
- StackOne AI SDK is a Python library that provides a unified interface for accessing various SaaS tools through AI-friendly APIs. It acts as a bridge between AI applications and multiple SaaS platforms (HRIS, CRM, ATS, LMS, Marketing, etc.) with support for OpenAI, LangChain, CrewAI, and Model Context Protocol (MCP).
33
-
34
- ## Essential Development Commands
30
+ ## Available Skills
35
31
 
36
- ```bash
37
- # Setup and installation
38
- just install # Install dependencies and pre-commit hooks
32
+ | Skill | Description |
33
+ | ----------------- | -------------------------------------------- |
34
+ | **just-commands** | Available just commands (dynamically loaded) |
39
35
 
40
- # Code quality
41
- just lint # Run ruff linting
42
- just lint-fix # Auto-fix linting issues
43
- just ty # Run type checking
36
+ ## Project Overview
44
37
 
45
- # Testing
46
- just test # Run all tests
47
- just test-tools # Run tool-specific tests
48
- just test-examples # Run example tests
49
- ```
38
+ StackOne AI SDK is a Python library that provides a unified interface for accessing various SaaS tools through AI-friendly APIs with support for OpenAI, LangChain, CrewAI, and Model Context Protocol (MCP).
50
39
 
51
40
  ## Code Architecture
52
41
 
@@ -62,24 +51,13 @@ just test-examples # Run example tests
62
51
  - `Tools`: Container for managing multiple tools
63
52
  - Format converters for different AI frameworks
64
53
 
65
- 3. **OpenAPI Parser** (`stackone_ai/specs/parser.py`): Spec conversion
66
- - Converts OpenAPI specs to tool definitions
67
- - Handles file upload detection (`format: binary` → `type: file`)
68
- - Resolves schema references
69
-
70
- ### OpenAPI Specifications
71
-
72
- All tool definitions are generated from OpenAPI specs in `stackone_ai/oas/`:
73
-
74
- - `core.json`, `ats.json`, `crm.json`, `documents.json`, `hris.json`, `iam.json`, `lms.json`, `marketing.json`
75
-
76
54
  ## Key Development Patterns
77
55
 
78
56
  ### Tool Filtering
79
57
 
80
58
  ```python
81
59
  # Use glob patterns for tool selection
82
- tools = StackOneToolSet(include_tools=["hris_*", "!hris_create_*"])
60
+ tools = StackOneToolSet(include_tools=["bamboohr_*", "!bamboohr_create_*"])
83
61
  ```
84
62
 
85
63
  ### Authentication
@@ -94,7 +72,7 @@ toolset = StackOneToolSet(
94
72
 
95
73
  ### Type Safety
96
74
 
97
- - Full type annotations required (Python 3.11+)
75
+ - Full type annotations required (Python 3.10+)
98
76
  - Strict ty configuration
99
77
  - Use generics for better IDE support
100
78
 
@@ -108,7 +86,7 @@ toolset = StackOneToolSet(
108
86
 
109
87
  1. **Dependencies**: See `package-installation` rule for uv dependency management
110
88
  2. **Pre-commit**: Hooks configured for ruff and ty - run on all commits
111
- 3. **Python Version**: Requires Python >=3.11
89
+ 3. **Python Version**: Requires Python >=3.10
112
90
  4. **Error Handling**: Custom exceptions (`StackOneError`, `StackOneAPIError`)
113
91
  5. **File Uploads**: Binary parameters auto-detected from OpenAPI specs
114
92
  6. **Context Window**: Tool loading warns when loading all tools (large context)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stackone-ai
3
- Version: 2.3.0
3
+ Version: 2.4.0
4
4
  Summary: agents performing actions on your SaaS
5
5
  Author-email: StackOne <support@stackone.com>
6
6
  License-File: LICENSE
@@ -48,10 +48,11 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
48
48
  - **Tool Calling**: Direct method calling with `tool.call()` for intuitive usage
49
49
  - **MCP-backed Dynamic Discovery**: Fetch tools at runtime via `fetch_tools()` with provider, action, and account filtering
50
50
  - **Advanced Tool Filtering**:
51
- - Glob pattern filtering with patterns like `"hris_*"` and exclusions `"!hris_delete_*"`
51
+ - Glob pattern filtering with patterns like `"salesforce_*"` and exclusions `"!*_delete_*"`
52
52
  - Provider and action filtering
53
53
  - Multi-account support
54
- - **Utility Tools** (Beta): Dynamic tool discovery and execution based on natural language queries
54
+ - **Semantic Search**: AI-powered tool discovery using natural language queries
55
+ - **Search Tool**: Callable tool discovery for agent loops via `get_search_tool()`
55
56
  - Integration with popular AI frameworks:
56
57
  - OpenAI Functions
57
58
  - LangChain Tools
@@ -60,7 +61,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
60
61
 
61
62
  ## Requirements
62
63
 
63
- - Python 3.11+
64
+ - Python 3.10+
64
65
 
65
66
  ## Installation
66
67
 
@@ -90,10 +91,10 @@ toolset = StackOneToolSet() # Uses STACKONE_API_KEY env var
90
91
  # Or explicitly: toolset = StackOneToolSet(api_key="your-api-key")
91
92
 
92
93
  # Get HRIS-related tools with glob patterns
93
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
94
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
94
95
 
95
96
  # Use a specific tool with the call method
96
- employee_tool = tools.get_tool("hris_get_employee")
97
+ employee_tool = tools.get_tool("bamboohr_get_employee")
97
98
  # Call with keyword arguments
98
99
  employee = employee_tool.call(id="employee-id")
99
100
  # Or with traditional execute method
@@ -139,9 +140,9 @@ tools = toolset.fetch_tools(providers=["hibob"])
139
140
  - **`account_ids`**: Filter tools by account IDs. Tools will be loaded for each specified account.
140
141
  - **`providers`**: Filter by provider names (e.g., `["hibob", "bamboohr"]`). Case-insensitive matching.
141
142
  - **`actions`**: Filter by action patterns with glob support:
142
- - Exact match: `["hris_list_employees"]`
143
+ - Exact match: `["bamboohr_list_employees"]`
143
144
  - Glob pattern: `["*_list_employees"]` matches all tools ending with `_list_employees`
144
- - Provider prefix: `["hris_*"]` matches all HRIS tools
145
+ - Provider prefix: `["bamboohr_*"]` matches all BambooHR tools
145
146
 
146
147
  ## Implicit Feedback (Beta)
147
148
 
@@ -201,7 +202,7 @@ from stackone_ai import StackOneToolSet
201
202
 
202
203
  # Initialize StackOne tools
203
204
  toolset = StackOneToolSet()
204
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
205
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
205
206
 
206
207
  # Convert to LangChain format
207
208
  langchain_tools = tools.to_langchain()
@@ -248,7 +249,7 @@ from stackone_ai.integrations.langgraph import to_tool_node, bind_model_with_too
248
249
 
249
250
  # Prepare tools
250
251
  toolset = StackOneToolSet()
251
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
252
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
252
253
  langchain_tools = tools.to_langchain()
253
254
 
254
255
  class State(TypedDict):
@@ -286,7 +287,7 @@ from stackone_ai import StackOneToolSet
286
287
 
287
288
  # Get tools and convert to LangChain format
288
289
  toolset = StackOneToolSet()
289
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
290
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
290
291
  langchain_tools = tools.to_langchain()
291
292
 
292
293
  # Create CrewAI agent with StackOne tools
@@ -328,7 +329,7 @@ feedback_tool = tools.get_tool("tool_feedback")
328
329
  result = feedback_tool.call(
329
330
  feedback="The HRIS tools are working great! Very fast response times.",
330
331
  account_id="acc_123456",
331
- tool_names=["hris_list_employees", "hris_get_employee"]
332
+ tool_names=["bamboohr_list_employees", "bamboohr_get_employee"]
332
333
  )
333
334
  ```
334
335
 
@@ -337,26 +338,59 @@ result = feedback_tool.call(
337
338
  - "Are you ok with sending feedback to StackOne? The LLM will take care of sending it."
338
339
  - Only call the tool after the user explicitly agrees.
339
340
 
340
- ## Utility Tools (Beta)
341
+ ## Search Tool
341
342
 
342
- Utility tools enable dynamic tool discovery and execution without hardcoding tool names.
343
+ Search for tools using natural language queries. Works with both semantic (cloud) and local BM25+TF-IDF search.
343
344
 
344
345
  ### Basic Usage
345
346
 
346
347
  ```python
347
- # Get utility tools for dynamic discovery
348
- tools = toolset.fetch_tools(actions=["hris_*"])
349
- utility_tools = tools.utility_tools()
348
+ # Get a callable search tool
349
+ toolset = StackOneToolSet()
350
+ all_tools = toolset.fetch_tools(account_ids=["your-account-id"])
351
+ search_tool = toolset.get_search_tool()
350
352
 
351
- # Search for relevant tools using natural language
352
- filter_tool = utility_tools.get_tool("tool_search")
353
- results = filter_tool.call(query="manage employees", limit=5)
353
+ # Search for relevant tools returns a Tools collection
354
+ tools = search_tool("manage employees", top_k=5)
354
355
 
355
- # Execute discovered tools dynamically
356
- execute_tool = utility_tools.get_tool("tool_execute")
357
- result = execute_tool.call(toolName="hris_list_employees", params={"limit": 10})
356
+ # Execute a discovered tool directly
357
+ tools[0](limit=10)
358
358
  ```
359
359
 
360
+ ## Semantic Search
361
+
362
+ Discover tools using natural language instead of exact names. Queries like "onboard new hire" resolve to the right actions even when the tool is called `bamboohr_create_employee`.
363
+
364
+ ```python
365
+ from stackone_ai import StackOneToolSet
366
+
367
+ toolset = StackOneToolSet()
368
+
369
+ # Search by intent — returns Tools collection ready for any framework
370
+ tools = toolset.search_tools("manage employee records", account_ids=["your-account-id"], top_k=5)
371
+ openai_tools = tools.to_openai()
372
+
373
+ # Lightweight: inspect results without fetching full tool definitions
374
+ results = toolset.search_action_names("time off requests", top_k=5)
375
+ ```
376
+
377
+ ### Search Modes
378
+
379
+ Control which search backend `search_tools()` uses via the `search` parameter:
380
+
381
+ ```python
382
+ # "auto" (default) — tries semantic search first, falls back to local
383
+ tools = toolset.search_tools("manage employees", search="auto")
384
+
385
+ # "semantic" — semantic API only, raises if unavailable
386
+ tools = toolset.search_tools("manage employees", search="semantic")
387
+
388
+ # "local" — local BM25+TF-IDF only, no semantic API call
389
+ tools = toolset.search_tools("manage employees", search="local")
390
+ ```
391
+
392
+ Results are automatically scoped to connectors in your linked accounts. See [Semantic Search Example](examples/semantic_search_example.py) for `SearchTool` (`get_search_tool`) integration, OpenAI, and LangChain patterns.
393
+
360
394
  ## Examples
361
395
 
362
396
  For more examples, check out the [examples/](examples/) directory:
@@ -366,7 +400,8 @@ For more examples, check out the [examples/](examples/) directory:
366
400
  - [OpenAI Integration](examples/openai_integration.py)
367
401
  - [LangChain Integration](examples/langchain_integration.py)
368
402
  - [CrewAI Integration](examples/crewai_integration.py)
369
- - [Utility Tools](examples/utility_tools_example.py)
403
+ - [Search Tool](examples/search_tool_example.py)
404
+ - [Semantic Search](examples/semantic_search_example.py)
370
405
 
371
406
  ## Development
372
407
 
@@ -16,10 +16,11 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
16
16
  - **Tool Calling**: Direct method calling with `tool.call()` for intuitive usage
17
17
  - **MCP-backed Dynamic Discovery**: Fetch tools at runtime via `fetch_tools()` with provider, action, and account filtering
18
18
  - **Advanced Tool Filtering**:
19
- - Glob pattern filtering with patterns like `"hris_*"` and exclusions `"!hris_delete_*"`
19
+ - Glob pattern filtering with patterns like `"salesforce_*"` and exclusions `"!*_delete_*"`
20
20
  - Provider and action filtering
21
21
  - Multi-account support
22
- - **Utility Tools** (Beta): Dynamic tool discovery and execution based on natural language queries
22
+ - **Semantic Search**: AI-powered tool discovery using natural language queries
23
+ - **Search Tool**: Callable tool discovery for agent loops via `get_search_tool()`
23
24
  - Integration with popular AI frameworks:
24
25
  - OpenAI Functions
25
26
  - LangChain Tools
@@ -28,7 +29,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
28
29
 
29
30
  ## Requirements
30
31
 
31
- - Python 3.11+
32
+ - Python 3.10+
32
33
 
33
34
  ## Installation
34
35
 
@@ -58,10 +59,10 @@ toolset = StackOneToolSet() # Uses STACKONE_API_KEY env var
58
59
  # Or explicitly: toolset = StackOneToolSet(api_key="your-api-key")
59
60
 
60
61
  # Get HRIS-related tools with glob patterns
61
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
62
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
62
63
 
63
64
  # Use a specific tool with the call method
64
- employee_tool = tools.get_tool("hris_get_employee")
65
+ employee_tool = tools.get_tool("bamboohr_get_employee")
65
66
  # Call with keyword arguments
66
67
  employee = employee_tool.call(id="employee-id")
67
68
  # Or with traditional execute method
@@ -107,9 +108,9 @@ tools = toolset.fetch_tools(providers=["hibob"])
107
108
  - **`account_ids`**: Filter tools by account IDs. Tools will be loaded for each specified account.
108
109
  - **`providers`**: Filter by provider names (e.g., `["hibob", "bamboohr"]`). Case-insensitive matching.
109
110
  - **`actions`**: Filter by action patterns with glob support:
110
- - Exact match: `["hris_list_employees"]`
111
+ - Exact match: `["bamboohr_list_employees"]`
111
112
  - Glob pattern: `["*_list_employees"]` matches all tools ending with `_list_employees`
112
- - Provider prefix: `["hris_*"]` matches all HRIS tools
113
+ - Provider prefix: `["bamboohr_*"]` matches all BambooHR tools
113
114
 
114
115
  ## Implicit Feedback (Beta)
115
116
 
@@ -169,7 +170,7 @@ from stackone_ai import StackOneToolSet
169
170
 
170
171
  # Initialize StackOne tools
171
172
  toolset = StackOneToolSet()
172
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
173
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
173
174
 
174
175
  # Convert to LangChain format
175
176
  langchain_tools = tools.to_langchain()
@@ -216,7 +217,7 @@ from stackone_ai.integrations.langgraph import to_tool_node, bind_model_with_too
216
217
 
217
218
  # Prepare tools
218
219
  toolset = StackOneToolSet()
219
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
220
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
220
221
  langchain_tools = tools.to_langchain()
221
222
 
222
223
  class State(TypedDict):
@@ -254,7 +255,7 @@ from stackone_ai import StackOneToolSet
254
255
 
255
256
  # Get tools and convert to LangChain format
256
257
  toolset = StackOneToolSet()
257
- tools = toolset.fetch_tools(actions=["hris_*"], account_ids=["your-account-id"])
258
+ tools = toolset.fetch_tools(actions=["bamboohr_*"], account_ids=["your-account-id"])
258
259
  langchain_tools = tools.to_langchain()
259
260
 
260
261
  # Create CrewAI agent with StackOne tools
@@ -296,7 +297,7 @@ feedback_tool = tools.get_tool("tool_feedback")
296
297
  result = feedback_tool.call(
297
298
  feedback="The HRIS tools are working great! Very fast response times.",
298
299
  account_id="acc_123456",
299
- tool_names=["hris_list_employees", "hris_get_employee"]
300
+ tool_names=["bamboohr_list_employees", "bamboohr_get_employee"]
300
301
  )
301
302
  ```
302
303
 
@@ -305,26 +306,59 @@ result = feedback_tool.call(
305
306
  - "Are you ok with sending feedback to StackOne? The LLM will take care of sending it."
306
307
  - Only call the tool after the user explicitly agrees.
307
308
 
308
- ## Utility Tools (Beta)
309
+ ## Search Tool
309
310
 
310
- Utility tools enable dynamic tool discovery and execution without hardcoding tool names.
311
+ Search for tools using natural language queries. Works with both semantic (cloud) and local BM25+TF-IDF search.
311
312
 
312
313
  ### Basic Usage
313
314
 
314
315
  ```python
315
- # Get utility tools for dynamic discovery
316
- tools = toolset.fetch_tools(actions=["hris_*"])
317
- utility_tools = tools.utility_tools()
316
+ # Get a callable search tool
317
+ toolset = StackOneToolSet()
318
+ all_tools = toolset.fetch_tools(account_ids=["your-account-id"])
319
+ search_tool = toolset.get_search_tool()
318
320
 
319
- # Search for relevant tools using natural language
320
- filter_tool = utility_tools.get_tool("tool_search")
321
- results = filter_tool.call(query="manage employees", limit=5)
321
+ # Search for relevant tools returns a Tools collection
322
+ tools = search_tool("manage employees", top_k=5)
322
323
 
323
- # Execute discovered tools dynamically
324
- execute_tool = utility_tools.get_tool("tool_execute")
325
- result = execute_tool.call(toolName="hris_list_employees", params={"limit": 10})
324
+ # Execute a discovered tool directly
325
+ tools[0](limit=10)
326
326
  ```
327
327
 
328
+ ## Semantic Search
329
+
330
+ Discover tools using natural language instead of exact names. Queries like "onboard new hire" resolve to the right actions even when the tool is called `bamboohr_create_employee`.
331
+
332
+ ```python
333
+ from stackone_ai import StackOneToolSet
334
+
335
+ toolset = StackOneToolSet()
336
+
337
+ # Search by intent — returns Tools collection ready for any framework
338
+ tools = toolset.search_tools("manage employee records", account_ids=["your-account-id"], top_k=5)
339
+ openai_tools = tools.to_openai()
340
+
341
+ # Lightweight: inspect results without fetching full tool definitions
342
+ results = toolset.search_action_names("time off requests", top_k=5)
343
+ ```
344
+
345
+ ### Search Modes
346
+
347
+ Control which search backend `search_tools()` uses via the `search` parameter:
348
+
349
+ ```python
350
+ # "auto" (default) — tries semantic search first, falls back to local
351
+ tools = toolset.search_tools("manage employees", search="auto")
352
+
353
+ # "semantic" — semantic API only, raises if unavailable
354
+ tools = toolset.search_tools("manage employees", search="semantic")
355
+
356
+ # "local" — local BM25+TF-IDF only, no semantic API call
357
+ tools = toolset.search_tools("manage employees", search="local")
358
+ ```
359
+
360
+ Results are automatically scoped to connectors in your linked accounts. See [Semantic Search Example](examples/semantic_search_example.py) for `SearchTool` (`get_search_tool`) integration, OpenAI, and LangChain patterns.
361
+
328
362
  ## Examples
329
363
 
330
364
  For more examples, check out the [examples/](examples/) directory:
@@ -334,7 +368,8 @@ For more examples, check out the [examples/](examples/) directory:
334
368
  - [OpenAI Integration](examples/openai_integration.py)
335
369
  - [LangChain Integration](examples/langchain_integration.py)
336
370
  - [CrewAI Integration](examples/crewai_integration.py)
337
- - [Utility Tools](examples/utility_tools_example.py)
371
+ - [Search Tool](examples/search_tool_example.py)
372
+ - [Semantic Search](examples/semantic_search_example.py)
338
373
 
339
374
  ## Development
340
375