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.
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/development-workflow.md +1 -1
- stackone_ai-2.4.0/.envrc +2 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitignore +4 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitleaks.toml +1 -6
- stackone_ai-2.4.0/.release-please-manifest.json +3 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/CHANGELOG.md +15 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/CLAUDE.md +10 -32
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/PKG-INFO +59 -24
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/README.md +58 -23
- stackone_ai-2.4.0/examples/search_tool_example.py +314 -0
- stackone_ai-2.4.0/examples/semantic_search_example.py +424 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/test_examples.py +2 -1
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/flake.lock +75 -15
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/flake.nix +59 -34
- stackone_ai-2.4.0/pyproject.toml +111 -0
- stackone_ai-2.4.0/stackone_ai/__init__.py +25 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/constants.py +3 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/feedback/tool.py +3 -2
- stackone_ai-2.4.0/stackone_ai/local_search.py +170 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/models.py +36 -34
- stackone_ai-2.4.0/stackone_ai/semantic_search.py +213 -0
- stackone_ai-2.4.0/stackone_ai/toolset.py +851 -0
- stackone_ai-2.4.0/stackone_ai/utils/normalize.py +17 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/conftest.py +18 -6
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_feedback.py +27 -25
- stackone_ai-2.3.0/tests/test_utility_tools.py → stackone_ai-2.4.0/tests/test_local_search.py +2 -242
- stackone_ai-2.4.0/tests/test_semantic_search.py +1014 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_tool_calling.py +13 -12
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_toolset.py +2 -1
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/uv.lock +1 -1
- stackone_ai-2.3.0/.claude/skills/release-please/SKILL.md +0 -51
- stackone_ai-2.3.0/.release-please-manifest.json +0 -3
- stackone_ai-2.3.0/examples/utility_tools_example.py +0 -214
- stackone_ai-2.3.0/pyproject.toml +0 -118
- stackone_ai-2.3.0/stackone_ai/__init__.py +0 -11
- stackone_ai-2.3.0/stackone_ai/toolset.py +0 -415
- stackone_ai-2.3.0/stackone_ai/utility_tools.py +0 -347
- stackone_ai-2.3.0/vendor/stackone-ai-node/.envrc +0 -1
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/examples-standards.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/nix-workflow.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/no-relative-imports.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/package-installation.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/release-please-standards.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.claude/rules/uv-scripts.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/examples-standards.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/no-relative-imports.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/package-installation.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/release-please-standards.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.cursor/rules/uv-scripts.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/actions/setup-nix/action.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/dependabot.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/ci.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/nix-flake-update.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/nix-flake.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.github/workflows/release.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.gitmodules +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.mcp.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/.release-please-config.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/LICENSE +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/crewai_integration.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/file_uploads.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/index.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/langchain_integration.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/openai_integration.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/examples/stackone_account_ids.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/justfile +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/feedback/__init__.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/integrations/__init__.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/integrations/langgraph.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/py.typed +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/utils/__init__.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/stackone_ai/utils/tfidf_index.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/mocks/serve.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_fetch_tools.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_integrations_langgraph.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_models.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/tests/test_tfidf_index.py +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/development-workflow.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/file-operations.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/pnpm-usage.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/typescript-patterns.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/rules/typescript-testing.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.claude/skills/orama-integration/SKILL.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/file-operations.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/orama-integration.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/pnpm-usage.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/typescript-patterns.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.cursor/rules/typescript-testing.mdc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0/vendor/stackone-ai-node}/.envrc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.git +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/CODEOWNERS +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/actions/setup-nix/action.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/check-title.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/ci.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/claude.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/dry-publish.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/nix-flake.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.github/workflows/release.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.gitignore +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.gitleaks.toml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.mcp.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.oxfmtrc.jsonc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/.oxlintrc.jsonc +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/AGENTS.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/CHANGELOG.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/CLAUDE.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/LICENSE +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/README.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/README.md +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/ai-sdk-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/anthropic-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools-debug.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/fetch-tools.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/meta-tools.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-integration.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-responses-integration.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/openai-responses-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/package.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tanstack-ai-integration.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/examples/tsconfig.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/flake.lock +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/flake.nix +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/knip.config.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/lefthook.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.example-api.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.mcp.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.openai.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.stackone-ai.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.stackone-rpc.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/handlers.utils.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/mcp-server.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/mocks/node.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/package.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/pnpm-lock.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/pnpm-workspace.yaml +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/consts.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/feedback.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/feedback.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/headers.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/headers.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/index.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/mcp-client.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/mcp-client.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/requestBuilder.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/requestBuilder.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/rpc-client.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/rpc-client.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/schema.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.test-d.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/tool.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.test-d.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/toolsets.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/types.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/array.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/array.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone-api.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/error-stackone.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/tfidf-index.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/tfidf-index.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/try-import.test.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/try-import.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/src/utils/type.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/tsconfig.json +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/tsdown.config.ts +0 -0
- {stackone_ai-2.3.0 → stackone_ai-2.4.0}/vendor/stackone-ai-node/vitest.config.ts +0 -0
- {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.
|
|
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
|
|
stackone_ai-2.4.0/.envrc
ADDED
|
@@ -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/`):
|
|
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
|
-
##
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
just
|
|
32
|
+
| Skill | Description |
|
|
33
|
+
| ----------------- | -------------------------------------------- |
|
|
34
|
+
| **just-commands** | Available just commands (dynamically loaded) |
|
|
39
35
|
|
|
40
|
-
|
|
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
|
-
|
|
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=["
|
|
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.
|
|
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.
|
|
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
|
+
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 `"
|
|
51
|
+
- Glob pattern filtering with patterns like `"salesforce_*"` and exclusions `"!*_delete_*"`
|
|
52
52
|
- Provider and action filtering
|
|
53
53
|
- Multi-account support
|
|
54
|
-
- **
|
|
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.
|
|
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=["
|
|
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("
|
|
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: `["
|
|
143
|
+
- Exact match: `["bamboohr_list_employees"]`
|
|
143
144
|
- Glob pattern: `["*_list_employees"]` matches all tools ending with `_list_employees`
|
|
144
|
-
- Provider prefix: `["
|
|
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=["
|
|
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=["
|
|
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=["
|
|
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=["
|
|
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
|
-
##
|
|
341
|
+
## Search Tool
|
|
341
342
|
|
|
342
|
-
|
|
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
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
352
|
-
|
|
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
|
|
356
|
-
|
|
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
|
-
- [
|
|
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 `"
|
|
19
|
+
- Glob pattern filtering with patterns like `"salesforce_*"` and exclusions `"!*_delete_*"`
|
|
20
20
|
- Provider and action filtering
|
|
21
21
|
- Multi-account support
|
|
22
|
-
- **
|
|
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.
|
|
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=["
|
|
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("
|
|
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: `["
|
|
111
|
+
- Exact match: `["bamboohr_list_employees"]`
|
|
111
112
|
- Glob pattern: `["*_list_employees"]` matches all tools ending with `_list_employees`
|
|
112
|
-
- Provider prefix: `["
|
|
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=["
|
|
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=["
|
|
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=["
|
|
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=["
|
|
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
|
-
##
|
|
309
|
+
## Search Tool
|
|
309
310
|
|
|
310
|
-
|
|
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
|
|
316
|
-
|
|
317
|
-
|
|
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
|
|
320
|
-
|
|
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
|
|
324
|
-
|
|
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
|
-
- [
|
|
371
|
+
- [Search Tool](examples/search_tool_example.py)
|
|
372
|
+
- [Semantic Search](examples/semantic_search_example.py)
|
|
338
373
|
|
|
339
374
|
## Development
|
|
340
375
|
|