stackone-ai 2.1.1__tar.gz → 2.3.1__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.1.1 → stackone_ai-2.3.1}/.claude/rules/development-workflow.md +1 -1
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/nix-workflow.md +1 -1
- stackone_ai-2.3.1/.claude/skills/release-please/SKILL.md +51 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.github/actions/setup-nix/action.yaml +2 -6
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.github/workflows/ci.yaml +3 -3
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.github/workflows/nix-flake-update.yaml +1 -1
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.github/workflows/nix-flake.yaml +1 -1
- stackone_ai-2.3.1/.github/workflows/release.yaml +66 -0
- stackone_ai-2.3.1/.release-please-manifest.json +3 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/CHANGELOG.md +19 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/CLAUDE.md +8 -2
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/PKG-INFO +14 -14
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/README.md +13 -13
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/test_examples.py +1 -1
- stackone_ai-2.1.1/examples/meta_tools_example.py → stackone_ai-2.3.1/examples/utility_tools_example.py +26 -26
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/flake.nix +2 -3
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/justfile +0 -4
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/pyproject.toml +1 -1
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/__init__.py +1 -1
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/feedback/tool.py +1 -1
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/models.py +10 -10
- stackone_ai-2.1.1/stackone_ai/meta_tools.py → stackone_ai-2.3.1/stackone_ai/utility_tools.py +24 -24
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_feedback.py +3 -3
- stackone_ai-2.1.1/tests/test_meta_tools.py → stackone_ai-2.3.1/tests/test_utility_tools.py +40 -40
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/uv.lock +4 -4
- stackone_ai-2.1.1/.github/workflows/release.yaml +0 -43
- stackone_ai-2.1.1/.release-please-manifest.json +0 -3
- stackone_ai-2.1.1/scripts/update_version.py +0 -47
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/examples-standards.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/no-relative-imports.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/package-installation.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/release-please-standards.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.claude/rules/uv-scripts.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/examples-standards.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/no-relative-imports.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/package-installation.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/release-please-standards.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.cursor/rules/uv-scripts.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.envrc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.github/dependabot.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.gitignore +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.gitleaks.toml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.gitmodules +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.mcp.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/.release-please-config.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/LICENSE +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/crewai_integration.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/file_uploads.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/index.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/langchain_integration.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/openai_integration.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/examples/stackone_account_ids.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/flake.lock +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/constants.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/feedback/__init__.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/integrations/__init__.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/integrations/langgraph.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/py.typed +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/toolset.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/utils/__init__.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/stackone_ai/utils/tfidf_index.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/conftest.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/mocks/serve.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_fetch_tools.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_integrations_langgraph.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_models.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_tfidf_index.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_tool_calling.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/tests/test_toolset.py +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/development-workflow.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/file-operations.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/git-workflow.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/pnpm-usage.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/typescript-patterns.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/rules/typescript-testing.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.claude/skills/orama-integration/SKILL.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/development-workflow.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/file-operations.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/git-workflow.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/orama-integration.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/pnpm-usage.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/typescript-patterns.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.cursor/rules/typescript-testing.mdc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.envrc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.git +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/CODEOWNERS +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/actions/setup-nix/action.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/check-title.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/ci.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/claude.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/dry-publish.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/nix-flake.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.github/workflows/release.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.gitignore +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.gitleaks.toml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.mcp.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.oxfmtrc.jsonc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/.oxlintrc.jsonc +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/AGENTS.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/CHANGELOG.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/CLAUDE.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/LICENSE +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/README.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/README.md +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/ai-sdk-integration.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/ai-sdk-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/anthropic-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/claude-agent-sdk-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/fetch-tools-debug.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/fetch-tools.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/fetch-tools.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/meta-tools.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/openai-integration.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/openai-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/openai-responses-integration.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/openai-responses-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/package.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/tanstack-ai-integration.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/tanstack-ai-integration.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/examples/tsconfig.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/flake.lock +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/flake.nix +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/knip.config.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/lefthook.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.example-api.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.mcp.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.openai.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.stackone-ai.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.stackone-rpc.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/handlers.utils.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/mcp-server.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/mocks/node.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/package.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/pnpm-lock.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/pnpm-workspace.yaml +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/consts.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/feedback.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/feedback.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/headers.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/headers.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/index.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/mcp-client.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/mcp-client.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/requestBuilder.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/requestBuilder.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/rpc-client.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/rpc-client.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/schema.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/tool.test-d.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/tool.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/tool.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/toolsets.test-d.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/toolsets.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/toolsets.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/types.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/array.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/array.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/error-stackone-api.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/error-stackone-api.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/error-stackone.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/error-stackone.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/tfidf-index.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/tfidf-index.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/try-import.test.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/try-import.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/src/utils/type.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/tsconfig.json +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/tsdown.config.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/vendor/stackone-ai-node/vitest.config.ts +0 -0
- {stackone_ai-2.1.1 → stackone_ai-2.3.1}/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
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Release Please Trigger
|
|
2
|
+
|
|
3
|
+
Trigger a release-please PR for a specific version.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/release-please <version>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
/release-please 2.3.0
|
|
15
|
+
/release-please 3.0.0
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
When this skill is invoked with a version argument:
|
|
21
|
+
|
|
22
|
+
1. **Validate the version format**: Ensure the version follows semantic versioning (X.Y.Z format)
|
|
23
|
+
|
|
24
|
+
2. **Create a new branch**: Create a branch named `chore/trigger-release-<version>`
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
git switch -c chore/trigger-release-<version>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
3. **Create an empty commit with Release-As trailer**: The commit message must include the `Release-As: <version>` trailer to trigger release-please
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
git commit --allow-empty -m "chore: trigger release <version>
|
|
34
|
+
|
|
35
|
+
Release-As: <version>"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
4. **Push the branch and create a PR**:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git push -u origin chore/trigger-release-<version>
|
|
42
|
+
gh pr create --title "chore: trigger release <version>" --body "Trigger release-please to create version <version>."
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
5. **Report the PR URL** to the user
|
|
46
|
+
|
|
47
|
+
## Notes
|
|
48
|
+
|
|
49
|
+
- The `Release-As` trailer in the commit message tells release-please to use that specific version
|
|
50
|
+
- Once the PR is merged to main, release-please will automatically create a release PR with the specified version
|
|
51
|
+
- The release PR will update CHANGELOG.md, version files, and create a GitHub release when merged
|
|
@@ -9,10 +9,6 @@ inputs:
|
|
|
9
9
|
description: "Skip uv sync step (useful for jobs that do not need Python dependencies)"
|
|
10
10
|
required: false
|
|
11
11
|
default: "false"
|
|
12
|
-
skip-mock-server:
|
|
13
|
-
description: "Skip MCP mock server dependencies installation (useful for jobs that do not run tests)"
|
|
14
|
-
required: false
|
|
15
|
-
default: "false"
|
|
16
12
|
runs:
|
|
17
13
|
using: "composite"
|
|
18
14
|
steps:
|
|
@@ -43,10 +39,10 @@ runs:
|
|
|
43
39
|
- name: Install Python dependencies
|
|
44
40
|
if: inputs.skip-uv-sync != 'true'
|
|
45
41
|
shell: bash
|
|
46
|
-
run: uv sync --all-extras
|
|
42
|
+
run: uv sync --all-extras --locked
|
|
47
43
|
|
|
48
44
|
- name: Install MCP mock server dependencies
|
|
49
|
-
if: inputs.skip-uv-sync != 'true'
|
|
45
|
+
if: inputs.skip-uv-sync != 'true'
|
|
50
46
|
shell: bash
|
|
51
47
|
run: |
|
|
52
48
|
if [ -f vendor/stackone-ai-node/package.json ]; then
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
runs-on: ubuntu-latest
|
|
21
21
|
steps:
|
|
22
22
|
- name: Checkout repository
|
|
23
|
-
uses: actions/checkout@
|
|
23
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
24
24
|
with:
|
|
25
25
|
fetch-depth: 0
|
|
26
26
|
|
|
@@ -40,7 +40,7 @@ jobs:
|
|
|
40
40
|
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
41
41
|
steps:
|
|
42
42
|
- name: Checkout repository
|
|
43
|
-
uses: actions/checkout@
|
|
43
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
44
44
|
with:
|
|
45
45
|
submodules: true
|
|
46
46
|
|
|
@@ -63,7 +63,7 @@ jobs:
|
|
|
63
63
|
if: github.ref == 'refs/heads/main'
|
|
64
64
|
steps:
|
|
65
65
|
- name: Checkout repository
|
|
66
|
-
uses: actions/checkout@
|
|
66
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
67
67
|
with:
|
|
68
68
|
submodules: true
|
|
69
69
|
|
|
@@ -15,7 +15,7 @@ jobs:
|
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
steps:
|
|
17
17
|
- name: Checkout repository
|
|
18
|
-
uses: actions/checkout@
|
|
18
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
19
19
|
|
|
20
20
|
- name: Setup Nix
|
|
21
21
|
uses: ./.github/actions/setup-nix
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
runs-on: ubuntu-latest
|
|
25
25
|
steps:
|
|
26
26
|
- name: Checkout repository
|
|
27
|
-
uses: actions/checkout@
|
|
27
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
28
28
|
|
|
29
29
|
- name: Install Nix
|
|
30
30
|
uses: cachix/install-nix-action@4e002c8ec80594ecd40e759629461e26c8abed15 # v31.9.0
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: Release Please
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
pull-requests: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release-please:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: googleapis/release-please-action@16a9c90856f42705d54a6fda1823352bdc62cf38 # v4.4.0
|
|
17
|
+
id: release
|
|
18
|
+
with:
|
|
19
|
+
config-file: .release-please-config.json
|
|
20
|
+
manifest-file: .release-please-manifest.json
|
|
21
|
+
|
|
22
|
+
# Update uv.lock when release PR is created/updated
|
|
23
|
+
- name: Checkout repository (for PR update)
|
|
24
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
25
|
+
if: ${{ steps.release.outputs.pr }}
|
|
26
|
+
with:
|
|
27
|
+
ref: ${{ fromJSON(steps.release.outputs.pr).headBranchName }}
|
|
28
|
+
|
|
29
|
+
- name: Setup Nix (for PR update)
|
|
30
|
+
if: ${{ steps.release.outputs.pr }}
|
|
31
|
+
uses: ./.github/actions/setup-nix
|
|
32
|
+
with:
|
|
33
|
+
skip-uv-sync: "true"
|
|
34
|
+
|
|
35
|
+
- name: Update uv.lock
|
|
36
|
+
if: ${{ steps.release.outputs.pr }}
|
|
37
|
+
run: |
|
|
38
|
+
nix develop --command uv lock
|
|
39
|
+
if git diff --quiet uv.lock; then
|
|
40
|
+
echo "uv.lock is already up to date"
|
|
41
|
+
else
|
|
42
|
+
git config user.name "github-actions[bot]"
|
|
43
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
44
|
+
git add uv.lock
|
|
45
|
+
git commit -m "chore: update uv.lock"
|
|
46
|
+
git push
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Only release to PyPI when a new release is created
|
|
50
|
+
- name: Checkout repository
|
|
51
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
52
|
+
if: ${{ steps.release.outputs.release_created }}
|
|
53
|
+
|
|
54
|
+
- name: Setup Nix
|
|
55
|
+
if: ${{ steps.release.outputs.release_created }}
|
|
56
|
+
uses: ./.github/actions/setup-nix
|
|
57
|
+
with:
|
|
58
|
+
skip-uv-sync: "true"
|
|
59
|
+
|
|
60
|
+
- name: Build and publish package
|
|
61
|
+
if: ${{ steps.release.outputs.release_created }}
|
|
62
|
+
env:
|
|
63
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
|
64
|
+
run: |
|
|
65
|
+
nix develop --command just build
|
|
66
|
+
nix develop --command just publish
|
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.1](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.3.0...stackone-ai-v2.3.1) (2026-01-29)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Documentation
|
|
7
|
+
|
|
8
|
+
* 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))
|
|
9
|
+
|
|
10
|
+
## [2.3.0](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.1.1...stackone-ai-v2.3.0) (2026-01-29)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **nix:** replace deprecated nixfmt-rfc-style with nixfmt ([#114](https://github.com/StackOneHQ/stackone-ai-python/issues/114)) ([10627b4](https://github.com/StackOneHQ/stackone-ai-python/commit/10627b441745806f3b57a7b1cdba296ef722b00f))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Miscellaneous Chores
|
|
19
|
+
|
|
20
|
+
* trigger release 2.3.0 ([#130](https://github.com/StackOneHQ/stackone-ai-python/issues/130)) ([a28d0a6](https://github.com/StackOneHQ/stackone-ai-python/commit/a28d0a6fbcf703dd640d3255fa4171046ea225c7))
|
|
21
|
+
|
|
3
22
|
## [2.1.1](https://github.com/StackOneHQ/stackone-ai-python/compare/stackone-ai-v2.1.0...stackone-ai-v2.1.1) (2026-01-22)
|
|
4
23
|
|
|
5
24
|
|
|
@@ -8,6 +8,12 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
|
|
|
8
8
|
- **Skills** (`.claude/skills/`): Manually invoked for specific integrations.
|
|
9
9
|
- **Cursor rules** (`.cursor/rules/`): Symlinks to `.claude/rules/` for consistency.
|
|
10
10
|
|
|
11
|
+
## Available Skills
|
|
12
|
+
|
|
13
|
+
| Skill | Usage | Description |
|
|
14
|
+
| ------------------ | --------------------------- | -------------------------------------------------- |
|
|
15
|
+
| **release-please** | `/release-please <version>` | Trigger a release-please PR for a specific version |
|
|
16
|
+
|
|
11
17
|
## Available Rules
|
|
12
18
|
|
|
13
19
|
| Rule | Applies To | Description |
|
|
@@ -88,7 +94,7 @@ toolset = StackOneToolSet(
|
|
|
88
94
|
|
|
89
95
|
### Type Safety
|
|
90
96
|
|
|
91
|
-
- Full type annotations required (Python 3.
|
|
97
|
+
- Full type annotations required (Python 3.10+)
|
|
92
98
|
- Strict ty configuration
|
|
93
99
|
- Use generics for better IDE support
|
|
94
100
|
|
|
@@ -102,7 +108,7 @@ toolset = StackOneToolSet(
|
|
|
102
108
|
|
|
103
109
|
1. **Dependencies**: See `package-installation` rule for uv dependency management
|
|
104
110
|
2. **Pre-commit**: Hooks configured for ruff and ty - run on all commits
|
|
105
|
-
3. **Python Version**: Requires Python >=3.
|
|
111
|
+
3. **Python Version**: Requires Python >=3.10
|
|
106
112
|
4. **Error Handling**: Custom exceptions (`StackOneError`, `StackOneAPIError`)
|
|
107
113
|
5. **File Uploads**: Binary parameters auto-detected from OpenAPI specs
|
|
108
114
|
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.3.1
|
|
4
4
|
Summary: agents performing actions on your SaaS
|
|
5
5
|
Author-email: StackOne <support@stackone.com>
|
|
6
6
|
License-File: LICENSE
|
|
@@ -51,7 +51,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
|
|
|
51
51
|
- Glob pattern filtering with patterns like `"hris_*"` and exclusions `"!hris_delete_*"`
|
|
52
52
|
- Provider and action filtering
|
|
53
53
|
- Multi-account support
|
|
54
|
-
- **
|
|
54
|
+
- **Utility Tools** (Beta): Dynamic tool discovery and execution based on natural language queries
|
|
55
55
|
- Integration with popular AI frameworks:
|
|
56
56
|
- OpenAI Functions
|
|
57
57
|
- LangChain Tools
|
|
@@ -60,7 +60,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
|
|
|
60
60
|
|
|
61
61
|
## Requirements
|
|
62
62
|
|
|
63
|
-
- Python 3.
|
|
63
|
+
- Python 3.10+
|
|
64
64
|
|
|
65
65
|
## Installation
|
|
66
66
|
|
|
@@ -313,16 +313,16 @@ result = crew.kickoff()
|
|
|
313
313
|
|
|
314
314
|
## Feedback Collection
|
|
315
315
|
|
|
316
|
-
The SDK includes a feedback collection tool (`
|
|
316
|
+
The SDK includes a feedback collection tool (`tool_feedback`) that allows users to submit feedback about their experience with StackOne tools. This tool is automatically included in the toolset and is designed to be invoked by AI agents after user permission.
|
|
317
317
|
|
|
318
318
|
```python
|
|
319
319
|
from stackone_ai import StackOneToolSet
|
|
320
320
|
|
|
321
321
|
toolset = StackOneToolSet()
|
|
322
322
|
|
|
323
|
-
# Get the feedback tool (included with "
|
|
324
|
-
tools = toolset.fetch_tools(actions=["
|
|
325
|
-
feedback_tool = tools.get_tool("
|
|
323
|
+
# Get the feedback tool (included with "tool_*" pattern or all tools)
|
|
324
|
+
tools = toolset.fetch_tools(actions=["tool_*"])
|
|
325
|
+
feedback_tool = tools.get_tool("tool_feedback")
|
|
326
326
|
|
|
327
327
|
# Submit feedback (typically invoked by AI after user consent)
|
|
328
328
|
result = feedback_tool.call(
|
|
@@ -337,23 +337,23 @@ result = feedback_tool.call(
|
|
|
337
337
|
- "Are you ok with sending feedback to StackOne? The LLM will take care of sending it."
|
|
338
338
|
- Only call the tool after the user explicitly agrees.
|
|
339
339
|
|
|
340
|
-
##
|
|
340
|
+
## Utility Tools (Beta)
|
|
341
341
|
|
|
342
|
-
|
|
342
|
+
Utility tools enable dynamic tool discovery and execution without hardcoding tool names.
|
|
343
343
|
|
|
344
344
|
### Basic Usage
|
|
345
345
|
|
|
346
346
|
```python
|
|
347
|
-
# Get
|
|
347
|
+
# Get utility tools for dynamic discovery
|
|
348
348
|
tools = toolset.fetch_tools(actions=["hris_*"])
|
|
349
|
-
|
|
349
|
+
utility_tools = tools.utility_tools()
|
|
350
350
|
|
|
351
351
|
# Search for relevant tools using natural language
|
|
352
|
-
filter_tool =
|
|
352
|
+
filter_tool = utility_tools.get_tool("tool_search")
|
|
353
353
|
results = filter_tool.call(query="manage employees", limit=5)
|
|
354
354
|
|
|
355
355
|
# Execute discovered tools dynamically
|
|
356
|
-
execute_tool =
|
|
356
|
+
execute_tool = utility_tools.get_tool("tool_execute")
|
|
357
357
|
result = execute_tool.call(toolName="hris_list_employees", params={"limit": 10})
|
|
358
358
|
```
|
|
359
359
|
|
|
@@ -366,7 +366,7 @@ For more examples, check out the [examples/](examples/) directory:
|
|
|
366
366
|
- [OpenAI Integration](examples/openai_integration.py)
|
|
367
367
|
- [LangChain Integration](examples/langchain_integration.py)
|
|
368
368
|
- [CrewAI Integration](examples/crewai_integration.py)
|
|
369
|
-
- [
|
|
369
|
+
- [Utility Tools](examples/utility_tools_example.py)
|
|
370
370
|
|
|
371
371
|
## Development
|
|
372
372
|
|
|
@@ -19,7 +19,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
|
|
|
19
19
|
- Glob pattern filtering with patterns like `"hris_*"` and exclusions `"!hris_delete_*"`
|
|
20
20
|
- Provider and action filtering
|
|
21
21
|
- Multi-account support
|
|
22
|
-
- **
|
|
22
|
+
- **Utility Tools** (Beta): Dynamic tool discovery and execution based on natural language queries
|
|
23
23
|
- Integration with popular AI frameworks:
|
|
24
24
|
- OpenAI Functions
|
|
25
25
|
- LangChain Tools
|
|
@@ -28,7 +28,7 @@ StackOne AI provides a unified interface for accessing various SaaS tools throug
|
|
|
28
28
|
|
|
29
29
|
## Requirements
|
|
30
30
|
|
|
31
|
-
- Python 3.
|
|
31
|
+
- Python 3.10+
|
|
32
32
|
|
|
33
33
|
## Installation
|
|
34
34
|
|
|
@@ -281,16 +281,16 @@ result = crew.kickoff()
|
|
|
281
281
|
|
|
282
282
|
## Feedback Collection
|
|
283
283
|
|
|
284
|
-
The SDK includes a feedback collection tool (`
|
|
284
|
+
The SDK includes a feedback collection tool (`tool_feedback`) that allows users to submit feedback about their experience with StackOne tools. This tool is automatically included in the toolset and is designed to be invoked by AI agents after user permission.
|
|
285
285
|
|
|
286
286
|
```python
|
|
287
287
|
from stackone_ai import StackOneToolSet
|
|
288
288
|
|
|
289
289
|
toolset = StackOneToolSet()
|
|
290
290
|
|
|
291
|
-
# Get the feedback tool (included with "
|
|
292
|
-
tools = toolset.fetch_tools(actions=["
|
|
293
|
-
feedback_tool = tools.get_tool("
|
|
291
|
+
# Get the feedback tool (included with "tool_*" pattern or all tools)
|
|
292
|
+
tools = toolset.fetch_tools(actions=["tool_*"])
|
|
293
|
+
feedback_tool = tools.get_tool("tool_feedback")
|
|
294
294
|
|
|
295
295
|
# Submit feedback (typically invoked by AI after user consent)
|
|
296
296
|
result = feedback_tool.call(
|
|
@@ -305,23 +305,23 @@ result = feedback_tool.call(
|
|
|
305
305
|
- "Are you ok with sending feedback to StackOne? The LLM will take care of sending it."
|
|
306
306
|
- Only call the tool after the user explicitly agrees.
|
|
307
307
|
|
|
308
|
-
##
|
|
308
|
+
## Utility Tools (Beta)
|
|
309
309
|
|
|
310
|
-
|
|
310
|
+
Utility tools enable dynamic tool discovery and execution without hardcoding tool names.
|
|
311
311
|
|
|
312
312
|
### Basic Usage
|
|
313
313
|
|
|
314
314
|
```python
|
|
315
|
-
# Get
|
|
315
|
+
# Get utility tools for dynamic discovery
|
|
316
316
|
tools = toolset.fetch_tools(actions=["hris_*"])
|
|
317
|
-
|
|
317
|
+
utility_tools = tools.utility_tools()
|
|
318
318
|
|
|
319
319
|
# Search for relevant tools using natural language
|
|
320
|
-
filter_tool =
|
|
320
|
+
filter_tool = utility_tools.get_tool("tool_search")
|
|
321
321
|
results = filter_tool.call(query="manage employees", limit=5)
|
|
322
322
|
|
|
323
323
|
# Execute discovered tools dynamically
|
|
324
|
-
execute_tool =
|
|
324
|
+
execute_tool = utility_tools.get_tool("tool_execute")
|
|
325
325
|
result = execute_tool.call(toolName="hris_list_employees", params={"limit": 10})
|
|
326
326
|
```
|
|
327
327
|
|
|
@@ -334,7 +334,7 @@ For more examples, check out the [examples/](examples/) directory:
|
|
|
334
334
|
- [OpenAI Integration](examples/openai_integration.py)
|
|
335
335
|
- [LangChain Integration](examples/langchain_integration.py)
|
|
336
336
|
- [CrewAI Integration](examples/crewai_integration.py)
|
|
337
|
-
- [
|
|
337
|
+
- [Utility Tools](examples/utility_tools_example.py)
|
|
338
338
|
|
|
339
339
|
## Development
|
|
340
340
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
"""
|
|
3
|
-
Example demonstrating
|
|
3
|
+
Example demonstrating utility tools for dynamic tool discovery and execution.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Utility tools allow AI agents to search for relevant tools based on natural language queries
|
|
6
6
|
and execute them dynamically without hardcoding tool names.
|
|
7
7
|
"""
|
|
8
8
|
|
|
@@ -16,8 +16,8 @@ from stackone_ai import StackOneToolSet
|
|
|
16
16
|
load_dotenv()
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def
|
|
20
|
-
"""Basic example of using
|
|
19
|
+
def example_utility_tools_basic():
|
|
20
|
+
"""Basic example of using utility tools for tool discovery"""
|
|
21
21
|
print("Example 1: Dynamic tool discovery\n")
|
|
22
22
|
|
|
23
23
|
# Initialize StackOne toolset
|
|
@@ -27,11 +27,11 @@ def example_meta_tools_basic():
|
|
|
27
27
|
all_tools = toolset.fetch_tools(actions=["bamboohr_*"])
|
|
28
28
|
print(f"Total BambooHR tools available: {len(all_tools)}")
|
|
29
29
|
|
|
30
|
-
# Get
|
|
31
|
-
|
|
30
|
+
# Get utility tools for dynamic discovery
|
|
31
|
+
utility_tools = all_tools.utility_tools()
|
|
32
32
|
|
|
33
33
|
# Get the filter tool to search for relevant tools
|
|
34
|
-
filter_tool =
|
|
34
|
+
filter_tool = utility_tools.get_tool("tool_search")
|
|
35
35
|
if filter_tool:
|
|
36
36
|
# Search for employee management tools
|
|
37
37
|
result = filter_tool.call(query="manage employees create update list", limit=5, minScore=0.0)
|
|
@@ -43,7 +43,7 @@ def example_meta_tools_basic():
|
|
|
43
43
|
print()
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
def
|
|
46
|
+
def example_utility_tools_with_execution():
|
|
47
47
|
"""Example of discovering and executing tools dynamically"""
|
|
48
48
|
print("Example 2: Dynamic tool execution\n")
|
|
49
49
|
|
|
@@ -52,11 +52,11 @@ def example_meta_tools_with_execution():
|
|
|
52
52
|
|
|
53
53
|
# Get all tools using MCP-backed fetch_tools()
|
|
54
54
|
all_tools = toolset.fetch_tools()
|
|
55
|
-
|
|
55
|
+
utility_tools = all_tools.utility_tools()
|
|
56
56
|
|
|
57
57
|
# Step 1: Search for relevant tools
|
|
58
|
-
filter_tool =
|
|
59
|
-
execute_tool =
|
|
58
|
+
filter_tool = utility_tools.get_tool("tool_search")
|
|
59
|
+
execute_tool = utility_tools.get_tool("tool_execute")
|
|
60
60
|
|
|
61
61
|
if filter_tool and execute_tool:
|
|
62
62
|
# Find tools for listing employees
|
|
@@ -81,8 +81,8 @@ def example_meta_tools_with_execution():
|
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
def example_with_openai():
|
|
84
|
-
"""Example of using
|
|
85
|
-
print("Example 3: Using
|
|
84
|
+
"""Example of using utility tools with OpenAI"""
|
|
85
|
+
print("Example 3: Using utility tools with OpenAI\n")
|
|
86
86
|
|
|
87
87
|
try:
|
|
88
88
|
from openai import OpenAI
|
|
@@ -93,20 +93,20 @@ def example_with_openai():
|
|
|
93
93
|
# Initialize StackOne toolset
|
|
94
94
|
toolset = StackOneToolSet()
|
|
95
95
|
|
|
96
|
-
# Get BambooHR tools and their
|
|
96
|
+
# Get BambooHR tools and their utility tools using MCP-backed fetch_tools()
|
|
97
97
|
bamboohr_tools = toolset.fetch_tools(actions=["bamboohr_*"])
|
|
98
|
-
|
|
98
|
+
utility_tools = bamboohr_tools.utility_tools()
|
|
99
99
|
|
|
100
100
|
# Convert to OpenAI format
|
|
101
|
-
openai_tools =
|
|
101
|
+
openai_tools = utility_tools.to_openai()
|
|
102
102
|
|
|
103
|
-
# Create a chat completion with
|
|
103
|
+
# Create a chat completion with utility tools
|
|
104
104
|
response = client.chat.completions.create(
|
|
105
105
|
model="gpt-4",
|
|
106
106
|
messages=[
|
|
107
107
|
{
|
|
108
108
|
"role": "system",
|
|
109
|
-
"content": "You are an HR assistant. Use
|
|
109
|
+
"content": "You are an HR assistant. Use tool_search to find appropriate tools, then tool_execute to execute them.",
|
|
110
110
|
},
|
|
111
111
|
{"role": "user", "content": "Can you help me find tools for managing employee records?"},
|
|
112
112
|
],
|
|
@@ -145,12 +145,12 @@ def example_with_langchain():
|
|
|
145
145
|
tools = toolset.fetch_tools(actions=["bamboohr_list_*"])
|
|
146
146
|
langchain_tools = tools.to_langchain()
|
|
147
147
|
|
|
148
|
-
# Get
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
# Get utility tools as well
|
|
149
|
+
utility_tools = tools.utility_tools()
|
|
150
|
+
langchain_utility_tools = utility_tools.to_langchain()
|
|
151
151
|
|
|
152
152
|
# Combine all tools
|
|
153
|
-
all_langchain_tools = list(langchain_tools) + list(
|
|
153
|
+
all_langchain_tools = list(langchain_tools) + list(langchain_utility_tools)
|
|
154
154
|
|
|
155
155
|
print(f"Available tools for LangChain: {len(all_langchain_tools)}")
|
|
156
156
|
for tool in all_langchain_tools:
|
|
@@ -163,7 +163,7 @@ def example_with_langchain():
|
|
|
163
163
|
[
|
|
164
164
|
(
|
|
165
165
|
"system",
|
|
166
|
-
"You are an HR assistant. Use the
|
|
166
|
+
"You are an HR assistant. Use the utility tools to discover and execute relevant tools.",
|
|
167
167
|
),
|
|
168
168
|
("human", "{input}"),
|
|
169
169
|
("placeholder", "{agent_scratchpad}"),
|
|
@@ -190,13 +190,13 @@ def example_with_langchain():
|
|
|
190
190
|
def main():
|
|
191
191
|
"""Run all examples"""
|
|
192
192
|
print("=" * 60)
|
|
193
|
-
print("StackOne AI SDK -
|
|
193
|
+
print("StackOne AI SDK - Utility Tools Examples")
|
|
194
194
|
print("=" * 60)
|
|
195
195
|
print()
|
|
196
196
|
|
|
197
197
|
# Basic examples that work without external APIs
|
|
198
|
-
|
|
199
|
-
|
|
198
|
+
example_utility_tools_basic()
|
|
199
|
+
example_utility_tools_with_execution()
|
|
200
200
|
|
|
201
201
|
# Examples that require OpenAI API
|
|
202
202
|
if os.getenv("OPENAI_API_KEY"):
|
|
@@ -39,7 +39,6 @@
|
|
|
39
39
|
projectRootFile = "flake.nix";
|
|
40
40
|
programs = {
|
|
41
41
|
nixfmt.enable = true;
|
|
42
|
-
nixfmt.package = pkgs.nixfmt-rfc-style;
|
|
43
42
|
ruff-check.enable = true;
|
|
44
43
|
ruff-format.enable = true;
|
|
45
44
|
};
|
|
@@ -94,7 +93,7 @@
|
|
|
94
93
|
uv
|
|
95
94
|
ty
|
|
96
95
|
just
|
|
97
|
-
nixfmt
|
|
96
|
+
nixfmt
|
|
98
97
|
|
|
99
98
|
# security
|
|
100
99
|
gitleaks
|
|
@@ -117,7 +116,7 @@
|
|
|
117
116
|
# Install Python dependencies only if .venv is missing or uv.lock is newer
|
|
118
117
|
if [ ! -d .venv ] || [ uv.lock -nt .venv ]; then
|
|
119
118
|
echo "📦 Installing Python dependencies..."
|
|
120
|
-
uv sync --all-extras
|
|
119
|
+
uv sync --all-extras --locked
|
|
121
120
|
fi
|
|
122
121
|
|
|
123
122
|
# Install git hooks
|
|
@@ -160,7 +160,7 @@ def create_feedback_tool(
|
|
|
160
160
|
Returns:
|
|
161
161
|
FeedbackTool configured for feedback collection
|
|
162
162
|
"""
|
|
163
|
-
name = "
|
|
163
|
+
name = "tool_feedback"
|
|
164
164
|
description = (
|
|
165
165
|
"Collects user feedback on StackOne tool performance. "
|
|
166
166
|
'First ask the user, "Are you ok with sending feedback to StackOne?" '
|